@thanh01.pmt/presentation-kit 0.1.1 → 0.2.1
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-PAHIW5IX.js} +906 -16
- package/dist/chunk-PAHIW5IX.js.map +1 -0
- package/dist/{chunk-N4Q6GUAQ.cjs → chunk-RJMPTRL3.cjs} +920 -15
- package/dist/chunk-RJMPTRL3.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 +244 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +87 -3
- package/dist/index.d.ts +87 -3
- package/dist/index.js +172 -3
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +726 -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 +716 -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.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/SlideViewer.tsx"],"names":["useState","useCallback","jsxs","jsx","useEffect","themeName"],"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 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","useCallback","jsxs","jsx","useRef","useEffect","Fragment","themeName"],"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}: 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';\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 */\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 <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 ...toolbarButtonStyle,\n cursor: 'pointer',\n outline: 'none',\n color: '#f8fafc',\n border: '1px solid rgba(56, 189, 248, 0.3)',\n }}\n title=\"Áp dụng mẫu bố cục có sẵn\"\n >\n <option value=\"\" disabled style={{ backgroundColor: '#1e1f29', color: '#94a3b8' }}>\n Mẫu bố cục (Presets)...\n </option>\n {SLIDE_LAYOUT_PRESETS.map((p) => (\n <option key={p.id} value={p.id} style={{ backgroundColor: '#1e1f29', color: '#f8fafc' }}>\n {p.name}\n </option>\n ))}\n </select>\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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thanh01.pmt/presentation-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Standalone client-side slide rendering engine with Marp, Shiki syntax highlighting, Mermaid diagrams, and custom themes.",
|
|
5
5
|
"author": "Thanh Pham <https://github.com/thanh01pmt>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,8 +27,12 @@
|
|
|
27
27
|
"react-dom": ">=18.0.0"
|
|
28
28
|
},
|
|
29
29
|
"peerDependenciesMeta": {
|
|
30
|
-
"react": {
|
|
31
|
-
|
|
30
|
+
"react": {
|
|
31
|
+
"optional": true
|
|
32
|
+
},
|
|
33
|
+
"react-dom": {
|
|
34
|
+
"optional": true
|
|
35
|
+
}
|
|
32
36
|
},
|
|
33
37
|
"files": [
|
|
34
38
|
"dist"
|
|
@@ -40,16 +44,20 @@
|
|
|
40
44
|
"clean": "rm -rf dist",
|
|
41
45
|
"build": "npm run clean && tsup",
|
|
42
46
|
"dev": "tsup --watch",
|
|
47
|
+
"test": "node --test test/layout-and-notes.test.mjs",
|
|
43
48
|
"typecheck": "tsc --noEmit",
|
|
44
49
|
"lint": "eslint . --ext .ts",
|
|
45
50
|
"prepublishOnly": "npm run build"
|
|
46
51
|
},
|
|
47
52
|
"dependencies": {
|
|
48
53
|
"@marp-team/marp-core": "^4.3.0",
|
|
54
|
+
"js-yaml": "^4.1.0",
|
|
49
55
|
"mermaid": "^11.17.1",
|
|
56
|
+
"pptxgenjs": "^3.12.0",
|
|
50
57
|
"shiki": "^3.0.0"
|
|
51
58
|
},
|
|
52
59
|
"devDependencies": {
|
|
60
|
+
"@types/js-yaml": "^4.0.9",
|
|
53
61
|
"@types/node": "^22.15.3",
|
|
54
62
|
"@types/react": "^19.0.0",
|
|
55
63
|
"@types/react-dom": "^19.0.0",
|