@particle-academy/fancy-slides 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +75 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +44 -3
- package/dist/index.d.ts +44 -3
- package/dist/index.js +72 -1
- package/dist/index.js.map +1 -1
- package/dist/registry.d.cts +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/{types-2yYMJPhi.d.cts → types-C3w37g3A.d.cts} +5 -0
- package/dist/{types-2yYMJPhi.d.ts → types-C3w37g3A.d.ts} +5 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/default-theme.ts","../src/theme/theme-utils.ts","../src/utils/cn.ts","../src/utils/builds.ts","../src/components/Slide/builds-style.ts","../src/components/elements/TextElement/editor-preset.ts","../src/components/elements/TextElement/TextElement.tsx","../src/components/elements/ImageElement/ImageElement.tsx","../src/components/elements/ShapeElement/ShapeElement.tsx","../src/components/Slide/Slide.tsx","../src/hooks/use-slide-keyboard.ts","../src/components/SlideViewer/SlideViewer.tsx","../src/components/PresenterView/PresenterView.tsx","../src/components/SlideThumbnail/SlideThumbnail.tsx","../src/utils/ids.ts","../src/hooks/use-deck-state.ts","../src/utils/chart-presets.ts","../src/components/SlideRail/SlideRail.tsx","../src/components/EditorToolbar/EditorToolbar.tsx","../src/components/ElementInspector/ElementInspector.tsx","../src/components/SpeakerNotes/SpeakerNotes.tsx","../src/components/DeckEditor/DeckEditor.tsx","../src/types.ts"],"names":["DEFAULT_BUILD_DURATION","jsx","jsxs","useEffect","useState","useRef","EASE","useCallback","useMemo","slideId","Action","Text","Fragment","clamp","Separator","Heading","Textarea"],"mappings":"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","file":"index.js","sourcesContent":["import type { Theme } from \"../types\";\n\n/**\n * The default Fancy UI deck theme. Conservative neutral palette, modern\n * geometric typography, 16:9 ratio. Custom themes can extend this — see\n * `defineTheme()` in `./theme-utils`.\n */\nexport const defaultTheme: Theme = {\n name: \"default\",\n aspectRatio: 16 / 9,\n slideWidth: 1920,\n colors: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#64748b\",\n accent: \"#8b5cf6\",\n surface: \"#f8fafc\",\n },\n fonts: {\n heading: '\"Instrument Sans\", ui-sans-serif, system-ui, sans-serif',\n body: '\"Instrument Sans\", ui-sans-serif, system-ui, sans-serif',\n mono: 'ui-monospace, \"JetBrains Mono\", \"Fira Code\", monospace',\n },\n defaultTransition: { kind: \"fade\", duration: 200 },\n};\n\n/** Dark inverse of the default theme. */\nexport const darkTheme: Theme = {\n ...defaultTheme,\n name: \"dark\",\n colors: {\n background: \"#0b1220\",\n text: \"#f8fafc\",\n muted: \"#94a3b8\",\n accent: \"#a855f7\",\n surface: \"#1e293b\",\n },\n};\n\n/** A loud, brand-forward theme — handy for marketing decks. */\nexport const vividTheme: Theme = {\n ...defaultTheme,\n name: \"vivid\",\n colors: {\n background: \"#0f172a\",\n text: \"#f8fafc\",\n muted: \"#cbd5e1\",\n accent: \"#22d3ee\",\n surface: \"#1e293b\",\n },\n};\n\nexport const builtinThemes: Record<string, Theme> = {\n default: defaultTheme,\n dark: darkTheme,\n vivid: vividTheme,\n};\n","import type { Theme } from \"../types\";\nimport { defaultTheme } from \"./default-theme\";\n\n/**\n * Merge a partial theme with the defaults so consumers can override just the\n * pieces they care about (colors, fonts, aspect ratio) and inherit the rest.\n */\nexport function defineTheme(overrides: Partial<Theme> & { name: string }): Theme {\n return {\n ...defaultTheme,\n ...overrides,\n colors: { ...defaultTheme.colors, ...overrides.colors },\n fonts: { ...defaultTheme.fonts, ...overrides.fonts },\n defaultTransition: overrides.defaultTransition ?? defaultTheme.defaultTransition,\n };\n}\n\n/** Resolve the effective theme for a deck — applies the default for any missing fields. */\nexport function resolveTheme(theme: Theme | undefined): Theme {\n if (!theme) return defaultTheme;\n return defineTheme(theme);\n}\n","/**\n * Tiny class-name joiner. Avoids pulling clsx as a dep for this small package.\n */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n","/**\n * Build (entrance-animation) sequencing — the shared model used by both\n * `SlideViewer` and `PresenterView` so step-through behaves identically.\n *\n * A slide's *builds* are the elements that carry an `animation`. They are\n * stable-sorted by `(order ?? 0)` then original element array index, then\n * grouped into *click steps*:\n *\n * - The first build, and every build whose trigger is `\"on-click\"`, starts\n * a NEW step.\n * - `\"with-prev\"` plays simultaneously with the current step's lead.\n * - `\"after-prev\"` plays after a delay equal to the current step's lead\n * duration (chained onto its `delay`).\n *\n * `buildStep` semantics (used by the viewer/presenter):\n * - `0` → nothing built yet; only non-animated elements are visible.\n * - `n` → the first `n` steps have fired; their elements are visible.\n * - `totalSteps` → every build is shown (the fully-built slide).\n */\n\nimport type { ElementAnimation, Slide, SlideElement } from \"../types\";\n\n/** One element participating in a build, paired with its (defaulted) animation. */\nexport interface Build {\n element: SlideElement;\n animation: ElementAnimation;\n /** Original index of the element in the slide's `elements` array (tie-breaker). */\n index: number;\n /**\n * For a \"by paragraph\" text build, which paragraph index (0-based) this\n * build reveals. Undefined for whole-element builds. The renderer uses this\n * to show \"the first K paragraphs of this element\".\n */\n paraIndex?: number;\n}\n\n/**\n * Split a text element's `content` into paragraphs for a \"by paragraph\" build.\n * Splits on `\"\\n\"` and drops a single trailing empty line (so content ending in\n * a newline doesn't manifest a phantom blank build). Empty interior lines are\n * preserved — they still consume a click, matching PowerPoint's behaviour.\n */\nexport function splitParagraphs(content: string): string[] {\n const lines = content.split(\"\\n\");\n if (lines.length > 1 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/**\n * Whether an element expands into per-paragraph builds: a text element whose\n * animation has `byParagraph` and that splits into 2+ paragraphs. With 0/1\n * paragraphs it behaves like a normal single build.\n */\nexport function isByParagraph(element: SlideElement, animation: ElementAnimation): boolean {\n if (!animation.byParagraph || element.type !== \"text\") return false;\n return splitParagraphs(element.content).length > 1;\n}\n\n/** A click step — the set of builds revealed by a single forward advance. */\nexport interface BuildStep {\n /** Builds that reveal on this step (lead first, then with-prev / after-prev). */\n builds: Build[];\n}\n\nconst DEFAULT_BUILD_DURATION = 500;\n\n/**\n * Collect a slide's builds in resolved order: every element with an\n * `animation`, stable-sorted by `(order ?? 0)` then array index.\n */\nexport function collectBuilds(slide: Slide | undefined): Build[] {\n if (!slide) return [];\n const builds: Build[] = [];\n slide.elements.forEach((element, index) => {\n if (element.animation) {\n builds.push({ element, animation: element.animation, index });\n }\n });\n // Stable sort: Array.prototype.sort is stable in modern engines, but we\n // tie-break on the captured array index explicitly to be safe.\n const ordered = builds.sort((a, b) => {\n const ao = a.animation.order ?? 0;\n const bo = b.animation.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.index - b.index;\n });\n\n // Expand \"by paragraph\" text builds into one build per paragraph. The first\n // paragraph keeps the element's own trigger (so it can be with-prev /\n // after-prev relative to a prior element); every subsequent paragraph is\n // \"on-click\" — one line per click. They stay contiguous, so the rest of an\n // element's paragraphs fire before the next element's builds.\n const expanded: Build[] = [];\n for (const build of ordered) {\n if (isByParagraph(build.element, build.animation)) {\n const paras = splitParagraphs((build.element as { content: string }).content);\n paras.forEach((_, paraIndex) => {\n const animation: ElementAnimation =\n paraIndex === 0 ? build.animation : { ...build.animation, trigger: \"on-click\" };\n expanded.push({ element: build.element, animation, index: build.index, paraIndex });\n });\n } else {\n expanded.push(build);\n }\n }\n return expanded;\n}\n\n/**\n * Group a slide's builds into click steps. The first build always opens a\n * step; thereafter an `\"on-click\"` trigger opens a new step while\n * `\"with-prev\"` / `\"after-prev\"` attach to the current one.\n */\nexport function buildSteps(slide: Slide | undefined): BuildStep[] {\n const builds = collectBuilds(slide);\n const steps: BuildStep[] = [];\n for (const build of builds) {\n const trigger = build.animation.trigger ?? \"on-click\";\n if (steps.length === 0 || trigger === \"on-click\") {\n steps.push({ builds: [build] });\n } else {\n steps[steps.length - 1]!.builds.push(build);\n }\n }\n return steps;\n}\n\n/** Total number of click steps for a slide (0 when the slide has no builds). */\nexport function totalBuildSteps(slide: Slide | undefined): number {\n return buildSteps(slide).length;\n}\n\n/**\n * Given a slide and a `buildStep` (0..totalSteps), return the set of element\n * ids that should be VISIBLE. Elements with no animation are always visible;\n * animated elements become visible once their owning step has fired.\n */\nexport function visibleElementIds(slide: Slide | undefined, buildStep: number): Set<string> {\n const visible = new Set<string>();\n if (!slide) return visible;\n const steps = buildSteps(slide);\n const stepOfElement = new Map<string, number>(); // 1-based step at which an element FIRST reveals\n steps.forEach((step, i) => {\n for (const b of step.builds) {\n // For by-paragraph builds many builds share one element id; the\n // element is visible once its earliest (first paragraph) step fires.\n if (!stepOfElement.has(b.element.id)) stepOfElement.set(b.element.id, i + 1);\n }\n });\n for (const element of slide.elements) {\n const revealStep = stepOfElement.get(element.id);\n if (revealStep === undefined) {\n visible.add(element.id); // no animation → always visible\n } else if (buildStep >= revealStep) {\n visible.add(element.id); // step has fired\n }\n }\n return visible;\n}\n\n/**\n * Per-element paragraph reveal state for a \"by paragraph\" text build at a given\n * `buildStep`. Keyed by element id:\n * - `revealed` — how many paragraphs (0..count) should be shown so far.\n * - `firingParaIndex` — the paragraph index revealing on the step that just\n * fired (so the renderer plays its entrance effect), or `undefined` when no\n * paragraph of this element fires on `buildStep`.\n * Only elements that actually expand by-paragraph appear in the map.\n */\nexport interface ParaReveal {\n revealed: number;\n firingParaIndex?: number;\n}\n\nexport function paragraphReveals(slide: Slide | undefined, buildStep: number): Map<string, ParaReveal> {\n const out = new Map<string, ParaReveal>();\n if (!slide) return out;\n const steps = buildSteps(slide);\n steps.forEach((step, i) => {\n const stepNum = i + 1; // 1-based\n for (const b of step.builds) {\n if (b.paraIndex === undefined) continue;\n const fired = buildStep >= stepNum;\n const prev = out.get(b.element.id) ?? { revealed: 0 };\n if (fired) {\n prev.revealed = Math.max(prev.revealed, b.paraIndex + 1);\n if (stepNum === buildStep) prev.firingParaIndex = b.paraIndex;\n }\n out.set(b.element.id, prev);\n }\n });\n return out;\n}\n\n/**\n * The builds that fire when advancing INTO `buildStep` (1-based). Returns the\n * lead build first; the viewer uses `with-prev` / `after-prev` to compute each\n * element's effective `delay`. Empty when `buildStep` is out of range.\n */\nexport function buildsForStep(slide: Slide | undefined, buildStep: number): Build[] {\n const steps = buildSteps(slide);\n const step = steps[buildStep - 1];\n return step ? step.builds : [];\n}\n\n/**\n * Compute the effective entrance delay (ms) for each build within a step,\n * honouring `with-prev` (0 extra) and `after-prev` (lead duration). The lead\n * build keeps its own `delay`; followers add to it. Keyed by element id.\n */\nexport function stepDelays(builds: Build[]): Map<string, number> {\n const delays = new Map<string, number>();\n const lead = builds[0];\n if (!lead) return delays;\n const leadDelay = lead.animation.delay ?? 0;\n const leadDuration = lead.animation.duration ?? DEFAULT_BUILD_DURATION;\n delays.set(lead.element.id, leadDelay);\n for (let i = 1; i < builds.length; i++) {\n const b = builds[i]!;\n const own = b.animation.delay ?? 0;\n const trigger = b.animation.trigger ?? \"on-click\";\n // with-prev → simultaneous with lead; after-prev → starts after lead finishes.\n const base = trigger === \"after-prev\" ? leadDelay + leadDuration : leadDelay;\n delays.set(b.element.id, base + own);\n }\n return delays;\n}\n","/**\n * Pure-CSS entrance animations for element builds. Mirrors the slide-level\n * transition approach in `SlideViewer`: a set of keyframes wrapped in a\n * `prefers-reduced-motion: no-preference` guard, plus a helper that picks the\n * right `animation-name` + timing for a given element animation.\n *\n * No runtime deps — keyframes are injected via a `<style>` tag by `<Slide>`.\n */\n\nimport type { CSSProperties } from \"react\";\nimport type { ElementAnimation } from \"../../types\";\n\nconst DEFAULT_BUILD_DURATION = 500;\nconst EASE = \"cubic-bezier(0.16, 1, 0.3, 1)\"; // ease-out\n\n/**\n * Inline style that plays an element's entrance build. `delay` is the\n * *effective* delay already resolved for with-prev / after-prev chaining.\n * Under reduced-motion the keyframes are disabled in CSS, so the element\n * simply appears at its final frame.\n */\nexport function buildEnterStyle(animation: ElementAnimation, effectiveDelay: number): CSSProperties {\n const duration = animation.duration ?? DEFAULT_BUILD_DURATION;\n const dir = animation.direction ?? \"left\";\n let name: string;\n switch (animation.effect) {\n case \"fade\":\n name = \"fs-build-fade\";\n break;\n case \"zoom\":\n name = \"fs-build-zoom\";\n break;\n case \"fly-in\":\n name = `fs-build-fly-${dir}`;\n break;\n case \"wipe\":\n name = `fs-build-wipe-${dir}`;\n break;\n default:\n name = \"fs-build-fade\";\n }\n return {\n animationName: name,\n animationDuration: `${duration}ms`,\n animationDelay: `${effectiveDelay}ms`,\n animationTimingFunction: EASE,\n animationFillMode: \"both\",\n };\n}\n\n/**\n * Keyframes for every build effect. `fly-in` translates from the named\n * direction; `wipe` reveals via a `clip-path` inset growing from that edge.\n * Reduced-motion users get no animation — `animation-fill-mode: both` would\n * otherwise pin the `from` frame, so we disable the build animations entirely\n * (the elements are still gated on clicks, they just appear instantly).\n */\nexport const BUILD_KEYFRAMES = `\n@media (prefers-reduced-motion: reduce) {\n .fs-build-enter { animation: none !important; }\n}\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fs-build-fade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes fs-build-zoom {\n from { opacity: 0; transform: scale(0.8); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes fs-build-fly-left {\n from { opacity: 0; transform: translateX(-24%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-build-fly-right {\n from { opacity: 0; transform: translateX(24%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-build-fly-up {\n from { opacity: 0; transform: translateY(24%); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes fs-build-fly-down {\n from { opacity: 0; transform: translateY(-24%); }\n to { opacity: 1; transform: translateY(0); }\n }\n /* wipe: clip-path inset reveals from the named edge toward the opposite one.\n inset(top right bottom left) — start fully clipped on the far side. */\n @keyframes fs-build-wipe-left {\n from { clip-path: inset(0 100% 0 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-right {\n from { clip-path: inset(0 0 0 100%); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-up {\n from { clip-path: inset(100% 0 0 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-down {\n from { clip-path: inset(0 0 100% 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n}\n`;\n","import type { EditorAction } from \"@particle-academy/react-fancy\";\n\n/**\n * Presentation-tuned toolbar preset for the react-fancy `Editor` used to edit\n * slide text inline. Only commands that round-trip cleanly through the editor's\n * `htmlToMarkdown` output are included — bold (`**`), italic (`*`), heading\n * (`## `), and bullet list (`- `). Box-level typography (alignment, color, font\n * size, line height) is NOT here: those are per-element `TextStyle` properties\n * edited in the ElementInspector, and `text-align`/color spans don't survive the\n * markdown the slide content commits to.\n */\nexport const PRESENTATION_EDITOR_ACTIONS: EditorAction[] = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"H\", label: \"Heading\", command: \"formatBlock\", commandArg: \"<h2>\" },\n { icon: \"P\", label: \"Paragraph\", command: \"formatBlock\", commandArg: \"<p>\" },\n { icon: \"•\", label: \"Bullet list\", command: \"insertUnorderedList\" },\n];\n\n/**\n * Normalize the `Editor`'s markdown output to the *line-based* paragraph model\n * the slide content commits to. The editor emits a blank line (`\\n\\n`) between\n * `<p>` blocks, but `splitParagraphs` (and the dark-slide pptx writer) treat a\n * single `\\n` as one paragraph / build unit, and a blank interior line as its\n * own (phantom) build. Collapsing runs of newlines to a single `\\n` keeps\n * \"by paragraph\" reveals and per-paragraph pptx builds correct — bullets are\n * already one-per-`\\n`, so they're unaffected. The round-trip invariant\n * (`content → Editor → normalize → content` preserves the `\\n` paragraph count)\n * is covered by a unit test.\n */\nexport function normalizeSlideMarkdown(md: string): string {\n return md\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{2,}/g, \"\\n\")\n .replace(/[ \\t]+$/gm, \"\")\n .trim();\n}\n","import { useId, type CSSProperties } from \"react\";\nimport { ContentRenderer, Editor } from \"@particle-academy/react-fancy\";\nimport type { TextElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\nimport { splitParagraphs, type ParaReveal } from \"../../../utils/builds\";\nimport { buildEnterStyle } from \"../../Slide/builds-style\";\nimport { PRESENTATION_EDITOR_ACTIONS, normalizeSlideMarkdown } from \"./editor-preset\";\n\nexport interface TextElementRendererProps {\n element: TextElement;\n theme?: Theme;\n /** Rendered slide width in px (for font-size scaling). */\n slideWidthPx: number;\n /**\n * Edit mode — when true, the element is potentially editable.\n * The textarea actually becomes pointer-interactive only when both\n * `editing` and `selected` are true, so the first click on an\n * unselected text element selects it (handled by the parent Slide)\n * rather than landing on the textarea.\n */\n editing?: boolean;\n /** Element is selected — gates whether the textarea grabs pointer events. */\n selected?: boolean;\n /** Called when the user edits the content (only fires when the textarea is focusable). */\n onContentChange?: (content: string) => void;\n /**\n * By-paragraph reveal state, set by `<Slide>` in viewer mode when this text\n * element has a `byParagraph` animation. When present, the renderer splits\n * `content` on `\"\\n\"` and shows only the first `revealed` paragraphs,\n * animating the one at `firingParaIndex`. Ignored in editing mode (the full\n * text always renders so authors can position/edit it).\n */\n paraReveal?: ParaReveal;\n}\n\n/**\n * Renderer for `text` elements. Three formats:\n *\n * - `\"markdown\"` (default) — parsed via react-fancy's ContentRenderer.\n * Bullets, bold/italic, code spans, links, headings.\n * - `\"html\"` — parsed sanitized HTML via ContentRenderer's html path.\n * - `\"plain\"` — raw text rendered into a single block; preserves newlines\n * via `white-space: pre-wrap`.\n *\n * In editing mode + when the element is selected, the renderer swaps to a\n * textarea showing the raw source. Edits flow back via `onContentChange`.\n */\nexport function TextElementRenderer({\n element,\n theme,\n slideWidthPx,\n editing = false,\n selected = false,\n onContentChange,\n paraReveal,\n}: TextElementRendererProps) {\n const t = resolveTheme(theme);\n const style = element.style ?? {};\n const designWidth = t.slideWidth ?? 1920;\n const scale = slideWidthPx / designWidth;\n const format = element.format ?? \"markdown\";\n const scopeId = useId();\n\n const css: CSSProperties = {\n fontFamily: style.fontFamily ?? t.fonts?.body,\n fontSize: `${(style.fontSize ?? 28) * scale}px`,\n fontWeight: weight(style.weight) ?? 400,\n fontStyle: style.italic ? \"italic\" : \"normal\",\n textDecoration: style.underline ? \"underline\" : \"none\",\n color: style.color ?? t.colors?.text,\n textAlign: style.align ?? \"left\",\n lineHeight: style.lineHeight ?? 1.4,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent:\n style.verticalAlign === \"middle\" ? \"center\" : style.verticalAlign === \"bottom\" ? \"flex-end\" : \"flex-start\",\n width: \"100%\",\n height: \"100%\",\n padding: 0,\n margin: 0,\n outline: \"none\",\n background: \"transparent\",\n whiteSpace: format === \"plain\" ? \"pre-wrap\" : \"normal\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n };\n\n // Edit mode is gated by selection: an unselected element in the editor\n // still shows the parsed markdown so the user sees the real layout.\n // Clicking selects → the react-fancy Editor appears, a WYSIWYG rich-text\n // surface tuned for presentations (bold / italic / heading / bullets).\n // Edits emit markdown, normalized to the line-based paragraph model the\n // slide content + dark-slide writer commit to. The Editor is keyed by the\n // element id because it loads its value once on mount (it's uncontrolled\n // after that), so selecting a different element remounts it with the right\n // content. Scoped CSS strips the Editor's card chrome and matches the\n // element's scaled typography so editing looks like the live slide.\n if (editing && selected) {\n const fontPx = Math.round((style.fontSize ?? 28) * scale);\n const lh = style.lineHeight ?? 1.4;\n const editScope = scopeId;\n return (\n <div\n data-fs-edit-scope={editScope}\n style={{\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n textAlign: style.align ?? \"left\",\n color: style.color ?? t.colors?.text,\n fontFamily: style.fontFamily ?? t.fonts?.body,\n }}\n // Keep editing interactions (toolbar clicks, text selection) from\n // bubbling to the Slide's element drag / deselect handlers.\n onPointerDown={(e) => e.stopPropagation()}\n >\n <style>{`\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor] {\n border: none; background: transparent; border-radius: 0;\n height: 100%; display: flex; flex-direction: column; overflow: hidden;\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-toolbar] {\n background: rgba(244,244,245,0.85); border-radius: 6px 6px 0 0;\n padding: 2px 4px;\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] {\n flex: 1; min-height: 0; padding: 4px 2px; overflow: auto;\n font-size: ${fontPx}px; line-height: ${lh};\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] :is(p, ul, ol, li) { font-size: inherit; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] :where(p, li) + :where(p, li, ul, ol) { margin-top: 0.4em; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h1 { font-size: 1.6em; font-weight: 700; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h2 { font-size: 1.35em; font-weight: 700; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h3 { font-size: 1.15em; font-weight: 600; margin: 0; }\n `}</style>\n <Editor\n key={element.id}\n value={element.content}\n onChange={(md) => onContentChange?.(normalizeSlideMarkdown(md))}\n outputFormat=\"markdown\"\n lineSpacing={lh}\n >\n <Editor.Toolbar actions={PRESENTATION_EDITOR_ACTIONS} />\n <Editor.Content />\n </Editor>\n </div>\n );\n }\n\n // Scope the ContentRenderer's prose styles so element-level typography\n // (fontSize, weight, align) wins over the global prose CSS. We render a\n // tiny inline style block that targets only this instance via the\n // generated useId scope.\n //\n // CRITICAL: ContentRenderer wraps its content in `text-sm` plus per-tag\n // Tailwind utilities (`[&_h1]:text-2xl`, etc). Those have higher\n // specificity than the inline `fontSize` we set on the wrapper, so\n // without forced overrides the slide text ignores `style.fontSize` AND\n // ignores the slide's resolution scaling — that's why thumbnails were\n // rendering text at ~14px instead of (fontSize × scale)px.\n //\n // We double the attribute-selector to outrank Tailwind's\n // `[&_h2]:text-xl`-style utilities, and re-express heading sizes in\n // `em` so they remain proportional as the slide scales.\n const proseScope = `[data-fs-text-scope=\"${scopeId}\"]`;\n const doubleScope = `${proseScope}${proseScope}`;\n const proseStyle = (\n <style>{`\n ${proseScope} > div { width: 100%; height: 100%; font-size: inherit; }\n ${doubleScope} :is(p, ul, ol, li, blockquote, h1, h2, h3, h4, h5, h6, pre, code, strong, em, a) {\n font-size: inherit;\n }\n ${doubleScope} h1 { font-size: 1.6em; font-weight: 700; }\n ${doubleScope} h2 { font-size: 1.35em; font-weight: 700; }\n ${doubleScope} h3 { font-size: 1.15em; font-weight: 600; }\n ${proseScope} :where(p, ul, ol, h1, h2, h3, h4, h5, h6, pre, blockquote) {\n margin: 0;\n padding: 0;\n }\n ${proseScope} :where(p, li) + :where(p, li, ul, ol) { margin-top: 0.4em; }\n ${proseScope} :where(ul, ol) { padding-left: 1.4em; }\n ${proseScope} :where(strong) { font-weight: ${Math.max(700, weight(style.weight) ?? 400 + 200)}; }\n ${proseScope} :where(a) { color: inherit; text-decoration: underline; }\n ${proseScope} :where(code) { font-family: ${t.fonts?.mono ?? \"monospace\"}; }\n `}</style>\n );\n\n // Render one chunk of content in the element's format. Reused for the whole\n // element and for each paragraph in a by-paragraph build.\n const renderChunk = (content: string) =>\n format === \"plain\" ? content : <ContentRenderer value={content} format={format === \"html\" ? \"html\" : \"markdown\"} />;\n\n // ─── By-paragraph build reveal ──────────────────────────────────────────\n // When `<Slide>` hands us a paraReveal, split the content and show only the\n // first `revealed` paragraphs, animating the one that just fired. We always\n // render the prose scope wrapper so markdown/html paragraphs keep their\n // typography. Each line of markdown renders through the same path, so a\n // bullet line (\"- …\") renders as its own list item.\n if (paraReveal) {\n const paras = splitParagraphs(element.content);\n return (\n <div data-fs-text-scope={scopeId} style={css}>\n {proseStyle}\n {paras.map((para, i) => {\n if (i >= paraReveal.revealed) return null; // not yet built\n const firing = i === paraReveal.firingParaIndex && !!element.animation;\n const enter = firing\n ? buildEnterStyle(element.animation!, element.animation!.delay ?? 0)\n : null;\n return (\n <div\n key={i}\n className={firing ? \"fs-build-enter\" : undefined}\n style={{ whiteSpace: format === \"plain\" ? \"pre-wrap\" : \"normal\", ...enter }}\n data-fancy-slides-paragraph={i}\n >\n {renderChunk(para)}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (format === \"plain\") {\n return <div style={css}>{element.content}</div>;\n }\n\n return (\n <div data-fs-text-scope={scopeId} style={css}>\n {proseStyle}\n <ContentRenderer value={element.content} format={format === \"html\" ? \"html\" : \"markdown\"} />\n </div>\n );\n}\n\nfunction weight(w: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | number | undefined): number | undefined {\n if (typeof w === \"number\") return w;\n if (w === \"normal\") return 400;\n if (w === \"medium\") return 500;\n if (w === \"semibold\") return 600;\n if (w === \"bold\") return 700;\n return undefined;\n}\n","import type { CSSProperties } from \"react\";\nimport type { ImageElement } from \"../../../types\";\n\nexport interface ImageElementRendererProps {\n element: ImageElement;\n}\n\n/**\n * Renders an image element. When `element.crop` is set (a window in\n * image-relative 0..1 coords `{x,y,w,h}`), the image is shown cropped to that\n * window: an `overflow:hidden` box clips an inner `<img>` that's been scaled up\n * by `1/w` × `1/h` and offset so the crop window exactly fills the box. Without\n * a crop it's the plain `object-fit` image. The same renderer feeds both the\n * editor canvas and the viewer, so a crop is visible everywhere.\n */\nexport function ImageElementRenderer({ element }: ImageElementRendererProps) {\n const crop = element.crop;\n const fit = element.fit ?? \"contain\";\n\n if (crop && crop.w > 0 && crop.h > 0) {\n // The inner image is scaled so the crop window (fraction w×h of the\n // image) fills 100% of the box; then translated so the window's\n // top-left aligns with the box's top-left.\n const inner: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: `${(1 / crop.w) * 100}%`,\n height: `${(1 / crop.h) * 100}%`,\n transform: `translate(${(-crop.x / crop.w) * 100}%, ${(-crop.y / crop.h) * 100}%)`,\n transformOrigin: \"top left\",\n objectFit: fit,\n display: \"block\",\n };\n return (\n <div style={{ position: \"relative\", width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>\n <img src={element.src} alt={element.alt ?? \"\"} style={inner} draggable={false} />\n </div>\n );\n }\n\n return (\n <img\n src={element.src}\n alt={element.alt ?? \"\"}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: fit,\n display: \"block\",\n }}\n draggable={false}\n />\n );\n}\n","import type { ShapeElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\n\nexport interface ShapeElementRendererProps {\n element: ShapeElement;\n theme?: Theme;\n slideWidthPx: number;\n}\n\n/**\n * SVG-rendered shape primitive. Sized to fill its element box; the box\n * decides world position via the parent Slide's positioning wrapper.\n */\nexport function ShapeElementRenderer({ element, theme, slideWidthPx }: ShapeElementRendererProps) {\n const t = resolveTheme(theme);\n const designWidth = t.slideWidth ?? 1920;\n const scale = slideWidthPx / designWidth;\n\n const fill = element.fill ?? \"rgba(139, 92, 246, 0.15)\";\n const stroke = element.stroke ?? t.colors?.accent ?? \"#8b5cf6\";\n const strokeWidth = (element.strokeWidth ?? 2) * scale;\n const dasharray = element.dashed ? `${6 * scale} ${4 * scale}` : undefined;\n\n // SVG uses a 0..100 viewBox so radius/strokeWidth are in box-relative units\n // and resolution-independent at render time.\n return (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\", overflow: \"visible\" }}\n >\n {renderShape(element, { fill, stroke, strokeWidth, dasharray })}\n </svg>\n );\n}\n\ninterface ShapeStyle {\n fill: string;\n stroke: string;\n strokeWidth: number;\n dasharray?: string;\n}\n\nfunction renderShape(el: ShapeElement, s: ShapeStyle) {\n // vectorEffect=\"non-scaling-stroke\" keeps the visible stroke at the\n // pixel width we asked for, regardless of how the parent SVG's\n // `preserveAspectRatio=\"none\"` stretches the viewBox. Without this,\n // narrow arrow / line boxes shrink the stroke into invisibility because\n // the y-axis is squashed.\n const common = {\n fill: s.fill,\n stroke: s.stroke,\n strokeWidth: s.strokeWidth,\n strokeDasharray: s.dasharray,\n vectorEffect: \"non-scaling-stroke\" as const,\n };\n switch (el.shape) {\n case \"rect\":\n return <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" {...common} />;\n case \"rounded-rect\": {\n const r = el.radius ?? 8;\n return <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" rx={r} ry={r} {...common} />;\n }\n case \"ellipse\":\n return <ellipse cx=\"50\" cy=\"50\" rx=\"50\" ry=\"50\" {...common} />;\n case \"triangle\":\n return <polygon points=\"50,0 100,100 0,100\" {...common} />;\n case \"line\":\n return <line x1=\"0\" y1=\"50\" x2=\"100\" y2=\"50\" {...common} fill=\"none\" />;\n case \"arrow\":\n // Render the arrow as a polyline shaft + an inline triangular\n // head built from the same SVG geometry. Avoids SVG markers,\n // which scale with stroke-width and turn into specks at tile\n // sizes.\n return (\n <g>\n <line x1=\"0\" y1=\"50\" x2=\"85\" y2=\"50\" {...common} fill=\"none\" />\n <polygon points=\"100,50 80,30 80,70\" fill={s.stroke} stroke=\"none\" />\n </g>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport type { ElementAnimation, Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\nimport { buildSteps, stepDelays, paragraphReveals, type ParaReveal } from \"../../utils/builds\";\nimport { TextElementRenderer } from \"../elements/TextElement\";\nimport { ImageElementRenderer } from \"../elements/ImageElement\";\nimport { ShapeElementRenderer } from \"../elements/ShapeElement\";\nimport { SlideContext, isDarkColor, type SlideContextValue } from \"./slide-context\";\nimport { BUILD_KEYFRAMES, buildEnterStyle } from \"./builds-style\";\n\nexport interface SlideProps {\n /** The slide to render. */\n slide: SlideData;\n /** Deck theme — controls fonts/colors/aspect-ratio when the slide doesn't override. */\n theme?: Theme;\n /** Pin the slide to this width in px. When omitted, the slide fills its container with auto-resize. */\n width?: number;\n /** Aspect ratio override — falls back to theme.aspectRatio. */\n aspectRatio?: number;\n /** Edit mode flag — passed to element renderers + enables drag/resize affordances. */\n editing?: boolean;\n /**\n * Current build step (0..totalSteps). `0` = nothing built (only non-animated\n * elements visible); each step reveals more animated elements. Omit (or pass\n * a number ≥ total) to show the fully-built slide. Ignored when `editing` —\n * the editor always shows every element so authors can position them.\n */\n buildStep?: number;\n /** Called when a text element's content is edited (only in editing mode). */\n onElementContentChange?: (elementId: string, content: string) => void;\n /** Called when an element is clicked — host-driven selection. */\n onElementSelect?: (elementId: string | null) => void;\n /** Selected element id — adds a focus ring and shows resize handles when editing. */\n selectedElementId?: string | null;\n /** Called when the user drags an element body to a new position (slide-relative 0..1). */\n onElementMove?: (elementId: string, x: number, y: number) => void;\n /** Called when the user resizes via a corner / edge handle (slide-relative 0..1). */\n onElementResize?: (elementId: string, patch: { x: number; y: number; w: number; h: number }) => void;\n /** Optional override renderer for a custom element type (or to replace one of the built-ins). */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Slide — the shared renderer. Used by SlideViewer, DeckEditor canvas,\n * SlideThumbnail, and the agent bridge's preview tools. All resolution-\n * independence lives here: child elements get a `slideWidthPx` so they can\n * scale font sizes / stroke widths to the rendered slide size.\n *\n * In `editing` mode this component grows two extra affordances:\n * - pointer-drag on an element body moves it\n * - selected elements show 8 resize handles (4 corners, 4 edges)\n *\n * Both fire through `onElementMove` / `onElementResize` so the host owns\n * the state — Slide stays a pure renderer.\n */\nexport function Slide({\n slide,\n theme,\n width,\n aspectRatio,\n editing = false,\n buildStep,\n onElementContentChange,\n onElementSelect,\n selectedElementId,\n onElementMove,\n onElementResize,\n renderElement,\n className,\n style,\n}: SlideProps) {\n const t = resolveTheme(theme);\n const ratio = aspectRatio ?? t.aspectRatio ?? 16 / 9;\n const ref = useRef<HTMLDivElement>(null);\n const [measured, setMeasured] = useState<number>(width ?? 0);\n\n // Auto-measure when width isn't pinned.\n useEffect(() => {\n if (width !== undefined) {\n setMeasured(width);\n return;\n }\n const el = ref.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n for (const e of entries) {\n setMeasured(e.contentRect.width);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [width]);\n\n const slideWidthPx = measured || 1;\n const slideHeightPx = slideWidthPx / ratio;\n\n const bg = slide.background;\n // The effective background colour used both for the slide div's `background`\n // and for the dark-theme heuristic exposed via SlideContext.\n const effectiveBg =\n bg?.color ?? t.colors?.background ?? \"#ffffff\";\n const backgroundStyle: CSSProperties = {\n background: bg?.gradient\n ? bg.gradient\n : bg?.image\n ? `${bg.color ?? \"transparent\"} url(${bg.image}) center/${bg.imageFit ?? \"cover\"} no-repeat`\n : effectiveBg,\n };\n\n const slideContext = useMemo<SlideContextValue>(\n () => ({\n theme: t,\n isDark: isDarkColor(effectiveBg),\n slideWidthPx,\n }),\n [t, effectiveBg, slideWidthPx],\n );\n\n // ─── Build (entrance-animation) bookkeeping ─────────────────────────────\n // In editing mode builds never hide anything — authors must see/position\n // every element. Otherwise we resolve each animated element's reveal step\n // and the per-element entrance delay for the step currently firing.\n const buildInfo = useMemo(() => {\n if (editing) return null;\n const steps = buildSteps(slide);\n if (steps.length === 0) return null;\n const revealStep = new Map<string, number>(); // element id → FIRST 1-based step it reveals on\n steps.forEach((step, i) => {\n for (const b of step.builds) {\n // By-paragraph elements appear across multiple steps; the\n // element box becomes visible on its earliest paragraph's step.\n if (!revealStep.has(b.element.id)) revealStep.set(b.element.id, i + 1);\n }\n });\n // When `buildStep` is omitted (thumbnails, exports) the slide renders\n // fully built with NO entrance animation. When provided, the firing\n // step's elements animate in.\n const driven = buildStep !== undefined;\n const currentStep = driven ? buildStep : steps.length;\n const firing = driven ? steps[currentStep - 1] : undefined;\n const delays = firing ? stepDelays(firing.builds) : new Map<string, number>();\n // Per-element paragraph reveal state (by-paragraph text builds). When\n // undriven, every paragraph is revealed (fully-built, no animation).\n const paraReveals = driven\n ? paragraphReveals(slide, currentStep)\n : new Map<string, ParaReveal>();\n return { revealStep, currentStep, delays, paraReveals, driven };\n }, [editing, slide, buildStep]);\n\n return (\n <SlideContext.Provider value={slideContext}>\n <div\n ref={ref}\n className={cn(\"fs-slide\", className)}\n style={{\n width: width ? `${width}px` : \"100%\",\n height: width ? `${width / ratio}px` : `${slideHeightPx}px`,\n position: \"relative\",\n overflow: \"hidden\",\n color: t.colors?.text,\n ...backgroundStyle,\n ...style,\n }}\n data-fancy-slides-slide={slide.id}\n onClick={(e) => {\n if (e.target === e.currentTarget && onElementSelect) onElementSelect(null);\n }}\n >\n {buildInfo && <style>{BUILD_KEYFRAMES}</style>}\n {orderedElements(slide.elements).map((element) => {\n // Resolve build visibility / entrance animation for this element.\n let buildHidden = false;\n let buildAnimation: ElementAnimation | undefined;\n let buildDelay = 0;\n // By-paragraph reveal state for this element (text builds only).\n const paraReveal = buildInfo?.paraReveals.get(element.id);\n if (buildInfo) {\n const step = buildInfo.revealStep.get(element.id);\n if (step !== undefined) {\n if (buildInfo.currentStep < step) {\n buildHidden = true; // not yet built\n } else if (paraReveal) {\n // By-paragraph element: the box stays mounted from its\n // first paragraph onward; individual paragraphs hide /\n // animate inside the text renderer. No whole-box effect.\n } else if (buildInfo.currentStep === step && element.animation) {\n // Revealing on the step that just fired → play the effect.\n buildAnimation = element.animation;\n buildDelay = buildInfo.delays.get(element.id) ?? 0;\n }\n }\n }\n if (buildHidden) return null;\n return (\n <SlideElementHost\n key={element.id}\n element={element}\n theme={t}\n slideWidthPx={slideWidthPx}\n slideHeightPx={slideHeightPx}\n editing={editing}\n selected={selectedElementId === element.id}\n onContentChange={onElementContentChange}\n onSelect={onElementSelect}\n onMove={onElementMove}\n onResize={onElementResize}\n renderElement={renderElement}\n buildAnimation={buildAnimation}\n buildDelay={buildDelay}\n paraReveal={paraReveal}\n />\n );\n })}\n </div>\n </SlideContext.Provider>\n );\n}\n\ninterface SlideElementHostProps {\n element: SlideElement;\n theme: Theme;\n slideWidthPx: number;\n slideHeightPx: number;\n editing: boolean;\n selected: boolean;\n onContentChange?: (elementId: string, content: string) => void;\n onSelect?: (elementId: string | null) => void;\n onMove?: (elementId: string, x: number, y: number) => void;\n onResize?: (elementId: string, patch: { x: number; y: number; w: number; h: number }) => void;\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Entrance build animation to play (only set on the step the element reveals on). */\n buildAnimation?: ElementAnimation;\n /** Effective entrance delay (ms) resolved for with-prev / after-prev chaining. */\n buildDelay?: number;\n /** Per-paragraph reveal state for a by-paragraph text build (text elements only). */\n paraReveal?: ParaReveal;\n}\n\n/** Smallest allowed element size, as a fraction of the slide. */\nconst MIN_DIM = 0.02;\n\n/** Drag distance below which we treat the gesture as a click. */\nconst CLICK_DRAG_THRESHOLD_PX = 3;\n\ntype ResizeAnchor = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\ninterface DragState {\n mode: \"move\" | ResizeAnchor;\n startClientX: number;\n startClientY: number;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n didMove: boolean;\n}\n\nfunction SlideElementHost({\n element,\n theme,\n slideWidthPx,\n slideHeightPx,\n editing,\n selected,\n onContentChange,\n onSelect,\n onMove,\n onResize,\n renderElement,\n buildAnimation,\n buildDelay = 0,\n paraReveal,\n}: SlideElementHostProps) {\n const dragRef = useRef<DragState | null>(null);\n\n if (element.hidden) return null;\n\n const left = element.x * slideWidthPx;\n const top = element.y * slideHeightPx;\n const width = element.w * slideWidthPx;\n const height = element.h * slideHeightPx;\n\n const interactive = editing && !element.locked;\n const canMove = interactive && !!onMove;\n const canResize = interactive && !!onResize && selected;\n\n const startDrag = (mode: DragState[\"mode\"]) => (e: ReactPointerEvent<HTMLElement>) => {\n e.stopPropagation();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n dragRef.current = {\n mode,\n startClientX: e.clientX,\n startClientY: e.clientY,\n startX: element.x,\n startY: element.y,\n startW: element.w,\n startH: element.h,\n didMove: false,\n };\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n const dxPx = e.clientX - drag.startClientX;\n const dyPx = e.clientY - drag.startClientY;\n if (Math.hypot(dxPx, dyPx) >= CLICK_DRAG_THRESHOLD_PX) drag.didMove = true;\n const dx = dxPx / slideWidthPx;\n const dy = dyPx / slideHeightPx;\n if (drag.mode === \"move\") {\n if (!onMove) return;\n const maxX = 1 - element.w;\n const maxY = 1 - element.h;\n const nextX = clamp(drag.startX + dx, 0, Math.max(0, maxX));\n const nextY = clamp(drag.startY + dy, 0, Math.max(0, maxY));\n onMove(element.id, nextX, nextY);\n return;\n }\n if (!onResize) return;\n const patch = computeResize(drag, dx, dy);\n onResize(element.id, patch);\n };\n\n const endDrag = (e: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n try {\n (e.target as HTMLElement).releasePointerCapture(e.pointerId);\n } catch {\n /* element may have unmounted; ignore */\n }\n const wasMove = drag.didMove;\n dragRef.current = null;\n if (!wasMove && onSelect) onSelect(element.id);\n };\n\n const box: CSSProperties = {\n position: \"absolute\",\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n transform: element.rotation ? `rotate(${element.rotation}deg)` : undefined,\n transformOrigin: \"center center\",\n zIndex: element.z ?? \"auto\",\n outline: selected ? \"2px solid #8b5cf6\" : undefined,\n outlineOffset: selected ? 2 : undefined,\n cursor: canMove ? \"move\" : interactive ? \"pointer\" : \"default\",\n touchAction: canMove ? \"none\" : undefined,\n ...(buildAnimation ? buildEnterStyle(buildAnimation, buildDelay) : null),\n };\n\n const rendered =\n renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange, paraReveal })\n ?? renderElement?.(element, slideWidthPx)\n ?? elementPlaceholder(element);\n\n // Whole-element hyperlink — a click target in the viewer (never while\n // editing, so the link doesn't swallow selection). Fills the element box.\n const inner =\n element.href && !editing ? (\n <a\n href={element.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ display: \"block\", width: \"100%\", height: \"100%\", color: \"inherit\", textDecoration: \"inherit\" }}\n data-fancy-slides-href=\"\"\n >\n {rendered}\n </a>\n ) : (\n rendered\n );\n\n return (\n <div\n className={buildAnimation ? \"fs-build-enter\" : undefined}\n style={box}\n data-fancy-slides-element={element.id}\n data-fancy-slides-element-type={element.type}\n data-fancy-slides-build={buildAnimation ? \"\" : undefined}\n onPointerDown={canMove ? startDrag(\"move\") : undefined}\n onPointerMove={canMove ? onPointerMove : undefined}\n onPointerUp={canMove ? endDrag : undefined}\n onPointerCancel={canMove ? endDrag : undefined}\n onClick={(e) => {\n // Click fallback for non-pointer environments / non-movable elements.\n if (!onSelect || canMove) return;\n e.stopPropagation();\n onSelect(element.id);\n }}\n >\n {inner}\n {canResize && (\n <ResizeHandles\n onStart={(anchor) => startDrag(anchor)}\n onMove={onPointerMove}\n onEnd={endDrag}\n />\n )}\n </div>\n );\n}\n\ninterface ResizeHandlesProps {\n onStart: (anchor: ResizeAnchor) => (e: ReactPointerEvent<HTMLElement>) => void;\n onMove: (e: ReactPointerEvent<HTMLElement>) => void;\n onEnd: (e: ReactPointerEvent<HTMLElement>) => void;\n}\n\nfunction ResizeHandles({ onStart, onMove, onEnd }: ResizeHandlesProps) {\n const anchors: Array<{ anchor: ResizeAnchor; style: CSSProperties; cursor: string }> = [\n { anchor: \"nw\", style: { left: -5, top: -5 }, cursor: \"nwse-resize\" },\n { anchor: \"n\", style: { left: \"calc(50% - 5px)\", top: -5 }, cursor: \"ns-resize\" },\n { anchor: \"ne\", style: { right: -5, top: -5 }, cursor: \"nesw-resize\" },\n { anchor: \"e\", style: { right: -5, top: \"calc(50% - 5px)\" }, cursor: \"ew-resize\" },\n { anchor: \"se\", style: { right: -5, bottom: -5 }, cursor: \"nwse-resize\" },\n { anchor: \"s\", style: { left: \"calc(50% - 5px)\", bottom: -5 }, cursor: \"ns-resize\" },\n { anchor: \"sw\", style: { left: -5, bottom: -5 }, cursor: \"nesw-resize\" },\n { anchor: \"w\", style: { left: -5, top: \"calc(50% - 5px)\" }, cursor: \"ew-resize\" },\n ];\n return (\n <>\n {anchors.map(({ anchor, style, cursor }) => (\n <div\n key={anchor}\n style={{\n position: \"absolute\",\n width: 10,\n height: 10,\n background: \"#ffffff\",\n border: \"1.5px solid #8b5cf6\",\n borderRadius: 2,\n cursor,\n touchAction: \"none\",\n boxShadow: \"0 1px 2px rgba(0,0,0,0.15)\",\n ...style,\n }}\n data-fancy-slides-resize-handle={anchor}\n onPointerDown={onStart(anchor)}\n onPointerMove={onMove}\n onPointerUp={onEnd}\n onPointerCancel={onEnd}\n />\n ))}\n </>\n );\n}\n\ninterface RenderInnerArgs {\n element: SlideElement;\n theme: Theme;\n slideWidthPx: number;\n editing: boolean;\n selected: boolean;\n onContentChange?: (elementId: string, content: string) => void;\n paraReveal?: ParaReveal;\n}\n\nfunction renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange, paraReveal }: RenderInnerArgs): ReactNode | undefined {\n switch (element.type) {\n case \"text\":\n return (\n <TextElementRenderer\n element={element}\n theme={theme}\n slideWidthPx={slideWidthPx}\n editing={editing}\n selected={selected}\n onContentChange={onContentChange ? (c) => onContentChange(element.id, c) : undefined}\n paraReveal={paraReveal}\n />\n );\n case \"image\":\n return <ImageElementRenderer element={element} />;\n case \"shape\":\n return <ShapeElementRenderer element={element} theme={theme} slideWidthPx={slideWidthPx} />;\n case \"chart\":\n case \"code\":\n case \"table\":\n case \"embed\":\n // These render via consumer-provided `renderElement` so we don't\n // pull fancy-echarts / fancy-code / etc. into the package's static\n // graph. Hosts opt into the default registry from\n // `@particle-academy/fancy-slides/registry`.\n return undefined;\n default:\n return null;\n }\n}\n\n/**\n * Built-in fallback for the optional element types (chart / code / table /\n * embed) when the host hasn't wired a `renderElement` (or it returned\n * undefined). Without this the element would render blank, making the\n * toolbar's Insert buttons look broken. The placeholder keeps every insert\n * visible and nudges the dev toward the default registry. Hosts that want the\n * real chart/code/table render pass `renderElement` from\n * `@particle-academy/fancy-slides/registry`.\n */\nfunction elementPlaceholder(element: SlideElement): ReactNode {\n if (element.type !== \"chart\" && element.type !== \"code\" && element.type !== \"table\" && element.type !== \"embed\") {\n return null;\n }\n const label = element.type.charAt(0).toUpperCase() + element.type.slice(1);\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.35em\",\n textAlign: \"center\",\n padding: \"0.5em\",\n boxSizing: \"border-box\",\n border: \"1px dashed currentColor\",\n borderRadius: 8,\n opacity: 0.55,\n overflow: \"hidden\",\n }}\n >\n <span style={{ fontWeight: 600 }}>{label}</span>\n <span style={{ fontSize: \"0.7em\", opacity: 0.8 }}>Pass renderElement to render</span>\n </div>\n );\n}\n\nfunction orderedElements(elements: SlideElement[]): SlideElement[] {\n // Elements without a `z` keep their array order; explicit z overrides win.\n return [...elements].sort((a, b) => {\n const az = a.z ?? -1;\n const bz = b.z ?? -1;\n if (az === bz) return 0;\n return az < bz ? -1 : 1;\n });\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\n/**\n * Given a drag delta + which anchor is being dragged, compute the patch\n * `{ x, y, w, h }` to apply. Clamps so dimensions stay >= MIN_DIM and the\n * element stays within the slide. Opposite edges stay fixed (e.g. dragging\n * the W handle moves the left edge but not the right).\n */\nfunction computeResize(drag: DragState, dx: number, dy: number): { x: number; y: number; w: number; h: number } {\n let { startX: x, startY: y, startW: w, startH: h } = drag;\n const right = drag.startX + drag.startW;\n const bottom = drag.startY + drag.startH;\n const anchor = drag.mode as ResizeAnchor;\n\n if (anchor.includes(\"w\")) {\n const newX = clamp(drag.startX + dx, 0, right - MIN_DIM);\n x = newX;\n w = right - newX;\n } else if (anchor.includes(\"e\")) {\n w = clamp(drag.startW + dx, MIN_DIM, 1 - drag.startX);\n }\n if (anchor.includes(\"n\")) {\n const newY = clamp(drag.startY + dy, 0, bottom - MIN_DIM);\n y = newY;\n h = bottom - newY;\n } else if (anchor.includes(\"s\")) {\n h = clamp(drag.startH + dy, MIN_DIM, 1 - drag.startY);\n }\n return { x, y, w, h };\n}\n","import { useEffect } from \"react\";\n\nexport interface SlideKeyboardOptions {\n /** Number of slides — clamps next/prev to bounds. */\n total: number;\n /** Current slide index. */\n index: number;\n /** Move to a specific slide. Used by Home/End/1-9 (and by arrows when no `onAdvance`/`onRetreat`). */\n goTo: (index: number) => void;\n /**\n * Forward step (→ / Space / PageDown). When provided it OWNS forward nav —\n * e.g. step through builds, then advance the slide. Falls back to\n * `goTo(index + 1)` when omitted.\n */\n onAdvance?: () => void;\n /**\n * Backward step (← / PageUp). When provided it OWNS backward nav. Falls back\n * to `goTo(index - 1)` when omitted.\n */\n onRetreat?: () => void;\n /** Called on Esc — typically exits fullscreen. */\n onExit?: () => void;\n /** Called on `B` — typically blacks/whites out the screen. */\n onBlank?: () => void;\n /** Called on `F` — typically toggles fullscreen. */\n onFullscreen?: () => void;\n /** Disable when the editor is focused / a modal is open. */\n enabled?: boolean;\n}\n\n/**\n * Standard slideshow keyboard plumbing:\n *\n * ← / PageUp — retreat (onRetreat, else previous slide)\n * → / PageDown / Space — advance (onAdvance, else next slide)\n * Home — first slide\n * End — last slide\n * Esc — onExit\n * B / . — onBlank (blackout)\n * F — onFullscreen\n * 1..9 — jump to slide N\n */\nexport function useSlideKeyboard({\n total,\n index,\n goTo,\n onAdvance,\n onRetreat,\n onExit,\n onBlank,\n onFullscreen,\n enabled = true,\n}: SlideKeyboardOptions): void {\n useEffect(() => {\n if (!enabled) return;\n\n const handler = (e: KeyboardEvent) => {\n // Skip when typing in inputs / textareas / contenteditable.\n const target = e.target as HTMLElement | null;\n if (target && (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.isContentEditable)) {\n return;\n }\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"PageUp\":\n e.preventDefault();\n if (onRetreat) onRetreat();\n else if (index > 0) goTo(index - 1);\n return;\n case \"ArrowRight\":\n case \"PageDown\":\n case \" \":\n e.preventDefault();\n if (onAdvance) onAdvance();\n else if (index < total - 1) goTo(index + 1);\n return;\n case \"Home\":\n e.preventDefault();\n goTo(0);\n return;\n case \"End\":\n e.preventDefault();\n goTo(total - 1);\n return;\n case \"Escape\":\n if (onExit) {\n e.preventDefault();\n onExit();\n }\n return;\n case \"b\":\n case \"B\":\n case \".\":\n if (onBlank) {\n e.preventDefault();\n onBlank();\n }\n return;\n case \"f\":\n case \"F\":\n if (onFullscreen) {\n e.preventDefault();\n onFullscreen();\n }\n return;\n default: {\n const n = parseInt(e.key, 10);\n if (Number.isFinite(n) && n >= 1 && n <= 9) {\n e.preventDefault();\n goTo(Math.min(total - 1, n - 1));\n }\n }\n }\n };\n\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [enabled, index, total, goTo, onAdvance, onRetreat, onExit, onBlank, onFullscreen]);\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { Deck, SlideElement, SlideTransition } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { Slide } from \"../Slide\";\nimport { useSlideKeyboard } from \"../../hooks/use-slide-keyboard\";\nimport { totalBuildSteps } from \"../../utils/builds\";\nimport { cn } from \"../../utils/cn\";\nimport { defaultElementRegistry } from \"../../registry\";\n\nexport interface SlideViewerProps {\n /** Deck to play. */\n deck: Deck;\n /** Controlled current slide index. Use with `onIndexChange`. */\n index?: number;\n /** Default current slide index (uncontrolled). */\n defaultIndex?: number;\n /** Called when the viewer advances. */\n onIndexChange?: (index: number) => void;\n /** Called when the viewer exits (Esc). */\n onExit?: () => void;\n /** Auto-advance interval in ms — kiosk mode. Omit to disable. */\n autoAdvanceMs?: number;\n /** Hide the bottom progress bar + slide counter. */\n hideChrome?: boolean;\n /**\n * Custom renderer for element types Slide doesn't render natively\n * (chart/code/table/embed). Defaults to the built-in\n * `defaultElementRegistry` so decks play fully out of the box; pass your\n * own to override.\n */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Extra classes on the viewer wrapper. */\n className?: string;\n}\n\n/**\n * Read-only deck viewer. Renders one slide at a time at the maximum size\n * that fits the container while preserving the theme's aspect ratio.\n * Keyboard nav is built in; expand a fullscreen-ready container around\n * `<SlideViewer>` to get the F11-style experience.\n */\nexport function SlideViewer({\n deck,\n index: controlledIndex,\n defaultIndex,\n onIndexChange,\n onExit,\n autoAdvanceMs,\n hideChrome = false,\n renderElement = defaultElementRegistry,\n className,\n}: SlideViewerProps) {\n const isControlled = controlledIndex !== undefined;\n const [internalIndex, setInternalIndex] = useState(defaultIndex ?? 0);\n const index = isControlled ? controlledIndex! : internalIndex;\n\n const goTo = useCallback(\n (i: number) => {\n const clamped = Math.max(0, Math.min(deck.slides.length - 1, i));\n if (!isControlled) setInternalIndex(clamped);\n onIndexChange?.(clamped);\n },\n [deck.slides.length, isControlled, onIndexChange],\n );\n\n const [blanked, setBlanked] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Track nav direction so `slide` transitions default sensibly: advancing\n // forward enters from the right, going back enters from the left.\n const prevIndexRef = useRef(index);\n const forward = index >= prevIndexRef.current;\n\n // ─── Intra-slide build (entrance-animation) step-through ────────────────\n // 0 = nothing built yet on the current slide. Each forward advance fires\n // the next step until `totalBuildSteps`, after which we move to the next\n // slide. Going backward lands on the previous slide fully built.\n const slide = deck.slides[index];\n const totalSteps = totalBuildSteps(slide);\n const [buildStep, setBuildStep] = useState(0);\n\n // Reset the build step on slide change. Only a forward advance INTO the next\n // slide replays builds from 0; every other landing (retreat, Home/End,\n // digit jump, external control) shows the slide fully built. `nextFreshRef`\n // flags the one forward-advance case.\n const nextFreshRef = useRef(false);\n useEffect(() => {\n if (index === prevIndexRef.current) return;\n prevIndexRef.current = index;\n const fresh = nextFreshRef.current;\n nextFreshRef.current = false;\n setBuildStep(fresh ? 0 : totalBuildSteps(deck.slides[index]));\n }, [index, deck.slides]);\n\n const advance = useCallback(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else if (index < deck.slides.length - 1) {\n nextFreshRef.current = true; // next slide starts with nothing built\n goTo(index + 1);\n }\n }, [buildStep, totalSteps, index, deck.slides.length, goTo]);\n\n const retreat = useCallback(() => {\n // v1: reversing individual builds is out of scope — step back a whole\n // slide, showing it fully built (handled by the reset effect).\n if (index > 0) goTo(index - 1);\n }, [index, goTo]);\n\n useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onAdvance: advance,\n onRetreat: retreat,\n onExit,\n onBlank: () => setBlanked((b) => !b),\n onFullscreen: () => {\n const el = containerRef.current;\n if (!el) return;\n if (document.fullscreenElement) document.exitFullscreen();\n else el.requestFullscreen?.();\n },\n });\n\n // Auto-advance loop for kiosk mode — steps through builds then slides.\n useEffect(() => {\n if (!autoAdvanceMs || deck.slides.length <= 1) return;\n const t = setTimeout(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else {\n nextFreshRef.current = true;\n goTo(index + 1 < deck.slides.length ? index + 1 : 0);\n }\n }, autoAdvanceMs);\n return () => clearTimeout(t);\n }, [autoAdvanceMs, index, deck.slides.length, goTo, buildStep, totalSteps]);\n const theme = resolveTheme(deck.theme);\n const aspectRatio = theme.aspectRatio ?? 16 / 9;\n\n // Resolve the incoming slide's entrance transition (slide → theme default → none).\n const transition: SlideTransition | undefined = slide?.transition ?? theme.defaultTransition;\n const enterStyle = transitionEnterStyle(transition, forward);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"fs-viewer\", className)}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n background: blanked ? \"#000000\" : theme.colors?.background ?? \"#000000\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n }}\n tabIndex={0}\n data-fancy-slides-viewer={deck.id}\n data-fancy-slides-build-step={buildStep}\n onClick={() => {\n if (blanked) return;\n advance();\n }}\n >\n {/* Keyframes for slide entrance transitions. Pure CSS — no runtime deps.\n Gated behind prefers-reduced-motion so animations vanish entirely\n for users who ask for less motion. */}\n <style>{TRANSITION_KEYFRAMES}</style>\n\n {!blanked && slide && (\n <div\n style={{\n // Box that fits the slide while preserving aspect ratio.\n width: \"min(100%, calc(100vh * var(--fs-ratio)))\",\n aspectRatio: String(aspectRatio),\n // CSS var lets us inline-style the aspect ratio so it works in any container.\n [\"--fs-ratio\" as keyof React.CSSProperties as string]: aspectRatio.toString(),\n boxShadow: \"0 8px 30px rgba(0,0,0,0.35)\",\n } as React.CSSProperties}\n >\n {/* Keyed by index so React remounts on every slide change and the\n enter animation replays from its first frame. */}\n <div key={index} className=\"fs-slide-enter\" style={enterStyle}>\n <Slide slide={slide} theme={theme} buildStep={buildStep} renderElement={renderElement} />\n </div>\n </div>\n )}\n\n {!hideChrome && !blanked && (\n <div\n style={{\n position: \"absolute\",\n bottom: 16,\n right: 16,\n padding: \"4px 10px\",\n borderRadius: 999,\n background: \"rgba(15, 23, 42, 0.6)\",\n color: \"#f8fafc\",\n fontSize: 12,\n fontFamily: theme.fonts?.mono,\n backdropFilter: \"blur(6px)\",\n }}\n aria-label=\"Slide counter\"\n >\n {index + 1} / {deck.slides.length}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Transitions ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_DURATION = 400;\nconst EASE = \"cubic-bezier(0.16, 1, 0.3, 1)\"; // ease-out\n\n/**\n * Build the inline style that drives a slide's entrance animation. The actual\n * keyframes live in {@link TRANSITION_KEYFRAMES}; here we just pick the right\n * `animation-name` + duration. `prefers-reduced-motion: reduce` is handled in\n * CSS (the keyframe-bearing rules are wrapped in a media query), so a reduced-\n * motion user simply sees the final frame with no movement.\n */\nfunction transitionEnterStyle(transition: SlideTransition | undefined, forward: boolean): React.CSSProperties {\n const kind = transition?.kind ?? \"none\";\n if (kind === \"none\") return { width: \"100%\", height: \"100%\" };\n\n const duration = transition?.duration ?? DEFAULT_DURATION;\n let name: string;\n switch (kind) {\n case \"fade\":\n name = \"fs-fade-in\";\n break;\n case \"zoom\":\n name = \"fs-zoom-in\";\n break;\n case \"slide\": {\n const dir = transition?.direction ?? (forward ? \"right\" : \"left\");\n name = `fs-slide-in-${dir}`;\n break;\n }\n default:\n return { width: \"100%\", height: \"100%\" };\n }\n\n return {\n width: \"100%\",\n height: \"100%\",\n animationName: name,\n animationDuration: `${duration}ms`,\n animationTimingFunction: EASE,\n animationFillMode: \"both\",\n };\n}\n\n/**\n * Keyframes for every transition kind. Wrapped in\n * `@media (prefers-reduced-motion: no-preference)` so that reduced-motion users\n * get no animation at all — `animation-fill-mode: both` would otherwise pin the\n * element at its `from` frame, so we disable the animation entirely instead.\n */\nconst TRANSITION_KEYFRAMES = `\n@media (prefers-reduced-motion: reduce) {\n .fs-slide-enter { animation: none !important; }\n}\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fs-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes fs-zoom-in {\n from { opacity: 0; transform: scale(0.92); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes fs-slide-in-right {\n from { opacity: 0; transform: translateX(8%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-slide-in-left {\n from { opacity: 0; transform: translateX(-8%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-slide-in-up {\n from { opacity: 0; transform: translateY(8%); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes fs-slide-in-down {\n from { opacity: 0; transform: translateY(-8%); }\n to { opacity: 1; transform: translateY(0); }\n }\n}\n`;\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { Deck, SlideElement } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { Slide } from \"../Slide\";\nimport { useSlideKeyboard } from \"../../hooks/use-slide-keyboard\";\nimport { totalBuildSteps } from \"../../utils/builds\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PresenterViewProps {\n /** Deck being presented. */\n deck: Deck;\n /** Controlled current slide index. */\n index?: number;\n /** Default current slide index (uncontrolled). */\n defaultIndex?: number;\n /** Called when the presenter advances. */\n onIndexChange?: (index: number) => void;\n /** Called when the presenter exits (Esc). */\n onExit?: () => void;\n /** Reset the elapsed timer to this `Date.now()` value. Defaults to mount time. */\n startedAt?: number;\n /** Optional custom renderer for non-built-in element types. */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n}\n\n/**\n * Speaker-only side view designed to live on a second monitor while the\n * audience sees a `<SlideViewer>`. Layout:\n *\n * ┌────────────────────────────┬────────────────────┐\n * │ │ next slide │\n * │ ├────────────────────┤\n * │ current slide │ │\n * │ (largest viewport) │ speaker notes │\n * │ │ │\n * ├────────────────────────────┴────────────────────┤\n * │ 3 / 12 elapsed 04:21 clock 14:35 prev / │\n * │ next │\n * └─────────────────────────────────────────────────┘\n *\n * Keyboard: same set as SlideViewer — ←/→/Space/Esc/Home/End/B/F/1-9.\n * Notes pane shows the current slide's `notes` field (rendered as\n * preformatted text for now; markdown rendering arrives with the\n * ContentRenderer integration in 0.2).\n */\nexport function PresenterView({\n deck,\n index: controlledIndex,\n defaultIndex,\n onIndexChange,\n onExit,\n startedAt,\n renderElement,\n className,\n}: PresenterViewProps) {\n const isControlled = controlledIndex !== undefined;\n const [internalIndex, setInternalIndex] = useState(defaultIndex ?? 0);\n const index = isControlled ? controlledIndex! : internalIndex;\n\n const goTo = useCallback(\n (i: number) => {\n const clamped = Math.max(0, Math.min(deck.slides.length - 1, i));\n if (!isControlled) setInternalIndex(clamped);\n onIndexChange?.(clamped);\n },\n [deck.slides.length, isControlled, onIndexChange],\n );\n\n // Mirror SlideViewer's build step-through so the speaker drives builds too.\n const slide = deck.slides[index];\n const totalSteps = totalBuildSteps(slide);\n const [buildStep, setBuildStep] = useState(0);\n const prevIndexRef = useRef(index);\n const nextFreshRef = useRef(false);\n useEffect(() => {\n if (index === prevIndexRef.current) return;\n prevIndexRef.current = index;\n const fresh = nextFreshRef.current;\n nextFreshRef.current = false;\n setBuildStep(fresh ? 0 : totalBuildSteps(deck.slides[index]));\n }, [index, deck.slides]);\n\n const advance = useCallback(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else if (index < deck.slides.length - 1) {\n nextFreshRef.current = true;\n goTo(index + 1);\n }\n }, [buildStep, totalSteps, index, deck.slides.length, goTo]);\n\n const retreat = useCallback(() => {\n if (index > 0) goTo(index - 1);\n }, [index, goTo]);\n\n useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onAdvance: advance,\n onRetreat: retreat,\n onExit,\n });\n\n const theme = resolveTheme(deck.theme);\n const nextSlide = deck.slides[index + 1];\n\n // Tick once a second for the clock + elapsed timer.\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, []);\n const startedAtRef = useMemo(() => startedAt ?? now, [startedAt]); // initial mount captures now\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: capture mount time once\n\n return (\n <div\n className={cn(\"fs-presenter\", className)}\n style={{\n display: \"grid\",\n gridTemplateRows: \"1fr auto\",\n gridTemplateColumns: \"minmax(0, 2fr) minmax(0, 1fr)\",\n width: \"100%\",\n height: \"100%\",\n background: \"#0b1220\",\n color: \"#f8fafc\",\n fontFamily: theme.fonts?.body,\n }}\n data-fancy-slides-presenter={deck.id}\n >\n {/* Current slide — left, full height of the upper row */}\n <div\n style={{\n gridRow: 1,\n gridColumn: 1,\n padding: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: 0,\n }}\n >\n <div\n style={{\n width: \"100%\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n maxHeight: \"100%\",\n boxShadow: \"0 12px 40px rgba(0,0,0,0.5)\",\n borderRadius: 8,\n overflow: \"hidden\",\n }}\n >\n {slide ? <Slide slide={slide} theme={theme} buildStep={buildStep} renderElement={renderElement} /> : null}\n </div>\n </div>\n\n {/* Right column — next slide on top, notes below */}\n <div\n style={{\n gridRow: 1,\n gridColumn: 2,\n display: \"grid\",\n gridTemplateRows: \"auto 1fr\",\n gap: 12,\n padding: 24,\n paddingLeft: 0,\n minHeight: 0,\n }}\n >\n <div>\n <SectionLabel>Up next</SectionLabel>\n {nextSlide ? (\n <div\n style={{\n marginTop: 8,\n width: \"100%\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n boxShadow: \"0 4px 16px rgba(0,0,0,0.4)\",\n borderRadius: 6,\n overflow: \"hidden\",\n opacity: 0.85,\n }}\n >\n <Slide slide={nextSlide} theme={theme} renderElement={renderElement} />\n </div>\n ) : (\n <div\n style={{\n marginTop: 8,\n display: \"grid\",\n placeItems: \"center\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n borderRadius: 6,\n border: \"1px dashed rgba(255,255,255,0.2)\",\n color: \"rgba(255,255,255,0.4)\",\n fontSize: 13,\n }}\n >\n End of deck\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", minHeight: 0 }}>\n <SectionLabel>Speaker notes</SectionLabel>\n <pre\n style={{\n marginTop: 8,\n flex: 1,\n overflow: \"auto\",\n background: \"rgba(255,255,255,0.04)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 6,\n padding: 12,\n fontFamily: theme.fonts?.body,\n fontSize: 15,\n lineHeight: 1.5,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n color: \"rgba(248,250,252,0.92)\",\n margin: 0,\n }}\n >\n {slide?.notes?.trim() || (\n <span style={{ color: \"rgba(255,255,255,0.35)\", fontStyle: \"italic\" }}>\n No notes for this slide.\n </span>\n )}\n </pre>\n </div>\n </div>\n\n {/* Status bar — bottom, spans both columns */}\n <div\n style={{\n gridRow: 2,\n gridColumn: \"1 / span 2\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 24,\n padding: \"12px 24px\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n fontSize: 13,\n color: \"rgba(248,250,252,0.7)\",\n fontFamily: theme.fonts?.mono,\n }}\n >\n <StatusChip label=\"Slide\">\n {index + 1} / {deck.slides.length}\n </StatusChip>\n <StatusChip label=\"Elapsed\">{formatElapsed(now - startedAtRef)}</StatusChip>\n <StatusChip label=\"Clock\">{formatClock(now)}</StatusChip>\n <div style={{ marginLeft: \"auto\", display: \"flex\", gap: 8 }}>\n <NavButton onClick={retreat} disabled={index === 0}>\n ← Prev\n </NavButton>\n <NavButton onClick={advance} disabled={index >= deck.slides.length - 1 && buildStep >= totalSteps}>\n Next →\n </NavButton>\n </div>\n </div>\n </div>\n );\n}\n\nfunction SectionLabel({ children }: { children: ReactNode }) {\n return (\n <div\n style={{\n fontSize: 10,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"rgba(248,250,252,0.5)\",\n fontWeight: 600,\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction StatusChip({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: \"inline-flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 10,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"rgba(248,250,252,0.4)\",\n }}\n >\n {label}\n </span>\n <span style={{ color: \"rgba(248,250,252,0.92)\", fontWeight: 600 }}>{children}</span>\n </div>\n );\n}\n\nfunction NavButton({ onClick, disabled, children }: { onClick: () => void; disabled?: boolean; children: ReactNode }) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n padding: \"4px 10px\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.08)\",\n border: \"1px solid rgba(255,255,255,0.15)\",\n color: \"rgba(248,250,252,0.92)\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.4 : 1,\n fontSize: 13,\n fontFamily: \"inherit\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction formatClock(ms: number): string {\n const d = new Date(ms);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSec = Math.max(0, Math.floor(ms / 1000));\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n if (h > 0) return `${h}:${pad(m)}:${pad(s)}`;\n return `${pad(m)}:${pad(s)}`;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { Slide } from \"../Slide\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SlideThumbnailProps {\n slide: SlideData;\n theme?: Theme;\n /** Width of the thumbnail in px. Height comes from the theme's aspect ratio. */\n width?: number;\n /** When true, the thumbnail is rendered with a focused outline. */\n active?: boolean;\n onClick?: () => void;\n onContextMenu?: (e: React.MouseEvent) => void;\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Compact slide preview. Used by the slide rail in the editor, by the\n * presenter view, and anywhere else a deck wants to show its slides as\n * thumbnails. Re-uses the shared <Slide> so the layout matches the viewer\n * exactly — no second rendering path.\n *\n * The slide is rendered at its full DESIGN width and the whole thing is\n * CSS-`scale()`d down to the thumbnail size (the same approach fancy-artboard\n * uses for its piece previews). Scaling the rendered output — rather than\n * rendering the slide *at* the thumbnail width — is what makes heavy embedded\n * surfaces (ECharts charts, the fancy-code editor) shrink proportionally:\n * those render at fixed internal font sizes that ignore `slideWidthPx`, so a\n * directly-undersized render leaves them oversized in the thumb. A uniform\n * transform shrinks everything identically, so the thumb is a faithful\n * miniature of the live slide.\n */\nexport function SlideThumbnail({\n slide,\n theme,\n width = 200,\n active = false,\n onClick,\n onContextMenu,\n renderElement,\n className,\n style,\n}: SlideThumbnailProps) {\n const resolved = resolveTheme(theme);\n const ratio = resolved.aspectRatio ?? 16 / 9;\n const designWidth = resolved.slideWidth ?? 1280;\n const scale = width / designWidth;\n const height = width / ratio;\n\n return (\n <div\n className={cn(\"fs-thumbnail\", className)}\n style={{\n cursor: onClick ? \"pointer\" : \"default\",\n borderRadius: 6,\n border: active ? \"2px solid #8b5cf6\" : \"1px solid rgba(0,0,0,0.08)\",\n overflow: \"hidden\",\n boxShadow: active ? \"0 0 0 3px rgba(139, 92, 246, 0.2)\" : \"0 1px 2px rgba(0,0,0,0.05)\",\n background: \"#ffffff\",\n width,\n height,\n ...style,\n }}\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-fancy-slides-thumbnail={slide.id}\n >\n <div\n style={{\n width: designWidth,\n height: designWidth / ratio,\n transform: `scale(${scale})`,\n transformOrigin: \"top left\",\n // The thumb owns interaction — charts/code/iframes inside the\n // scaled slide shouldn't capture clicks.\n pointerEvents: \"none\",\n }}\n >\n <Slide slide={slide} theme={theme} width={designWidth} renderElement={renderElement} />\n </div>\n </div>\n );\n}\n","/**\n * Stable id generator. Deliberately simple — uses a counter + timestamp so\n * generated ids are URL-safe and human-readable, not cryptographically\n * unique. Servers / collaborative sessions should overwrite these with real\n * UUIDs when persisting.\n */\n\nlet counter = 0;\n\nexport function nextId(prefix = \"id\"): string {\n counter = (counter + 1) % 1_000_000;\n const t = Date.now().toString(36);\n const c = counter.toString(36).padStart(4, \"0\");\n return `${prefix}-${t}-${c}`;\n}\n\nexport function slideId(): string {\n return nextId(\"s\");\n}\n\nexport function elementId(): string {\n return nextId(\"e\");\n}\n\nexport function deckId(): string {\n return nextId(\"d\");\n}\n","import { useCallback, useMemo } from \"react\";\nimport type { Deck, DeckOp, ElementAnimation, Slide, SlideElement, SlideLayout, Theme, SlideBackground, SlideTransition } from \"../types\";\nimport { elementId, slideId } from \"../utils/ids\";\n\n/**\n * Hook that wraps a controlled deck with a typed mutation API. Every helper\n * applies a `DeckOp` and emits the new deck via `onChange`. Consumers that\n * want raw control over the deck can skip this and edit the deck directly\n * — the helpers exist so the editor / agent bridge / undo system all funnel\n * through the same shape.\n */\nexport interface UseDeckStateOptions {\n value: Deck;\n onChange: (next: Deck) => void;\n /** Called after every mutation with the op that produced it — wire up an AgentPanel / audit log. */\n onOp?: (op: DeckOp) => void;\n}\n\nexport interface DeckStateApi {\n /** Apply a raw DeckOp — the catch-all that every helper funnels through. */\n apply: (op: DeckOp) => void;\n /** Deck-level helpers. */\n setTitle: (title: string) => void;\n applyTheme: (theme: Theme) => void;\n /** Slide-level helpers. */\n addSlide: (index?: number, partial?: Partial<Slide>) => string;\n duplicateSlide: (id: string) => string;\n removeSlide: (id: string) => void;\n reorderSlide: (id: string, toIndex: number) => void;\n setLayout: (id: string, layout: SlideLayout) => void;\n setNotes: (id: string, notes: string) => void;\n setBackground: (id: string, bg?: SlideBackground) => void;\n setTransition: (id: string, transition?: SlideTransition) => void;\n /** Element-level helpers. */\n addElement: (slideId: string, element: Omit<SlideElement, \"id\"> & { id?: string }) => string;\n removeElement: (slideId: string, elementId: string) => void;\n updateElement: (slideId: string, elementId: string, patch: Partial<SlideElement>) => void;\n moveElement: (slideId: string, elementId: string, x: number, y: number) => void;\n resizeElement: (slideId: string, elementId: string, w: number, h: number) => void;\n /** Set or clear an element's entrance build animation. Pass `undefined` to clear. */\n setAnimation: (slideId: string, elementId: string, animation?: ElementAnimation) => void;\n /** Convenience lookups. */\n getSlide: (id: string) => Slide | undefined;\n getElement: (slideId: string, elementId: string) => SlideElement | undefined;\n}\n\nexport function useDeckState({ value, onChange, onOp }: UseDeckStateOptions): DeckStateApi {\n const apply = useCallback(\n (op: DeckOp) => {\n const next = reduce(value, op);\n onChange(next);\n onOp?.(op);\n },\n [value, onChange, onOp],\n );\n\n return useMemo<DeckStateApi>(() => {\n return {\n apply,\n setTitle: (title) => apply({ kind: \"deck_set_title\", title }),\n applyTheme: (theme) => apply({ kind: \"deck_apply_theme\", theme }),\n addSlide: (index, partial) => {\n const id = partial?.id ?? slideId();\n const slide: Slide = {\n id,\n layout: partial?.layout ?? \"blank\",\n elements: partial?.elements ?? [],\n background: partial?.background,\n transition: partial?.transition,\n notes: partial?.notes,\n metadata: partial?.metadata,\n };\n apply({ kind: \"slide_add\", index: index ?? value.slides.length, slide });\n return id;\n },\n duplicateSlide: (id) => {\n const src = value.slides.find((s) => s.id === id);\n if (!src) return id;\n const newId = slideId();\n const clone: Slide = {\n ...src,\n id: newId,\n elements: src.elements.map((e) => ({ ...e, id: elementId() })),\n };\n const idx = value.slides.findIndex((s) => s.id === id);\n apply({ kind: \"slide_add\", index: idx + 1, slide: clone });\n return newId;\n },\n removeSlide: (id) => apply({ kind: \"slide_remove\", id }),\n reorderSlide: (id, toIndex) => apply({ kind: \"slide_reorder\", id, toIndex }),\n setLayout: (id, layout) => apply({ kind: \"slide_set_layout\", id, layout }),\n setNotes: (id, notes) => apply({ kind: \"slide_set_notes\", id, notes }),\n setBackground: (id, background) => apply({ kind: \"slide_set_background\", id, background }),\n setTransition: (id, transition) => apply({ kind: \"slide_set_transition\", id, transition }),\n addElement: (slideId, element) => {\n const id = element.id ?? elementId();\n apply({ kind: \"element_add\", slideId, element: { ...element, id } as SlideElement });\n return id;\n },\n removeElement: (slideIdArg, elementIdArg) => apply({ kind: \"element_remove\", slideId: slideIdArg, elementId: elementIdArg }),\n updateElement: (slideIdArg, elementIdArg, patch) =>\n apply({ kind: \"element_update\", slideId: slideIdArg, elementId: elementIdArg, patch }),\n moveElement: (slideIdArg, elementIdArg, x, y) => apply({ kind: \"element_move\", slideId: slideIdArg, elementId: elementIdArg, x, y }),\n resizeElement: (slideIdArg, elementIdArg, w, h) => apply({ kind: \"element_resize\", slideId: slideIdArg, elementId: elementIdArg, w, h }),\n setAnimation: (slideIdArg, elementIdArg, animation) =>\n apply({ kind: \"element_set_animation\", slideId: slideIdArg, elementId: elementIdArg, animation }),\n getSlide: (id) => value.slides.find((s) => s.id === id),\n getElement: (slideIdArg, elementIdArg) => value.slides.find((s) => s.id === slideIdArg)?.elements.find((e) => e.id === elementIdArg),\n };\n }, [apply, value.slides]);\n}\n\n/**\n * Pure reducer — the single source of truth for how every DeckOp mutates a\n * Deck. Agents, undo stacks, replay logs, and the editor all funnel through\n * this. Never mutates the input.\n */\nexport function reduce(deck: Deck, op: DeckOp): Deck {\n switch (op.kind) {\n case \"deck_set_title\":\n return { ...deck, title: op.title };\n case \"deck_apply_theme\":\n return { ...deck, theme: op.theme };\n case \"slide_add\": {\n const slides = [...deck.slides];\n slides.splice(Math.max(0, Math.min(slides.length, op.index)), 0, op.slide);\n return { ...deck, slides };\n }\n case \"slide_remove\":\n return { ...deck, slides: deck.slides.filter((s) => s.id !== op.id) };\n case \"slide_reorder\": {\n const idx = deck.slides.findIndex((s) => s.id === op.id);\n if (idx < 0) return deck;\n const slides = [...deck.slides];\n const [moved] = slides.splice(idx, 1);\n slides.splice(Math.max(0, Math.min(slides.length, op.toIndex)), 0, moved);\n return { ...deck, slides };\n }\n case \"slide_set_layout\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, layout: op.layout } : s)) };\n case \"slide_set_notes\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, notes: op.notes } : s)) };\n case \"slide_set_background\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, background: op.background } : s)) };\n case \"slide_set_transition\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, transition: op.transition } : s)) };\n case \"element_add\":\n return {\n ...deck,\n slides: deck.slides.map((s) => (s.id === op.slideId ? { ...s, elements: [...s.elements, op.element] } : s)),\n };\n case \"element_remove\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId ? { ...s, elements: s.elements.filter((e) => e.id !== op.elementId) } : s,\n ),\n };\n case \"element_update\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? ({ ...e, ...op.patch } as SlideElement) : e)) }\n : s,\n ),\n };\n case \"element_move\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? { ...e, x: op.x, y: op.y } : e)) }\n : s,\n ),\n };\n case \"element_resize\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? { ...e, w: op.w, h: op.h } : e)) }\n : s,\n ),\n };\n case \"element_set_animation\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? {\n ...s,\n elements: s.elements.map((e) => {\n if (e.id !== op.elementId) return e;\n if (op.animation === undefined) {\n // Clear: drop the key entirely so the element leaves the build sequence.\n const { animation: _drop, ...rest } = e;\n return rest as SlideElement;\n }\n return { ...e, animation: op.animation };\n }),\n }\n : s,\n ),\n };\n }\n}\n","/**\n * Starter ECharts option objects for each `ChartKind`. Used by\n * `DeckEditor.insertChart(kind)` so each toolbar dropdown choice spawns\n * a renderable chart with sensible defaults — bar/line/area on a\n * Q1-Q4 category axis, pie with three slices, scatter with a small\n * random cluster.\n *\n * Once the agent or user edits the chart's `option`, the original\n * `kind` is irrelevant — `option.series[0].type` is the source of\n * truth from then on.\n */\n\nexport type ChartKind = \"bar\" | \"line\" | \"pie\" | \"area\" | \"scatter\";\n\ntype Option = Record<string, unknown>;\n\nconst QUARTERS = [\"Q1\", \"Q2\", \"Q3\", \"Q4\"];\nconst REVENUE = [24000, 38000, 31000, 47000];\n\nexport function chartStarterOption(kind: ChartKind): Option {\n switch (kind) {\n case \"bar\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [{ type: \"bar\", name: \"Revenue\", data: [...REVENUE] }],\n };\n\n case \"line\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [{ type: \"line\", name: \"Revenue\", smooth: true, data: [...REVENUE] }],\n };\n\n case \"area\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [\n {\n type: \"line\",\n name: \"Revenue\",\n smooth: true,\n areaStyle: {},\n data: [...REVENUE],\n },\n ],\n };\n\n case \"pie\":\n return {\n tooltip: { trigger: \"item\" },\n legend: { bottom: 0 },\n series: [\n {\n type: \"pie\",\n radius: [\"40%\", \"70%\"],\n name: \"Segment\",\n data: [\n { value: 1048, name: \"Direct\" },\n { value: 735, name: \"Search\" },\n { value: 580, name: \"Email\" },\n ],\n },\n ],\n };\n\n case \"scatter\":\n return {\n grid: { top: 24, left: 48, right: 16, bottom: 32 },\n tooltip: { trigger: \"item\" },\n xAxis: { type: \"value\" },\n yAxis: { type: \"value\" },\n series: [\n {\n type: \"scatter\",\n name: \"Points\",\n symbolSize: 12,\n data: [\n [10.0, 8.04],\n [8.0, 6.95],\n [13.0, 7.58],\n [9.0, 8.81],\n [11.0, 8.33],\n [14.0, 9.96],\n [6.0, 7.24],\n [4.0, 4.26],\n [12.0, 10.84],\n [7.0, 4.82],\n [5.0, 5.68],\n ],\n },\n ],\n };\n }\n}\n\n// ─── UI-driven chart model ───────────────────────────────────────────────────\n//\n// The inspector edits charts through a small, JSON-friendly model rather than\n// raw ECharts option JSON. `chartModelFromOption` round-trips an existing\n// option into this model (returning `null` when the option is too custom to\n// represent), and `chartOptionFromModel` rebuilds a clean ECharts option from\n// it. This keeps the friendly editor and the advanced JSON escape hatch in\n// sync — both ultimately write `ChartElement.option`.\n\n/** Default series palette — reused for new series + slices. */\nexport const CHART_PALETTE = [\n \"#8b5cf6\",\n \"#3b82f6\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#ec4899\",\n \"#14b8a6\",\n \"#6366f1\",\n];\n\n/** A named series of per-category numeric values (bar / line / area / scatter). */\nexport interface ChartSeriesModel {\n name: string;\n color?: string;\n /** One value per category, aligned to `ChartModel.categories`. */\n values: number[];\n}\n\n/** A single pie slice. */\nexport interface ChartSliceModel {\n name: string;\n value: number;\n}\n\n/** The friendly chart model the inspector edits. */\nexport interface ChartModel {\n kind: ChartKind;\n /** x-axis category labels — used by bar/line/area/scatter. */\n categories: string[];\n /** Series — used by bar/line/area/scatter. */\n series: ChartSeriesModel[];\n /** Slices — used by pie. */\n slices: ChartSliceModel[];\n}\n\n/** Pick a palette color by index, wrapping around. */\nexport function chartColorAt(index: number): string {\n return CHART_PALETTE[index % CHART_PALETTE.length]!;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction toNumber(v: unknown): number {\n const n = typeof v === \"number\" ? v : parseFloat(String(v));\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Parse an ECharts option into the friendly `ChartModel`. Returns `null` when\n * the option doesn't match one of the supported shapes (so the inspector can\n * fall back to the raw-JSON editor instead of silently mangling a custom\n * option).\n *\n * Supported shapes:\n * - pie: a single `series` entry with `type: \"pie\"` and array `data` of\n * `{ name, value }`.\n * - bar/line/area/scatter: a categorical `xAxis.data` plus one or more\n * `series` of the matching type with numeric (or `[i, v]`) `data`.\n */\nexport function chartModelFromOption(option: Record<string, unknown>): ChartModel | null {\n if (!isPlainObject(option)) return null;\n const seriesRaw = option.series;\n if (!Array.isArray(seriesRaw) || seriesRaw.length === 0) return null;\n if (!seriesRaw.every(isPlainObject)) return null;\n\n const types = (seriesRaw as Record<string, unknown>[]).map((s) => String(s.type ?? \"\"));\n\n // Pie — single series only.\n if (types[0] === \"pie\") {\n if (seriesRaw.length !== 1) return null;\n const data = (seriesRaw[0] as Record<string, unknown>).data;\n if (!Array.isArray(data)) return null;\n const slices: ChartSliceModel[] = [];\n for (const d of data) {\n if (!isPlainObject(d)) return null;\n slices.push({ name: String(d.name ?? \"\"), value: toNumber(d.value) });\n }\n return { kind: \"pie\", categories: [], series: [], slices };\n }\n\n // Cartesian — every series must share one of these types.\n const cartesian = new Set([\"bar\", \"line\", \"scatter\"]);\n if (!types.every((t) => cartesian.has(t))) return null;\n if (new Set(types).size !== 1) return null; // mixed types → too custom\n\n const baseType = types[0]!;\n const isArea = baseType === \"line\" && (seriesRaw as Record<string, unknown>[]).every((s) => isPlainObject(s.areaStyle) || s.areaStyle != null);\n const kind: ChartKind = baseType === \"line\" ? (isArea ? \"area\" : \"line\") : (baseType as ChartKind);\n\n const xAxis = option.xAxis;\n const axisData = isPlainObject(xAxis) ? xAxis.data : undefined;\n const categories: string[] = Array.isArray(axisData) ? axisData.map((c) => String(c)) : [];\n // Scatter often has no category axis; derive length from the first series.\n const firstData = (seriesRaw[0] as Record<string, unknown>).data;\n const valueCount = Array.isArray(firstData) ? firstData.length : 0;\n const cats = categories.length > 0 ? categories : Array.from({ length: valueCount }, (_, i) => String(i + 1));\n\n const series: ChartSeriesModel[] = [];\n for (const s of seriesRaw as Record<string, unknown>[]) {\n const data = s.data;\n if (!Array.isArray(data)) return null;\n const values: number[] = data.map((d) => {\n if (Array.isArray(d)) return toNumber(d[1]); // [x, y] pair → take y\n if (isPlainObject(d)) return toNumber((d as Record<string, unknown>).value);\n return toNumber(d);\n });\n series.push({ name: String(s.name ?? \"Series\"), color: typeof s.itemStyle === \"object\" && s.itemStyle && isPlainObject(s.itemStyle) ? (typeof s.itemStyle.color === \"string\" ? s.itemStyle.color : undefined) : (typeof s.color === \"string\" ? s.color : undefined), values });\n }\n\n return { kind, categories: cats, series, slices: [] };\n}\n\n/** Rebuild a clean ECharts option from the friendly `ChartModel`. */\nexport function chartOptionFromModel(model: ChartModel): Record<string, unknown> {\n if (model.kind === \"pie\") {\n return {\n tooltip: { trigger: \"item\" },\n legend: { bottom: 0 },\n color: model.slices.map((_, i) => chartColorAt(i)),\n series: [\n {\n type: \"pie\",\n radius: [\"40%\", \"70%\"],\n name: \"Segment\",\n data: model.slices.map((s) => ({ name: s.name, value: s.value })),\n },\n ],\n };\n }\n\n const isScatter = model.kind === \"scatter\";\n const isArea = model.kind === \"area\";\n const seriesType = model.kind === \"bar\" ? \"bar\" : model.kind === \"scatter\" ? \"scatter\" : \"line\";\n\n const series = model.series.map((s, i) => {\n const color = s.color ?? chartColorAt(i);\n const base: Record<string, unknown> = {\n type: seriesType,\n name: s.name,\n itemStyle: { color },\n };\n if (isScatter) {\n base.symbolSize = 12;\n base.data = s.values.map((v, idx) => [idx, v]);\n } else {\n base.data = s.values;\n }\n if (seriesType === \"line\") base.smooth = true;\n if (isArea) base.areaStyle = { color };\n return base;\n });\n\n return {\n grid: { top: 24, left: 56, right: 16, bottom: isScatter ? 32 : 40 },\n tooltip: { trigger: isScatter ? \"item\" : \"axis\" },\n legend: model.series.length > 1 ? { bottom: 0 } : undefined,\n xAxis: isScatter ? { type: \"value\" } : { type: \"category\", data: [...model.categories] },\n yAxis: { type: \"value\" },\n series,\n };\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Action, ContextMenu, Text } from \"@particle-academy/react-fancy\";\nimport type { Slide, SlideElement, Theme } from \"../../types\";\nimport { SlideThumbnail } from \"../SlideThumbnail\";\n\nexport interface SlideRailProps {\n /** Slides to render in the rail. */\n slides: Slide[];\n /** Currently-selected slide id. */\n selectedId: string | null;\n /** Theme used for thumbnail rendering. */\n theme?: Theme;\n /** Select a slide by id. */\n onSelect: (id: string) => void;\n /** Add a slide after the given index (or at the end if absent). */\n onAdd: (afterIndex?: number) => void;\n /** Duplicate the given slide. */\n onDuplicate: (id: string) => void;\n /** Delete the given slide. */\n onRemove: (id: string) => void;\n /** Move a slide from `fromIndex` to `toIndex`. */\n onReorder: (id: string, toIndex: number) => void;\n /** Optional custom renderer for non-built-in element types — forwarded to the thumbnails. */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Thumbnail width in px. Defaults to 184. */\n thumbnailWidth?: number;\n}\n\n/**\n * Left-hand slide rail. Built on react-fancy's `Sidebar` for the chrome and\n * `ContextMenu` for right-click actions. Drag-to-reorder uses native HTML5\n * drag events so we don't take a DnD dependency.\n */\nexport function SlideRail({\n slides,\n selectedId,\n theme,\n onSelect,\n onAdd,\n onDuplicate,\n onRemove,\n onReorder,\n renderElement,\n thumbnailWidth = 184,\n}: SlideRailProps) {\n const [dragOver, setDragOver] = useState<string | null>(null);\n\n // Plain <aside> instead of react-fancy <Sidebar> because Sidebar hardcodes\n // `w-60` (240px), which overflows any rail container narrower than that.\n // The rail should fill whatever width the host gives it.\n return (\n <aside\n data-react-fancy-slide-rail=\"\"\n className=\"fs-rail flex h-full w-full min-w-0 flex-col gap-0.5\"\n >\n <div className=\"flex items-center justify-between gap-2 px-3 py-2\">\n <Text size=\"xs\" weight=\"semibold\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Slides · {slides.length}\n </Text>\n <Action size=\"xs\" icon=\"plus\" onClick={() => onAdd()} aria-label=\"Add slide\">\n Add\n </Action>\n </div>\n <div className=\"flex flex-col gap-3 px-3 pb-3\">\n {slides.map((slide, i) => (\n <div\n key={slide.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", slide.id);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(slide.id);\n }}\n onDragLeave={() => setDragOver(null)}\n onDrop={(e) => {\n e.preventDefault();\n const id = e.dataTransfer.getData(\"text/plain\");\n setDragOver(null);\n if (id && id !== slide.id) onReorder(id, i);\n }}\n style={{\n position: \"relative\",\n paddingTop: dragOver === slide.id ? 3 : 0,\n borderTop: dragOver === slide.id ? \"2px solid #8b5cf6\" : undefined,\n transition: \"padding 80ms ease\",\n }}\n >\n <ContextMenu>\n <ContextMenu.Trigger>\n <div className=\"flex items-start gap-2\">\n <Text size=\"xs\" className=\"!w-6 shrink-0 !pt-1 !text-right !font-mono !text-zinc-400\">\n {i + 1}\n </Text>\n <div className=\"flex-1\">\n <SlideThumbnail\n slide={slide}\n theme={theme}\n width={thumbnailWidth - 32}\n active={selectedId === slide.id}\n onClick={() => onSelect(slide.id)}\n renderElement={renderElement}\n />\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Content>\n <ContextMenu.Item onClick={() => onSelect(slide.id)}>Open</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onDuplicate(slide.id)}>Duplicate</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onAdd(i)}>Insert above</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onAdd(i + 1)}>Insert below</ContextMenu.Item>\n <ContextMenu.Separator />\n <ContextMenu.Item danger onClick={() => onRemove(slide.id)}>\n Delete\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu>\n </div>\n ))}\n {slides.length === 0 && (\n <div className=\"grid place-items-center rounded-md border border-dashed border-zinc-300 px-3 py-8 text-center text-xs text-zinc-500 dark:border-zinc-700\">\n Empty deck — add a slide to begin.\n </div>\n )}\n </div>\n </aside>\n );\n}\n","import { Action, Badge, Dropdown, Separator, Tooltip } from \"@particle-academy/react-fancy\";\nimport type { ShapeKind, Theme } from \"../../types\";\nimport { builtinThemes } from \"../../theme/default-theme\";\n\n/**\n * Starter chart-element preset. Picked from the toolbar Insert→Chart\n * dropdown; expands into a starter `ChartElement.option` inside\n * `DeckEditor.insertChart`. The actual saved `ChartElement` doesn't\n * carry this — once the agent or user edits the option JSON, the\n * \"kind\" is just whatever ECharts series.type the option says.\n */\nexport type ChartKind = \"bar\" | \"line\" | \"pie\" | \"area\" | \"scatter\";\n\nexport interface EditorToolbarProps {\n /** Current deck title — shown left of the toolbar. */\n title: string;\n onTitleChange?: (title: string) => void;\n /** Current theme name. */\n themeName?: string;\n /** Apply a theme. */\n onApplyTheme?: (theme: Theme) => void;\n /** Insert a text element on the active slide. */\n onInsertText?: () => void;\n /** Insert an image element. */\n onInsertImage?: () => void;\n /** Insert a shape element. */\n onInsertShape?: (shape: ShapeKind) => void;\n /** Insert a chart element. The `kind` arg picks a starter ECharts option\n * (`bar` / `line` / `pie` / `area` / `scatter`). Hosts can ignore the\n * arg if they only support a single chart type. */\n onInsertChart?: (kind: ChartKind) => void;\n /** Insert a code element. */\n onInsertCode?: () => void;\n /** Insert a table element. */\n onInsertTable?: () => void;\n /** Open the viewer (presentation mode). */\n onPresent?: () => void;\n /** When true, disables every Insert button (e.g. when no slide is selected). */\n disabled?: boolean;\n}\n\n/**\n * Top toolbar. Built on react-fancy's `Action`, `Dropdown`, `Tooltip`,\n * `Badge`, `Separator`. Designed to be slotted into the editor chrome —\n * doesn't manage its own scroll or sticky behavior.\n */\nexport function EditorToolbar({\n title,\n onTitleChange,\n themeName,\n onApplyTheme,\n onInsertText,\n onInsertImage,\n onInsertShape,\n onInsertChart,\n onInsertCode,\n onInsertTable,\n onPresent,\n disabled = false,\n}: EditorToolbarProps) {\n return (\n <div className=\"fs-toolbar flex items-center gap-2 border-b border-zinc-200 bg-white px-4 py-2 dark:border-zinc-800 dark:bg-zinc-950\">\n {/* Title field */}\n <input\n value={title}\n onChange={(e) => onTitleChange?.(e.target.value)}\n placeholder=\"Untitled deck\"\n className=\"min-w-0 flex-1 max-w-xs border-0 bg-transparent px-1 text-sm font-semibold text-zinc-900 outline-none placeholder:text-zinc-400 focus:bg-zinc-50 dark:text-zinc-100 dark:focus:bg-zinc-900\"\n aria-label=\"Deck title\"\n />\n\n <Separator orientation=\"vertical\" />\n\n {/* Insert actions */}\n <Tooltip content=\"Insert text\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"type\" onClick={onInsertText} disabled={disabled} aria-label=\"Insert text\" />\n </Tooltip>\n <Tooltip content=\"Insert image\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"image\" onClick={onInsertImage} disabled={disabled} aria-label=\"Insert image\" />\n </Tooltip>\n\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" icon=\"square\" iconTrailing=\"chevron-down\" disabled={disabled}>\n Shape\n </Action>\n </Dropdown.Trigger>\n <Dropdown.Items>\n <Dropdown.Item onClick={() => onInsertShape?.(\"rect\")}>Rectangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"rounded-rect\")}>Rounded rectangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"ellipse\")}>Ellipse</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"triangle\")}>Triangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"line\")}>Line</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"arrow\")}>Arrow</Dropdown.Item>\n </Dropdown.Items>\n </Dropdown>\n\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" icon=\"bar-chart\" iconTrailing=\"chevron-down\" disabled={disabled} aria-label=\"Insert chart\" />\n </Dropdown.Trigger>\n <Dropdown.Items>\n <Dropdown.Item onClick={() => onInsertChart?.(\"bar\")}>Bar chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"line\")}>Line chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"area\")}>Area chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"pie\")}>Pie chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"scatter\")}>Scatter</Dropdown.Item>\n </Dropdown.Items>\n </Dropdown>\n <Tooltip content=\"Insert code\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"code\" onClick={onInsertCode} disabled={disabled} aria-label=\"Insert code\" />\n </Tooltip>\n <Tooltip content=\"Insert table\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"table\" onClick={onInsertTable} disabled={disabled} aria-label=\"Insert table\" />\n </Tooltip>\n\n <Separator orientation=\"vertical\" />\n\n {/* Theme */}\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" iconTrailing=\"chevron-down\">\n <Badge size=\"sm\" color=\"zinc\">{themeName ?? \"default\"}</Badge>\n <span className=\"ml-2\">Theme</span>\n </Action>\n </Dropdown.Trigger>\n <Dropdown.Items>\n {Object.values(builtinThemes).map((t) => (\n <Dropdown.Item key={t.name} onClick={() => onApplyTheme?.(t)}>\n {t.name}\n </Dropdown.Item>\n ))}\n </Dropdown.Items>\n </Dropdown>\n\n <div className=\"ml-auto flex items-center gap-2\">\n <Tooltip content=\"Present (F)\">\n <Action color=\"violet\" size=\"sm\" icon=\"play\" onClick={onPresent}>\n Present\n </Action>\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useRef } from \"react\";\nimport { Action, Card, ColorPicker, Heading, Input, Select, Separator, Slider, Switch, Tabs, Text, Textarea } from \"@particle-academy/react-fancy\";\nimport type { ElementAnimation, Slide as SlideData, SlideBackground, SlideElement, SlideLayout, SlideTransition, TextElement, TextStyle, ImageElement, ShapeElement, CodeElement, ChartElement, TableElement, EmbedElement } from \"../../types\";\nimport { chartModelFromOption, chartOptionFromModel, chartColorAt, type ChartKind, type ChartModel } from \"../../utils/chart-presets\";\nimport { collectBuilds } from \"../../utils/builds\";\n\nexport interface ElementInspectorProps {\n /** Element being inspected. `null` falls back to slide settings (or the empty state). */\n element: SlideElement | null;\n /** Patch a property on the element. */\n onPatch: (patch: Partial<SlideElement>) => void;\n /** Delete the element. */\n onDelete?: () => void;\n /** Lock toggle. */\n onLockToggle?: (locked: boolean) => void;\n /** Selected slide — shown when no element is selected so the user can edit slide-level settings. */\n slide?: SlideData | null;\n /** Set the slide's entrance transition. */\n onSetTransition?: (transition?: SlideTransition) => void;\n /** Set the slide's background. */\n onSetBackground?: (background?: SlideBackground) => void;\n /** Set the slide's layout preset. */\n onSetLayout?: (layout: SlideLayout) => void;\n /** Set or clear the selected element's entrance build animation. */\n onSetAnimation?: (animation?: ElementAnimation) => void;\n /** Set a specific element's build animation by id — used by the slide-level build-order list. */\n onSetElementAnimation?: (elementId: string, animation?: ElementAnimation) => void;\n}\n\n/**\n * Right-hand inspector. Tabs split position + style + advanced properties.\n * Per-element-type controls drop in under the Style tab. Built on\n * react-fancy `Card`, `Tabs`, `Input`, `Select`, `Slider`, `ColorPicker`,\n * `Action`.\n */\nexport function ElementInspector({ element, onPatch, onDelete, onLockToggle, slide, onSetTransition, onSetBackground, onSetLayout, onSetAnimation, onSetElementAnimation }: ElementInspectorProps) {\n // No element selected: show slide-level settings when a slide is available.\n if (!element) {\n if (slide) {\n return <SlideSettings slide={slide} onSetTransition={onSetTransition} onSetBackground={onSetBackground} onSetLayout={onSetLayout} onSetElementAnimation={onSetElementAnimation} />;\n }\n return (\n <div className=\"fs-inspector flex h-full flex-col border-l border-zinc-200 bg-zinc-50 p-4 dark:border-zinc-800 dark:bg-zinc-900\">\n <Heading as=\"h3\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Inspector\n </Heading>\n <Text size=\"sm\" className=\"mt-2 !text-zinc-500\">\n Select an element to edit its properties.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"fs-inspector flex h-full w-full flex-col border-l border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900\">\n <div className=\"flex items-center justify-between border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-2\">\n <Heading as=\"h3\" size=\"xs\" className=\"!font-mono !uppercase !tracking-wider !text-zinc-500\">\n {element.type}\n </Heading>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n #{element.id.slice(-6)}\n </Text>\n </div>\n <div className=\"flex items-center gap-1\">\n <Action size=\"xs\" variant=\"ghost\" icon={element.locked ? \"lock\" : \"unlock\"} onClick={() => onLockToggle?.(!element.locked)} aria-label={element.locked ? \"Unlock\" : \"Lock\"} />\n {onDelete && (\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"trash\" onClick={onDelete} aria-label=\"Delete\" />\n )}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-3\">\n <Tabs defaultTab=\"style\" variant=\"pills\">\n <Tabs.List>\n <Tabs.Tab value=\"style\">Style</Tabs.Tab>\n <Tabs.Tab value=\"layout\">Layout</Tabs.Tab>\n <Tabs.Tab value=\"build\">Build</Tabs.Tab>\n <Tabs.Tab value=\"advanced\">Advanced</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel value=\"style\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <StyleSection element={element} onPatch={onPatch} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"build\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <AnimateSection animation={element.animation} onSetAnimation={onSetAnimation} isText={element.type === \"text\"} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"layout\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <LayoutSection element={element} onPatch={onPatch} siblings={slide?.elements ?? []} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"advanced\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <AdvancedSection element={element} onPatch={onPatch} />\n </Card>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs>\n </div>\n </div>\n );\n}\n\n// ─── Slide settings ─────────────────────────────────────────────────────────\n\n/**\n * Shown in the inspector column when a slide is selected but no element is.\n * Lets a human set the slide's entrance transition (and, as a nicety, its\n * background color). Mirrors the ElementInspector look — same Card/Tabs shell.\n */\nconst SLIDE_LAYOUTS: Array<{ value: SlideLayout; label: string }> = [\n { value: \"blank\", label: \"Blank\" },\n { value: \"title\", label: \"Title\" },\n { value: \"title-content\", label: \"Title + content\" },\n { value: \"two-column\", label: \"Two column\" },\n { value: \"section-divider\", label: \"Section divider\" },\n { value: \"image-text\", label: \"Image + text\" },\n { value: \"text-image\", label: \"Text + image\" },\n { value: \"quote\", label: \"Quote\" },\n];\n\n/** Which kind of background is active, for the background-mode switch. */\nfunction backgroundMode(bg: SlideBackground | undefined): \"color\" | \"gradient\" | \"image\" {\n if (bg?.gradient) return \"gradient\";\n if (bg?.image) return \"image\";\n return \"color\";\n}\n\nfunction SlideSettings({\n slide,\n onSetTransition,\n onSetBackground,\n onSetLayout,\n onSetElementAnimation,\n}: {\n slide: SlideData;\n onSetTransition?: (transition?: SlideTransition) => void;\n onSetBackground?: (background?: SlideBackground) => void;\n onSetLayout?: (layout: SlideLayout) => void;\n onSetElementAnimation?: (elementId: string, animation?: ElementAnimation) => void;\n}) {\n const transition = slide.transition;\n const kind = transition?.kind ?? \"none\";\n const setTransition = (next: Partial<SlideTransition>) => {\n const merged: SlideTransition = { kind, duration: transition?.duration, direction: transition?.direction, ...next };\n // \"none\" carries no extra knobs — store the bare kind.\n onSetTransition?.(merged.kind === \"none\" ? { kind: \"none\" } : merged);\n };\n const bgMode = backgroundMode(slide.background);\n\n return (\n <div className=\"fs-inspector flex h-full w-full flex-col border-l border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900\">\n <div className=\"flex items-center justify-between border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-2\">\n <Heading as=\"h3\" size=\"xs\" className=\"!font-mono !uppercase !tracking-wider !text-zinc-500\">\n slide\n </Heading>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n #{slide.id.slice(-6)}\n </Text>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-3\">\n {onSetLayout && (\n <Card padding=\"md\" className=\"mb-3 !bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Layout\n </Heading>\n <Select\n label=\"Preset\"\n list={SLIDE_LAYOUTS}\n value={slide.layout ?? \"blank\"}\n onValueChange={(v) => onSetLayout(v as SlideLayout)}\n />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n The layout hint the deck commits to — carried through to the pptx export's slide layout.\n </Text>\n </div>\n </Card>\n )}\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Transition\n </Heading>\n <Select\n label=\"Kind\"\n list={[\n { value: \"none\", label: \"None\" },\n { value: \"fade\", label: \"Fade\" },\n { value: \"slide\", label: \"Slide\" },\n { value: \"zoom\", label: \"Zoom\" },\n ]}\n value={kind}\n onValueChange={(v) => setTransition({ kind: v as SlideTransition[\"kind\"] })}\n />\n {kind === \"slide\" && (\n <Select\n label=\"Direction\"\n list={[\n { value: \"left\", label: \"From left\" },\n { value: \"right\", label: \"From right\" },\n { value: \"up\", label: \"From bottom\" },\n { value: \"down\", label: \"From top\" },\n ]}\n value={transition?.direction ?? \"right\"}\n onValueChange={(v) => setTransition({ direction: v as SlideTransition[\"direction\"] })}\n />\n )}\n {kind !== \"none\" && (\n <Input\n label=\"Duration (ms)\"\n type=\"number\"\n value={String(transition?.duration ?? 400)}\n onChange={(e) => setTransition({ duration: parseInt(e.target.value, 10) || 400 })}\n />\n )}\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Entrance animation played when this slide appears in the viewer. Falls back to the theme default. Honors prefers-reduced-motion.\n </Text>\n </div>\n </Card>\n\n {onSetBackground && (\n <Card padding=\"md\" className=\"mt-3 !bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Background\n </Heading>\n <Select\n label=\"Type\"\n list={[\n { value: \"color\", label: \"Solid color\" },\n { value: \"gradient\", label: \"Gradient\" },\n { value: \"image\", label: \"Image\" },\n ]}\n value={bgMode}\n onValueChange={(v) => {\n // Switching type clears the other modes' fields so the\n // background carries exactly one source (matches the writer).\n if (v === \"color\") onSetBackground({ color: slide.background?.color ?? \"#ffffff\" });\n else if (v === \"gradient\") onSetBackground({ gradient: slide.background?.gradient ?? \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\" });\n else onSetBackground({ image: slide.background?.image ?? \"\", imageFit: slide.background?.imageFit ?? \"cover\", color: slide.background?.color });\n }}\n />\n {bgMode === \"color\" && (\n <FieldLabel label=\"Color\">\n <ColorPicker\n value={slide.background?.color ?? \"#ffffff\"}\n onChange={(c) => onSetBackground({ color: c })}\n />\n </FieldLabel>\n )}\n {bgMode === \"gradient\" && (\n <Textarea\n label=\"CSS gradient\"\n value={slide.background?.gradient ?? \"\"}\n onValueChange={(v) => onSetBackground({ gradient: v })}\n rows={2}\n />\n )}\n {bgMode === \"image\" && (\n <>\n <Textarea\n label=\"Image URL\"\n value={slide.background?.image ?? \"\"}\n onValueChange={(v) => onSetBackground({ ...slide.background, image: v })}\n rows={2}\n />\n <Select\n label=\"Fit\"\n list={[\n { value: \"cover\", label: \"Cover\" },\n { value: \"contain\", label: \"Contain\" },\n { value: \"fill\", label: \"Fill (stretch)\" },\n ]}\n value={slide.background?.imageFit ?? \"cover\"}\n onValueChange={(v) => onSetBackground({ ...slide.background, imageFit: v as SlideBackground[\"imageFit\"] })}\n />\n </>\n )}\n </div>\n </Card>\n )}\n\n {onSetElementAnimation && (\n <Card padding=\"md\" className=\"mt-3 !bg-white dark:!bg-zinc-950\">\n <BuildOrderList slide={slide} onSetElementAnimation={onSetElementAnimation} />\n </Card>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact build-sequence manager shown in slide settings. Lists the slide's\n * animated elements in build order with up/down buttons. Moving an item\n * reassigns sequential `order` values (0,1,2,…) to the whole list so the\n * sequence stays unambiguous.\n */\nfunction BuildOrderList({\n slide,\n onSetElementAnimation,\n}: {\n slide: SlideData;\n onSetElementAnimation: (elementId: string, animation?: ElementAnimation) => void;\n}) {\n const builds = collectBuilds(slide);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= builds.length) return;\n const reordered = [...builds];\n const [item] = reordered.splice(from, 1);\n reordered.splice(to, 0, item!);\n // Reassign sequential orders to the whole list.\n reordered.forEach((b, i) => {\n if ((b.animation.order ?? 0) !== i) {\n onSetElementAnimation(b.element.id, { ...b.animation, order: i });\n }\n });\n };\n\n return (\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Build order\n </Heading>\n {builds.length === 0 ? (\n <Text size=\"xs\" className=\"!text-zinc-500\">\n No animated elements yet. Select an element and add a build under its Build tab.\n </Text>\n ) : (\n builds.map((b, i) => (\n <div key={b.element.id} className=\"flex items-center gap-2\">\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400 w-5\">{i + 1}.</Text>\n <div className=\"flex-1 min-w-0\">\n <Text size=\"sm\" className=\"truncate\">\n {buildLabel(b.element)}\n </Text>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n {b.animation.effect} · {b.animation.trigger ?? \"on-click\"}\n </Text>\n </div>\n <Action size=\"xs\" variant=\"ghost\" icon=\"chevron-up\" onClick={() => move(i, i - 1)} disabled={i === 0} aria-label=\"Move earlier\" />\n <Action size=\"xs\" variant=\"ghost\" icon=\"chevron-down\" onClick={() => move(i, i + 1)} disabled={i === builds.length - 1} aria-label=\"Move later\" />\n </div>\n ))\n )}\n </div>\n );\n}\n\n/** Short human label for a build-list row. */\nfunction buildLabel(element: SlideElement): string {\n if (element.type === \"text\") {\n const text = element.content.replace(/\\s+/g, \" \").trim();\n return text ? (text.length > 28 ? `${text.slice(0, 28)}…` : text) : \"Text\";\n }\n return `${element.type} #${element.id.slice(-6)}`;\n}\n\n// ─── Sections ──────────────────────────────────────────────────────────────\n\nfunction LayoutSection({ element, onPatch, siblings }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void; siblings: SlideElement[] }) {\n const zs = siblings.map((e) => e.z ?? 0);\n const bringToFront = () => onPatch({ z: (zs.length ? Math.max(...zs) : 0) + 1 });\n const sendToBack = () => onPatch({ z: (zs.length ? Math.min(...zs) : 0) - 1 });\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Input label=\"X\" type=\"number\" value={String(roundFrac(element.x))} onChange={(e) => onPatch({ x: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Y\" type=\"number\" value={String(roundFrac(element.y))} onChange={(e) => onPatch({ y: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Width\" type=\"number\" value={String(roundFrac(element.w))} onChange={(e) => onPatch({ w: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Height\" type=\"number\" value={String(roundFrac(element.h))} onChange={(e) => onPatch({ h: clamp(parseFloat(e.target.value), 0, 1) })} />\n </div>\n <Separator />\n <Slider label=\"Rotation\" value={element.rotation ?? 0} onValueChange={(v) => onPatch({ rotation: Number(v) })} min={-180} max={180} />\n <div className=\"flex items-end gap-2\">\n <Input label=\"Z-index\" type=\"number\" value={String(element.z ?? 0)} onChange={(e) => onPatch({ z: parseInt(e.target.value, 10) || 0 })} className=\"flex-1\" />\n <Action size=\"sm\" variant=\"ghost\" onClick={bringToFront} aria-label=\"Bring to front\">Front</Action>\n <Action size=\"sm\" variant=\"ghost\" onClick={sendToBack} aria-label=\"Send to back\">Back</Action>\n </div>\n <Separator />\n <Input\n label=\"Link (href)\"\n value={element.href ?? \"\"}\n placeholder=\"https://…\"\n onChange={(e) => onPatch({ href: e.target.value || undefined } as Partial<SlideElement>)}\n />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Makes the whole element a click target in the viewer (opens a new tab) and exports as a pptx hyperlink. For links inside text, use markdown <code>[label](url)</code>.\n </Text>\n </div>\n );\n}\n\nfunction AdvancedSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Input label=\"Element id\" value={element.id} disabled />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n The element id is stable — agents reference elements by id.\n </Text>\n <Separator />\n <div className=\"flex items-center gap-2\">\n <Action size=\"sm\" variant={element.hidden ? \"default\" : \"ghost\"} onClick={() => onPatch({ hidden: !element.hidden })}>\n {element.hidden ? \"Hidden — show\" : \"Hide on slide\"}\n </Action>\n </div>\n </div>\n );\n}\n\n// ─── Animate (build) section ─────────────────────────────────────────────────\n\nconst NO_ANIMATION = \"none\";\n\n/**\n * Per-element entrance build controls. Picking an effect of \"none\" clears the\n * animation (drops the element from the slide's build sequence). All other\n * fields edit a single `ElementAnimation`, funneled through `onSetAnimation`.\n */\nfunction AnimateSection({\n animation,\n onSetAnimation,\n isText,\n}: {\n animation?: ElementAnimation;\n onSetAnimation?: (animation?: ElementAnimation) => void;\n /** Whether the selected element is a text element (gates the by-paragraph toggle). */\n isText?: boolean;\n}) {\n if (!onSetAnimation) {\n return <Text size=\"sm\" className=\"!text-zinc-500\">Build animations aren't wired up in this editor.</Text>;\n }\n\n const effect = animation?.effect;\n const set = (next: Partial<ElementAnimation>) => {\n const base: ElementAnimation = animation ?? { effect: \"fade\" };\n onSetAnimation({ ...base, ...next });\n };\n\n const showDirection = effect === \"fly-in\" || effect === \"wipe\";\n\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Effect\"\n list={[\n { value: NO_ANIMATION, label: \"None\" },\n { value: \"fade\", label: \"Fade\" },\n { value: \"fly-in\", label: \"Fly in\" },\n { value: \"zoom\", label: \"Zoom\" },\n { value: \"wipe\", label: \"Wipe\" },\n ]}\n value={effect ?? NO_ANIMATION}\n onValueChange={(v) => {\n if (v === NO_ANIMATION) onSetAnimation(undefined);\n else set({ effect: v as ElementAnimation[\"effect\"] });\n }}\n />\n {effect && (\n <>\n <Select\n label=\"Trigger\"\n list={[\n { value: \"on-click\", label: \"On click\" },\n { value: \"with-prev\", label: \"With previous\" },\n { value: \"after-prev\", label: \"After previous\" },\n ]}\n value={animation?.trigger ?? \"on-click\"}\n onValueChange={(v) => set({ trigger: v as ElementAnimation[\"trigger\"] })}\n />\n {showDirection && (\n <Select\n label=\"Direction\"\n list={[\n { value: \"left\", label: \"From left\" },\n { value: \"right\", label: \"From right\" },\n { value: \"up\", label: \"From bottom\" },\n { value: \"down\", label: \"From top\" },\n ]}\n value={animation?.direction ?? \"left\"}\n onValueChange={(v) => set({ direction: v as ElementAnimation[\"direction\"] })}\n />\n )}\n <div className=\"grid grid-cols-2 gap-2\">\n <Input\n label=\"Duration (ms)\"\n type=\"number\"\n value={String(animation?.duration ?? 500)}\n onChange={(e) => set({ duration: parseInt(e.target.value, 10) || 500 })}\n />\n <Input\n label=\"Delay (ms)\"\n type=\"number\"\n value={String(animation?.delay ?? 0)}\n onChange={(e) => set({ delay: parseInt(e.target.value, 10) || 0 })}\n />\n </div>\n <Input\n label=\"Order\"\n type=\"number\"\n value={String(animation?.order ?? 0)}\n onChange={(e) => set({ order: parseInt(e.target.value, 10) || 0 })}\n />\n {isText && (\n <Switch\n label=\"Animate by paragraph (one line per click)\"\n checked={!!animation?.byParagraph}\n onCheckedChange={(v) => set({ byParagraph: v })}\n />\n )}\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Builds reveal in ascending order. \"On click\" starts a new step; \"with previous\" plays alongside the step's lead; \"after previous\" follows it. Honors prefers-reduced-motion.\n </Text>\n </>\n )}\n </div>\n );\n}\n\nfunction StyleSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\n switch (element.type) {\n case \"text\":\n return <TextStyleControls element={element} onPatch={onPatch as (p: Partial<TextElement>) => void} />;\n case \"image\":\n return <ImageStyleControls element={element} onPatch={onPatch as (p: Partial<ImageElement>) => void} />;\n case \"shape\":\n return <ShapeStyleControls element={element} onPatch={onPatch as (p: Partial<ShapeElement>) => void} />;\n case \"code\":\n return <CodeStyleControls element={element} onPatch={onPatch as (p: Partial<CodeElement>) => void} />;\n case \"chart\":\n return <ChartStyleControls element={element} onPatch={onPatch as (p: Partial<ChartElement>) => void} />;\n case \"table\":\n return <TableStyleControls element={element} onPatch={onPatch as (p: Partial<TableElement>) => void} />;\n case \"embed\":\n return <EmbedStyleControls element={element} onPatch={onPatch as (p: Partial<EmbedElement>) => void} />;\n default:\n return <Text size=\"sm\" className=\"!text-zinc-500\">No style controls for this element type.</Text>;\n }\n}\n\nfunction TextStyleControls({ element, onPatch }: { element: TextElement; onPatch: (p: Partial<TextElement>) => void }) {\n const setStyle = (next: Partial<TextStyle>) => onPatch({ style: { ...element.style, ...next } } as Partial<TextElement>);\n const s = element.style ?? {};\n return (\n <div className=\"space-y-3\">\n <Textarea label=\"Content\" value={element.content} onValueChange={(v) => onPatch({ content: v })} rows={4} autoResize />\n <Select\n label=\"Format\"\n list={[\n { value: \"markdown\", label: \"Markdown\" },\n { value: \"plain\", label: \"Plain\" },\n { value: \"html\", label: \"HTML\" },\n ]}\n value={element.format ?? \"markdown\"}\n onValueChange={(v) => onPatch({ format: v as TextElement[\"format\"] })}\n />\n <Separator />\n <Input label=\"Font size\" type=\"number\" value={String(s.fontSize ?? 28)} onChange={(e) => setStyle({ fontSize: parseFloat(e.target.value) || 28 })} />\n <Select\n label=\"Weight\"\n list={[\n { value: \"normal\", label: \"Normal\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"semibold\", label: \"Semibold\" },\n { value: \"bold\", label: \"Bold\" },\n ]}\n value={(s.weight as string) ?? \"normal\"}\n onValueChange={(v) => setStyle({ weight: v as TextStyle[\"weight\"] })}\n />\n <Select\n label=\"Align\"\n list={[\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n { value: \"right\", label: \"Right\" },\n { value: \"justify\", label: \"Justify\" },\n ]}\n value={s.align ?? \"left\"}\n onValueChange={(v) => setStyle({ align: v as TextStyle[\"align\"] })}\n />\n <Select\n label=\"Vertical align\"\n list={[\n { value: \"top\", label: \"Top\" },\n { value: \"middle\", label: \"Middle\" },\n { value: \"bottom\", label: \"Bottom\" },\n ]}\n value={s.verticalAlign ?? \"top\"}\n onValueChange={(v) => setStyle({ verticalAlign: v as TextStyle[\"verticalAlign\"] })}\n />\n <Input label=\"Line height\" type=\"number\" value={String(s.lineHeight ?? 1.4)} onChange={(e) => setStyle({ lineHeight: parseFloat(e.target.value) || 1.4 })} />\n <div className=\"flex gap-4\">\n <Switch label=\"Italic\" checked={!!s.italic} onCheckedChange={(v) => setStyle({ italic: v })} />\n <Switch label=\"Underline\" checked={!!s.underline} onCheckedChange={(v) => setStyle({ underline: v })} />\n </div>\n <FieldLabel label=\"Color\"><ColorPicker value={s.color ?? \"#0f172a\"} onChange={(c) => setStyle({ color: c })} /></FieldLabel>\n </div>\n );\n}\n\nfunction ImageStyleControls({ element, onPatch }: { element: ImageElement; onPatch: (p: Partial<ImageElement>) => void }) {\n const fileRef = useRef<HTMLInputElement>(null);\n const crop = element.crop;\n\n const onFile = (file: File | undefined) => {\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") onPatch({ src: reader.result });\n };\n reader.readAsDataURL(file);\n };\n\n const setCrop = (next: Partial<NonNullable<ImageElement[\"crop\"]>>) => {\n const base = crop ?? { x: 0, y: 0, w: 1, h: 1 };\n onPatch({ crop: { ...base, ...next } });\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Hidden native file input, triggered by the Action below. */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n onFile(e.target.files?.[0]);\n // Allow re-selecting the same file.\n e.target.value = \"\";\n }}\n />\n <Action size=\"sm\" variant=\"ghost\" icon=\"upload\" onClick={() => fileRef.current?.click()}>\n Upload image\n </Action>\n <Textarea label=\"Image URL\" value={element.src} onValueChange={(v) => onPatch({ src: v })} rows={2} />\n <Input label=\"Alt text\" value={element.alt ?? \"\"} onChange={(e) => onPatch({ alt: e.target.value })} />\n <Select\n label=\"Fit\"\n list={[\n { value: \"contain\", label: \"Contain\" },\n { value: \"cover\", label: \"Cover\" },\n { value: \"fill\", label: \"Fill (stretch)\" },\n { value: \"scale-down\", label: \"Scale down\" },\n ]}\n value={element.fit ?? \"contain\"}\n onValueChange={(v) => onPatch({ fit: v as ImageElement[\"fit\"] })}\n />\n <Separator />\n <div className=\"flex items-center justify-between\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Crop\n </Heading>\n {crop && (\n <Action size=\"xs\" variant=\"ghost\" onClick={() => onPatch({ crop: undefined })}>\n Clear crop\n </Action>\n )}\n </div>\n <Slider label=\"X\" value={crop?.x ?? 0} onValueChange={(v) => setCrop({ x: Number(v) })} min={0} max={1} step={0.01} showValue />\n <Slider label=\"Y\" value={crop?.y ?? 0} onValueChange={(v) => setCrop({ y: Number(v) })} min={0} max={1} step={0.01} showValue />\n <Slider label=\"Width\" value={crop?.w ?? 1} onValueChange={(v) => setCrop({ w: Number(v) })} min={0.01} max={1} step={0.01} showValue />\n <Slider label=\"Height\" value={crop?.h ?? 1} onValueChange={(v) => setCrop({ h: Number(v) })} min={0.01} max={1} step={0.01} showValue />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Crop is a window into the source image (0..1). Width/height shrink the visible region; X/Y pan it.\n </Text>\n </div>\n );\n}\n\nfunction ShapeStyleControls({ element, onPatch }: { element: ShapeElement; onPatch: (p: Partial<ShapeElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Shape\"\n list={[\n { value: \"rect\", label: \"Rectangle\" },\n { value: \"rounded-rect\", label: \"Rounded rectangle\" },\n { value: \"ellipse\", label: \"Ellipse\" },\n { value: \"triangle\", label: \"Triangle\" },\n { value: \"line\", label: \"Line\" },\n { value: \"arrow\", label: \"Arrow\" },\n ]}\n value={element.shape}\n onValueChange={(v) => onPatch({ shape: v as ShapeElement[\"shape\"] })}\n />\n <FieldLabel label=\"Fill\"><ColorPicker value={element.fill ?? \"#ffffff\"} onChange={(c) => onPatch({ fill: c })} /></FieldLabel>\n <FieldLabel label=\"Stroke\"><ColorPicker value={element.stroke ?? \"#0f172a\"} onChange={(c) => onPatch({ stroke: c })} /></FieldLabel>\n <Slider label=\"Stroke width\" value={element.strokeWidth ?? 2} onValueChange={(v) => onPatch({ strokeWidth: Number(v) })} min={0} max={20} step={0.5} />\n <Switch label=\"Dashed stroke\" checked={!!element.dashed} onCheckedChange={(v) => onPatch({ dashed: v })} />\n {(element.shape === \"rounded-rect\" || element.shape === \"rect\") && (\n <Slider label=\"Corner radius\" value={element.radius ?? 0} onValueChange={(v) => onPatch({ radius: Number(v) })} min={0} max={40} />\n )}\n </div>\n );\n}\n\nfunction CodeStyleControls({ element, onPatch }: { element: CodeElement; onPatch: (p: Partial<CodeElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Textarea label=\"Code\" value={element.code} onValueChange={(v) => onPatch({ code: v })} rows={6} autoResize />\n <Input label=\"Language\" value={element.language ?? \"javascript\"} onChange={(e) => onPatch({ language: e.target.value })} />\n <Select\n label=\"Theme\"\n list={[\n { value: \"auto\", label: \"Auto\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n ]}\n value={element.codeTheme ?? \"auto\"}\n onValueChange={(v) => onPatch({ codeTheme: v })}\n />\n <Switch label=\"Line numbers\" checked={element.lineNumbers ?? true} onCheckedChange={(v) => onPatch({ lineNumbers: v })} />\n </div>\n );\n}\n\nfunction ChartStyleControls({ element, onPatch }: { element: ChartElement; onPatch: (p: Partial<ChartElement>) => void }) {\n const model = chartModelFromOption(element.option);\n const writeModel = (m: ChartModel) => onPatch({ option: chartOptionFromModel(m) });\n\n return (\n <div className=\"space-y-3\">\n {model ? (\n <ChartModelEditor model={model} onChange={writeModel} />\n ) : (\n <Text size=\"sm\" className=\"rounded-md bg-amber-50 p-2 !text-amber-700 dark:bg-amber-950/40 dark:!text-amber-400\">\n This chart's option is too custom for the visual editor. Edit it as JSON below.\n </Text>\n )}\n\n <details className=\"rounded-md border border-zinc-200 dark:border-zinc-800\">\n <summary className=\"cursor-pointer select-none px-2 py-1.5 text-xs font-medium text-zinc-600 dark:text-zinc-400\">\n Advanced — edit option JSON\n </summary>\n <div className=\"p-2 pt-0\">\n <Textarea\n label=\"ECharts option (JSON)\"\n value={JSON.stringify(element.option, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ option: JSON.parse(v) });\n } catch {\n /* ignore invalid JSON while typing */\n }\n }}\n rows={10}\n />\n </div>\n </details>\n </div>\n );\n}\n\nconst CHART_TYPE_OPTIONS = [\n { value: \"bar\", label: \"Bar\" },\n { value: \"line\", label: \"Line\" },\n { value: \"area\", label: \"Area\" },\n { value: \"pie\", label: \"Pie\" },\n { value: \"scatter\", label: \"Scatter\" },\n];\n\nfunction ChartModelEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const setKind = (kind: ChartKind) => {\n if (kind === model.kind) return;\n // Switching to/from pie reshapes the data; preserve what we can.\n if (kind === \"pie\") {\n const first = model.series[0];\n const slices = model.slices.length\n ? model.slices\n : (model.categories.length\n ? model.categories.map((name, i) => ({ name, value: first?.values[i] ?? 0 }))\n : [{ name: \"Slice 1\", value: 1 }]);\n onChange({ ...model, kind, slices });\n return;\n }\n if (model.kind === \"pie\") {\n const categories = model.slices.length ? model.slices.map((s) => s.name) : [\"A\", \"B\", \"C\"];\n const values = model.slices.length ? model.slices.map((s) => s.value) : [1, 2, 3];\n onChange({ ...model, kind, categories, series: [{ name: \"Series 1\", color: chartColorAt(0), values }] });\n return;\n }\n onChange({ ...model, kind });\n };\n\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Chart type\"\n list={CHART_TYPE_OPTIONS}\n value={model.kind}\n onValueChange={(v) => setKind(v as ChartKind)}\n />\n {model.kind === \"pie\" ? (\n <PieSliceEditor model={model} onChange={onChange} />\n ) : (\n <CartesianChartEditor model={model} onChange={onChange} />\n )}\n </div>\n );\n}\n\nfunction PieSliceEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const slices = model.slices;\n const update = (i: number, next: Partial<{ name: string; value: number }>) => {\n const copy = slices.map((s, idx) => (idx === i ? { ...s, ...next } : s));\n onChange({ ...model, slices: copy });\n };\n const remove = (i: number) => onChange({ ...model, slices: slices.filter((_, idx) => idx !== i) });\n const add = () => onChange({ ...model, slices: [...slices, { name: `Slice ${slices.length + 1}`, value: 0 }] });\n\n return (\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Slices</Heading>\n {slices.map((s, i) => (\n <div key={i} className=\"flex items-end gap-2\">\n <div className=\"flex-1\"><Input label={i === 0 ? \"Name\" : undefined} value={s.name} onChange={(e) => update(i, { name: e.target.value })} /></div>\n <div className=\"w-20\"><Input label={i === 0 ? \"Value\" : undefined} type=\"number\" value={String(s.value)} onChange={(e) => update(i, { value: parseFloat(e.target.value) || 0 })} /></div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => remove(i)} aria-label=\"Remove slice\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={add}>Add slice</Action>\n </div>\n );\n}\n\nfunction CartesianChartEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const { categories, series } = model;\n\n const updateCategory = (i: number, label: string) => {\n onChange({ ...model, categories: categories.map((c, idx) => (idx === i ? label : c)) });\n };\n const removeCategory = (i: number) => {\n onChange({\n ...model,\n categories: categories.filter((_, idx) => idx !== i),\n series: series.map((s) => ({ ...s, values: s.values.filter((_, idx) => idx !== i) })),\n });\n };\n const addCategory = () => {\n onChange({\n ...model,\n categories: [...categories, `Cat ${categories.length + 1}`],\n series: series.map((s) => ({ ...s, values: [...s.values, 0] })),\n });\n };\n\n const updateSeries = (si: number, next: Partial<{ name: string; color: string }>) => {\n onChange({ ...model, series: series.map((s, idx) => (idx === si ? { ...s, ...next } : s)) });\n };\n const updateValue = (si: number, ci: number, value: number) => {\n onChange({\n ...model,\n series: series.map((s, idx) =>\n idx === si ? { ...s, values: s.values.map((v, vi) => (vi === ci ? value : v)) } : s,\n ),\n });\n };\n const removeSeries = (si: number) => onChange({ ...model, series: series.filter((_, idx) => idx !== si) });\n const addSeries = () =>\n onChange({\n ...model,\n series: [\n ...series,\n { name: `Series ${series.length + 1}`, color: chartColorAt(series.length), values: categories.map(() => 0) },\n ],\n });\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Categories</Heading>\n {categories.map((c, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <div className=\"flex-1\"><Input value={c} onChange={(e) => updateCategory(i, e.target.value)} /></div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeCategory(i)} aria-label=\"Remove category\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addCategory}>Add category</Action>\n </div>\n\n <Separator />\n\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Series</Heading>\n {series.map((s, si) => (\n <div key={si} className=\"space-y-2 rounded-md border border-zinc-200 p-2 dark:border-zinc-800\">\n <div className=\"flex items-end gap-2\">\n <div className=\"flex-1\"><Input label=\"Name\" value={s.name} onChange={(e) => updateSeries(si, { name: e.target.value })} /></div>\n <FieldLabel label=\"Color\"><ColorPicker value={s.color ?? chartColorAt(si)} onChange={(c) => updateSeries(si, { color: c })} /></FieldLabel>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeSeries(si)} aria-label=\"Remove series\" />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {categories.map((c, ci) => (\n <Input\n key={ci}\n label={c}\n type=\"number\"\n value={String(s.values[ci] ?? 0)}\n onChange={(e) => updateValue(si, ci, parseFloat(e.target.value) || 0)}\n />\n ))}\n </div>\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addSeries}>Add series</Action>\n </div>\n </div>\n );\n}\n\nfunction TableStyleControls({ element, onPatch }: { element: TableElement; onPatch: (p: Partial<TableElement>) => void }) {\n const columns = element.columns;\n const rows = element.rows;\n\n /** Mint a column key that's unique among existing keys (col1, col2, …). */\n const nextColKey = (): string => {\n const existing = new Set(columns.map((c) => c.key));\n let n = columns.length + 1;\n while (existing.has(`col${n}`)) n++;\n return `col${n}`;\n };\n\n const setColumnLabel = (i: number, label: string) => {\n // Only the label changes — the key stays stable.\n onPatch({ columns: columns.map((c, idx) => (idx === i ? { ...c, label } : c)) });\n };\n const removeColumn = (i: number) => {\n const key = columns[i]?.key;\n const nextCols = columns.filter((_, idx) => idx !== i);\n const nextRows = key\n ? rows.map((r) => {\n const { [key]: _drop, ...rest } = r;\n return rest;\n })\n : rows;\n onPatch({ columns: nextCols, rows: nextRows });\n };\n const addColumn = () => {\n const key = nextColKey();\n onPatch({\n columns: [...columns, { key, label: `Column ${columns.length + 1}` }],\n rows: rows.map((r) => ({ ...r, [key]: \"\" })),\n });\n };\n\n const setCell = (rowIdx: number, key: string, value: string) => {\n onPatch({ rows: rows.map((r, idx) => (idx === rowIdx ? { ...r, [key]: value } : r)) });\n };\n const removeRow = (rowIdx: number) => onPatch({ rows: rows.filter((_, idx) => idx !== rowIdx) });\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const c of columns) blank[c.key] = \"\";\n onPatch({ rows: [...rows, blank] });\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Columns</Heading>\n {columns.map((c, i) => (\n <div key={c.key} className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input value={c.label} onChange={(e) => setColumnLabel(i, e.target.value)} aria-label={`Column ${i + 1} label`} />\n </div>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">{c.key}</Text>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeColumn(i)} aria-label=\"Remove column\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addColumn}>Add column</Action>\n </div>\n\n <Separator />\n\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Rows</Heading>\n {columns.length === 0 ? (\n <Text size=\"xs\" className=\"!text-zinc-500\">Add a column to start adding rows.</Text>\n ) : (\n <>\n {rows.map((r, rowIdx) => (\n <div key={rowIdx} className=\"flex items-start gap-2 border-b border-zinc-100 pb-2 dark:border-zinc-800\">\n <div className=\"grid flex-1 grid-cols-1 gap-1\">\n {columns.map((c) => (\n <Input\n key={c.key}\n label={c.label}\n value={r[c.key] == null ? \"\" : String(r[c.key])}\n onChange={(e) => setCell(rowIdx, c.key, e.target.value)}\n />\n ))}\n </div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeRow(rowIdx)} aria-label=\"Remove row\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addRow}>Add row</Action>\n </>\n )}\n </div>\n\n <details className=\"rounded-md border border-zinc-200 dark:border-zinc-800\">\n <summary className=\"cursor-pointer select-none px-2 py-1.5 text-xs font-medium text-zinc-600 dark:text-zinc-400\">\n Edit as JSON\n </summary>\n <div className=\"space-y-3 p-2 pt-0\">\n <Textarea\n label=\"Columns (JSON)\"\n value={JSON.stringify(columns, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ columns: JSON.parse(v) });\n } catch {\n /* ignore */\n }\n }}\n rows={5}\n />\n <Textarea\n label=\"Rows (JSON)\"\n value={JSON.stringify(rows, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ rows: JSON.parse(v) });\n } catch {\n /* ignore */\n }\n }}\n rows={8}\n />\n </div>\n </details>\n </div>\n );\n}\n\nfunction EmbedStyleControls({ element, onPatch }: { element: EmbedElement; onPatch: (p: Partial<EmbedElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Input label=\"Embed URL\" value={element.src} onChange={(e) => onPatch({ src: e.target.value })} />\n <Input label=\"Title (a11y)\" value={element.title ?? \"\"} onChange={(e) => onPatch({ title: e.target.value })} />\n <Input label=\"Sandbox\" value={element.sandbox ?? \"allow-scripts\"} onChange={(e) => onPatch({ sandbox: e.target.value })} />\n </div>\n );\n}\n\nfunction FieldLabel({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-zinc-600 dark:text-zinc-400\">{label}</span>\n {children}\n </label>\n );\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n\nfunction roundFrac(n: number): number {\n return Math.round(n * 1000) / 1000;\n}\n","import { Heading, Textarea } from \"@particle-academy/react-fancy\";\n\nexport interface SpeakerNotesProps {\n notes?: string;\n onChange: (notes: string) => void;\n placeholder?: string;\n}\n\n/**\n * Bottom-of-editor speaker notes panel. Just a labelled `Textarea` from\n * react-fancy — the rest of the editor chrome controls how much vertical\n * space this gets.\n */\nexport function SpeakerNotes({ notes, onChange, placeholder }: SpeakerNotesProps) {\n return (\n <div className=\"fs-notes border-t border-zinc-200 bg-white p-3 dark:border-zinc-800 dark:bg-zinc-950\">\n <Heading as=\"h3\" size=\"xs\" className=\"mb-1 !uppercase !tracking-wider !text-zinc-500\">\n Speaker notes\n </Heading>\n <Textarea\n value={notes ?? \"\"}\n onValueChange={onChange}\n placeholder={placeholder ?? \"Notes are visible only to the presenter…\"}\n rows={3}\n autoResize\n minRows={2}\n maxRows={6}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState, type ReactNode } from \"react\";\nimport type {\n ChartElement,\n CodeElement,\n Deck,\n DeckOp,\n ImageElement,\n ShapeElement,\n ShapeKind,\n Slide as SlideData,\n SlideElement,\n TableElement,\n TextElement,\n} from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { elementId } from \"../../utils/ids\";\nimport { useDeckState } from \"../../hooks/use-deck-state\";\nimport { chartStarterOption, type ChartKind } from \"../../utils/chart-presets\";\nimport { Slide } from \"../Slide\";\nimport { SlideRail } from \"../SlideRail\";\nimport { EditorToolbar } from \"../EditorToolbar\";\nimport { ElementInspector } from \"../ElementInspector\";\nimport { SpeakerNotes } from \"../SpeakerNotes\";\nimport { defaultElementRegistry } from \"../../registry\";\n\nexport interface DeckEditorProps {\n /** Controlled deck — pair with `onChange`. */\n value: Deck;\n onChange: (next: Deck) => void;\n /** Called after every mutation with the op that produced it — feed into AgentPanel / audit log. */\n onOp?: (op: DeckOp) => void;\n /** Called when the user clicks Present. The host decides how to open the SlideViewer. */\n onPresent?: () => void;\n /** Controlled selected slide id. Uncontrolled by default. */\n selectedSlideId?: string | null;\n onSelectedSlideChange?: (id: string | null) => void;\n /**\n * Renderer for chart / code / table / embed elements (the elements this\n * package doesn't render natively). Defaults to the built-in\n * `defaultElementRegistry` so the editor is full out of the box; pass your\n * own to override (it wins entirely). The optional-peer hosts (chart/code)\n * load fancy-echarts/fancy-code via guarded dynamic imports, so the base\n * bundle never statically requires them.\n */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Hide the slide rail (e.g. for embedded use). */\n hideRail?: boolean;\n /** Hide the speaker notes panel. */\n hideNotes?: boolean;\n /** Hide the toolbar. */\n hideToolbar?: boolean;\n /** Hide the inspector. */\n hideInspector?: boolean;\n /** Optional extra content on the toolbar's trailing edge. */\n toolbarExtra?: ReactNode;\n className?: string;\n}\n\n/**\n * Full deck editor — toolbar + rail + canvas + inspector + speaker notes.\n *\n * Controlled (`value` + `onChange`). State is intentionally simple: deck\n * lives in the consumer, the editor just renders a view + dispatches ops.\n * The same `DeckOp` enum that the agent bridge speaks runs through here —\n * agents and humans drive identical mutations.\n */\nexport function DeckEditor({\n value,\n onChange,\n onOp,\n onPresent,\n selectedSlideId: controlledSlideId,\n onSelectedSlideChange,\n renderElement = defaultElementRegistry,\n hideRail = false,\n hideNotes = false,\n hideToolbar = false,\n hideInspector = false,\n toolbarExtra,\n className,\n}: DeckEditorProps) {\n const deck = value;\n const ops = useDeckState({ value: deck, onChange, onOp });\n\n // Slide selection — controlled or internal.\n const [internalSlideId, setInternalSlideId] = useState<string | null>(deck.slides[0]?.id ?? null);\n const isControlled = controlledSlideId !== undefined;\n const slideId = isControlled ? controlledSlideId! : internalSlideId;\n const setSlideId = useCallback(\n (id: string | null) => {\n if (!isControlled) setInternalSlideId(id);\n onSelectedSlideChange?.(id);\n },\n [isControlled, onSelectedSlideChange],\n );\n\n // If the selected slide disappears (deletion / agent ops), fall back to the first slide.\n useEffect(() => {\n if (slideId && !deck.slides.some((s) => s.id === slideId)) {\n setSlideId(deck.slides[0]?.id ?? null);\n } else if (!slideId && deck.slides.length > 0) {\n setSlideId(deck.slides[0]!.id);\n }\n }, [deck.slides, slideId, setSlideId]);\n\n const slide: SlideData | undefined = deck.slides.find((s) => s.id === slideId);\n\n // Element selection — internal, resets on slide change.\n const [elementIdSelected, setElementIdSelected] = useState<string | null>(null);\n useEffect(() => {\n setElementIdSelected(null);\n }, [slideId]);\n\n const selectedElement = slide && elementIdSelected ? slide.elements.find((e) => e.id === elementIdSelected) ?? null : null;\n\n // ─── Toolbar insert handlers ───────────────────────────────────────────\n const insert = useCallback(\n (element: Omit<SlideElement, \"id\">) => {\n if (!slide) return;\n const id = ops.addElement(slide.id, { id: elementId(), ...element });\n setElementIdSelected(id);\n },\n [slide, ops],\n );\n\n const insertText = useCallback(\n () =>\n insert({\n type: \"text\",\n x: 0.1,\n y: 0.4,\n w: 0.8,\n h: 0.2,\n content: \"Click to edit\",\n format: \"plain\",\n style: { fontSize: 36, weight: \"semibold\", align: \"center\" },\n } as Omit<TextElement, \"id\">),\n [insert],\n );\n\n const insertImage = useCallback(\n () =>\n insert({\n type: \"image\",\n x: 0.25,\n y: 0.25,\n w: 0.5,\n h: 0.5,\n src: \"https://placehold.co/600x400?text=Image\",\n fit: \"contain\",\n } as Omit<ImageElement, \"id\">),\n [insert],\n );\n\n const insertShape = useCallback(\n (shape: ShapeKind) =>\n insert({\n type: \"shape\",\n shape,\n x: 0.3,\n y: 0.3,\n w: 0.4,\n h: 0.4,\n fill: shape === \"line\" || shape === \"arrow\" ? \"none\" : \"rgba(139,92,246,0.15)\",\n stroke: \"#8b5cf6\",\n strokeWidth: 2,\n } as Omit<ShapeElement, \"id\">),\n [insert],\n );\n\n const insertChart = useCallback(\n (kind: ChartKind = \"bar\") =>\n insert({\n type: \"chart\",\n x: 0.1,\n y: 0.2,\n w: 0.8,\n h: 0.6,\n option: chartStarterOption(kind),\n } as Omit<ChartElement, \"id\">),\n [insert],\n );\n\n const insertCode = useCallback(\n () =>\n insert({\n type: \"code\",\n x: 0.15,\n y: 0.2,\n w: 0.7,\n h: 0.6,\n code: \"function hello() {\\n return \\\"world\\\";\\n}\\n\",\n language: \"typescript\",\n codeTheme: \"dark\",\n } as Omit<CodeElement, \"id\">),\n [insert],\n );\n\n const insertTable = useCallback(\n () =>\n insert({\n type: \"table\",\n x: 0.15,\n y: 0.25,\n w: 0.7,\n h: 0.5,\n columns: [\n { key: \"name\", label: \"Name\" },\n { key: \"value\", label: \"Value\" },\n ],\n rows: [\n { name: \"Alpha\", value: 12 },\n { name: \"Beta\", value: 34 },\n { name: \"Gamma\", value: 56 },\n ],\n } as Omit<TableElement, \"id\">),\n [insert],\n );\n\n return (\n <div\n className={`fs-editor flex h-full w-full flex-col bg-zinc-100 dark:bg-zinc-950 ${className ?? \"\"}`}\n data-fancy-slides-editor={deck.id}\n >\n {/* Top toolbar */}\n {!hideToolbar && (\n <EditorToolbar\n title={deck.title}\n onTitleChange={(t) => ops.setTitle(t)}\n themeName={deck.theme.name}\n onApplyTheme={(t) => ops.applyTheme(t)}\n onInsertText={insertText}\n onInsertImage={insertImage}\n onInsertShape={insertShape}\n onInsertChart={insertChart}\n onInsertCode={insertCode}\n onInsertTable={insertTable}\n onPresent={onPresent}\n disabled={!slide}\n />\n )}\n\n {/* Main editing area */}\n <div className=\"flex min-h-0 flex-1\">\n {/* Slide rail */}\n {!hideRail && (\n <div className=\"w-56 shrink-0 overflow-y-auto border-r border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-950\">\n <SlideRail\n slides={deck.slides}\n selectedId={slideId}\n theme={deck.theme}\n onSelect={setSlideId}\n onAdd={(after) => {\n const id = ops.addSlide(after !== undefined ? after : deck.slides.length);\n setSlideId(id);\n }}\n onDuplicate={(id) => {\n const newId = ops.duplicateSlide(id);\n setSlideId(newId);\n }}\n onRemove={(id) => ops.removeSlide(id)}\n onReorder={(id, toIndex) => ops.reorderSlide(id, toIndex)}\n renderElement={renderElement}\n />\n </div>\n )}\n\n {/* Canvas + notes */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex flex-1 items-center justify-center overflow-auto p-6\">\n {slide ? (\n <div\n className=\"rounded-lg shadow-xl\"\n style={{\n width: \"min(96%, 1280px)\",\n aspectRatio: String(resolveTheme(deck.theme).aspectRatio ?? 16 / 9),\n background: \"white\",\n }}\n >\n <Slide\n slide={slide}\n theme={deck.theme}\n editing\n onElementContentChange={(eid, content) => ops.updateElement(slide.id, eid, { content, format: \"markdown\" } as Partial<TextElement>)}\n onElementSelect={setElementIdSelected}\n selectedElementId={elementIdSelected}\n onElementMove={(eid, x, y) => ops.moveElement(slide.id, eid, x, y)}\n onElementResize={(eid, patch) => ops.updateElement(slide.id, eid, patch as Partial<SlideElement>)}\n renderElement={renderElement}\n />\n </div>\n ) : (\n <div className=\"grid place-items-center rounded-lg border border-dashed border-zinc-300 bg-white px-12 py-24 text-sm text-zinc-500 dark:border-zinc-700 dark:bg-zinc-950\">\n Add a slide to start editing.\n </div>\n )}\n </div>\n\n {/* Speaker notes */}\n {!hideNotes && slide && (\n <SpeakerNotes notes={slide.notes} onChange={(n) => ops.setNotes(slide.id, n)} />\n )}\n </div>\n\n {/* Inspector */}\n {!hideInspector && (\n <div className=\"w-72 shrink-0 overflow-y-auto\">\n <ElementInspector\n element={selectedElement}\n slide={slide ?? null}\n onPatch={(patch) => slide && elementIdSelected && ops.updateElement(slide.id, elementIdSelected, patch)}\n onDelete={() => {\n if (!slide || !elementIdSelected) return;\n ops.removeElement(slide.id, elementIdSelected);\n setElementIdSelected(null);\n }}\n onLockToggle={(locked) => slide && elementIdSelected && ops.updateElement(slide.id, elementIdSelected, { locked } as Partial<SlideElement>)}\n onSetTransition={(transition) => slide && ops.setTransition(slide.id, transition)}\n onSetBackground={(background) => slide && ops.setBackground(slide.id, background)}\n onSetLayout={(layout) => slide && ops.setLayout(slide.id, layout)}\n onSetAnimation={(animation) => slide && elementIdSelected && ops.setAnimation(slide.id, elementIdSelected, animation)}\n onSetElementAnimation={(eid, animation) => slide && ops.setAnimation(slide.id, eid, animation)}\n />\n </div>\n )}\n </div>\n\n {toolbarExtra}\n </div>\n );\n}\n","/**\n * The fancy-slides data model.\n *\n * Every shape here is JSON-friendly — pure objects, arrays, primitives, and\n * tagged unions. No React children, no functions, no class instances. This\n * is the contract the deck schema commits to: an LLM can emit a deck, a\n * server can store one, a designer can hand-edit one, and the viewer +\n * editor will render it identically.\n *\n * Coordinate system: elements position themselves in slide-relative units\n * where the slide is a 1.0 × (1 / aspectRatio) rectangle. So `x: 0.5, y: 0.5`\n * is the centre of the slide regardless of how big it's rendered. This\n * keeps decks resolution-independent — a fullscreen 1920×1080 viewer and a\n * thumbnail at 320×180 render the same layout.\n */\n\n// ─── Deck ──────────────────────────────────────────────────────────────────\n\nexport interface Deck {\n /** Stable id. Required even when persistence is in-memory. */\n id: string;\n /** Human title — shown in the editor chrome + browser tab. */\n title: string;\n /** Ordered slide list. The viewer steps through in this order. */\n slides: Slide[];\n /** Visual theme for the whole deck. */\n theme: Theme;\n /**\n * Schema version the deck was authored against. Omitted == version 1 (the\n * implicit version for decks created before versioning). Used by the\n * serialize / parse helpers to migrate older shapes forward. Mirrors\n * `dark-slide`'s `Schema::SCHEMA_VERSION`.\n */\n version?: number;\n /** Free-form metadata — `{ author, createdAt, updatedAt, tags, … }`. */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Current deck schema version. Bump when a structural change needs migration on\n * load. Kept in lockstep with the sibling `dark-slide` PHP package.\n */\nexport const SCHEMA_VERSION = 1;\n\n// ─── Slide ─────────────────────────────────────────────────────────────────\n\n/** Layout presets that pre-populate / constrain element placement. */\nexport type SlideLayout =\n | \"blank\" // empty canvas, free placement\n | \"title\" // centered title\n | \"title-content\" // title at top, content area below\n | \"two-column\" // left + right halves\n | \"section-divider\" // section header with subtitle\n | \"image-text\" // image left, text right\n | \"text-image\" // text left, image right\n | \"quote\"; // big centered quote\n\nexport interface Slide {\n /** Stable id. */\n id: string;\n /** Optional layout preset. Mostly used by agents — humans tend to free-place. */\n layout?: SlideLayout;\n /** Elements rendered on the slide in z-order (last on top). */\n elements: SlideElement[];\n /** Background fill — color, image, or gradient. Inherits from theme when absent. */\n background?: SlideBackground;\n /** Entrance transition for this slide. Inherits from theme.transition when absent. */\n transition?: SlideTransition;\n /** Speaker notes — markdown. */\n notes?: string;\n /** Free-form metadata — `{ title, tags, durationSec, … }`. */\n metadata?: Record<string, unknown>;\n}\n\n// ─── Elements ──────────────────────────────────────────────────────────────\n\n/**\n * Every element is positioned in slide-relative coordinates (0..1). x/y are\n * the top-left corner; w/h are width/height as a fraction of the slide.\n */\nexport interface ElementBase {\n /** Stable id. Agents reference elements by id. */\n id: string;\n /** Element kind — discriminator. */\n type: SlideElement[\"type\"];\n /** Left edge, 0..1 (fraction of slide width). */\n x: number;\n /** Top edge, 0..1 (fraction of slide height). */\n y: number;\n /** Width, 0..1. */\n w: number;\n /** Height, 0..1. */\n h: number;\n /** Rotation in degrees, clockwise. */\n rotation?: number;\n /** Z-order — higher renders on top. Falls back to array order when undefined. */\n z?: number;\n /** Lock from editing. */\n locked?: boolean;\n /** Hide on this slide (still in the data — for animated reveals). */\n hidden?: boolean;\n /**\n * Whole-element hyperlink. When set, the element becomes a click target in\n * the viewer (opens in a new tab) and the pptx writer emits an\n * `<a:hlinkClick>` on the shape / picture. For rich inline links *within*\n * text, use a markdown `[label](url)` in the text content instead.\n */\n href?: string;\n /** Entrance build animation — when present the element participates in the slide's build sequence. */\n animation?: ElementAnimation;\n}\n\n// ─── Element entrance animations (builds) ────────────────────────────────────\n\n/** Visual entrance effect played when an element builds onto the slide. */\nexport type AnimationEffect = \"fade\" | \"fly-in\" | \"zoom\" | \"wipe\";\n\n/** When an element's build fires relative to the surrounding builds. */\nexport type AnimationTrigger = \"on-click\" | \"with-prev\" | \"after-prev\";\n\n/**\n * Per-element entrance animation (\"build step\"). Elements with an `animation`\n * start hidden and reveal as the presenter advances through the slide's build\n * sequence. The shape is shared with the sibling `dark-slide` PHP package, so\n * keep it byte-for-byte aligned.\n */\nexport interface ElementAnimation {\n /** Visual effect. */\n effect: AnimationEffect;\n /** When the build fires relative to its neighbours. Default `\"on-click\"`. */\n trigger?: AnimationTrigger;\n /** Direction for `fly-in` / `wipe`. Default `\"left\"`. */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n /** Effect duration in ms. Default `500`. */\n duration?: number;\n /** Delay before the effect starts, in ms. Default `0`. */\n delay?: number;\n /** Build order within the slide, ascending; ties broken by element array index. */\n order?: number;\n /**\n * Reveal a TEXT element one paragraph/line at a time (PowerPoint/Google\n * Slides \"By paragraph\"). The element expands into one build per paragraph\n * — the element's `content` split on `\"\\n\"` (a trailing empty line is\n * dropped). The first paragraph uses this animation's `trigger`; every\n * subsequent paragraph reveals on a fresh click. Only meaningful for text\n * elements; ignored for other types and when the element has 0/1 paragraphs\n * (then it behaves like a normal single build).\n */\n byParagraph?: boolean;\n}\n\nexport interface TextElement extends ElementBase {\n type: \"text\";\n /** Content — markdown by default; can also be plain text or HTML. */\n content: string;\n /** Content format. Defaults to `\"markdown\"`. */\n format?: \"markdown\" | \"html\" | \"plain\";\n /** Typography. */\n style?: TextStyle;\n}\n\nexport interface TextStyle {\n /** Font family — falls back to theme.fonts.body. */\n fontFamily?: string;\n /** Font size in px at the slide's design width (theme.slideWidth). */\n fontSize?: number;\n /** Font weight (`100..900`, or `\"normal\" | \"bold\"`). */\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | number;\n /** Horizontal alignment. */\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n /** Vertical alignment within the box. */\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n /** Color (any CSS color). Falls back to theme.colors.text. */\n color?: string;\n /** Line height (multiplier). */\n lineHeight?: number;\n /** Italic. */\n italic?: boolean;\n /** Underline. */\n underline?: boolean;\n}\n\nexport interface ImageElement extends ElementBase {\n type: \"image\";\n /** Image URL or data URI. */\n src: string;\n /** Alt text for accessibility. */\n alt?: string;\n /** How the image is fit inside its box. */\n fit?: \"contain\" | \"cover\" | \"fill\" | \"scale-down\";\n /** Optional crop window (slide-relative). */\n crop?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface ChartElement extends ElementBase {\n type: \"chart\";\n /** Apache ECharts option object. Passed straight to `<EChart>`. */\n option: Record<string, unknown>;\n /** Theme name passed to `<EChart>`. */\n chartTheme?: string;\n}\n\nexport interface CodeElement extends ElementBase {\n type: \"code\";\n /** Source code. */\n code: string;\n /** Language alias for the highlighter. */\n language?: string;\n /** Show line numbers. Defaults to `true`. */\n lineNumbers?: boolean;\n /** Theme — `\"light\"`, `\"dark\"`, `\"auto\"`, or a custom registered name. */\n codeTheme?: string;\n}\n\nexport interface TableElement extends ElementBase {\n type: \"table\";\n /** Column definitions — `{ key, label }`. */\n columns: Array<{ key: string; label: string }>;\n /** Row data — array of objects keyed by column. */\n rows: Array<Record<string, unknown>>;\n}\n\nexport type ShapeKind = \"rect\" | \"rounded-rect\" | \"ellipse\" | \"line\" | \"arrow\" | \"triangle\";\n\nexport interface ShapeElement extends ElementBase {\n type: \"shape\";\n shape: ShapeKind;\n /** Fill color (any CSS color, or `\"none\"`). */\n fill?: string;\n /** Stroke color. */\n stroke?: string;\n /** Stroke width in px at the slide's design width. */\n strokeWidth?: number;\n /** Dashed stroke. */\n dashed?: boolean;\n /** Corner radius (px) for `rect` / `rounded-rect`. */\n radius?: number;\n}\n\nexport interface EmbedElement extends ElementBase {\n type: \"embed\";\n /** Embed URL — typically a video, dashboard, or fancy-screens Screen. */\n src: string;\n /** iframe `title` for accessibility. */\n title?: string;\n /** Sandbox attribute. Defaults to allow-scripts (no allow-same-origin). */\n sandbox?: string;\n}\n\nexport type SlideElement =\n | TextElement\n | ImageElement\n | ChartElement\n | CodeElement\n | TableElement\n | ShapeElement\n | EmbedElement;\n\n// ─── Background, transitions, theme ────────────────────────────────────────\n\nexport interface SlideBackground {\n /** Solid color, or `\"transparent\"` to inherit theme. */\n color?: string;\n /** Image background URL. Takes precedence over color when present. */\n image?: string;\n /** How the background image is fit. Defaults to `\"cover\"`. */\n imageFit?: \"contain\" | \"cover\" | \"fill\";\n /** Optional gradient — `\"linear-gradient(...)\"` or `\"radial-gradient(...)\"` string. */\n gradient?: string;\n}\n\nexport type TransitionKind = \"none\" | \"fade\" | \"slide\" | \"zoom\";\n\nexport interface SlideTransition {\n kind: TransitionKind;\n /** Duration in ms. */\n duration?: number;\n /** Direction for `slide` transitions. */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n}\n\nexport interface Theme {\n /** Theme name — used for serialization + agent routing. */\n name: string;\n /** Aspect ratio — defaults to 16:9. Custom themes can pick anything. */\n aspectRatio?: number;\n /** Design width in px. Slides scale to fit; this just sets the unit base for fontSize/strokeWidth. */\n slideWidth?: number;\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n /** Default transition for slides that don't specify their own. */\n defaultTransition?: SlideTransition;\n}\n\nexport interface ThemeColors {\n background?: string;\n text?: string;\n muted?: string;\n accent?: string;\n surface?: string;\n}\n\nexport interface ThemeFonts {\n /** Used for `Heading`-like text elements (the default for large fontSize). */\n heading?: string;\n /** Used for body text. */\n body?: string;\n /** Used by CodeElement. */\n mono?: string;\n}\n\n// ─── Agent / Human+ surface ────────────────────────────────────────────────\n\n/**\n * Agent activity broadcast whenever the deck mutates. Hosts subscribe to feed\n * an AgentPanel, presence layer, or audit log.\n */\nexport interface DeckActivity {\n /** Stable activity id. */\n id: string;\n /** Wall-clock timestamp. */\n at: number;\n /** Who made the change. */\n actor: { kind: \"human\" | \"agent\"; id: string; name?: string; color?: string };\n /** What changed. */\n op: DeckOp;\n}\n\nexport type DeckOp =\n | { kind: \"deck_set_title\"; title: string }\n | { kind: \"deck_apply_theme\"; theme: Theme }\n | { kind: \"slide_add\"; index: number; slide: Slide }\n | { kind: \"slide_remove\"; id: string }\n | { kind: \"slide_reorder\"; id: string; toIndex: number }\n | { kind: \"slide_set_layout\"; id: string; layout: SlideLayout }\n | { kind: \"slide_set_notes\"; id: string; notes: string }\n | { kind: \"slide_set_background\"; id: string; background?: SlideBackground }\n | { kind: \"slide_set_transition\"; id: string; transition?: SlideTransition }\n | { kind: \"element_add\"; slideId: string; element: SlideElement }\n | { kind: \"element_remove\"; slideId: string; elementId: string }\n | { kind: \"element_update\"; slideId: string; elementId: string; patch: Partial<SlideElement> }\n | { kind: \"element_move\"; slideId: string; elementId: string; x: number; y: number }\n | { kind: \"element_resize\"; slideId: string; elementId: string; w: number; h: number }\n | { kind: \"element_set_animation\"; slideId: string; elementId: string; animation?: ElementAnimation };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/default-theme.ts","../src/theme/theme-utils.ts","../src/utils/cn.ts","../src/utils/builds.ts","../src/components/Slide/builds-style.ts","../src/components/elements/TextElement/editor-preset.ts","../src/components/elements/TextElement/TextElement.tsx","../src/components/elements/ImageElement/ImageElement.tsx","../src/components/elements/ShapeElement/ShapeElement.tsx","../src/components/Slide/Slide.tsx","../src/hooks/use-slide-keyboard.ts","../src/components/SlideViewer/SlideViewer.tsx","../src/components/PresenterView/PresenterView.tsx","../src/components/SlideThumbnail/SlideThumbnail.tsx","../src/utils/ids.ts","../src/hooks/use-deck-state.ts","../src/utils/chart-presets.ts","../src/components/SlideRail/SlideRail.tsx","../src/components/EditorToolbar/EditorToolbar.tsx","../src/components/ElementInspector/ElementInspector.tsx","../src/components/SpeakerNotes/SpeakerNotes.tsx","../src/components/DeckEditor/DeckEditor.tsx","../src/types.ts","../src/utils/serialize.ts"],"names":["DEFAULT_BUILD_DURATION","jsx","jsxs","useEffect","useState","useRef","EASE","useCallback","useMemo","slideId","Action","Text","Fragment","clamp","Separator","Heading","Textarea"],"mappings":"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","file":"index.js","sourcesContent":["import type { Theme } from \"../types\";\n\n/**\n * The default Fancy UI deck theme. Conservative neutral palette, modern\n * geometric typography, 16:9 ratio. Custom themes can extend this — see\n * `defineTheme()` in `./theme-utils`.\n */\nexport const defaultTheme: Theme = {\n name: \"default\",\n aspectRatio: 16 / 9,\n slideWidth: 1920,\n colors: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#64748b\",\n accent: \"#8b5cf6\",\n surface: \"#f8fafc\",\n },\n fonts: {\n heading: '\"Instrument Sans\", ui-sans-serif, system-ui, sans-serif',\n body: '\"Instrument Sans\", ui-sans-serif, system-ui, sans-serif',\n mono: 'ui-monospace, \"JetBrains Mono\", \"Fira Code\", monospace',\n },\n defaultTransition: { kind: \"fade\", duration: 200 },\n};\n\n/** Dark inverse of the default theme. */\nexport const darkTheme: Theme = {\n ...defaultTheme,\n name: \"dark\",\n colors: {\n background: \"#0b1220\",\n text: \"#f8fafc\",\n muted: \"#94a3b8\",\n accent: \"#a855f7\",\n surface: \"#1e293b\",\n },\n};\n\n/** A loud, brand-forward theme — handy for marketing decks. */\nexport const vividTheme: Theme = {\n ...defaultTheme,\n name: \"vivid\",\n colors: {\n background: \"#0f172a\",\n text: \"#f8fafc\",\n muted: \"#cbd5e1\",\n accent: \"#22d3ee\",\n surface: \"#1e293b\",\n },\n};\n\nexport const builtinThemes: Record<string, Theme> = {\n default: defaultTheme,\n dark: darkTheme,\n vivid: vividTheme,\n};\n","import type { Theme } from \"../types\";\nimport { defaultTheme } from \"./default-theme\";\n\n/**\n * Merge a partial theme with the defaults so consumers can override just the\n * pieces they care about (colors, fonts, aspect ratio) and inherit the rest.\n */\nexport function defineTheme(overrides: Partial<Theme> & { name: string }): Theme {\n return {\n ...defaultTheme,\n ...overrides,\n colors: { ...defaultTheme.colors, ...overrides.colors },\n fonts: { ...defaultTheme.fonts, ...overrides.fonts },\n defaultTransition: overrides.defaultTransition ?? defaultTheme.defaultTransition,\n };\n}\n\n/** Resolve the effective theme for a deck — applies the default for any missing fields. */\nexport function resolveTheme(theme: Theme | undefined): Theme {\n if (!theme) return defaultTheme;\n return defineTheme(theme);\n}\n","/**\n * Tiny class-name joiner. Avoids pulling clsx as a dep for this small package.\n */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n","/**\n * Build (entrance-animation) sequencing — the shared model used by both\n * `SlideViewer` and `PresenterView` so step-through behaves identically.\n *\n * A slide's *builds* are the elements that carry an `animation`. They are\n * stable-sorted by `(order ?? 0)` then original element array index, then\n * grouped into *click steps*:\n *\n * - The first build, and every build whose trigger is `\"on-click\"`, starts\n * a NEW step.\n * - `\"with-prev\"` plays simultaneously with the current step's lead.\n * - `\"after-prev\"` plays after a delay equal to the current step's lead\n * duration (chained onto its `delay`).\n *\n * `buildStep` semantics (used by the viewer/presenter):\n * - `0` → nothing built yet; only non-animated elements are visible.\n * - `n` → the first `n` steps have fired; their elements are visible.\n * - `totalSteps` → every build is shown (the fully-built slide).\n */\n\nimport type { ElementAnimation, Slide, SlideElement } from \"../types\";\n\n/** One element participating in a build, paired with its (defaulted) animation. */\nexport interface Build {\n element: SlideElement;\n animation: ElementAnimation;\n /** Original index of the element in the slide's `elements` array (tie-breaker). */\n index: number;\n /**\n * For a \"by paragraph\" text build, which paragraph index (0-based) this\n * build reveals. Undefined for whole-element builds. The renderer uses this\n * to show \"the first K paragraphs of this element\".\n */\n paraIndex?: number;\n}\n\n/**\n * Split a text element's `content` into paragraphs for a \"by paragraph\" build.\n * Splits on `\"\\n\"` and drops a single trailing empty line (so content ending in\n * a newline doesn't manifest a phantom blank build). Empty interior lines are\n * preserved — they still consume a click, matching PowerPoint's behaviour.\n */\nexport function splitParagraphs(content: string): string[] {\n const lines = content.split(\"\\n\");\n if (lines.length > 1 && lines[lines.length - 1] === \"\") lines.pop();\n return lines;\n}\n\n/**\n * Whether an element expands into per-paragraph builds: a text element whose\n * animation has `byParagraph` and that splits into 2+ paragraphs. With 0/1\n * paragraphs it behaves like a normal single build.\n */\nexport function isByParagraph(element: SlideElement, animation: ElementAnimation): boolean {\n if (!animation.byParagraph || element.type !== \"text\") return false;\n return splitParagraphs(element.content).length > 1;\n}\n\n/** A click step — the set of builds revealed by a single forward advance. */\nexport interface BuildStep {\n /** Builds that reveal on this step (lead first, then with-prev / after-prev). */\n builds: Build[];\n}\n\nconst DEFAULT_BUILD_DURATION = 500;\n\n/**\n * Collect a slide's builds in resolved order: every element with an\n * `animation`, stable-sorted by `(order ?? 0)` then array index.\n */\nexport function collectBuilds(slide: Slide | undefined): Build[] {\n if (!slide) return [];\n const builds: Build[] = [];\n slide.elements.forEach((element, index) => {\n if (element.animation) {\n builds.push({ element, animation: element.animation, index });\n }\n });\n // Stable sort: Array.prototype.sort is stable in modern engines, but we\n // tie-break on the captured array index explicitly to be safe.\n const ordered = builds.sort((a, b) => {\n const ao = a.animation.order ?? 0;\n const bo = b.animation.order ?? 0;\n if (ao !== bo) return ao - bo;\n return a.index - b.index;\n });\n\n // Expand \"by paragraph\" text builds into one build per paragraph. The first\n // paragraph keeps the element's own trigger (so it can be with-prev /\n // after-prev relative to a prior element); every subsequent paragraph is\n // \"on-click\" — one line per click. They stay contiguous, so the rest of an\n // element's paragraphs fire before the next element's builds.\n const expanded: Build[] = [];\n for (const build of ordered) {\n if (isByParagraph(build.element, build.animation)) {\n const paras = splitParagraphs((build.element as { content: string }).content);\n paras.forEach((_, paraIndex) => {\n const animation: ElementAnimation =\n paraIndex === 0 ? build.animation : { ...build.animation, trigger: \"on-click\" };\n expanded.push({ element: build.element, animation, index: build.index, paraIndex });\n });\n } else {\n expanded.push(build);\n }\n }\n return expanded;\n}\n\n/**\n * Group a slide's builds into click steps. The first build always opens a\n * step; thereafter an `\"on-click\"` trigger opens a new step while\n * `\"with-prev\"` / `\"after-prev\"` attach to the current one.\n */\nexport function buildSteps(slide: Slide | undefined): BuildStep[] {\n const builds = collectBuilds(slide);\n const steps: BuildStep[] = [];\n for (const build of builds) {\n const trigger = build.animation.trigger ?? \"on-click\";\n if (steps.length === 0 || trigger === \"on-click\") {\n steps.push({ builds: [build] });\n } else {\n steps[steps.length - 1]!.builds.push(build);\n }\n }\n return steps;\n}\n\n/** Total number of click steps for a slide (0 when the slide has no builds). */\nexport function totalBuildSteps(slide: Slide | undefined): number {\n return buildSteps(slide).length;\n}\n\n/**\n * Given a slide and a `buildStep` (0..totalSteps), return the set of element\n * ids that should be VISIBLE. Elements with no animation are always visible;\n * animated elements become visible once their owning step has fired.\n */\nexport function visibleElementIds(slide: Slide | undefined, buildStep: number): Set<string> {\n const visible = new Set<string>();\n if (!slide) return visible;\n const steps = buildSteps(slide);\n const stepOfElement = new Map<string, number>(); // 1-based step at which an element FIRST reveals\n steps.forEach((step, i) => {\n for (const b of step.builds) {\n // For by-paragraph builds many builds share one element id; the\n // element is visible once its earliest (first paragraph) step fires.\n if (!stepOfElement.has(b.element.id)) stepOfElement.set(b.element.id, i + 1);\n }\n });\n for (const element of slide.elements) {\n const revealStep = stepOfElement.get(element.id);\n if (revealStep === undefined) {\n visible.add(element.id); // no animation → always visible\n } else if (buildStep >= revealStep) {\n visible.add(element.id); // step has fired\n }\n }\n return visible;\n}\n\n/**\n * Per-element paragraph reveal state for a \"by paragraph\" text build at a given\n * `buildStep`. Keyed by element id:\n * - `revealed` — how many paragraphs (0..count) should be shown so far.\n * - `firingParaIndex` — the paragraph index revealing on the step that just\n * fired (so the renderer plays its entrance effect), or `undefined` when no\n * paragraph of this element fires on `buildStep`.\n * Only elements that actually expand by-paragraph appear in the map.\n */\nexport interface ParaReveal {\n revealed: number;\n firingParaIndex?: number;\n}\n\nexport function paragraphReveals(slide: Slide | undefined, buildStep: number): Map<string, ParaReveal> {\n const out = new Map<string, ParaReveal>();\n if (!slide) return out;\n const steps = buildSteps(slide);\n steps.forEach((step, i) => {\n const stepNum = i + 1; // 1-based\n for (const b of step.builds) {\n if (b.paraIndex === undefined) continue;\n const fired = buildStep >= stepNum;\n const prev = out.get(b.element.id) ?? { revealed: 0 };\n if (fired) {\n prev.revealed = Math.max(prev.revealed, b.paraIndex + 1);\n if (stepNum === buildStep) prev.firingParaIndex = b.paraIndex;\n }\n out.set(b.element.id, prev);\n }\n });\n return out;\n}\n\n/**\n * The builds that fire when advancing INTO `buildStep` (1-based). Returns the\n * lead build first; the viewer uses `with-prev` / `after-prev` to compute each\n * element's effective `delay`. Empty when `buildStep` is out of range.\n */\nexport function buildsForStep(slide: Slide | undefined, buildStep: number): Build[] {\n const steps = buildSteps(slide);\n const step = steps[buildStep - 1];\n return step ? step.builds : [];\n}\n\n/**\n * Compute the effective entrance delay (ms) for each build within a step,\n * honouring `with-prev` (0 extra) and `after-prev` (lead duration). The lead\n * build keeps its own `delay`; followers add to it. Keyed by element id.\n */\nexport function stepDelays(builds: Build[]): Map<string, number> {\n const delays = new Map<string, number>();\n const lead = builds[0];\n if (!lead) return delays;\n const leadDelay = lead.animation.delay ?? 0;\n const leadDuration = lead.animation.duration ?? DEFAULT_BUILD_DURATION;\n delays.set(lead.element.id, leadDelay);\n for (let i = 1; i < builds.length; i++) {\n const b = builds[i]!;\n const own = b.animation.delay ?? 0;\n const trigger = b.animation.trigger ?? \"on-click\";\n // with-prev → simultaneous with lead; after-prev → starts after lead finishes.\n const base = trigger === \"after-prev\" ? leadDelay + leadDuration : leadDelay;\n delays.set(b.element.id, base + own);\n }\n return delays;\n}\n","/**\n * Pure-CSS entrance animations for element builds. Mirrors the slide-level\n * transition approach in `SlideViewer`: a set of keyframes wrapped in a\n * `prefers-reduced-motion: no-preference` guard, plus a helper that picks the\n * right `animation-name` + timing for a given element animation.\n *\n * No runtime deps — keyframes are injected via a `<style>` tag by `<Slide>`.\n */\n\nimport type { CSSProperties } from \"react\";\nimport type { ElementAnimation } from \"../../types\";\n\nconst DEFAULT_BUILD_DURATION = 500;\nconst EASE = \"cubic-bezier(0.16, 1, 0.3, 1)\"; // ease-out\n\n/**\n * Inline style that plays an element's entrance build. `delay` is the\n * *effective* delay already resolved for with-prev / after-prev chaining.\n * Under reduced-motion the keyframes are disabled in CSS, so the element\n * simply appears at its final frame.\n */\nexport function buildEnterStyle(animation: ElementAnimation, effectiveDelay: number): CSSProperties {\n const duration = animation.duration ?? DEFAULT_BUILD_DURATION;\n const dir = animation.direction ?? \"left\";\n let name: string;\n switch (animation.effect) {\n case \"fade\":\n name = \"fs-build-fade\";\n break;\n case \"zoom\":\n name = \"fs-build-zoom\";\n break;\n case \"fly-in\":\n name = `fs-build-fly-${dir}`;\n break;\n case \"wipe\":\n name = `fs-build-wipe-${dir}`;\n break;\n default:\n name = \"fs-build-fade\";\n }\n return {\n animationName: name,\n animationDuration: `${duration}ms`,\n animationDelay: `${effectiveDelay}ms`,\n animationTimingFunction: EASE,\n animationFillMode: \"both\",\n };\n}\n\n/**\n * Keyframes for every build effect. `fly-in` translates from the named\n * direction; `wipe` reveals via a `clip-path` inset growing from that edge.\n * Reduced-motion users get no animation — `animation-fill-mode: both` would\n * otherwise pin the `from` frame, so we disable the build animations entirely\n * (the elements are still gated on clicks, they just appear instantly).\n */\nexport const BUILD_KEYFRAMES = `\n@media (prefers-reduced-motion: reduce) {\n .fs-build-enter { animation: none !important; }\n}\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fs-build-fade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes fs-build-zoom {\n from { opacity: 0; transform: scale(0.8); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes fs-build-fly-left {\n from { opacity: 0; transform: translateX(-24%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-build-fly-right {\n from { opacity: 0; transform: translateX(24%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-build-fly-up {\n from { opacity: 0; transform: translateY(24%); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes fs-build-fly-down {\n from { opacity: 0; transform: translateY(-24%); }\n to { opacity: 1; transform: translateY(0); }\n }\n /* wipe: clip-path inset reveals from the named edge toward the opposite one.\n inset(top right bottom left) — start fully clipped on the far side. */\n @keyframes fs-build-wipe-left {\n from { clip-path: inset(0 100% 0 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-right {\n from { clip-path: inset(0 0 0 100%); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-up {\n from { clip-path: inset(100% 0 0 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n @keyframes fs-build-wipe-down {\n from { clip-path: inset(0 0 100% 0); }\n to { clip-path: inset(0 0 0 0); }\n }\n}\n`;\n","import type { EditorAction } from \"@particle-academy/react-fancy\";\n\n/**\n * Presentation-tuned toolbar preset for the react-fancy `Editor` used to edit\n * slide text inline. Only commands that round-trip cleanly through the editor's\n * `htmlToMarkdown` output are included — bold (`**`), italic (`*`), heading\n * (`## `), and bullet list (`- `). Box-level typography (alignment, color, font\n * size, line height) is NOT here: those are per-element `TextStyle` properties\n * edited in the ElementInspector, and `text-align`/color spans don't survive the\n * markdown the slide content commits to.\n */\nexport const PRESENTATION_EDITOR_ACTIONS: EditorAction[] = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"H\", label: \"Heading\", command: \"formatBlock\", commandArg: \"<h2>\" },\n { icon: \"P\", label: \"Paragraph\", command: \"formatBlock\", commandArg: \"<p>\" },\n { icon: \"•\", label: \"Bullet list\", command: \"insertUnorderedList\" },\n];\n\n/**\n * Normalize the `Editor`'s markdown output to the *line-based* paragraph model\n * the slide content commits to. The editor emits a blank line (`\\n\\n`) between\n * `<p>` blocks, but `splitParagraphs` (and the dark-slide pptx writer) treat a\n * single `\\n` as one paragraph / build unit, and a blank interior line as its\n * own (phantom) build. Collapsing runs of newlines to a single `\\n` keeps\n * \"by paragraph\" reveals and per-paragraph pptx builds correct — bullets are\n * already one-per-`\\n`, so they're unaffected. The round-trip invariant\n * (`content → Editor → normalize → content` preserves the `\\n` paragraph count)\n * is covered by a unit test.\n */\nexport function normalizeSlideMarkdown(md: string): string {\n return md\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{2,}/g, \"\\n\")\n .replace(/[ \\t]+$/gm, \"\")\n .trim();\n}\n","import { useId, type CSSProperties } from \"react\";\nimport { ContentRenderer, Editor } from \"@particle-academy/react-fancy\";\nimport type { TextElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\nimport { splitParagraphs, type ParaReveal } from \"../../../utils/builds\";\nimport { buildEnterStyle } from \"../../Slide/builds-style\";\nimport { PRESENTATION_EDITOR_ACTIONS, normalizeSlideMarkdown } from \"./editor-preset\";\n\nexport interface TextElementRendererProps {\n element: TextElement;\n theme?: Theme;\n /** Rendered slide width in px (for font-size scaling). */\n slideWidthPx: number;\n /**\n * Edit mode — when true, the element is potentially editable.\n * The textarea actually becomes pointer-interactive only when both\n * `editing` and `selected` are true, so the first click on an\n * unselected text element selects it (handled by the parent Slide)\n * rather than landing on the textarea.\n */\n editing?: boolean;\n /** Element is selected — gates whether the textarea grabs pointer events. */\n selected?: boolean;\n /** Called when the user edits the content (only fires when the textarea is focusable). */\n onContentChange?: (content: string) => void;\n /**\n * By-paragraph reveal state, set by `<Slide>` in viewer mode when this text\n * element has a `byParagraph` animation. When present, the renderer splits\n * `content` on `\"\\n\"` and shows only the first `revealed` paragraphs,\n * animating the one at `firingParaIndex`. Ignored in editing mode (the full\n * text always renders so authors can position/edit it).\n */\n paraReveal?: ParaReveal;\n}\n\n/**\n * Renderer for `text` elements. Three formats:\n *\n * - `\"markdown\"` (default) — parsed via react-fancy's ContentRenderer.\n * Bullets, bold/italic, code spans, links, headings.\n * - `\"html\"` — parsed sanitized HTML via ContentRenderer's html path.\n * - `\"plain\"` — raw text rendered into a single block; preserves newlines\n * via `white-space: pre-wrap`.\n *\n * In editing mode + when the element is selected, the renderer swaps to a\n * textarea showing the raw source. Edits flow back via `onContentChange`.\n */\nexport function TextElementRenderer({\n element,\n theme,\n slideWidthPx,\n editing = false,\n selected = false,\n onContentChange,\n paraReveal,\n}: TextElementRendererProps) {\n const t = resolveTheme(theme);\n const style = element.style ?? {};\n const designWidth = t.slideWidth ?? 1920;\n const scale = slideWidthPx / designWidth;\n const format = element.format ?? \"markdown\";\n const scopeId = useId();\n\n const css: CSSProperties = {\n fontFamily: style.fontFamily ?? t.fonts?.body,\n fontSize: `${(style.fontSize ?? 28) * scale}px`,\n fontWeight: weight(style.weight) ?? 400,\n fontStyle: style.italic ? \"italic\" : \"normal\",\n textDecoration: style.underline ? \"underline\" : \"none\",\n color: style.color ?? t.colors?.text,\n textAlign: style.align ?? \"left\",\n lineHeight: style.lineHeight ?? 1.4,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent:\n style.verticalAlign === \"middle\" ? \"center\" : style.verticalAlign === \"bottom\" ? \"flex-end\" : \"flex-start\",\n width: \"100%\",\n height: \"100%\",\n padding: 0,\n margin: 0,\n outline: \"none\",\n background: \"transparent\",\n whiteSpace: format === \"plain\" ? \"pre-wrap\" : \"normal\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n };\n\n // Edit mode is gated by selection: an unselected element in the editor\n // still shows the parsed markdown so the user sees the real layout.\n // Clicking selects → the react-fancy Editor appears, a WYSIWYG rich-text\n // surface tuned for presentations (bold / italic / heading / bullets).\n // Edits emit markdown, normalized to the line-based paragraph model the\n // slide content + dark-slide writer commit to. The Editor is keyed by the\n // element id because it loads its value once on mount (it's uncontrolled\n // after that), so selecting a different element remounts it with the right\n // content. Scoped CSS strips the Editor's card chrome and matches the\n // element's scaled typography so editing looks like the live slide.\n if (editing && selected) {\n const fontPx = Math.round((style.fontSize ?? 28) * scale);\n const lh = style.lineHeight ?? 1.4;\n const editScope = scopeId;\n return (\n <div\n data-fs-edit-scope={editScope}\n style={{\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n textAlign: style.align ?? \"left\",\n color: style.color ?? t.colors?.text,\n fontFamily: style.fontFamily ?? t.fonts?.body,\n }}\n // Keep editing interactions (toolbar clicks, text selection) from\n // bubbling to the Slide's element drag / deselect handlers.\n onPointerDown={(e) => e.stopPropagation()}\n >\n <style>{`\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor] {\n border: none; background: transparent; border-radius: 0;\n height: 100%; display: flex; flex-direction: column; overflow: hidden;\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-toolbar] {\n background: rgba(244,244,245,0.85); border-radius: 6px 6px 0 0;\n padding: 2px 4px;\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] {\n flex: 1; min-height: 0; padding: 4px 2px; overflow: auto;\n font-size: ${fontPx}px; line-height: ${lh};\n }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] :is(p, ul, ol, li) { font-size: inherit; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] :where(p, li) + :where(p, li, ul, ol) { margin-top: 0.4em; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h1 { font-size: 1.6em; font-weight: 700; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h2 { font-size: 1.35em; font-weight: 700; margin: 0; }\n [data-fs-edit-scope=\"${editScope}\"] [data-react-fancy-editor-content] h3 { font-size: 1.15em; font-weight: 600; margin: 0; }\n `}</style>\n <Editor\n key={element.id}\n value={element.content}\n onChange={(md) => onContentChange?.(normalizeSlideMarkdown(md))}\n outputFormat=\"markdown\"\n lineSpacing={lh}\n >\n <Editor.Toolbar actions={PRESENTATION_EDITOR_ACTIONS} />\n <Editor.Content />\n </Editor>\n </div>\n );\n }\n\n // Scope the ContentRenderer's prose styles so element-level typography\n // (fontSize, weight, align) wins over the global prose CSS. We render a\n // tiny inline style block that targets only this instance via the\n // generated useId scope.\n //\n // CRITICAL: ContentRenderer wraps its content in `text-sm` plus per-tag\n // Tailwind utilities (`[&_h1]:text-2xl`, etc). Those have higher\n // specificity than the inline `fontSize` we set on the wrapper, so\n // without forced overrides the slide text ignores `style.fontSize` AND\n // ignores the slide's resolution scaling — that's why thumbnails were\n // rendering text at ~14px instead of (fontSize × scale)px.\n //\n // We double the attribute-selector to outrank Tailwind's\n // `[&_h2]:text-xl`-style utilities, and re-express heading sizes in\n // `em` so they remain proportional as the slide scales.\n const proseScope = `[data-fs-text-scope=\"${scopeId}\"]`;\n const doubleScope = `${proseScope}${proseScope}`;\n const proseStyle = (\n <style>{`\n ${proseScope} > div { width: 100%; height: 100%; font-size: inherit; }\n ${doubleScope} :is(p, ul, ol, li, blockquote, h1, h2, h3, h4, h5, h6, pre, code, strong, em, a) {\n font-size: inherit;\n }\n ${doubleScope} h1 { font-size: 1.6em; font-weight: 700; }\n ${doubleScope} h2 { font-size: 1.35em; font-weight: 700; }\n ${doubleScope} h3 { font-size: 1.15em; font-weight: 600; }\n ${proseScope} :where(p, ul, ol, h1, h2, h3, h4, h5, h6, pre, blockquote) {\n margin: 0;\n padding: 0;\n }\n ${proseScope} :where(p, li) + :where(p, li, ul, ol) { margin-top: 0.4em; }\n ${proseScope} :where(ul, ol) { padding-left: 1.4em; }\n ${proseScope} :where(strong) { font-weight: ${Math.max(700, weight(style.weight) ?? 400 + 200)}; }\n ${proseScope} :where(a) { color: inherit; text-decoration: underline; }\n ${proseScope} :where(code) { font-family: ${t.fonts?.mono ?? \"monospace\"}; }\n `}</style>\n );\n\n // Render one chunk of content in the element's format. Reused for the whole\n // element and for each paragraph in a by-paragraph build.\n const renderChunk = (content: string) =>\n format === \"plain\" ? content : <ContentRenderer value={content} format={format === \"html\" ? \"html\" : \"markdown\"} />;\n\n // ─── By-paragraph build reveal ──────────────────────────────────────────\n // When `<Slide>` hands us a paraReveal, split the content and show only the\n // first `revealed` paragraphs, animating the one that just fired. We always\n // render the prose scope wrapper so markdown/html paragraphs keep their\n // typography. Each line of markdown renders through the same path, so a\n // bullet line (\"- …\") renders as its own list item.\n if (paraReveal) {\n const paras = splitParagraphs(element.content);\n return (\n <div data-fs-text-scope={scopeId} style={css}>\n {proseStyle}\n {paras.map((para, i) => {\n if (i >= paraReveal.revealed) return null; // not yet built\n const firing = i === paraReveal.firingParaIndex && !!element.animation;\n const enter = firing\n ? buildEnterStyle(element.animation!, element.animation!.delay ?? 0)\n : null;\n return (\n <div\n key={i}\n className={firing ? \"fs-build-enter\" : undefined}\n style={{ whiteSpace: format === \"plain\" ? \"pre-wrap\" : \"normal\", ...enter }}\n data-fancy-slides-paragraph={i}\n >\n {renderChunk(para)}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (format === \"plain\") {\n return <div style={css}>{element.content}</div>;\n }\n\n return (\n <div data-fs-text-scope={scopeId} style={css}>\n {proseStyle}\n <ContentRenderer value={element.content} format={format === \"html\" ? \"html\" : \"markdown\"} />\n </div>\n );\n}\n\nfunction weight(w: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | number | undefined): number | undefined {\n if (typeof w === \"number\") return w;\n if (w === \"normal\") return 400;\n if (w === \"medium\") return 500;\n if (w === \"semibold\") return 600;\n if (w === \"bold\") return 700;\n return undefined;\n}\n","import type { CSSProperties } from \"react\";\nimport type { ImageElement } from \"../../../types\";\n\nexport interface ImageElementRendererProps {\n element: ImageElement;\n}\n\n/**\n * Renders an image element. When `element.crop` is set (a window in\n * image-relative 0..1 coords `{x,y,w,h}`), the image is shown cropped to that\n * window: an `overflow:hidden` box clips an inner `<img>` that's been scaled up\n * by `1/w` × `1/h` and offset so the crop window exactly fills the box. Without\n * a crop it's the plain `object-fit` image. The same renderer feeds both the\n * editor canvas and the viewer, so a crop is visible everywhere.\n */\nexport function ImageElementRenderer({ element }: ImageElementRendererProps) {\n const crop = element.crop;\n const fit = element.fit ?? \"contain\";\n\n if (crop && crop.w > 0 && crop.h > 0) {\n // The inner image is scaled so the crop window (fraction w×h of the\n // image) fills 100% of the box; then translated so the window's\n // top-left aligns with the box's top-left.\n const inner: CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: 0,\n width: `${(1 / crop.w) * 100}%`,\n height: `${(1 / crop.h) * 100}%`,\n transform: `translate(${(-crop.x / crop.w) * 100}%, ${(-crop.y / crop.h) * 100}%)`,\n transformOrigin: \"top left\",\n objectFit: fit,\n display: \"block\",\n };\n return (\n <div style={{ position: \"relative\", width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>\n <img src={element.src} alt={element.alt ?? \"\"} style={inner} draggable={false} />\n </div>\n );\n }\n\n return (\n <img\n src={element.src}\n alt={element.alt ?? \"\"}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: fit,\n display: \"block\",\n }}\n draggable={false}\n />\n );\n}\n","import type { ShapeElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\n\nexport interface ShapeElementRendererProps {\n element: ShapeElement;\n theme?: Theme;\n slideWidthPx: number;\n}\n\n/**\n * SVG-rendered shape primitive. Sized to fill its element box; the box\n * decides world position via the parent Slide's positioning wrapper.\n */\nexport function ShapeElementRenderer({ element, theme, slideWidthPx }: ShapeElementRendererProps) {\n const t = resolveTheme(theme);\n const designWidth = t.slideWidth ?? 1920;\n const scale = slideWidthPx / designWidth;\n\n const fill = element.fill ?? \"rgba(139, 92, 246, 0.15)\";\n const stroke = element.stroke ?? t.colors?.accent ?? \"#8b5cf6\";\n const strokeWidth = (element.strokeWidth ?? 2) * scale;\n const dasharray = element.dashed ? `${6 * scale} ${4 * scale}` : undefined;\n\n // SVG uses a 0..100 viewBox so radius/strokeWidth are in box-relative units\n // and resolution-independent at render time.\n return (\n <svg\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n style={{ width: \"100%\", height: \"100%\", display: \"block\", overflow: \"visible\" }}\n >\n {renderShape(element, { fill, stroke, strokeWidth, dasharray })}\n </svg>\n );\n}\n\ninterface ShapeStyle {\n fill: string;\n stroke: string;\n strokeWidth: number;\n dasharray?: string;\n}\n\nfunction renderShape(el: ShapeElement, s: ShapeStyle) {\n // vectorEffect=\"non-scaling-stroke\" keeps the visible stroke at the\n // pixel width we asked for, regardless of how the parent SVG's\n // `preserveAspectRatio=\"none\"` stretches the viewBox. Without this,\n // narrow arrow / line boxes shrink the stroke into invisibility because\n // the y-axis is squashed.\n const common = {\n fill: s.fill,\n stroke: s.stroke,\n strokeWidth: s.strokeWidth,\n strokeDasharray: s.dasharray,\n vectorEffect: \"non-scaling-stroke\" as const,\n };\n switch (el.shape) {\n case \"rect\":\n return <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" {...common} />;\n case \"rounded-rect\": {\n const r = el.radius ?? 8;\n return <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" rx={r} ry={r} {...common} />;\n }\n case \"ellipse\":\n return <ellipse cx=\"50\" cy=\"50\" rx=\"50\" ry=\"50\" {...common} />;\n case \"triangle\":\n return <polygon points=\"50,0 100,100 0,100\" {...common} />;\n case \"line\":\n return <line x1=\"0\" y1=\"50\" x2=\"100\" y2=\"50\" {...common} fill=\"none\" />;\n case \"arrow\":\n // Render the arrow as a polyline shaft + an inline triangular\n // head built from the same SVG geometry. Avoids SVG markers,\n // which scale with stroke-width and turn into specks at tile\n // sizes.\n return (\n <g>\n <line x1=\"0\" y1=\"50\" x2=\"85\" y2=\"50\" {...common} fill=\"none\" />\n <polygon points=\"100,50 80,30 80,70\" fill={s.stroke} stroke=\"none\" />\n </g>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport type { ElementAnimation, Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\nimport { buildSteps, stepDelays, paragraphReveals, type ParaReveal } from \"../../utils/builds\";\nimport { TextElementRenderer } from \"../elements/TextElement\";\nimport { ImageElementRenderer } from \"../elements/ImageElement\";\nimport { ShapeElementRenderer } from \"../elements/ShapeElement\";\nimport { SlideContext, isDarkColor, type SlideContextValue } from \"./slide-context\";\nimport { BUILD_KEYFRAMES, buildEnterStyle } from \"./builds-style\";\n\nexport interface SlideProps {\n /** The slide to render. */\n slide: SlideData;\n /** Deck theme — controls fonts/colors/aspect-ratio when the slide doesn't override. */\n theme?: Theme;\n /** Pin the slide to this width in px. When omitted, the slide fills its container with auto-resize. */\n width?: number;\n /** Aspect ratio override — falls back to theme.aspectRatio. */\n aspectRatio?: number;\n /** Edit mode flag — passed to element renderers + enables drag/resize affordances. */\n editing?: boolean;\n /**\n * Current build step (0..totalSteps). `0` = nothing built (only non-animated\n * elements visible); each step reveals more animated elements. Omit (or pass\n * a number ≥ total) to show the fully-built slide. Ignored when `editing` —\n * the editor always shows every element so authors can position them.\n */\n buildStep?: number;\n /** Called when a text element's content is edited (only in editing mode). */\n onElementContentChange?: (elementId: string, content: string) => void;\n /** Called when an element is clicked — host-driven selection. */\n onElementSelect?: (elementId: string | null) => void;\n /** Selected element id — adds a focus ring and shows resize handles when editing. */\n selectedElementId?: string | null;\n /** Called when the user drags an element body to a new position (slide-relative 0..1). */\n onElementMove?: (elementId: string, x: number, y: number) => void;\n /** Called when the user resizes via a corner / edge handle (slide-relative 0..1). */\n onElementResize?: (elementId: string, patch: { x: number; y: number; w: number; h: number }) => void;\n /** Optional override renderer for a custom element type (or to replace one of the built-ins). */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Slide — the shared renderer. Used by SlideViewer, DeckEditor canvas,\n * SlideThumbnail, and the agent bridge's preview tools. All resolution-\n * independence lives here: child elements get a `slideWidthPx` so they can\n * scale font sizes / stroke widths to the rendered slide size.\n *\n * In `editing` mode this component grows two extra affordances:\n * - pointer-drag on an element body moves it\n * - selected elements show 8 resize handles (4 corners, 4 edges)\n *\n * Both fire through `onElementMove` / `onElementResize` so the host owns\n * the state — Slide stays a pure renderer.\n */\nexport function Slide({\n slide,\n theme,\n width,\n aspectRatio,\n editing = false,\n buildStep,\n onElementContentChange,\n onElementSelect,\n selectedElementId,\n onElementMove,\n onElementResize,\n renderElement,\n className,\n style,\n}: SlideProps) {\n const t = resolveTheme(theme);\n const ratio = aspectRatio ?? t.aspectRatio ?? 16 / 9;\n const ref = useRef<HTMLDivElement>(null);\n const [measured, setMeasured] = useState<number>(width ?? 0);\n\n // Auto-measure when width isn't pinned.\n useEffect(() => {\n if (width !== undefined) {\n setMeasured(width);\n return;\n }\n const el = ref.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n for (const e of entries) {\n setMeasured(e.contentRect.width);\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [width]);\n\n const slideWidthPx = measured || 1;\n const slideHeightPx = slideWidthPx / ratio;\n\n const bg = slide.background;\n // The effective background colour used both for the slide div's `background`\n // and for the dark-theme heuristic exposed via SlideContext.\n const effectiveBg =\n bg?.color ?? t.colors?.background ?? \"#ffffff\";\n const backgroundStyle: CSSProperties = {\n background: bg?.gradient\n ? bg.gradient\n : bg?.image\n ? `${bg.color ?? \"transparent\"} url(${bg.image}) center/${bg.imageFit ?? \"cover\"} no-repeat`\n : effectiveBg,\n };\n\n const slideContext = useMemo<SlideContextValue>(\n () => ({\n theme: t,\n isDark: isDarkColor(effectiveBg),\n slideWidthPx,\n }),\n [t, effectiveBg, slideWidthPx],\n );\n\n // ─── Build (entrance-animation) bookkeeping ─────────────────────────────\n // In editing mode builds never hide anything — authors must see/position\n // every element. Otherwise we resolve each animated element's reveal step\n // and the per-element entrance delay for the step currently firing.\n const buildInfo = useMemo(() => {\n if (editing) return null;\n const steps = buildSteps(slide);\n if (steps.length === 0) return null;\n const revealStep = new Map<string, number>(); // element id → FIRST 1-based step it reveals on\n steps.forEach((step, i) => {\n for (const b of step.builds) {\n // By-paragraph elements appear across multiple steps; the\n // element box becomes visible on its earliest paragraph's step.\n if (!revealStep.has(b.element.id)) revealStep.set(b.element.id, i + 1);\n }\n });\n // When `buildStep` is omitted (thumbnails, exports) the slide renders\n // fully built with NO entrance animation. When provided, the firing\n // step's elements animate in.\n const driven = buildStep !== undefined;\n const currentStep = driven ? buildStep : steps.length;\n const firing = driven ? steps[currentStep - 1] : undefined;\n const delays = firing ? stepDelays(firing.builds) : new Map<string, number>();\n // Per-element paragraph reveal state (by-paragraph text builds). When\n // undriven, every paragraph is revealed (fully-built, no animation).\n const paraReveals = driven\n ? paragraphReveals(slide, currentStep)\n : new Map<string, ParaReveal>();\n return { revealStep, currentStep, delays, paraReveals, driven };\n }, [editing, slide, buildStep]);\n\n return (\n <SlideContext.Provider value={slideContext}>\n <div\n ref={ref}\n className={cn(\"fs-slide\", className)}\n style={{\n width: width ? `${width}px` : \"100%\",\n height: width ? `${width / ratio}px` : `${slideHeightPx}px`,\n position: \"relative\",\n overflow: \"hidden\",\n color: t.colors?.text,\n ...backgroundStyle,\n ...style,\n }}\n data-fancy-slides-slide={slide.id}\n onClick={(e) => {\n if (e.target === e.currentTarget && onElementSelect) onElementSelect(null);\n }}\n >\n {buildInfo && <style>{BUILD_KEYFRAMES}</style>}\n {orderedElements(slide.elements).map((element) => {\n // Resolve build visibility / entrance animation for this element.\n let buildHidden = false;\n let buildAnimation: ElementAnimation | undefined;\n let buildDelay = 0;\n // By-paragraph reveal state for this element (text builds only).\n const paraReveal = buildInfo?.paraReveals.get(element.id);\n if (buildInfo) {\n const step = buildInfo.revealStep.get(element.id);\n if (step !== undefined) {\n if (buildInfo.currentStep < step) {\n buildHidden = true; // not yet built\n } else if (paraReveal) {\n // By-paragraph element: the box stays mounted from its\n // first paragraph onward; individual paragraphs hide /\n // animate inside the text renderer. No whole-box effect.\n } else if (buildInfo.currentStep === step && element.animation) {\n // Revealing on the step that just fired → play the effect.\n buildAnimation = element.animation;\n buildDelay = buildInfo.delays.get(element.id) ?? 0;\n }\n }\n }\n if (buildHidden) return null;\n return (\n <SlideElementHost\n key={element.id}\n element={element}\n theme={t}\n slideWidthPx={slideWidthPx}\n slideHeightPx={slideHeightPx}\n editing={editing}\n selected={selectedElementId === element.id}\n onContentChange={onElementContentChange}\n onSelect={onElementSelect}\n onMove={onElementMove}\n onResize={onElementResize}\n renderElement={renderElement}\n buildAnimation={buildAnimation}\n buildDelay={buildDelay}\n paraReveal={paraReveal}\n />\n );\n })}\n </div>\n </SlideContext.Provider>\n );\n}\n\ninterface SlideElementHostProps {\n element: SlideElement;\n theme: Theme;\n slideWidthPx: number;\n slideHeightPx: number;\n editing: boolean;\n selected: boolean;\n onContentChange?: (elementId: string, content: string) => void;\n onSelect?: (elementId: string | null) => void;\n onMove?: (elementId: string, x: number, y: number) => void;\n onResize?: (elementId: string, patch: { x: number; y: number; w: number; h: number }) => void;\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Entrance build animation to play (only set on the step the element reveals on). */\n buildAnimation?: ElementAnimation;\n /** Effective entrance delay (ms) resolved for with-prev / after-prev chaining. */\n buildDelay?: number;\n /** Per-paragraph reveal state for a by-paragraph text build (text elements only). */\n paraReveal?: ParaReveal;\n}\n\n/** Smallest allowed element size, as a fraction of the slide. */\nconst MIN_DIM = 0.02;\n\n/** Drag distance below which we treat the gesture as a click. */\nconst CLICK_DRAG_THRESHOLD_PX = 3;\n\ntype ResizeAnchor = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\ninterface DragState {\n mode: \"move\" | ResizeAnchor;\n startClientX: number;\n startClientY: number;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n didMove: boolean;\n}\n\nfunction SlideElementHost({\n element,\n theme,\n slideWidthPx,\n slideHeightPx,\n editing,\n selected,\n onContentChange,\n onSelect,\n onMove,\n onResize,\n renderElement,\n buildAnimation,\n buildDelay = 0,\n paraReveal,\n}: SlideElementHostProps) {\n const dragRef = useRef<DragState | null>(null);\n\n if (element.hidden) return null;\n\n const left = element.x * slideWidthPx;\n const top = element.y * slideHeightPx;\n const width = element.w * slideWidthPx;\n const height = element.h * slideHeightPx;\n\n const interactive = editing && !element.locked;\n const canMove = interactive && !!onMove;\n const canResize = interactive && !!onResize && selected;\n\n const startDrag = (mode: DragState[\"mode\"]) => (e: ReactPointerEvent<HTMLElement>) => {\n e.stopPropagation();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n dragRef.current = {\n mode,\n startClientX: e.clientX,\n startClientY: e.clientY,\n startX: element.x,\n startY: element.y,\n startW: element.w,\n startH: element.h,\n didMove: false,\n };\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n const dxPx = e.clientX - drag.startClientX;\n const dyPx = e.clientY - drag.startClientY;\n if (Math.hypot(dxPx, dyPx) >= CLICK_DRAG_THRESHOLD_PX) drag.didMove = true;\n const dx = dxPx / slideWidthPx;\n const dy = dyPx / slideHeightPx;\n if (drag.mode === \"move\") {\n if (!onMove) return;\n const maxX = 1 - element.w;\n const maxY = 1 - element.h;\n const nextX = clamp(drag.startX + dx, 0, Math.max(0, maxX));\n const nextY = clamp(drag.startY + dy, 0, Math.max(0, maxY));\n onMove(element.id, nextX, nextY);\n return;\n }\n if (!onResize) return;\n const patch = computeResize(drag, dx, dy);\n onResize(element.id, patch);\n };\n\n const endDrag = (e: ReactPointerEvent<HTMLElement>) => {\n const drag = dragRef.current;\n if (!drag) return;\n try {\n (e.target as HTMLElement).releasePointerCapture(e.pointerId);\n } catch {\n /* element may have unmounted; ignore */\n }\n const wasMove = drag.didMove;\n dragRef.current = null;\n if (!wasMove && onSelect) onSelect(element.id);\n };\n\n const box: CSSProperties = {\n position: \"absolute\",\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n transform: element.rotation ? `rotate(${element.rotation}deg)` : undefined,\n transformOrigin: \"center center\",\n zIndex: element.z ?? \"auto\",\n outline: selected ? \"2px solid #8b5cf6\" : undefined,\n outlineOffset: selected ? 2 : undefined,\n cursor: canMove ? \"move\" : interactive ? \"pointer\" : \"default\",\n touchAction: canMove ? \"none\" : undefined,\n ...(buildAnimation ? buildEnterStyle(buildAnimation, buildDelay) : null),\n };\n\n const rendered =\n renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange, paraReveal })\n ?? renderElement?.(element, slideWidthPx)\n ?? elementPlaceholder(element);\n\n // Whole-element hyperlink — a click target in the viewer (never while\n // editing, so the link doesn't swallow selection). Fills the element box.\n const inner =\n element.href && !editing ? (\n <a\n href={element.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ display: \"block\", width: \"100%\", height: \"100%\", color: \"inherit\", textDecoration: \"inherit\" }}\n data-fancy-slides-href=\"\"\n >\n {rendered}\n </a>\n ) : (\n rendered\n );\n\n return (\n <div\n className={buildAnimation ? \"fs-build-enter\" : undefined}\n style={box}\n data-fancy-slides-element={element.id}\n data-fancy-slides-element-type={element.type}\n data-fancy-slides-build={buildAnimation ? \"\" : undefined}\n onPointerDown={canMove ? startDrag(\"move\") : undefined}\n onPointerMove={canMove ? onPointerMove : undefined}\n onPointerUp={canMove ? endDrag : undefined}\n onPointerCancel={canMove ? endDrag : undefined}\n onClick={(e) => {\n // Click fallback for non-pointer environments / non-movable elements.\n if (!onSelect || canMove) return;\n e.stopPropagation();\n onSelect(element.id);\n }}\n >\n {inner}\n {canResize && (\n <ResizeHandles\n onStart={(anchor) => startDrag(anchor)}\n onMove={onPointerMove}\n onEnd={endDrag}\n />\n )}\n </div>\n );\n}\n\ninterface ResizeHandlesProps {\n onStart: (anchor: ResizeAnchor) => (e: ReactPointerEvent<HTMLElement>) => void;\n onMove: (e: ReactPointerEvent<HTMLElement>) => void;\n onEnd: (e: ReactPointerEvent<HTMLElement>) => void;\n}\n\nfunction ResizeHandles({ onStart, onMove, onEnd }: ResizeHandlesProps) {\n const anchors: Array<{ anchor: ResizeAnchor; style: CSSProperties; cursor: string }> = [\n { anchor: \"nw\", style: { left: -5, top: -5 }, cursor: \"nwse-resize\" },\n { anchor: \"n\", style: { left: \"calc(50% - 5px)\", top: -5 }, cursor: \"ns-resize\" },\n { anchor: \"ne\", style: { right: -5, top: -5 }, cursor: \"nesw-resize\" },\n { anchor: \"e\", style: { right: -5, top: \"calc(50% - 5px)\" }, cursor: \"ew-resize\" },\n { anchor: \"se\", style: { right: -5, bottom: -5 }, cursor: \"nwse-resize\" },\n { anchor: \"s\", style: { left: \"calc(50% - 5px)\", bottom: -5 }, cursor: \"ns-resize\" },\n { anchor: \"sw\", style: { left: -5, bottom: -5 }, cursor: \"nesw-resize\" },\n { anchor: \"w\", style: { left: -5, top: \"calc(50% - 5px)\" }, cursor: \"ew-resize\" },\n ];\n return (\n <>\n {anchors.map(({ anchor, style, cursor }) => (\n <div\n key={anchor}\n style={{\n position: \"absolute\",\n width: 10,\n height: 10,\n background: \"#ffffff\",\n border: \"1.5px solid #8b5cf6\",\n borderRadius: 2,\n cursor,\n touchAction: \"none\",\n boxShadow: \"0 1px 2px rgba(0,0,0,0.15)\",\n ...style,\n }}\n data-fancy-slides-resize-handle={anchor}\n onPointerDown={onStart(anchor)}\n onPointerMove={onMove}\n onPointerUp={onEnd}\n onPointerCancel={onEnd}\n />\n ))}\n </>\n );\n}\n\ninterface RenderInnerArgs {\n element: SlideElement;\n theme: Theme;\n slideWidthPx: number;\n editing: boolean;\n selected: boolean;\n onContentChange?: (elementId: string, content: string) => void;\n paraReveal?: ParaReveal;\n}\n\nfunction renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange, paraReveal }: RenderInnerArgs): ReactNode | undefined {\n switch (element.type) {\n case \"text\":\n return (\n <TextElementRenderer\n element={element}\n theme={theme}\n slideWidthPx={slideWidthPx}\n editing={editing}\n selected={selected}\n onContentChange={onContentChange ? (c) => onContentChange(element.id, c) : undefined}\n paraReveal={paraReveal}\n />\n );\n case \"image\":\n return <ImageElementRenderer element={element} />;\n case \"shape\":\n return <ShapeElementRenderer element={element} theme={theme} slideWidthPx={slideWidthPx} />;\n case \"chart\":\n case \"code\":\n case \"table\":\n case \"embed\":\n // These render via consumer-provided `renderElement` so we don't\n // pull fancy-echarts / fancy-code / etc. into the package's static\n // graph. Hosts opt into the default registry from\n // `@particle-academy/fancy-slides/registry`.\n return undefined;\n default:\n return null;\n }\n}\n\n/**\n * Built-in fallback for the optional element types (chart / code / table /\n * embed) when the host hasn't wired a `renderElement` (or it returned\n * undefined). Without this the element would render blank, making the\n * toolbar's Insert buttons look broken. The placeholder keeps every insert\n * visible and nudges the dev toward the default registry. Hosts that want the\n * real chart/code/table render pass `renderElement` from\n * `@particle-academy/fancy-slides/registry`.\n */\nfunction elementPlaceholder(element: SlideElement): ReactNode {\n if (element.type !== \"chart\" && element.type !== \"code\" && element.type !== \"table\" && element.type !== \"embed\") {\n return null;\n }\n const label = element.type.charAt(0).toUpperCase() + element.type.slice(1);\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.35em\",\n textAlign: \"center\",\n padding: \"0.5em\",\n boxSizing: \"border-box\",\n border: \"1px dashed currentColor\",\n borderRadius: 8,\n opacity: 0.55,\n overflow: \"hidden\",\n }}\n >\n <span style={{ fontWeight: 600 }}>{label}</span>\n <span style={{ fontSize: \"0.7em\", opacity: 0.8 }}>Pass renderElement to render</span>\n </div>\n );\n}\n\nfunction orderedElements(elements: SlideElement[]): SlideElement[] {\n // Elements without a `z` keep their array order; explicit z overrides win.\n return [...elements].sort((a, b) => {\n const az = a.z ?? -1;\n const bz = b.z ?? -1;\n if (az === bz) return 0;\n return az < bz ? -1 : 1;\n });\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\n/**\n * Given a drag delta + which anchor is being dragged, compute the patch\n * `{ x, y, w, h }` to apply. Clamps so dimensions stay >= MIN_DIM and the\n * element stays within the slide. Opposite edges stay fixed (e.g. dragging\n * the W handle moves the left edge but not the right).\n */\nfunction computeResize(drag: DragState, dx: number, dy: number): { x: number; y: number; w: number; h: number } {\n let { startX: x, startY: y, startW: w, startH: h } = drag;\n const right = drag.startX + drag.startW;\n const bottom = drag.startY + drag.startH;\n const anchor = drag.mode as ResizeAnchor;\n\n if (anchor.includes(\"w\")) {\n const newX = clamp(drag.startX + dx, 0, right - MIN_DIM);\n x = newX;\n w = right - newX;\n } else if (anchor.includes(\"e\")) {\n w = clamp(drag.startW + dx, MIN_DIM, 1 - drag.startX);\n }\n if (anchor.includes(\"n\")) {\n const newY = clamp(drag.startY + dy, 0, bottom - MIN_DIM);\n y = newY;\n h = bottom - newY;\n } else if (anchor.includes(\"s\")) {\n h = clamp(drag.startH + dy, MIN_DIM, 1 - drag.startY);\n }\n return { x, y, w, h };\n}\n","import { useEffect } from \"react\";\n\nexport interface SlideKeyboardOptions {\n /** Number of slides — clamps next/prev to bounds. */\n total: number;\n /** Current slide index. */\n index: number;\n /** Move to a specific slide. Used by Home/End/1-9 (and by arrows when no `onAdvance`/`onRetreat`). */\n goTo: (index: number) => void;\n /**\n * Forward step (→ / Space / PageDown). When provided it OWNS forward nav —\n * e.g. step through builds, then advance the slide. Falls back to\n * `goTo(index + 1)` when omitted.\n */\n onAdvance?: () => void;\n /**\n * Backward step (← / PageUp). When provided it OWNS backward nav. Falls back\n * to `goTo(index - 1)` when omitted.\n */\n onRetreat?: () => void;\n /** Called on Esc — typically exits fullscreen. */\n onExit?: () => void;\n /** Called on `B` — typically blacks/whites out the screen. */\n onBlank?: () => void;\n /** Called on `F` — typically toggles fullscreen. */\n onFullscreen?: () => void;\n /** Disable when the editor is focused / a modal is open. */\n enabled?: boolean;\n}\n\n/**\n * Standard slideshow keyboard plumbing:\n *\n * ← / PageUp — retreat (onRetreat, else previous slide)\n * → / PageDown / Space — advance (onAdvance, else next slide)\n * Home — first slide\n * End — last slide\n * Esc — onExit\n * B / . — onBlank (blackout)\n * F — onFullscreen\n * 1..9 — jump to slide N\n */\nexport function useSlideKeyboard({\n total,\n index,\n goTo,\n onAdvance,\n onRetreat,\n onExit,\n onBlank,\n onFullscreen,\n enabled = true,\n}: SlideKeyboardOptions): void {\n useEffect(() => {\n if (!enabled) return;\n\n const handler = (e: KeyboardEvent) => {\n // Skip when typing in inputs / textareas / contenteditable.\n const target = e.target as HTMLElement | null;\n if (target && (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.isContentEditable)) {\n return;\n }\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"PageUp\":\n e.preventDefault();\n if (onRetreat) onRetreat();\n else if (index > 0) goTo(index - 1);\n return;\n case \"ArrowRight\":\n case \"PageDown\":\n case \" \":\n e.preventDefault();\n if (onAdvance) onAdvance();\n else if (index < total - 1) goTo(index + 1);\n return;\n case \"Home\":\n e.preventDefault();\n goTo(0);\n return;\n case \"End\":\n e.preventDefault();\n goTo(total - 1);\n return;\n case \"Escape\":\n if (onExit) {\n e.preventDefault();\n onExit();\n }\n return;\n case \"b\":\n case \"B\":\n case \".\":\n if (onBlank) {\n e.preventDefault();\n onBlank();\n }\n return;\n case \"f\":\n case \"F\":\n if (onFullscreen) {\n e.preventDefault();\n onFullscreen();\n }\n return;\n default: {\n const n = parseInt(e.key, 10);\n if (Number.isFinite(n) && n >= 1 && n <= 9) {\n e.preventDefault();\n goTo(Math.min(total - 1, n - 1));\n }\n }\n }\n };\n\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [enabled, index, total, goTo, onAdvance, onRetreat, onExit, onBlank, onFullscreen]);\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { Deck, SlideElement, SlideTransition } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { Slide } from \"../Slide\";\nimport { useSlideKeyboard } from \"../../hooks/use-slide-keyboard\";\nimport { totalBuildSteps } from \"../../utils/builds\";\nimport { cn } from \"../../utils/cn\";\nimport { defaultElementRegistry } from \"../../registry\";\n\nexport interface SlideViewerProps {\n /** Deck to play. */\n deck: Deck;\n /** Controlled current slide index. Use with `onIndexChange`. */\n index?: number;\n /** Default current slide index (uncontrolled). */\n defaultIndex?: number;\n /** Called when the viewer advances. */\n onIndexChange?: (index: number) => void;\n /** Called when the viewer exits (Esc). */\n onExit?: () => void;\n /** Auto-advance interval in ms — kiosk mode. Omit to disable. */\n autoAdvanceMs?: number;\n /** Hide the bottom progress bar + slide counter. */\n hideChrome?: boolean;\n /**\n * Custom renderer for element types Slide doesn't render natively\n * (chart/code/table/embed). Defaults to the built-in\n * `defaultElementRegistry` so decks play fully out of the box; pass your\n * own to override.\n */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Extra classes on the viewer wrapper. */\n className?: string;\n}\n\n/**\n * Read-only deck viewer. Renders one slide at a time at the maximum size\n * that fits the container while preserving the theme's aspect ratio.\n * Keyboard nav is built in; expand a fullscreen-ready container around\n * `<SlideViewer>` to get the F11-style experience.\n */\nexport function SlideViewer({\n deck,\n index: controlledIndex,\n defaultIndex,\n onIndexChange,\n onExit,\n autoAdvanceMs,\n hideChrome = false,\n renderElement = defaultElementRegistry,\n className,\n}: SlideViewerProps) {\n const isControlled = controlledIndex !== undefined;\n const [internalIndex, setInternalIndex] = useState(defaultIndex ?? 0);\n const index = isControlled ? controlledIndex! : internalIndex;\n\n const goTo = useCallback(\n (i: number) => {\n const clamped = Math.max(0, Math.min(deck.slides.length - 1, i));\n if (!isControlled) setInternalIndex(clamped);\n onIndexChange?.(clamped);\n },\n [deck.slides.length, isControlled, onIndexChange],\n );\n\n const [blanked, setBlanked] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Track nav direction so `slide` transitions default sensibly: advancing\n // forward enters from the right, going back enters from the left.\n const prevIndexRef = useRef(index);\n const forward = index >= prevIndexRef.current;\n\n // ─── Intra-slide build (entrance-animation) step-through ────────────────\n // 0 = nothing built yet on the current slide. Each forward advance fires\n // the next step until `totalBuildSteps`, after which we move to the next\n // slide. Going backward lands on the previous slide fully built.\n const slide = deck.slides[index];\n const totalSteps = totalBuildSteps(slide);\n const [buildStep, setBuildStep] = useState(0);\n\n // Reset the build step on slide change. Only a forward advance INTO the next\n // slide replays builds from 0; every other landing (retreat, Home/End,\n // digit jump, external control) shows the slide fully built. `nextFreshRef`\n // flags the one forward-advance case.\n const nextFreshRef = useRef(false);\n useEffect(() => {\n if (index === prevIndexRef.current) return;\n prevIndexRef.current = index;\n const fresh = nextFreshRef.current;\n nextFreshRef.current = false;\n setBuildStep(fresh ? 0 : totalBuildSteps(deck.slides[index]));\n }, [index, deck.slides]);\n\n const advance = useCallback(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else if (index < deck.slides.length - 1) {\n nextFreshRef.current = true; // next slide starts with nothing built\n goTo(index + 1);\n }\n }, [buildStep, totalSteps, index, deck.slides.length, goTo]);\n\n const retreat = useCallback(() => {\n // v1: reversing individual builds is out of scope — step back a whole\n // slide, showing it fully built (handled by the reset effect).\n if (index > 0) goTo(index - 1);\n }, [index, goTo]);\n\n useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onAdvance: advance,\n onRetreat: retreat,\n onExit,\n onBlank: () => setBlanked((b) => !b),\n onFullscreen: () => {\n const el = containerRef.current;\n if (!el) return;\n if (document.fullscreenElement) document.exitFullscreen();\n else el.requestFullscreen?.();\n },\n });\n\n // Auto-advance loop for kiosk mode — steps through builds then slides.\n useEffect(() => {\n if (!autoAdvanceMs || deck.slides.length <= 1) return;\n const t = setTimeout(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else {\n nextFreshRef.current = true;\n goTo(index + 1 < deck.slides.length ? index + 1 : 0);\n }\n }, autoAdvanceMs);\n return () => clearTimeout(t);\n }, [autoAdvanceMs, index, deck.slides.length, goTo, buildStep, totalSteps]);\n const theme = resolveTheme(deck.theme);\n const aspectRatio = theme.aspectRatio ?? 16 / 9;\n\n // Resolve the incoming slide's entrance transition (slide → theme default → none).\n const transition: SlideTransition | undefined = slide?.transition ?? theme.defaultTransition;\n const enterStyle = transitionEnterStyle(transition, forward);\n\n return (\n <div\n ref={containerRef}\n className={cn(\"fs-viewer\", className)}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n background: blanked ? \"#000000\" : theme.colors?.background ?? \"#000000\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n }}\n tabIndex={0}\n data-fancy-slides-viewer={deck.id}\n data-fancy-slides-build-step={buildStep}\n onClick={() => {\n if (blanked) return;\n advance();\n }}\n >\n {/* Keyframes for slide entrance transitions. Pure CSS — no runtime deps.\n Gated behind prefers-reduced-motion so animations vanish entirely\n for users who ask for less motion. */}\n <style>{TRANSITION_KEYFRAMES}</style>\n\n {!blanked && slide && (\n <div\n style={{\n // Box that fits the slide while preserving aspect ratio.\n width: \"min(100%, calc(100vh * var(--fs-ratio)))\",\n aspectRatio: String(aspectRatio),\n // CSS var lets us inline-style the aspect ratio so it works in any container.\n [\"--fs-ratio\" as keyof React.CSSProperties as string]: aspectRatio.toString(),\n boxShadow: \"0 8px 30px rgba(0,0,0,0.35)\",\n } as React.CSSProperties}\n >\n {/* Keyed by index so React remounts on every slide change and the\n enter animation replays from its first frame. */}\n <div key={index} className=\"fs-slide-enter\" style={enterStyle}>\n <Slide slide={slide} theme={theme} buildStep={buildStep} renderElement={renderElement} />\n </div>\n </div>\n )}\n\n {!hideChrome && !blanked && (\n <div\n style={{\n position: \"absolute\",\n bottom: 16,\n right: 16,\n padding: \"4px 10px\",\n borderRadius: 999,\n background: \"rgba(15, 23, 42, 0.6)\",\n color: \"#f8fafc\",\n fontSize: 12,\n fontFamily: theme.fonts?.mono,\n backdropFilter: \"blur(6px)\",\n }}\n aria-label=\"Slide counter\"\n >\n {index + 1} / {deck.slides.length}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Transitions ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_DURATION = 400;\nconst EASE = \"cubic-bezier(0.16, 1, 0.3, 1)\"; // ease-out\n\n/**\n * Build the inline style that drives a slide's entrance animation. The actual\n * keyframes live in {@link TRANSITION_KEYFRAMES}; here we just pick the right\n * `animation-name` + duration. `prefers-reduced-motion: reduce` is handled in\n * CSS (the keyframe-bearing rules are wrapped in a media query), so a reduced-\n * motion user simply sees the final frame with no movement.\n */\nfunction transitionEnterStyle(transition: SlideTransition | undefined, forward: boolean): React.CSSProperties {\n const kind = transition?.kind ?? \"none\";\n if (kind === \"none\") return { width: \"100%\", height: \"100%\" };\n\n const duration = transition?.duration ?? DEFAULT_DURATION;\n let name: string;\n switch (kind) {\n case \"fade\":\n name = \"fs-fade-in\";\n break;\n case \"zoom\":\n name = \"fs-zoom-in\";\n break;\n case \"slide\": {\n const dir = transition?.direction ?? (forward ? \"right\" : \"left\");\n name = `fs-slide-in-${dir}`;\n break;\n }\n default:\n return { width: \"100%\", height: \"100%\" };\n }\n\n return {\n width: \"100%\",\n height: \"100%\",\n animationName: name,\n animationDuration: `${duration}ms`,\n animationTimingFunction: EASE,\n animationFillMode: \"both\",\n };\n}\n\n/**\n * Keyframes for every transition kind. Wrapped in\n * `@media (prefers-reduced-motion: no-preference)` so that reduced-motion users\n * get no animation at all — `animation-fill-mode: both` would otherwise pin the\n * element at its `from` frame, so we disable the animation entirely instead.\n */\nconst TRANSITION_KEYFRAMES = `\n@media (prefers-reduced-motion: reduce) {\n .fs-slide-enter { animation: none !important; }\n}\n@media (prefers-reduced-motion: no-preference) {\n @keyframes fs-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes fs-zoom-in {\n from { opacity: 0; transform: scale(0.92); }\n to { opacity: 1; transform: scale(1); }\n }\n @keyframes fs-slide-in-right {\n from { opacity: 0; transform: translateX(8%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-slide-in-left {\n from { opacity: 0; transform: translateX(-8%); }\n to { opacity: 1; transform: translateX(0); }\n }\n @keyframes fs-slide-in-up {\n from { opacity: 0; transform: translateY(8%); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes fs-slide-in-down {\n from { opacity: 0; transform: translateY(-8%); }\n to { opacity: 1; transform: translateY(0); }\n }\n}\n`;\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { Deck, SlideElement } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { Slide } from \"../Slide\";\nimport { useSlideKeyboard } from \"../../hooks/use-slide-keyboard\";\nimport { totalBuildSteps } from \"../../utils/builds\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface PresenterViewProps {\n /** Deck being presented. */\n deck: Deck;\n /** Controlled current slide index. */\n index?: number;\n /** Default current slide index (uncontrolled). */\n defaultIndex?: number;\n /** Called when the presenter advances. */\n onIndexChange?: (index: number) => void;\n /** Called when the presenter exits (Esc). */\n onExit?: () => void;\n /** Reset the elapsed timer to this `Date.now()` value. Defaults to mount time. */\n startedAt?: number;\n /** Optional custom renderer for non-built-in element types. */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n}\n\n/**\n * Speaker-only side view designed to live on a second monitor while the\n * audience sees a `<SlideViewer>`. Layout:\n *\n * ┌────────────────────────────┬────────────────────┐\n * │ │ next slide │\n * │ ├────────────────────┤\n * │ current slide │ │\n * │ (largest viewport) │ speaker notes │\n * │ │ │\n * ├────────────────────────────┴────────────────────┤\n * │ 3 / 12 elapsed 04:21 clock 14:35 prev / │\n * │ next │\n * └─────────────────────────────────────────────────┘\n *\n * Keyboard: same set as SlideViewer — ←/→/Space/Esc/Home/End/B/F/1-9.\n * Notes pane shows the current slide's `notes` field (rendered as\n * preformatted text for now; markdown rendering arrives with the\n * ContentRenderer integration in 0.2).\n */\nexport function PresenterView({\n deck,\n index: controlledIndex,\n defaultIndex,\n onIndexChange,\n onExit,\n startedAt,\n renderElement,\n className,\n}: PresenterViewProps) {\n const isControlled = controlledIndex !== undefined;\n const [internalIndex, setInternalIndex] = useState(defaultIndex ?? 0);\n const index = isControlled ? controlledIndex! : internalIndex;\n\n const goTo = useCallback(\n (i: number) => {\n const clamped = Math.max(0, Math.min(deck.slides.length - 1, i));\n if (!isControlled) setInternalIndex(clamped);\n onIndexChange?.(clamped);\n },\n [deck.slides.length, isControlled, onIndexChange],\n );\n\n // Mirror SlideViewer's build step-through so the speaker drives builds too.\n const slide = deck.slides[index];\n const totalSteps = totalBuildSteps(slide);\n const [buildStep, setBuildStep] = useState(0);\n const prevIndexRef = useRef(index);\n const nextFreshRef = useRef(false);\n useEffect(() => {\n if (index === prevIndexRef.current) return;\n prevIndexRef.current = index;\n const fresh = nextFreshRef.current;\n nextFreshRef.current = false;\n setBuildStep(fresh ? 0 : totalBuildSteps(deck.slides[index]));\n }, [index, deck.slides]);\n\n const advance = useCallback(() => {\n if (buildStep < totalSteps) {\n setBuildStep((s) => s + 1);\n } else if (index < deck.slides.length - 1) {\n nextFreshRef.current = true;\n goTo(index + 1);\n }\n }, [buildStep, totalSteps, index, deck.slides.length, goTo]);\n\n const retreat = useCallback(() => {\n if (index > 0) goTo(index - 1);\n }, [index, goTo]);\n\n useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onAdvance: advance,\n onRetreat: retreat,\n onExit,\n });\n\n const theme = resolveTheme(deck.theme);\n const nextSlide = deck.slides[index + 1];\n\n // Tick once a second for the clock + elapsed timer.\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, []);\n const startedAtRef = useMemo(() => startedAt ?? now, [startedAt]); // initial mount captures now\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: capture mount time once\n\n return (\n <div\n className={cn(\"fs-presenter\", className)}\n style={{\n display: \"grid\",\n gridTemplateRows: \"1fr auto\",\n gridTemplateColumns: \"minmax(0, 2fr) minmax(0, 1fr)\",\n width: \"100%\",\n height: \"100%\",\n background: \"#0b1220\",\n color: \"#f8fafc\",\n fontFamily: theme.fonts?.body,\n }}\n data-fancy-slides-presenter={deck.id}\n >\n {/* Current slide — left, full height of the upper row */}\n <div\n style={{\n gridRow: 1,\n gridColumn: 1,\n padding: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: 0,\n }}\n >\n <div\n style={{\n width: \"100%\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n maxHeight: \"100%\",\n boxShadow: \"0 12px 40px rgba(0,0,0,0.5)\",\n borderRadius: 8,\n overflow: \"hidden\",\n }}\n >\n {slide ? <Slide slide={slide} theme={theme} buildStep={buildStep} renderElement={renderElement} /> : null}\n </div>\n </div>\n\n {/* Right column — next slide on top, notes below */}\n <div\n style={{\n gridRow: 1,\n gridColumn: 2,\n display: \"grid\",\n gridTemplateRows: \"auto 1fr\",\n gap: 12,\n padding: 24,\n paddingLeft: 0,\n minHeight: 0,\n }}\n >\n <div>\n <SectionLabel>Up next</SectionLabel>\n {nextSlide ? (\n <div\n style={{\n marginTop: 8,\n width: \"100%\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n boxShadow: \"0 4px 16px rgba(0,0,0,0.4)\",\n borderRadius: 6,\n overflow: \"hidden\",\n opacity: 0.85,\n }}\n >\n <Slide slide={nextSlide} theme={theme} renderElement={renderElement} />\n </div>\n ) : (\n <div\n style={{\n marginTop: 8,\n display: \"grid\",\n placeItems: \"center\",\n aspectRatio: String(theme.aspectRatio ?? 16 / 9),\n borderRadius: 6,\n border: \"1px dashed rgba(255,255,255,0.2)\",\n color: \"rgba(255,255,255,0.4)\",\n fontSize: 13,\n }}\n >\n End of deck\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", minHeight: 0 }}>\n <SectionLabel>Speaker notes</SectionLabel>\n <pre\n style={{\n marginTop: 8,\n flex: 1,\n overflow: \"auto\",\n background: \"rgba(255,255,255,0.04)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 6,\n padding: 12,\n fontFamily: theme.fonts?.body,\n fontSize: 15,\n lineHeight: 1.5,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n color: \"rgba(248,250,252,0.92)\",\n margin: 0,\n }}\n >\n {slide?.notes?.trim() || (\n <span style={{ color: \"rgba(255,255,255,0.35)\", fontStyle: \"italic\" }}>\n No notes for this slide.\n </span>\n )}\n </pre>\n </div>\n </div>\n\n {/* Status bar — bottom, spans both columns */}\n <div\n style={{\n gridRow: 2,\n gridColumn: \"1 / span 2\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 24,\n padding: \"12px 24px\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n fontSize: 13,\n color: \"rgba(248,250,252,0.7)\",\n fontFamily: theme.fonts?.mono,\n }}\n >\n <StatusChip label=\"Slide\">\n {index + 1} / {deck.slides.length}\n </StatusChip>\n <StatusChip label=\"Elapsed\">{formatElapsed(now - startedAtRef)}</StatusChip>\n <StatusChip label=\"Clock\">{formatClock(now)}</StatusChip>\n <div style={{ marginLeft: \"auto\", display: \"flex\", gap: 8 }}>\n <NavButton onClick={retreat} disabled={index === 0}>\n ← Prev\n </NavButton>\n <NavButton onClick={advance} disabled={index >= deck.slides.length - 1 && buildStep >= totalSteps}>\n Next →\n </NavButton>\n </div>\n </div>\n </div>\n );\n}\n\nfunction SectionLabel({ children }: { children: ReactNode }) {\n return (\n <div\n style={{\n fontSize: 10,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"rgba(248,250,252,0.5)\",\n fontWeight: 600,\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction StatusChip({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: \"inline-flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 10,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"rgba(248,250,252,0.4)\",\n }}\n >\n {label}\n </span>\n <span style={{ color: \"rgba(248,250,252,0.92)\", fontWeight: 600 }}>{children}</span>\n </div>\n );\n}\n\nfunction NavButton({ onClick, disabled, children }: { onClick: () => void; disabled?: boolean; children: ReactNode }) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n padding: \"4px 10px\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.08)\",\n border: \"1px solid rgba(255,255,255,0.15)\",\n color: \"rgba(248,250,252,0.92)\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.4 : 1,\n fontSize: 13,\n fontFamily: \"inherit\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction formatClock(ms: number): string {\n const d = new Date(ms);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSec = Math.max(0, Math.floor(ms / 1000));\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n if (h > 0) return `${h}:${pad(m)}:${pad(s)}`;\n return `${pad(m)}:${pad(s)}`;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport type { Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { Slide } from \"../Slide\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface SlideThumbnailProps {\n slide: SlideData;\n theme?: Theme;\n /** Width of the thumbnail in px. Height comes from the theme's aspect ratio. */\n width?: number;\n /** When true, the thumbnail is rendered with a focused outline. */\n active?: boolean;\n onClick?: () => void;\n onContextMenu?: (e: React.MouseEvent) => void;\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Compact slide preview. Used by the slide rail in the editor, by the\n * presenter view, and anywhere else a deck wants to show its slides as\n * thumbnails. Re-uses the shared <Slide> so the layout matches the viewer\n * exactly — no second rendering path.\n *\n * The slide is rendered at its full DESIGN width and the whole thing is\n * CSS-`scale()`d down to the thumbnail size (the same approach fancy-artboard\n * uses for its piece previews). Scaling the rendered output — rather than\n * rendering the slide *at* the thumbnail width — is what makes heavy embedded\n * surfaces (ECharts charts, the fancy-code editor) shrink proportionally:\n * those render at fixed internal font sizes that ignore `slideWidthPx`, so a\n * directly-undersized render leaves them oversized in the thumb. A uniform\n * transform shrinks everything identically, so the thumb is a faithful\n * miniature of the live slide.\n */\nexport function SlideThumbnail({\n slide,\n theme,\n width = 200,\n active = false,\n onClick,\n onContextMenu,\n renderElement,\n className,\n style,\n}: SlideThumbnailProps) {\n const resolved = resolveTheme(theme);\n const ratio = resolved.aspectRatio ?? 16 / 9;\n const designWidth = resolved.slideWidth ?? 1280;\n const scale = width / designWidth;\n const height = width / ratio;\n\n return (\n <div\n className={cn(\"fs-thumbnail\", className)}\n style={{\n cursor: onClick ? \"pointer\" : \"default\",\n borderRadius: 6,\n border: active ? \"2px solid #8b5cf6\" : \"1px solid rgba(0,0,0,0.08)\",\n overflow: \"hidden\",\n boxShadow: active ? \"0 0 0 3px rgba(139, 92, 246, 0.2)\" : \"0 1px 2px rgba(0,0,0,0.05)\",\n background: \"#ffffff\",\n width,\n height,\n ...style,\n }}\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-fancy-slides-thumbnail={slide.id}\n >\n <div\n style={{\n width: designWidth,\n height: designWidth / ratio,\n transform: `scale(${scale})`,\n transformOrigin: \"top left\",\n // The thumb owns interaction — charts/code/iframes inside the\n // scaled slide shouldn't capture clicks.\n pointerEvents: \"none\",\n }}\n >\n <Slide slide={slide} theme={theme} width={designWidth} renderElement={renderElement} />\n </div>\n </div>\n );\n}\n","/**\n * Stable id generator. Deliberately simple — uses a counter + timestamp so\n * generated ids are URL-safe and human-readable, not cryptographically\n * unique. Servers / collaborative sessions should overwrite these with real\n * UUIDs when persisting.\n */\n\nlet counter = 0;\n\nexport function nextId(prefix = \"id\"): string {\n counter = (counter + 1) % 1_000_000;\n const t = Date.now().toString(36);\n const c = counter.toString(36).padStart(4, \"0\");\n return `${prefix}-${t}-${c}`;\n}\n\nexport function slideId(): string {\n return nextId(\"s\");\n}\n\nexport function elementId(): string {\n return nextId(\"e\");\n}\n\nexport function deckId(): string {\n return nextId(\"d\");\n}\n","import { useCallback, useMemo } from \"react\";\nimport type { Deck, DeckOp, ElementAnimation, Slide, SlideElement, SlideLayout, Theme, SlideBackground, SlideTransition } from \"../types\";\nimport { elementId, slideId } from \"../utils/ids\";\n\n/**\n * Hook that wraps a controlled deck with a typed mutation API. Every helper\n * applies a `DeckOp` and emits the new deck via `onChange`. Consumers that\n * want raw control over the deck can skip this and edit the deck directly\n * — the helpers exist so the editor / agent bridge / undo system all funnel\n * through the same shape.\n */\nexport interface UseDeckStateOptions {\n value: Deck;\n onChange: (next: Deck) => void;\n /** Called after every mutation with the op that produced it — wire up an AgentPanel / audit log. */\n onOp?: (op: DeckOp) => void;\n}\n\nexport interface DeckStateApi {\n /** Apply a raw DeckOp — the catch-all that every helper funnels through. */\n apply: (op: DeckOp) => void;\n /** Deck-level helpers. */\n setTitle: (title: string) => void;\n applyTheme: (theme: Theme) => void;\n /** Replace the entire deck — stream a full presentation in atomically. */\n setDeck: (deck: Deck) => void;\n /** Slide-level helpers. */\n addSlide: (index?: number, partial?: Partial<Slide>) => string;\n duplicateSlide: (id: string) => string;\n removeSlide: (id: string) => void;\n reorderSlide: (id: string, toIndex: number) => void;\n setLayout: (id: string, layout: SlideLayout) => void;\n setNotes: (id: string, notes: string) => void;\n setBackground: (id: string, bg?: SlideBackground) => void;\n setTransition: (id: string, transition?: SlideTransition) => void;\n /** Element-level helpers. */\n addElement: (slideId: string, element: Omit<SlideElement, \"id\"> & { id?: string }) => string;\n removeElement: (slideId: string, elementId: string) => void;\n updateElement: (slideId: string, elementId: string, patch: Partial<SlideElement>) => void;\n moveElement: (slideId: string, elementId: string, x: number, y: number) => void;\n resizeElement: (slideId: string, elementId: string, w: number, h: number) => void;\n /** Set or clear an element's entrance build animation. Pass `undefined` to clear. */\n setAnimation: (slideId: string, elementId: string, animation?: ElementAnimation) => void;\n /** Convenience lookups. */\n getSlide: (id: string) => Slide | undefined;\n getElement: (slideId: string, elementId: string) => SlideElement | undefined;\n}\n\nexport function useDeckState({ value, onChange, onOp }: UseDeckStateOptions): DeckStateApi {\n const apply = useCallback(\n (op: DeckOp) => {\n const next = reduce(value, op);\n onChange(next);\n onOp?.(op);\n },\n [value, onChange, onOp],\n );\n\n return useMemo<DeckStateApi>(() => {\n return {\n apply,\n setTitle: (title) => apply({ kind: \"deck_set_title\", title }),\n applyTheme: (theme) => apply({ kind: \"deck_apply_theme\", theme }),\n setDeck: (deck) => apply({ kind: \"deck_set\", deck }),\n addSlide: (index, partial) => {\n const id = partial?.id ?? slideId();\n const slide: Slide = {\n id,\n layout: partial?.layout ?? \"blank\",\n elements: partial?.elements ?? [],\n background: partial?.background,\n transition: partial?.transition,\n notes: partial?.notes,\n metadata: partial?.metadata,\n };\n apply({ kind: \"slide_add\", index: index ?? value.slides.length, slide });\n return id;\n },\n duplicateSlide: (id) => {\n const src = value.slides.find((s) => s.id === id);\n if (!src) return id;\n const newId = slideId();\n const clone: Slide = {\n ...src,\n id: newId,\n elements: src.elements.map((e) => ({ ...e, id: elementId() })),\n };\n const idx = value.slides.findIndex((s) => s.id === id);\n apply({ kind: \"slide_add\", index: idx + 1, slide: clone });\n return newId;\n },\n removeSlide: (id) => apply({ kind: \"slide_remove\", id }),\n reorderSlide: (id, toIndex) => apply({ kind: \"slide_reorder\", id, toIndex }),\n setLayout: (id, layout) => apply({ kind: \"slide_set_layout\", id, layout }),\n setNotes: (id, notes) => apply({ kind: \"slide_set_notes\", id, notes }),\n setBackground: (id, background) => apply({ kind: \"slide_set_background\", id, background }),\n setTransition: (id, transition) => apply({ kind: \"slide_set_transition\", id, transition }),\n addElement: (slideId, element) => {\n const id = element.id ?? elementId();\n apply({ kind: \"element_add\", slideId, element: { ...element, id } as SlideElement });\n return id;\n },\n removeElement: (slideIdArg, elementIdArg) => apply({ kind: \"element_remove\", slideId: slideIdArg, elementId: elementIdArg }),\n updateElement: (slideIdArg, elementIdArg, patch) =>\n apply({ kind: \"element_update\", slideId: slideIdArg, elementId: elementIdArg, patch }),\n moveElement: (slideIdArg, elementIdArg, x, y) => apply({ kind: \"element_move\", slideId: slideIdArg, elementId: elementIdArg, x, y }),\n resizeElement: (slideIdArg, elementIdArg, w, h) => apply({ kind: \"element_resize\", slideId: slideIdArg, elementId: elementIdArg, w, h }),\n setAnimation: (slideIdArg, elementIdArg, animation) =>\n apply({ kind: \"element_set_animation\", slideId: slideIdArg, elementId: elementIdArg, animation }),\n getSlide: (id) => value.slides.find((s) => s.id === id),\n getElement: (slideIdArg, elementIdArg) => value.slides.find((s) => s.id === slideIdArg)?.elements.find((e) => e.id === elementIdArg),\n };\n }, [apply, value.slides]);\n}\n\n/**\n * Pure reducer — the single source of truth for how every DeckOp mutates a\n * Deck. Agents, undo stacks, replay logs, and the editor all funnel through\n * this. Never mutates the input.\n */\nexport function reduce(deck: Deck, op: DeckOp): Deck {\n switch (op.kind) {\n case \"deck_set_title\":\n return { ...deck, title: op.title };\n case \"deck_apply_theme\":\n return { ...deck, theme: op.theme };\n case \"deck_set\":\n // Replace the whole deck — streaming a full presentation in. The\n // previous deck is what an undo entry would snapshot.\n return op.deck;\n case \"slide_add\": {\n const slides = [...deck.slides];\n slides.splice(Math.max(0, Math.min(slides.length, op.index)), 0, op.slide);\n return { ...deck, slides };\n }\n case \"slide_remove\":\n return { ...deck, slides: deck.slides.filter((s) => s.id !== op.id) };\n case \"slide_reorder\": {\n const idx = deck.slides.findIndex((s) => s.id === op.id);\n if (idx < 0) return deck;\n const slides = [...deck.slides];\n const [moved] = slides.splice(idx, 1);\n slides.splice(Math.max(0, Math.min(slides.length, op.toIndex)), 0, moved);\n return { ...deck, slides };\n }\n case \"slide_set_layout\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, layout: op.layout } : s)) };\n case \"slide_set_notes\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, notes: op.notes } : s)) };\n case \"slide_set_background\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, background: op.background } : s)) };\n case \"slide_set_transition\":\n return { ...deck, slides: deck.slides.map((s) => (s.id === op.id ? { ...s, transition: op.transition } : s)) };\n case \"element_add\":\n return {\n ...deck,\n slides: deck.slides.map((s) => (s.id === op.slideId ? { ...s, elements: [...s.elements, op.element] } : s)),\n };\n case \"element_remove\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId ? { ...s, elements: s.elements.filter((e) => e.id !== op.elementId) } : s,\n ),\n };\n case \"element_update\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? ({ ...e, ...op.patch } as SlideElement) : e)) }\n : s,\n ),\n };\n case \"element_move\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? { ...e, x: op.x, y: op.y } : e)) }\n : s,\n ),\n };\n case \"element_resize\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? { ...s, elements: s.elements.map((e) => (e.id === op.elementId ? { ...e, w: op.w, h: op.h } : e)) }\n : s,\n ),\n };\n case \"element_set_animation\":\n return {\n ...deck,\n slides: deck.slides.map((s) =>\n s.id === op.slideId\n ? {\n ...s,\n elements: s.elements.map((e) => {\n if (e.id !== op.elementId) return e;\n if (op.animation === undefined) {\n // Clear: drop the key entirely so the element leaves the build sequence.\n const { animation: _drop, ...rest } = e;\n return rest as SlideElement;\n }\n return { ...e, animation: op.animation };\n }),\n }\n : s,\n ),\n };\n }\n}\n","/**\n * Starter ECharts option objects for each `ChartKind`. Used by\n * `DeckEditor.insertChart(kind)` so each toolbar dropdown choice spawns\n * a renderable chart with sensible defaults — bar/line/area on a\n * Q1-Q4 category axis, pie with three slices, scatter with a small\n * random cluster.\n *\n * Once the agent or user edits the chart's `option`, the original\n * `kind` is irrelevant — `option.series[0].type` is the source of\n * truth from then on.\n */\n\nexport type ChartKind = \"bar\" | \"line\" | \"pie\" | \"area\" | \"scatter\";\n\ntype Option = Record<string, unknown>;\n\nconst QUARTERS = [\"Q1\", \"Q2\", \"Q3\", \"Q4\"];\nconst REVENUE = [24000, 38000, 31000, 47000];\n\nexport function chartStarterOption(kind: ChartKind): Option {\n switch (kind) {\n case \"bar\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [{ type: \"bar\", name: \"Revenue\", data: [...REVENUE] }],\n };\n\n case \"line\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [{ type: \"line\", name: \"Revenue\", smooth: true, data: [...REVENUE] }],\n };\n\n case \"area\":\n return {\n grid: { top: 24, left: 56, right: 16, bottom: 32 },\n tooltip: { trigger: \"axis\" },\n xAxis: { type: \"category\", data: [...QUARTERS] },\n yAxis: { type: \"value\" },\n series: [\n {\n type: \"line\",\n name: \"Revenue\",\n smooth: true,\n areaStyle: {},\n data: [...REVENUE],\n },\n ],\n };\n\n case \"pie\":\n return {\n tooltip: { trigger: \"item\" },\n legend: { bottom: 0 },\n series: [\n {\n type: \"pie\",\n radius: [\"40%\", \"70%\"],\n name: \"Segment\",\n data: [\n { value: 1048, name: \"Direct\" },\n { value: 735, name: \"Search\" },\n { value: 580, name: \"Email\" },\n ],\n },\n ],\n };\n\n case \"scatter\":\n return {\n grid: { top: 24, left: 48, right: 16, bottom: 32 },\n tooltip: { trigger: \"item\" },\n xAxis: { type: \"value\" },\n yAxis: { type: \"value\" },\n series: [\n {\n type: \"scatter\",\n name: \"Points\",\n symbolSize: 12,\n data: [\n [10.0, 8.04],\n [8.0, 6.95],\n [13.0, 7.58],\n [9.0, 8.81],\n [11.0, 8.33],\n [14.0, 9.96],\n [6.0, 7.24],\n [4.0, 4.26],\n [12.0, 10.84],\n [7.0, 4.82],\n [5.0, 5.68],\n ],\n },\n ],\n };\n }\n}\n\n// ─── UI-driven chart model ───────────────────────────────────────────────────\n//\n// The inspector edits charts through a small, JSON-friendly model rather than\n// raw ECharts option JSON. `chartModelFromOption` round-trips an existing\n// option into this model (returning `null` when the option is too custom to\n// represent), and `chartOptionFromModel` rebuilds a clean ECharts option from\n// it. This keeps the friendly editor and the advanced JSON escape hatch in\n// sync — both ultimately write `ChartElement.option`.\n\n/** Default series palette — reused for new series + slices. */\nexport const CHART_PALETTE = [\n \"#8b5cf6\",\n \"#3b82f6\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#ec4899\",\n \"#14b8a6\",\n \"#6366f1\",\n];\n\n/** A named series of per-category numeric values (bar / line / area / scatter). */\nexport interface ChartSeriesModel {\n name: string;\n color?: string;\n /** One value per category, aligned to `ChartModel.categories`. */\n values: number[];\n}\n\n/** A single pie slice. */\nexport interface ChartSliceModel {\n name: string;\n value: number;\n}\n\n/** The friendly chart model the inspector edits. */\nexport interface ChartModel {\n kind: ChartKind;\n /** x-axis category labels — used by bar/line/area/scatter. */\n categories: string[];\n /** Series — used by bar/line/area/scatter. */\n series: ChartSeriesModel[];\n /** Slices — used by pie. */\n slices: ChartSliceModel[];\n}\n\n/** Pick a palette color by index, wrapping around. */\nexport function chartColorAt(index: number): string {\n return CHART_PALETTE[index % CHART_PALETTE.length]!;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction toNumber(v: unknown): number {\n const n = typeof v === \"number\" ? v : parseFloat(String(v));\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Parse an ECharts option into the friendly `ChartModel`. Returns `null` when\n * the option doesn't match one of the supported shapes (so the inspector can\n * fall back to the raw-JSON editor instead of silently mangling a custom\n * option).\n *\n * Supported shapes:\n * - pie: a single `series` entry with `type: \"pie\"` and array `data` of\n * `{ name, value }`.\n * - bar/line/area/scatter: a categorical `xAxis.data` plus one or more\n * `series` of the matching type with numeric (or `[i, v]`) `data`.\n */\nexport function chartModelFromOption(option: Record<string, unknown>): ChartModel | null {\n if (!isPlainObject(option)) return null;\n const seriesRaw = option.series;\n if (!Array.isArray(seriesRaw) || seriesRaw.length === 0) return null;\n if (!seriesRaw.every(isPlainObject)) return null;\n\n const types = (seriesRaw as Record<string, unknown>[]).map((s) => String(s.type ?? \"\"));\n\n // Pie — single series only.\n if (types[0] === \"pie\") {\n if (seriesRaw.length !== 1) return null;\n const data = (seriesRaw[0] as Record<string, unknown>).data;\n if (!Array.isArray(data)) return null;\n const slices: ChartSliceModel[] = [];\n for (const d of data) {\n if (!isPlainObject(d)) return null;\n slices.push({ name: String(d.name ?? \"\"), value: toNumber(d.value) });\n }\n return { kind: \"pie\", categories: [], series: [], slices };\n }\n\n // Cartesian — every series must share one of these types.\n const cartesian = new Set([\"bar\", \"line\", \"scatter\"]);\n if (!types.every((t) => cartesian.has(t))) return null;\n if (new Set(types).size !== 1) return null; // mixed types → too custom\n\n const baseType = types[0]!;\n const isArea = baseType === \"line\" && (seriesRaw as Record<string, unknown>[]).every((s) => isPlainObject(s.areaStyle) || s.areaStyle != null);\n const kind: ChartKind = baseType === \"line\" ? (isArea ? \"area\" : \"line\") : (baseType as ChartKind);\n\n const xAxis = option.xAxis;\n const axisData = isPlainObject(xAxis) ? xAxis.data : undefined;\n const categories: string[] = Array.isArray(axisData) ? axisData.map((c) => String(c)) : [];\n // Scatter often has no category axis; derive length from the first series.\n const firstData = (seriesRaw[0] as Record<string, unknown>).data;\n const valueCount = Array.isArray(firstData) ? firstData.length : 0;\n const cats = categories.length > 0 ? categories : Array.from({ length: valueCount }, (_, i) => String(i + 1));\n\n const series: ChartSeriesModel[] = [];\n for (const s of seriesRaw as Record<string, unknown>[]) {\n const data = s.data;\n if (!Array.isArray(data)) return null;\n const values: number[] = data.map((d) => {\n if (Array.isArray(d)) return toNumber(d[1]); // [x, y] pair → take y\n if (isPlainObject(d)) return toNumber((d as Record<string, unknown>).value);\n return toNumber(d);\n });\n series.push({ name: String(s.name ?? \"Series\"), color: typeof s.itemStyle === \"object\" && s.itemStyle && isPlainObject(s.itemStyle) ? (typeof s.itemStyle.color === \"string\" ? s.itemStyle.color : undefined) : (typeof s.color === \"string\" ? s.color : undefined), values });\n }\n\n return { kind, categories: cats, series, slices: [] };\n}\n\n/** Rebuild a clean ECharts option from the friendly `ChartModel`. */\nexport function chartOptionFromModel(model: ChartModel): Record<string, unknown> {\n if (model.kind === \"pie\") {\n return {\n tooltip: { trigger: \"item\" },\n legend: { bottom: 0 },\n color: model.slices.map((_, i) => chartColorAt(i)),\n series: [\n {\n type: \"pie\",\n radius: [\"40%\", \"70%\"],\n name: \"Segment\",\n data: model.slices.map((s) => ({ name: s.name, value: s.value })),\n },\n ],\n };\n }\n\n const isScatter = model.kind === \"scatter\";\n const isArea = model.kind === \"area\";\n const seriesType = model.kind === \"bar\" ? \"bar\" : model.kind === \"scatter\" ? \"scatter\" : \"line\";\n\n const series = model.series.map((s, i) => {\n const color = s.color ?? chartColorAt(i);\n const base: Record<string, unknown> = {\n type: seriesType,\n name: s.name,\n itemStyle: { color },\n };\n if (isScatter) {\n base.symbolSize = 12;\n base.data = s.values.map((v, idx) => [idx, v]);\n } else {\n base.data = s.values;\n }\n if (seriesType === \"line\") base.smooth = true;\n if (isArea) base.areaStyle = { color };\n return base;\n });\n\n return {\n grid: { top: 24, left: 56, right: 16, bottom: isScatter ? 32 : 40 },\n tooltip: { trigger: isScatter ? \"item\" : \"axis\" },\n legend: model.series.length > 1 ? { bottom: 0 } : undefined,\n xAxis: isScatter ? { type: \"value\" } : { type: \"category\", data: [...model.categories] },\n yAxis: { type: \"value\" },\n series,\n };\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Action, ContextMenu, Text } from \"@particle-academy/react-fancy\";\nimport type { Slide, SlideElement, Theme } from \"../../types\";\nimport { SlideThumbnail } from \"../SlideThumbnail\";\n\nexport interface SlideRailProps {\n /** Slides to render in the rail. */\n slides: Slide[];\n /** Currently-selected slide id. */\n selectedId: string | null;\n /** Theme used for thumbnail rendering. */\n theme?: Theme;\n /** Select a slide by id. */\n onSelect: (id: string) => void;\n /** Add a slide after the given index (or at the end if absent). */\n onAdd: (afterIndex?: number) => void;\n /** Duplicate the given slide. */\n onDuplicate: (id: string) => void;\n /** Delete the given slide. */\n onRemove: (id: string) => void;\n /** Move a slide from `fromIndex` to `toIndex`. */\n onReorder: (id: string, toIndex: number) => void;\n /** Optional custom renderer for non-built-in element types — forwarded to the thumbnails. */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Thumbnail width in px. Defaults to 184. */\n thumbnailWidth?: number;\n}\n\n/**\n * Left-hand slide rail. Built on react-fancy's `Sidebar` for the chrome and\n * `ContextMenu` for right-click actions. Drag-to-reorder uses native HTML5\n * drag events so we don't take a DnD dependency.\n */\nexport function SlideRail({\n slides,\n selectedId,\n theme,\n onSelect,\n onAdd,\n onDuplicate,\n onRemove,\n onReorder,\n renderElement,\n thumbnailWidth = 184,\n}: SlideRailProps) {\n const [dragOver, setDragOver] = useState<string | null>(null);\n\n // Plain <aside> instead of react-fancy <Sidebar> because Sidebar hardcodes\n // `w-60` (240px), which overflows any rail container narrower than that.\n // The rail should fill whatever width the host gives it.\n return (\n <aside\n data-react-fancy-slide-rail=\"\"\n className=\"fs-rail flex h-full w-full min-w-0 flex-col gap-0.5\"\n >\n <div className=\"flex items-center justify-between gap-2 px-3 py-2\">\n <Text size=\"xs\" weight=\"semibold\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Slides · {slides.length}\n </Text>\n <Action size=\"xs\" icon=\"plus\" onClick={() => onAdd()} aria-label=\"Add slide\">\n Add\n </Action>\n </div>\n <div className=\"flex flex-col gap-3 px-3 pb-3\">\n {slides.map((slide, i) => (\n <div\n key={slide.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", slide.id);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOver(slide.id);\n }}\n onDragLeave={() => setDragOver(null)}\n onDrop={(e) => {\n e.preventDefault();\n const id = e.dataTransfer.getData(\"text/plain\");\n setDragOver(null);\n if (id && id !== slide.id) onReorder(id, i);\n }}\n style={{\n position: \"relative\",\n paddingTop: dragOver === slide.id ? 3 : 0,\n borderTop: dragOver === slide.id ? \"2px solid #8b5cf6\" : undefined,\n transition: \"padding 80ms ease\",\n }}\n >\n <ContextMenu>\n <ContextMenu.Trigger>\n <div className=\"flex items-start gap-2\">\n <Text size=\"xs\" className=\"!w-6 shrink-0 !pt-1 !text-right !font-mono !text-zinc-400\">\n {i + 1}\n </Text>\n <div className=\"flex-1\">\n <SlideThumbnail\n slide={slide}\n theme={theme}\n width={thumbnailWidth - 32}\n active={selectedId === slide.id}\n onClick={() => onSelect(slide.id)}\n renderElement={renderElement}\n />\n </div>\n </div>\n </ContextMenu.Trigger>\n <ContextMenu.Content>\n <ContextMenu.Item onClick={() => onSelect(slide.id)}>Open</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onDuplicate(slide.id)}>Duplicate</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onAdd(i)}>Insert above</ContextMenu.Item>\n <ContextMenu.Item onClick={() => onAdd(i + 1)}>Insert below</ContextMenu.Item>\n <ContextMenu.Separator />\n <ContextMenu.Item danger onClick={() => onRemove(slide.id)}>\n Delete\n </ContextMenu.Item>\n </ContextMenu.Content>\n </ContextMenu>\n </div>\n ))}\n {slides.length === 0 && (\n <div className=\"grid place-items-center rounded-md border border-dashed border-zinc-300 px-3 py-8 text-center text-xs text-zinc-500 dark:border-zinc-700\">\n Empty deck — add a slide to begin.\n </div>\n )}\n </div>\n </aside>\n );\n}\n","import { Action, Badge, Dropdown, Separator, Tooltip } from \"@particle-academy/react-fancy\";\nimport type { ShapeKind, Theme } from \"../../types\";\nimport { builtinThemes } from \"../../theme/default-theme\";\n\n/**\n * Starter chart-element preset. Picked from the toolbar Insert→Chart\n * dropdown; expands into a starter `ChartElement.option` inside\n * `DeckEditor.insertChart`. The actual saved `ChartElement` doesn't\n * carry this — once the agent or user edits the option JSON, the\n * \"kind\" is just whatever ECharts series.type the option says.\n */\nexport type ChartKind = \"bar\" | \"line\" | \"pie\" | \"area\" | \"scatter\";\n\nexport interface EditorToolbarProps {\n /** Current deck title — shown left of the toolbar. */\n title: string;\n onTitleChange?: (title: string) => void;\n /** Current theme name. */\n themeName?: string;\n /** Apply a theme. */\n onApplyTheme?: (theme: Theme) => void;\n /** Insert a text element on the active slide. */\n onInsertText?: () => void;\n /** Insert an image element. */\n onInsertImage?: () => void;\n /** Insert a shape element. */\n onInsertShape?: (shape: ShapeKind) => void;\n /** Insert a chart element. The `kind` arg picks a starter ECharts option\n * (`bar` / `line` / `pie` / `area` / `scatter`). Hosts can ignore the\n * arg if they only support a single chart type. */\n onInsertChart?: (kind: ChartKind) => void;\n /** Insert a code element. */\n onInsertCode?: () => void;\n /** Insert a table element. */\n onInsertTable?: () => void;\n /** Open the viewer (presentation mode). */\n onPresent?: () => void;\n /** When true, disables every Insert button (e.g. when no slide is selected). */\n disabled?: boolean;\n}\n\n/**\n * Top toolbar. Built on react-fancy's `Action`, `Dropdown`, `Tooltip`,\n * `Badge`, `Separator`. Designed to be slotted into the editor chrome —\n * doesn't manage its own scroll or sticky behavior.\n */\nexport function EditorToolbar({\n title,\n onTitleChange,\n themeName,\n onApplyTheme,\n onInsertText,\n onInsertImage,\n onInsertShape,\n onInsertChart,\n onInsertCode,\n onInsertTable,\n onPresent,\n disabled = false,\n}: EditorToolbarProps) {\n return (\n <div className=\"fs-toolbar flex items-center gap-2 border-b border-zinc-200 bg-white px-4 py-2 dark:border-zinc-800 dark:bg-zinc-950\">\n {/* Title field */}\n <input\n value={title}\n onChange={(e) => onTitleChange?.(e.target.value)}\n placeholder=\"Untitled deck\"\n className=\"min-w-0 flex-1 max-w-xs border-0 bg-transparent px-1 text-sm font-semibold text-zinc-900 outline-none placeholder:text-zinc-400 focus:bg-zinc-50 dark:text-zinc-100 dark:focus:bg-zinc-900\"\n aria-label=\"Deck title\"\n />\n\n <Separator orientation=\"vertical\" />\n\n {/* Insert actions */}\n <Tooltip content=\"Insert text\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"type\" onClick={onInsertText} disabled={disabled} aria-label=\"Insert text\" />\n </Tooltip>\n <Tooltip content=\"Insert image\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"image\" onClick={onInsertImage} disabled={disabled} aria-label=\"Insert image\" />\n </Tooltip>\n\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" icon=\"square\" iconTrailing=\"chevron-down\" disabled={disabled}>\n Shape\n </Action>\n </Dropdown.Trigger>\n <Dropdown.Items>\n <Dropdown.Item onClick={() => onInsertShape?.(\"rect\")}>Rectangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"rounded-rect\")}>Rounded rectangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"ellipse\")}>Ellipse</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"triangle\")}>Triangle</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"line\")}>Line</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertShape?.(\"arrow\")}>Arrow</Dropdown.Item>\n </Dropdown.Items>\n </Dropdown>\n\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" icon=\"bar-chart\" iconTrailing=\"chevron-down\" disabled={disabled} aria-label=\"Insert chart\" />\n </Dropdown.Trigger>\n <Dropdown.Items>\n <Dropdown.Item onClick={() => onInsertChart?.(\"bar\")}>Bar chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"line\")}>Line chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"area\")}>Area chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"pie\")}>Pie chart</Dropdown.Item>\n <Dropdown.Item onClick={() => onInsertChart?.(\"scatter\")}>Scatter</Dropdown.Item>\n </Dropdown.Items>\n </Dropdown>\n <Tooltip content=\"Insert code\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"code\" onClick={onInsertCode} disabled={disabled} aria-label=\"Insert code\" />\n </Tooltip>\n <Tooltip content=\"Insert table\">\n <Action variant=\"ghost\" size=\"sm\" icon=\"table\" onClick={onInsertTable} disabled={disabled} aria-label=\"Insert table\" />\n </Tooltip>\n\n <Separator orientation=\"vertical\" />\n\n {/* Theme */}\n <Dropdown>\n <Dropdown.Trigger>\n <Action variant=\"ghost\" size=\"sm\" iconTrailing=\"chevron-down\">\n <Badge size=\"sm\" color=\"zinc\">{themeName ?? \"default\"}</Badge>\n <span className=\"ml-2\">Theme</span>\n </Action>\n </Dropdown.Trigger>\n <Dropdown.Items>\n {Object.values(builtinThemes).map((t) => (\n <Dropdown.Item key={t.name} onClick={() => onApplyTheme?.(t)}>\n {t.name}\n </Dropdown.Item>\n ))}\n </Dropdown.Items>\n </Dropdown>\n\n <div className=\"ml-auto flex items-center gap-2\">\n <Tooltip content=\"Present (F)\">\n <Action color=\"violet\" size=\"sm\" icon=\"play\" onClick={onPresent}>\n Present\n </Action>\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useRef } from \"react\";\nimport { Action, Card, ColorPicker, Heading, Input, Select, Separator, Slider, Switch, Tabs, Text, Textarea } from \"@particle-academy/react-fancy\";\nimport type { ElementAnimation, Slide as SlideData, SlideBackground, SlideElement, SlideLayout, SlideTransition, TextElement, TextStyle, ImageElement, ShapeElement, CodeElement, ChartElement, TableElement, EmbedElement } from \"../../types\";\nimport { chartModelFromOption, chartOptionFromModel, chartColorAt, type ChartKind, type ChartModel } from \"../../utils/chart-presets\";\nimport { collectBuilds } from \"../../utils/builds\";\n\nexport interface ElementInspectorProps {\n /** Element being inspected. `null` falls back to slide settings (or the empty state). */\n element: SlideElement | null;\n /** Patch a property on the element. */\n onPatch: (patch: Partial<SlideElement>) => void;\n /** Delete the element. */\n onDelete?: () => void;\n /** Lock toggle. */\n onLockToggle?: (locked: boolean) => void;\n /** Selected slide — shown when no element is selected so the user can edit slide-level settings. */\n slide?: SlideData | null;\n /** Set the slide's entrance transition. */\n onSetTransition?: (transition?: SlideTransition) => void;\n /** Set the slide's background. */\n onSetBackground?: (background?: SlideBackground) => void;\n /** Set the slide's layout preset. */\n onSetLayout?: (layout: SlideLayout) => void;\n /** Set or clear the selected element's entrance build animation. */\n onSetAnimation?: (animation?: ElementAnimation) => void;\n /** Set a specific element's build animation by id — used by the slide-level build-order list. */\n onSetElementAnimation?: (elementId: string, animation?: ElementAnimation) => void;\n}\n\n/**\n * Right-hand inspector. Tabs split position + style + advanced properties.\n * Per-element-type controls drop in under the Style tab. Built on\n * react-fancy `Card`, `Tabs`, `Input`, `Select`, `Slider`, `ColorPicker`,\n * `Action`.\n */\nexport function ElementInspector({ element, onPatch, onDelete, onLockToggle, slide, onSetTransition, onSetBackground, onSetLayout, onSetAnimation, onSetElementAnimation }: ElementInspectorProps) {\n // No element selected: show slide-level settings when a slide is available.\n if (!element) {\n if (slide) {\n return <SlideSettings slide={slide} onSetTransition={onSetTransition} onSetBackground={onSetBackground} onSetLayout={onSetLayout} onSetElementAnimation={onSetElementAnimation} />;\n }\n return (\n <div className=\"fs-inspector flex h-full flex-col border-l border-zinc-200 bg-zinc-50 p-4 dark:border-zinc-800 dark:bg-zinc-900\">\n <Heading as=\"h3\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Inspector\n </Heading>\n <Text size=\"sm\" className=\"mt-2 !text-zinc-500\">\n Select an element to edit its properties.\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"fs-inspector flex h-full w-full flex-col border-l border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900\">\n <div className=\"flex items-center justify-between border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-2\">\n <Heading as=\"h3\" size=\"xs\" className=\"!font-mono !uppercase !tracking-wider !text-zinc-500\">\n {element.type}\n </Heading>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n #{element.id.slice(-6)}\n </Text>\n </div>\n <div className=\"flex items-center gap-1\">\n <Action size=\"xs\" variant=\"ghost\" icon={element.locked ? \"lock\" : \"unlock\"} onClick={() => onLockToggle?.(!element.locked)} aria-label={element.locked ? \"Unlock\" : \"Lock\"} />\n {onDelete && (\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"trash\" onClick={onDelete} aria-label=\"Delete\" />\n )}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-3\">\n <Tabs defaultTab=\"style\" variant=\"pills\">\n <Tabs.List>\n <Tabs.Tab value=\"style\">Style</Tabs.Tab>\n <Tabs.Tab value=\"layout\">Layout</Tabs.Tab>\n <Tabs.Tab value=\"build\">Build</Tabs.Tab>\n <Tabs.Tab value=\"advanced\">Advanced</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel value=\"style\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <StyleSection element={element} onPatch={onPatch} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"build\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <AnimateSection animation={element.animation} onSetAnimation={onSetAnimation} isText={element.type === \"text\"} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"layout\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <LayoutSection element={element} onPatch={onPatch} siblings={slide?.elements ?? []} />\n </Card>\n </Tabs.Panel>\n <Tabs.Panel value=\"advanced\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <AdvancedSection element={element} onPatch={onPatch} />\n </Card>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs>\n </div>\n </div>\n );\n}\n\n// ─── Slide settings ─────────────────────────────────────────────────────────\n\n/**\n * Shown in the inspector column when a slide is selected but no element is.\n * Lets a human set the slide's entrance transition (and, as a nicety, its\n * background color). Mirrors the ElementInspector look — same Card/Tabs shell.\n */\nconst SLIDE_LAYOUTS: Array<{ value: SlideLayout; label: string }> = [\n { value: \"blank\", label: \"Blank\" },\n { value: \"title\", label: \"Title\" },\n { value: \"title-content\", label: \"Title + content\" },\n { value: \"two-column\", label: \"Two column\" },\n { value: \"section-divider\", label: \"Section divider\" },\n { value: \"image-text\", label: \"Image + text\" },\n { value: \"text-image\", label: \"Text + image\" },\n { value: \"quote\", label: \"Quote\" },\n];\n\n/** Which kind of background is active, for the background-mode switch. */\nfunction backgroundMode(bg: SlideBackground | undefined): \"color\" | \"gradient\" | \"image\" {\n if (bg?.gradient) return \"gradient\";\n if (bg?.image) return \"image\";\n return \"color\";\n}\n\nfunction SlideSettings({\n slide,\n onSetTransition,\n onSetBackground,\n onSetLayout,\n onSetElementAnimation,\n}: {\n slide: SlideData;\n onSetTransition?: (transition?: SlideTransition) => void;\n onSetBackground?: (background?: SlideBackground) => void;\n onSetLayout?: (layout: SlideLayout) => void;\n onSetElementAnimation?: (elementId: string, animation?: ElementAnimation) => void;\n}) {\n const transition = slide.transition;\n const kind = transition?.kind ?? \"none\";\n const setTransition = (next: Partial<SlideTransition>) => {\n const merged: SlideTransition = { kind, duration: transition?.duration, direction: transition?.direction, ...next };\n // \"none\" carries no extra knobs — store the bare kind.\n onSetTransition?.(merged.kind === \"none\" ? { kind: \"none\" } : merged);\n };\n const bgMode = backgroundMode(slide.background);\n\n return (\n <div className=\"fs-inspector flex h-full w-full flex-col border-l border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900\">\n <div className=\"flex items-center justify-between border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-2\">\n <Heading as=\"h3\" size=\"xs\" className=\"!font-mono !uppercase !tracking-wider !text-zinc-500\">\n slide\n </Heading>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n #{slide.id.slice(-6)}\n </Text>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-3\">\n {onSetLayout && (\n <Card padding=\"md\" className=\"mb-3 !bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Layout\n </Heading>\n <Select\n label=\"Preset\"\n list={SLIDE_LAYOUTS}\n value={slide.layout ?? \"blank\"}\n onValueChange={(v) => onSetLayout(v as SlideLayout)}\n />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n The layout hint the deck commits to — carried through to the pptx export's slide layout.\n </Text>\n </div>\n </Card>\n )}\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Transition\n </Heading>\n <Select\n label=\"Kind\"\n list={[\n { value: \"none\", label: \"None\" },\n { value: \"fade\", label: \"Fade\" },\n { value: \"slide\", label: \"Slide\" },\n { value: \"zoom\", label: \"Zoom\" },\n ]}\n value={kind}\n onValueChange={(v) => setTransition({ kind: v as SlideTransition[\"kind\"] })}\n />\n {kind === \"slide\" && (\n <Select\n label=\"Direction\"\n list={[\n { value: \"left\", label: \"From left\" },\n { value: \"right\", label: \"From right\" },\n { value: \"up\", label: \"From bottom\" },\n { value: \"down\", label: \"From top\" },\n ]}\n value={transition?.direction ?? \"right\"}\n onValueChange={(v) => setTransition({ direction: v as SlideTransition[\"direction\"] })}\n />\n )}\n {kind !== \"none\" && (\n <Input\n label=\"Duration (ms)\"\n type=\"number\"\n value={String(transition?.duration ?? 400)}\n onChange={(e) => setTransition({ duration: parseInt(e.target.value, 10) || 400 })}\n />\n )}\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Entrance animation played when this slide appears in the viewer. Falls back to the theme default. Honors prefers-reduced-motion.\n </Text>\n </div>\n </Card>\n\n {onSetBackground && (\n <Card padding=\"md\" className=\"mt-3 !bg-white dark:!bg-zinc-950\">\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Background\n </Heading>\n <Select\n label=\"Type\"\n list={[\n { value: \"color\", label: \"Solid color\" },\n { value: \"gradient\", label: \"Gradient\" },\n { value: \"image\", label: \"Image\" },\n ]}\n value={bgMode}\n onValueChange={(v) => {\n // Switching type clears the other modes' fields so the\n // background carries exactly one source (matches the writer).\n if (v === \"color\") onSetBackground({ color: slide.background?.color ?? \"#ffffff\" });\n else if (v === \"gradient\") onSetBackground({ gradient: slide.background?.gradient ?? \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\" });\n else onSetBackground({ image: slide.background?.image ?? \"\", imageFit: slide.background?.imageFit ?? \"cover\", color: slide.background?.color });\n }}\n />\n {bgMode === \"color\" && (\n <FieldLabel label=\"Color\">\n <ColorPicker\n value={slide.background?.color ?? \"#ffffff\"}\n onChange={(c) => onSetBackground({ color: c })}\n />\n </FieldLabel>\n )}\n {bgMode === \"gradient\" && (\n <Textarea\n label=\"CSS gradient\"\n value={slide.background?.gradient ?? \"\"}\n onValueChange={(v) => onSetBackground({ gradient: v })}\n rows={2}\n />\n )}\n {bgMode === \"image\" && (\n <>\n <Textarea\n label=\"Image URL\"\n value={slide.background?.image ?? \"\"}\n onValueChange={(v) => onSetBackground({ ...slide.background, image: v })}\n rows={2}\n />\n <Select\n label=\"Fit\"\n list={[\n { value: \"cover\", label: \"Cover\" },\n { value: \"contain\", label: \"Contain\" },\n { value: \"fill\", label: \"Fill (stretch)\" },\n ]}\n value={slide.background?.imageFit ?? \"cover\"}\n onValueChange={(v) => onSetBackground({ ...slide.background, imageFit: v as SlideBackground[\"imageFit\"] })}\n />\n </>\n )}\n </div>\n </Card>\n )}\n\n {onSetElementAnimation && (\n <Card padding=\"md\" className=\"mt-3 !bg-white dark:!bg-zinc-950\">\n <BuildOrderList slide={slide} onSetElementAnimation={onSetElementAnimation} />\n </Card>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Compact build-sequence manager shown in slide settings. Lists the slide's\n * animated elements in build order with up/down buttons. Moving an item\n * reassigns sequential `order` values (0,1,2,…) to the whole list so the\n * sequence stays unambiguous.\n */\nfunction BuildOrderList({\n slide,\n onSetElementAnimation,\n}: {\n slide: SlideData;\n onSetElementAnimation: (elementId: string, animation?: ElementAnimation) => void;\n}) {\n const builds = collectBuilds(slide);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= builds.length) return;\n const reordered = [...builds];\n const [item] = reordered.splice(from, 1);\n reordered.splice(to, 0, item!);\n // Reassign sequential orders to the whole list.\n reordered.forEach((b, i) => {\n if ((b.animation.order ?? 0) !== i) {\n onSetElementAnimation(b.element.id, { ...b.animation, order: i });\n }\n });\n };\n\n return (\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Build order\n </Heading>\n {builds.length === 0 ? (\n <Text size=\"xs\" className=\"!text-zinc-500\">\n No animated elements yet. Select an element and add a build under its Build tab.\n </Text>\n ) : (\n builds.map((b, i) => (\n <div key={b.element.id} className=\"flex items-center gap-2\">\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400 w-5\">{i + 1}.</Text>\n <div className=\"flex-1 min-w-0\">\n <Text size=\"sm\" className=\"truncate\">\n {buildLabel(b.element)}\n </Text>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">\n {b.animation.effect} · {b.animation.trigger ?? \"on-click\"}\n </Text>\n </div>\n <Action size=\"xs\" variant=\"ghost\" icon=\"chevron-up\" onClick={() => move(i, i - 1)} disabled={i === 0} aria-label=\"Move earlier\" />\n <Action size=\"xs\" variant=\"ghost\" icon=\"chevron-down\" onClick={() => move(i, i + 1)} disabled={i === builds.length - 1} aria-label=\"Move later\" />\n </div>\n ))\n )}\n </div>\n );\n}\n\n/** Short human label for a build-list row. */\nfunction buildLabel(element: SlideElement): string {\n if (element.type === \"text\") {\n const text = element.content.replace(/\\s+/g, \" \").trim();\n return text ? (text.length > 28 ? `${text.slice(0, 28)}…` : text) : \"Text\";\n }\n return `${element.type} #${element.id.slice(-6)}`;\n}\n\n// ─── Sections ──────────────────────────────────────────────────────────────\n\nfunction LayoutSection({ element, onPatch, siblings }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void; siblings: SlideElement[] }) {\n const zs = siblings.map((e) => e.z ?? 0);\n const bringToFront = () => onPatch({ z: (zs.length ? Math.max(...zs) : 0) + 1 });\n const sendToBack = () => onPatch({ z: (zs.length ? Math.min(...zs) : 0) - 1 });\n return (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Input label=\"X\" type=\"number\" value={String(roundFrac(element.x))} onChange={(e) => onPatch({ x: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Y\" type=\"number\" value={String(roundFrac(element.y))} onChange={(e) => onPatch({ y: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Width\" type=\"number\" value={String(roundFrac(element.w))} onChange={(e) => onPatch({ w: clamp(parseFloat(e.target.value), 0, 1) })} />\n <Input label=\"Height\" type=\"number\" value={String(roundFrac(element.h))} onChange={(e) => onPatch({ h: clamp(parseFloat(e.target.value), 0, 1) })} />\n </div>\n <Separator />\n <Slider label=\"Rotation\" value={element.rotation ?? 0} onValueChange={(v) => onPatch({ rotation: Number(v) })} min={-180} max={180} />\n <div className=\"flex items-end gap-2\">\n <Input label=\"Z-index\" type=\"number\" value={String(element.z ?? 0)} onChange={(e) => onPatch({ z: parseInt(e.target.value, 10) || 0 })} className=\"flex-1\" />\n <Action size=\"sm\" variant=\"ghost\" onClick={bringToFront} aria-label=\"Bring to front\">Front</Action>\n <Action size=\"sm\" variant=\"ghost\" onClick={sendToBack} aria-label=\"Send to back\">Back</Action>\n </div>\n <Separator />\n <Input\n label=\"Link (href)\"\n value={element.href ?? \"\"}\n placeholder=\"https://…\"\n onChange={(e) => onPatch({ href: e.target.value || undefined } as Partial<SlideElement>)}\n />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Makes the whole element a click target in the viewer (opens a new tab) and exports as a pptx hyperlink. For links inside text, use markdown <code>[label](url)</code>.\n </Text>\n </div>\n );\n}\n\nfunction AdvancedSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Input label=\"Element id\" value={element.id} disabled />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n The element id is stable — agents reference elements by id.\n </Text>\n <Separator />\n <div className=\"flex items-center gap-2\">\n <Action size=\"sm\" variant={element.hidden ? \"default\" : \"ghost\"} onClick={() => onPatch({ hidden: !element.hidden })}>\n {element.hidden ? \"Hidden — show\" : \"Hide on slide\"}\n </Action>\n </div>\n </div>\n );\n}\n\n// ─── Animate (build) section ─────────────────────────────────────────────────\n\nconst NO_ANIMATION = \"none\";\n\n/**\n * Per-element entrance build controls. Picking an effect of \"none\" clears the\n * animation (drops the element from the slide's build sequence). All other\n * fields edit a single `ElementAnimation`, funneled through `onSetAnimation`.\n */\nfunction AnimateSection({\n animation,\n onSetAnimation,\n isText,\n}: {\n animation?: ElementAnimation;\n onSetAnimation?: (animation?: ElementAnimation) => void;\n /** Whether the selected element is a text element (gates the by-paragraph toggle). */\n isText?: boolean;\n}) {\n if (!onSetAnimation) {\n return <Text size=\"sm\" className=\"!text-zinc-500\">Build animations aren't wired up in this editor.</Text>;\n }\n\n const effect = animation?.effect;\n const set = (next: Partial<ElementAnimation>) => {\n const base: ElementAnimation = animation ?? { effect: \"fade\" };\n onSetAnimation({ ...base, ...next });\n };\n\n const showDirection = effect === \"fly-in\" || effect === \"wipe\";\n\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Effect\"\n list={[\n { value: NO_ANIMATION, label: \"None\" },\n { value: \"fade\", label: \"Fade\" },\n { value: \"fly-in\", label: \"Fly in\" },\n { value: \"zoom\", label: \"Zoom\" },\n { value: \"wipe\", label: \"Wipe\" },\n ]}\n value={effect ?? NO_ANIMATION}\n onValueChange={(v) => {\n if (v === NO_ANIMATION) onSetAnimation(undefined);\n else set({ effect: v as ElementAnimation[\"effect\"] });\n }}\n />\n {effect && (\n <>\n <Select\n label=\"Trigger\"\n list={[\n { value: \"on-click\", label: \"On click\" },\n { value: \"with-prev\", label: \"With previous\" },\n { value: \"after-prev\", label: \"After previous\" },\n ]}\n value={animation?.trigger ?? \"on-click\"}\n onValueChange={(v) => set({ trigger: v as ElementAnimation[\"trigger\"] })}\n />\n {showDirection && (\n <Select\n label=\"Direction\"\n list={[\n { value: \"left\", label: \"From left\" },\n { value: \"right\", label: \"From right\" },\n { value: \"up\", label: \"From bottom\" },\n { value: \"down\", label: \"From top\" },\n ]}\n value={animation?.direction ?? \"left\"}\n onValueChange={(v) => set({ direction: v as ElementAnimation[\"direction\"] })}\n />\n )}\n <div className=\"grid grid-cols-2 gap-2\">\n <Input\n label=\"Duration (ms)\"\n type=\"number\"\n value={String(animation?.duration ?? 500)}\n onChange={(e) => set({ duration: parseInt(e.target.value, 10) || 500 })}\n />\n <Input\n label=\"Delay (ms)\"\n type=\"number\"\n value={String(animation?.delay ?? 0)}\n onChange={(e) => set({ delay: parseInt(e.target.value, 10) || 0 })}\n />\n </div>\n <Input\n label=\"Order\"\n type=\"number\"\n value={String(animation?.order ?? 0)}\n onChange={(e) => set({ order: parseInt(e.target.value, 10) || 0 })}\n />\n {isText && (\n <Switch\n label=\"Animate by paragraph (one line per click)\"\n checked={!!animation?.byParagraph}\n onCheckedChange={(v) => set({ byParagraph: v })}\n />\n )}\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Builds reveal in ascending order. \"On click\" starts a new step; \"with previous\" plays alongside the step's lead; \"after previous\" follows it. Honors prefers-reduced-motion.\n </Text>\n </>\n )}\n </div>\n );\n}\n\nfunction StyleSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\n switch (element.type) {\n case \"text\":\n return <TextStyleControls element={element} onPatch={onPatch as (p: Partial<TextElement>) => void} />;\n case \"image\":\n return <ImageStyleControls element={element} onPatch={onPatch as (p: Partial<ImageElement>) => void} />;\n case \"shape\":\n return <ShapeStyleControls element={element} onPatch={onPatch as (p: Partial<ShapeElement>) => void} />;\n case \"code\":\n return <CodeStyleControls element={element} onPatch={onPatch as (p: Partial<CodeElement>) => void} />;\n case \"chart\":\n return <ChartStyleControls element={element} onPatch={onPatch as (p: Partial<ChartElement>) => void} />;\n case \"table\":\n return <TableStyleControls element={element} onPatch={onPatch as (p: Partial<TableElement>) => void} />;\n case \"embed\":\n return <EmbedStyleControls element={element} onPatch={onPatch as (p: Partial<EmbedElement>) => void} />;\n default:\n return <Text size=\"sm\" className=\"!text-zinc-500\">No style controls for this element type.</Text>;\n }\n}\n\nfunction TextStyleControls({ element, onPatch }: { element: TextElement; onPatch: (p: Partial<TextElement>) => void }) {\n const setStyle = (next: Partial<TextStyle>) => onPatch({ style: { ...element.style, ...next } } as Partial<TextElement>);\n const s = element.style ?? {};\n return (\n <div className=\"space-y-3\">\n <Textarea label=\"Content\" value={element.content} onValueChange={(v) => onPatch({ content: v })} rows={4} autoResize />\n <Select\n label=\"Format\"\n list={[\n { value: \"markdown\", label: \"Markdown\" },\n { value: \"plain\", label: \"Plain\" },\n { value: \"html\", label: \"HTML\" },\n ]}\n value={element.format ?? \"markdown\"}\n onValueChange={(v) => onPatch({ format: v as TextElement[\"format\"] })}\n />\n <Separator />\n <Input label=\"Font size\" type=\"number\" value={String(s.fontSize ?? 28)} onChange={(e) => setStyle({ fontSize: parseFloat(e.target.value) || 28 })} />\n <Select\n label=\"Weight\"\n list={[\n { value: \"normal\", label: \"Normal\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"semibold\", label: \"Semibold\" },\n { value: \"bold\", label: \"Bold\" },\n ]}\n value={(s.weight as string) ?? \"normal\"}\n onValueChange={(v) => setStyle({ weight: v as TextStyle[\"weight\"] })}\n />\n <Select\n label=\"Align\"\n list={[\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n { value: \"right\", label: \"Right\" },\n { value: \"justify\", label: \"Justify\" },\n ]}\n value={s.align ?? \"left\"}\n onValueChange={(v) => setStyle({ align: v as TextStyle[\"align\"] })}\n />\n <Select\n label=\"Vertical align\"\n list={[\n { value: \"top\", label: \"Top\" },\n { value: \"middle\", label: \"Middle\" },\n { value: \"bottom\", label: \"Bottom\" },\n ]}\n value={s.verticalAlign ?? \"top\"}\n onValueChange={(v) => setStyle({ verticalAlign: v as TextStyle[\"verticalAlign\"] })}\n />\n <Input label=\"Line height\" type=\"number\" value={String(s.lineHeight ?? 1.4)} onChange={(e) => setStyle({ lineHeight: parseFloat(e.target.value) || 1.4 })} />\n <div className=\"flex gap-4\">\n <Switch label=\"Italic\" checked={!!s.italic} onCheckedChange={(v) => setStyle({ italic: v })} />\n <Switch label=\"Underline\" checked={!!s.underline} onCheckedChange={(v) => setStyle({ underline: v })} />\n </div>\n <FieldLabel label=\"Color\"><ColorPicker value={s.color ?? \"#0f172a\"} onChange={(c) => setStyle({ color: c })} /></FieldLabel>\n </div>\n );\n}\n\nfunction ImageStyleControls({ element, onPatch }: { element: ImageElement; onPatch: (p: Partial<ImageElement>) => void }) {\n const fileRef = useRef<HTMLInputElement>(null);\n const crop = element.crop;\n\n const onFile = (file: File | undefined) => {\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") onPatch({ src: reader.result });\n };\n reader.readAsDataURL(file);\n };\n\n const setCrop = (next: Partial<NonNullable<ImageElement[\"crop\"]>>) => {\n const base = crop ?? { x: 0, y: 0, w: 1, h: 1 };\n onPatch({ crop: { ...base, ...next } });\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Hidden native file input, triggered by the Action below. */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n onFile(e.target.files?.[0]);\n // Allow re-selecting the same file.\n e.target.value = \"\";\n }}\n />\n <Action size=\"sm\" variant=\"ghost\" icon=\"upload\" onClick={() => fileRef.current?.click()}>\n Upload image\n </Action>\n <Textarea label=\"Image URL\" value={element.src} onValueChange={(v) => onPatch({ src: v })} rows={2} />\n <Input label=\"Alt text\" value={element.alt ?? \"\"} onChange={(e) => onPatch({ alt: e.target.value })} />\n <Select\n label=\"Fit\"\n list={[\n { value: \"contain\", label: \"Contain\" },\n { value: \"cover\", label: \"Cover\" },\n { value: \"fill\", label: \"Fill (stretch)\" },\n { value: \"scale-down\", label: \"Scale down\" },\n ]}\n value={element.fit ?? \"contain\"}\n onValueChange={(v) => onPatch({ fit: v as ImageElement[\"fit\"] })}\n />\n <Separator />\n <div className=\"flex items-center justify-between\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">\n Crop\n </Heading>\n {crop && (\n <Action size=\"xs\" variant=\"ghost\" onClick={() => onPatch({ crop: undefined })}>\n Clear crop\n </Action>\n )}\n </div>\n <Slider label=\"X\" value={crop?.x ?? 0} onValueChange={(v) => setCrop({ x: Number(v) })} min={0} max={1} step={0.01} showValue />\n <Slider label=\"Y\" value={crop?.y ?? 0} onValueChange={(v) => setCrop({ y: Number(v) })} min={0} max={1} step={0.01} showValue />\n <Slider label=\"Width\" value={crop?.w ?? 1} onValueChange={(v) => setCrop({ w: Number(v) })} min={0.01} max={1} step={0.01} showValue />\n <Slider label=\"Height\" value={crop?.h ?? 1} onValueChange={(v) => setCrop({ h: Number(v) })} min={0.01} max={1} step={0.01} showValue />\n <Text size=\"xs\" className=\"!text-zinc-500\">\n Crop is a window into the source image (0..1). Width/height shrink the visible region; X/Y pan it.\n </Text>\n </div>\n );\n}\n\nfunction ShapeStyleControls({ element, onPatch }: { element: ShapeElement; onPatch: (p: Partial<ShapeElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Shape\"\n list={[\n { value: \"rect\", label: \"Rectangle\" },\n { value: \"rounded-rect\", label: \"Rounded rectangle\" },\n { value: \"ellipse\", label: \"Ellipse\" },\n { value: \"triangle\", label: \"Triangle\" },\n { value: \"line\", label: \"Line\" },\n { value: \"arrow\", label: \"Arrow\" },\n ]}\n value={element.shape}\n onValueChange={(v) => onPatch({ shape: v as ShapeElement[\"shape\"] })}\n />\n <FieldLabel label=\"Fill\"><ColorPicker value={element.fill ?? \"#ffffff\"} onChange={(c) => onPatch({ fill: c })} /></FieldLabel>\n <FieldLabel label=\"Stroke\"><ColorPicker value={element.stroke ?? \"#0f172a\"} onChange={(c) => onPatch({ stroke: c })} /></FieldLabel>\n <Slider label=\"Stroke width\" value={element.strokeWidth ?? 2} onValueChange={(v) => onPatch({ strokeWidth: Number(v) })} min={0} max={20} step={0.5} />\n <Switch label=\"Dashed stroke\" checked={!!element.dashed} onCheckedChange={(v) => onPatch({ dashed: v })} />\n {(element.shape === \"rounded-rect\" || element.shape === \"rect\") && (\n <Slider label=\"Corner radius\" value={element.radius ?? 0} onValueChange={(v) => onPatch({ radius: Number(v) })} min={0} max={40} />\n )}\n </div>\n );\n}\n\nfunction CodeStyleControls({ element, onPatch }: { element: CodeElement; onPatch: (p: Partial<CodeElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Textarea label=\"Code\" value={element.code} onValueChange={(v) => onPatch({ code: v })} rows={6} autoResize />\n <Input label=\"Language\" value={element.language ?? \"javascript\"} onChange={(e) => onPatch({ language: e.target.value })} />\n <Select\n label=\"Theme\"\n list={[\n { value: \"auto\", label: \"Auto\" },\n { value: \"light\", label: \"Light\" },\n { value: \"dark\", label: \"Dark\" },\n ]}\n value={element.codeTheme ?? \"auto\"}\n onValueChange={(v) => onPatch({ codeTheme: v })}\n />\n <Switch label=\"Line numbers\" checked={element.lineNumbers ?? true} onCheckedChange={(v) => onPatch({ lineNumbers: v })} />\n </div>\n );\n}\n\nfunction ChartStyleControls({ element, onPatch }: { element: ChartElement; onPatch: (p: Partial<ChartElement>) => void }) {\n const model = chartModelFromOption(element.option);\n const writeModel = (m: ChartModel) => onPatch({ option: chartOptionFromModel(m) });\n\n return (\n <div className=\"space-y-3\">\n {model ? (\n <ChartModelEditor model={model} onChange={writeModel} />\n ) : (\n <Text size=\"sm\" className=\"rounded-md bg-amber-50 p-2 !text-amber-700 dark:bg-amber-950/40 dark:!text-amber-400\">\n This chart's option is too custom for the visual editor. Edit it as JSON below.\n </Text>\n )}\n\n <details className=\"rounded-md border border-zinc-200 dark:border-zinc-800\">\n <summary className=\"cursor-pointer select-none px-2 py-1.5 text-xs font-medium text-zinc-600 dark:text-zinc-400\">\n Advanced — edit option JSON\n </summary>\n <div className=\"p-2 pt-0\">\n <Textarea\n label=\"ECharts option (JSON)\"\n value={JSON.stringify(element.option, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ option: JSON.parse(v) });\n } catch {\n /* ignore invalid JSON while typing */\n }\n }}\n rows={10}\n />\n </div>\n </details>\n </div>\n );\n}\n\nconst CHART_TYPE_OPTIONS = [\n { value: \"bar\", label: \"Bar\" },\n { value: \"line\", label: \"Line\" },\n { value: \"area\", label: \"Area\" },\n { value: \"pie\", label: \"Pie\" },\n { value: \"scatter\", label: \"Scatter\" },\n];\n\nfunction ChartModelEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const setKind = (kind: ChartKind) => {\n if (kind === model.kind) return;\n // Switching to/from pie reshapes the data; preserve what we can.\n if (kind === \"pie\") {\n const first = model.series[0];\n const slices = model.slices.length\n ? model.slices\n : (model.categories.length\n ? model.categories.map((name, i) => ({ name, value: first?.values[i] ?? 0 }))\n : [{ name: \"Slice 1\", value: 1 }]);\n onChange({ ...model, kind, slices });\n return;\n }\n if (model.kind === \"pie\") {\n const categories = model.slices.length ? model.slices.map((s) => s.name) : [\"A\", \"B\", \"C\"];\n const values = model.slices.length ? model.slices.map((s) => s.value) : [1, 2, 3];\n onChange({ ...model, kind, categories, series: [{ name: \"Series 1\", color: chartColorAt(0), values }] });\n return;\n }\n onChange({ ...model, kind });\n };\n\n return (\n <div className=\"space-y-3\">\n <Select\n label=\"Chart type\"\n list={CHART_TYPE_OPTIONS}\n value={model.kind}\n onValueChange={(v) => setKind(v as ChartKind)}\n />\n {model.kind === \"pie\" ? (\n <PieSliceEditor model={model} onChange={onChange} />\n ) : (\n <CartesianChartEditor model={model} onChange={onChange} />\n )}\n </div>\n );\n}\n\nfunction PieSliceEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const slices = model.slices;\n const update = (i: number, next: Partial<{ name: string; value: number }>) => {\n const copy = slices.map((s, idx) => (idx === i ? { ...s, ...next } : s));\n onChange({ ...model, slices: copy });\n };\n const remove = (i: number) => onChange({ ...model, slices: slices.filter((_, idx) => idx !== i) });\n const add = () => onChange({ ...model, slices: [...slices, { name: `Slice ${slices.length + 1}`, value: 0 }] });\n\n return (\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Slices</Heading>\n {slices.map((s, i) => (\n <div key={i} className=\"flex items-end gap-2\">\n <div className=\"flex-1\"><Input label={i === 0 ? \"Name\" : undefined} value={s.name} onChange={(e) => update(i, { name: e.target.value })} /></div>\n <div className=\"w-20\"><Input label={i === 0 ? \"Value\" : undefined} type=\"number\" value={String(s.value)} onChange={(e) => update(i, { value: parseFloat(e.target.value) || 0 })} /></div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => remove(i)} aria-label=\"Remove slice\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={add}>Add slice</Action>\n </div>\n );\n}\n\nfunction CartesianChartEditor({ model, onChange }: { model: ChartModel; onChange: (m: ChartModel) => void }) {\n const { categories, series } = model;\n\n const updateCategory = (i: number, label: string) => {\n onChange({ ...model, categories: categories.map((c, idx) => (idx === i ? label : c)) });\n };\n const removeCategory = (i: number) => {\n onChange({\n ...model,\n categories: categories.filter((_, idx) => idx !== i),\n series: series.map((s) => ({ ...s, values: s.values.filter((_, idx) => idx !== i) })),\n });\n };\n const addCategory = () => {\n onChange({\n ...model,\n categories: [...categories, `Cat ${categories.length + 1}`],\n series: series.map((s) => ({ ...s, values: [...s.values, 0] })),\n });\n };\n\n const updateSeries = (si: number, next: Partial<{ name: string; color: string }>) => {\n onChange({ ...model, series: series.map((s, idx) => (idx === si ? { ...s, ...next } : s)) });\n };\n const updateValue = (si: number, ci: number, value: number) => {\n onChange({\n ...model,\n series: series.map((s, idx) =>\n idx === si ? { ...s, values: s.values.map((v, vi) => (vi === ci ? value : v)) } : s,\n ),\n });\n };\n const removeSeries = (si: number) => onChange({ ...model, series: series.filter((_, idx) => idx !== si) });\n const addSeries = () =>\n onChange({\n ...model,\n series: [\n ...series,\n { name: `Series ${series.length + 1}`, color: chartColorAt(series.length), values: categories.map(() => 0) },\n ],\n });\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Categories</Heading>\n {categories.map((c, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <div className=\"flex-1\"><Input value={c} onChange={(e) => updateCategory(i, e.target.value)} /></div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeCategory(i)} aria-label=\"Remove category\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addCategory}>Add category</Action>\n </div>\n\n <Separator />\n\n <div className=\"space-y-3\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Series</Heading>\n {series.map((s, si) => (\n <div key={si} className=\"space-y-2 rounded-md border border-zinc-200 p-2 dark:border-zinc-800\">\n <div className=\"flex items-end gap-2\">\n <div className=\"flex-1\"><Input label=\"Name\" value={s.name} onChange={(e) => updateSeries(si, { name: e.target.value })} /></div>\n <FieldLabel label=\"Color\"><ColorPicker value={s.color ?? chartColorAt(si)} onChange={(c) => updateSeries(si, { color: c })} /></FieldLabel>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeSeries(si)} aria-label=\"Remove series\" />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {categories.map((c, ci) => (\n <Input\n key={ci}\n label={c}\n type=\"number\"\n value={String(s.values[ci] ?? 0)}\n onChange={(e) => updateValue(si, ci, parseFloat(e.target.value) || 0)}\n />\n ))}\n </div>\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addSeries}>Add series</Action>\n </div>\n </div>\n );\n}\n\nfunction TableStyleControls({ element, onPatch }: { element: TableElement; onPatch: (p: Partial<TableElement>) => void }) {\n const columns = element.columns;\n const rows = element.rows;\n\n /** Mint a column key that's unique among existing keys (col1, col2, …). */\n const nextColKey = (): string => {\n const existing = new Set(columns.map((c) => c.key));\n let n = columns.length + 1;\n while (existing.has(`col${n}`)) n++;\n return `col${n}`;\n };\n\n const setColumnLabel = (i: number, label: string) => {\n // Only the label changes — the key stays stable.\n onPatch({ columns: columns.map((c, idx) => (idx === i ? { ...c, label } : c)) });\n };\n const removeColumn = (i: number) => {\n const key = columns[i]?.key;\n const nextCols = columns.filter((_, idx) => idx !== i);\n const nextRows = key\n ? rows.map((r) => {\n const { [key]: _drop, ...rest } = r;\n return rest;\n })\n : rows;\n onPatch({ columns: nextCols, rows: nextRows });\n };\n const addColumn = () => {\n const key = nextColKey();\n onPatch({\n columns: [...columns, { key, label: `Column ${columns.length + 1}` }],\n rows: rows.map((r) => ({ ...r, [key]: \"\" })),\n });\n };\n\n const setCell = (rowIdx: number, key: string, value: string) => {\n onPatch({ rows: rows.map((r, idx) => (idx === rowIdx ? { ...r, [key]: value } : r)) });\n };\n const removeRow = (rowIdx: number) => onPatch({ rows: rows.filter((_, idx) => idx !== rowIdx) });\n const addRow = () => {\n const blank: Record<string, unknown> = {};\n for (const c of columns) blank[c.key] = \"\";\n onPatch({ rows: [...rows, blank] });\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Columns</Heading>\n {columns.map((c, i) => (\n <div key={c.key} className=\"flex items-center gap-2\">\n <div className=\"flex-1\">\n <Input value={c.label} onChange={(e) => setColumnLabel(i, e.target.value)} aria-label={`Column ${i + 1} label`} />\n </div>\n <Text size=\"xs\" className=\"!font-mono !text-zinc-400\">{c.key}</Text>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeColumn(i)} aria-label=\"Remove column\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addColumn}>Add column</Action>\n </div>\n\n <Separator />\n\n <div className=\"space-y-2\">\n <Heading as=\"h4\" size=\"xs\" className=\"!uppercase !tracking-wider !text-zinc-500\">Rows</Heading>\n {columns.length === 0 ? (\n <Text size=\"xs\" className=\"!text-zinc-500\">Add a column to start adding rows.</Text>\n ) : (\n <>\n {rows.map((r, rowIdx) => (\n <div key={rowIdx} className=\"flex items-start gap-2 border-b border-zinc-100 pb-2 dark:border-zinc-800\">\n <div className=\"grid flex-1 grid-cols-1 gap-1\">\n {columns.map((c) => (\n <Input\n key={c.key}\n label={c.label}\n value={r[c.key] == null ? \"\" : String(r[c.key])}\n onChange={(e) => setCell(rowIdx, c.key, e.target.value)}\n />\n ))}\n </div>\n <Action size=\"xs\" variant=\"ghost\" color=\"red\" icon=\"x\" onClick={() => removeRow(rowIdx)} aria-label=\"Remove row\" />\n </div>\n ))}\n <Action size=\"xs\" variant=\"ghost\" icon=\"plus\" onClick={addRow}>Add row</Action>\n </>\n )}\n </div>\n\n <details className=\"rounded-md border border-zinc-200 dark:border-zinc-800\">\n <summary className=\"cursor-pointer select-none px-2 py-1.5 text-xs font-medium text-zinc-600 dark:text-zinc-400\">\n Edit as JSON\n </summary>\n <div className=\"space-y-3 p-2 pt-0\">\n <Textarea\n label=\"Columns (JSON)\"\n value={JSON.stringify(columns, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ columns: JSON.parse(v) });\n } catch {\n /* ignore */\n }\n }}\n rows={5}\n />\n <Textarea\n label=\"Rows (JSON)\"\n value={JSON.stringify(rows, null, 2)}\n onValueChange={(v) => {\n try {\n onPatch({ rows: JSON.parse(v) });\n } catch {\n /* ignore */\n }\n }}\n rows={8}\n />\n </div>\n </details>\n </div>\n );\n}\n\nfunction EmbedStyleControls({ element, onPatch }: { element: EmbedElement; onPatch: (p: Partial<EmbedElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Input label=\"Embed URL\" value={element.src} onChange={(e) => onPatch({ src: e.target.value })} />\n <Input label=\"Title (a11y)\" value={element.title ?? \"\"} onChange={(e) => onPatch({ title: e.target.value })} />\n <Input label=\"Sandbox\" value={element.sandbox ?? \"allow-scripts\"} onChange={(e) => onPatch({ sandbox: e.target.value })} />\n </div>\n );\n}\n\nfunction FieldLabel({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <label className=\"block\">\n <span className=\"mb-1 block text-xs font-medium text-zinc-600 dark:text-zinc-400\">{label}</span>\n {children}\n </label>\n );\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n\nfunction roundFrac(n: number): number {\n return Math.round(n * 1000) / 1000;\n}\n","import { Heading, Textarea } from \"@particle-academy/react-fancy\";\n\nexport interface SpeakerNotesProps {\n notes?: string;\n onChange: (notes: string) => void;\n placeholder?: string;\n}\n\n/**\n * Bottom-of-editor speaker notes panel. Just a labelled `Textarea` from\n * react-fancy — the rest of the editor chrome controls how much vertical\n * space this gets.\n */\nexport function SpeakerNotes({ notes, onChange, placeholder }: SpeakerNotesProps) {\n return (\n <div className=\"fs-notes border-t border-zinc-200 bg-white p-3 dark:border-zinc-800 dark:bg-zinc-950\">\n <Heading as=\"h3\" size=\"xs\" className=\"mb-1 !uppercase !tracking-wider !text-zinc-500\">\n Speaker notes\n </Heading>\n <Textarea\n value={notes ?? \"\"}\n onValueChange={onChange}\n placeholder={placeholder ?? \"Notes are visible only to the presenter…\"}\n rows={3}\n autoResize\n minRows={2}\n maxRows={6}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState, type ReactNode } from \"react\";\nimport type {\n ChartElement,\n CodeElement,\n Deck,\n DeckOp,\n ImageElement,\n ShapeElement,\n ShapeKind,\n Slide as SlideData,\n SlideElement,\n TableElement,\n TextElement,\n} from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { elementId } from \"../../utils/ids\";\nimport { useDeckState } from \"../../hooks/use-deck-state\";\nimport { chartStarterOption, type ChartKind } from \"../../utils/chart-presets\";\nimport { Slide } from \"../Slide\";\nimport { SlideRail } from \"../SlideRail\";\nimport { EditorToolbar } from \"../EditorToolbar\";\nimport { ElementInspector } from \"../ElementInspector\";\nimport { SpeakerNotes } from \"../SpeakerNotes\";\nimport { defaultElementRegistry } from \"../../registry\";\n\nexport interface DeckEditorProps {\n /** Controlled deck — pair with `onChange`. */\n value: Deck;\n onChange: (next: Deck) => void;\n /** Called after every mutation with the op that produced it — feed into AgentPanel / audit log. */\n onOp?: (op: DeckOp) => void;\n /** Called when the user clicks Present. The host decides how to open the SlideViewer. */\n onPresent?: () => void;\n /** Controlled selected slide id. Uncontrolled by default. */\n selectedSlideId?: string | null;\n onSelectedSlideChange?: (id: string | null) => void;\n /**\n * Renderer for chart / code / table / embed elements (the elements this\n * package doesn't render natively). Defaults to the built-in\n * `defaultElementRegistry` so the editor is full out of the box; pass your\n * own to override (it wins entirely). The optional-peer hosts (chart/code)\n * load fancy-echarts/fancy-code via guarded dynamic imports, so the base\n * bundle never statically requires them.\n */\n renderElement?: (element: SlideElement, slideWidthPx: number) => ReactNode | undefined;\n /** Hide the slide rail (e.g. for embedded use). */\n hideRail?: boolean;\n /** Hide the speaker notes panel. */\n hideNotes?: boolean;\n /** Hide the toolbar. */\n hideToolbar?: boolean;\n /** Hide the inspector. */\n hideInspector?: boolean;\n /** Optional extra content on the toolbar's trailing edge. */\n toolbarExtra?: ReactNode;\n className?: string;\n}\n\n/**\n * Full deck editor — toolbar + rail + canvas + inspector + speaker notes.\n *\n * Controlled (`value` + `onChange`). State is intentionally simple: deck\n * lives in the consumer, the editor just renders a view + dispatches ops.\n * The same `DeckOp` enum that the agent bridge speaks runs through here —\n * agents and humans drive identical mutations.\n */\nexport function DeckEditor({\n value,\n onChange,\n onOp,\n onPresent,\n selectedSlideId: controlledSlideId,\n onSelectedSlideChange,\n renderElement = defaultElementRegistry,\n hideRail = false,\n hideNotes = false,\n hideToolbar = false,\n hideInspector = false,\n toolbarExtra,\n className,\n}: DeckEditorProps) {\n const deck = value;\n const ops = useDeckState({ value: deck, onChange, onOp });\n\n // Slide selection — controlled or internal.\n const [internalSlideId, setInternalSlideId] = useState<string | null>(deck.slides[0]?.id ?? null);\n const isControlled = controlledSlideId !== undefined;\n const slideId = isControlled ? controlledSlideId! : internalSlideId;\n const setSlideId = useCallback(\n (id: string | null) => {\n if (!isControlled) setInternalSlideId(id);\n onSelectedSlideChange?.(id);\n },\n [isControlled, onSelectedSlideChange],\n );\n\n // If the selected slide disappears (deletion / agent ops), fall back to the first slide.\n useEffect(() => {\n if (slideId && !deck.slides.some((s) => s.id === slideId)) {\n setSlideId(deck.slides[0]?.id ?? null);\n } else if (!slideId && deck.slides.length > 0) {\n setSlideId(deck.slides[0]!.id);\n }\n }, [deck.slides, slideId, setSlideId]);\n\n const slide: SlideData | undefined = deck.slides.find((s) => s.id === slideId);\n\n // Element selection — internal, resets on slide change.\n const [elementIdSelected, setElementIdSelected] = useState<string | null>(null);\n useEffect(() => {\n setElementIdSelected(null);\n }, [slideId]);\n\n const selectedElement = slide && elementIdSelected ? slide.elements.find((e) => e.id === elementIdSelected) ?? null : null;\n\n // ─── Toolbar insert handlers ───────────────────────────────────────────\n const insert = useCallback(\n (element: Omit<SlideElement, \"id\">) => {\n if (!slide) return;\n const id = ops.addElement(slide.id, { id: elementId(), ...element });\n setElementIdSelected(id);\n },\n [slide, ops],\n );\n\n const insertText = useCallback(\n () =>\n insert({\n type: \"text\",\n x: 0.1,\n y: 0.4,\n w: 0.8,\n h: 0.2,\n content: \"Click to edit\",\n format: \"plain\",\n style: { fontSize: 36, weight: \"semibold\", align: \"center\" },\n } as Omit<TextElement, \"id\">),\n [insert],\n );\n\n const insertImage = useCallback(\n () =>\n insert({\n type: \"image\",\n x: 0.25,\n y: 0.25,\n w: 0.5,\n h: 0.5,\n src: \"https://placehold.co/600x400?text=Image\",\n fit: \"contain\",\n } as Omit<ImageElement, \"id\">),\n [insert],\n );\n\n const insertShape = useCallback(\n (shape: ShapeKind) =>\n insert({\n type: \"shape\",\n shape,\n x: 0.3,\n y: 0.3,\n w: 0.4,\n h: 0.4,\n fill: shape === \"line\" || shape === \"arrow\" ? \"none\" : \"rgba(139,92,246,0.15)\",\n stroke: \"#8b5cf6\",\n strokeWidth: 2,\n } as Omit<ShapeElement, \"id\">),\n [insert],\n );\n\n const insertChart = useCallback(\n (kind: ChartKind = \"bar\") =>\n insert({\n type: \"chart\",\n x: 0.1,\n y: 0.2,\n w: 0.8,\n h: 0.6,\n option: chartStarterOption(kind),\n } as Omit<ChartElement, \"id\">),\n [insert],\n );\n\n const insertCode = useCallback(\n () =>\n insert({\n type: \"code\",\n x: 0.15,\n y: 0.2,\n w: 0.7,\n h: 0.6,\n code: \"function hello() {\\n return \\\"world\\\";\\n}\\n\",\n language: \"typescript\",\n codeTheme: \"dark\",\n } as Omit<CodeElement, \"id\">),\n [insert],\n );\n\n const insertTable = useCallback(\n () =>\n insert({\n type: \"table\",\n x: 0.15,\n y: 0.25,\n w: 0.7,\n h: 0.5,\n columns: [\n { key: \"name\", label: \"Name\" },\n { key: \"value\", label: \"Value\" },\n ],\n rows: [\n { name: \"Alpha\", value: 12 },\n { name: \"Beta\", value: 34 },\n { name: \"Gamma\", value: 56 },\n ],\n } as Omit<TableElement, \"id\">),\n [insert],\n );\n\n return (\n <div\n className={`fs-editor flex h-full w-full flex-col bg-zinc-100 dark:bg-zinc-950 ${className ?? \"\"}`}\n data-fancy-slides-editor={deck.id}\n >\n {/* Top toolbar */}\n {!hideToolbar && (\n <EditorToolbar\n title={deck.title}\n onTitleChange={(t) => ops.setTitle(t)}\n themeName={deck.theme.name}\n onApplyTheme={(t) => ops.applyTheme(t)}\n onInsertText={insertText}\n onInsertImage={insertImage}\n onInsertShape={insertShape}\n onInsertChart={insertChart}\n onInsertCode={insertCode}\n onInsertTable={insertTable}\n onPresent={onPresent}\n disabled={!slide}\n />\n )}\n\n {/* Main editing area */}\n <div className=\"flex min-h-0 flex-1\">\n {/* Slide rail */}\n {!hideRail && (\n <div className=\"w-56 shrink-0 overflow-y-auto border-r border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-950\">\n <SlideRail\n slides={deck.slides}\n selectedId={slideId}\n theme={deck.theme}\n onSelect={setSlideId}\n onAdd={(after) => {\n const id = ops.addSlide(after !== undefined ? after : deck.slides.length);\n setSlideId(id);\n }}\n onDuplicate={(id) => {\n const newId = ops.duplicateSlide(id);\n setSlideId(newId);\n }}\n onRemove={(id) => ops.removeSlide(id)}\n onReorder={(id, toIndex) => ops.reorderSlide(id, toIndex)}\n renderElement={renderElement}\n />\n </div>\n )}\n\n {/* Canvas + notes */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex flex-1 items-center justify-center overflow-auto p-6\">\n {slide ? (\n <div\n className=\"rounded-lg shadow-xl\"\n style={{\n width: \"min(96%, 1280px)\",\n aspectRatio: String(resolveTheme(deck.theme).aspectRatio ?? 16 / 9),\n background: \"white\",\n }}\n >\n <Slide\n slide={slide}\n theme={deck.theme}\n editing\n onElementContentChange={(eid, content) => ops.updateElement(slide.id, eid, { content, format: \"markdown\" } as Partial<TextElement>)}\n onElementSelect={setElementIdSelected}\n selectedElementId={elementIdSelected}\n onElementMove={(eid, x, y) => ops.moveElement(slide.id, eid, x, y)}\n onElementResize={(eid, patch) => ops.updateElement(slide.id, eid, patch as Partial<SlideElement>)}\n renderElement={renderElement}\n />\n </div>\n ) : (\n <div className=\"grid place-items-center rounded-lg border border-dashed border-zinc-300 bg-white px-12 py-24 text-sm text-zinc-500 dark:border-zinc-700 dark:bg-zinc-950\">\n Add a slide to start editing.\n </div>\n )}\n </div>\n\n {/* Speaker notes */}\n {!hideNotes && slide && (\n <SpeakerNotes notes={slide.notes} onChange={(n) => ops.setNotes(slide.id, n)} />\n )}\n </div>\n\n {/* Inspector */}\n {!hideInspector && (\n <div className=\"w-72 shrink-0 overflow-y-auto\">\n <ElementInspector\n element={selectedElement}\n slide={slide ?? null}\n onPatch={(patch) => slide && elementIdSelected && ops.updateElement(slide.id, elementIdSelected, patch)}\n onDelete={() => {\n if (!slide || !elementIdSelected) return;\n ops.removeElement(slide.id, elementIdSelected);\n setElementIdSelected(null);\n }}\n onLockToggle={(locked) => slide && elementIdSelected && ops.updateElement(slide.id, elementIdSelected, { locked } as Partial<SlideElement>)}\n onSetTransition={(transition) => slide && ops.setTransition(slide.id, transition)}\n onSetBackground={(background) => slide && ops.setBackground(slide.id, background)}\n onSetLayout={(layout) => slide && ops.setLayout(slide.id, layout)}\n onSetAnimation={(animation) => slide && elementIdSelected && ops.setAnimation(slide.id, elementIdSelected, animation)}\n onSetElementAnimation={(eid, animation) => slide && ops.setAnimation(slide.id, eid, animation)}\n />\n </div>\n )}\n </div>\n\n {toolbarExtra}\n </div>\n );\n}\n","/**\n * The fancy-slides data model.\n *\n * Every shape here is JSON-friendly — pure objects, arrays, primitives, and\n * tagged unions. No React children, no functions, no class instances. This\n * is the contract the deck schema commits to: an LLM can emit a deck, a\n * server can store one, a designer can hand-edit one, and the viewer +\n * editor will render it identically.\n *\n * Coordinate system: elements position themselves in slide-relative units\n * where the slide is a 1.0 × (1 / aspectRatio) rectangle. So `x: 0.5, y: 0.5`\n * is the centre of the slide regardless of how big it's rendered. This\n * keeps decks resolution-independent — a fullscreen 1920×1080 viewer and a\n * thumbnail at 320×180 render the same layout.\n */\n\n// ─── Deck ──────────────────────────────────────────────────────────────────\n\nexport interface Deck {\n /** Stable id. Required even when persistence is in-memory. */\n id: string;\n /** Human title — shown in the editor chrome + browser tab. */\n title: string;\n /** Ordered slide list. The viewer steps through in this order. */\n slides: Slide[];\n /** Visual theme for the whole deck. */\n theme: Theme;\n /**\n * Schema version the deck was authored against. Omitted == version 1 (the\n * implicit version for decks created before versioning). Used by the\n * serialize / parse helpers to migrate older shapes forward. Mirrors\n * `dark-slide`'s `Schema::SCHEMA_VERSION`.\n */\n version?: number;\n /** Free-form metadata — `{ author, createdAt, updatedAt, tags, … }`. */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Current deck schema version. Bump when a structural change needs migration on\n * load. Kept in lockstep with the sibling `dark-slide` PHP package.\n */\nexport const SCHEMA_VERSION = 1;\n\n// ─── Slide ─────────────────────────────────────────────────────────────────\n\n/** Layout presets that pre-populate / constrain element placement. */\nexport type SlideLayout =\n | \"blank\" // empty canvas, free placement\n | \"title\" // centered title\n | \"title-content\" // title at top, content area below\n | \"two-column\" // left + right halves\n | \"section-divider\" // section header with subtitle\n | \"image-text\" // image left, text right\n | \"text-image\" // text left, image right\n | \"quote\"; // big centered quote\n\nexport interface Slide {\n /** Stable id. */\n id: string;\n /** Optional layout preset. Mostly used by agents — humans tend to free-place. */\n layout?: SlideLayout;\n /** Elements rendered on the slide in z-order (last on top). */\n elements: SlideElement[];\n /** Background fill — color, image, or gradient. Inherits from theme when absent. */\n background?: SlideBackground;\n /** Entrance transition for this slide. Inherits from theme.transition when absent. */\n transition?: SlideTransition;\n /** Speaker notes — markdown. */\n notes?: string;\n /** Free-form metadata — `{ title, tags, durationSec, … }`. */\n metadata?: Record<string, unknown>;\n}\n\n// ─── Elements ──────────────────────────────────────────────────────────────\n\n/**\n * Every element is positioned in slide-relative coordinates (0..1). x/y are\n * the top-left corner; w/h are width/height as a fraction of the slide.\n */\nexport interface ElementBase {\n /** Stable id. Agents reference elements by id. */\n id: string;\n /** Element kind — discriminator. */\n type: SlideElement[\"type\"];\n /** Left edge, 0..1 (fraction of slide width). */\n x: number;\n /** Top edge, 0..1 (fraction of slide height). */\n y: number;\n /** Width, 0..1. */\n w: number;\n /** Height, 0..1. */\n h: number;\n /** Rotation in degrees, clockwise. */\n rotation?: number;\n /** Z-order — higher renders on top. Falls back to array order when undefined. */\n z?: number;\n /** Lock from editing. */\n locked?: boolean;\n /** Hide on this slide (still in the data — for animated reveals). */\n hidden?: boolean;\n /**\n * Whole-element hyperlink. When set, the element becomes a click target in\n * the viewer (opens in a new tab) and the pptx writer emits an\n * `<a:hlinkClick>` on the shape / picture. For rich inline links *within*\n * text, use a markdown `[label](url)` in the text content instead.\n */\n href?: string;\n /** Entrance build animation — when present the element participates in the slide's build sequence. */\n animation?: ElementAnimation;\n}\n\n// ─── Element entrance animations (builds) ────────────────────────────────────\n\n/** Visual entrance effect played when an element builds onto the slide. */\nexport type AnimationEffect = \"fade\" | \"fly-in\" | \"zoom\" | \"wipe\";\n\n/** When an element's build fires relative to the surrounding builds. */\nexport type AnimationTrigger = \"on-click\" | \"with-prev\" | \"after-prev\";\n\n/**\n * Per-element entrance animation (\"build step\"). Elements with an `animation`\n * start hidden and reveal as the presenter advances through the slide's build\n * sequence. The shape is shared with the sibling `dark-slide` PHP package, so\n * keep it byte-for-byte aligned.\n */\nexport interface ElementAnimation {\n /** Visual effect. */\n effect: AnimationEffect;\n /** When the build fires relative to its neighbours. Default `\"on-click\"`. */\n trigger?: AnimationTrigger;\n /** Direction for `fly-in` / `wipe`. Default `\"left\"`. */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n /** Effect duration in ms. Default `500`. */\n duration?: number;\n /** Delay before the effect starts, in ms. Default `0`. */\n delay?: number;\n /** Build order within the slide, ascending; ties broken by element array index. */\n order?: number;\n /**\n * Reveal a TEXT element one paragraph/line at a time (PowerPoint/Google\n * Slides \"By paragraph\"). The element expands into one build per paragraph\n * — the element's `content` split on `\"\\n\"` (a trailing empty line is\n * dropped). The first paragraph uses this animation's `trigger`; every\n * subsequent paragraph reveals on a fresh click. Only meaningful for text\n * elements; ignored for other types and when the element has 0/1 paragraphs\n * (then it behaves like a normal single build).\n */\n byParagraph?: boolean;\n}\n\nexport interface TextElement extends ElementBase {\n type: \"text\";\n /** Content — markdown by default; can also be plain text or HTML. */\n content: string;\n /** Content format. Defaults to `\"markdown\"`. */\n format?: \"markdown\" | \"html\" | \"plain\";\n /** Typography. */\n style?: TextStyle;\n}\n\nexport interface TextStyle {\n /** Font family — falls back to theme.fonts.body. */\n fontFamily?: string;\n /** Font size in px at the slide's design width (theme.slideWidth). */\n fontSize?: number;\n /** Font weight (`100..900`, or `\"normal\" | \"bold\"`). */\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | number;\n /** Horizontal alignment. */\n align?: \"left\" | \"center\" | \"right\" | \"justify\";\n /** Vertical alignment within the box. */\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n /** Color (any CSS color). Falls back to theme.colors.text. */\n color?: string;\n /** Line height (multiplier). */\n lineHeight?: number;\n /** Italic. */\n italic?: boolean;\n /** Underline. */\n underline?: boolean;\n}\n\nexport interface ImageElement extends ElementBase {\n type: \"image\";\n /** Image URL or data URI. */\n src: string;\n /** Alt text for accessibility. */\n alt?: string;\n /** How the image is fit inside its box. */\n fit?: \"contain\" | \"cover\" | \"fill\" | \"scale-down\";\n /** Optional crop window (slide-relative). */\n crop?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface ChartElement extends ElementBase {\n type: \"chart\";\n /** Apache ECharts option object. Passed straight to `<EChart>`. */\n option: Record<string, unknown>;\n /** Theme name passed to `<EChart>`. */\n chartTheme?: string;\n}\n\nexport interface CodeElement extends ElementBase {\n type: \"code\";\n /** Source code. */\n code: string;\n /** Language alias for the highlighter. */\n language?: string;\n /** Show line numbers. Defaults to `true`. */\n lineNumbers?: boolean;\n /** Theme — `\"light\"`, `\"dark\"`, `\"auto\"`, or a custom registered name. */\n codeTheme?: string;\n}\n\nexport interface TableElement extends ElementBase {\n type: \"table\";\n /** Column definitions — `{ key, label }`. */\n columns: Array<{ key: string; label: string }>;\n /** Row data — array of objects keyed by column. */\n rows: Array<Record<string, unknown>>;\n}\n\nexport type ShapeKind = \"rect\" | \"rounded-rect\" | \"ellipse\" | \"line\" | \"arrow\" | \"triangle\";\n\nexport interface ShapeElement extends ElementBase {\n type: \"shape\";\n shape: ShapeKind;\n /** Fill color (any CSS color, or `\"none\"`). */\n fill?: string;\n /** Stroke color. */\n stroke?: string;\n /** Stroke width in px at the slide's design width. */\n strokeWidth?: number;\n /** Dashed stroke. */\n dashed?: boolean;\n /** Corner radius (px) for `rect` / `rounded-rect`. */\n radius?: number;\n}\n\nexport interface EmbedElement extends ElementBase {\n type: \"embed\";\n /** Embed URL — typically a video, dashboard, or fancy-screens Screen. */\n src: string;\n /** iframe `title` for accessibility. */\n title?: string;\n /** Sandbox attribute. Defaults to allow-scripts (no allow-same-origin). */\n sandbox?: string;\n}\n\nexport type SlideElement =\n | TextElement\n | ImageElement\n | ChartElement\n | CodeElement\n | TableElement\n | ShapeElement\n | EmbedElement;\n\n// ─── Background, transitions, theme ────────────────────────────────────────\n\nexport interface SlideBackground {\n /** Solid color, or `\"transparent\"` to inherit theme. */\n color?: string;\n /** Image background URL. Takes precedence over color when present. */\n image?: string;\n /** How the background image is fit. Defaults to `\"cover\"`. */\n imageFit?: \"contain\" | \"cover\" | \"fill\";\n /** Optional gradient — `\"linear-gradient(...)\"` or `\"radial-gradient(...)\"` string. */\n gradient?: string;\n}\n\nexport type TransitionKind = \"none\" | \"fade\" | \"slide\" | \"zoom\";\n\nexport interface SlideTransition {\n kind: TransitionKind;\n /** Duration in ms. */\n duration?: number;\n /** Direction for `slide` transitions. */\n direction?: \"left\" | \"right\" | \"up\" | \"down\";\n}\n\nexport interface Theme {\n /** Theme name — used for serialization + agent routing. */\n name: string;\n /** Aspect ratio — defaults to 16:9. Custom themes can pick anything. */\n aspectRatio?: number;\n /** Design width in px. Slides scale to fit; this just sets the unit base for fontSize/strokeWidth. */\n slideWidth?: number;\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n /** Default transition for slides that don't specify their own. */\n defaultTransition?: SlideTransition;\n}\n\nexport interface ThemeColors {\n background?: string;\n text?: string;\n muted?: string;\n accent?: string;\n surface?: string;\n}\n\nexport interface ThemeFonts {\n /** Used for `Heading`-like text elements (the default for large fontSize). */\n heading?: string;\n /** Used for body text. */\n body?: string;\n /** Used by CodeElement. */\n mono?: string;\n}\n\n// ─── Agent / Human+ surface ────────────────────────────────────────────────\n\n/**\n * Agent activity broadcast whenever the deck mutates. Hosts subscribe to feed\n * an AgentPanel, presence layer, or audit log.\n */\nexport interface DeckActivity {\n /** Stable activity id. */\n id: string;\n /** Wall-clock timestamp. */\n at: number;\n /** Who made the change. */\n actor: { kind: \"human\" | \"agent\"; id: string; name?: string; color?: string };\n /** What changed. */\n op: DeckOp;\n}\n\nexport type DeckOp =\n | { kind: \"deck_set_title\"; title: string }\n | { kind: \"deck_apply_theme\"; theme: Theme }\n /** Replace the entire deck atomically — stream a full presentation IN in one op. */\n | { kind: \"deck_set\"; deck: Deck }\n | { kind: \"slide_add\"; index: number; slide: Slide }\n | { kind: \"slide_remove\"; id: string }\n | { kind: \"slide_reorder\"; id: string; toIndex: number }\n | { kind: \"slide_set_layout\"; id: string; layout: SlideLayout }\n | { kind: \"slide_set_notes\"; id: string; notes: string }\n | { kind: \"slide_set_background\"; id: string; background?: SlideBackground }\n | { kind: \"slide_set_transition\"; id: string; transition?: SlideTransition }\n | { kind: \"element_add\"; slideId: string; element: SlideElement }\n | { kind: \"element_remove\"; slideId: string; elementId: string }\n | { kind: \"element_update\"; slideId: string; elementId: string; patch: Partial<SlideElement> }\n | { kind: \"element_move\"; slideId: string; elementId: string; x: number; y: number }\n | { kind: \"element_resize\"; slideId: string; elementId: string; w: number; h: number }\n | { kind: \"element_set_animation\"; slideId: string; elementId: string; animation?: ElementAnimation };\n","/**\n * Stream a full presentation in and out. The `Deck` is already plain JSON\n * (no functions, no React children), so \"serialize\" is mostly `JSON.stringify`\n * — these helpers add the schema-version stamp, a forgiving structural\n * validation, and a forward-migration shim so a host can persist a deck, hand\n * it to an agent, and load it back safely.\n *\n * Streaming OUT: read `value` / `onChange` from the controlled editor, or call\n * `serializeDeck(deck)`.\n * Streaming IN: `parseDeck(json)` → feed to `DeckEditor`'s `value`, or apply a\n * `{ kind: \"deck_set\", deck }` op (also exposed as the bridge's `deck_set` tool).\n */\n\nimport type { Deck, SlideElement } from \"../types\";\nimport { SCHEMA_VERSION } from \"../types\";\n\nexport interface DeckValidation {\n ok: boolean;\n errors: string[];\n}\n\nconst ELEMENT_TYPES = [\"text\", \"image\", \"chart\", \"code\", \"table\", \"shape\", \"embed\"];\n\n/**\n * Structurally validate a deck. Forgiving by design — it checks the shape an\n * editor / writer relies on (ids, slides array, element types + 0..1 geometry),\n * not every optional field. Returns all problems found rather than throwing.\n */\nexport function validateDeck(deck: unknown): DeckValidation {\n const errors: string[] = [];\n const d = deck as Partial<Deck> | null | undefined;\n if (!d || typeof d !== \"object\") {\n return { ok: false, errors: [\"deck is not an object\"] };\n }\n if (typeof d.id !== \"string\" || !d.id) errors.push(\"deck.id must be a non-empty string\");\n if (typeof d.title !== \"string\") errors.push(\"deck.title must be a string\");\n if (!d.theme || typeof d.theme !== \"object\") errors.push(\"deck.theme must be an object\");\n if (!Array.isArray(d.slides)) {\n errors.push(\"deck.slides must be an array\");\n return { ok: errors.length === 0, errors };\n }\n d.slides.forEach((slide, si) => {\n if (!slide || typeof slide !== \"object\") {\n errors.push(`slides[${si}] is not an object`);\n return;\n }\n if (typeof slide.id !== \"string\" || !slide.id) errors.push(`slides[${si}].id must be a non-empty string`);\n if (!Array.isArray(slide.elements)) {\n errors.push(`slides[${si}].elements must be an array`);\n return;\n }\n slide.elements.forEach((el: SlideElement, ei) => {\n const where = `slides[${si}].elements[${ei}]`;\n if (!el || typeof el !== \"object\") {\n errors.push(`${where} is not an object`);\n return;\n }\n if (typeof el.id !== \"string\" || !el.id) errors.push(`${where}.id must be a non-empty string`);\n if (!ELEMENT_TYPES.includes(el.type)) errors.push(`${where}.type \"${el.type}\" is not a known element type`);\n for (const k of [\"x\", \"y\", \"w\", \"h\"] as const) {\n const v = el[k];\n if (typeof v !== \"number\" || v < 0 || v > 1) errors.push(`${where}.${k} must be a number in 0..1`);\n }\n });\n });\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Migrate a deck authored against an older schema version forward to the\n * current one. Today it only stamps the version (no breaking changes yet); the\n * `switch` is where future migrations slot in, each bumping `version` by one.\n */\nexport function migrateDeck(deck: Deck): Deck {\n let d = deck;\n let v = d.version ?? 1;\n while (v < SCHEMA_VERSION) {\n switch (v) {\n // case 1: d = { ...d, /* …migrate v1 → v2… */ }; break;\n default:\n v = SCHEMA_VERSION; // no migration registered — jump to current\n }\n v += 1;\n }\n return d.version === SCHEMA_VERSION ? d : { ...d, version: SCHEMA_VERSION };\n}\n\n/** Serialize a deck to a JSON string, stamping the current schema version. */\nexport function serializeDeck(deck: Deck, pretty = false): string {\n const stamped: Deck = deck.version === SCHEMA_VERSION ? deck : { ...deck, version: SCHEMA_VERSION };\n return JSON.stringify(stamped, null, pretty ? 2 : undefined);\n}\n\n/**\n * Parse a deck from a JSON string (or an already-parsed object), migrating it\n * forward and validating its structure. Throws a descriptive error when the\n * JSON is malformed or the structure is invalid — callers streaming untrusted\n * input should try/catch.\n */\nexport function parseDeck(input: string | unknown): Deck {\n let raw: unknown;\n if (typeof input === \"string\") {\n try {\n raw = JSON.parse(input);\n } catch (e) {\n throw new Error(`parseDeck: invalid JSON — ${(e as Error).message}`);\n }\n } else {\n raw = input;\n }\n const result = validateDeck(raw);\n if (!result.ok) {\n throw new Error(`parseDeck: invalid deck — ${result.errors.join(\"; \")}`);\n }\n return migrateDeck(raw as Deck);\n}\n"]}
|