@thanh01.pmt/presentation-kit 0.2.14 → 0.2.16
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/ai/index.cjs +145 -16
- package/dist/ai/index.cjs.map +1 -1
- package/dist/ai/index.d.cts +15 -15
- package/dist/ai/index.d.ts +15 -15
- package/dist/ai/index.js +132 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/{chunk-A7T5Y2G4.js → chunk-7QHDWDSB.js} +343 -187
- package/dist/chunk-7QHDWDSB.js.map +1 -0
- package/dist/{chunk-JIIUW2TN.cjs → chunk-JNTRKKJX.cjs} +343 -186
- package/dist/chunk-JNTRKKJX.cjs.map +1 -0
- package/dist/index.cjs +19 -15
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -2
- package/dist/react/index.cjs +23 -7
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +19 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +11 -10
- package/LICENSE +0 -21
- package/dist/chunk-A7T5Y2G4.js.map +0 -1
- package/dist/chunk-JIIUW2TN.cjs.map +0 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/hooks/useSlideState.ts","../../src/react/components/ThemeSwitcher.tsx","../../src/react/components/NavigationBar.tsx","../../src/react/components/PresentationView.tsx","../../src/react/components/DeckView.tsx","../../src/react/components/PresenterNotesDrawer.tsx","../../src/react/components/SlideDesignOverlay.tsx","../../src/react/components/SlideViewer.tsx","../../src/react/components/HtmlSlideViewer.tsx"],"names":["useState","useCallback","jsxs","jsx","React","useRef","useEffect","Fragment","themeName","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// useSlideState Hook — Centralized slide + click state management\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport { renderSlide } from '../../core/render.js';\nimport type { BuiltInTheme, SlideTheme, SlideRenderResult } from '../../types.js';\nimport type { SlideViewMode } from '../types.js';\n\nexport interface UseSlideStateOptions {\n markdown: string;\n initialTheme?: BuiltInTheme | SlideTheme;\n initialMode?: SlideViewMode;\n containerId?: string;\n /** Enable click-to-reveal system (default: false) */\n enableClicks?: boolean;\n}\n\nexport interface UseSlideStateReturn {\n // ── Render state ──\n /** Render result (null before first render) */\n result: SlideRenderResult | null;\n /** Whether initial render is complete */\n isReady: boolean;\n\n // ── Slide state ──\n /** Current slide index (0-based) */\n currentIndex: number;\n /** Total number of slides */\n slideCount: number;\n /** Current view mode */\n mode: SlideViewMode;\n /** Current theme */\n theme: BuiltInTheme | SlideTheme;\n\n // ── Click state ──\n /** Current click index (0 = nothing revealed, maxClicks = all revealed) */\n currentClick: number;\n /** Maximum clicks available on current slide */\n maxClicks: number;\n\n // ── Slide actions ──\n goToSlide: (index: number) => void;\n nextSlide: () => void;\n prevSlide: () => void;\n setMode: (mode: SlideViewMode) => void;\n setTheme: (theme: BuiltInTheme | SlideTheme) => void;\n rerender: () => void;\n\n // ── Click actions ──\n /** Advance to next click. If at max clicks, does nothing. */\n nextClick: () => void;\n /** Revert to previous click. If at 0, does nothing. */\n prevClick: () => void;\n /** Reset clicks to 0 (hide all click groups) */\n resetClicks: () => void;\n /** Set click index directly */\n setClickIndex: (index: number) => void;\n}\n\n/**\n * Centralized hook for slide + click state management.\n * Handles rendering, navigation, theme switching, mode toggling, and click-to-reveal.\n */\nexport function useSlideState(options: UseSlideStateOptions): UseSlideStateReturn {\n const {\n markdown,\n initialTheme = 'dark',\n initialMode = 'presentation',\n containerId,\n enableClicks = false,\n } = options;\n\n const [currentIndex, setCurrentIndex] = useState(0);\n const [mode, setMode] = useState<SlideViewMode>(initialMode);\n const [theme, setTheme] = useState<BuiltInTheme | SlideTheme>(initialTheme);\n const [currentClick, setCurrentClick] = useState(0);\n const renderCountRef = useRef(0);\n\n // Render slides synchronously (with click preprocessing if enabled)\n const result = useMemo(() => {\n if (!markdown || !markdown.trim()) return null;\n renderCountRef.current++;\n return renderSlide(markdown, {\n theme,\n enableMermaid: true,\n enableClicks,\n containerId: containerId ?? `slide-container-${renderCountRef.current}`,\n });\n }, [markdown, theme, containerId, enableClicks]);\n\n const slideCount = result?.slideCount ?? 1;\n const maxClicks = result?.maxClicks ?? 0;\n const isReady = result !== null;\n\n // Clamp currentIndex when slideCount changes\n useEffect(() => {\n if (result && currentIndex >= result.slideCount) {\n setCurrentIndex(Math.max(0, result.slideCount - 1));\n }\n }, [result?.slideCount, currentIndex]);\n\n // Reset clicks when slide changes\n useEffect(() => {\n setCurrentClick(0);\n }, [currentIndex]);\n\n // ── Slide navigation ──\n\n const goToSlide = useCallback(\n (index: number) => {\n setCurrentIndex(Math.max(0, Math.min(index, slideCount - 1)));\n },\n [slideCount],\n );\n\n const nextSlide = useCallback(() => {\n setCurrentIndex((prev) => Math.min(prev + 1, slideCount - 1));\n }, [slideCount]);\n\n const prevSlide = useCallback(() => {\n setCurrentIndex((prev) => Math.max(prev - 1, 0));\n }, []);\n\n // ── Click navigation ──\n\n const nextClick = useCallback(() => {\n setCurrentClick((prev) => Math.min(prev + 1, maxClicks));\n }, [maxClicks]);\n\n const prevClick = useCallback(() => {\n setCurrentClick((prev) => Math.max(prev - 1, 0));\n }, []);\n\n const resetClicks = useCallback(() => {\n setCurrentClick(0);\n }, []);\n\n const setClickIndex = useCallback(\n (index: number) => {\n setCurrentClick(Math.max(0, Math.min(index, maxClicks)));\n },\n [maxClicks],\n );\n\n // ── Combined navigation (click first, then slide) ──\n\n const goToSlideWithReset = useCallback(\n (index: number) => {\n setCurrentClick(0);\n setCurrentIndex(Math.max(0, Math.min(index, slideCount - 1)));\n },\n [slideCount],\n );\n\n const nextWithClick = useCallback(() => {\n if (currentClick < maxClicks) {\n // More clicks available — advance click\n setCurrentClick((prev) => prev + 1);\n } else {\n // No more clicks — go to next slide\n setCurrentClick(0);\n setCurrentIndex((prev) => Math.min(prev + 1, slideCount - 1));\n }\n }, [currentClick, maxClicks, slideCount]);\n\n const prevWithClick = useCallback(() => {\n if (currentClick > 0) {\n // Can revert click\n setCurrentClick((prev) => prev - 1);\n } else {\n // At click 0 — go to previous slide (and show all its clicks)\n setCurrentIndex((prev) => Math.max(prev - 1, 0));\n // Note: we don't set maxClicks here because it depends on the new slide's result\n // The consumer should handle this via useEffect on currentIndex change\n }\n }, [currentClick]);\n\n const rerender = useCallback(() => {\n setCurrentIndex((prev) => prev);\n }, []);\n\n return {\n // Render\n result,\n isReady,\n\n // Slide\n currentIndex,\n slideCount,\n mode,\n theme,\n\n // Click\n currentClick,\n maxClicks,\n\n // Slide actions\n goToSlide: goToSlideWithReset,\n nextSlide: nextWithClick,\n prevSlide: prevWithClick,\n setMode,\n setTheme,\n rerender,\n\n // Click actions\n nextClick,\n prevClick,\n resetClicks,\n setClickIndex,\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// ThemeSwitcher — Dark / Light / Navy toggle buttons\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { ThemeSwitcherProps, ThemeOption } from '../types.js';\n\n/** Default theme options */\nconst DEFAULT_THEMES: ThemeOption[] = [\n { id: 'dark', label: 'Dark' },\n { id: 'navy', label: 'Navy' },\n { id: 'light', label: 'Light' },\n];\n\n/**\n * ThemeSwitcher — Renders a row of theme toggle buttons.\n *\n * @example\n * ```tsx\n * <ThemeSwitcher currentTheme=\"dark\" onThemeChange={setTheme} />\n * ```\n */\nexport function ThemeSwitcher({\n currentTheme,\n onThemeChange,\n themes = DEFAULT_THEMES,\n className,\n}: ThemeSwitcherProps) {\n const currentId = typeof currentTheme === 'object' && currentTheme !== null && 'name' in currentTheme\n ? (currentTheme as { name: string }).name\n : String(currentTheme);\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '2px',\n padding: '2px',\n borderRadius: '8px',\n border: '1px solid rgba(128, 128, 128, 0.2)',\n backgroundColor: 'rgba(128, 128, 128, 0.05)',\n }}\n >\n {themes.map((theme) => {\n const isActive = currentId === theme.id;\n return (\n <button\n key={theme.id}\n type=\"button\"\n onClick={() => onThemeChange(theme.id)}\n title={`Theme: ${theme.label}`}\n style={{\n height: '28px',\n padding: '0 10px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n fontWeight: isActive ? 600 : 400,\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n border: 'none',\n lineHeight: 1,\n whiteSpace: 'nowrap',\n backgroundColor: isActive ? 'rgba(128, 128, 128, 0.15)' : 'transparent',\n color: isActive ? 'currentColor' : 'rgba(128, 128, 128, 0.7)',\n }}\n >\n {theme.icon && <span style={{ fontSize: '13px' }}>{theme.icon}</span>}\n <span>{theme.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// NavigationBar — Prev/Next, slide selector, mode toggle, copy\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport type { NavigationBarProps } from '../types.js';\n\nconst btnBase: React.CSSProperties = {\n height: '28px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '5px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n border: 'none',\n lineHeight: 1,\n whiteSpace: 'nowrap',\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnBase,\n padding: '0 10px',\n backgroundColor: 'transparent',\n color: 'rgba(128, 128, 128, 0.7)',\n};\n\nconst btnActive: React.CSSProperties = {\n ...btnBase,\n padding: '0 10px',\n fontWeight: 600,\n backgroundColor: 'rgba(128, 128, 128, 0.15)',\n color: 'currentColor',\n};\n\nconst iconBtn: React.CSSProperties = {\n ...btnBase,\n width: '28px',\n padding: 0,\n backgroundColor: 'transparent',\n color: 'rgba(128, 128, 128, 0.7)',\n};\n\nconst disabledStyle: React.CSSProperties = {\n opacity: 0.3,\n cursor: 'not-allowed',\n};\n\n/**\n * NavigationBar — Renders slide navigation controls.\n *\n * @example\n * ```tsx\n * <NavigationBar\n * currentIndex={2}\n * slideCount={10}\n * onNavigate={setCurrentIndex}\n * mode=\"presentation\"\n * onModeChange={setMode}\n * />\n * ```\n */\nexport function NavigationBar({\n currentIndex,\n slideCount,\n onNavigate,\n mode,\n onModeChange,\n className,\n showCopy = true,\n markdown,\n}: NavigationBarProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n if (!markdown) return;\n try {\n await navigator.clipboard.writeText(markdown);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Silently fail\n }\n }, [markdown]);\n\n const isFirst = currentIndex === 0;\n const isLast = currentIndex >= slideCount - 1;\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 0',\n borderBottom: '1px solid rgba(128, 128, 128, 0.12)',\n flexWrap: 'wrap',\n }}\n >\n {/* Left: Mode toggle + Theme area (slots for parent) */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n {/* Presentation mode button */}\n <button\n type=\"button\"\n onClick={() => onModeChange('presentation')}\n style={mode === 'presentation' ? btnActive : btnSecondary}\n title=\"Presentation mode (1 slide)\"\n >\n ▶ Presentation\n </button>\n\n {/* Deck mode button */}\n <button\n type=\"button\"\n onClick={() => onModeChange('deck')}\n style={mode === 'deck' ? btnActive : btnSecondary}\n title=\"Deck mode (all slides)\"\n >\n ☰ Deck\n </button>\n </div>\n\n {/* Right: Navigation + Actions */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n {mode === 'presentation' && (\n <>\n {/* Previous */}\n <button\n type=\"button\"\n onClick={() => onNavigate(currentIndex - 1)}\n disabled={isFirst}\n style={{ ...iconBtn, ...(isFirst ? disabledStyle : {}) }}\n title=\"Previous slide (←)\"\n >\n ‹\n </button>\n\n {/* Slide selector */}\n <select\n value={currentIndex}\n onChange={(e) => onNavigate(Number(e.target.value))}\n style={{\n height: '28px',\n padding: '0 6px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'currentColor',\n cursor: 'pointer',\n outline: 'none',\n }}\n title=\"Jump to slide\"\n >\n {Array.from({ length: slideCount }, (_, i) => (\n <option key={i} value={i}>\n Slide {i + 1} / {slideCount}\n </option>\n ))}\n </select>\n\n {/* Next */}\n <button\n type=\"button\"\n onClick={() => onNavigate(currentIndex + 1)}\n disabled={isLast}\n style={{ ...iconBtn, ...(isLast ? disabledStyle : {}) }}\n title=\"Next slide (→)\"\n >\n ›\n </button>\n </>\n )}\n\n {mode === 'deck' && (\n <span style={{ fontSize: '12px', color: 'rgba(128, 128, 128, 0.6)', padding: '0 8px' }}>\n {slideCount} slides\n </span>\n )}\n\n {/* Copy button */}\n {showCopy && markdown && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={btnSecondary}\n title=\"Copy markdown source\"\n >\n {copied ? '✓ Copied' : '⧉ Copy'}\n </button>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// PresentationView — Single slide display with 16:9 aspect ratio\n// Shows one slide at a time, hides others with absolute positioning\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { PresentationViewProps } from '../types.js';\n\n/**\n * PresentationView — Renders a single slide at a time.\n *\n * All slides are rendered but hidden with absolute positioning.\n * Only the slide at `currentIndex` is visible.\n *\n * @example\n * ```tsx\n * <PresentationView\n * html={result.html}\n * css={result.css}\n * themeCss={result.themeCss}\n * currentIndex={0}\n * slideCount={5}\n * />\n * ```\n */\nexport function PresentationView({\n html,\n css,\n themeCss,\n layoutCss,\n currentIndex,\n slideCount,\n className,\n}: PresentationViewProps) {\n // Generate CSS to hide all slides except the current one\n const presentationCss = `\n .slide-presentation-host {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 100% !important;\n }\n .slide-presentation-host > div {\n position: relative !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 100% !important;\n }\n .slide-presentation-host #marp-container svg[data-marpit-svg],\n .slide-presentation-host #marp-container > svg,\n .slide-presentation-host > div > svg {\n display: none !important;\n }\n .slide-presentation-host #marp-container svg[data-marpit-svg]:nth-of-type(${currentIndex + 1}),\n .slide-presentation-host #marp-container > svg:nth-of-type(${currentIndex + 1}),\n .slide-presentation-host > div > svg:nth-of-type(${currentIndex + 1}) {\n display: block !important;\n position: relative !important;\n visibility: visible !important;\n opacity: 1 !important;\n pointer-events: auto !important;\n width: min(100%, calc((100vh - 120px) * 16 / 9)) !important;\n max-width: 1400px !important;\n height: auto !important;\n max-height: calc(100vh - 120px) !important;\n aspect-ratio: 16 / 9 !important;\n margin: 0 auto !important;\n }\n `;\n\n return (\n <div className={className} style={{ width: '100%' }}>\n {/* Marp base CSS */}\n <style>{css}</style>\n {/* Theme typography CSS */}\n <style>{themeCss}</style>\n {/* Layout scoped CSS */}\n {layoutCss && <style>{layoutCss}</style>}\n {/* Presentation mode CSS */}\n <style>{presentationCss}</style>\n\n {/* Render all slides, only nth-child is visible */}\n <div\n className=\"slide-presentation-host\"\n style={{ padding: '16px 0' }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// DeckView — Vertical scroll of all slides (stacked cards)\n// Shows every slide in a scrollable list\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { DeckViewProps } from '../types.js';\n\n/**\n * DeckView — Renders all slides vertically in a scrollable list.\n *\n * Each slide is displayed as a 16:9 card with consistent spacing.\n *\n * @example\n * ```tsx\n * <DeckView\n * html={result.html}\n * css={result.css}\n * themeCss={result.themeCss}\n * slideCount={5}\n * />\n * ```\n */\nexport function DeckView({\n html,\n css,\n themeCss,\n layoutCss,\n slideCount,\n className,\n notes,\n showNotes = false,\n}: DeckViewProps) {\n const hostRef = React.useRef<HTMLDivElement>(null);\n\n // Inject presenter notes under each slide card when showNotes is enabled\n React.useEffect(() => {\n if (!hostRef.current) return;\n hostRef.current.querySelectorAll('.deck-slide-note-item').forEach((el) => el.remove());\n\n if (!showNotes || !notes || notes.length === 0) return;\n\n const svgs = hostRef.current.querySelectorAll('svg[data-marpit-svg], svg');\n svgs.forEach((svg, idx) => {\n const slideNotes = notes[idx];\n if (slideNotes && slideNotes.length > 0) {\n const noteBox = document.createElement('div');\n noteBox.className = 'deck-slide-note-item';\n noteBox.style.cssText = `\n width: 100%;\n max-width: 960px;\n margin: -16px auto 32px auto;\n background: rgba(24, 24, 32, 0.85);\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-left: 4px solid #0284c7;\n border-radius: 8px;\n padding: 14px 18px;\n color: #e4e4e7;\n font-size: 14px;\n line-height: 1.6;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n `;\n noteBox.innerHTML = `\n <div style=\"font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: #38bdf8; margin-bottom: 4px; display: flex; align-items: center; gap: 6px;\">\n <span>📝</span><span>Presenter Notes (Slide ${idx + 1})</span>\n </div>\n <div style=\"white-space: pre-wrap; font-size: 13px; line-height: 1.6; color: inherit;\">${slideNotes.join('\\n')}</div>\n `;\n svg.after(noteBox);\n }\n });\n }, [html, notes, showNotes]);\n\n // Generate CSS for deck layout\n const deckCss = `\n .slide-deck-host {\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n width: 100% !important;\n padding: 16px 0 !important;\n }\n .slide-deck-host > div,\n .slide-deck-host #marp-container {\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n width: 100% !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg],\n .slide-deck-host #marp-container > svg,\n .slide-deck-host > div > svg {\n display: block !important;\n width: 100% !important;\n max-width: 960px !important;\n height: auto !important;\n aspect-ratio: 16 / 9 !important;\n margin: 0 auto 32px auto !important;\n border-radius: 12px !important;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12) !important;\n transition: transform 0.2s ease, box-shadow 0.2s ease !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg]:last-of-type,\n .slide-deck-host #marp-container > svg:last-of-type,\n .slide-deck-host > div > svg:last-of-type {\n margin-bottom: 0 !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg]:hover,\n .slide-deck-host #marp-container > svg:hover,\n .slide-deck-host > div > svg:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2) !important;\n }\n\n @media print {\n @page {\n size: landscape;\n margin: 0;\n }\n body {\n background: #ffffff !important;\n color: #000000 !important;\n }\n .slide-deck-host {\n padding: 0 !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg],\n .slide-deck-host #marp-container > svg,\n .slide-deck-host > div > svg {\n width: 100vw !important;\n max-width: none !important;\n height: 56.25vw !important;\n page-break-inside: avoid !important;\n break-inside: avoid !important;\n page-break-after: always !important;\n break-after: page !important;\n margin: 0 auto !important;\n box-shadow: none !important;\n border-radius: 0 !important;\n }\n .deck-slide-note-item {\n page-break-after: always !important;\n break-after: page !important;\n background: #f8fafc !important;\n border: 1px solid #cbd5e1 !important;\n border-left: 4px solid #2563eb !important;\n color: #1e293b !important;\n padding: 12px 18px !important;\n margin: 12px auto 32px auto !important;\n width: 90vw !important;\n font-size: 11pt !important;\n }\n }\n `;\n\n return (\n <div className={className} style={{ width: '100%' }}>\n {/* Marp base CSS */}\n <style>{css}</style>\n {/* Theme typography CSS */}\n <style>{themeCss}</style>\n {/* Layout scoped CSS */}\n {layoutCss && <style>{layoutCss}</style>}\n {/* Deck mode CSS */}\n <style>{deckCss}</style>\n\n {/* Render all slides stacked vertically */}\n <div\n ref={hostRef}\n className=\"slide-deck-host\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// PresenterNotesDrawer — Display speaker/teacher notes for the active slide\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\n\nexport interface PresenterNotesDrawerProps {\n /** Notes for current slide */\n notes: string[];\n /** Current slide index (0-based) */\n currentIndex: number;\n /** Total number of slides */\n slideCount: number;\n /** Whether the drawer is open */\n isOpen: boolean;\n /** Callback to close the drawer */\n onClose: () => void;\n /** Theme mode for color styling */\n isDark?: boolean;\n}\n\nexport function PresenterNotesDrawer({\n notes,\n currentIndex,\n slideCount,\n isOpen,\n onClose,\n isDark = true,\n}: PresenterNotesDrawerProps) {\n if (!isOpen) return null;\n\n const bg = isDark ? '#181920' : '#ffffff';\n const border = isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)';\n const textColor = isDark ? '#f1f5f9' : '#1e293b';\n const mutedColor = isDark ? '#94a3b8' : '#64748b';\n\n return (\n <div\n style={{\n marginTop: '12px',\n padding: '16px 20px',\n borderRadius: '10px',\n backgroundColor: bg,\n border: `1px solid ${border}`,\n color: textColor,\n boxShadow: isDark ? '0 4px 20px rgba(0, 0, 0, 0.4)' : '0 4px 20px rgba(0, 0, 0, 0.08)',\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n transition: 'all 0.2s ease',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderBottom: `1px solid ${border}`,\n paddingBottom: '8px',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontWeight: 600, fontSize: '13px', letterSpacing: '0.02em' }}>\n Ghi chú Giảng viên\n </span>\n <span\n style={{\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '12px',\n backgroundColor: isDark ? 'rgba(56, 189, 248, 0.15)' : 'rgba(2, 132, 199, 0.1)',\n color: isDark ? '#38bdf8' : '#0284c7',\n fontWeight: 500,\n }}\n >\n Slide {currentIndex + 1} / {slideCount}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: mutedColor,\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '4px',\n }}\n title=\"Đóng ghi chú\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n maxHeight: '180px',\n overflowY: 'auto',\n fontSize: '13px',\n lineHeight: '1.6',\n }}\n >\n {notes.length > 0 ? (\n notes.map((note, idx) => (\n <div\n key={idx}\n style={{\n marginBottom: idx < notes.length - 1 ? '8px' : '0',\n whiteSpace: 'pre-wrap',\n }}\n >\n {note}\n </div>\n ))\n ) : (\n <div style={{ color: mutedColor, fontStyle: 'italic', fontSize: '12px' }}>\n Không có ghi chú cho slide này.\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// SlideDesignOverlay — Google Slides-style interactive visual layout editor\n//\n// Renders bounding boxes, drag & resize handles, and a floating toolbar\n// in Marp's 1280x720 coordinate space.\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { LayoutBoxConfig, SlideLayoutData, BuiltInTheme } from '../../types.js';\nimport { SLIDE_LAYOUT_PRESETS } from '../../core/layout/presets.js';\n\nexport interface SlideDesignOverlayProps {\n /** Current slide index (0-based) */\n slideIndex: number;\n /** Current layout data for this slide */\n layout: SlideLayoutData | null;\n /** Callback when layout changes in real-time */\n onLayoutChange: (layout: SlideLayoutData) => void;\n /** Callback when user explicitly clicks Save or finishes drag/resize */\n onSave?: (layout: SlideLayoutData) => void;\n /** Callback when an item is deleted */\n onDeleteBox?: (box: LayoutBoxConfig) => void;\n /** Callback when a new box is added */\n onAddBox?: (box: LayoutBoxConfig) => void;\n /** Callback when user cancels or closes design mode */\n onClose?: () => void;\n /** Whether design mode is active */\n isActive: boolean;\n /** Active theme (dark, light, navy) */\n theme?: BuiltInTheme;\n /** External selected box ID control */\n selectedBoxId?: string | null;\n /** Callback when box selection changes */\n onSelectBoxId?: (id: string | null) => void;\n}\n\nexport function SlideDesignOverlay({\n slideIndex,\n layout,\n onLayoutChange,\n onSave,\n onDeleteBox,\n onAddBox,\n onClose,\n isActive,\n theme = 'dark',\n selectedBoxId,\n onSelectBoxId,\n}: SlideDesignOverlayProps) {\n if (!isActive) return null;\n\n const [boxes, setBoxes] = useState<LayoutBoxConfig[]>(layout?.boxes ?? []);\n const [selectedId, setSelectedIdState] = useState<string | null>(selectedBoxId ?? null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const setSelectedId = useCallback((id: string | null) => {\n setSelectedIdState(id);\n if (onSelectBoxId) onSelectBoxId(id);\n }, [onSelectBoxId]);\n\n // Sync external selectedBoxId\n useEffect(() => {\n if (selectedBoxId !== undefined) {\n setSelectedIdState(selectedBoxId);\n }\n }, [selectedBoxId]);\n\n // Sync internal state when layout prop changes\n useEffect(() => {\n setBoxes(layout?.boxes ?? []);\n }, [layout, slideIndex]);\n\n const selectedBox = boxes.find(b => b.id === selectedId) ?? null;\n\n // ── Drag & Resize logic ──\n const hasMovedRef = useRef(false);\n const [dragging, setDragging] = useState<{\n type: 'move' | 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e';\n boxId: string;\n startX: number;\n startY: number;\n startPos: [number, number, number, number];\n } | null>(null);\n\n const handleMouseDown = (\n e: React.MouseEvent,\n box: LayoutBoxConfig,\n type: 'move' | 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e'\n ) => {\n e.preventDefault();\n e.stopPropagation();\n\n hasMovedRef.current = false;\n setSelectedId(box.id);\n setDragging({\n type,\n boxId: box.id,\n startX: e.clientX,\n startY: e.clientY,\n startPos: [...box.pos],\n });\n };\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!dragging || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const scaleX = 1280 / rect.width;\n const scaleY = 720 / rect.height;\n\n const dx = (e.clientX - dragging.startX) * scaleX;\n const dy = (e.clientY - dragging.startY) * scaleY;\n\n if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {\n hasMovedRef.current = true;\n }\n\n const [origX, origY, origW, origH] = dragging.startPos;\n\n setBoxes(prev => {\n const updated = prev.map(b => {\n if (b.id !== dragging.boxId) return b;\n\n let [newX, newY, newW, newH] = [origX, origY, origW, origH];\n\n switch (dragging.type) {\n case 'move':\n newX = Math.round(Math.max(0, Math.min(1280 - origW, origX + dx)));\n newY = Math.round(Math.max(0, Math.min(720 - origH, origY + dy)));\n break;\n case 'se':\n newW = Math.round(Math.max(60, Math.min(1280 - origX, origW + dx)));\n newH = Math.round(Math.max(30, Math.min(720 - origY, origH + dy)));\n break;\n case 'e':\n newW = Math.round(Math.max(60, Math.min(1280 - origX, origW + dx)));\n break;\n case 's':\n newH = Math.round(Math.max(30, Math.min(720 - origY, origH + dy)));\n break;\n case 'sw':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n newH = Math.round(Math.max(30, origH + dy));\n break;\n case 'ne':\n newW = Math.round(Math.max(60, origW + dx));\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'nw':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'n':\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'w':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n break;\n }\n\n return { ...b, pos: [newX, newY, newW, newH] as [number, number, number, number] };\n });\n\n onLayoutChange({ boxes: updated });\n return updated;\n });\n }, [dragging, onLayoutChange]);\n\n const handleMouseUp = useCallback(() => {\n if (dragging && hasMovedRef.current && onSave) {\n onSave({ boxes });\n }\n hasMovedRef.current = false;\n setDragging(null);\n }, [dragging, boxes, onSave]);\n\n useEffect(() => {\n if (dragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [dragging, handleMouseMove, handleMouseUp]);\n\n const removeSelectedBox = useCallback(() => {\n if (!selectedId) return;\n const boxToRemove = boxes.find(b => b.id === selectedId);\n setBoxes(prev => {\n const updated = prev.filter(b => b.id !== selectedId);\n onLayoutChange({ boxes: updated });\n if (onSave) onSave({ boxes: updated });\n return updated;\n });\n setSelectedId(null);\n if (boxToRemove && onDeleteBox) {\n onDeleteBox(boxToRemove);\n }\n }, [selectedId, boxes, onLayoutChange, onSave, onDeleteBox, setSelectedId]);\n\n // Keyboard shortcut: Delete or Backspace to delete the selected item\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't delete if actively typing in an input or textarea\n if (editingId) return;\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n if ((e.key === 'Delete' || e.key === 'Backspace') && selectedId) {\n e.preventDefault();\n e.stopPropagation();\n removeSelectedBox();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedId, editingId, removeSelectedBox]);\n\n const addNewBox = (targetTag: string) => {\n const isH1 = targetTag === 'h1';\n const newId = `box-${Date.now().toString(36)}`;\n const newBox: LayoutBoxConfig = {\n id: newId,\n target: targetTag,\n content: isH1 ? 'Tiêu đề bài giảng' : 'Nhập nội dung đoạn văn tại đây...',\n pos: [100, isH1 ? 160 : 300, isH1 ? 700 : 600, isH1 ? 90 : 120],\n fontSize: isH1 ? '2.5rem' : '1.2rem',\n color: isLight ? '#0f172a' : '#f8fafc',\n textAlign: 'left',\n };\n const updated = [...boxes, newBox];\n setBoxes(updated);\n setSelectedId(newId);\n setEditingId(newId);\n onLayoutChange({ boxes: updated });\n if (onAddBox) {\n onAddBox(newBox);\n }\n };\n\n const updateSelectedBox = (partial: Partial<LayoutBoxConfig>) => {\n if (!selectedId) return;\n setBoxes(prev => {\n const updated = prev.map(b => b.id === selectedId ? { ...b, ...partial } : b);\n onLayoutChange({ boxes: updated });\n return updated;\n });\n };\n\n const isLight = theme === 'light';\n const isNavy = theme === 'navy';\n\n const toolbarBg = isLight ? 'rgba(255, 255, 255, 0.96)' : isNavy ? 'rgba(11, 19, 43, 0.95)' : 'rgba(24, 25, 32, 0.95)';\n const toolbarBorder = isLight ? '1px solid rgba(0, 0, 0, 0.12)' : isNavy ? '1px solid rgba(56, 189, 248, 0.35)' : '1px solid rgba(255, 255, 255, 0.15)';\n const toolbarColor = isLight ? '#0f172a' : '#f8fafc';\n const toolbarShadow = isLight ? '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)' : '0 12px 30px rgba(0, 0, 0, 0.6)';\n const brandColor = isLight ? '#0284c7' : '#38bdf8';\n const subtextColor = isLight ? '#64748b' : '#94a3b8';\n\n const btnStyle: React.CSSProperties = {\n height: '28px',\n padding: '0 12px',\n borderRadius: '14px',\n fontSize: '11px',\n fontWeight: 500,\n fontFamily: 'inherit',\n border: isLight ? '1px solid rgba(0, 0, 0, 0.1)' : '1px solid rgba(255, 255, 255, 0.15)',\n backgroundColor: isLight ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.08)',\n color: isLight ? '#0f172a' : '#f1f5f9',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n transition: 'all 0.15s ease',\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n pointerEvents: 'none',\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: '12px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 60,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 14px',\n backgroundColor: toolbarBg,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: toolbarBorder,\n borderRadius: '24px',\n boxShadow: toolbarShadow,\n color: toolbarColor,\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n <span style={{ fontWeight: 600, color: brandColor, whiteSpace: 'nowrap' }}>Design Canvas:</span>\n <button type=\"button\" onClick={() => addNewBox('h1')} style={btnStyle} title=\"Thêm khung vị trí Tiêu đề\">+ Tiêu đề (H1)</button>\n <button type=\"button\" onClick={() => addNewBox('p')} style={btnStyle} title=\"Thêm khung vị trí Đoạn văn\">+ Đoạn văn (P)</button>\n\n <select\n onChange={(e) => {\n const preset = SLIDE_LAYOUT_PRESETS.find(p => p.id === e.target.value);\n if (preset) {\n const clonedBoxes = JSON.parse(JSON.stringify(preset.layout.boxes));\n setBoxes(clonedBoxes);\n onLayoutChange({ boxes: clonedBoxes });\n }\n }}\n defaultValue=\"\"\n style={{\n ...btnStyle,\n cursor: 'pointer',\n outline: 'none',\n color: isLight ? '#0f172a' : '#f8fafc',\n backgroundColor: isLight ? '#ffffff' : '#1e1f29',\n border: isLight ? '1px solid rgba(0, 0, 0, 0.15)' : '1px solid rgba(56, 189, 248, 0.3)',\n maxWidth: '180px',\n }}\n title=\"Áp dụng mẫu bố cục có sẵn\"\n >\n <option value=\"\" disabled style={{ backgroundColor: isLight ? '#ffffff' : '#1e1f29', color: subtextColor }}>Mẫu bố cục (Presets)...</option>\n {SLIDE_LAYOUT_PRESETS.map((p) => (\n <option key={p.id} value={p.id} style={{ backgroundColor: isLight ? '#ffffff' : '#1e1f29', color: isLight ? '#0f172a' : '#f8fafc' }}>{p.name}</option>\n ))}\n </select>\n\n <div style={{ width: '1px', height: '16px', backgroundColor: isLight ? 'rgba(0,0,0,0.15)' : 'rgba(255,255,255,0.2)' }} />\n\n {onSave && (\n <button type=\"button\" onClick={() => onSave({ boxes })} style={{ ...btnStyle, backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600, border: 'none' }}>Lưu bố cục</button>\n )}\n {onClose && (\n <button type=\"button\" onClick={onClose} style={{ ...btnStyle, backgroundColor: 'transparent', border: 'none', color: subtextColor }}>Đóng</button>\n )}\n </div>\n\n <div ref={containerRef} style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}>\n {boxes.map(box => {\n const [x, y, w, h] = box.pos;\n const isSelected = box.id === selectedId;\n const leftPercent = (x / 1280) * 100;\n const topPercent = (y / 720) * 100;\n const widthPercent = (w / 1280) * 100;\n const heightPercent = (h / 720) * 100;\n\n return (\n <div\n key={box.id}\n onClick={e => { e.stopPropagation(); setSelectedId(box.id); }}\n onMouseDown={e => handleMouseDown(e, box, 'move')}\n style={{\n position: 'absolute',\n left: `${leftPercent}%`,\n top: `${topPercent}%`,\n width: `${widthPercent}%`,\n height: `${heightPercent}%`,\n border: isSelected\n ? (isLight ? '2px solid #0284c7' : '2px solid #38bdf8')\n : (isLight ? '1.5px dashed rgba(2, 132, 199, 0.5)' : '1.5px dashed rgba(56, 189, 248, 0.5)'),\n backgroundColor: isSelected\n ? (isLight ? 'rgba(2, 132, 199, 0.08)' : 'rgba(56, 189, 248, 0.08)')\n : (isLight ? 'rgba(2, 132, 199, 0.02)' : 'rgba(56, 189, 248, 0.03)'),\n cursor: editingId === box.id ? 'default' : 'move',\n userSelect: editingId === box.id ? 'text' : 'none',\n boxSizing: 'border-box',\n zIndex: isSelected ? 40 : 20,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n overflow: 'visible',\n }}\n >\n {/* Text content inside the box */}\n <div\n style={{\n width: '100%',\n height: '100%',\n padding: '4px 8px',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n }}\n >\n {editingId === box.id ? (\n <textarea\n autoFocus\n value={box.content ?? ''}\n placeholder={box.target === 'h1' ? 'Nhập tiêu đề...' : 'Nhập nội dung...'}\n onChange={e => updateSelectedBox({ content: e.target.value })}\n onBlur={() => setEditingId(null)}\n onKeyDown={e => {\n if (e.key === 'Escape') setEditingId(null);\n }}\n onClick={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: isLight ? '#ffffff' : isNavy ? '#0b132b' : '#181920',\n border: isLight ? '1px solid #0284c7' : '1px solid #38bdf8',\n borderRadius: '4px',\n outline: 'none',\n resize: 'none',\n fontSize: box.fontSize ?? (box.target === 'h1' ? '2.2rem' : '1.1rem'),\n color: box.color ?? (isLight ? '#0f172a' : '#f8fafc'),\n textAlign: box.textAlign ?? 'left',\n fontFamily: 'Inter, sans-serif',\n fontWeight: box.target === 'h1' ? 700 : 400,\n lineHeight: 1.25,\n padding: '4px 6px',\n margin: 0,\n boxShadow: '0 4px 16px rgba(0,0,0,0.25)',\n }}\n />\n ) : (\n <div\n onDoubleClick={e => {\n e.stopPropagation();\n setSelectedId(box.id);\n setEditingId(box.id);\n }}\n style={{\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n }}\n title=\"Click đúp để sửa chữ\"\n />\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n top: '-20px',\n left: '0',\n fontSize: '10px',\n fontWeight: 600,\n color: isLight ? (isSelected ? '#0284c7' : '#475569') : (isSelected ? '#38bdf8' : 'rgba(56, 189, 248, 0.8)'),\n backgroundColor: isLight ? 'rgba(255,255,255,0.95)' : 'rgba(15,23,42,0.9)',\n border: isLight ? '1px solid rgba(0,0,0,0.1)' : '1px solid rgba(56,189,248,0.3)',\n padding: '1px 6px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n {box.target || box.id} ({Math.round(x)}, {Math.round(y)})\n </div>\n\n {isSelected && (\n <>\n <div style={handleStyle('nw', isLight)} onMouseDown={e => handleMouseDown(e, box, 'nw')} title=\"Kéo góc trên-trái\" />\n <div style={handleStyle('n', isLight)} onMouseDown={e => handleMouseDown(e, box, 'n')} title=\"Kéo cạnh trên\" />\n <div style={handleStyle('ne', isLight)} onMouseDown={e => handleMouseDown(e, box, 'ne')} title=\"Kéo góc trên-phải\" />\n <div style={handleStyle('e', isLight)} onMouseDown={e => handleMouseDown(e, box, 'e')} title=\"Kéo cạnh phải (Chỉnh độ rộng / wrap text)\" />\n <div style={handleStyle('se', isLight)} onMouseDown={e => handleMouseDown(e, box, 'se')} title=\"Kéo góc dưới-phải (Chỉnh kích thước / wrap text)\" />\n <div style={handleStyle('s', isLight)} onMouseDown={e => handleMouseDown(e, box, 's')} title=\"Kéo cạnh dưới\" />\n <div style={handleStyle('sw', isLight)} onMouseDown={e => handleMouseDown(e, box, 'sw')} title=\"Kéo góc dưới-trái\" />\n <div style={handleStyle('w', isLight)} onMouseDown={e => handleMouseDown(e, box, 'w')} title=\"Kéo cạnh trái (Chỉnh độ rộng / wrap text)\" />\n </>\n )}\n </div>\n );\n })}\n </div>\n\n {selectedBox && (\n <div\n style={{\n position: 'absolute',\n bottom: '20px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 60,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '8px 16px',\n backgroundColor: toolbarBg,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: toolbarBorder,\n borderRadius: '12px',\n boxShadow: toolbarShadow,\n color: toolbarColor,\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n <span style={{ fontWeight: 600, color: brandColor, whiteSpace: 'nowrap' }}>Khung: {selectedBox.target}</span>\n\n {/* Quick content input */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Chữ:</span>\n <input\n type=\"text\"\n value={selectedBox.content ?? ''}\n placeholder=\"Nhập nội dung...\"\n onChange={e => updateSelectedBox({ content: e.target.value })}\n style={{\n width: '130px',\n padding: '2px 8px',\n borderRadius: '4px',\n border: isLight ? '1px solid #cbd5e1' : '1px solid #334155',\n backgroundColor: isLight ? '#f8fafc' : '#0f172a',\n color: isLight ? '#0f172a' : '#f8fafc',\n fontSize: '11px',\n }}\n />\n </div>\n\n <button\n type=\"button\"\n onClick={() => setEditingId(selectedBox.id)}\n style={{\n ...btnStyle,\n backgroundColor: editingId === selectedBox.id ? '#0284c7' : (isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)'),\n color: editingId === selectedBox.id ? '#ffffff' : (isLight ? '#0f172a' : '#e2e8f0'),\n height: '24px',\n padding: '0 8px',\n }}\n title=\"Sửa chữ trực tiếp trong khung\"\n >\n Sửa chữ\n </button>\n\n <div style={{ width: '1px', height: '14px', backgroundColor: isLight ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.15)' }} />\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Size:</span>\n <input type=\"text\" value={selectedBox.fontSize ?? '1.5rem'} onChange={e => updateSelectedBox({ fontSize: e.target.value })} style={{ width: '55px', padding: '2px 6px', borderRadius: '4px', border: isLight ? '1px solid #cbd5e1' : '1px solid #334155', backgroundColor: isLight ? '#f8fafc' : '#0f172a', color: isLight ? '#0f172a' : '#f8fafc', fontSize: '11px' }} />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Color:</span>\n <input type=\"color\" value={selectedBox.color ?? (isLight ? '#0f172a' : '#38bdf8')} onChange={e => updateSelectedBox({ color: e.target.value })} style={{ width: '22px', height: '22px', padding: '0', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }} />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', whiteSpace: 'nowrap' }}>\n {(['left', 'center', 'right'] as const).map(align => (\n <button key={align} type=\"button\" onClick={() => updateSelectedBox({ textAlign: align })} style={{ ...btnStyle, backgroundColor: selectedBox.textAlign === align ? '#0284c7' : isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)', color: selectedBox.textAlign === align ? '#ffffff' : (isLight ? '#0f172a' : '#e2e8f0'), textTransform: 'capitalize', fontSize: '11px', padding: '2px 6px', height: '22px' }}>{align}</button>\n ))}\n </div>\n <button type=\"button\" onClick={removeSelectedBox} style={{ ...btnStyle, backgroundColor: isLight ? 'rgba(239, 68, 68, 0.1)' : 'rgba(239, 68, 68, 0.2)', color: isLight ? '#dc2626' : '#f87171', border: isLight ? '1px solid rgba(239, 68, 68, 0.3)' : '1px solid rgba(239, 68, 68, 0.4)', fontWeight: 500, height: '22px', padding: '0 8px' }} title=\"Xóa phần tử (hoặc nhấn Delete trên bàn phím)\">Xóa phần tử (Del)</button>\n </div>\n )}\n </div>\n );\n}\n\nfunction handleStyle(pos: 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e', isLight = false): React.CSSProperties {\n const size = 10;\n const base: React.CSSProperties = {\n position: 'absolute',\n width: `${size}px`,\n height: `${size}px`,\n backgroundColor: isLight ? '#ffffff' : '#0f172a',\n border: isLight ? '2px solid #0284c7' : '2px solid #38bdf8',\n borderRadius: '2px',\n boxSizing: 'border-box',\n zIndex: 50,\n };\n\n switch (pos) {\n case 'se': return { ...base, right: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'se-resize' };\n case 'e': return { ...base, right: `-${size / 2}px`, top: `calc(50% - ${size / 2}px)`, cursor: 'e-resize' };\n case 's': return { ...base, bottom: `-${size / 2}px`, left: `calc(50% - ${size / 2}px)`, cursor: 's-resize' };\n case 'sw': return { ...base, left: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'sw-resize' };\n case 'ne': return { ...base, right: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'ne-resize' };\n case 'nw': return { ...base, left: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'nw-resize' };\n case 'n': return { ...base, top: `-${size / 2}px`, left: `calc(50% - ${size / 2}px)`, cursor: 'n-resize' };\n case 'w': return { ...base, left: `-${size / 2}px`, top: `calc(50% - ${size / 2}px)`, cursor: 'w-resize' };\n }\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// SlideViewer — Complete slide viewer with theme, navigation, clicks, fullscreen\n//\n// Usage:\n// import { SlideViewer } from '@learnwell/presentation-kit/react';\n// <SlideViewer markdown={md} enableClicks fullscreen />\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { useSlideState } from '../hooks/useSlideState.js';\nimport { ThemeSwitcher } from './ThemeSwitcher.js';\nimport { NavigationBar } from './NavigationBar.js';\nimport { PresentationView } from './PresentationView.js';\nimport { DeckView } from './DeckView.js';\nimport { PresenterNotesDrawer } from './PresenterNotesDrawer.js';\nimport { SlideDesignOverlay } from './SlideDesignOverlay.js';\nimport { updateSlideLayoutInMarkdown } from '../../core/layout/index.js';\nimport { renderMermaidDiagrams } from '../../plugins/mermaid.js';\nimport type { SlideViewerProps, ThemeOption } from '../types.js';\nimport type { BuiltInTheme, SlideTheme, SlideLayoutData } from '../../types.js';\n\n/** Default theme options for the switcher */\nconst DEFAULT_THEME_OPTIONS: ThemeOption[] = [\n { id: 'dark', label: 'Dark' },\n { id: 'navy', label: 'Navy' },\n { id: 'light', label: 'Light' },\n];\n\n/**\n * SlideViewer — Complete slide viewer component.\n *\n * Features:\n * - Client-side Marp rendering (no HTTP roundtrip)\n * - Theme switching (dark/light/navy + custom)\n * - Presentation mode (single slide + keyboard nav)\n * - Deck mode (vertical scroll)\n * - Click-to-reveal (<!-- click --> / <!-- clicks -->)\n * - Fullscreen mode (ESC to exit)\n * - Mermaid diagram rendering\n * - Teacher/Presenter notes drawer\n * - Visual design mode (Google Slides-style positioning & resizing)\n * - Copy markdown button\n */\nexport function SlideViewer({\n markdown,\n initialTheme = 'dark',\n initialMode = 'presentation',\n className,\n showThemeSwitcher = true,\n showNavigation = true,\n enableKeyboard = true,\n enableClicks = false,\n fullscreen = false,\n showNotes = true,\n showDesignMode = false,\n themeOptions = DEFAULT_THEME_OPTIONS,\n onThemeChange,\n onSlideChange,\n onModeChange,\n onRenderComplete,\n onSaveMarkdown,\n}: SlideViewerProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showNotesDrawer, setShowNotesDrawer] = useState(false);\n const [isDesignMode, setIsDesignMode] = useState(false);\n const [liveLayout, setLiveLayout] = useState<SlideLayoutData | null>(null);\n\n // Centralized state (with click support)\n const state = useSlideState({\n markdown,\n initialTheme,\n initialMode,\n enableClicks,\n });\n\n const {\n currentIndex, mode, theme, result, slideCount,\n currentClick, maxClicks,\n goToSlide, nextSlide, prevSlide, setMode, setTheme,\n nextClick, prevClick, resetClicks,\n } = state;\n\n // Notify parent of state changes\n useEffect(() => { onThemeChange?.(theme); }, [theme, onThemeChange]);\n useEffect(() => { onSlideChange?.(currentIndex); }, [currentIndex, onSlideChange]);\n useEffect(() => { onModeChange?.(mode); }, [mode, onModeChange]);\n useEffect(() => { if (result) onRenderComplete?.(result); }, [result, onRenderComplete]);\n\n // ── Keyboard navigation (click-aware + ESC for fullscreen) ──\n useEffect(() => {\n if (!enableKeyboard) return;\n\n const handleKey = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n // ESC exits fullscreen (always active when fullscreen is enabled)\n if (e.key === 'Escape' && fullscreen && isFullscreen) {\n e.preventDefault();\n setIsFullscreen(false);\n return;\n }\n\n // Navigation only in presentation mode\n if (mode !== 'presentation') return;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'PageDown':\n case ' ':\n e.preventDefault();\n if (enableClicks && currentClick < maxClicks) {\n nextClick();\n } else {\n nextSlide();\n }\n break;\n\n case 'ArrowLeft':\n case 'PageUp':\n e.preventDefault();\n if (enableClicks && currentClick > 0) {\n prevClick();\n } else {\n prevSlide();\n }\n break;\n\n case 'Home':\n e.preventDefault();\n goToSlide(0);\n break;\n\n case 'End':\n e.preventDefault();\n goToSlide(slideCount - 1);\n break;\n\n case 'f':\n case 'F':\n // F key toggles fullscreen (when fullscreen prop is enabled)\n if (fullscreen) {\n e.preventDefault();\n setIsFullscreen((prev) => !prev);\n }\n break;\n\n case 'p':\n case 'P':\n if (showNotes) {\n e.preventDefault();\n setShowNotesDrawer((prev) => !prev);\n }\n break;\n }\n };\n\n window.addEventListener('keydown', handleKey);\n return () => window.removeEventListener('keydown', handleKey);\n }, [enableKeyboard, mode, fullscreen, isFullscreen, enableClicks, currentClick, maxClicks, nextClick, prevClick, nextSlide, prevSlide, goToSlide, slideCount]);\n\n // ── Click visibility management (DOM-based, presentation mode only) ──\n useEffect(() => {\n if (!enableClicks || !result || mode !== 'presentation') return;\n\n const timer = setTimeout(() => {\n const container = document.querySelector('.slide-presentation-host > div');\n if (!container) return;\n\n container.querySelectorAll('[data-click-group]').forEach((el) => {\n const group = parseInt(el.getAttribute('data-click-group') ?? '0', 10);\n const isVisible = group <= currentClick;\n el.classList.toggle('visible', isVisible);\n });\n }, 50);\n\n return () => clearTimeout(timer);\n }, [enableClicks, currentClick, result, currentIndex, mode]);\n\n // ── Mermaid post-processing ──\n useEffect(() => {\n if (!result || result.mermaidBlocks.length === 0) return;\n\n const timer = setTimeout(() => {\n const containers = document.querySelectorAll('.slide-presentation-host > div, .slide-deck-host > div');\n containers.forEach((container) => {\n if (container instanceof HTMLElement) {\n const themeName = typeof theme === 'string' ? theme : 'dark';\n renderMermaidDiagrams(container, themeName as 'dark' | 'light' | 'navy').catch(() => {});\n }\n });\n }, 100);\n\n return () => clearTimeout(timer);\n }, [result, theme, currentIndex, mode]);\n\n // Handle theme change from ThemeSwitcher\n const handleThemeChange = useCallback(\n (themeId: string) => {\n setTheme(themeId as BuiltInTheme | SlideTheme);\n },\n [setTheme],\n );\n\n // Toggle fullscreen\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n\n // Loading state\n if (!result) {\n return (\n <div\n className={className}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: '80px 0', color: 'rgba(128, 128, 128, 0.5)',\n fontSize: '13px', fontFamily: 'inherit',\n }}\n >\n No slide content\n </div>\n );\n }\n\n const themeName = typeof theme === 'string' ? theme : theme.name;\n\n // ── Fullscreen CSS ──\n const fullscreenCss = fullscreen ? `\n .slide-viewer-fullscreen {\n position: fixed !important;\n inset: 0 !important;\n z-index: 9999 !important;\n background: #000 !important;\n padding: 24px !important;\n overflow-y: auto !important;\n display: flex !important;\n flex-direction: column !important;\n }\n .slide-viewer-fullscreen .slide-presentation-host {\n flex: 1 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n ` : '';\n\n return (\n <div\n className={`${className ?? ''} ${isFullscreen ? 'slide-viewer-fullscreen' : ''}`.trim()}\n style={{\n display: 'flex', flexDirection: 'column', width: '100%',\n gap: '12px',\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...(isFullscreen ? { background: '#000', color: '#fff' } : {}),\n }}\n >\n {/* Fullscreen CSS */}\n {fullscreen && <style>{fullscreenCss}</style>}\n\n {/* Click CSS injection (presentation mode only) */}\n {enableClicks && mode === 'presentation' && result.clickCss && <style>{result.clickCss}</style>}\n\n {/* Top bar: ThemeSwitcher + NavigationBar + Fullscreen button */}\n {(showThemeSwitcher || showNavigation || fullscreen) && (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n gap: '12px', flexWrap: 'wrap',\n ...(isFullscreen ? { borderBottom: '1px solid rgba(255,255,255,0.1)', paddingBottom: '8px' } : {}),\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {showThemeSwitcher && (\n <ThemeSwitcher\n currentTheme={themeName}\n onThemeChange={handleThemeChange}\n themes={themeOptions}\n />\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {showNavigation && (\n <NavigationBar\n currentIndex={currentIndex}\n slideCount={slideCount}\n onNavigate={goToSlide}\n mode={mode}\n onModeChange={setMode}\n markdown={markdown}\n />\n )}\n\n {/* Notes toggle button */}\n {showNotes && (\n <button\n type=\"button\"\n onClick={() => setShowNotesDrawer((prev) => !prev)}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: showNotesDrawer ? '1px solid #0284c7' : '1px solid transparent',\n cursor: 'pointer',\n backgroundColor: showNotesDrawer ? 'rgba(2, 132, 199, 0.15)' : 'transparent',\n color: showNotesDrawer ? '#38bdf8' : (isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)'),\n transition: 'all 0.15s ease',\n }}\n title=\"Ghi chú cho Giảng viên\"\n >\n Notes\n </button>\n )}\n\n {/* Design mode toggle button */}\n {showDesignMode && mode === 'presentation' && (\n <button\n type=\"button\"\n onClick={() => setIsDesignMode((prev) => !prev)}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: isDesignMode ? '1px solid #38bdf8' : '1px solid transparent',\n cursor: 'pointer',\n backgroundColor: isDesignMode ? 'rgba(56, 189, 248, 0.15)' : 'transparent',\n color: isDesignMode ? '#38bdf8' : (isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)'),\n transition: 'all 0.15s ease',\n }}\n title=\"Chế độ chỉnh sửa bố cục (Google Slides-style)\"\n >\n Design\n </button>\n )}\n\n {/* Fullscreen toggle button */}\n {fullscreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: 'none', cursor: 'pointer',\n backgroundColor: 'transparent',\n color: isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)',\n transition: 'all 0.15s ease',\n }}\n title={isFullscreen ? 'Exit fullscreen (ESC)' : 'Fullscreen (F)'}\n >\n {isFullscreen ? '⊡ Exit' : '⊞ Fullscreen'}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Click progress indicator */}\n {enableClicks && maxClicks > 0 && mode === 'presentation' && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: '8px',\n fontSize: '11px', color: isFullscreen ? 'rgba(255,255,255,0.5)' : 'rgba(128,128,128,0.5)',\n }}>\n <span>Click {currentClick} / {maxClicks}</span>\n <div style={{\n flex: 1, height: '2px', borderRadius: '1px',\n backgroundColor: isFullscreen ? 'rgba(255,255,255,0.1)' : 'rgba(128,128,128,0.1)',\n }}>\n <div style={{\n height: '100%', borderRadius: '1px',\n backgroundColor: isFullscreen ? 'rgba(255,255,255,0.3)' : 'rgba(128,128,128,0.3)',\n width: `${maxClicks > 0 ? (currentClick / maxClicks) * 100 : 0}%`,\n transition: 'width 0.2s ease',\n }} />\n </div>\n </div>\n )}\n\n {/* Slide view */}\n <div\n style={{ position: 'relative', width: '100%' }}\n onClick={(e) => {\n if (mode !== 'presentation' || isDesignMode) return;\n if ((e.target as HTMLElement).closest('button, a, input, select, textarea, [contenteditable], .slide-design-overlay')) return;\n if (enableClicks && currentClick < maxClicks) {\n nextClick();\n } else {\n nextSlide();\n }\n }}\n >\n {mode === 'presentation' ? (\n <>\n <PresentationView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n layoutCss={result.layoutCss}\n currentIndex={currentIndex}\n slideCount={slideCount}\n />\n {isDesignMode && (\n <SlideDesignOverlay\n slideIndex={currentIndex}\n layout={liveLayout ?? result.layouts?.[currentIndex] ?? null}\n onLayoutChange={setLiveLayout}\n onSave={(layout) => {\n setLiveLayout(layout);\n if (onSaveMarkdown) {\n const updated = updateSlideLayoutInMarkdown(markdown, currentIndex, layout);\n onSaveMarkdown(updated);\n }\n }}\n onClose={() => setIsDesignMode(false)}\n isActive={isDesignMode}\n />\n )}\n </>\n ) : (\n <DeckView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n layoutCss={result.layoutCss}\n slideCount={slideCount}\n notes={result.notes}\n showNotes={showNotesDrawer}\n />\n )}\n </div>\n\n {/* Presenter notes drawer */}\n {showNotes && (\n <PresenterNotesDrawer\n notes={result.notes?.[currentIndex] ?? []}\n currentIndex={currentIndex}\n slideCount={slideCount}\n isOpen={showNotesDrawer}\n onClose={() => setShowNotesDrawer(false)}\n isDark={themeName !== 'light'}\n />\n )}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit/react — HtmlSlideViewer\n// Zero-build, iframe-isolated, self-contained HTML slide deck viewer\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport type { HtmlDeckData } from '../../html-engine/types.js';\nimport { compileHtmlDeck } from '../../html-engine/compiler.js';\n\nexport interface HtmlSlideViewerProps {\n /** Pre-compiled HTML string. If provided, used directly */\n htmlContent?: string;\n /** Structured deck data. If provided without htmlContent, compiled automatically */\n deckData?: HtmlDeckData;\n /** Deck title displayed on header / download file name */\n title?: string;\n /** Extra CSS classes for wrapper */\n className?: string;\n /** Callback fired when active slide index changes */\n onSlideChange?: (current: number, total: number) => void;\n /** Show top control bar */\n showTopBar?: boolean;\n}\n\nexport const HtmlSlideViewer: React.FC<HtmlSlideViewerProps> = ({\n htmlContent: initialHtml,\n deckData,\n title: propTitle,\n className = '',\n onSlideChange,\n showTopBar = true,\n}) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentSlide, setCurrentSlide] = useState<number>(0);\n const [totalSlides, setTotalSlides] = useState<number>(deckData?.slides?.length || 1);\n const [isFullscreen, setIsFullscreen] = useState<boolean>(false);\n\n // Compile deck if deckData is passed\n const fullHtml = useMemo(() => {\n if (initialHtml) return initialHtml;\n if (deckData) {\n return compileHtmlDeck(deckData).html;\n }\n return '';\n }, [initialHtml, deckData]);\n\n const deckTitle = propTitle || deckData?.title || 'Presentation';\n\n // Listen for slide change messages from iframe\n useEffect(() => {\n const handleMessage = (e: MessageEvent) => {\n if (!e.data || typeof e.data !== 'object') return;\n if (e.data.type === 'PRESENTATION_SLIDE_CHANGE') {\n const cur = Number(e.data.currentIndex) || 0;\n const tot = Number(e.data.totalSlides) || 1;\n setCurrentSlide(cur);\n setTotalSlides(tot);\n if (onSlideChange) {\n onSlideChange(cur, tot);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [onSlideChange]);\n\n // Fullscreen change listener\n useEffect(() => {\n const onFsChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener('fullscreenchange', onFsChange);\n return () => document.removeEventListener('fullscreenchange', onFsChange);\n }, []);\n\n // PostMessage helpers\n const sendIframeMessage = useCallback((msg: any) => {\n if (iframeRef.current?.contentWindow) {\n iframeRef.current.contentWindow.postMessage(msg, '*');\n }\n }, []);\n\n const handleNext = () => sendIframeMessage({ type: 'NEXT_SLIDE' });\n const handlePrev = () => sendIframeMessage({ type: 'PREV_SLIDE' });\n\n const handleToggleFullscreen = () => {\n if (!containerRef.current) return;\n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch(() => {});\n } else {\n document.exitFullscreen().catch(() => {});\n }\n };\n\n const handleDownloadHtml = () => {\n if (!fullHtml) return;\n const blob = new Blob([fullHtml], { type: 'text/html;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${deckTitle.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'slide-deck'}.html`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col w-full h-full bg-card text-txt-pri rounded-xl overflow-hidden border border-border/80 shadow-xs ${className}`}\n style={{ minHeight: '480px' }}\n >\n {/* Top Bar Controls */}\n {showTopBar && (\n <div className=\"flex items-center justify-between px-4 py-2 bg-panel/90 backdrop-blur border-b border-border/80 text-meta select-none z-20\">\n <div className=\"flex items-center gap-2 font-medium truncate max-w-md\">\n <span className=\"w-2 h-2 rounded-full bg-primary inline-block shrink-0\"></span>\n <span className=\"truncate text-txt-pri\">{deckTitle}</span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Slide Navigation Counter */}\n <div className=\"inline-flex items-center gap-1 bg-card px-2 py-0.5 rounded-lg border border-border/80 font-mono text-meta text-txt-sec h-7.5\">\n <button\n onClick={handlePrev}\n disabled={currentSlide <= 0}\n className=\"hover:text-txt-pri disabled:opacity-30 p-1 text-txt-sec cursor-pointer transition-colors flex items-center justify-center rounded\"\n title=\"Previous Slide (←)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\n </button>\n <span className=\"px-1.5 font-semibold text-txt-pri text-center min-w-[45px]\">\n {String(currentSlide + 1).padStart(2, '0')} / {String(totalSlides).padStart(2, '0')}\n </span>\n <button\n onClick={handleNext}\n disabled={currentSlide >= totalSlides - 1}\n className=\"hover:text-txt-pri disabled:opacity-30 p-1 text-txt-sec cursor-pointer transition-colors flex items-center justify-center rounded\"\n title=\"Next Slide (→)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\n </button>\n </div>\n\n {/* Download Standalone HTML Button */}\n <button\n onClick={handleDownloadHtml}\n className=\"flex items-center gap-1.5 h-7.5 px-2.5 rounded-lg bg-panel hover:bg-txt-pri/5 text-txt-pri border border-border/80 text-meta font-medium transition-colors cursor-pointer shadow-2xs leading-none shrink-0\"\n title=\"Download standalone offline HTML file\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n <span>Export HTML</span>\n </button>\n\n {/* Fullscreen Button */}\n <button\n onClick={handleToggleFullscreen}\n className=\"h-7.5 px-2 rounded-lg bg-panel hover:bg-txt-pri/5 text-txt-pri border border-border/80 text-meta transition-colors cursor-pointer shadow-2xs flex items-center justify-center shrink-0\"\n title=\"Toggle Fullscreen (F)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isFullscreen ? (\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"></path>\n ) : (\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"></path>\n )}\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* Main Iframe Canvas Viewport */}\n <div className=\"relative flex-1 w-full h-full min-h-0 bg-black\">\n {fullHtml ? (\n <iframe\n ref={iframeRef}\n srcDoc={fullHtml}\n title={deckTitle}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms\"\n className=\"w-full h-full border-0 block\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-neutral-500 text-sm\">\n No slide deck content loaded.\n </div>\n )}\n </div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/hooks/useSlideState.ts","../../src/react/components/ThemeSwitcher.tsx","../../src/react/components/NavigationBar.tsx","../../src/react/components/PresentationView.tsx","../../src/react/components/DeckView.tsx","../../src/react/components/PresenterNotesDrawer.tsx","../../src/react/components/SlideDesignOverlay.tsx","../../src/react/components/SlideViewer.tsx","../../src/react/components/HtmlSlideViewer.tsx"],"names":["useState","useCallback","jsxs","jsx","React","useRef","useEffect","Fragment","themeName","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// useSlideState Hook — Centralized slide + click state management\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport { renderSlide } from '../../core/render.js';\nimport type { BuiltInTheme, SlideTheme, SlideRenderResult } from '../../types.js';\nimport type { SlideViewMode } from '../types.js';\n\nexport interface UseSlideStateOptions {\n markdown: string;\n initialTheme?: BuiltInTheme | SlideTheme;\n initialMode?: SlideViewMode;\n containerId?: string;\n /** Enable click-to-reveal system (default: false) */\n enableClicks?: boolean;\n}\n\nexport interface UseSlideStateReturn {\n // ── Render state ──\n /** Render result (null before first render) */\n result: SlideRenderResult | null;\n /** Whether initial render is complete */\n isReady: boolean;\n\n // ── Slide state ──\n /** Current slide index (0-based) */\n currentIndex: number;\n /** Total number of slides */\n slideCount: number;\n /** Current view mode */\n mode: SlideViewMode;\n /** Current theme */\n theme: BuiltInTheme | SlideTheme;\n\n // ── Click state ──\n /** Current click index (0 = nothing revealed, maxClicks = all revealed) */\n currentClick: number;\n /** Maximum clicks available on current slide */\n maxClicks: number;\n\n // ── Slide actions ──\n goToSlide: (index: number) => void;\n nextSlide: () => void;\n prevSlide: () => void;\n setMode: (mode: SlideViewMode) => void;\n setTheme: (theme: BuiltInTheme | SlideTheme) => void;\n rerender: () => void;\n\n // ── Click actions ──\n /** Advance to next click. If at max clicks, does nothing. */\n nextClick: () => void;\n /** Revert to previous click. If at 0, does nothing. */\n prevClick: () => void;\n /** Reset clicks to 0 (hide all click groups) */\n resetClicks: () => void;\n /** Set click index directly */\n setClickIndex: (index: number) => void;\n}\n\n/**\n * Centralized hook for slide + click state management.\n * Handles rendering, navigation, theme switching, mode toggling, and click-to-reveal.\n */\nexport function useSlideState(options: UseSlideStateOptions): UseSlideStateReturn {\n const {\n markdown,\n initialTheme = 'dark',\n initialMode = 'presentation',\n containerId,\n enableClicks = false,\n } = options;\n\n const [currentIndex, setCurrentIndex] = useState(0);\n const [mode, setMode] = useState<SlideViewMode>(initialMode);\n const [theme, setTheme] = useState<BuiltInTheme | SlideTheme>(initialTheme);\n const [currentClick, setCurrentClick] = useState(0);\n const renderCountRef = useRef(0);\n\n // Render slides synchronously (with click preprocessing if enabled)\n const result = useMemo(() => {\n if (!markdown || !markdown.trim()) return null;\n renderCountRef.current++;\n return renderSlide(markdown, {\n theme,\n enableMermaid: true,\n enableClicks,\n containerId: containerId ?? `slide-container-${renderCountRef.current}`,\n });\n }, [markdown, theme, containerId, enableClicks]);\n\n const slideCount = result?.slideCount ?? 1;\n const maxClicks = result?.maxClicks ?? 0;\n const isReady = result !== null;\n\n // Clamp currentIndex when slideCount changes\n useEffect(() => {\n if (result && currentIndex >= result.slideCount) {\n setCurrentIndex(Math.max(0, result.slideCount - 1));\n }\n }, [result?.slideCount, currentIndex]);\n\n // Reset clicks when slide changes\n useEffect(() => {\n setCurrentClick(0);\n }, [currentIndex]);\n\n // ── Slide navigation ──\n\n const goToSlide = useCallback(\n (index: number) => {\n setCurrentIndex(Math.max(0, Math.min(index, slideCount - 1)));\n },\n [slideCount],\n );\n\n const nextSlide = useCallback(() => {\n setCurrentIndex((prev) => Math.min(prev + 1, slideCount - 1));\n }, [slideCount]);\n\n const prevSlide = useCallback(() => {\n setCurrentIndex((prev) => Math.max(prev - 1, 0));\n }, []);\n\n // ── Click navigation ──\n\n const nextClick = useCallback(() => {\n setCurrentClick((prev) => Math.min(prev + 1, maxClicks));\n }, [maxClicks]);\n\n const prevClick = useCallback(() => {\n setCurrentClick((prev) => Math.max(prev - 1, 0));\n }, []);\n\n const resetClicks = useCallback(() => {\n setCurrentClick(0);\n }, []);\n\n const setClickIndex = useCallback(\n (index: number) => {\n setCurrentClick(Math.max(0, Math.min(index, maxClicks)));\n },\n [maxClicks],\n );\n\n // ── Combined navigation (click first, then slide) ──\n\n const goToSlideWithReset = useCallback(\n (index: number) => {\n setCurrentClick(0);\n setCurrentIndex(Math.max(0, Math.min(index, slideCount - 1)));\n },\n [slideCount],\n );\n\n const nextWithClick = useCallback(() => {\n if (currentClick < maxClicks) {\n // More clicks available — advance click\n setCurrentClick((prev) => prev + 1);\n } else {\n // No more clicks — go to next slide\n setCurrentClick(0);\n setCurrentIndex((prev) => Math.min(prev + 1, slideCount - 1));\n }\n }, [currentClick, maxClicks, slideCount]);\n\n const prevWithClick = useCallback(() => {\n if (currentClick > 0) {\n // Can revert click\n setCurrentClick((prev) => prev - 1);\n } else {\n // At click 0 — go to previous slide (and show all its clicks)\n setCurrentIndex((prev) => Math.max(prev - 1, 0));\n // Note: we don't set maxClicks here because it depends on the new slide's result\n // The consumer should handle this via useEffect on currentIndex change\n }\n }, [currentClick]);\n\n const rerender = useCallback(() => {\n setCurrentIndex((prev) => prev);\n }, []);\n\n return {\n // Render\n result,\n isReady,\n\n // Slide\n currentIndex,\n slideCount,\n mode,\n theme,\n\n // Click\n currentClick,\n maxClicks,\n\n // Slide actions\n goToSlide: goToSlideWithReset,\n nextSlide: nextWithClick,\n prevSlide: prevWithClick,\n setMode,\n setTheme,\n rerender,\n\n // Click actions\n nextClick,\n prevClick,\n resetClicks,\n setClickIndex,\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// ThemeSwitcher — Dark / Light / Navy toggle buttons\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { ThemeSwitcherProps, ThemeOption } from '../types.js';\n\n/** Default theme options */\nconst DEFAULT_THEMES: ThemeOption[] = [\n { id: 'dark', label: 'Dark' },\n { id: 'navy', label: 'Navy' },\n { id: 'light', label: 'Light' },\n];\n\n/**\n * ThemeSwitcher — Renders a row of theme toggle buttons.\n *\n * @example\n * ```tsx\n * <ThemeSwitcher currentTheme=\"dark\" onThemeChange={setTheme} />\n * ```\n */\nexport function ThemeSwitcher({\n currentTheme,\n onThemeChange,\n themes = DEFAULT_THEMES,\n className,\n}: ThemeSwitcherProps) {\n const currentId = typeof currentTheme === 'object' && currentTheme !== null && 'name' in currentTheme\n ? (currentTheme as { name: string }).name\n : String(currentTheme);\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '2px',\n padding: '2px',\n borderRadius: '8px',\n border: '1px solid rgba(128, 128, 128, 0.2)',\n backgroundColor: 'rgba(128, 128, 128, 0.05)',\n }}\n >\n {themes.map((theme) => {\n const isActive = currentId === theme.id;\n return (\n <button\n key={theme.id}\n type=\"button\"\n onClick={() => onThemeChange(theme.id)}\n title={`Theme: ${theme.label}`}\n style={{\n height: '28px',\n padding: '0 10px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n fontWeight: isActive ? 600 : 400,\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n border: 'none',\n lineHeight: 1,\n whiteSpace: 'nowrap',\n backgroundColor: isActive ? 'rgba(128, 128, 128, 0.15)' : 'transparent',\n color: isActive ? 'currentColor' : 'rgba(128, 128, 128, 0.7)',\n }}\n >\n {theme.icon && <span style={{ fontSize: '13px' }}>{theme.icon}</span>}\n <span>{theme.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// NavigationBar — Prev/Next, slide selector, mode toggle, copy\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport type { NavigationBarProps } from '../types.js';\n\nconst btnBase: React.CSSProperties = {\n height: '28px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '5px',\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n border: 'none',\n lineHeight: 1,\n whiteSpace: 'nowrap',\n};\n\nconst btnSecondary: React.CSSProperties = {\n ...btnBase,\n padding: '0 10px',\n backgroundColor: 'transparent',\n color: 'rgba(128, 128, 128, 0.7)',\n};\n\nconst btnActive: React.CSSProperties = {\n ...btnBase,\n padding: '0 10px',\n fontWeight: 600,\n backgroundColor: 'rgba(128, 128, 128, 0.15)',\n color: 'currentColor',\n};\n\nconst iconBtn: React.CSSProperties = {\n ...btnBase,\n width: '28px',\n padding: 0,\n backgroundColor: 'transparent',\n color: 'rgba(128, 128, 128, 0.7)',\n};\n\nconst disabledStyle: React.CSSProperties = {\n opacity: 0.3,\n cursor: 'not-allowed',\n};\n\n/**\n * NavigationBar — Renders slide navigation controls.\n *\n * @example\n * ```tsx\n * <NavigationBar\n * currentIndex={2}\n * slideCount={10}\n * onNavigate={setCurrentIndex}\n * mode=\"presentation\"\n * onModeChange={setMode}\n * />\n * ```\n */\nexport function NavigationBar({\n currentIndex,\n slideCount,\n onNavigate,\n mode,\n onModeChange,\n className,\n showCopy = true,\n markdown,\n}: NavigationBarProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n if (!markdown) return;\n try {\n await navigator.clipboard.writeText(markdown);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Silently fail\n }\n }, [markdown]);\n\n const isFirst = currentIndex === 0;\n const isLast = currentIndex >= slideCount - 1;\n\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '8px 0',\n borderBottom: '1px solid rgba(128, 128, 128, 0.12)',\n flexWrap: 'wrap',\n }}\n >\n {/* Left: Mode toggle + Theme area (slots for parent) */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n {/* Presentation mode button */}\n <button\n type=\"button\"\n onClick={() => onModeChange('presentation')}\n style={mode === 'presentation' ? btnActive : btnSecondary}\n title=\"Presentation mode (1 slide)\"\n >\n ▶ Presentation\n </button>\n\n {/* Deck mode button */}\n <button\n type=\"button\"\n onClick={() => onModeChange('deck')}\n style={mode === 'deck' ? btnActive : btnSecondary}\n title=\"Deck mode (all slides)\"\n >\n ☰ Deck\n </button>\n </div>\n\n {/* Right: Navigation + Actions */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n {mode === 'presentation' && (\n <>\n {/* Previous */}\n <button\n type=\"button\"\n onClick={() => onNavigate(currentIndex - 1)}\n disabled={isFirst}\n style={{ ...iconBtn, ...(isFirst ? disabledStyle : {}) }}\n title=\"Previous slide (←)\"\n >\n ‹\n </button>\n\n {/* Slide selector */}\n <select\n value={currentIndex}\n onChange={(e) => onNavigate(Number(e.target.value))}\n style={{\n height: '28px',\n padding: '0 6px',\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'inherit',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'currentColor',\n cursor: 'pointer',\n outline: 'none',\n }}\n title=\"Jump to slide\"\n >\n {Array.from({ length: slideCount }, (_, i) => (\n <option key={i} value={i}>\n Slide {i + 1} / {slideCount}\n </option>\n ))}\n </select>\n\n {/* Next */}\n <button\n type=\"button\"\n onClick={() => onNavigate(currentIndex + 1)}\n disabled={isLast}\n style={{ ...iconBtn, ...(isLast ? disabledStyle : {}) }}\n title=\"Next slide (→)\"\n >\n ›\n </button>\n </>\n )}\n\n {mode === 'deck' && (\n <span style={{ fontSize: '12px', color: 'rgba(128, 128, 128, 0.6)', padding: '0 8px' }}>\n {slideCount} slides\n </span>\n )}\n\n {/* Copy button */}\n {showCopy && markdown && (\n <button\n type=\"button\"\n onClick={handleCopy}\n style={btnSecondary}\n title=\"Copy markdown source\"\n >\n {copied ? '✓ Copied' : '⧉ Copy'}\n </button>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// PresentationView — Single slide display with 16:9 aspect ratio\n// Shows one slide at a time, hides others with absolute positioning\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { PresentationViewProps } from '../types.js';\n\n/**\n * PresentationView — Renders a single slide at a time.\n *\n * All slides are rendered but hidden with absolute positioning.\n * Only the slide at `currentIndex` is visible.\n *\n * @example\n * ```tsx\n * <PresentationView\n * html={result.html}\n * css={result.css}\n * themeCss={result.themeCss}\n * currentIndex={0}\n * slideCount={5}\n * />\n * ```\n */\nexport function PresentationView({\n html,\n css,\n themeCss,\n layoutCss,\n currentIndex,\n slideCount,\n className,\n}: PresentationViewProps) {\n // Generate CSS to hide all slides except the current one\n const presentationCss = `\n .slide-presentation-host {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 100% !important;\n }\n .slide-presentation-host > div {\n position: relative !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 100% !important;\n }\n .slide-presentation-host #marp-container svg[data-marpit-svg],\n .slide-presentation-host #marp-container > svg,\n .slide-presentation-host > div > svg {\n display: none !important;\n }\n .slide-presentation-host #marp-container svg[data-marpit-svg]:nth-of-type(${currentIndex + 1}),\n .slide-presentation-host #marp-container > svg:nth-of-type(${currentIndex + 1}),\n .slide-presentation-host > div > svg:nth-of-type(${currentIndex + 1}) {\n display: block !important;\n position: relative !important;\n visibility: visible !important;\n opacity: 1 !important;\n pointer-events: auto !important;\n width: min(100%, calc((100vh - 120px) * 16 / 9)) !important;\n max-width: 1400px !important;\n height: auto !important;\n max-height: calc(100vh - 120px) !important;\n aspect-ratio: 16 / 9 !important;\n margin: 0 auto !important;\n }\n `;\n\n return (\n <div className={className} style={{ width: '100%' }}>\n {/* Marp base CSS */}\n <style>{css}</style>\n {/* Theme typography CSS */}\n <style>{themeCss}</style>\n {/* Layout scoped CSS */}\n {layoutCss && <style>{layoutCss}</style>}\n {/* Presentation mode CSS */}\n <style>{presentationCss}</style>\n\n {/* Render all slides, only nth-child is visible */}\n <div\n className=\"slide-presentation-host\"\n style={{ padding: '16px 0' }}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// DeckView — Vertical scroll of all slides (stacked cards)\n// Shows every slide in a scrollable list\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\nimport type { DeckViewProps } from '../types.js';\n\n/**\n * DeckView — Renders all slides vertically in a scrollable list.\n *\n * Each slide is displayed as a 16:9 card with consistent spacing.\n *\n * @example\n * ```tsx\n * <DeckView\n * html={result.html}\n * css={result.css}\n * themeCss={result.themeCss}\n * slideCount={5}\n * />\n * ```\n */\nexport function DeckView({\n html,\n css,\n themeCss,\n layoutCss,\n slideCount,\n className,\n notes,\n showNotes = false,\n}: DeckViewProps) {\n const hostRef = React.useRef<HTMLDivElement>(null);\n\n // Inject presenter notes under each slide card when showNotes is enabled\n React.useEffect(() => {\n if (!hostRef.current) return;\n hostRef.current.querySelectorAll('.deck-slide-note-item').forEach((el) => el.remove());\n\n if (!showNotes || !notes || notes.length === 0) return;\n\n const svgs = hostRef.current.querySelectorAll('svg[data-marpit-svg], svg');\n svgs.forEach((svg, idx) => {\n const slideNotes = notes[idx];\n if (slideNotes && slideNotes.length > 0) {\n const noteBox = document.createElement('div');\n noteBox.className = 'deck-slide-note-item';\n noteBox.style.cssText = `\n width: 100%;\n max-width: 960px;\n margin: -16px auto 32px auto;\n background: rgba(24, 24, 32, 0.85);\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-left: 4px solid #0284c7;\n border-radius: 8px;\n padding: 14px 18px;\n color: #e4e4e7;\n font-size: 14px;\n line-height: 1.6;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n `;\n noteBox.innerHTML = `\n <div style=\"font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: #38bdf8; margin-bottom: 4px; display: flex; align-items: center; gap: 6px;\">\n <span>📝</span><span>Presenter Notes (Slide ${idx + 1})</span>\n </div>\n <div style=\"white-space: pre-wrap; font-size: 13px; line-height: 1.6; color: inherit;\">${slideNotes.join('\\n')}</div>\n `;\n svg.after(noteBox);\n }\n });\n }, [html, notes, showNotes]);\n\n // Generate CSS for deck layout\n const deckCss = `\n .slide-deck-host {\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n width: 100% !important;\n padding: 16px 0 !important;\n }\n .slide-deck-host > div,\n .slide-deck-host #marp-container {\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n width: 100% !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg],\n .slide-deck-host #marp-container > svg,\n .slide-deck-host > div > svg {\n display: block !important;\n width: 100% !important;\n max-width: 960px !important;\n height: auto !important;\n aspect-ratio: 16 / 9 !important;\n margin: 0 auto 32px auto !important;\n border-radius: 12px !important;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12) !important;\n transition: transform 0.2s ease, box-shadow 0.2s ease !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg]:last-of-type,\n .slide-deck-host #marp-container > svg:last-of-type,\n .slide-deck-host > div > svg:last-of-type {\n margin-bottom: 0 !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg]:hover,\n .slide-deck-host #marp-container > svg:hover,\n .slide-deck-host > div > svg:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2) !important;\n }\n\n @media print {\n @page {\n size: landscape;\n margin: 0;\n }\n body {\n background: #ffffff !important;\n color: #000000 !important;\n }\n .slide-deck-host {\n padding: 0 !important;\n }\n .slide-deck-host #marp-container svg[data-marpit-svg],\n .slide-deck-host #marp-container > svg,\n .slide-deck-host > div > svg {\n width: 100vw !important;\n max-width: none !important;\n height: 56.25vw !important;\n page-break-inside: avoid !important;\n break-inside: avoid !important;\n page-break-after: always !important;\n break-after: page !important;\n margin: 0 auto !important;\n box-shadow: none !important;\n border-radius: 0 !important;\n }\n .deck-slide-note-item {\n page-break-after: always !important;\n break-after: page !important;\n background: #f8fafc !important;\n border: 1px solid #cbd5e1 !important;\n border-left: 4px solid #2563eb !important;\n color: #1e293b !important;\n padding: 12px 18px !important;\n margin: 12px auto 32px auto !important;\n width: 90vw !important;\n font-size: 11pt !important;\n }\n }\n `;\n\n return (\n <div className={className} style={{ width: '100%' }}>\n {/* Marp base CSS */}\n <style>{css}</style>\n {/* Theme typography CSS */}\n <style>{themeCss}</style>\n {/* Layout scoped CSS */}\n {layoutCss && <style>{layoutCss}</style>}\n {/* Deck mode CSS */}\n <style>{deckCss}</style>\n\n {/* Render all slides stacked vertically */}\n <div\n ref={hostRef}\n className=\"slide-deck-host\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// PresenterNotesDrawer — Display speaker/teacher notes for the active slide\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React from 'react';\n\nexport interface PresenterNotesDrawerProps {\n /** Notes for current slide */\n notes: string[];\n /** Current slide index (0-based) */\n currentIndex: number;\n /** Total number of slides */\n slideCount: number;\n /** Whether the drawer is open */\n isOpen: boolean;\n /** Callback to close the drawer */\n onClose: () => void;\n /** Theme mode for color styling */\n isDark?: boolean;\n}\n\nexport function PresenterNotesDrawer({\n notes,\n currentIndex,\n slideCount,\n isOpen,\n onClose,\n isDark = true,\n}: PresenterNotesDrawerProps) {\n if (!isOpen) return null;\n\n const bg = isDark ? '#181920' : '#ffffff';\n const border = isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)';\n const textColor = isDark ? '#f1f5f9' : '#1e293b';\n const mutedColor = isDark ? '#94a3b8' : '#64748b';\n\n return (\n <div\n style={{\n marginTop: '12px',\n padding: '16px 20px',\n borderRadius: '10px',\n backgroundColor: bg,\n border: `1px solid ${border}`,\n color: textColor,\n boxShadow: isDark ? '0 4px 20px rgba(0, 0, 0, 0.4)' : '0 4px 20px rgba(0, 0, 0, 0.08)',\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n transition: 'all 0.2s ease',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n borderBottom: `1px solid ${border}`,\n paddingBottom: '8px',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontWeight: 600, fontSize: '13px', letterSpacing: '0.02em' }}>\n Ghi chú Giảng viên\n </span>\n <span\n style={{\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '12px',\n backgroundColor: isDark ? 'rgba(56, 189, 248, 0.15)' : 'rgba(2, 132, 199, 0.1)',\n color: isDark ? '#38bdf8' : '#0284c7',\n fontWeight: 500,\n }}\n >\n Slide {currentIndex + 1} / {slideCount}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: mutedColor,\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '4px',\n }}\n title=\"Đóng ghi chú\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n\n {/* Content */}\n <div\n style={{\n maxHeight: '180px',\n overflowY: 'auto',\n fontSize: '13px',\n lineHeight: '1.6',\n }}\n >\n {notes.length > 0 ? (\n notes.map((note, idx) => (\n <div\n key={idx}\n style={{\n marginBottom: idx < notes.length - 1 ? '8px' : '0',\n whiteSpace: 'pre-wrap',\n }}\n >\n {note}\n </div>\n ))\n ) : (\n <div style={{ color: mutedColor, fontStyle: 'italic', fontSize: '12px' }}>\n Không có ghi chú cho slide này.\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// SlideDesignOverlay — Google Slides-style interactive visual layout editor\n//\n// Renders bounding boxes, drag & resize handles, and a floating toolbar\n// in Marp's 1280x720 coordinate space.\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport type { LayoutBoxConfig, SlideLayoutData, BuiltInTheme } from '../../types.js';\nimport { SLIDE_LAYOUT_PRESETS } from '../../core/layout/presets.js';\n\nexport interface SlideDesignOverlayProps {\n /** Current slide index (0-based) */\n slideIndex: number;\n /** Current layout data for this slide */\n layout: SlideLayoutData | null;\n /** Callback when layout changes in real-time */\n onLayoutChange: (layout: SlideLayoutData) => void;\n /** Callback when user explicitly clicks Save or finishes drag/resize */\n onSave?: (layout: SlideLayoutData) => void;\n /** Callback when an item is deleted */\n onDeleteBox?: (box: LayoutBoxConfig) => void;\n /** Callback when a new box is added */\n onAddBox?: (box: LayoutBoxConfig) => void;\n /** Callback when user cancels or closes design mode */\n onClose?: () => void;\n /** Whether design mode is active */\n isActive: boolean;\n /** Active theme (dark, light, navy) */\n theme?: BuiltInTheme;\n /** External selected box ID control */\n selectedBoxId?: string | null;\n /** Callback when box selection changes */\n onSelectBoxId?: (id: string | null) => void;\n}\n\nexport function SlideDesignOverlay({\n slideIndex,\n layout,\n onLayoutChange,\n onSave,\n onDeleteBox,\n onAddBox,\n onClose,\n isActive,\n theme = 'dark',\n selectedBoxId,\n onSelectBoxId,\n}: SlideDesignOverlayProps) {\n if (!isActive) return null;\n\n const [boxes, setBoxes] = useState<LayoutBoxConfig[]>(layout?.boxes ?? []);\n const [selectedId, setSelectedIdState] = useState<string | null>(selectedBoxId ?? null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const setSelectedId = useCallback((id: string | null) => {\n setSelectedIdState(id);\n if (onSelectBoxId) onSelectBoxId(id);\n }, [onSelectBoxId]);\n\n // Sync external selectedBoxId\n useEffect(() => {\n if (selectedBoxId !== undefined) {\n setSelectedIdState(selectedBoxId);\n }\n }, [selectedBoxId]);\n\n // Sync internal state when layout prop changes\n useEffect(() => {\n setBoxes(layout?.boxes ?? []);\n }, [layout, slideIndex]);\n\n const selectedBox = boxes.find(b => b.id === selectedId) ?? null;\n\n // ── Drag & Resize logic ──\n const hasMovedRef = useRef(false);\n const [dragging, setDragging] = useState<{\n type: 'move' | 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e';\n boxId: string;\n startX: number;\n startY: number;\n startPos: [number, number, number, number];\n } | null>(null);\n\n const handleMouseDown = (\n e: React.MouseEvent,\n box: LayoutBoxConfig,\n type: 'move' | 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e'\n ) => {\n e.preventDefault();\n e.stopPropagation();\n\n hasMovedRef.current = false;\n setSelectedId(box.id);\n setDragging({\n type,\n boxId: box.id,\n startX: e.clientX,\n startY: e.clientY,\n startPos: [...box.pos],\n });\n };\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!dragging || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const scaleX = 1280 / rect.width;\n const scaleY = 720 / rect.height;\n\n const dx = (e.clientX - dragging.startX) * scaleX;\n const dy = (e.clientY - dragging.startY) * scaleY;\n\n if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {\n hasMovedRef.current = true;\n }\n\n const [origX, origY, origW, origH] = dragging.startPos;\n\n setBoxes(prev => {\n const updated = prev.map(b => {\n if (b.id !== dragging.boxId) return b;\n\n let [newX, newY, newW, newH] = [origX, origY, origW, origH];\n\n switch (dragging.type) {\n case 'move':\n newX = Math.round(Math.max(0, Math.min(1280 - origW, origX + dx)));\n newY = Math.round(Math.max(0, Math.min(720 - origH, origY + dy)));\n break;\n case 'se':\n newW = Math.round(Math.max(60, Math.min(1280 - origX, origW + dx)));\n newH = Math.round(Math.max(30, Math.min(720 - origY, origH + dy)));\n break;\n case 'e':\n newW = Math.round(Math.max(60, Math.min(1280 - origX, origW + dx)));\n break;\n case 's':\n newH = Math.round(Math.max(30, Math.min(720 - origY, origH + dy)));\n break;\n case 'sw':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n newH = Math.round(Math.max(30, origH + dy));\n break;\n case 'ne':\n newW = Math.round(Math.max(60, origW + dx));\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'nw':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'n':\n newH = Math.round(Math.max(30, origH - dy));\n newY = Math.round(Math.min(origY + origH - 30, origY + dy));\n break;\n case 'w':\n newW = Math.round(Math.max(60, origW - dx));\n newX = Math.round(Math.min(origX + origW - 60, origX + dx));\n break;\n }\n\n return { ...b, pos: [newX, newY, newW, newH] as [number, number, number, number] };\n });\n\n onLayoutChange({ boxes: updated });\n return updated;\n });\n }, [dragging, onLayoutChange]);\n\n const handleMouseUp = useCallback(() => {\n if (dragging && hasMovedRef.current && onSave) {\n onSave({ boxes });\n }\n hasMovedRef.current = false;\n setDragging(null);\n }, [dragging, boxes, onSave]);\n\n useEffect(() => {\n if (dragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [dragging, handleMouseMove, handleMouseUp]);\n\n const removeSelectedBox = useCallback(() => {\n if (!selectedId) return;\n const boxToRemove = boxes.find(b => b.id === selectedId);\n setBoxes(prev => {\n const updated = prev.filter(b => b.id !== selectedId);\n onLayoutChange({ boxes: updated });\n if (onSave) onSave({ boxes: updated });\n return updated;\n });\n setSelectedId(null);\n if (boxToRemove && onDeleteBox) {\n onDeleteBox(boxToRemove);\n }\n }, [selectedId, boxes, onLayoutChange, onSave, onDeleteBox, setSelectedId]);\n\n // Keyboard shortcut: Delete or Backspace to delete the selected item\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't delete if actively typing in an input or textarea\n if (editingId) return;\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n if ((e.key === 'Delete' || e.key === 'Backspace') && selectedId) {\n e.preventDefault();\n e.stopPropagation();\n removeSelectedBox();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedId, editingId, removeSelectedBox]);\n\n const addNewBox = (targetTag: string) => {\n const isH1 = targetTag === 'h1';\n const newId = `box-${Date.now().toString(36)}`;\n const newBox: LayoutBoxConfig = {\n id: newId,\n target: targetTag,\n content: isH1 ? 'Tiêu đề bài giảng' : 'Nhập nội dung đoạn văn tại đây...',\n pos: [100, isH1 ? 160 : 300, isH1 ? 700 : 600, isH1 ? 90 : 120],\n fontSize: isH1 ? '2.5rem' : '1.2rem',\n color: isLight ? '#0f172a' : '#f8fafc',\n textAlign: 'left',\n };\n const updated = [...boxes, newBox];\n setBoxes(updated);\n setSelectedId(newId);\n setEditingId(newId);\n onLayoutChange({ boxes: updated });\n if (onAddBox) {\n onAddBox(newBox);\n }\n };\n\n const updateSelectedBox = (partial: Partial<LayoutBoxConfig>) => {\n if (!selectedId) return;\n setBoxes(prev => {\n const updated = prev.map(b => b.id === selectedId ? { ...b, ...partial } : b);\n onLayoutChange({ boxes: updated });\n return updated;\n });\n };\n\n const isLight = theme === 'light';\n const isNavy = theme === 'navy';\n\n const toolbarBg = isLight ? 'rgba(255, 255, 255, 0.96)' : isNavy ? 'rgba(11, 19, 43, 0.95)' : 'rgba(24, 25, 32, 0.95)';\n const toolbarBorder = isLight ? '1px solid rgba(0, 0, 0, 0.12)' : isNavy ? '1px solid rgba(56, 189, 248, 0.35)' : '1px solid rgba(255, 255, 255, 0.15)';\n const toolbarColor = isLight ? '#0f172a' : '#f8fafc';\n const toolbarShadow = isLight ? '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)' : '0 12px 30px rgba(0, 0, 0, 0.6)';\n const brandColor = isLight ? '#0284c7' : '#38bdf8';\n const subtextColor = isLight ? '#64748b' : '#94a3b8';\n\n const btnStyle: React.CSSProperties = {\n height: '28px',\n padding: '0 12px',\n borderRadius: '14px',\n fontSize: '11px',\n fontWeight: 500,\n fontFamily: 'inherit',\n border: isLight ? '1px solid rgba(0, 0, 0, 0.1)' : '1px solid rgba(255, 255, 255, 0.15)',\n backgroundColor: isLight ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.08)',\n color: isLight ? '#0f172a' : '#f1f5f9',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n transition: 'all 0.15s ease',\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n pointerEvents: 'none',\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: '12px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 60,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 14px',\n backgroundColor: toolbarBg,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: toolbarBorder,\n borderRadius: '24px',\n boxShadow: toolbarShadow,\n color: toolbarColor,\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n <span style={{ fontWeight: 600, color: brandColor, whiteSpace: 'nowrap' }}>Design Canvas:</span>\n <button type=\"button\" onClick={() => addNewBox('h1')} style={btnStyle} title=\"Thêm khung vị trí Tiêu đề\">+ Tiêu đề (H1)</button>\n <button type=\"button\" onClick={() => addNewBox('p')} style={btnStyle} title=\"Thêm khung vị trí Đoạn văn\">+ Đoạn văn (P)</button>\n\n <select\n onChange={(e) => {\n const preset = SLIDE_LAYOUT_PRESETS.find(p => p.id === e.target.value);\n if (preset) {\n const clonedBoxes = JSON.parse(JSON.stringify(preset.layout.boxes));\n setBoxes(clonedBoxes);\n onLayoutChange({ boxes: clonedBoxes });\n }\n }}\n defaultValue=\"\"\n style={{\n ...btnStyle,\n cursor: 'pointer',\n outline: 'none',\n color: isLight ? '#0f172a' : '#f8fafc',\n backgroundColor: isLight ? '#ffffff' : '#1e1f29',\n border: isLight ? '1px solid rgba(0, 0, 0, 0.15)' : '1px solid rgba(56, 189, 248, 0.3)',\n maxWidth: '180px',\n }}\n title=\"Áp dụng mẫu bố cục có sẵn\"\n >\n <option value=\"\" disabled style={{ backgroundColor: isLight ? '#ffffff' : '#1e1f29', color: subtextColor }}>Mẫu bố cục (Presets)...</option>\n {SLIDE_LAYOUT_PRESETS.map((p) => (\n <option key={p.id} value={p.id} style={{ backgroundColor: isLight ? '#ffffff' : '#1e1f29', color: isLight ? '#0f172a' : '#f8fafc' }}>{p.name}</option>\n ))}\n </select>\n\n <div style={{ width: '1px', height: '16px', backgroundColor: isLight ? 'rgba(0,0,0,0.15)' : 'rgba(255,255,255,0.2)' }} />\n\n {onSave && (\n <button type=\"button\" onClick={() => onSave({ boxes })} style={{ ...btnStyle, backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600, border: 'none' }}>Lưu bố cục</button>\n )}\n {onClose && (\n <button type=\"button\" onClick={onClose} style={{ ...btnStyle, backgroundColor: 'transparent', border: 'none', color: subtextColor }}>Đóng</button>\n )}\n </div>\n\n <div ref={containerRef} style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }}>\n {boxes.map(box => {\n const [x, y, w, h] = box.pos;\n const isSelected = box.id === selectedId;\n const leftPercent = (x / 1280) * 100;\n const topPercent = (y / 720) * 100;\n const widthPercent = (w / 1280) * 100;\n const heightPercent = (h / 720) * 100;\n\n return (\n <div\n key={box.id}\n onClick={e => { e.stopPropagation(); setSelectedId(box.id); }}\n onMouseDown={e => handleMouseDown(e, box, 'move')}\n style={{\n position: 'absolute',\n left: `${leftPercent}%`,\n top: `${topPercent}%`,\n width: `${widthPercent}%`,\n height: `${heightPercent}%`,\n border: isSelected\n ? (isLight ? '2px solid #0284c7' : '2px solid #38bdf8')\n : (isLight ? '1.5px dashed rgba(2, 132, 199, 0.5)' : '1.5px dashed rgba(56, 189, 248, 0.5)'),\n backgroundColor: isSelected\n ? (isLight ? 'rgba(2, 132, 199, 0.08)' : 'rgba(56, 189, 248, 0.08)')\n : (isLight ? 'rgba(2, 132, 199, 0.02)' : 'rgba(56, 189, 248, 0.03)'),\n cursor: editingId === box.id ? 'default' : 'move',\n userSelect: editingId === box.id ? 'text' : 'none',\n boxSizing: 'border-box',\n zIndex: isSelected ? 40 : 20,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n overflow: 'visible',\n }}\n >\n {/* Text content inside the box */}\n <div\n style={{\n width: '100%',\n height: '100%',\n padding: '4px 8px',\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n }}\n >\n {editingId === box.id ? (\n <textarea\n autoFocus\n value={box.content ?? ''}\n placeholder={box.target === 'h1' ? 'Nhập tiêu đề...' : 'Nhập nội dung...'}\n onChange={e => updateSelectedBox({ content: e.target.value })}\n onBlur={() => setEditingId(null)}\n onKeyDown={e => {\n if (e.key === 'Escape') setEditingId(null);\n }}\n onClick={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: isLight ? '#ffffff' : isNavy ? '#0b132b' : '#181920',\n border: isLight ? '1px solid #0284c7' : '1px solid #38bdf8',\n borderRadius: '4px',\n outline: 'none',\n resize: 'none',\n fontSize: box.fontSize ?? (box.target === 'h1' ? '2.2rem' : '1.1rem'),\n color: box.color ?? (isLight ? '#0f172a' : '#f8fafc'),\n textAlign: box.textAlign ?? 'left',\n fontFamily: 'Inter, sans-serif',\n fontWeight: box.target === 'h1' ? 700 : 400,\n lineHeight: 1.25,\n padding: '4px 6px',\n margin: 0,\n boxShadow: '0 4px 16px rgba(0,0,0,0.25)',\n }}\n />\n ) : (\n <div\n onDoubleClick={e => {\n e.stopPropagation();\n setSelectedId(box.id);\n setEditingId(box.id);\n }}\n style={{\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n }}\n title=\"Click đúp để sửa chữ\"\n />\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n top: '-20px',\n left: '0',\n fontSize: '10px',\n fontWeight: 600,\n color: isLight ? (isSelected ? '#0284c7' : '#475569') : (isSelected ? '#38bdf8' : 'rgba(56, 189, 248, 0.8)'),\n backgroundColor: isLight ? 'rgba(255,255,255,0.95)' : 'rgba(15,23,42,0.9)',\n border: isLight ? '1px solid rgba(0,0,0,0.1)' : '1px solid rgba(56,189,248,0.3)',\n padding: '1px 6px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n {box.target || box.id} ({Math.round(x)}, {Math.round(y)})\n </div>\n\n {isSelected && (\n <>\n <div style={handleStyle('nw', isLight)} onMouseDown={e => handleMouseDown(e, box, 'nw')} title=\"Kéo góc trên-trái\" />\n <div style={handleStyle('n', isLight)} onMouseDown={e => handleMouseDown(e, box, 'n')} title=\"Kéo cạnh trên\" />\n <div style={handleStyle('ne', isLight)} onMouseDown={e => handleMouseDown(e, box, 'ne')} title=\"Kéo góc trên-phải\" />\n <div style={handleStyle('e', isLight)} onMouseDown={e => handleMouseDown(e, box, 'e')} title=\"Kéo cạnh phải (Chỉnh độ rộng / wrap text)\" />\n <div style={handleStyle('se', isLight)} onMouseDown={e => handleMouseDown(e, box, 'se')} title=\"Kéo góc dưới-phải (Chỉnh kích thước / wrap text)\" />\n <div style={handleStyle('s', isLight)} onMouseDown={e => handleMouseDown(e, box, 's')} title=\"Kéo cạnh dưới\" />\n <div style={handleStyle('sw', isLight)} onMouseDown={e => handleMouseDown(e, box, 'sw')} title=\"Kéo góc dưới-trái\" />\n <div style={handleStyle('w', isLight)} onMouseDown={e => handleMouseDown(e, box, 'w')} title=\"Kéo cạnh trái (Chỉnh độ rộng / wrap text)\" />\n </>\n )}\n </div>\n );\n })}\n </div>\n\n {selectedBox && (\n <div\n style={{\n position: 'absolute',\n bottom: '20px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 60,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n padding: '8px 16px',\n backgroundColor: toolbarBg,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n border: toolbarBorder,\n borderRadius: '12px',\n boxShadow: toolbarShadow,\n color: toolbarColor,\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n whiteSpace: 'nowrap',\n }}\n >\n <span style={{ fontWeight: 600, color: brandColor, whiteSpace: 'nowrap' }}>Khung: {selectedBox.target}</span>\n\n {/* Quick content input */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Chữ:</span>\n <input\n type=\"text\"\n value={selectedBox.content ?? ''}\n placeholder=\"Nhập nội dung...\"\n onChange={e => updateSelectedBox({ content: e.target.value })}\n style={{\n width: '130px',\n padding: '2px 8px',\n borderRadius: '4px',\n border: isLight ? '1px solid #cbd5e1' : '1px solid #334155',\n backgroundColor: isLight ? '#f8fafc' : '#0f172a',\n color: isLight ? '#0f172a' : '#f8fafc',\n fontSize: '11px',\n }}\n />\n </div>\n\n <button\n type=\"button\"\n onClick={() => setEditingId(selectedBox.id)}\n style={{\n ...btnStyle,\n backgroundColor: editingId === selectedBox.id ? '#0284c7' : (isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)'),\n color: editingId === selectedBox.id ? '#ffffff' : (isLight ? '#0f172a' : '#e2e8f0'),\n height: '24px',\n padding: '0 8px',\n }}\n title=\"Sửa chữ trực tiếp trong khung\"\n >\n Sửa chữ\n </button>\n\n <div style={{ width: '1px', height: '14px', backgroundColor: isLight ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.15)' }} />\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Size:</span>\n <input type=\"text\" value={selectedBox.fontSize ?? '1.5rem'} onChange={e => updateSelectedBox({ fontSize: e.target.value })} style={{ width: '55px', padding: '2px 6px', borderRadius: '4px', border: isLight ? '1px solid #cbd5e1' : '1px solid #334155', backgroundColor: isLight ? '#f8fafc' : '#0f172a', color: isLight ? '#0f172a' : '#f8fafc', fontSize: '11px' }} />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ color: subtextColor, fontSize: '11px' }}>Color:</span>\n <input type=\"color\" value={selectedBox.color ?? (isLight ? '#0f172a' : '#38bdf8')} onChange={e => updateSelectedBox({ color: e.target.value })} style={{ width: '22px', height: '22px', padding: '0', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }} />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', whiteSpace: 'nowrap' }}>\n {(['left', 'center', 'right'] as const).map(align => (\n <button key={align} type=\"button\" onClick={() => updateSelectedBox({ textAlign: align })} style={{ ...btnStyle, backgroundColor: selectedBox.textAlign === align ? '#0284c7' : isLight ? 'rgba(0,0,0,0.05)' : 'rgba(255,255,255,0.05)', color: selectedBox.textAlign === align ? '#ffffff' : (isLight ? '#0f172a' : '#e2e8f0'), textTransform: 'capitalize', fontSize: '11px', padding: '2px 6px', height: '22px' }}>{align}</button>\n ))}\n </div>\n <button type=\"button\" onClick={removeSelectedBox} style={{ ...btnStyle, backgroundColor: isLight ? 'rgba(239, 68, 68, 0.1)' : 'rgba(239, 68, 68, 0.2)', color: isLight ? '#dc2626' : '#f87171', border: isLight ? '1px solid rgba(239, 68, 68, 0.3)' : '1px solid rgba(239, 68, 68, 0.4)', fontWeight: 500, height: '22px', padding: '0 8px' }} title=\"Xóa phần tử (hoặc nhấn Delete trên bàn phím)\">Xóa phần tử (Del)</button>\n </div>\n )}\n </div>\n );\n}\n\nfunction handleStyle(pos: 'nw' | 'n' | 'ne' | 'se' | 's' | 'sw' | 'w' | 'e', isLight = false): React.CSSProperties {\n const size = 10;\n const base: React.CSSProperties = {\n position: 'absolute',\n width: `${size}px`,\n height: `${size}px`,\n backgroundColor: isLight ? '#ffffff' : '#0f172a',\n border: isLight ? '2px solid #0284c7' : '2px solid #38bdf8',\n borderRadius: '2px',\n boxSizing: 'border-box',\n zIndex: 50,\n };\n\n switch (pos) {\n case 'se': return { ...base, right: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'se-resize' };\n case 'e': return { ...base, right: `-${size / 2}px`, top: `calc(50% - ${size / 2}px)`, cursor: 'e-resize' };\n case 's': return { ...base, bottom: `-${size / 2}px`, left: `calc(50% - ${size / 2}px)`, cursor: 's-resize' };\n case 'sw': return { ...base, left: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'sw-resize' };\n case 'ne': return { ...base, right: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'ne-resize' };\n case 'nw': return { ...base, left: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'nw-resize' };\n case 'n': return { ...base, top: `-${size / 2}px`, left: `calc(50% - ${size / 2}px)`, cursor: 'n-resize' };\n case 'w': return { ...base, left: `-${size / 2}px`, top: `calc(50% - ${size / 2}px)`, cursor: 'w-resize' };\n }\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// SlideViewer — Complete slide viewer with theme, navigation, clicks, fullscreen\n//\n// Usage:\n// import { SlideViewer } from '@learnwell/presentation-kit/react';\n// <SlideViewer markdown={md} enableClicks fullscreen />\n// ═══════════════════════════════════════════════════════════════════════════════\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { useSlideState } from '../hooks/useSlideState.js';\nimport { ThemeSwitcher } from './ThemeSwitcher.js';\nimport { NavigationBar } from './NavigationBar.js';\nimport { PresentationView } from './PresentationView.js';\nimport { DeckView } from './DeckView.js';\nimport { PresenterNotesDrawer } from './PresenterNotesDrawer.js';\nimport { SlideDesignOverlay } from './SlideDesignOverlay.js';\nimport { updateSlideLayoutInMarkdown } from '../../core/layout/index.js';\nimport { renderMermaidDiagrams } from '../../plugins/mermaid.js';\nimport type { SlideViewerProps, ThemeOption } from '../types.js';\nimport type { BuiltInTheme, SlideTheme, SlideLayoutData } from '../../types.js';\n\n/** Default theme options for the switcher */\nconst DEFAULT_THEME_OPTIONS: ThemeOption[] = [\n { id: 'dark', label: 'Dark' },\n { id: 'navy', label: 'Navy' },\n { id: 'light', label: 'Light' },\n];\n\n/**\n * SlideViewer — Complete slide viewer component.\n *\n * Features:\n * - Client-side Marp rendering (no HTTP roundtrip)\n * - Theme switching (dark/light/navy + custom)\n * - Presentation mode (single slide + keyboard nav)\n * - Deck mode (vertical scroll)\n * - Click-to-reveal (<!-- click --> / <!-- clicks -->)\n * - Fullscreen mode (ESC to exit)\n * - Mermaid diagram rendering\n * - Teacher/Presenter notes drawer\n * - Visual design mode (Google Slides-style positioning & resizing)\n * - Copy markdown button\n */\nexport function SlideViewer({\n markdown,\n initialTheme = 'dark',\n initialMode = 'presentation',\n className,\n showThemeSwitcher = true,\n showNavigation = true,\n enableKeyboard = true,\n enableClicks = false,\n fullscreen = false,\n showNotes = true,\n showDesignMode = false,\n themeOptions = DEFAULT_THEME_OPTIONS,\n onThemeChange,\n onSlideChange,\n onModeChange,\n onRenderComplete,\n onSaveMarkdown,\n}: SlideViewerProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showNotesDrawer, setShowNotesDrawer] = useState(false);\n const [isDesignMode, setIsDesignMode] = useState(false);\n const [liveLayout, setLiveLayout] = useState<SlideLayoutData | null>(null);\n\n // Centralized state (with click support)\n const state = useSlideState({\n markdown,\n initialTheme,\n initialMode,\n enableClicks,\n });\n\n const {\n currentIndex, mode, theme, result, slideCount,\n currentClick, maxClicks,\n goToSlide, nextSlide, prevSlide, setMode, setTheme,\n nextClick, prevClick, resetClicks,\n } = state;\n\n // Notify parent of state changes\n useEffect(() => { onThemeChange?.(theme); }, [theme, onThemeChange]);\n useEffect(() => { onSlideChange?.(currentIndex); }, [currentIndex, onSlideChange]);\n useEffect(() => { onModeChange?.(mode); }, [mode, onModeChange]);\n useEffect(() => { if (result) onRenderComplete?.(result); }, [result, onRenderComplete]);\n\n // ── Keyboard navigation (click-aware + ESC for fullscreen) ──\n useEffect(() => {\n if (!enableKeyboard) return;\n\n const handleKey = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n // ESC exits fullscreen (always active when fullscreen is enabled)\n if (e.key === 'Escape' && fullscreen && isFullscreen) {\n e.preventDefault();\n setIsFullscreen(false);\n return;\n }\n\n // Navigation only in presentation mode\n if (mode !== 'presentation') return;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'PageDown':\n case ' ':\n e.preventDefault();\n if (enableClicks && currentClick < maxClicks) {\n nextClick();\n } else {\n nextSlide();\n }\n break;\n\n case 'ArrowLeft':\n case 'PageUp':\n e.preventDefault();\n if (enableClicks && currentClick > 0) {\n prevClick();\n } else {\n prevSlide();\n }\n break;\n\n case 'Home':\n e.preventDefault();\n goToSlide(0);\n break;\n\n case 'End':\n e.preventDefault();\n goToSlide(slideCount - 1);\n break;\n\n case 'f':\n case 'F':\n // F key toggles fullscreen (when fullscreen prop is enabled)\n if (fullscreen) {\n e.preventDefault();\n setIsFullscreen((prev) => !prev);\n }\n break;\n\n case 'p':\n case 'P':\n if (showNotes) {\n e.preventDefault();\n setShowNotesDrawer((prev) => !prev);\n }\n break;\n }\n };\n\n window.addEventListener('keydown', handleKey);\n return () => window.removeEventListener('keydown', handleKey);\n }, [enableKeyboard, mode, fullscreen, isFullscreen, enableClicks, currentClick, maxClicks, nextClick, prevClick, nextSlide, prevSlide, goToSlide, slideCount]);\n\n // ── Click visibility management (DOM-based, presentation mode only) ──\n useEffect(() => {\n if (!enableClicks || !result || mode !== 'presentation') return;\n\n const timer = setTimeout(() => {\n const container = document.querySelector('.slide-presentation-host > div');\n if (!container) return;\n\n container.querySelectorAll('[data-click-group]').forEach((el) => {\n const group = parseInt(el.getAttribute('data-click-group') ?? '0', 10);\n const isVisible = group <= currentClick;\n el.classList.toggle('visible', isVisible);\n });\n }, 50);\n\n return () => clearTimeout(timer);\n }, [enableClicks, currentClick, result, currentIndex, mode]);\n\n // ── Mermaid post-processing ──\n useEffect(() => {\n if (!result || result.mermaidBlocks.length === 0) return;\n\n const timer = setTimeout(() => {\n const containers = document.querySelectorAll('.slide-presentation-host > div, .slide-deck-host > div');\n containers.forEach((container) => {\n if (container instanceof HTMLElement) {\n const themeName = typeof theme === 'string' ? theme : 'dark';\n renderMermaidDiagrams(container, themeName as 'dark' | 'light' | 'navy').catch(() => {});\n }\n });\n }, 100);\n\n return () => clearTimeout(timer);\n }, [result, theme, currentIndex, mode]);\n\n // Handle theme change from ThemeSwitcher\n const handleThemeChange = useCallback(\n (themeId: string) => {\n setTheme(themeId as BuiltInTheme | SlideTheme);\n },\n [setTheme],\n );\n\n // Toggle fullscreen\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n\n // Loading state\n if (!result) {\n return (\n <div\n className={className}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: '80px 0', color: 'rgba(128, 128, 128, 0.5)',\n fontSize: '13px', fontFamily: 'inherit',\n }}\n >\n No slide content\n </div>\n );\n }\n\n const themeName = typeof theme === 'string' ? theme : theme.name;\n\n // ── Fullscreen CSS ──\n const fullscreenCss = fullscreen ? `\n .slide-viewer-fullscreen {\n position: fixed !important;\n inset: 0 !important;\n z-index: 9999 !important;\n background: #000 !important;\n padding: 24px !important;\n overflow-y: auto !important;\n display: flex !important;\n flex-direction: column !important;\n }\n .slide-viewer-fullscreen .slide-presentation-host {\n flex: 1 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n ` : '';\n\n return (\n <div\n className={`${className ?? ''} ${isFullscreen ? 'slide-viewer-fullscreen' : ''}`.trim()}\n style={{\n display: 'flex', flexDirection: 'column', width: '100%',\n gap: '12px',\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...(isFullscreen ? { background: '#000', color: '#fff' } : {}),\n }}\n >\n {/* Fullscreen CSS */}\n {fullscreen && <style>{fullscreenCss}</style>}\n\n {/* Click CSS injection (presentation mode only) */}\n {enableClicks && mode === 'presentation' && result.clickCss && <style>{result.clickCss}</style>}\n\n {/* Top bar: ThemeSwitcher + NavigationBar + Fullscreen button */}\n {(showThemeSwitcher || showNavigation || fullscreen) && (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n gap: '12px', flexWrap: 'wrap',\n ...(isFullscreen ? { borderBottom: '1px solid rgba(255,255,255,0.1)', paddingBottom: '8px' } : {}),\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {showThemeSwitcher && (\n <ThemeSwitcher\n currentTheme={themeName}\n onThemeChange={handleThemeChange}\n themes={themeOptions}\n />\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {showNavigation && (\n <NavigationBar\n currentIndex={currentIndex}\n slideCount={slideCount}\n onNavigate={goToSlide}\n mode={mode}\n onModeChange={setMode}\n markdown={markdown}\n />\n )}\n\n {/* Notes toggle button */}\n {showNotes && (\n <button\n type=\"button\"\n onClick={() => setShowNotesDrawer((prev) => !prev)}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: showNotesDrawer ? '1px solid #0284c7' : '1px solid transparent',\n cursor: 'pointer',\n backgroundColor: showNotesDrawer ? 'rgba(2, 132, 199, 0.15)' : 'transparent',\n color: showNotesDrawer ? '#38bdf8' : (isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)'),\n transition: 'all 0.15s ease',\n }}\n title=\"Ghi chú cho Giảng viên\"\n >\n Notes\n </button>\n )}\n\n {/* Design mode toggle button */}\n {showDesignMode && mode === 'presentation' && (\n <button\n type=\"button\"\n onClick={() => setIsDesignMode((prev) => !prev)}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: isDesignMode ? '1px solid #38bdf8' : '1px solid transparent',\n cursor: 'pointer',\n backgroundColor: isDesignMode ? 'rgba(56, 189, 248, 0.15)' : 'transparent',\n color: isDesignMode ? '#38bdf8' : (isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)'),\n transition: 'all 0.15s ease',\n }}\n title=\"Chế độ chỉnh sửa bố cục (Google Slides-style)\"\n >\n Design\n </button>\n )}\n\n {/* Fullscreen toggle button */}\n {fullscreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n style={{\n height: '28px', padding: '0 10px', borderRadius: '6px',\n fontSize: '12px', fontFamily: 'inherit',\n display: 'flex', alignItems: 'center', gap: '5px',\n border: 'none', cursor: 'pointer',\n backgroundColor: 'transparent',\n color: isFullscreen ? '#fff' : 'rgba(128,128,128,0.7)',\n transition: 'all 0.15s ease',\n }}\n title={isFullscreen ? 'Exit fullscreen (ESC)' : 'Fullscreen (F)'}\n >\n {isFullscreen ? '⊡ Exit' : '⊞ Fullscreen'}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Click progress indicator */}\n {enableClicks && maxClicks > 0 && mode === 'presentation' && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: '8px',\n fontSize: '11px', color: isFullscreen ? 'rgba(255,255,255,0.5)' : 'rgba(128,128,128,0.5)',\n }}>\n <span>Click {currentClick} / {maxClicks}</span>\n <div style={{\n flex: 1, height: '2px', borderRadius: '1px',\n backgroundColor: isFullscreen ? 'rgba(255,255,255,0.1)' : 'rgba(128,128,128,0.1)',\n }}>\n <div style={{\n height: '100%', borderRadius: '1px',\n backgroundColor: isFullscreen ? 'rgba(255,255,255,0.3)' : 'rgba(128,128,128,0.3)',\n width: `${maxClicks > 0 ? (currentClick / maxClicks) * 100 : 0}%`,\n transition: 'width 0.2s ease',\n }} />\n </div>\n </div>\n )}\n\n {/* Slide view */}\n <div\n style={{ position: 'relative', width: '100%' }}\n onClick={(e) => {\n if (mode !== 'presentation' || isDesignMode) return;\n if ((e.target as HTMLElement).closest('button, a, input, select, textarea, [contenteditable], .slide-design-overlay')) return;\n if (enableClicks && currentClick < maxClicks) {\n nextClick();\n } else {\n nextSlide();\n }\n }}\n >\n {mode === 'presentation' ? (\n <>\n <PresentationView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n layoutCss={result.layoutCss}\n currentIndex={currentIndex}\n slideCount={slideCount}\n />\n {isDesignMode && (\n <SlideDesignOverlay\n slideIndex={currentIndex}\n layout={liveLayout ?? result.layouts?.[currentIndex] ?? null}\n onLayoutChange={setLiveLayout}\n onSave={(layout) => {\n setLiveLayout(layout);\n if (onSaveMarkdown) {\n const updated = updateSlideLayoutInMarkdown(markdown, currentIndex, layout);\n onSaveMarkdown(updated);\n }\n }}\n onClose={() => setIsDesignMode(false)}\n isActive={isDesignMode}\n />\n )}\n </>\n ) : (\n <DeckView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n layoutCss={result.layoutCss}\n slideCount={slideCount}\n notes={result.notes}\n showNotes={showNotesDrawer}\n />\n )}\n </div>\n\n {/* Presenter notes drawer */}\n {showNotes && (\n <PresenterNotesDrawer\n notes={result.notes?.[currentIndex] ?? []}\n currentIndex={currentIndex}\n slideCount={slideCount}\n isOpen={showNotesDrawer}\n onClose={() => setShowNotesDrawer(false)}\n isDark={themeName !== 'light'}\n />\n )}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit/react — HtmlSlideViewer\n// Zero-build, iframe-isolated, self-contained HTML slide deck viewer\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport type { HtmlDeckData } from '../../html-engine/types.js';\nimport { compileHtmlDeck } from '../../html-engine/compiler.js';\n\nexport interface HtmlSlideViewerProps {\n /** Pre-compiled HTML string. If provided, used directly */\n htmlContent?: string;\n /** Structured deck data. If provided without htmlContent, compiled automatically */\n deckData?: HtmlDeckData;\n /** Deck title displayed on header / download file name */\n title?: string;\n /** Extra CSS classes for wrapper */\n className?: string;\n /** Callback fired when active slide index changes */\n onSlideChange?: (current: number, total: number) => void;\n /** Callback fired when slide deck is exported or saved from inline editor */\n onSaveHtml?: (savedHtml: string) => void;\n /** Show top control bar */\n showTopBar?: boolean;\n}\n\nexport const HtmlSlideViewer: React.FC<HtmlSlideViewerProps> = ({\n htmlContent: initialHtml,\n deckData,\n title: propTitle,\n className = '',\n onSlideChange,\n onSaveHtml,\n showTopBar = true,\n}) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentSlide, setCurrentSlide] = useState<number>(0);\n const [totalSlides, setTotalSlides] = useState<number>(deckData?.slides?.length || 1);\n const [isFullscreen, setIsFullscreen] = useState<boolean>(false);\n\n // Compile deck if deckData is passed\n const fullHtml = useMemo(() => {\n if (initialHtml) return initialHtml;\n if (deckData) {\n return compileHtmlDeck(deckData).html;\n }\n return '';\n }, [initialHtml, deckData]);\n\n const deckTitle = propTitle || deckData?.title || 'Presentation';\n\n // Listen for slide change messages from iframe\n useEffect(() => {\n const handleMessage = (e: MessageEvent) => {\n if (!e.data || typeof e.data !== 'object') return;\n if (e.data.type === 'PRESENTATION_SLIDE_CHANGE') {\n const cur = Number(e.data.currentIndex) || 0;\n const tot = Number(e.data.totalSlides) || 1;\n setCurrentSlide(cur);\n setTotalSlides(tot);\n if (onSlideChange) {\n onSlideChange(cur, tot);\n }\n } else if (e.data.type === 'SLIDE_HTML_SAVED') {\n if (onSaveHtml && typeof e.data.html === 'string') {\n onSaveHtml(e.data.html);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [onSlideChange, onSaveHtml]);\n\n // Fullscreen change listener\n useEffect(() => {\n const onFsChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener('fullscreenchange', onFsChange);\n return () => document.removeEventListener('fullscreenchange', onFsChange);\n }, []);\n\n // PostMessage helpers\n const sendIframeMessage = useCallback((msg: any) => {\n if (iframeRef.current?.contentWindow) {\n iframeRef.current.contentWindow.postMessage(msg, '*');\n }\n }, []);\n\n // Ensure iframe recalculates scale whenever container dimensions change (sidebar toggling, responsive resizing)\n useEffect(() => {\n if (!containerRef.current || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => {\n sendIframeMessage({ type: 'RESIZE' });\n });\n ro.observe(containerRef.current);\n return () => ro.disconnect();\n }, [sendIframeMessage]);\n\n const handleNext = () => sendIframeMessage({ type: 'NEXT_SLIDE' });\n const handlePrev = () => sendIframeMessage({ type: 'PREV_SLIDE' });\n\n const handleToggleFullscreen = () => {\n if (!containerRef.current) return;\n if (!document.fullscreenElement) {\n containerRef.current.requestFullscreen().catch(() => {});\n } else {\n document.exitFullscreen().catch(() => {});\n }\n };\n\n const handleDownloadHtml = () => {\n if (!fullHtml) return;\n const blob = new Blob([fullHtml], { type: 'text/html;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${deckTitle.toLowerCase().replace(/[^a-z0-9]/g, '-') || 'slide-deck'}.html`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col w-full h-full bg-card text-txt-pri rounded-xl overflow-hidden border border-border/80 shadow-xs ${className}`}\n style={{ minHeight: '480px' }}\n >\n {/* Top Bar Controls */}\n {showTopBar && (\n <div className=\"flex items-center justify-between px-4 py-2 bg-panel/90 backdrop-blur border-b border-border/80 text-meta select-none z-20\">\n <div className=\"flex items-center gap-2 font-medium truncate max-w-md\">\n <span className=\"w-2 h-2 rounded-full bg-primary inline-block shrink-0\"></span>\n <span className=\"truncate text-txt-pri\">{deckTitle}</span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Slide Navigation Counter */}\n <div className=\"inline-flex items-center gap-1 bg-card px-2 py-0.5 rounded-lg border border-border/80 font-mono text-meta text-txt-sec h-7.5\">\n <button\n onClick={handlePrev}\n disabled={currentSlide <= 0}\n className=\"hover:text-txt-pri disabled:opacity-30 p-1 text-txt-sec cursor-pointer transition-colors flex items-center justify-center rounded\"\n title=\"Previous Slide (←)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\n </button>\n <span className=\"px-1.5 font-semibold text-txt-pri text-center min-w-[45px]\">\n {String(currentSlide + 1).padStart(2, '0')} / {String(totalSlides).padStart(2, '0')}\n </span>\n <button\n onClick={handleNext}\n disabled={currentSlide >= totalSlides - 1}\n className=\"hover:text-txt-pri disabled:opacity-30 p-1 text-txt-sec cursor-pointer transition-colors flex items-center justify-center rounded\"\n title=\"Next Slide (→)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\n </button>\n </div>\n\n {/* Download Standalone HTML Button */}\n <button\n onClick={handleDownloadHtml}\n className=\"flex items-center gap-1.5 h-7.5 px-2.5 rounded-lg bg-panel hover:bg-txt-pri/5 text-txt-pri border border-border/80 text-meta font-medium transition-colors cursor-pointer shadow-2xs leading-none shrink-0\"\n title=\"Download standalone offline HTML file\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n <polyline points=\"7 10 12 15 17 10\"></polyline>\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n </svg>\n <span>Export HTML</span>\n </button>\n\n {/* Fullscreen Button */}\n <button\n onClick={handleToggleFullscreen}\n className=\"h-7.5 px-2 rounded-lg bg-panel hover:bg-txt-pri/5 text-txt-pri border border-border/80 text-meta transition-colors cursor-pointer shadow-2xs flex items-center justify-center shrink-0\"\n title=\"Toggle Fullscreen (F)\"\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isFullscreen ? (\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"></path>\n ) : (\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"></path>\n )}\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {/* Main Iframe Canvas Viewport */}\n <div className=\"relative flex-1 w-full h-full min-h-0 bg-black\">\n {fullHtml ? (\n <iframe\n ref={iframeRef}\n srcDoc={fullHtml}\n title={deckTitle}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms\"\n className=\"w-full h-full border-0 block\"\n onLoad={() => {\n sendIframeMessage({ type: 'RESIZE' });\n }}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-neutral-500 text-sm\">\n No slide deck content loaded.\n </div>\n )}\n </div>\n </div>\n );\n};\n"]}
|