@thanh01.pmt/presentation-kit 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-RCHOTRWI.js → chunk-FATGZ25L.js} +266 -16
- package/dist/chunk-FATGZ25L.js.map +1 -0
- package/dist/{chunk-N4Q6GUAQ.cjs → chunk-O4Y3VEOA.cjs} +277 -15
- package/dist/chunk-O4Y3VEOA.cjs.map +1 -0
- package/dist/{click-css-CadkoJ_A.d.cts → click-css-C84mdmU0.d.cts} +37 -8
- package/dist/{click-css-CadkoJ_A.d.ts → click-css-C84mdmU0.d.ts} +37 -8
- package/dist/index.cjs +232 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -3
- package/dist/index.d.ts +68 -3
- package/dist/index.js +172 -3
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +700 -21
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +50 -6
- package/dist/react/index.d.ts +50 -6
- package/dist/react/index.js +690 -13
- package/dist/react/index.js.map +1 -1
- package/package.json +11 -3
- package/dist/chunk-N4Q6GUAQ.cjs.map +0 -1
- package/dist/chunk-RCHOTRWI.js.map +0 -1
package/dist/react/index.cjs.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/SlideViewer.tsx"],"names":["useState","useRef","useMemo","renderSlide","useEffect","useCallback","jsx","jsxs","Fragment","themeName","renderMermaidDiagrams"],"mappings":"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","file":"index.cjs","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 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 {/* 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 slideCount,\n className,\n}: DeckViewProps) {\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\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 {/* Deck mode CSS */}\n <style>{deckCss}</style>\n\n {/* Render all slides stacked vertically */}\n <div\n className=\"slide-deck-host\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </div>\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 { renderMermaidDiagrams } from '../../plugins/mermaid.js';\nimport type { SlideViewerProps, ThemeOption } from '../types.js';\nimport type { BuiltInTheme, SlideTheme } 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 * - 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 themeOptions = DEFAULT_THEME_OPTIONS,\n onThemeChange,\n onSlideChange,\n onModeChange,\n onRenderComplete,\n}: SlideViewerProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\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 };\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 {/* 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 {mode === 'presentation' ? (\n <PresentationView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n currentIndex={currentIndex}\n slideCount={slideCount}\n />\n ) : (\n <DeckView\n html={result.html}\n css={result.css}\n themeCss={result.themeCss}\n slideCount={slideCount}\n />\n )}\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"],"names":["useState","useRef","useMemo","renderSlide","useEffect","useCallback","jsx","jsxs","Fragment","themeName","renderMermaidDiagrams","updateSlideLayoutInMarkdown"],"mappings":"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","file":"index.cjs","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}: DeckViewProps) {\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\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 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 ✕\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 } from '../../types.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 */\n onSave?: (layout: SlideLayoutData) => void;\n /** Callback when user cancels or closes design mode */\n onClose?: () => void;\n /** Whether design mode is active */\n isActive: boolean;\n}\n\nexport function SlideDesignOverlay({\n slideIndex,\n layout,\n onLayoutChange,\n onSave,\n onClose,\n isActive,\n}: SlideDesignOverlayProps) {\n if (!isActive) return null;\n\n const [boxes, setBoxes] = useState<LayoutBoxConfig[]>(layout?.boxes ?? []);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\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 [dragging, setDragging] = useState<{\n type: 'move' | 'nw' | 'ne' | 'se' | 'sw' | 'e' | 's';\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' | 'ne' | 'se' | 'sw' | 'e' | 's'\n ) => {\n e.preventDefault();\n e.stopPropagation();\n\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 // Scale factor from screen pixels to 1280x720 canvas coordinates\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 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.max(0, Math.min(1280 - origW, origX + dx));\n newY = Math.max(0, Math.min(720 - origH, origY + dy));\n break;\n case 'se':\n newW = Math.max(50, origW + dx);\n newH = Math.max(30, origH + dy);\n break;\n case 'e':\n newW = Math.max(50, origW + dx);\n break;\n case 's':\n newH = Math.max(30, origH + dy);\n break;\n case 'sw':\n newX = Math.min(origX + origW - 50, origX + dx);\n newW = Math.max(50, origW - dx);\n newH = Math.max(30, origH + dy);\n break;\n case 'ne':\n newY = Math.min(origY + origH - 30, origY + dy);\n newW = Math.max(50, origW + dx);\n newH = Math.max(30, origH - dy);\n break;\n case 'nw':\n newX = Math.min(origX + origW - 50, origX + dx);\n newY = Math.min(origY + origH - 30, origY + dy);\n newW = Math.max(50, origW - dx);\n newH = Math.max(30, origH - dy);\n break;\n }\n\n return {\n ...b,\n pos: [Math.round(newX), Math.round(newY), Math.round(newW), Math.round(newH)] as [number, number, number, number],\n };\n });\n\n onLayoutChange({ boxes: updated });\n return updated;\n });\n }, [dragging, onLayoutChange]);\n\n const handleMouseUp = useCallback(() => {\n setDragging(null);\n }, []);\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 // ── Box Actions ──\n const addNewBox = (targetTag: string) => {\n const newBox: LayoutBoxConfig = {\n id: `box-${Date.now().toString(36)}`,\n target: targetTag,\n pos: [100, 120 + boxes.length * 80, 600, 100],\n fontSize: targetTag === 'h1' ? '2.5rem' : '1.2rem',\n color: targetTag === 'h1' ? '#38bdf8' : '#e2e8f0',\n textAlign: 'left',\n };\n const updated = [...boxes, newBox];\n setBoxes(updated);\n setSelectedId(newBox.id);\n onLayoutChange({ boxes: updated });\n };\n\n const updateSelectedBox = (updates: Partial<LayoutBoxConfig>) => {\n if (!selectedId) return;\n setBoxes(prev => {\n const updated = prev.map(b => (b.id === selectedId ? { ...b, ...updates } : b));\n onLayoutChange({ boxes: updated });\n return updated;\n });\n };\n\n const removeSelectedBox = () => {\n if (!selectedId) return;\n setBoxes(prev => {\n const updated = prev.filter(b => b.id !== selectedId);\n onLayoutChange({ boxes: updated });\n return updated;\n });\n setSelectedId(null);\n };\n\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n pointerEvents: 'none', // Allow passing through to children that have pointerEvents: 'auto'\n }}\n >\n {/* Top Designer Toolbar */}\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: '#1e1f29',\n border: '1px solid rgba(56, 189, 248, 0.4)',\n borderRadius: '24px',\n boxShadow: '0 8px 30px rgba(0, 0, 0, 0.5)',\n color: '#f8fafc',\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n <span style={{ fontWeight: 600, color: '#38bdf8' }}>Design Canvas:</span>\n <button\n type=\"button\"\n onClick={() => addNewBox('h1')}\n style={toolbarButtonStyle}\n title=\"Thêm khung vị trí Tiêu đề\"\n >\n + Tiêu đề (H1)\n </button>\n <button\n type=\"button\"\n onClick={() => addNewBox('p')}\n style={toolbarButtonStyle}\n title=\"Thêm khung vị trí Đoạn văn\"\n >\n + Đoạn văn (P)\n </button>\n\n <div style={{ width: '1px', height: '16px', backgroundColor: 'rgba(255,255,255,0.2)' }} />\n\n {onSave && (\n <button\n type=\"button\"\n onClick={() => onSave({ boxes })}\n style={{\n ...toolbarButtonStyle,\n backgroundColor: '#0284c7',\n color: '#ffffff',\n fontWeight: 600,\n }}\n >\n Lưu bố cục\n </button>\n )}\n\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n ...toolbarButtonStyle,\n backgroundColor: 'transparent',\n color: '#94a3b8',\n }}\n >\n Đóng\n </button>\n )}\n </div>\n\n {/* 1280x720 Canvas Coordinate Mapping Host */}\n <div\n ref={containerRef}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'auto',\n }}\n onClick={() => setSelectedId(null)}\n >\n {boxes.map(box => {\n const [x, y, w, h] = box.pos;\n const isSelected = box.id === selectedId;\n\n // Convert 1280x720 coordinates to % for responsive viewport positioning\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 => {\n e.stopPropagation();\n setSelectedId(box.id);\n }}\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 ? '2px solid #38bdf8' : '1px dashed rgba(56, 189, 248, 0.5)',\n backgroundColor: isSelected ? 'rgba(56, 189, 248, 0.08)' : 'rgba(56, 189, 248, 0.03)',\n cursor: 'move',\n userSelect: 'none',\n boxSizing: 'border-box',\n zIndex: isSelected ? 40 : 20,\n }}\n >\n {/* Box label */}\n <div\n style={{\n position: 'absolute',\n top: '-18px',\n left: '0',\n fontSize: '10px',\n fontWeight: 600,\n color: isSelected ? '#38bdf8' : 'rgba(56, 189, 248, 0.7)',\n backgroundColor: 'rgba(0,0,0,0.8)',\n padding: '1px 6px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n }}\n >\n {box.target || box.id} ({Math.round(x)}, {Math.round(y)})\n </div>\n\n {/* Resize Handles (8 handles) */}\n {isSelected && (\n <>\n <div\n style={handleStyle('se')}\n onMouseDown={e => handleMouseDown(e, box, 'se')}\n />\n <div\n style={handleStyle('e')}\n onMouseDown={e => handleMouseDown(e, box, 'e')}\n />\n <div\n style={handleStyle('s')}\n onMouseDown={e => handleMouseDown(e, box, 's')}\n />\n <div\n style={handleStyle('sw')}\n onMouseDown={e => handleMouseDown(e, box, 'sw')}\n />\n <div\n style={handleStyle('ne')}\n onMouseDown={e => handleMouseDown(e, box, 'ne')}\n />\n <div\n style={handleStyle('nw')}\n onMouseDown={e => handleMouseDown(e, box, 'nw')}\n />\n </>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Floating Properties Mini-Toolbar for Selected Box */}\n {selectedBox && (\n <div\n style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 60,\n pointerEvents: 'auto',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n backgroundColor: '#181920',\n border: '1px solid rgba(255,255,255,0.15)',\n borderRadius: '12px',\n boxShadow: '0 10px 30px rgba(0,0,0,0.6)',\n color: '#f8fafc',\n fontSize: '12px',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n <span style={{ fontWeight: 600, color: '#38bdf8' }}>Khung: {selectedBox.target}</span>\n\n {/* Font Size controls */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ color: '#94a3b8', fontSize: '11px' }}>Size:</span>\n <input\n type=\"text\"\n value={selectedBox.fontSize ?? '1.5rem'}\n onChange={e => updateSelectedBox({ fontSize: e.target.value })}\n style={{\n width: '60px',\n padding: '2px 6px',\n borderRadius: '4px',\n border: '1px solid #334155',\n backgroundColor: '#0f172a',\n color: '#f8fafc',\n fontSize: '11px',\n }}\n />\n </div>\n\n {/* Color Picker */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ color: '#94a3b8', fontSize: '11px' }}>Color:</span>\n <input\n type=\"color\"\n value={selectedBox.color ?? '#38bdf8'}\n onChange={e => updateSelectedBox({ color: e.target.value })}\n style={{\n width: '24px',\n height: '24px',\n padding: '0',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n }}\n />\n </div>\n\n {/* Text Alignment */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n {(['left', 'center', 'right'] as const).map(align => (\n <button\n key={align}\n type=\"button\"\n onClick={() => updateSelectedBox({ textAlign: align })}\n style={{\n ...toolbarButtonStyle,\n backgroundColor: selectedBox.textAlign === align ? '#0284c7' : 'rgba(255,255,255,0.05)',\n textTransform: 'capitalize',\n fontSize: '11px',\n padding: '2px 8px',\n }}\n >\n {align}\n </button>\n ))}\n </div>\n\n <button\n type=\"button\"\n onClick={removeSelectedBox}\n style={{\n ...toolbarButtonStyle,\n backgroundColor: 'rgba(239, 68, 68, 0.2)',\n color: '#f87171',\n borderColor: 'rgba(239, 68, 68, 0.4)',\n }}\n title=\"Xóa định vị tự do (trở về luồng bình thường)\"\n >\n Trở về luồng mặc định\n </button>\n </div>\n )}\n </div>\n );\n}\n\nconst toolbarButtonStyle: React.CSSProperties = {\n height: '26px',\n padding: '0 10px',\n borderRadius: '14px',\n fontSize: '11px',\n fontFamily: 'inherit',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n color: '#e2e8f0',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.15s ease',\n};\n\nfunction handleStyle(pos: 'nw' | 'ne' | 'se' | 'sw' | 'e' | 's'): React.CSSProperties {\n const size = 10;\n const base: React.CSSProperties = {\n position: 'absolute',\n width: `${size}px`,\n height: `${size}px`,\n backgroundColor: '#ffffff',\n border: '2px solid #0284c7',\n borderRadius: '2px',\n boxSizing: 'border-box',\n zIndex: 50,\n };\n\n switch (pos) {\n case 'se':\n return { ...base, right: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'se-resize' };\n case 'e':\n return { ...base, right: `-${size / 2}px`, top: `calc(50% - ${size / 2}px)`, cursor: 'e-resize' };\n case 's':\n return { ...base, bottom: `-${size / 2}px`, left: `calc(50% - ${size / 2}px)`, cursor: 's-resize' };\n case 'sw':\n return { ...base, left: `-${size / 2}px`, bottom: `-${size / 2}px`, cursor: 'sw-resize' };\n case 'ne':\n return { ...base, right: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'ne-resize' };\n case 'nw':\n return { ...base, left: `-${size / 2}px`, top: `-${size / 2}px`, cursor: 'nw-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 };\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 style={{ position: 'relative', width: '100%' }}>\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 />\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"]}
|
package/dist/react/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React$1 from 'react';
|
|
2
|
-
import { B as BuiltInTheme,
|
|
3
|
-
export {
|
|
2
|
+
import { B as BuiltInTheme, o as SlideTheme, s as SlideRenderResult, b as SlideLayoutData } from '../click-css-C84mdmU0.cjs';
|
|
3
|
+
export { n as ClickCssOptions, m as ClickPostprocessResult, C as ClickPreprocessResult, M as MermaidBlock, t as SlideRenderAsyncResult, q as SlideRenderOptions, T as ThemeTokens, f as defineTheme, k as extractMaxClicks, l as generateClickCss, j as postprocessClicks, p as preprocessClicks, r as renderSlide, c as renderSlideAsync, g as resolveTheme } from '../click-css-C84mdmU0.cjs';
|
|
4
4
|
|
|
5
5
|
/** View mode for slide display */
|
|
6
6
|
type SlideViewMode = 'presentation' | 'deck';
|
|
@@ -31,6 +31,10 @@ interface SlideViewerProps {
|
|
|
31
31
|
enableClicks?: boolean;
|
|
32
32
|
/** Enable fullscreen button + ESC to exit (default: false) */
|
|
33
33
|
fullscreen?: boolean;
|
|
34
|
+
/** Show teacher/presenter notes button & drawer (default: true) */
|
|
35
|
+
showNotes?: boolean;
|
|
36
|
+
/** Show visual design mode button (default: false) */
|
|
37
|
+
showDesignMode?: boolean;
|
|
34
38
|
/** Custom theme options for ThemeSwitcher */
|
|
35
39
|
themeOptions?: ThemeOption[];
|
|
36
40
|
/** Callback when theme changes */
|
|
@@ -41,6 +45,8 @@ interface SlideViewerProps {
|
|
|
41
45
|
onModeChange?: (mode: SlideViewMode) => void;
|
|
42
46
|
/** Callback when render completes */
|
|
43
47
|
onRenderComplete?: (result: SlideRenderResult) => void;
|
|
48
|
+
/** Callback when markdown is updated in design mode */
|
|
49
|
+
onSaveMarkdown?: (updatedMarkdown: string) => void;
|
|
44
50
|
}
|
|
45
51
|
/** Props for PresentationView */
|
|
46
52
|
interface PresentationViewProps {
|
|
@@ -50,6 +56,8 @@ interface PresentationViewProps {
|
|
|
50
56
|
css: string;
|
|
51
57
|
/** Theme scoped CSS */
|
|
52
58
|
themeCss: string;
|
|
59
|
+
/** Layout scoped CSS */
|
|
60
|
+
layoutCss?: string;
|
|
53
61
|
/** Current slide index (0-based) */
|
|
54
62
|
currentIndex: number;
|
|
55
63
|
/** Total number of slides */
|
|
@@ -65,6 +73,8 @@ interface DeckViewProps {
|
|
|
65
73
|
css: string;
|
|
66
74
|
/** Theme scoped CSS */
|
|
67
75
|
themeCss: string;
|
|
76
|
+
/** Layout scoped CSS */
|
|
77
|
+
layoutCss?: string;
|
|
68
78
|
/** Total number of slides */
|
|
69
79
|
slideCount: number;
|
|
70
80
|
/** Container CSS class */
|
|
@@ -154,9 +164,11 @@ interface SlideActions {
|
|
|
154
164
|
* - Click-to-reveal (<!-- click --> / <!-- clicks -->)
|
|
155
165
|
* - Fullscreen mode (ESC to exit)
|
|
156
166
|
* - Mermaid diagram rendering
|
|
167
|
+
* - Teacher/Presenter notes drawer
|
|
168
|
+
* - Visual design mode (Google Slides-style positioning & resizing)
|
|
157
169
|
* - Copy markdown button
|
|
158
170
|
*/
|
|
159
|
-
declare function SlideViewer({ markdown, initialTheme, initialMode, className, showThemeSwitcher, showNavigation, enableKeyboard, enableClicks, fullscreen, themeOptions, onThemeChange, onSlideChange, onModeChange, onRenderComplete, }: SlideViewerProps): React$1.JSX.Element;
|
|
171
|
+
declare function SlideViewer({ markdown, initialTheme, initialMode, className, showThemeSwitcher, showNavigation, enableKeyboard, enableClicks, fullscreen, showNotes, showDesignMode, themeOptions, onThemeChange, onSlideChange, onModeChange, onRenderComplete, onSaveMarkdown, }: SlideViewerProps): React$1.JSX.Element;
|
|
160
172
|
|
|
161
173
|
/**
|
|
162
174
|
* PresentationView — Renders a single slide at a time.
|
|
@@ -175,7 +187,7 @@ declare function SlideViewer({ markdown, initialTheme, initialMode, className, s
|
|
|
175
187
|
* />
|
|
176
188
|
* ```
|
|
177
189
|
*/
|
|
178
|
-
declare function PresentationView({ html, css, themeCss, currentIndex, slideCount, className, }: PresentationViewProps): React$1.JSX.Element;
|
|
190
|
+
declare function PresentationView({ html, css, themeCss, layoutCss, currentIndex, slideCount, className, }: PresentationViewProps): React$1.JSX.Element;
|
|
179
191
|
|
|
180
192
|
/**
|
|
181
193
|
* DeckView — Renders all slides vertically in a scrollable list.
|
|
@@ -192,7 +204,7 @@ declare function PresentationView({ html, css, themeCss, currentIndex, slideCoun
|
|
|
192
204
|
* />
|
|
193
205
|
* ```
|
|
194
206
|
*/
|
|
195
|
-
declare function DeckView({ html, css, themeCss, slideCount, className, }: DeckViewProps): React$1.JSX.Element;
|
|
207
|
+
declare function DeckView({ html, css, themeCss, layoutCss, slideCount, className, }: DeckViewProps): React$1.JSX.Element;
|
|
196
208
|
|
|
197
209
|
/**
|
|
198
210
|
* ThemeSwitcher — Renders a row of theme toggle buttons.
|
|
@@ -220,6 +232,38 @@ declare function ThemeSwitcher({ currentTheme, onThemeChange, themes, className,
|
|
|
220
232
|
*/
|
|
221
233
|
declare function NavigationBar({ currentIndex, slideCount, onNavigate, mode, onModeChange, className, showCopy, markdown, }: NavigationBarProps): React$1.JSX.Element;
|
|
222
234
|
|
|
235
|
+
interface PresenterNotesDrawerProps {
|
|
236
|
+
/** Notes for current slide */
|
|
237
|
+
notes: string[];
|
|
238
|
+
/** Current slide index (0-based) */
|
|
239
|
+
currentIndex: number;
|
|
240
|
+
/** Total number of slides */
|
|
241
|
+
slideCount: number;
|
|
242
|
+
/** Whether the drawer is open */
|
|
243
|
+
isOpen: boolean;
|
|
244
|
+
/** Callback to close the drawer */
|
|
245
|
+
onClose: () => void;
|
|
246
|
+
/** Theme mode for color styling */
|
|
247
|
+
isDark?: boolean;
|
|
248
|
+
}
|
|
249
|
+
declare function PresenterNotesDrawer({ notes, currentIndex, slideCount, isOpen, onClose, isDark, }: PresenterNotesDrawerProps): React$1.JSX.Element | null;
|
|
250
|
+
|
|
251
|
+
interface SlideDesignOverlayProps {
|
|
252
|
+
/** Current slide index (0-based) */
|
|
253
|
+
slideIndex: number;
|
|
254
|
+
/** Current layout data for this slide */
|
|
255
|
+
layout: SlideLayoutData | null;
|
|
256
|
+
/** Callback when layout changes in real-time */
|
|
257
|
+
onLayoutChange: (layout: SlideLayoutData) => void;
|
|
258
|
+
/** Callback when user explicitly clicks Save */
|
|
259
|
+
onSave?: (layout: SlideLayoutData) => void;
|
|
260
|
+
/** Callback when user cancels or closes design mode */
|
|
261
|
+
onClose?: () => void;
|
|
262
|
+
/** Whether design mode is active */
|
|
263
|
+
isActive: boolean;
|
|
264
|
+
}
|
|
265
|
+
declare function SlideDesignOverlay({ slideIndex, layout, onLayoutChange, onSave, onClose, isActive, }: SlideDesignOverlayProps): React$1.JSX.Element | null;
|
|
266
|
+
|
|
223
267
|
interface UseSlideStateOptions {
|
|
224
268
|
markdown: string;
|
|
225
269
|
initialTheme?: BuiltInTheme | SlideTheme;
|
|
@@ -266,4 +310,4 @@ interface UseSlideStateReturn {
|
|
|
266
310
|
*/
|
|
267
311
|
declare function useSlideState(options: UseSlideStateOptions): UseSlideStateReturn;
|
|
268
312
|
|
|
269
|
-
export { BuiltInTheme, DeckView, type DeckViewProps, NavigationBar, type NavigationBarProps, PresentationView, type PresentationViewProps, type SlideActions, SlideRenderResult, type SlideState, SlideTheme, type SlideViewMode, SlideViewer, type SlideViewerProps, type ThemeOption, ThemeSwitcher, type ThemeSwitcherProps, type UseSlideStateOptions, type UseSlideStateReturn, useSlideState };
|
|
313
|
+
export { BuiltInTheme, DeckView, type DeckViewProps, NavigationBar, type NavigationBarProps, PresentationView, type PresentationViewProps, PresenterNotesDrawer, type PresenterNotesDrawerProps, type SlideActions, SlideDesignOverlay, type SlideDesignOverlayProps, SlideRenderResult, type SlideState, SlideTheme, type SlideViewMode, SlideViewer, type SlideViewerProps, type ThemeOption, ThemeSwitcher, type ThemeSwitcherProps, type UseSlideStateOptions, type UseSlideStateReturn, useSlideState };
|