@squadbase/vantage 0.6.2-dev1.48b34e1 → 0.6.2-dev1.56da87f
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/{chunk-57GHR5LN.js → chunk-3RJEOP3J.js} +29 -18
- package/dist/chunk-3RJEOP3J.js.map +1 -0
- package/dist/{chunk-QOXXOFGL.js → chunk-77CISBMG.js} +994 -464
- package/dist/chunk-77CISBMG.js.map +1 -0
- package/dist/{chunk-JXFCSF3K.js → chunk-EG4PX726.js} +12 -7
- package/dist/chunk-EG4PX726.js.map +1 -0
- package/dist/{chunk-2N72FKLB.js → chunk-NZ5QIIG4.js} +33 -11
- package/dist/chunk-NZ5QIIG4.js.map +1 -0
- package/dist/{chunk-7S52M2SL.js → chunk-QNOX7WLZ.js} +3 -3
- package/dist/{chunk-7S52M2SL.js.map → chunk-QNOX7WLZ.js.map} +1 -1
- package/dist/{chunk-PDOBHMUQ.js → chunk-ROHNXP7J.js} +72 -3
- package/dist/chunk-ROHNXP7J.js.map +1 -0
- package/dist/{chunk-6OTTGAPO.js → chunk-TRMHNMMZ.js} +24 -7
- package/dist/chunk-TRMHNMMZ.js.map +1 -0
- package/dist/components/index.d.ts +49 -29
- package/dist/components/index.js +5 -5
- package/dist/{delta-text-CvwBGJ95.d.ts → delta-text-CbrOaW83.d.ts} +4 -2
- package/dist/doc/index.d.ts +14 -14
- package/dist/doc/index.js +198 -84
- package/dist/doc/index.js.map +1 -1
- package/dist/{format-U0cQl069.d.ts → format-DihQkL1N.d.ts} +17 -11
- package/dist/slide/index.d.ts +2 -2
- package/dist/slide/index.js +95 -44
- package/dist/slide/index.js.map +1 -1
- package/dist/table/index.js +6 -6
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +5 -5
- package/package.json +2 -2
- package/registry/ui/app-shell.tsx +138 -1
- package/registry/ui/area-chart.tsx +344 -85
- package/registry/ui/attention-list.tsx +177 -15
- package/registry/ui/bar-chart.tsx +341 -85
- package/registry/ui/bar-list.tsx +332 -77
- package/registry/ui/box-plot-chart.tsx +405 -97
- package/registry/ui/category-bar.tsx +248 -40
- package/registry/ui/chart-frame.tsx +257 -46
- package/registry/ui/data-table.tsx +229 -37
- package/registry/ui/date-range-picker.tsx +190 -36
- package/registry/ui/delta.tsx +171 -12
- package/registry/ui/donut-chart.tsx +339 -84
- package/registry/ui/echart.tsx +142 -4
- package/registry/ui/filter-bar.tsx +179 -20
- package/registry/ui/funnel-steps.tsx +354 -80
- package/registry/ui/heatmap.tsx +293 -52
- package/registry/ui/histogram-chart.tsx +395 -97
- package/registry/ui/kpi-card.tsx +245 -44
- package/registry/ui/legend.tsx +330 -76
- package/registry/ui/line-chart.tsx +344 -85
- package/registry/ui/multi-select.tsx +159 -9
- package/registry/ui/page-shell.tsx +141 -3
- package/registry/ui/paired-chart.tsx +349 -90
- package/registry/ui/progress-circle.tsx +205 -39
- package/registry/ui/sample-data.tsx +153 -9
- package/registry/ui/scatter-chart.tsx +391 -100
- package/registry/ui/searchable-select.tsx +145 -7
- package/registry/ui/states.tsx +170 -13
- package/registry/ui/status-badge.tsx +193 -28
- package/registry/ui/tracker.tsx +205 -39
- package/registry/ui/trend-indicator.tsx +149 -6
- package/registry/ui/updated-at.tsx +170 -16
- package/registry/ui/waterfall-chart.tsx +415 -102
- package/skills/vantage-add-feature/SKILL.md +5 -0
- package/templates/AGENTS.md +3 -2
- package/templates/agents/api.md +7 -0
- package/templates/agents/page.md +36 -0
- package/dist/chunk-2N72FKLB.js.map +0 -1
- package/dist/chunk-57GHR5LN.js.map +0 -1
- package/dist/chunk-6OTTGAPO.js.map +0 -1
- package/dist/chunk-JXFCSF3K.js.map +0 -1
- package/dist/chunk-PDOBHMUQ.js.map +0 -1
- package/dist/chunk-QOXXOFGL.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/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","../../../squadkit/registry/lib/page-spec.ts","../../../squadkit/registry/blocks/slide-columns/slide-columns.tsx","../../../squadkit/registry/blocks/slide-heading/slide-heading.tsx","../../../squadkit/registry/blocks/slide-source-line/slide-source-line.tsx","../../../squadkit/registry/blocks/slide-chart-insight/slide-chart-insight.tsx","../../../squadkit/registry/blocks/slide-cover/slide-cover.tsx","../../../squadkit/registry/blocks/slide-exec-summary/slide-exec-summary.tsx","../../../squadkit/registry/blocks/slide-kpi-grid/slide-kpi-grid.tsx","../../../squadkit/registry/blocks/slide-kpi-hero/slide-kpi-hero.tsx","../../../squadkit/registry/blocks/slide-next-actions/slide-next-actions.tsx","../../../squadkit/registry/blocks/slide-scorecard-table/slide-scorecard-table.tsx","../../../squadkit/registry/blocks/slide-chart-full/slide-chart-full.tsx","../../../squadkit/registry/blocks/slide-comparison/slide-comparison.tsx","../../../squadkit/registry/blocks/slide-section/slide-section.tsx"],"names":["jsx","useRef","useMemo","useState","jsxs","useEffect","createContext","useLayoutEffect","useContext","to","Fragment","Children","isValidElement","useCallback","cloneElement","GUTTER","ARROW","WORD","deltaView","MAX_ITEMS","MAX_POINTS"],"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 // Phrase-aware Japanese line breaks for every block. Browsers without\n // `auto-phrase` drop the declaration and keep the strict line-break rules.\n wordBreak: \"auto-phrase\" as CSSProperties[\"wordBreak\"],\n lineBreak: \"strict\",\n overflowWrap: \"break-word\",\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 // Same phrase-aware line breaking as the on-screen canvas (see canvas.tsx).\n wordBreak: \"auto-phrase\" as CSSStyleDeclaration[\"wordBreak\"],\n lineBreak: \"strict\",\n overflowWrap: \"break-word\",\n })\n // The rasterised foreignObject does not inherit <html lang>; auto-phrase needs it.\n if (document.documentElement.lang) host.lang = document.documentElement.lang\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 '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, system-ui, 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 '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, system-ui, 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","/**\n * Numeric conventions for slide and document pages, in one place. Each value is\n * either the one the framework CSS already ships (`theme/slide-doc.css`) or a\n * new one decided here; the tests pin the CSS-backed ones to these constants and\n * derive the rest (content box, grid) from them, so they cannot drift apart.\n * Not part of the public export surface.\n *\n * Slide lengths are canvas pixels on the fixed 1920x1080 canvas, not rem: a\n * slide is scaled as a whole. Document lengths are rem / em, like any text page.\n */\n\nconst CANVAS_WIDTH = 1920\nconst CANVAS_HEIGHT = 1080\nconst SAFE_X = 160\nconst SAFE_Y = 120\nconst COLUMNS = 12\nconst GUTTER = 32\nconst COLUMN_WIDTH = 104\n\nexport const SLIDE_SPEC = {\n canvas: {\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n /** width / height */\n ratio: CANVAS_WIDTH / CANVAS_HEIGHT,\n },\n /** Keep content inside this margin; backgrounds may bleed past it. */\n safeArea: { x: SAFE_X, y: SAFE_Y },\n /** The canvas minus the safe area on both sides. */\n content: {\n width: CANVAS_WIDTH - 2 * SAFE_X,\n height: CANVAS_HEIGHT - 2 * SAFE_Y,\n },\n /** Spans the content width: 12 columns + 11 gutters = 1600. */\n grid: { columns: COLUMNS, gutter: GUTTER, columnWidth: COLUMN_WIDTH },\n /** Font sizes in canvas px, strictly increasing. */\n fontSize: { caption: 24, body: 36, page: 64, section: 88, hero: 168 },\n lineHeight: { heading: 1.2, body: 1.6 },\n /** Gaps between elements, in canvas px. */\n space: { sm: 32, md: 48, lg: 64 },\n} as const\n\nexport const DOC_SPEC = {\n /** Reading column width, centred. */\n maxWidth: \"48rem\",\n body: { fontSize: \"1rem\", lineHeight: 1.8 },\n /** Images and video scale down to the column, never beyond it. */\n figure: { maxWidth: \"100%\" },\n /** Heading sizes in em, relative to the body size; margins are top / bottom. */\n heading: {\n h1: { fontSize: \"2em\", marginTop: \"0\", marginBottom: \"0.8em\" },\n h2: { fontSize: \"1.5em\", marginTop: \"2em\", marginBottom: \"0.75em\" },\n h3: { fontSize: \"1.25em\", marginTop: \"1.6em\", marginBottom: \"0.6em\" },\n h4: { fontSize: \"1em\", marginTop: \"1.4em\", marginBottom: \"0.5em\" },\n },\n} as const\n","\"use client\"\n\n/**\n * slide-columns — the 12-column layout of one slide's body: `SlideColumns` lays out `SlideColumn`s, each taking\n * `span` of the 12 columns (8 / 4, 6 / 6, 4 / 4 / 4, …). A part for the body row of a slide's grid, not a whole\n * slide, so it is not a `slide` block.\n *\n * - The gap is `SLIDE_SPEC.grid.gutter` and the track count `SLIDE_SPEC.grid.columns`; nothing is literal.\n * - `SlideColumns` spans all 12 columns of the grid it sits in and fills the row's height; the spans of its\n * `SlideColumn`s should add up to 12.\n * - A column's content that must fill the column's height sets `height: \"100%\"` itself.\n *\n * @example\n * <SlideColumns align=\"center\">\n * <SlideColumn span={8}>…chart…</SlideColumn>\n * <SlideColumn span={4}>…reading…</SlideColumn>\n * </SlideColumns>\n */\nimport type { ReactNode } from \"react\"\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nexport interface SlideColumnsProps {\n children: ReactNode\n /** Vertical alignment of the columns in the row. Default `\"stretch\"`. */\n align?: \"start\" | \"center\" | \"stretch\"\n}\n\nexport function SlideColumns({ children, align = \"stretch\" }: SlideColumnsProps) {\n return (\n <div\n style={{\n gridColumn: \"1 / -1\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"minmax(0, 1fr)\",\n columnGap: SLIDE_SPEC.grid.gutter,\n alignItems: align,\n }}\n >\n {children}\n </div>\n )\n}\n\nexport interface SlideColumnProps {\n /** How many of the 12 columns it takes, 1–12. */\n span: number\n children: ReactNode\n}\n\nexport function SlideColumn({ span, children }: SlideColumnProps) {\n return <div style={{ gridColumn: `span ${span}`, minWidth: 0, minHeight: 0 }}>{children}</div>\n}\n","\"use client\"\n\n/**\n * slide-heading — the title of one slide: an `h2` at the page size, clamped to 2 lines, with an optional\n * eyebrow (a small label above it, e.g. the chapter). A part for the top row of a slide's 12-column grid, not a\n * whole slide: it has no canvas-filling root, so it is not a `slide` block.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. It spans all 12 columns of the grid it sits in.\n * - Write the title as the conclusion (an action title), not a topic.\n *\n * @example\n * <SlideHeading title=\"解約率は 6 月以降、毎月下がり続けている\" eyebrow=\"第 2 章 解約\" />\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nexport interface SlideHeadingProps {\n /** The conclusion as a sentence (an action title). Clamped to 2 lines. */\n title: string\n /** A short label above the title, e.g.「第 2 章 解約」. */\n eyebrow?: string\n}\n\nexport function SlideHeading({ title, eyebrow }: SlideHeadingProps) {\n const heading = (\n <h2\n style={{\n ...(eyebrow ? {} : { gridColumn: \"1 / -1\" }),\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n overflow: \"hidden\",\n }}\n >\n {title}\n </h2>\n )\n if (!eyebrow) return heading\n return (\n <div style={{ gridColumn: \"1 / -1\", display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n <p\n style={{\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n color: \"var(--slide-accent)\",\n }}\n >\n {eyebrow}\n </p>\n {heading}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * slide-source-line — the footer line of one slide: the data's as-of date and source, and optionally the page\n * number at the right. A part for the bottom row of a slide's 12-column grid, not a whole slide, so it is not a\n * `slide` block. Renders nothing when it has nothing to show.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. It spans all 12 columns of the grid it sits in.\n * - The page number is passed in (`page`): this package cannot read the slide's position from the framework.\n *\n * @example\n * <SlideSourceLine asOf=\"2026-10-20\" source=\"社内 BI\" page={{ current: 3, total: 12 }} />\n */\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nexport interface SlideSourceLineProps {\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(this part adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n /** The page number, shown at the right as「3 / 12」. */\n page?: { current: number; total: number }\n}\n\nexport function SlideSourceLine({ asOf, source, page }: SlideSourceLineProps) {\n const text = [asOf ? `${asOf} 時点` : null, source ? `出典: ${source}` : null].filter(Boolean).join(\" / \")\n if (!text && !page) return null\n return (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n color: \"var(--slide-muted)\",\n ...(page ? { display: \"flex\", justifyContent: \"space-between\", gap: SLIDE_SPEC.space.md } : {}),\n }}\n >\n {page ? (\n <>\n <span>{text}</span>\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{`${page.current} / ${page.total}`}</span>\n </>\n ) : (\n text\n )}\n </p>\n )\n}\n","\"use client\"\n\n/**\n * slide-chart-insight — one chart (8 of 12 columns) and its reading (the other 4, up to 3 points). The most\n * common slide in a report. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `chart` is `line` / `bar` / `area` over `categories` with one or more `series`; the option is built here\n * with canvas-size text (`SLIDE_SPEC.fontSize.caption`), no tooltip and no animation, so it exports to pptx as it\n * looks. Two or more series show a legend and differ by line type and marker (bars by pattern), not by colour\n * alone, so a greyscale print still reads. Colours follow the chart tokens. `line` / `area` do not start the y axis\n * at 0, so the movement fills the plot; `bar` always does.\n * - Keep each insight to about 40 characters (the column is 4 of 12); longer ones wrap and may push past the safe area.\n * - `chartSide` puts the chart on the right (`\"right\"`) instead of the left.\n * - The chart sits in `data-waitfor=\"canvas\"` so the pptx export waits for it. More than 3 insights are still\n * drawn, with a `console.warn` — split the slide.\n *\n * @example\n * <Slide>\n * <SlideChartInsight title=\"解約率は 6 月以降、毎月下がり続けている\" chart={{ type: \"line\", categories: [\"7 月\", \"8 月\", \"9 月\"], series: [{ name: \"解約率(%)\", data: [2.4, 2.1, 1.8] }] }} insights={[\"オンボーディング刷新後の 3 か月で 0.6pt 低下\"]} />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { formatValue } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_INSIGHTS = 3\nconst MAX_INSIGHT_CHARS = 40\n\n// Series are told apart by more than colour: a line type and a marker per series (a bar series gets a decal pattern).\nconst LINE_TYPES = [\"solid\", \"dashed\", \"dotted\"] as const\nconst SYMBOLS = [\"circle\", \"rect\", \"triangle\", \"diamond\"] as const\n\nexport interface SlideChartInsightChart {\n type: \"line\" | \"bar\" | \"area\"\n /** The x-axis labels, one per value of each series. */\n categories: string[]\n series: { name: string; data: number[] }[]\n}\n\n/** The ECharts option of a slide chart: canvas-size text, no tooltip, no animation. Shared by the slide blocks that draw one. */\nexport function buildSlideChartOption(chart: SlideChartInsightChart): EChartsOption {\n return {\n animation: false,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n grid: {\n left: 0,\n right: SLIDE_SPEC.space.sm,\n top: chart.series.length > 1 ? SLIDE_SPEC.space.lg : SLIDE_SPEC.space.sm,\n bottom: 0,\n containLabel: true,\n },\n legend:\n chart.series.length > 1\n ? {\n top: 0,\n left: 0,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n }\n : { show: false },\n // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and\n // `hideOverlap` drops whichever still collides.\n xAxis: {\n type: \"category\",\n data: chart.categories,\n // Half a category of room on both sides keeps the first point off the y-axis labels (a line from the axis touches them).\n boundaryGap: true,\n axisLabel: {\n fontSize: SLIDE_SPEC.fontSize.caption,\n margin: SLIDE_SPEC.space.sm,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: \"value\",\n // A line from 0 hugs the top when the values sit in a narrow band; bars must keep their zero baseline.\n scale: chart.type !== \"bar\",\n axisLabel: {\n fontSize: SLIDE_SPEC.fontSize.caption,\n hideOverlap: true,\n formatter: (v: number) => formatValue(v, \"compact\"),\n },\n },\n ...(chart.type === \"bar\" && chart.series.length > 1 ? { aria: { enabled: true, decal: { show: true } } } : {}),\n series: chart.series.map((s, i) => ({\n name: s.name,\n type: chart.type === \"bar\" ? \"bar\" : \"line\",\n data: s.data,\n ...(chart.type === \"bar\"\n ? {}\n : {\n symbol: SYMBOLS[i % SYMBOLS.length],\n symbolSize: SLIDE_SPEC.space.sm / 2,\n lineStyle: { width: 6, type: LINE_TYPES[i % LINE_TYPES.length] },\n }),\n ...(chart.type === \"area\" ? { areaStyle: { opacity: 0.16 } } : {}),\n })),\n }\n}\n\nexport interface SlideChartInsightProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n chart: SlideChartInsightChart\n /** 2–3 points that read the chart. */\n insights: string[]\n /** Which side the chart takes. Default `\"left\"`. */\n chartSide?: \"left\" | \"right\"\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideChartInsight({ title, chart, insights, chartSide = \"left\", asOf, source }: SlideChartInsightProps) {\n const hasSource = Boolean(asOf || source)\n if (insights.some((t) => t.length > MAX_INSIGHT_CHARS)) console.warn(`SlideChartInsight: an insight is over ${MAX_INSIGHT_CHARS} characters; the column is narrow. Shorten it.`)\n if (insights.length > MAX_INSIGHTS) console.warn(`SlideChartInsight: ${insights.length} insights; ${MAX_INSIGHTS} fit beside the chart. Split the slide.`)\n const option = useMemo<EChartsOption>(() => buildSlideChartOption(chart), [chart])\n const chartFirst = chartSide === \"left\"\n const chartColumn = (\n <SlideColumn span={7}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={title} />\n </div>\n </SlideColumn>\n )\n const insightsColumn = (\n <SlideColumn span={5}>\n <ul\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.md,\n }}\n >\n {insights.map((text, i) => (\n <li\n key={i}\n style={{\n paddingLeft: SLIDE_SPEC.space.sm,\n borderLeft: \"4px solid var(--slide-accent)\",\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n }}\n >\n {text}\n </li>\n ))}\n </ul>\n </SlideColumn>\n )\n return (\n <section\n data-slot=\"slide-chart-insight\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n {chartFirst ? chartColumn : insightsColumn}\n {chartFirst ? insightsColumn : chartColumn}\n </SlideColumns>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-cover — the cover of a deck: the title, an optional subtitle, and the period / author / as-of line\n * at the foot. The content of one `<Slide>` (it has no `<Slide>` of its own); the root fills the canvas.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. The title sits in the left 8 of 12 columns.\n * - The data comes in as props; nothing here reads an app context.\n *\n * @example\n * <Slide>\n * <SlideCover title=\"2026 年度 第 2 四半期 事業レビュー\" subtitle=\"売上・解約・新規獲得の振り返りと次の打ち手\" period=\"2026 年 7 月〜9 月\" author=\"事業企画チーム\" asOf=\"2026-10-20\" />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\n\nexport interface SlideCoverProps {\n /** The name of the deck. */\n title: string\n subtitle?: string\n /** The period the deck covers, e.g.「2026 年 7 月〜9 月」. */\n period?: string\n author?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-20\"`. Shown as「2026-10-20 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideCover({ title, subtitle, period, author, asOf, source }: SlideCoverProps) {\n const meta = [\n period,\n author,\n [asOf ? `${asOf} 時点` : null, source ? `出典: ${source}` : null].filter(Boolean).join(\" / \") || undefined,\n ].filter(Boolean)\n return (\n <section\n data-slot=\"slide-cover\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"1fr auto\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideColumns>\n <SlideColumn span={8}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.md,\n minHeight: 0,\n }}\n >\n <div style={{ width: SLIDE_SPEC.grid.columnWidth, height: 8, background: \"var(--slide-accent)\" }} />\n <h1\n style={{\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n textWrap: \"balance\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p style={{ margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>\n {subtitle}\n </p>\n )}\n </div>\n </SlideColumn>\n </SlideColumns>\n {meta.length > 0 && (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n color: \"var(--slide-muted)\",\n }}\n >\n {meta.join(\" | \")}\n </p>\n )}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-exec-summary — the conclusion first: an action title (the conclusion as a sentence) and 3–5 points\n * under it, each a one-line headline with an optional supporting line. The content of one `<Slide>`; the root\n * fills the canvas.\n *\n * - `layout=\"rows\"` (default) stacks the points full width, numbered; `\"columns\"` puts them side by side\n * (reads best with 3–4 points).\n * - Keep a headline to about 30 characters and a supporting line to about 50; longer text wraps (and may push past the safe area).\n * - More than 5 points do not fit the canvas: they are still drawn, with a `console.warn` — split the slide.\n * - The data comes in as props; nothing here reads an app context.\n *\n * @example\n * <Slide>\n * <SlideExecSummary title=\"Q2 は売上が計画を 4% 上回り、解約の改善が次の課題\" points={[{ headline: \"売上は 5.4 億円で計画比 +4%\", detail: \"新規 38 社が牽引\" }, …]} asOf=\"2026-10-20\" />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_POINTS = 5\n\nexport interface SlideExecSummaryPoint {\n /** The point in one line. */\n headline: string\n /** One supporting line (a number, a cause). */\n detail?: string\n}\n\nexport interface SlideExecSummaryProps {\n /** The conclusion as a sentence (an action title), not a topic. */\n title: string\n /** 3–5 points. */\n points: SlideExecSummaryPoint[]\n layout?: \"rows\" | \"columns\"\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideExecSummary({ title, points, layout = \"rows\", asOf, source }: SlideExecSummaryProps) {\n const hasSource = Boolean(asOf || source)\n if (points.length > MAX_POINTS) console.warn(`SlideExecSummary: ${points.length} points; ${MAX_POINTS} fit the canvas. Split the slide.`)\n const number = (i: number) => String(i + 1).padStart(2, \"0\")\n return (\n <section\n data-slot=\"slide-exec-summary\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n {layout === \"columns\" ? (\n <ol\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${Math.max(points.length, 1)}, 1fr)`,\n columnGap: SLIDE_SPEC.grid.gutter,\n }}\n >\n {points.map((p, i) => (\n <li\n key={i}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n paddingTop: SLIDE_SPEC.space.md,\n borderTop: \"4px solid var(--slide-accent)\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {number(i)}\n </span>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{p.headline}</span>\n {p.detail && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{p.detail}</span>\n )}\n </li>\n ))}\n </ol>\n ) : (\n <ol\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n {points.map((p, i) => (\n <li\n key={i}\n style={{\n display: \"grid\",\n gridTemplateColumns: `${SLIDE_SPEC.grid.columnWidth}px 1fr`,\n columnGap: SLIDE_SPEC.space.md,\n alignItems: \"baseline\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {number(i)}\n </span>\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{p.headline}</span>\n {p.detail && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{p.detail}</span>\n )}\n </div>\n </li>\n ))}\n </ol>\n )}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-kpi-grid — a scoreboard: 2–4 KPI cards side by side, each with its label, value, change and (if any)\n * the target. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `value` is the number (`null` shows「—」), formatted here with `format` (`formatValue`); `display` replaces the\n * shown text when you need a wording the format cannot make. The number behind it is kept on the element as\n * `data-raw`.\n * - `delta.value` is the change in the same units as `format` (or its own `delta.format`); the direction comes from\n * its sign. `betterWhen` (default `\"up\"`) says which direction is good and drives the colour; the arrow and the\n * word「増」「減」always show, so print and colour-blind readers get the direction too. `comparisonLabel` says\n * what the change is against (e.g.「前年同期比」).\n * - `target` is a number in the same `format`; the block shows「目標 …(達成率 …)」. The rate is value ÷ target\n * (target ÷ value when `betterWhen` is `\"down\"`, so beating a cost target reads above 100%).\n * - 2–4 cards share the width equally; more than 4 are still drawn, with a `console.warn` — split the slide. A long\n * number wraps inside its card; keep it to about 8 characters.\n *\n * @example\n * <Slide>\n * <SlideKpiGrid title=\"売上と継続率は計画どおり、新規獲得だけが未達\" items={[{ label: \"月次売上\", value: 540_000_000, format: \"currency\", delta: { value: 0.074, format: \"percent\" }, comparisonLabel: \"前月比\", target: 520_000_000 }, …]} />\n * </Slide>\n */\n\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ITEMS = 4\n\n/** A change: its size in the metric's units, signed. The direction is read from the sign. */\nexport interface SlideKpiGridDelta {\n /** e.g. `0.074` with `format: \"percent\"` →「+7.4%」. */\n value: number\n /** Default: the item's `format`. */\n format?: ValueFormat\n}\n\nexport interface SlideKpiGridItem {\n label: string\n /** The number; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown text only (the number behind it stays `value`). */\n display?: string\n delta?: SlideKpiGridDelta\n /** Which direction of `delta` is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** What `delta` is against, e.g.「前月比」. */\n comparisonLabel?: string\n /** The target, in the same `format` as `value`. The attainment rate is worked out here. */\n target?: number\n}\n\nexport interface SlideKpiGridProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** 2–4 KPIs. */\n items: SlideKpiGridItem[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst ARROW = { up: \"▲\", down: \"▼\", flat: \"▬\" } as const\nconst WORD = { up: \"増\", down: \"減\", flat: \"横ばい\" } as const\n\n/** Direction comes from the sign; the colour from whether that direction is the better one. The arrow and the word always show. */\nfunction deltaView(delta: { value: number; format?: ValueFormat }, betterWhen: \"up\" | \"down\") {\n const direction = delta.value > 0 ? \"up\" : delta.value < 0 ? \"down\" : \"flat\"\n const color = direction === \"flat\" ? \"var(--slide-muted)\" : direction === betterWhen ? \"var(--positive)\" : \"var(--negative)\"\n const amount = formatValue(delta.value, delta.format, undefined, { signDisplay: \"exceptZero\" })\n return { color, text: `${ARROW[direction]} ${WORD[direction]} ${amount}` }\n}\n\n/** 「目標 5.2 億円(達成率 104%)」; the rate is left out when it cannot be worked out. */\nfunction targetText(item: SlideKpiGridItem): string | undefined {\n if (item.target === undefined) return undefined\n const { value, target, betterWhen = \"up\" } = item\n const rate = value === null ? undefined : betterWhen === \"down\" ? target / value : value / target\n const shown = `目標 ${formatValue(target, item.format)}`\n return rate === undefined || !Number.isFinite(rate) ? shown : `${shown}(達成率 ${formatValue(rate, { type: \"percent\", digits: 0 })})`\n}\n\nexport function SlideKpiGrid({ title, items, asOf, source }: SlideKpiGridProps) {\n const hasSource = Boolean(asOf || source)\n if (items.length > MAX_ITEMS) console.warn(`SlideKpiGrid: ${items.length} items; ${MAX_ITEMS} fit the canvas. Split the slide.`)\n return (\n <section\n data-slot=\"slide-kpi-grid\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div\n style={{\n gridColumn: \"1 / -1\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${Math.max(items.length, 1)}, 1fr)`,\n columnGap: SLIDE_SPEC.grid.gutter,\n alignItems: \"center\",\n }}\n >\n {items.map((item, i) => {\n const delta = item.delta ? deltaView({ value: item.delta.value, format: item.delta.format ?? item.format }, item.betterWhen ?? \"up\") : undefined\n const target = targetText(item)\n return (\n <div\n key={i}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n padding: SLIDE_SPEC.space.md,\n border: \"2px solid var(--border)\",\n borderRadius: \"var(--slide-radius)\",\n minWidth: 0,\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, fontWeight: 700, color: \"var(--slide-muted)\" }}>\n {item.label}\n </span>\n <span\n data-raw={item.value ?? undefined}\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {item.display ?? formatValue(item.value, item.format)}\n </span>\n {delta && (\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: delta.color }}>\n {delta.text}\n {item.comparisonLabel && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, fontWeight: 400, color: \"var(--slide-muted)\" }}> {item.comparisonLabel}</span>\n )}\n </span>\n )}\n {target && <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{target}</span>}\n </div>\n )\n })}\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-kpi-hero — one number as the hero: the label and the value (hero size) with its change on the left\n * 6 columns, the trend as a line on the right 6. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `value` is the number (`null` shows「—」), formatted here with `format` (`formatValue`); `display` replaces the\n * shown text when you need a wording the format cannot make. The number behind it is kept on the element as\n * `data-raw` for export and tests.\n * - `delta.value` is the change in the same units as `format` (or its own `delta.format`); the direction comes from\n * its sign. `betterWhen` (default `\"up\"`) says which direction is good and drives the colour; the arrow and the\n * word「増」「減」always show, so print and colour-blind readers get the direction too.\n * - Without `trend` the number takes the whole width. A long number wraps instead of overflowing; keep it to about\n * 8 characters at the hero size.\n * - The chart is `EChart` inside `data-waitfor=\"canvas\"` so the pptx export waits for it. Animation is off.\n * - The headline clamps to 2 lines. Keep it to about 40 characters.\n *\n * @example\n * <Slide>\n * <SlideKpiHero title=\"9 月の売上は過去最高の 5.4 億円\" label=\"月次売上\" value={540_000_000} format=\"currency\" delta={{ value: 0.074, format: \"percent\" }} comparisonLabel=\"前月比\" trend={trend} asOf=\"2026-10-01\" />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\n/** A change: its size in the metric's units, signed. The direction is read from the sign. */\nexport interface SlideKpiHeroDelta {\n /** e.g. `0.074` with `format: \"percent\"` →「+7.4%」. */\n value: number\n /** Default: the metric's `format`. */\n format?: ValueFormat\n}\n\nexport interface SlideKpiHeroProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** What the number is, e.g.「月次売上」. */\n label: string\n /** The number; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown text only (the number behind it stays `value`). */\n display?: string\n delta?: SlideKpiHeroDelta\n /** Which direction of `delta` is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** What `delta` is against, e.g.「前月比」. */\n comparisonLabel?: string\n /** Points of the line on the right; leave out for a number alone. */\n trend?: { x: string; y: number }[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst ARROW = { up: \"▲\", down: \"▼\", flat: \"▬\" } as const\nconst WORD = { up: \"増\", down: \"減\", flat: \"横ばい\" } as const\n\n/** Direction comes from the sign; the colour from whether that direction is the better one. The arrow and the word always show. */\nfunction deltaView(delta: { value: number; format?: ValueFormat }, betterWhen: \"up\" | \"down\") {\n const direction = delta.value > 0 ? \"up\" : delta.value < 0 ? \"down\" : \"flat\"\n const color = direction === \"flat\" ? \"var(--slide-muted)\" : direction === betterWhen ? \"var(--positive)\" : \"var(--negative)\"\n const amount = formatValue(delta.value, delta.format, undefined, { signDisplay: \"exceptZero\" })\n return { color, text: `${ARROW[direction]} ${WORD[direction]} ${amount}` }\n}\n\nexport function SlideKpiHero({ title, label, value, format, display, delta, betterWhen = \"up\", comparisonLabel, trend, asOf, source }: SlideKpiHeroProps) {\n const hasSource = Boolean(asOf || source)\n const deltaShown = delta ? deltaView({ value: delta.value, format: delta.format ?? format }, betterWhen) : undefined\n const option = useMemo<EChartsOption | undefined>(() => {\n if (!trend || trend.length === 0) return undefined\n return {\n animation: false,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n grid: { left: 0, right: SLIDE_SPEC.space.sm, top: SLIDE_SPEC.space.sm, bottom: 0, containLabel: true },\n // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and\n // `hideOverlap` drops whichever still collides.\n xAxis: {\n type: \"category\",\n data: trend.map((p) => p.x),\n boundaryGap: false,\n axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, margin: SLIDE_SPEC.space.sm, hideOverlap: true },\n },\n yAxis: {\n type: \"value\",\n scale: true,\n axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, hideOverlap: true, formatter: (v: number) => formatValue(v, \"compact\") },\n },\n series: [\n {\n type: \"line\",\n data: trend.map((p) => p.y),\n symbol: \"circle\",\n symbolSize: SLIDE_SPEC.space.sm / 2,\n lineStyle: { width: 6 },\n areaStyle: { opacity: 0.12 },\n },\n ],\n }\n }, [trend])\n\n return (\n <section\n data-slot=\"slide-kpi-hero\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n <SlideColumn span={option ? 6 : 12}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, color: \"var(--slide-muted)\" }}>{label}</span>\n <span\n data-raw={value ?? undefined}\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: \"var(--slide-size-hero)\",\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {display ?? formatValue(value, format)}\n </span>\n {(deltaShown || comparisonLabel) && (\n <span style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"baseline\", gap: SLIDE_SPEC.space.sm, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading }}>\n {deltaShown && <span style={{ color: deltaShown.color, fontWeight: 700 }}>{deltaShown.text}</span>}\n {comparisonLabel && <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, color: \"var(--slide-muted)\" }}>{comparisonLabel}</span>}\n </span>\n )}\n </div>\n </SlideColumn>\n {option && (\n <SlideColumn span={6}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={`${label}の推移`} />\n </div>\n </SlideColumn>\n )}\n </SlideColumns>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-next-actions — what happens next: 3–5 actions, each with an owner, a due date and (if any) the metric\n * that tells it worked. The closing slide of most reports. The content of one `<Slide>`; the root fills the canvas.\n *\n * - A column (担当 / 期限 / 確認する指標) appears only when at least one item has it.\n * - Text is free-form: `due` is shown as written (`\"10/31\"`, `\"2026-11-15\"`) on one line, so keep it to about 10 characters;\n * an action to about 40. More than 5 items are still drawn,\n * with a `console.warn` — split the slide.\n *\n * @example\n * <Slide>\n * <SlideNextActions title=\"来月は解約抑止の施策を 3 つ、10 月中に始める\" items={[{ action: \"解約予兆スコアの上位 50 社に CS が連絡する\", owner: \"CS 部 山田\", due: \"10/31\", metric: \"解約率 1.5% 以下\" }, …]} />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ITEMS = 5\nconst MAX_DUE_CHARS = 10\n\nexport interface SlideNextActionsItem {\n /** What to do, as one sentence starting from the verb's object. */\n action: string\n owner?: string\n /** As written, e.g. `\"10/31\"`. */\n due?: string\n /** What to look at to know it worked. */\n metric?: string\n}\n\nexport interface SlideNextActionsProps {\n /** The decision or the plan as a sentence (an action title). */\n title: string\n /** 3–5 actions. */\n items: SlideNextActionsItem[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideNextActions({ title, items, asOf, source }: SlideNextActionsProps) {\n const hasSource = Boolean(asOf || source)\n if (items.length > MAX_ITEMS) console.warn(`SlideNextActions: ${items.length} items; ${MAX_ITEMS} fit the canvas. Split the slide.`)\n if (items.some((it) => (it.due?.length ?? 0) > MAX_DUE_CHARS)) console.warn(`SlideNextActions: a due date is over ${MAX_DUE_CHARS} characters; the column is one line wide. Shorten it.`)\n const cols = [\n { key: \"owner\", head: \"担当\", fr: 2 },\n { key: \"due\", head: \"期限\", fr: 2 },\n { key: \"metric\", head: \"確認する指標\", fr: 3 },\n ] as const\n const shown = cols.filter((c) => items.some((it) => it[c.key]))\n const template = [`${SLIDE_SPEC.grid.columnWidth}px`, \"minmax(0, 6fr)\", ...shown.map((c) => `minmax(0, ${c.fr}fr)`)].join(\" \")\n const row = { display: \"grid\", gridTemplateColumns: template, columnGap: SLIDE_SPEC.space.md, alignItems: \"baseline\" } as const\n return (\n <section\n data-slot=\"slide-next-actions\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div style={{ gridColumn: \"1 / -1\", minHeight: 0, display: \"flex\", flexDirection: \"column\", justifyContent: \"center\" }}>\n {shown.length > 0 && (\n <div\n aria-hidden\n style={{\n ...row,\n paddingBottom: SLIDE_SPEC.space.sm,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n color: \"var(--slide-muted)\",\n }}\n >\n <span />\n <span />\n {shown.map((c) => (\n <span key={c.key}>{c.head}</span>\n ))}\n </div>\n )}\n <ol style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {items.map((it, i) => (\n <li\n key={i}\n style={{\n ...row,\n paddingTop: SLIDE_SPEC.space.sm,\n paddingBottom: SLIDE_SPEC.space.sm,\n borderTop: \"2px solid var(--border)\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {String(i + 1).padStart(2, \"0\")}\n </span>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{it.action}</span>\n {shown.map((c) => (\n <span\n key={c.key}\n style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, ...(c.key === \"due\" ? { whiteSpace: \"nowrap\" } : {}) }}\n >\n {it[c.key]}\n </span>\n ))}\n </li>\n ))}\n </ol>\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-scorecard-table — target vs actual per metric, with a status (on track / at risk / off track) as a\n * coloured dot and a word. The content of one `<Slide>`; the root fills the canvas.\n *\n * - Up to 8 rows. From 7 rows the text drops from body to caption size so the table fits the canvas; more than\n * 8 are still drawn, with a `console.warn` — split the slide.\n * - `value` (the actual) and `target` are numbers formatted here with the row's `format` (`formatValue`; `null`\n * shows「—」); `display` replaces the shown actual only. The attainment is worked out as value ÷ target (target ÷\n * value when `betterWhen` is `\"down\"`, so beating a cost target reads above 100%) and shown when any row has a target.\n * - `status` is given, not derived: `on` = on track, `risk` = at risk, `off` = off track. It is not the only cue: the\n * word is always shown next to the dot.\n * - `columns` overrides the header words (default: 指標 / 目標 / 実績 / 達成率 / 状態).\n * - The body text follows `--slide-size-body`. Keep a metric name to about 20 characters.\n *\n * @example\n * <Slide>\n * <SlideScorecardTable title=\"6 指標のうち 4 つが目標どおり、解約と新規が遅れている\" rows={[{ metric: \"月次売上\", value: 540_000_000, target: 520_000_000, format: \"currency\", status: \"on\" }, …]} />\n * </Slide>\n */\n\nimport { EMPTY_VALUE, formatValue, type ValueFormat } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ROWS = 8\nconst DENSE_ROWS = 6\n\nexport type SlideScorecardStatus = \"on\" | \"risk\" | \"off\"\n\nexport interface SlideScorecardRow {\n metric: string\n /** The actual; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown actual only (the number behind it stays `value`). */\n display?: string\n /** The target, in the same `format` as `value`. */\n target?: number\n /** Which direction is good. Default `\"up\"`; it flips the attainment rate. */\n betterWhen?: \"up\" | \"down\"\n /** `on` = on track, `risk` = at risk, `off` = off track. */\n status: SlideScorecardStatus\n}\n\nexport interface SlideScorecardTableProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** Up to 8 rows. */\n rows: SlideScorecardRow[]\n /** Header words; leave out what you do not rename. */\n columns?: Partial<Record<\"metric\" | \"target\" | \"actual\" | \"attainment\" | \"status\", string>>\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst STATUS = {\n on: { label: \"順調\", color: \"var(--positive)\" },\n risk: { label: \"要注意\", color: \"var(--warning)\" },\n off: { label: \"遅延\", color: \"var(--negative)\" },\n} as const\n\n/** Value ÷ target (target ÷ value for a metric where lower is better); undefined when it cannot be worked out. */\nfunction attainment(row: SlideScorecardRow): number | undefined {\n if (row.value === null || row.target === undefined) return undefined\n const rate = row.betterWhen === \"down\" ? row.target / row.value : row.value / row.target\n return Number.isFinite(rate) ? rate : undefined\n}\n\nexport function SlideScorecardTable({ title, rows, columns, asOf, source }: SlideScorecardTableProps) {\n const hasSource = Boolean(asOf || source)\n if (rows.length > MAX_ROWS) console.warn(`SlideScorecardTable: ${rows.length} rows; ${MAX_ROWS} fit the canvas. Split the slide.`)\n const head = { metric: \"指標\", target: \"目標\", actual: \"実績\", attainment: \"達成率\", status: \"状態\", ...columns }\n const showAttainment = rows.some((r) => attainment(r) !== undefined)\n const cellSize = rows.length > DENSE_ROWS ? SLIDE_SPEC.fontSize.caption : \"var(--slide-size-body)\"\n const cell = {\n paddingLeft: SLIDE_SPEC.space.sm,\n paddingRight: SLIDE_SPEC.space.sm,\n borderBottom: \"2px solid var(--border)\",\n textAlign: \"left\",\n verticalAlign: \"middle\",\n } as const\n const num = { ...cell, textAlign: \"right\", fontVariantNumeric: \"tabular-nums\" } as const\n return (\n <section\n data-slot=\"slide-scorecard-table\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div style={{ gridColumn: \"1 / -1\", minHeight: 0 }}>\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: cellSize, lineHeight: SLIDE_SPEC.lineHeight.body }}>\n <thead>\n <tr style={{ color: \"var(--slide-muted)\", fontSize: SLIDE_SPEC.fontSize.caption }}>\n <th style={{ ...cell, fontWeight: 700 }}>{head.metric}</th>\n <th style={{ ...num, fontWeight: 700 }}>{head.target}</th>\n <th style={{ ...num, fontWeight: 700 }}>{head.actual}</th>\n {showAttainment && <th style={{ ...num, fontWeight: 700 }}>{head.attainment}</th>}\n <th style={{ ...cell, fontWeight: 700 }}>{head.status}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((r, i) => (\n <tr key={i}>\n <th scope=\"row\" style={{ ...cell, fontWeight: 700 }}>\n {r.metric}\n </th>\n <td style={num}>{r.target === undefined ? EMPTY_VALUE : formatValue(r.target, r.format)}</td>\n <td style={{ ...num, fontWeight: 700 }}>{r.display ?? formatValue(r.value, r.format)}</td>\n {showAttainment && (\n <td style={num}>{attainment(r) === undefined ? EMPTY_VALUE : formatValue(attainment(r), { type: \"percent\", digits: 0 })}</td>\n )}\n <td style={cell}>\n <span aria-hidden style={{ color: STATUS[r.status].color }}>\n ●\n </span>{\" \"}\n {STATUS[r.status].label}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-chart-full — one chart across all 12 columns with a one-line note under it. For a chart that needs the\n * width (many categories, a long series). The content of one `<Slide>`; the root fills the canvas.\n *\n * - `chart` has the same shape as `SlideChartInsight`'s and is built by the same option (canvas-size text, no\n * tooltip, no animation, series told apart by more than colour).\n * - `note` is one line that says how to read the chart or what to watch; keep it to about 60 characters.\n * - The chart sits in `data-waitfor=\"canvas\"` so the pptx export waits for it.\n *\n * @example\n * <Slide>\n * <SlideChartFull title=\"売上は 9 月に過去最高を更新した\" chart={{ type: \"line\", categories: [\"7 月\", \"8 月\", \"9 月\"], series: [{ name: \"売上(百万円)\", data: [120, 132, 151] }] }} note=\"9 月は大型案件 2 件の計上を含む\" />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { buildSlideChartOption, type SlideChartInsightChart } from \"../slide-chart-insight/slide-chart-insight\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nexport interface SlideChartFullProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n chart: SlideChartInsightChart\n /** One line under the chart. */\n note?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideChartFull({ title, chart, note, asOf, source }: SlideChartFullProps) {\n const hasSource = Boolean(asOf || source)\n const option = useMemo<EChartsOption>(() => buildSlideChartOption(chart), [chart])\n return (\n <section\n data-slot=\"slide-chart-full\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: [\"auto\", \"1fr\", note ? \"auto\" : null, hasSource ? \"auto\" : null].filter(Boolean).join(\" \"),\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n <SlideColumn span={12}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={title} />\n </div>\n </SlideColumn>\n </SlideColumns>\n {note && <p style={{ gridColumn: \"1 / -1\", margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>{note}</p>}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-comparison — A vs B, or before / after: 2–3 columns side by side, each with a heading, one main number\n * (with its change) and a few points; an optional `verdict` line under them. The content of one `<Slide>`; the\n * root fills the canvas.\n *\n * - Columns share the 12 columns equally (6 / 6 or 4 / 4 / 4). Write the same kind of points in each, in the same order.\n * - The main number is `value` + `format` (formatted here), or `display` for a string you already formatted\n * (「1.2 億円」); `display` wins. `delta` is the change itself (`{ value, format }`, a ratio for `percent`; `format` falls back to the column's `format`), `comparisonLabel` names its basis, and\n * `betterWhen` (`\"up\"` default, `\"down\"` for churn / cost) decides good / bad.\n * - Keep each point to about 24 characters (the column is 4–6 of 12) and 3 points per column.\n *\n * @example\n * <Slide>\n * <SlideComparison title=\"新プランは旧プランより解約が少ない\" columns={[\n * { heading: \"旧プラン\", value: 0.024, format: \"percent\", points: [\"月額 9,800 円\", \"導入支援なし\"] },\n * { heading: \"新プラン\", value: 0.018, format: \"percent\", delta: { value: -0.006 }, comparisonLabel: \"旧プラン比\", betterWhen: \"down\", points: [\"月額 12,800 円\", \"導入支援つき\"] },\n * ]} verdict=\"導入支援の有無が解約率の差の主因\" />\n * </Slide>\n */\n\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { DeltaText } from \"../delta-text/delta-text\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_POINTS = 3\nconst MAX_POINT_CHARS = 24\n\nexport interface SlideComparisonColumn {\n /** What this column is, e.g.「旧プラン」「施策前」. */\n heading: string\n /** The main number. `null` shows「—」. */\n value?: number | null\n format?: ValueFormat\n /** The main number as a string you already formatted; wins over `value`. */\n display?: string\n /** The change of the main number against the other side or the previous period. `format` falls back to the column's `format`. */\n delta?: { value: number | null; format?: ValueFormat }\n /** Name of what `delta` is measured against, e.g.「前月比」「旧プラン比」. Printed before the change. */\n comparisonLabel?: string\n /** Which way is good for the main number. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** 1–3 short points about this column. */\n points: string[]\n}\n\nexport interface SlideComparisonProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** 2–3 columns. */\n columns: SlideComparisonColumn[]\n /** One line that says which side wins or what follows. */\n verdict?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideComparison({ title, columns, verdict, asOf, source }: SlideComparisonProps) {\n const hasSource = Boolean(asOf || source)\n if (columns.length < 2 || columns.length > 3) console.warn(`SlideComparison: ${columns.length} columns; 2–3 fit. Split the slide.`)\n if (columns.some((c) => c.points.length > MAX_POINTS || c.points.some((t) => t.length > MAX_POINT_CHARS)))\n console.warn(`SlideComparison: a column has over ${MAX_POINTS} points or a point over ${MAX_POINT_CHARS} characters. Shorten it.`)\n const span = Math.floor(SLIDE_SPEC.grid.columns / Math.max(columns.length, 1))\n return (\n <section\n data-slot=\"slide-comparison\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: [\"auto\", \"1fr\", verdict ? \"auto\" : null, hasSource ? \"auto\" : null].filter(Boolean).join(\" \"),\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n {columns.map((col, i) => {\n const main = col.display ?? (col.value === undefined ? undefined : col.value === null ? \"—\" : formatValue(col.value, col.format))\n return (\n <SlideColumn key={i} span={span}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.md,\n paddingTop: SLIDE_SPEC.space.sm,\n borderTop: \"4px solid var(--slide-accent)\",\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n }}\n >\n {col.heading}\n </h3>\n {main !== undefined && (\n <p style={{ margin: 0, display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n <span\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {main}\n </span>\n {col.delta && (\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>\n <DeltaText value={col.delta.value} format={col.delta.format ?? col.format} betterWhen={col.betterWhen} comparisonLabel={col.comparisonLabel} />\n </span>\n )}\n </p>\n )}\n {col.points.length > 0 && (\n <ul\n style={{\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n {col.points.map((text, j) => (\n <li key={j} style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>\n {text}\n </li>\n ))}\n </ul>\n )}\n </div>\n </SlideColumn>\n )\n })}\n </SlideColumns>\n {verdict && (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n paddingLeft: SLIDE_SPEC.space.sm,\n borderLeft: \"4px solid var(--slide-accent)\",\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n }}\n >\n {verdict}\n </p>\n )}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-section — a chapter divider. The chapter title large on the left; with `items` it doubles as the\n * agenda on the right: a numbered list with the `current` chapter in the accent colour. The content of one\n * `<Slide>`; the root fills the canvas.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. No reveal steps: a caller who wants one wraps it.\n * - `index` is the chapter number shown above the title (e.g. 2 → \"02\"); `current` is the 1-based position in `items`.\n * - Keep `items` to about 6; they are one line each.\n *\n * @example\n * <Slide>\n * <SlideSection index={2} title=\"解約の動向\" lead=\"どの層が、いつ離れているか\" items={[\"全体像\", \"解約の動向\", \"次の打ち手\"]} current={2} />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\n\nexport interface SlideSectionProps {\n /** The chapter number, shown as「02」above the title. */\n index?: number\n title: string\n /** One line under the title saying what the chapter answers. */\n lead?: string\n /** The chapters of the deck, shown as a numbered agenda at the right. */\n items?: string[]\n /** The chapter in `items` to emphasise, 1-based. */\n current?: number\n}\n\nexport function SlideSection({ index, title, lead, items, current }: SlideSectionProps) {\n const hasItems = Boolean(items && items.length > 0)\n return (\n <section\n data-slot=\"slide-section\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"minmax(0, 1fr)\",\n columnGap: SLIDE_SPEC.grid.gutter,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideColumns align=\"center\">\n <SlideColumn span={hasItems ? 7 : 12}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.md }}>\n <div style={{ width: SLIDE_SPEC.grid.columnWidth, height: 8, background: \"var(--slide-accent)\" }} />\n {index !== undefined && (\n <p\n style={{\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n color: \"var(--slide-accent)\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {String(index).padStart(2, \"0\")}\n </p>\n )}\n <h1\n style={{\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n }}\n >\n {title}\n </h1>\n {lead && <p style={{ margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{lead}</p>}\n </div>\n </SlideColumn>\n {hasItems && (\n <SlideColumn span={5}>\n <ol style={{ margin: 0, padding: 0, listStyle: \"none\", display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n {items!.map((text, i) => {\n const active = current === i + 1\n return (\n <li\n key={i}\n aria-current={active ? \"step\" : undefined}\n style={{\n display: \"flex\",\n gap: SLIDE_SPEC.space.sm,\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: active ? 700 : 400,\n color: active ? \"var(--slide-accent)\" : \"var(--slide-muted)\",\n }}\n >\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{String(i + 1).padStart(2, \"0\")}</span>\n <span>{text}</span>\n </li>\n )\n })}\n </ol>\n </SlideColumn>\n )}\n </SlideColumns>\n </section>\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","../../../squadkit/registry/lib/page-spec.ts","../../../squadkit/registry/blocks/slide-columns/slide-columns.tsx","../../../squadkit/registry/blocks/slide-heading/slide-heading.tsx","../../../squadkit/registry/blocks/slide-source-line/slide-source-line.tsx","../../../squadkit/registry/blocks/slide-chart-insight/slide-chart-insight.tsx","../../../squadkit/registry/blocks/slide-cover/slide-cover.tsx","../../../squadkit/registry/blocks/slide-exec-summary/slide-exec-summary.tsx","../../../squadkit/registry/blocks/slide-kpi-grid/slide-kpi-grid.tsx","../../../squadkit/registry/blocks/slide-kpi-hero/slide-kpi-hero.tsx","../../../squadkit/registry/blocks/slide-next-actions/slide-next-actions.tsx","../../../squadkit/registry/blocks/slide-scorecard-table/slide-scorecard-table.tsx","../../../squadkit/registry/blocks/slide-chart-full/slide-chart-full.tsx","../../../squadkit/registry/blocks/slide-comparison/slide-comparison.tsx","../../../squadkit/registry/blocks/slide-section/slide-section.tsx"],"names":["jsx","useRef","useMemo","useState","jsxs","useEffect","createContext","useLayoutEffect","useContext","to","Fragment","Children","isValidElement","useCallback","cloneElement","GUTTER","TEXT","ARROW","deltaView","MAX_ITEMS","MAX_POINTS"],"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 // Phrase-aware Japanese line breaks for every block. Browsers without\n // `auto-phrase` drop the declaration and keep the strict line-break rules.\n wordBreak: \"auto-phrase\" as CSSProperties[\"wordBreak\"],\n lineBreak: \"strict\",\n overflowWrap: \"break-word\",\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 // Same phrase-aware line breaking as the on-screen canvas (see canvas.tsx).\n wordBreak: \"auto-phrase\" as CSSStyleDeclaration[\"wordBreak\"],\n lineBreak: \"strict\",\n overflowWrap: \"break-word\",\n })\n // The rasterised foreignObject does not inherit <html lang>; auto-phrase needs it.\n if (document.documentElement.lang) host.lang = document.documentElement.lang\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 '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, system-ui, 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 '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, system-ui, 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","/**\n * Numeric conventions for slide and document pages, in one place. Each value is\n * either the one the framework CSS already ships (`theme/slide-doc.css`) or a\n * new one decided here; the tests pin the CSS-backed ones to these constants and\n * derive the rest (content box, grid) from them, so they cannot drift apart.\n * Not part of the public export surface.\n *\n * Slide lengths are canvas pixels on the fixed 1920x1080 canvas, not rem: a\n * slide is scaled as a whole. Document lengths are rem / em, like any text page.\n */\n\nconst CANVAS_WIDTH = 1920\nconst CANVAS_HEIGHT = 1080\nconst SAFE_X = 160\nconst SAFE_Y = 120\nconst COLUMNS = 12\nconst GUTTER = 32\nconst COLUMN_WIDTH = 104\n\nexport const SLIDE_SPEC = {\n canvas: {\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n /** width / height */\n ratio: CANVAS_WIDTH / CANVAS_HEIGHT,\n },\n /** Keep content inside this margin; backgrounds may bleed past it. */\n safeArea: { x: SAFE_X, y: SAFE_Y },\n /** The canvas minus the safe area on both sides. */\n content: {\n width: CANVAS_WIDTH - 2 * SAFE_X,\n height: CANVAS_HEIGHT - 2 * SAFE_Y,\n },\n /** Spans the content width: 12 columns + 11 gutters = 1600. */\n grid: { columns: COLUMNS, gutter: GUTTER, columnWidth: COLUMN_WIDTH },\n /** Font sizes in canvas px, strictly increasing. */\n fontSize: { caption: 24, body: 36, page: 64, section: 88, hero: 168 },\n lineHeight: { heading: 1.2, body: 1.6 },\n /** Gaps between elements, in canvas px. */\n space: { sm: 32, md: 48, lg: 64 },\n} as const\n\nexport const DOC_SPEC = {\n /** Reading column width, centred. */\n maxWidth: \"48rem\",\n body: { fontSize: \"1rem\", lineHeight: 1.8 },\n /** Images and video scale down to the column, never beyond it. */\n figure: { maxWidth: \"100%\" },\n /** Heading sizes in em, relative to the body size; margins are top / bottom. */\n heading: {\n h1: { fontSize: \"2em\", marginTop: \"0\", marginBottom: \"0.8em\" },\n h2: { fontSize: \"1.5em\", marginTop: \"2em\", marginBottom: \"0.75em\" },\n h3: { fontSize: \"1.25em\", marginTop: \"1.6em\", marginBottom: \"0.6em\" },\n h4: { fontSize: \"1em\", marginTop: \"1.4em\", marginBottom: \"0.5em\" },\n },\n} as const\n","\"use client\"\n\n/**\n * slide-columns — the 12-column layout of one slide's body: `SlideColumns` lays out `SlideColumn`s, each taking\n * `span` of the 12 columns (8 / 4, 6 / 6, 4 / 4 / 4, …). A part for the body row of a slide's grid, not a whole\n * slide, so it is not a `slide` block.\n *\n * - The gap is `SLIDE_SPEC.grid.gutter` and the track count `SLIDE_SPEC.grid.columns`; nothing is literal.\n * - `SlideColumns` spans all 12 columns of the grid it sits in and fills the row's height; the spans of its\n * `SlideColumn`s should add up to 12.\n * - A column's content that must fill the column's height sets `height: \"100%\"` itself.\n *\n * @example\n * <SlideColumns align=\"center\">\n * <SlideColumn span={8}>…chart…</SlideColumn>\n * <SlideColumn span={4}>…reading…</SlideColumn>\n * </SlideColumns>\n */\nimport type { ReactNode } from \"react\"\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nexport interface SlideColumnsProps {\n children: ReactNode\n /** Vertical alignment of the columns in the row. Default `\"stretch\"`. */\n align?: \"start\" | \"center\" | \"stretch\"\n}\n\nexport function SlideColumns({ children, align = \"stretch\" }: SlideColumnsProps) {\n return (\n <div\n style={{\n gridColumn: \"1 / -1\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"minmax(0, 1fr)\",\n columnGap: SLIDE_SPEC.grid.gutter,\n alignItems: align,\n }}\n >\n {children}\n </div>\n )\n}\n\nexport interface SlideColumnProps {\n /** How many of the 12 columns it takes, 1–12. */\n span: number\n children: ReactNode\n}\n\nexport function SlideColumn({ span, children }: SlideColumnProps) {\n return <div style={{ gridColumn: `span ${span}`, minWidth: 0, minHeight: 0 }}>{children}</div>\n}\n","\"use client\"\n\n/**\n * slide-heading — the title of one slide: an `h2` at the page size, clamped to 2 lines, with an optional\n * eyebrow (a small label above it, e.g. the chapter). A part for the top row of a slide's 12-column grid, not a\n * whole slide: it has no canvas-filling root, so it is not a `slide` block.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. It spans all 12 columns of the grid it sits in.\n * - Write the title as the conclusion (an action title), not a topic.\n *\n * @example\n * <SlideHeading title=\"解約率は 6 月以降、毎月下がり続けている\" eyebrow=\"第 2 章 解約\" />\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nexport interface SlideHeadingProps {\n /** The conclusion as a sentence (an action title). Clamped to 2 lines. */\n title: string\n /** A short label above the title, e.g.「第 2 章 解約」. */\n eyebrow?: string\n}\n\nexport function SlideHeading({ title, eyebrow }: SlideHeadingProps) {\n const heading = (\n <h2\n style={{\n ...(eyebrow ? {} : { gridColumn: \"1 / -1\" }),\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n overflow: \"hidden\",\n }}\n >\n {title}\n </h2>\n )\n if (!eyebrow) return heading\n return (\n <div style={{ gridColumn: \"1 / -1\", display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n <p\n style={{\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n color: \"var(--slide-accent)\",\n }}\n >\n {eyebrow}\n </p>\n {heading}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * slide-source-line — the footer line of one slide: the data's as-of date and source, and optionally the page\n * number at the right. A part for the bottom row of a slide's 12-column grid, not a whole slide, so it is not a\n * `slide` block. Renders nothing when it has nothing to show.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. It spans all 12 columns of the grid it sits in.\n * - The page number is passed in (`page`): this package cannot read the slide's position from the framework.\n *\n * @example\n * <SlideSourceLine asOf=\"2026-10-20\" source=\"社内 BI\" page={{ current: 3, total: 12 }} />\n */\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\n\nconst TEXT = {\n ja: { asOf: (asOf: string) => `${asOf} 時点`, source: (source: string) => `出典: ${source}` },\n en: { asOf: (asOf: string) => `As of ${asOf}`, source: (source: string) => `Source: ${source}` },\n}\n\nexport interface SlideSourceLineProps {\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(this part adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n /** The page number, shown at the right as「3 / 12」. */\n page?: { current: number; total: number }\n}\n\nexport function SlideSourceLine({ asOf, source, page }: SlideSourceLineProps) {\n const t = TEXT[uiLanguage(useLocale())]\n const text = [asOf ? t.asOf(asOf) : null, source ? t.source(source) : null].filter(Boolean).join(\" / \")\n if (!text && !page) return null\n return (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n color: \"var(--slide-muted)\",\n ...(page ? { display: \"flex\", justifyContent: \"space-between\", gap: SLIDE_SPEC.space.md } : {}),\n }}\n >\n {page ? (\n <>\n <span>{text}</span>\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{`${page.current} / ${page.total}`}</span>\n </>\n ) : (\n text\n )}\n </p>\n )\n}\n","\"use client\"\n\n/**\n * slide-chart-insight — one chart (8 of 12 columns) and its reading (the other 4, up to 3 points). The most\n * common slide in a report. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `chart` is `line` / `bar` / `area` over `categories` with one or more `series`; the option is built here\n * with canvas-size text (`SLIDE_SPEC.fontSize.caption`), no tooltip and no animation, so it exports to pptx as it\n * looks. Two or more series show a legend and differ by line type and marker (bars by pattern), not by colour\n * alone, so a greyscale print still reads. Colours follow the chart tokens. `line` / `area` do not start the y axis\n * at 0, so the movement fills the plot; `bar` always does.\n * - Keep each insight to about 40 characters (the column is 4 of 12); longer ones wrap and may push past the safe area.\n * - `chartSide` puts the chart on the right (`\"right\"`) instead of the left.\n * - The chart sits in `data-waitfor=\"canvas\"` so the pptx export waits for it. More than 3 insights are still\n * drawn, with a `console.warn` — split the slide.\n *\n * @example\n * <Slide>\n * <SlideChartInsight title=\"解約率は 6 月以降、毎月下がり続けている\" chart={{ type: \"line\", categories: [\"7 月\", \"8 月\", \"9 月\"], series: [{ name: \"解約率(%)\", data: [2.4, 2.1, 1.8] }] }} insights={[\"オンボーディング刷新後の 3 か月で 0.6pt 低下\"]} />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { formatValue } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_INSIGHTS = 3\nconst MAX_INSIGHT_CHARS = 40\n\n// Series are told apart by more than colour: a line type and a marker per series (a bar series gets a decal pattern).\nconst LINE_TYPES = [\"solid\", \"dashed\", \"dotted\"] as const\nconst SYMBOLS = [\"circle\", \"rect\", \"triangle\", \"diamond\"] as const\n\nexport interface SlideChartInsightChart {\n type: \"line\" | \"bar\" | \"area\"\n /** The x-axis labels, one per value of each series. */\n categories: string[]\n series: { name: string; data: number[] }[]\n}\n\n/** The ECharts option of a slide chart: canvas-size text, no tooltip, no animation. Shared by the slide blocks that draw one. */\nexport function buildSlideChartOption(chart: SlideChartInsightChart, locale?: string): EChartsOption {\n return {\n animation: false,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n grid: {\n left: 0,\n right: SLIDE_SPEC.space.sm,\n top: chart.series.length > 1 ? SLIDE_SPEC.space.lg : SLIDE_SPEC.space.sm,\n bottom: 0,\n containLabel: true,\n },\n legend:\n chart.series.length > 1\n ? {\n top: 0,\n left: 0,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n }\n : { show: false },\n // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and\n // `hideOverlap` drops whichever still collides.\n xAxis: {\n type: \"category\",\n data: chart.categories,\n // Half a category of room on both sides keeps the first point off the y-axis labels (a line from the axis touches them).\n boundaryGap: true,\n axisLabel: {\n fontSize: SLIDE_SPEC.fontSize.caption,\n margin: SLIDE_SPEC.space.sm,\n hideOverlap: true,\n },\n },\n yAxis: {\n type: \"value\",\n // A line from 0 hugs the top when the values sit in a narrow band; bars must keep their zero baseline.\n scale: chart.type !== \"bar\",\n axisLabel: {\n fontSize: SLIDE_SPEC.fontSize.caption,\n hideOverlap: true,\n formatter: (v: number) => formatValue(v, \"compact\", locale),\n },\n },\n ...(chart.type === \"bar\" && chart.series.length > 1 ? { aria: { enabled: true, decal: { show: true } } } : {}),\n series: chart.series.map((s, i) => ({\n name: s.name,\n type: chart.type === \"bar\" ? \"bar\" : \"line\",\n data: s.data,\n ...(chart.type === \"bar\"\n ? {}\n : {\n symbol: SYMBOLS[i % SYMBOLS.length],\n symbolSize: SLIDE_SPEC.space.sm / 2,\n lineStyle: { width: 6, type: LINE_TYPES[i % LINE_TYPES.length] },\n }),\n ...(chart.type === \"area\" ? { areaStyle: { opacity: 0.16 } } : {}),\n })),\n }\n}\n\nexport interface SlideChartInsightProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n chart: SlideChartInsightChart\n /** 2–3 points that read the chart. */\n insights: string[]\n /** Which side the chart takes. Default `\"left\"`. */\n chartSide?: \"left\" | \"right\"\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideChartInsight({ title, chart, insights, chartSide = \"left\", asOf, source }: SlideChartInsightProps) {\n const hasSource = Boolean(asOf || source)\n if (insights.some((t) => t.length > MAX_INSIGHT_CHARS)) console.warn(`SlideChartInsight: an insight is over ${MAX_INSIGHT_CHARS} characters; the column is narrow. Shorten it.`)\n if (insights.length > MAX_INSIGHTS) console.warn(`SlideChartInsight: ${insights.length} insights; ${MAX_INSIGHTS} fit beside the chart. Split the slide.`)\n const locale = useLocale()\n const option = useMemo<EChartsOption>(() => buildSlideChartOption(chart, locale), [chart, locale])\n const chartFirst = chartSide === \"left\"\n const chartColumn = (\n <SlideColumn span={7}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={title} />\n </div>\n </SlideColumn>\n )\n const insightsColumn = (\n <SlideColumn span={5}>\n <ul\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.md,\n }}\n >\n {insights.map((text, i) => (\n <li\n key={i}\n style={{\n paddingLeft: SLIDE_SPEC.space.sm,\n borderLeft: \"4px solid var(--slide-accent)\",\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n }}\n >\n {text}\n </li>\n ))}\n </ul>\n </SlideColumn>\n )\n return (\n <section\n data-slot=\"slide-chart-insight\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n {chartFirst ? chartColumn : insightsColumn}\n {chartFirst ? insightsColumn : chartColumn}\n </SlideColumns>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-cover — the cover of a deck: the title, an optional subtitle, and the period / author / as-of line\n * at the foot. The content of one `<Slide>` (it has no `<Slide>` of its own); the root fills the canvas.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. The title sits in the left 8 of 12 columns.\n * - The data comes in as props; nothing here reads an app context.\n *\n * @example\n * <Slide>\n * <SlideCover title=\"2026 年度 第 2 四半期 事業レビュー\" subtitle=\"売上・解約・新規獲得の振り返りと次の打ち手\" period=\"2026 年 7 月〜9 月\" author=\"事業企画チーム\" asOf=\"2026-10-20\" />\n * </Slide>\n */\n\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\n\nexport interface SlideCoverProps {\n /** The name of the deck. */\n title: string\n subtitle?: string\n /** The period the deck covers, e.g.「2026 年 7 月〜9 月」. */\n period?: string\n author?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-20\"`. Shown as「2026-10-20 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst TEXT = {\n ja: { asOf: (asOf: string) => `${asOf} 時点`, source: (source: string) => `出典: ${source}`, separator: \" | \" },\n en: { asOf: (asOf: string) => `As of ${asOf}`, source: (source: string) => `Source: ${source}`, separator: \" | \" },\n}\n\nexport function SlideCover({ title, subtitle, period, author, asOf, source }: SlideCoverProps) {\n const t = TEXT[uiLanguage(useLocale())]\n const meta = [\n period,\n author,\n [asOf ? t.asOf(asOf) : null, source ? t.source(source) : null].filter(Boolean).join(\" / \") || undefined,\n ].filter(Boolean)\n return (\n <section\n data-slot=\"slide-cover\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"1fr auto\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideColumns>\n <SlideColumn span={8}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.md,\n minHeight: 0,\n }}\n >\n <div style={{ width: SLIDE_SPEC.grid.columnWidth, height: 8, background: \"var(--slide-accent)\" }} />\n <h1\n style={{\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n textWrap: \"balance\",\n }}\n >\n {title}\n </h1>\n {subtitle && (\n <p style={{ margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>\n {subtitle}\n </p>\n )}\n </div>\n </SlideColumn>\n </SlideColumns>\n {meta.length > 0 && (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n color: \"var(--slide-muted)\",\n }}\n >\n {meta.join(t.separator)}\n </p>\n )}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-exec-summary — the conclusion first: an action title (the conclusion as a sentence) and 3–5 points\n * under it, each a one-line headline with an optional supporting line. The content of one `<Slide>`; the root\n * fills the canvas.\n *\n * - `layout=\"rows\"` (default) stacks the points full width, numbered; `\"columns\"` puts them side by side\n * (reads best with 3–4 points).\n * - Keep a headline to about 30 characters and a supporting line to about 50; longer text wraps (and may push past the safe area).\n * - More than 5 points do not fit the canvas: they are still drawn, with a `console.warn` — split the slide.\n * - The data comes in as props; nothing here reads an app context.\n *\n * @example\n * <Slide>\n * <SlideExecSummary title=\"Q2 は売上が計画を 4% 上回り、解約の改善が次の課題\" points={[{ headline: \"売上は 5.4 億円で計画比 +4%\", detail: \"新規 38 社が牽引\" }, …]} asOf=\"2026-10-20\" />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_POINTS = 5\n\nexport interface SlideExecSummaryPoint {\n /** The point in one line. */\n headline: string\n /** One supporting line (a number, a cause). */\n detail?: string\n}\n\nexport interface SlideExecSummaryProps {\n /** The conclusion as a sentence (an action title), not a topic. */\n title: string\n /** 3–5 points. */\n points: SlideExecSummaryPoint[]\n layout?: \"rows\" | \"columns\"\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideExecSummary({ title, points, layout = \"rows\", asOf, source }: SlideExecSummaryProps) {\n const hasSource = Boolean(asOf || source)\n if (points.length > MAX_POINTS) console.warn(`SlideExecSummary: ${points.length} points; ${MAX_POINTS} fit the canvas. Split the slide.`)\n const number = (i: number) => String(i + 1).padStart(2, \"0\")\n return (\n <section\n data-slot=\"slide-exec-summary\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n {layout === \"columns\" ? (\n <ol\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${Math.max(points.length, 1)}, 1fr)`,\n columnGap: SLIDE_SPEC.grid.gutter,\n }}\n >\n {points.map((p, i) => (\n <li\n key={i}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n paddingTop: SLIDE_SPEC.space.md,\n borderTop: \"4px solid var(--slide-accent)\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {number(i)}\n </span>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{p.headline}</span>\n {p.detail && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{p.detail}</span>\n )}\n </li>\n ))}\n </ol>\n ) : (\n <ol\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n {points.map((p, i) => (\n <li\n key={i}\n style={{\n display: \"grid\",\n gridTemplateColumns: `${SLIDE_SPEC.grid.columnWidth}px 1fr`,\n columnGap: SLIDE_SPEC.space.md,\n alignItems: \"baseline\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {number(i)}\n </span>\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{p.headline}</span>\n {p.detail && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{p.detail}</span>\n )}\n </div>\n </li>\n ))}\n </ol>\n )}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-kpi-grid — a scoreboard: 2–4 KPI cards side by side, each with its label, value, change and (if any)\n * the target. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `value` is the number (`null` shows「—」), formatted here with `format` (`formatValue`); `display` replaces the\n * shown text when you need a wording the format cannot make. The number behind it is kept on the element as\n * `data-raw`.\n * - `delta.value` is the change in the same units as `format` (or its own `delta.format`); the direction comes from\n * its sign. `betterWhen` (default `\"up\"`) says which direction is good and drives the colour; the arrow and the\n * word「増」「減」always show, so print and colour-blind readers get the direction too. `comparisonLabel` says\n * what the change is against (e.g.「前年同期比」).\n * - `target` is a number in the same `format`; the block shows「目標 …(達成率 …)」. The rate is value ÷ target\n * (target ÷ value when `betterWhen` is `\"down\"`, so beating a cost target reads above 100%).\n * - 2–4 cards share the width equally; more than 4 are still drawn, with a `console.warn` — split the slide. A long\n * number wraps inside its card; keep it to about 8 characters.\n *\n * @example\n * <Slide>\n * <SlideKpiGrid title=\"売上と継続率は計画どおり、新規獲得だけが未達\" items={[{ label: \"月次売上\", value: 540_000_000, format: \"currency\", delta: { value: 0.074, format: \"percent\" }, comparisonLabel: \"前月比\", target: 520_000_000 }, …]} />\n * </Slide>\n */\n\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ITEMS = 4\n\n/** A change: its size in the metric's units, signed. The direction is read from the sign. */\nexport interface SlideKpiGridDelta {\n /** e.g. `0.074` with `format: \"percent\"` →「+7.4%」. */\n value: number\n /** Default: the item's `format`. */\n format?: ValueFormat\n}\n\nexport interface SlideKpiGridItem {\n label: string\n /** The number; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown text only (the number behind it stays `value`). */\n display?: string\n delta?: SlideKpiGridDelta\n /** Which direction of `delta` is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** What `delta` is against, e.g.「前月比」. */\n comparisonLabel?: string\n /** The target, in the same `format` as `value`. The attainment rate is worked out here. */\n target?: number\n}\n\nexport interface SlideKpiGridProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** 2–4 KPIs. */\n items: SlideKpiGridItem[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst ARROW = { up: \"▲\", down: \"▼\", flat: \"▬\" } as const\nconst TEXT = {\n ja: {\n up: \"増\",\n down: \"減\",\n flat: \"横ばい\",\n target: (target: string) => `目標 ${target}`,\n attainment: (shown: string, rate: string) => `${shown}(達成率 ${rate})`,\n },\n en: {\n up: \"Up\",\n down: \"Down\",\n flat: \"Flat\",\n target: (target: string) => `Target ${target}`,\n attainment: (shown: string, rate: string) => `${shown} (${rate} attained)`,\n },\n}\n\n/** Direction comes from the sign; the colour from whether that direction is the better one. The arrow and the word always show. */\nfunction deltaView(delta: { value: number; format?: ValueFormat }, betterWhen: \"up\" | \"down\", locale: string) {\n const direction = delta.value > 0 ? \"up\" : delta.value < 0 ? \"down\" : \"flat\"\n const color = direction === \"flat\" ? \"var(--slide-muted)\" : direction === betterWhen ? \"var(--positive)\" : \"var(--negative)\"\n const amount = formatValue(delta.value, delta.format, locale, { signDisplay: \"exceptZero\" })\n return { color, text: `${ARROW[direction]} ${TEXT[uiLanguage(locale)][direction]} ${amount}` }\n}\n\n/** 「目標 5.2 億円(達成率 104%)」; the rate is left out when it cannot be worked out. */\nfunction targetText(item: SlideKpiGridItem, locale: string): string | undefined {\n if (item.target === undefined) return undefined\n const t = TEXT[uiLanguage(locale)]\n const { value, target, betterWhen = \"up\" } = item\n const rate = value === null ? undefined : betterWhen === \"down\" ? target / value : value / target\n const shown = t.target(formatValue(target, item.format, locale))\n return rate === undefined || !Number.isFinite(rate) ? shown : t.attainment(shown, formatValue(rate, { type: \"percent\", digits: 0 }, locale))\n}\n\nexport function SlideKpiGrid({ title, items, asOf, source }: SlideKpiGridProps) {\n const locale = useLocale()\n const hasSource = Boolean(asOf || source)\n if (items.length > MAX_ITEMS) console.warn(`SlideKpiGrid: ${items.length} items; ${MAX_ITEMS} fit the canvas. Split the slide.`)\n return (\n <section\n data-slot=\"slide-kpi-grid\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div\n style={{\n gridColumn: \"1 / -1\",\n minHeight: 0,\n display: \"grid\",\n gridTemplateColumns: `repeat(${Math.max(items.length, 1)}, 1fr)`,\n columnGap: SLIDE_SPEC.grid.gutter,\n alignItems: \"center\",\n }}\n >\n {items.map((item, i) => {\n const delta = item.delta\n ? deltaView({ value: item.delta.value, format: item.delta.format ?? item.format }, item.betterWhen ?? \"up\", locale)\n : undefined\n const target = targetText(item, locale)\n return (\n <div\n key={i}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n padding: SLIDE_SPEC.space.md,\n border: \"2px solid var(--border)\",\n borderRadius: \"var(--slide-radius)\",\n minWidth: 0,\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, fontWeight: 700, color: \"var(--slide-muted)\" }}>\n {item.label}\n </span>\n <span\n data-raw={item.value ?? undefined}\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {item.display ?? formatValue(item.value, item.format, locale)}\n </span>\n {delta && (\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: delta.color }}>\n {delta.text}\n {item.comparisonLabel && (\n <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, fontWeight: 400, color: \"var(--slide-muted)\" }}> {item.comparisonLabel}</span>\n )}\n </span>\n )}\n {target && <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{target}</span>}\n </div>\n )\n })}\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-kpi-hero — one number as the hero: the label and the value (hero size) with its change on the left\n * 6 columns, the trend as a line on the right 6. The content of one `<Slide>`; the root fills the canvas.\n *\n * - `value` is the number (`null` shows「—」), formatted here with `format` (`formatValue`); `display` replaces the\n * shown text when you need a wording the format cannot make. The number behind it is kept on the element as\n * `data-raw` for export and tests.\n * - `delta.value` is the change in the same units as `format` (or its own `delta.format`); the direction comes from\n * its sign. `betterWhen` (default `\"up\"`) says which direction is good and drives the colour; the arrow and the\n * word「増」「減」always show, so print and colour-blind readers get the direction too.\n * - Without `trend` the number takes the whole width. A long number wraps instead of overflowing; keep it to about\n * 8 characters at the hero size.\n * - The chart is `EChart` inside `data-waitfor=\"canvas\"` so the pptx export waits for it. Animation is off.\n * - The headline clamps to 2 lines. Keep it to about 40 characters.\n *\n * @example\n * <Slide>\n * <SlideKpiHero title=\"9 月の売上は過去最高の 5.4 億円\" label=\"月次売上\" value={540_000_000} format=\"currency\" delta={{ value: 0.074, format: \"percent\" }} comparisonLabel=\"前月比\" trend={trend} asOf=\"2026-10-01\" />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\n/** A change: its size in the metric's units, signed. The direction is read from the sign. */\nexport interface SlideKpiHeroDelta {\n /** e.g. `0.074` with `format: \"percent\"` →「+7.4%」. */\n value: number\n /** Default: the metric's `format`. */\n format?: ValueFormat\n}\n\nexport interface SlideKpiHeroProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** What the number is, e.g.「月次売上」. */\n label: string\n /** The number; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown text only (the number behind it stays `value`). */\n display?: string\n delta?: SlideKpiHeroDelta\n /** Which direction of `delta` is good. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** What `delta` is against, e.g.「前月比」. */\n comparisonLabel?: string\n /** Points of the line on the right; leave out for a number alone. */\n trend?: { x: string; y: number }[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst ARROW = { up: \"▲\", down: \"▼\", flat: \"▬\" } as const\nconst TEXT = {\n ja: { up: \"増\", down: \"減\", flat: \"横ばい\", trend: (label: string) => `${label}の推移` },\n en: { up: \"Up\", down: \"Down\", flat: \"Flat\", trend: (label: string) => `${label} trend` },\n}\n\n/** Direction comes from the sign; the colour from whether that direction is the better one. The arrow and the word always show. */\nfunction deltaView(delta: { value: number; format?: ValueFormat }, betterWhen: \"up\" | \"down\", locale: string) {\n const direction = delta.value > 0 ? \"up\" : delta.value < 0 ? \"down\" : \"flat\"\n const color = direction === \"flat\" ? \"var(--slide-muted)\" : direction === betterWhen ? \"var(--positive)\" : \"var(--negative)\"\n const amount = formatValue(delta.value, delta.format, locale, { signDisplay: \"exceptZero\" })\n return { color, text: `${ARROW[direction]} ${TEXT[uiLanguage(locale)][direction]} ${amount}` }\n}\n\nexport function SlideKpiHero({ title, label, value, format, display, delta, betterWhen = \"up\", comparisonLabel, trend, asOf, source }: SlideKpiHeroProps) {\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const hasSource = Boolean(asOf || source)\n const deltaShown = delta ? deltaView({ value: delta.value, format: delta.format ?? format }, betterWhen, locale) : undefined\n const option = useMemo<EChartsOption | undefined>(() => {\n if (!trend || trend.length === 0) return undefined\n return {\n animation: false,\n textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },\n grid: { left: 0, right: SLIDE_SPEC.space.sm, top: SLIDE_SPEC.space.sm, bottom: 0, containLabel: true },\n // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and\n // `hideOverlap` drops whichever still collides.\n xAxis: {\n type: \"category\",\n data: trend.map((p) => p.x),\n boundaryGap: false,\n axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, margin: SLIDE_SPEC.space.sm, hideOverlap: true },\n },\n yAxis: {\n type: \"value\",\n scale: true,\n axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, hideOverlap: true, formatter: (v: number) => formatValue(v, \"compact\", locale) },\n },\n series: [\n {\n type: \"line\",\n data: trend.map((p) => p.y),\n symbol: \"circle\",\n symbolSize: SLIDE_SPEC.space.sm / 2,\n lineStyle: { width: 6 },\n areaStyle: { opacity: 0.12 },\n },\n ],\n }\n }, [trend, locale])\n\n return (\n <section\n data-slot=\"slide-kpi-hero\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n <SlideColumn span={option ? 6 : 12}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, color: \"var(--slide-muted)\" }}>{label}</span>\n <span\n data-raw={value ?? undefined}\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: \"var(--slide-size-hero)\",\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {display ?? formatValue(value, format, locale)}\n </span>\n {(deltaShown || comparisonLabel) && (\n <span style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"baseline\", gap: SLIDE_SPEC.space.sm, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading }}>\n {deltaShown && <span style={{ color: deltaShown.color, fontWeight: 700 }}>{deltaShown.text}</span>}\n {comparisonLabel && <span style={{ fontSize: SLIDE_SPEC.fontSize.caption, color: \"var(--slide-muted)\" }}>{comparisonLabel}</span>}\n </span>\n )}\n </div>\n </SlideColumn>\n {option && (\n <SlideColumn span={6}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={t.trend(label)} />\n </div>\n </SlideColumn>\n )}\n </SlideColumns>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-next-actions — what happens next: 3–5 actions, each with an owner, a due date and (if any) the metric\n * that tells it worked. The closing slide of most reports. The content of one `<Slide>`; the root fills the canvas.\n *\n * - A column (担当 / 期限 / 確認する指標) appears only when at least one item has it.\n * - Text is free-form: `due` is shown as written (`\"10/31\"`, `\"2026-11-15\"`) on one line, so keep it to about 10 characters;\n * an action to about 40. More than 5 items are still drawn,\n * with a `console.warn` — split the slide.\n *\n * @example\n * <Slide>\n * <SlideNextActions title=\"来月は解約抑止の施策を 3 つ、10 月中に始める\" items={[{ action: \"解約予兆スコアの上位 50 社に CS が連絡する\", owner: \"CS 部 山田\", due: \"10/31\", metric: \"解約率 1.5% 以下\" }, …]} />\n * </Slide>\n */\n\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ITEMS = 5\nconst MAX_DUE_CHARS = 10\n\nconst HEADS = {\n ja: { owner: \"担当\", due: \"期限\", metric: \"確認する指標\" },\n en: { owner: \"Owner\", due: \"Due\", metric: \"Metric to watch\" },\n}\n\nexport interface SlideNextActionsItem {\n /** What to do, as one sentence starting from the verb's object. */\n action: string\n owner?: string\n /** As written, e.g. `\"10/31\"`. */\n due?: string\n /** What to look at to know it worked. */\n metric?: string\n}\n\nexport interface SlideNextActionsProps {\n /** The decision or the plan as a sentence (an action title). */\n title: string\n /** 3–5 actions. */\n items: SlideNextActionsItem[]\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideNextActions({ title, items, asOf, source }: SlideNextActionsProps) {\n const head = HEADS[uiLanguage(useLocale())]\n const hasSource = Boolean(asOf || source)\n if (items.length > MAX_ITEMS) console.warn(`SlideNextActions: ${items.length} items; ${MAX_ITEMS} fit the canvas. Split the slide.`)\n if (items.some((it) => (it.due?.length ?? 0) > MAX_DUE_CHARS)) console.warn(`SlideNextActions: a due date is over ${MAX_DUE_CHARS} characters; the column is one line wide. Shorten it.`)\n const cols = [\n { key: \"owner\", head: head.owner, fr: 2 },\n { key: \"due\", head: head.due, fr: 2 },\n { key: \"metric\", head: head.metric, fr: 3 },\n ] as const\n const shown = cols.filter((c) => items.some((it) => it[c.key]))\n const template = [`${SLIDE_SPEC.grid.columnWidth}px`, \"minmax(0, 6fr)\", ...shown.map((c) => `minmax(0, ${c.fr}fr)`)].join(\" \")\n const row = { display: \"grid\", gridTemplateColumns: template, columnGap: SLIDE_SPEC.space.md, alignItems: \"baseline\" } as const\n return (\n <section\n data-slot=\"slide-next-actions\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div style={{ gridColumn: \"1 / -1\", minHeight: 0, display: \"flex\", flexDirection: \"column\", justifyContent: \"center\" }}>\n {shown.length > 0 && (\n <div\n aria-hidden\n style={{\n ...row,\n paddingBottom: SLIDE_SPEC.space.sm,\n fontSize: SLIDE_SPEC.fontSize.caption,\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n color: \"var(--slide-muted)\",\n }}\n >\n <span />\n <span />\n {shown.map((c) => (\n <span key={c.key}>{c.head}</span>\n ))}\n </div>\n )}\n <ol style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {items.map((it, i) => (\n <li\n key={i}\n style={{\n ...row,\n paddingTop: SLIDE_SPEC.space.sm,\n paddingBottom: SLIDE_SPEC.space.sm,\n borderTop: \"2px solid var(--border)\",\n }}\n >\n <span style={{ fontSize: SLIDE_SPEC.fontSize.page, lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700, color: \"var(--slide-accent)\" }}>\n {String(i + 1).padStart(2, \"0\")}\n </span>\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.heading, fontWeight: 700 }}>{it.action}</span>\n {shown.map((c) => (\n <span\n key={c.key}\n style={{ fontSize: SLIDE_SPEC.fontSize.caption, lineHeight: SLIDE_SPEC.lineHeight.body, ...(c.key === \"due\" ? { whiteSpace: \"nowrap\" } : {}) }}\n >\n {it[c.key]}\n </span>\n ))}\n </li>\n ))}\n </ol>\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-scorecard-table — target vs actual per metric, with a status (on track / at risk / off track) as a\n * coloured dot and a word. The content of one `<Slide>`; the root fills the canvas.\n *\n * - Up to 8 rows. From 7 rows the text drops from body to caption size so the table fits the canvas; more than\n * 8 are still drawn, with a `console.warn` — split the slide.\n * - `value` (the actual) and `target` are numbers formatted here with the row's `format` (`formatValue`; `null`\n * shows「—」); `display` replaces the shown actual only. The attainment is worked out as value ÷ target (target ÷\n * value when `betterWhen` is `\"down\"`, so beating a cost target reads above 100%) and shown when any row has a target.\n * - `status` is given, not derived: `on` = on track, `risk` = at risk, `off` = off track. It is not the only cue: the\n * word is always shown next to the dot.\n * - `columns` overrides the header words (default: 指標 / 目標 / 実績 / 達成率 / 状態).\n * - The body text follows `--slide-size-body`. Keep a metric name to about 20 characters.\n *\n * @example\n * <Slide>\n * <SlideScorecardTable title=\"6 指標のうち 4 つが目標どおり、解約と新規が遅れている\" rows={[{ metric: \"月次売上\", value: 540_000_000, target: 520_000_000, format: \"currency\", status: \"on\" }, …]} />\n * </Slide>\n */\n\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { EMPTY_VALUE, formatValue, type ValueFormat } from \"../../lib/format\"\nimport { uiLanguage } from \"../../lib/locale\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_ROWS = 8\nconst DENSE_ROWS = 6\n\nexport type SlideScorecardStatus = \"on\" | \"risk\" | \"off\"\n\nexport interface SlideScorecardRow {\n metric: string\n /** The actual; `null` shows「—」. */\n value: number | null\n format?: ValueFormat\n /** Replaces the shown actual only (the number behind it stays `value`). */\n display?: string\n /** The target, in the same `format` as `value`. */\n target?: number\n /** Which direction is good. Default `\"up\"`; it flips the attainment rate. */\n betterWhen?: \"up\" | \"down\"\n /** `on` = on track, `risk` = at risk, `off` = off track. */\n status: SlideScorecardStatus\n}\n\nexport interface SlideScorecardTableProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** Up to 8 rows. */\n rows: SlideScorecardRow[]\n /** Header words; leave out what you do not rename. */\n columns?: Partial<Record<\"metric\" | \"target\" | \"actual\" | \"attainment\" | \"status\", string>>\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nconst STATUS_COLOR = {\n on: \"var(--positive)\",\n risk: \"var(--warning)\",\n off: \"var(--negative)\",\n} as const\n\nconst TEXT = {\n ja: {\n status: { on: \"順調\", risk: \"要注意\", off: \"遅延\" },\n head: { metric: \"指標\", target: \"目標\", actual: \"実績\", attainment: \"達成率\", status: \"状態\" },\n },\n en: {\n status: { on: \"On track\", risk: \"At risk\", off: \"Off track\" },\n head: { metric: \"Metric\", target: \"Target\", actual: \"Actual\", attainment: \"Attainment\", status: \"Status\" },\n },\n}\n\n/** Value ÷ target (target ÷ value for a metric where lower is better); undefined when it cannot be worked out. */\nfunction attainment(row: SlideScorecardRow): number | undefined {\n if (row.value === null || row.target === undefined) return undefined\n const rate = row.betterWhen === \"down\" ? row.target / row.value : row.value / row.target\n return Number.isFinite(rate) ? rate : undefined\n}\n\nexport function SlideScorecardTable({ title, rows, columns, asOf, source }: SlideScorecardTableProps) {\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const hasSource = Boolean(asOf || source)\n if (rows.length > MAX_ROWS) console.warn(`SlideScorecardTable: ${rows.length} rows; ${MAX_ROWS} fit the canvas. Split the slide.`)\n const head = { ...t.head, ...columns }\n const showAttainment = rows.some((r) => attainment(r) !== undefined)\n const cellSize = rows.length > DENSE_ROWS ? SLIDE_SPEC.fontSize.caption : \"var(--slide-size-body)\"\n const cell = {\n paddingLeft: SLIDE_SPEC.space.sm,\n paddingRight: SLIDE_SPEC.space.sm,\n borderBottom: \"2px solid var(--border)\",\n textAlign: \"left\",\n verticalAlign: \"middle\",\n } as const\n const num = { ...cell, textAlign: \"right\", fontVariantNumeric: \"tabular-nums\" } as const\n return (\n <section\n data-slot=\"slide-scorecard-table\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: hasSource ? \"auto 1fr auto\" : \"auto 1fr\",\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <div style={{ gridColumn: \"1 / -1\", minHeight: 0 }}>\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: cellSize, lineHeight: SLIDE_SPEC.lineHeight.body }}>\n <thead>\n <tr style={{ color: \"var(--slide-muted)\", fontSize: SLIDE_SPEC.fontSize.caption }}>\n <th style={{ ...cell, fontWeight: 700 }}>{head.metric}</th>\n <th style={{ ...num, fontWeight: 700 }}>{head.target}</th>\n <th style={{ ...num, fontWeight: 700 }}>{head.actual}</th>\n {showAttainment && <th style={{ ...num, fontWeight: 700 }}>{head.attainment}</th>}\n <th style={{ ...cell, fontWeight: 700 }}>{head.status}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((r, i) => (\n <tr key={i}>\n <th scope=\"row\" style={{ ...cell, fontWeight: 700 }}>\n {r.metric}\n </th>\n <td style={num}>{r.target === undefined ? EMPTY_VALUE : formatValue(r.target, r.format, locale)}</td>\n <td style={{ ...num, fontWeight: 700 }}>{r.display ?? formatValue(r.value, r.format, locale)}</td>\n {showAttainment && (\n <td style={num}>{attainment(r) === undefined ? EMPTY_VALUE : formatValue(attainment(r), { type: \"percent\", digits: 0 }, locale)}</td>\n )}\n <td style={cell}>\n <span aria-hidden style={{ color: STATUS_COLOR[r.status] }}>\n ●\n </span>{\" \"}\n {t.status[r.status]}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-chart-full — one chart across all 12 columns with a one-line note under it. For a chart that needs the\n * width (many categories, a long series). The content of one `<Slide>`; the root fills the canvas.\n *\n * - `chart` has the same shape as `SlideChartInsight`'s and is built by the same option (canvas-size text, no\n * tooltip, no animation, series told apart by more than colour).\n * - `note` is one line that says how to read the chart or what to watch; keep it to about 60 characters.\n * - The chart sits in `data-waitfor=\"canvas\"` so the pptx export waits for it.\n *\n * @example\n * <Slide>\n * <SlideChartFull title=\"売上は 9 月に過去最高を更新した\" chart={{ type: \"line\", categories: [\"7 月\", \"8 月\", \"9 月\"], series: [{ name: \"売上(百万円)\", data: [120, 132, 151] }] }} note=\"9 月は大型案件 2 件の計上を含む\" />\n * </Slide>\n */\nimport { useMemo } from \"react\"\n\nimport { EChart, type EChartsOption } from \"../../charts/echart\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { buildSlideChartOption, type SlideChartInsightChart } from \"../slide-chart-insight/slide-chart-insight\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nexport interface SlideChartFullProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n chart: SlideChartInsightChart\n /** One line under the chart. */\n note?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideChartFull({ title, chart, note, asOf, source }: SlideChartFullProps) {\n const hasSource = Boolean(asOf || source)\n const option = useMemo<EChartsOption>(() => buildSlideChartOption(chart), [chart])\n return (\n <section\n data-slot=\"slide-chart-full\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: [\"auto\", \"1fr\", note ? \"auto\" : null, hasSource ? \"auto\" : null].filter(Boolean).join(\" \"),\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n <SlideColumn span={12}>\n <div data-waitfor=\"canvas\" style={{ minHeight: 0, height: \"100%\" }}>\n <EChart option={option} height=\"100%\" ariaLabel={title} />\n </div>\n </SlideColumn>\n </SlideColumns>\n {note && <p style={{ gridColumn: \"1 / -1\", margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>{note}</p>}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-comparison — A vs B, or before / after: 2–3 columns side by side, each with a heading, one main number\n * (with its change) and a few points; an optional `verdict` line under them. The content of one `<Slide>`; the\n * root fills the canvas.\n *\n * - Columns share the 12 columns equally (6 / 6 or 4 / 4 / 4). Write the same kind of points in each, in the same order.\n * - The main number is `value` + `format` (formatted here), or `display` for a string you already formatted\n * (「1.2 億円」); `display` wins. `delta` is the change itself (`{ value, format }`, a ratio for `percent`; `format` falls back to the column's `format`), `comparisonLabel` names its basis, and\n * `betterWhen` (`\"up\"` default, `\"down\"` for churn / cost) decides good / bad.\n * - Keep each point to about 24 characters (the column is 4–6 of 12) and 3 points per column.\n *\n * @example\n * <Slide>\n * <SlideComparison title=\"新プランは旧プランより解約が少ない\" columns={[\n * { heading: \"旧プラン\", value: 0.024, format: \"percent\", points: [\"月額 9,800 円\", \"導入支援なし\"] },\n * { heading: \"新プラン\", value: 0.018, format: \"percent\", delta: { value: -0.006 }, comparisonLabel: \"旧プラン比\", betterWhen: \"down\", points: [\"月額 12,800 円\", \"導入支援つき\"] },\n * ]} verdict=\"導入支援の有無が解約率の差の主因\" />\n * </Slide>\n */\n\nimport { useLocale } from \"../../hooks/use-locale\"\nimport { formatValue, type ValueFormat } from \"../../lib/format\"\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { DeltaText } from \"../delta-text/delta-text\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\nimport { SlideHeading } from \"../slide-heading/slide-heading\"\nimport { SlideSourceLine } from \"../slide-source-line/slide-source-line\"\n\nconst MAX_POINTS = 3\nconst MAX_POINT_CHARS = 24\n\nexport interface SlideComparisonColumn {\n /** What this column is, e.g.「旧プラン」「施策前」. */\n heading: string\n /** The main number. `null` shows「—」. */\n value?: number | null\n format?: ValueFormat\n /** The main number as a string you already formatted; wins over `value`. */\n display?: string\n /** The change of the main number against the other side or the previous period. `format` falls back to the column's `format`. */\n delta?: { value: number | null; format?: ValueFormat }\n /** Name of what `delta` is measured against, e.g.「前月比」「旧プラン比」. Printed before the change. */\n comparisonLabel?: string\n /** Which way is good for the main number. Default `\"up\"`. */\n betterWhen?: \"up\" | \"down\"\n /** 1–3 short points about this column. */\n points: string[]\n}\n\nexport interface SlideComparisonProps {\n /** The conclusion as a sentence (an action title). */\n title: string\n /** 2–3 columns. */\n columns: SlideComparisonColumn[]\n /** One line that says which side wins or what follows. */\n verdict?: string\n /** The date the numbers were taken, date only, e.g. `\"2026-10-01\"`. Shown as「2026-10-01 時点」(the block adds「時点」once). */\n asOf?: string\n /** Where the numbers come from, e.g.「社内 BI」. Shown as「出典: 社内 BI」. */\n source?: string\n}\n\nexport function SlideComparison({ title, columns, verdict, asOf, source }: SlideComparisonProps) {\n const locale = useLocale()\n const hasSource = Boolean(asOf || source)\n if (columns.length < 2 || columns.length > 3) console.warn(`SlideComparison: ${columns.length} columns; 2–3 fit. Split the slide.`)\n if (columns.some((c) => c.points.length > MAX_POINTS || c.points.some((t) => t.length > MAX_POINT_CHARS)))\n console.warn(`SlideComparison: a column has over ${MAX_POINTS} points or a point over ${MAX_POINT_CHARS} characters. Shorten it.`)\n const span = Math.floor(SLIDE_SPEC.grid.columns / Math.max(columns.length, 1))\n return (\n <section\n data-slot=\"slide-comparison\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: [\"auto\", \"1fr\", verdict ? \"auto\" : null, hasSource ? \"auto\" : null].filter(Boolean).join(\" \"),\n columnGap: SLIDE_SPEC.grid.gutter,\n rowGap: SLIDE_SPEC.space.lg,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideHeading title={title} />\n <SlideColumns>\n {columns.map((col, i) => {\n const main = col.display ?? (col.value === undefined ? undefined : col.value === null ? \"—\" : formatValue(col.value, col.format, locale))\n return (\n <SlideColumn key={i} span={span}>\n <div\n style={{\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.md,\n paddingTop: SLIDE_SPEC.space.sm,\n borderTop: \"4px solid var(--slide-accent)\",\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n }}\n >\n {col.heading}\n </h3>\n {main !== undefined && (\n <p style={{ margin: 0, display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n <span\n style={{\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {main}\n </span>\n {col.delta && (\n <span style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>\n <DeltaText value={col.delta.value} format={col.delta.format ?? col.format} betterWhen={col.betterWhen} comparisonLabel={col.comparisonLabel} />\n </span>\n )}\n </p>\n )}\n {col.points.length > 0 && (\n <ul\n style={{\n margin: 0,\n padding: 0,\n listStyle: \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: SLIDE_SPEC.space.sm,\n }}\n >\n {col.points.map((text, j) => (\n <li key={j} style={{ fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body }}>\n {text}\n </li>\n ))}\n </ul>\n )}\n </div>\n </SlideColumn>\n )\n })}\n </SlideColumns>\n {verdict && (\n <p\n style={{\n gridColumn: \"1 / -1\",\n margin: 0,\n paddingLeft: SLIDE_SPEC.space.sm,\n borderLeft: \"4px solid var(--slide-accent)\",\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: 700,\n }}\n >\n {verdict}\n </p>\n )}\n {hasSource && <SlideSourceLine asOf={asOf} source={source} />}\n </section>\n )\n}\n","\"use client\"\n\n/**\n * slide-section — a chapter divider. The chapter title large on the left; with `items` it doubles as the\n * agenda on the right: a numbered list with the `current` chapter in the accent colour. The content of one\n * `<Slide>`; the root fills the canvas.\n *\n * - Lengths come from `SLIDE_SPEC` (canvas px), never literals. No reveal steps: a caller who wants one wraps it.\n * - `index` is the chapter number shown above the title (e.g. 2 → \"02\"); `current` is the 1-based position in `items`.\n * - Keep `items` to about 6; they are one line each.\n *\n * @example\n * <Slide>\n * <SlideSection index={2} title=\"解約の動向\" lead=\"どの層が、いつ離れているか\" items={[\"全体像\", \"解約の動向\", \"次の打ち手\"]} current={2} />\n * </Slide>\n */\n\nimport { SLIDE_SPEC } from \"../../lib/page-spec\"\nimport { SlideColumn, SlideColumns } from \"../slide-columns/slide-columns\"\n\nexport interface SlideSectionProps {\n /** The chapter number, shown as「02」above the title. */\n index?: number\n title: string\n /** One line under the title saying what the chapter answers. */\n lead?: string\n /** The chapters of the deck, shown as a numbered agenda at the right. */\n items?: string[]\n /** The chapter in `items` to emphasise, 1-based. */\n current?: number\n}\n\nexport function SlideSection({ index, title, lead, items, current }: SlideSectionProps) {\n const hasItems = Boolean(items && items.length > 0)\n return (\n <section\n data-slot=\"slide-section\"\n style={{\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n display: \"grid\",\n gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,\n gridTemplateRows: \"minmax(0, 1fr)\",\n columnGap: SLIDE_SPEC.grid.gutter,\n padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n }}\n >\n <SlideColumns align=\"center\">\n <SlideColumn span={hasItems ? 7 : 12}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.md }}>\n <div style={{ width: SLIDE_SPEC.grid.columnWidth, height: 8, background: \"var(--slide-accent)\" }} />\n {index !== undefined && (\n <p\n style={{\n margin: 0,\n fontSize: SLIDE_SPEC.fontSize.page,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n color: \"var(--slide-accent)\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {String(index).padStart(2, \"0\")}\n </p>\n )}\n <h1\n style={{\n margin: 0,\n fontFamily: \"var(--slide-font-display)\",\n fontSize: SLIDE_SPEC.fontSize.section,\n lineHeight: SLIDE_SPEC.lineHeight.heading,\n fontWeight: 700,\n }}\n >\n {title}\n </h1>\n {lead && <p style={{ margin: 0, fontSize: \"var(--slide-size-body)\", lineHeight: SLIDE_SPEC.lineHeight.body, color: \"var(--slide-muted)\" }}>{lead}</p>}\n </div>\n </SlideColumn>\n {hasItems && (\n <SlideColumn span={5}>\n <ol style={{ margin: 0, padding: 0, listStyle: \"none\", display: \"flex\", flexDirection: \"column\", gap: SLIDE_SPEC.space.sm }}>\n {items!.map((text, i) => {\n const active = current === i + 1\n return (\n <li\n key={i}\n aria-current={active ? \"step\" : undefined}\n style={{\n display: \"flex\",\n gap: SLIDE_SPEC.space.sm,\n fontSize: \"var(--slide-size-body)\",\n lineHeight: SLIDE_SPEC.lineHeight.body,\n fontWeight: active ? 700 : 400,\n color: active ? \"var(--slide-accent)\" : \"var(--slide-muted)\",\n }}\n >\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{String(i + 1).padStart(2, \"0\")}</span>\n <span>{text}</span>\n </li>\n )\n })}\n </ol>\n </SlideColumn>\n )}\n </SlideColumns>\n </section>\n )\n}\n"]}
|