@particle-academy/fancy-slides 0.1.7 → 0.2.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 +156 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -5
- package/dist/index.d.ts +12 -5
- package/dist/index.js +157 -4
- package/dist/index.js.map +1 -1
- package/dist/registry.d.cts +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/{types-Bc-psiRF.d.cts → types-B2ecrEAz.d.cts} +4 -0
- package/dist/{types-Bc-psiRF.d.ts → types-B2ecrEAz.d.ts} +4 -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/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"],"names":["jsx","jsxs","useEffect","useState","useRef","useCallback","useMemo","slideId","Action","Text","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","import { useId, type CSSProperties } from \"react\";\nimport { ContentRenderer } from \"@particle-academy/react-fancy\";\nimport type { TextElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\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\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}: 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 → textarea appears with the raw source, ready to edit.\n if (editing && selected) {\n return (\n <textarea\n value={element.content}\n onChange={(e) => onContentChange?.(e.target.value)}\n style={{\n ...css,\n whiteSpace: \"pre-wrap\",\n resize: \"none\",\n border: \"none\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n }}\n />\n );\n }\n\n if (format === \"plain\") {\n return <div style={css}>{element.content}</div>;\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 return (\n <div data-fs-text-scope={scopeId} style={css}>\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 <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 { ImageElement } from \"../../../types\";\n\nexport interface ImageElementRendererProps {\n element: ImageElement;\n}\n\nexport function ImageElementRenderer({ element }: ImageElementRendererProps) {\n return (\n <img\n src={element.src}\n alt={element.alt ?? \"\"}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: element.fit ?? \"contain\",\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 { Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\nimport { TextElementRenderer } from \"../elements/TextElement\";\nimport { ImageElementRenderer } from \"../elements/ImageElement\";\nimport { ShapeElementRenderer } from \"../elements/ShapeElement\";\nimport { SlideContext, isDarkColor, type SlideContextValue } from \"./slide-context\";\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 /** 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 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 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 {orderedElements(slide.elements).map((element) => (\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 />\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}\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}: 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 };\n\n const inner = renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange }) ?? renderElement?.(element, slideWidthPx);\n\n return (\n <div\n style={box}\n data-fancy-slides-element={element.id}\n data-fancy-slides-element-type={element.type}\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}\n\nfunction renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange }: 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 />\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\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. */\n goTo: (index: number) => 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 — previous slide\n * → / PageDown / Space — 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 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 (index > 0) goTo(index - 1);\n return;\n case \"ArrowRight\":\n case \"PageDown\":\n case \" \":\n e.preventDefault();\n 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, onExit, onBlank, onFullscreen]);\n}\n","import { useCallback, useEffect, 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 { cn } from \"../../utils/cn\";\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 /** Optional custom renderer for element types Slide doesn't render natively (chart/code/table/embed). */\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,\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 useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\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.\n useEffect(() => {\n if (!autoAdvanceMs || deck.slides.length <= 1) return;\n const t = setTimeout(() => {\n goTo(index + 1 < deck.slides.length ? index + 1 : 0);\n }, autoAdvanceMs);\n return () => clearTimeout(t);\n }, [autoAdvanceMs, index, deck.slides.length, goTo]);\n\n const slide = deck.slides[index];\n const theme = resolveTheme(deck.theme);\n const aspectRatio = theme.aspectRatio ?? 16 / 9;\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 >\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 <Slide slide={slide} theme={theme} renderElement={renderElement} />\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","import { useCallback, useEffect, useMemo, 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 { 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 useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onExit,\n });\n\n const theme = resolveTheme(deck.theme);\n const slide = deck.slides[index];\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} 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={() => goTo(index - 1)} disabled={index === 0}>\n ← Prev\n </NavButton>\n <NavButton onClick={() => goTo(index + 1)} disabled={index >= deck.slides.length - 1}>\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 { 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 */\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 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 ...style,\n }}\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-fancy-slides-thumbnail={slide.id}\n >\n <Slide slide={slide} theme={theme} width={width} renderElement={renderElement} />\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, Slide, SlideElement, SlideLayout, Theme, SlideBackground } 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 /** 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 /** 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 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 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 \"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 }\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","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 { Action, Card, ColorPicker, Heading, Input, Select, Separator, Slider, Tabs, Text, Textarea } from \"@particle-academy/react-fancy\";\nimport type { SlideElement, TextElement, TextStyle, ImageElement, ShapeElement, CodeElement, ChartElement, TableElement, EmbedElement } from \"../../types\";\n\nexport interface ElementInspectorProps {\n /** Element being inspected. `null` shows 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}\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 }: ElementInspectorProps) {\n if (!element) {\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=\"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=\"layout\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <LayoutSection element={element} onPatch={onPatch} />\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// ─── Sections ──────────────────────────────────────────────────────────────\n\nfunction LayoutSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\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 <Input label=\"Z-index\" type=\"number\" value={String(element.z ?? 0)} onChange={(e) => onPatch({ z: parseInt(e.target.value, 10) || 0 })} />\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\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 <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 return (\n <div className=\"space-y-3\">\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 </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 {(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 </div>\n );\n}\n\nfunction ChartStyleControls({ element, onPatch }: { element: ChartElement; onPatch: (p: Partial<ChartElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Text size=\"sm\" className=\"!text-zinc-500\">\n Chart option is JSON — paste any ECharts option here.\n </Text>\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 );\n}\n\nfunction TableStyleControls({ element, onPatch }: { element: TableElement; onPatch: (p: Partial<TableElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Textarea\n label=\"Columns (JSON)\"\n value={JSON.stringify(element.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(element.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 );\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\";\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 /** Optional renderer for chart / code / table / embed elements (the elements this package doesn't render natively). */\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,\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 } 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 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 />\n </div>\n )}\n </div>\n\n {toolbarExtra}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/default-theme.ts","../src/theme/theme-utils.ts","../src/utils/cn.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"],"names":["jsx","jsxs","useEffect","useState","useRef","useCallback","useMemo","slideId","Action","Text","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","import { useId, type CSSProperties } from \"react\";\nimport { ContentRenderer } from \"@particle-academy/react-fancy\";\nimport type { TextElement, Theme } from \"../../../types\";\nimport { resolveTheme } from \"../../../theme/theme-utils\";\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\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}: 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 → textarea appears with the raw source, ready to edit.\n if (editing && selected) {\n return (\n <textarea\n value={element.content}\n onChange={(e) => onContentChange?.(e.target.value)}\n style={{\n ...css,\n whiteSpace: \"pre-wrap\",\n resize: \"none\",\n border: \"none\",\n pointerEvents: \"auto\",\n cursor: \"text\",\n }}\n />\n );\n }\n\n if (format === \"plain\") {\n return <div style={css}>{element.content}</div>;\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 return (\n <div data-fs-text-scope={scopeId} style={css}>\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 <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 { ImageElement } from \"../../../types\";\n\nexport interface ImageElementRendererProps {\n element: ImageElement;\n}\n\nexport function ImageElementRenderer({ element }: ImageElementRendererProps) {\n return (\n <img\n src={element.src}\n alt={element.alt ?? \"\"}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: element.fit ?? \"contain\",\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 { Slide as SlideData, SlideElement, Theme } from \"../../types\";\nimport { resolveTheme } from \"../../theme/theme-utils\";\nimport { cn } from \"../../utils/cn\";\nimport { TextElementRenderer } from \"../elements/TextElement\";\nimport { ImageElementRenderer } from \"../elements/ImageElement\";\nimport { ShapeElementRenderer } from \"../elements/ShapeElement\";\nimport { SlideContext, isDarkColor, type SlideContextValue } from \"./slide-context\";\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 /** 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 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 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 {orderedElements(slide.elements).map((element) => (\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 />\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}\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}: 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 };\n\n const inner = renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange }) ?? renderElement?.(element, slideWidthPx);\n\n return (\n <div\n style={box}\n data-fancy-slides-element={element.id}\n data-fancy-slides-element-type={element.type}\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}\n\nfunction renderInner({ element, theme, slideWidthPx, editing, selected, onContentChange }: 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 />\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\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. */\n goTo: (index: number) => 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 — previous slide\n * → / PageDown / Space — 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 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 (index > 0) goTo(index - 1);\n return;\n case \"ArrowRight\":\n case \"PageDown\":\n case \" \":\n e.preventDefault();\n 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, 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 { cn } from \"../../utils/cn\";\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 /** Optional custom renderer for element types Slide doesn't render natively (chart/code/table/embed). */\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,\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 useEffect(() => {\n prevIndexRef.current = index;\n }, [index]);\n\n useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\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.\n useEffect(() => {\n if (!autoAdvanceMs || deck.slides.length <= 1) return;\n const t = setTimeout(() => {\n goTo(index + 1 < deck.slides.length ? index + 1 : 0);\n }, autoAdvanceMs);\n return () => clearTimeout(t);\n }, [autoAdvanceMs, index, deck.slides.length, goTo]);\n\n const slide = deck.slides[index];\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 >\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} 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, 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 { 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 useSlideKeyboard({\n total: deck.slides.length,\n index,\n goTo,\n onExit,\n });\n\n const theme = resolveTheme(deck.theme);\n const slide = deck.slides[index];\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} 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={() => goTo(index - 1)} disabled={index === 0}>\n ← Prev\n </NavButton>\n <NavButton onClick={() => goTo(index + 1)} disabled={index >= deck.slides.length - 1}>\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 { 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 */\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 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 ...style,\n }}\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-fancy-slides-thumbnail={slide.id}\n >\n <Slide slide={slide} theme={theme} width={width} renderElement={renderElement} />\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, 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 /** 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 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 }\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","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 { Action, Card, ColorPicker, Heading, Input, Select, Separator, Slider, Tabs, Text, Textarea } from \"@particle-academy/react-fancy\";\nimport type { Slide as SlideData, SlideBackground, SlideElement, SlideTransition, TextElement, TextStyle, ImageElement, ShapeElement, CodeElement, ChartElement, TableElement, EmbedElement } from \"../../types\";\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}\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 }: 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} />;\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=\"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=\"layout\">\n <Card padding=\"md\" className=\"!bg-white dark:!bg-zinc-950\">\n <LayoutSection element={element} onPatch={onPatch} />\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 */\nfunction SlideSettings({\n slide,\n onSetTransition,\n onSetBackground,\n}: {\n slide: SlideData;\n onSetTransition?: (transition?: SlideTransition) => void;\n onSetBackground?: (background?: SlideBackground) => 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\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 <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 <FieldLabel label=\"Color\">\n <ColorPicker\n value={slide.background?.color ?? \"#ffffff\"}\n onChange={(c) => onSetBackground({ ...slide.background, color: c })}\n />\n </FieldLabel>\n </div>\n </Card>\n )}\n </div>\n </div>\n );\n}\n\n// ─── Sections ──────────────────────────────────────────────────────────────\n\nfunction LayoutSection({ element, onPatch }: { element: SlideElement; onPatch: (p: Partial<SlideElement>) => void }) {\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 <Input label=\"Z-index\" type=\"number\" value={String(element.z ?? 0)} onChange={(e) => onPatch({ z: parseInt(e.target.value, 10) || 0 })} />\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\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 <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 return (\n <div className=\"space-y-3\">\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 </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 {(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 </div>\n );\n}\n\nfunction ChartStyleControls({ element, onPatch }: { element: ChartElement; onPatch: (p: Partial<ChartElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Text size=\"sm\" className=\"!text-zinc-500\">\n Chart option is JSON — paste any ECharts option here.\n </Text>\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 );\n}\n\nfunction TableStyleControls({ element, onPatch }: { element: TableElement; onPatch: (p: Partial<TableElement>) => void }) {\n return (\n <div className=\"space-y-3\">\n <Textarea\n label=\"Columns (JSON)\"\n value={JSON.stringify(element.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(element.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 );\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\";\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 /** Optional renderer for chart / code / table / embed elements (the elements this package doesn't render natively). */\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,\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 } 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 />\n </div>\n )}\n </div>\n\n {toolbarExtra}\n </div>\n );\n}\n"]}
|