@atom63/slides 0.2.0 → 0.4.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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stores/render-mode.ts","../src/content/components.tsx","../src/stores/config-store.ts","../src/hooks/use-shiki-highlight.ts","../src/content/primitives.tsx","../src/content/syllabus.tsx","../src/content/templates.tsx","../src/lib/cn.ts","../src/content/mdx-styles.ts","../src/content/vendored-mdx-components.tsx","../src/content/mdx-components.tsx","../src/content/syllabus-mdx-components.tsx","../src/components/primitives/button-group-context.tsx","../src/components/primitives/lib/theme-contract.ts","../src/components/primitives/spinner.tsx","../src/components/primitives/button.tsx","../src/components/primitives/separator.tsx","../src/components/primitives/button-group.tsx","../src/components/primitives/kbd.tsx","../src/components/primitives/label.tsx","../src/components/primitives/segment-control.tsx","../src/components/primitives/switch.tsx","../src/components/primitives/lib/render-slot.tsx","../src/components/primitives/portal-container.tsx","../src/components/primitives/tooltip.tsx","../src/components/config/password-gate.tsx","../src/hooks/use-swipe-nav.ts","../src/hooks/use-focus-trap.ts","../src/components/config/config-panel.tsx","../src/components/stage/dimensions.ts","../src/components/stage/thumbnail.tsx","../src/components/stage/overview.tsx","../src/components/stage/stage.tsx","../src/components/syllabus/syllabus-view.tsx","../src/components/mobile/mobile-bottom-bar.tsx","../src/components/mobile/mobile-layout.tsx","../src/components/stage/frame.tsx","../src/components/stage/layout-grid.tsx","../src/components/presentation/chrome.tsx","../src/components/presentation/presenter-pip.tsx","../src/components/presentation/sidebar.tsx","../src/components/presentation/status-bar.tsx","../src/components/presentation/toolbar.tsx","../src/components/presentation/desktop-layout.tsx","../src/hooks/use-deck-outline.ts","../src/hooks/use-fullscreen.ts","../src/hooks/use-is-mobile.ts","../src/hooks/use-presenter-pip.ts","../src/hooks/use-slides-dom.ts","../src/hooks/use-syllabus.ts","../src/hooks/use-syllabus-toggle.ts","../src/player/slides-player.tsx","../src/content/template-registry.ts"],"names":["createContext","useContext","jsx","jsxs","useEffect","IconifyIcon","Divider","rows","Fragment","Video","Caption","React2","SeparatorPrimitive","cva","Kbd","Label","SwitchPrimitive","isValidElement","React3","TooltipPrimitive","useState","useRef","useCallback","memo","useLayoutEffect","useMemo","MDXProvider","useReducedMotion","AnimatePresence","motion","useVirtualizer","BookOpen","LayoutGrid","SlidersHorizontal","Code","ArrowLeft","createPortal","isLocked"],"mappings":"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","file":"chunk-AD3ZOVWR.js","sourcesContent":["import { createContext, useContext } from 'react'\n\nexport type SlideRenderMode = 'presentation' | 'web-syllabus'\n\n/** Controls how slide components render. Default is presentation mode. */\nexport const SlideRenderModeContext = createContext<SlideRenderMode>('presentation')\n\nexport function useSlideRenderMode(): SlideRenderMode {\n return useContext(SlideRenderModeContext)\n}\n\n/** Signals to the syllabus page that a <Syllabus> block was actually rendered. */\nexport const SyllabusDetectContext = createContext<(() => void) | null>(null)\n","import type { CSSProperties, ReactNode } from 'react'\nimport { useSlideRenderMode } from '../stores/render-mode'\nimport type { SlideLayout } from '../types'\n\nconst layoutClasses: Record<SlideLayout, string> = {\n cover:\n 'flex flex-1 flex-col justify-end text-left [&_h1]:text-[calc(128px*var(--slide-type-scale,1))] [&_h1]:font-light [&_h1]:tracking-[-0.05em] [&_h1]:leading-[0.85] [&_h1]:mb-6 [&_p]:text-2xl [&_p]:text-muted-foreground/50 [&_p]:leading-relaxed',\n title: 'flex flex-1 flex-col items-center justify-center text-center',\n content: 'flex flex-1 flex-col justify-center',\n split: 'grid flex-1 grid-cols-2 items-center gap-16',\n 'media-full': 'flex flex-1 items-center justify-center -mx-32 -my-[120px]',\n quote: 'flex flex-1 flex-col items-center justify-center text-center max-w-[1200px] mx-auto',\n}\n\n/** Presenter script for the current slide — hidden on stage, surfaced in panels. */\nexport function TalkTrack({ children }: { children: ReactNode }) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div data-slide-talktrack hidden>\n {children}\n </div>\n )\n}\nTalkTrack.displayName = 'TalkTrack'\n\n/** Hidden marker that sets the frame section label for this and following slides. */\nexport function Section({ children }: { children: ReactNode }) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div data-slide-section hidden>\n {children}\n </div>\n )\n}\nSection.displayName = 'Section'\n\nexport function Slide({ children, layout }: { children: ReactNode; layout?: SlideLayout }) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const resolved = layout ?? 'content'\n return (\n <div className={layoutClasses[resolved]} data-slide-layout={resolved}>\n {children}\n </div>\n )\n}\nSlide.displayName = 'Slide'\n\n/** Small uppercase label — monospace, tracked-out. */\nexport function Overline({ children }: { children: ReactNode }) {\n return (\n <p className=\"mb-6 font-medium font-mono text-muted-foreground/60 text-sm uppercase tracking-[0.25em]\">\n {children}\n </p>\n )\n}\nOverline.displayName = 'Overline'\n\n/** Small muted text — attribution, dates, metadata. */\nexport function Caption({\n children,\n reveal,\n index,\n}: {\n children: ReactNode\n reveal?: boolean\n index?: number\n}) {\n return (\n <p\n className={`mt-8 font-mono text-muted-foreground/40 text-sm tracking-wider ${reveal ? 'reveal' : ''}`}\n style={\n reveal && index !== undefined\n ? ({ '--stagger-index': String(index) } as CSSProperties)\n : undefined\n }\n >\n {children}\n </p>\n )\n}\nCaption.displayName = 'Caption'\n\n/** Thin decorative line — not a slide break. */\nexport function Divider() {\n return <div className=\"my-8 h-px w-16 bg-muted-foreground/20\" />\n}\nDivider.displayName = 'Divider'\n\n/** Large numeral — monospace display number. */\nexport function SlideNumber({ children }: { children: ReactNode }) {\n return (\n <span className=\"font-light font-mono text-8xl text-muted-foreground/15 leading-none tracking-tighter\">\n {children}\n </span>\n )\n}\nSlideNumber.displayName = 'SlideNumber'\n\nexport function SlideImage({\n src,\n alt,\n fill,\n className,\n}: {\n src: string\n alt: string\n fill?: boolean\n className?: string\n}) {\n const base = fill\n ? 'size-full object-cover'\n : 'max-h-[700px] max-w-full rounded-lg object-contain'\n return (\n <img alt={alt} className={`${base} ${className ?? ''}`} height={700} src={src} width={1200} />\n )\n}\nSlideImage.displayName = 'SlideImage'\n\nexport function SlideVideo({\n src,\n alt,\n fill,\n className,\n}: {\n src: string\n alt: string\n fill?: boolean\n className?: string\n}) {\n const base = fill\n ? 'size-full object-cover'\n : 'max-h-[700px] max-w-full rounded-lg object-contain'\n return (\n <video autoPlay className={`${base} ${className ?? ''}`} loop muted playsInline>\n <source src={src} />\n <track kind=\"captions\" label={alt} />\n </video>\n )\n}\nSlideVideo.displayName = 'SlideVideo'\n\nconst GRID_COL_CLASSES = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n} as const\n\nconst GRID_GAP_CLASSES = {\n sm: 'gap-4',\n md: 'gap-6',\n lg: 'gap-8',\n} as const\n\nexport function SlideGrid({\n children,\n columns = 3,\n gap = 'md',\n}: {\n children: ReactNode\n columns?: 2 | 3 | 4\n gap?: 'sm' | 'md' | 'lg'\n}) {\n return (\n <div\n className={`grid min-h-0 flex-1 auto-rows-fr ${GRID_COL_CLASSES[columns]} ${GRID_GAP_CLASSES[gap]} mt-6 overflow-hidden [&_img]:size-full [&_img]:object-cover`}\n >\n {children}\n </div>\n )\n}\nSlideGrid.displayName = 'SlideGrid'\n","/**\n * Slide Configurator Store\n *\n * Global visual density config for the slides app. Phase 1 exposes a\n * single `padding` setting that drives the default `Cell` padding and\n * `Grid` gap. Phase 2 will extend this with color/typography fields.\n *\n * Persisted to localStorage so the selected padding survives reloads.\n */\n\nimport { createContext, useContext } from 'react'\nimport { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport type SlideConfigPadding = 'sm' | 'md' | 'lg'\n\n/**\n * Slide-only type multiplier. Applied as a CSS variable\n * (`--slide-type-scale`) on the slide content root; every slide\n * primitive wraps its canvas-px sizes in `calc(Npx * var(--slide-type-scale, 1))`\n * so nudging this knob scales every piece of slide text in lockstep.\n *\n * Deliberately isolated from the site-wide `--typography-scale`: the\n * slide artboard is sovereign, tuned to exact px ratios, and should\n * not follow global UI density changes.\n */\nexport type SlideConfigTypographyScale = 'sm' | 'md' | 'lg' | 'xl'\n\nexport const TYPOGRAPHY_SCALE_VALUES: Record<SlideConfigTypographyScale, number> = {\n sm: 0.9,\n md: 1,\n lg: 1.1,\n xl: 1.2,\n}\n\ninterface SlideConfigState {\n padding: SlideConfigPadding\n reset: () => void\n showInlineTalkTrack: boolean\n showPagination: boolean\n typographyScale: SlideConfigTypographyScale\n updateConfig: (patch: Partial<Omit<SlideConfigState, 'updateConfig' | 'reset'>>) => void\n}\n\nconst DEFAULT_PADDING: SlideConfigPadding = 'md'\nconst DEFAULT_SHOW_PAGINATION = true\nconst DEFAULT_SHOW_INLINE_TALK_TRACK = false\nconst DEFAULT_TYPOGRAPHY_SCALE: SlideConfigTypographyScale = 'md'\n\n/**\n * Content safe-area inset in pixels. Horizontal `px` matches where folio\n * chrome aligns on the left/right. Vertical `py` is larger than\n * `SLIDE_FRAME_WATERMARK_PX` so the layout grid sits below/above the thin\n * watermark band at the slide edges.\n */\nexport const FRAME_PADDING_PX: Record<SlideConfigPadding, { px: number; py: number }> = {\n sm: { px: 24, py: 36 },\n md: { px: 40, py: 52 },\n lg: { px: 72, py: 88 },\n}\n\n/**\n * Folio chrome offset from the slide top/bottom edges. Tighter than\n * `FRAME_PADDING_PX.py` so labels read as a margin watermark outside the\n * content grid while sharing the same horizontal gutters as `px`.\n */\nexport const SLIDE_FRAME_WATERMARK_PX: Record<SlideConfigPadding, { pb: number; pt: number }> = {\n sm: { pt: 8, pb: 8 },\n md: { pt: 12, pb: 12 },\n lg: { pt: 16, pb: 16 },\n}\n\n/**\n * Grid gap in pixels for each config padding level. Matches Tailwind's\n * `gap-4` / `gap-6` / `gap-10` utilities which the `Grid` primitive uses via\n * its `gapClasses` map, so the grid overlay renders the same gutters as the\n * real slide layout.\n */\nexport const CONFIG_GAP_PX: Record<SlideConfigPadding, number> = {\n sm: 16,\n md: 24,\n lg: 40,\n}\n\nexport const useSlideConfig = create<SlideConfigState>()(\n persist(\n set => ({\n padding: DEFAULT_PADDING,\n showPagination: DEFAULT_SHOW_PAGINATION,\n showInlineTalkTrack: DEFAULT_SHOW_INLINE_TALK_TRACK,\n typographyScale: DEFAULT_TYPOGRAPHY_SCALE,\n updateConfig: patch => set(patch),\n reset: () =>\n set({\n padding: DEFAULT_PADDING,\n showPagination: DEFAULT_SHOW_PAGINATION,\n showInlineTalkTrack: DEFAULT_SHOW_INLINE_TALK_TRACK,\n typographyScale: DEFAULT_TYPOGRAPHY_SCALE,\n }),\n }),\n {\n name: 'atom63-slide-config',\n version: 5,\n partialize: state => ({\n padding: state.padding,\n showPagination: state.showPagination,\n showInlineTalkTrack: state.showInlineTalkTrack,\n typographyScale: state.typographyScale,\n }),\n }\n )\n)\n\n/**\n * Replaces per-primitive Zustand subscriptions for `padding` with a single\n * subscription at the slide content root. Grid and Cell read this context\n * instead of subscribing independently — N subscriptions become 1.\n * Default matches the store default so the fallback is always correct.\n */\nexport const SlidePaddingContext = createContext<SlideConfigPadding>('md')\nexport const useSlidePadding = () => useContext(SlidePaddingContext)\n","import { useEffect, useState } from 'react'\nimport { createHighlighterCore } from 'shiki/core'\nimport { createOnigurumaEngine } from 'shiki/engine/oniguruma'\n\ntype Highlighter = Awaited<ReturnType<typeof createHighlighterCore>>\n\n// Singleton — one highlighter shared across all SlideCodeBlock instances.\n// Lazy-initialised on first use, reused for every subsequent call.\nlet instance: Highlighter | null = null\nlet pending: Promise<Highlighter> | null = null\n\n// Result cache: avoid re-highlighting the same code+language pair across\n// component mounts (e.g. sidebar thumbnails + stage both rendering the same block).\n// FIFO eviction at MAX_CACHE_ENTRIES prevents unbounded growth in long sessions\n// where many decks / code blocks are viewed.\nconst MAX_CACHE_ENTRIES = 200\nconst htmlCache = new Map<string, string>()\n\nfunction getHighlighter(): Promise<Highlighter> {\n if (instance) return Promise.resolve(instance)\n if (!pending) {\n pending = createHighlighterCore({\n themes: [\n import('shiki/themes/github-dark-dimmed.mjs'),\n import('shiki/themes/github-light.mjs'),\n ],\n langs: [\n import('shiki/langs/tsx.mjs'),\n import('shiki/langs/typescript.mjs'),\n import('shiki/langs/javascript.mjs'),\n import('shiki/langs/css.mjs'),\n import('shiki/langs/scss.mjs'),\n import('shiki/langs/bash.mjs'),\n import('shiki/langs/json.mjs'),\n import('shiki/langs/html.mjs'),\n import('shiki/langs/mdx.mjs'),\n ],\n engine: createOnigurumaEngine(import('shiki/wasm')),\n })\n .then(h => {\n instance = h\n return h\n })\n .catch(error => {\n // Reset so a later call (e.g. remount) can retry instead of reusing a\n // permanently-rejected promise; re-throw so the caller's catch fires.\n pending = null\n throw error\n })\n }\n return pending\n}\n\nexport function useShikiHighlight(code: string, lang: string): string | null {\n const [html, setHtml] = useState<string | null>(null)\n\n useEffect(() => {\n const trimmed = code.trim()\n if (!trimmed) return\n\n const cacheKey = `${lang}:${trimmed}`\n const cached = htmlCache.get(cacheKey)\n if (cached) {\n setHtml(cached)\n return\n }\n\n let active = true\n getHighlighter()\n .then(h => {\n if (!active) return\n // Dual themes so data-theme contains a space — this matches the\n // pre[data-theme*=\" \"] rules in code-highlighting.css which consume\n // --shiki-light and --shiki-dark custom properties per token.\n const result = h.codeToHtml(trimmed, {\n lang,\n themes: { dark: 'github-dark-dimmed', light: 'github-light' },\n defaultColor: false,\n // Add data-theme so the existing pre[data-theme*=\" \"] span CSS rule\n // in code-highlighting.css applies --shiki-light/dark colors.\n transformers: [\n {\n pre(node) {\n node.properties['data-theme'] = 'dark light'\n },\n },\n ],\n })\n htmlCache.set(cacheKey, result)\n // Evict the oldest entry when over the cap (Map preserves insertion order)\n if (htmlCache.size > MAX_CACHE_ENTRIES) {\n const firstKey = htmlCache.keys().next().value\n if (firstKey !== undefined) {\n htmlCache.delete(firstKey)\n }\n }\n setHtml(result)\n })\n .catch(error => {\n if (!active) return\n // Highlighter failed to load — fall back to plain code (null) instead of\n // hanging unhighlighted, and keep the rejection from going unhandled.\n console.error('Shiki highlight failed; falling back to plain code:', error)\n setHtml(null)\n })\n return () => {\n active = false\n }\n }, [code, lang])\n\n return html\n}\n","/**\n * Slide Primitives Library\n *\n * Composable graphic design primitives for building slide layouts.\n * These are the atoms — combine them to create any slide pattern.\n *\n * The deck is tuned for a Swiss / International Typographic Style\n * aesthetic: hard edges, hairline rules as structure, flush-left type,\n * a single signal color used as a block (not a tint), and tabular\n * numerals locked to a shared baseline.\n *\n * Design canvas: 1920×1080 fixed, scaled to fit.\n */\n\nimport { Icon as IconifyIcon } from '@iconify/react'\nimport type { CSSProperties, ReactNode } from 'react'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useShikiHighlight } from '../hooks/use-shiki-highlight'\nimport { useSlidePadding } from '../stores/config-store'\n\n// =============================================================================\n// LAYOUT PRIMITIVES\n// =============================================================================\n\ntype GapSize = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\ntype AlignOption = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\ntype JustifyOption = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\n\nconst gapClasses: Record<GapSize, string> = {\n none: 'gap-0',\n xs: 'gap-2',\n sm: 'gap-4',\n md: 'gap-6',\n lg: 'gap-10',\n xl: 'gap-16',\n '2xl': 'gap-24',\n}\n\nconst alignClasses: Record<AlignOption, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\n\nconst justifyClasses: Record<JustifyOption, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\n\nconst columnsGridClasses = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n} as const\n\n/** Multi-column layout with equal width columns */\nexport function Columns({\n children,\n count = 2,\n gap = 'lg',\n align = 'stretch',\n}: {\n children: ReactNode\n count?: 2 | 3 | 4\n gap?: GapSize\n align?: AlignOption\n}) {\n return (\n <div\n className={`grid min-h-0 flex-1 ${columnsGridClasses[count]} ${gapClasses[gap]} ${alignClasses[align]} [&>*]:min-h-0`}\n >\n {children}\n </div>\n )\n}\n\ntype SplitRatio = '1/1' | '2/1' | '1/2' | '3/1' | '1/3'\ntype TrioRatio = '1/1/1' | '2/1/1' | '1/2/1' | '1/1/2'\n\nconst splitTemplateCols: Record<SplitRatio, string> = {\n '1/1': '6fr 6fr',\n '2/1': '8fr 4fr',\n '1/2': '4fr 8fr',\n '3/1': '9fr 3fr',\n '1/3': '3fr 9fr',\n}\n\nconst trioTemplateCols: Record<TrioRatio, string> = {\n '1/1/1': '4fr 4fr 4fr',\n '2/1/1': '6fr 3fr 3fr',\n '1/2/1': '3fr 6fr 3fr',\n '1/1/2': '3fr 3fr 6fr',\n}\n\n/**\n * Two-up layout on the 12-column master grid. Use this for asymmetric\n * splits (narrative + media, quote + photo, thesis + detail) without\n * writing `colStart` / `colSpan` by hand. The ratio maps to fixed 12-col\n * spans so slides using `Split` always align with slides using `<Grid>`.\n *\n * 1/1 → 6 + 6\n * 2/1 → 8 + 4\n * 1/2 → 4 + 8\n * 3/1 → 9 + 3\n * 1/3 → 3 + 9\n *\n * Pass two direct children; extra children are ignored.\n */\nexport function Split({\n children,\n ratio = '1/1',\n gap = 'lg',\n align = 'stretch',\n}: {\n children: ReactNode\n ratio?: SplitRatio\n gap?: GapSize\n align?: AlignOption\n}) {\n return (\n <div\n className={`grid min-h-0 flex-1 ${gapClasses[gap]} ${alignClasses[align]} [&>*]:min-h-0 [&>*]:min-w-0`}\n style={{ gridTemplateColumns: splitTemplateCols[ratio] }}\n >\n {children}\n </div>\n )\n}\n\n/**\n * Three-up layout on the 12-column master grid. Same rhythm rules as\n * `Split` — ratios resolve to 12-col spans so trios align with the rest\n * of the deck.\n *\n * 1/1/1 → 4 + 4 + 4\n * 2/1/1 → 6 + 3 + 3\n * 1/2/1 → 3 + 6 + 3\n * 1/1/2 → 3 + 3 + 6\n */\nexport function Trio({\n children,\n ratio = '1/1/1',\n gap = 'lg',\n align = 'stretch',\n}: {\n children: ReactNode\n ratio?: TrioRatio\n gap?: GapSize\n align?: AlignOption\n}) {\n return (\n <div\n className={`grid min-h-0 flex-1 ${gapClasses[gap]} ${alignClasses[align]} [&>*]:min-h-0 [&>*]:min-w-0`}\n style={{ gridTemplateColumns: trioTemplateCols[ratio] }}\n >\n {children}\n </div>\n )\n}\n\n/**\n * CSS Grid foundation — the slide master grid.\n *\n * Every slide in the deck uses a shared **12-column** horizontal rhythm.\n * This is what makes paging through the deck feel like one authored\n * object instead of loose artboards: titles, media edges, and stat\n * columns all snap to the same vertical lines slide-to-slide.\n *\n * Rows adapt to content (6 for three-up bentos, 8 for stat grids, etc.)\n * but `cols` should stay at 12 unless you're writing a one-off full-bleed\n * layout. If you find yourself overriding `cols`, consider whether the\n * layout belongs behind a template instead.\n *\n * A Title rendered by `Grid` sits under a top hairline rule so the\n * slide header reads as a Swiss editorial masthead.\n */\nexport function Grid({\n children,\n cols = 12,\n rows = 8,\n gap,\n label,\n title,\n ruled = true,\n}: {\n children: ReactNode\n cols?: number\n rows?: number\n gap?: GapSize\n label?: string\n title?: string\n /** Draw the masthead hairline above label/title. Default true. */\n ruled?: boolean\n}) {\n const configPadding = useSlidePadding()\n const resolvedGap: GapSize = gap ?? configPadding\n const hasHeader = Boolean(label || title)\n return (\n <div className={`flex min-h-0 flex-1 flex-col ${gapClasses.md}`}>\n {hasHeader && (\n <div\n className={`shrink-0 ${ruled ? 'border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-4' : ''}`}\n >\n <Stack gap=\"xs\">\n {label && <Label>{label}</Label>}\n {title && <Title>{title}</Title>}\n </Stack>\n </div>\n )}\n <div\n className={`grid min-h-0 flex-1 transition-[gap] duration-300 ease-out ${gapClasses[resolvedGap]} [&>*]:min-h-0`}\n style={{\n gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))`,\n gridTemplateRows: `repeat(${String(rows)}, minmax(0, 1fr))`,\n }}\n >\n {children}\n </div>\n </div>\n )\n}\n\ntype CellVariant = 'none' | 'muted' | 'outline' | 'accent' | 'rule' | 'frame' | 'solid'\ntype CellPadding = 'none' | 'sm' | 'md' | 'lg'\ntype CellOverflow = 'hidden' | 'visible'\n\nconst cellVariantClasses: Record<CellVariant, string> = {\n none: '',\n muted: 'bg-[color-mix(in_oklch,var(--theme-slide-surface,var(--card))_60%,transparent)]',\n outline: 'border border-foreground/20',\n frame: 'border border-foreground/20',\n rule: 'border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)]',\n accent:\n 'bg-[var(--theme-slide-accent,var(--primary))] text-[var(--theme-slide-accent-foreground,var(--primary-foreground))]',\n solid: 'bg-foreground text-background',\n}\n\nconst cellPaddingClasses: Record<CellPadding, string> = {\n none: 'p-0',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-10',\n}\n\n/**\n * A cell inside a `Grid`. Place via colStart/rowStart and span via colSpan/rowSpan.\n *\n * Variant vocabulary (Swiss-first):\n * none — no chrome, just layout\n * rule — top hairline only, transparent bg (the default bento treatment)\n * frame — 1px hairline on all four sides, transparent bg\n * outline — legacy alias for `frame`\n * muted — filled plate (use sparingly, for dense data cells)\n * accent — solid signal-color block with inverted text\n * solid — solid foreground block with inverted text\n *\n * Corners are square by default — pass `rounded` for the exception.\n */\nexport function Cell({\n children,\n colSpan,\n rowSpan,\n colStart,\n rowStart,\n variant = 'none',\n padding,\n overflow = 'hidden',\n rounded = false,\n}: {\n children: ReactNode\n colSpan?: number\n rowSpan?: number\n colStart?: number\n rowStart?: number\n variant?: CellVariant\n padding?: CellPadding\n overflow?: CellOverflow\n rounded?: boolean\n}) {\n const configPadding = useSlidePadding()\n const resolvedPadding: CellPadding = padding ?? configPadding\n\n // `rule` needs its own top padding so the text sits inside the rule,\n // not flush against the edge.\n const rulePadTop = variant === 'rule' ? 'pt-5' : ''\n\n const overflowClass = overflow === 'hidden' ? 'overflow-hidden' : 'overflow-visible'\n const roundedClass = rounded ? 'rounded-xl' : ''\n\n const clampedColSpan = colSpan === undefined ? undefined : Math.max(1, colSpan)\n const clampedRowSpan = rowSpan === undefined ? undefined : Math.max(1, rowSpan)\n\n const style: CSSProperties = {\n gridColumnStart: colStart,\n gridRowStart: rowStart,\n gridColumnEnd: clampedColSpan ? `span ${String(clampedColSpan)}` : undefined,\n gridRowEnd: clampedRowSpan ? `span ${String(clampedRowSpan)}` : undefined,\n }\n\n return (\n <div\n className={`flex min-h-0 flex-col transition-[padding] duration-300 ease-out ${cellVariantClasses[variant]} ${cellPaddingClasses[resolvedPadding]} ${rulePadTop} ${roundedClass} ${overflowClass}`}\n style={style}\n >\n {children}\n </div>\n )\n}\n\n/** Vertical stack with consistent spacing */\nexport function Stack({\n children,\n gap = 'md',\n align = 'stretch',\n justify = 'start',\n className = '',\n}: {\n children: ReactNode\n gap?: GapSize\n align?: AlignOption\n justify?: JustifyOption\n className?: string\n}) {\n return (\n <div\n className={`flex flex-col ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${className}`}\n >\n {children}\n </div>\n )\n}\n\n/** Horizontal row with alignment control */\nexport function Row({\n children,\n gap = 'md',\n align = 'center',\n justify = 'start',\n wrap = false,\n}: {\n children: ReactNode\n gap?: GapSize\n align?: AlignOption\n justify?: JustifyOption\n wrap?: boolean\n}) {\n return (\n <div\n className={`flex ${wrap ? 'flex-wrap' : ''} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]}`}\n >\n {children}\n </div>\n )\n}\n\n/** Center content on both axes */\nexport function Center({ children }: { children: ReactNode }) {\n return <div className=\"flex flex-1 items-center justify-center\">{children}</div>\n}\n\nconst spacerSizeClasses: Record<GapSize, string> = {\n none: 'h-0',\n xs: 'h-2',\n sm: 'h-4',\n md: 'h-6',\n lg: 'h-10',\n xl: 'h-16',\n '2xl': 'h-24',\n}\n\n/** Explicit whitespace — use for intentional spacing */\nexport function Spacer({ size = 'lg' }: { size?: GapSize }) {\n return <div className={spacerSizeClasses[size]} />\n}\n\n// =============================================================================\n// TYPOGRAPHY PRIMITIVES\n// =============================================================================\n\ntype TextAlign = 'left' | 'center' | 'right'\ntype TextColor = 'default' | 'secondary' | 'muted' | 'accent' | 'inherit'\ntype TextWeight = 'light' | 'regular' | 'medium' | 'semibold' | 'bold'\n\nconst textAlignClasses: Record<TextAlign, string> = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n}\n\nconst textColorClasses: Record<TextColor, string> = {\n default: 'text-foreground',\n secondary: 'text-foreground/55',\n muted: 'text-[var(--theme-slide-muted,var(--muted-foreground))]',\n accent: 'text-[var(--theme-slide-accent,var(--primary))]',\n inherit: '',\n}\n\nconst textWeightClasses: Record<TextWeight, string> = {\n light: 'font-light',\n regular: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n}\n\n/**\n * Type ramp — role-first. Pick the primitive by what the text *is*\n * (annotation, sub-head, slide title, stat, pull quote), not by size.\n * Size props exist only where the role legitimately has tiers.\n *\n * Ramp:\n * Label 18 mono/sans medium, upper, tracked — annotation / eyebrow\n * Mono 20 / 28 / 40 — inline technical\n * Body 22 / 28 / 36 — paragraphs\n * Subtitle 44 sans medium — sub-head under Title\n * Quote 40 / 72 serif italic — pull quote (sm inline, lg full-slide)\n * Title 72 sans medium — slide head (content below)\n * Display 72 / 112 / 180 sans light — hero numerals / decorative words\n * Headline 128 sans medium — full-slide statement\n *\n * Weight discipline: Swiss hierarchy is driven by weight shifts within a\n * shared size more than by size itself. The `weight` prop on Body /\n * Subtitle / Title lets you go from light to medium without changing the\n * pixel height. All numerals render tabular so stat rows align digit-for-\n * digit down the page.\n */\n\nconst displaySizeClasses = {\n sm: 'text-[calc(72px*var(--slide-type-scale,1))]',\n md: 'text-[calc(112px*var(--slide-type-scale,1))]',\n lg: 'text-[calc(180px*var(--slide-type-scale,1))]',\n} as const\n\nconst displayWeightClasses = {\n extralight: 'font-extralight',\n light: 'font-light',\n regular: 'font-normal',\n medium: 'font-medium',\n} as const\n\nconst bodySizeClasses = {\n sm: 'text-[calc(22px*var(--slide-type-scale,1))] leading-[1.5]',\n md: 'text-[calc(28px*var(--slide-type-scale,1))] leading-[1.45]',\n lg: 'text-[calc(36px*var(--slide-type-scale,1))] leading-[1.35]',\n} as const\n\nconst monoSizeClasses = {\n sm: 'text-[calc(20px*var(--slide-type-scale,1))]',\n md: 'text-[calc(28px*var(--slide-type-scale,1))]',\n lg: 'text-[calc(40px*var(--slide-type-scale,1))]',\n} as const\n\n/**\n * Hero numeral / single-word text. Light + tight tracking signals\n * decorative, not authored. Use for big stats or one-word statements.\n */\nexport function Display({\n children,\n align = 'left',\n color = 'default',\n size = 'lg',\n weight = 'light',\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n size?: 'sm' | 'md' | 'lg'\n weight?: 'extralight' | 'light' | 'regular' | 'medium'\n}) {\n return (\n <div\n className={`text-balance break-words tabular-nums leading-[0.85] tracking-[-0.035em] ${displayWeightClasses[weight]} ${displaySizeClasses[size]} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n >\n {children}\n </div>\n )\n}\n\n/**\n * Full-slide statement headline. Use when the whole slide is one\n * sentence (keynote thesis, section opener). Always 128px.\n */\nexport function Headline({\n children,\n align = 'left',\n color = 'default',\n weight = 'medium',\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n weight?: 'light' | 'regular' | 'medium' | 'semibold'\n}) {\n return (\n <div\n className={`text-balance break-words text-[calc(128px*var(--slide-type-scale,1))] leading-[0.95] tracking-[-0.025em] ${textWeightClasses[weight]} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n >\n {children}\n </div>\n )\n}\n\n/**\n * Slide title. Use when the slide has supporting content below a heading.\n * Always 72px. Defaults to medium — bump to semibold for covers.\n */\nexport function Title({\n children,\n align = 'left',\n color = 'default',\n weight = 'medium',\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n weight?: 'light' | 'regular' | 'medium' | 'semibold'\n}) {\n return (\n <div\n className={`text-balance break-words text-[calc(72px*var(--slide-type-scale,1))] leading-[1.05] tracking-[-0.02em] ${textWeightClasses[weight]} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n >\n {children}\n </div>\n )\n}\n\n/**\n * Sub-head under a Title, or a section label that still needs to read\n * as type (not a Label). Always 44px. Color defaults to foreground —\n * pass `color=\"muted\"` for quieter sub-heads.\n */\nexport function Subtitle({\n children,\n align = 'left',\n color = 'default',\n weight = 'regular',\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n weight?: 'light' | 'regular' | 'medium' | 'semibold'\n}) {\n return (\n <div\n className={`text-balance break-words text-[calc(44px*var(--slide-type-scale,1))] leading-[1.15] tracking-[-0.015em] ${textWeightClasses[weight]} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n >\n {children}\n </div>\n )\n}\n\n/** Paragraph text. `md` is the default — go sm for dense cells, lg for emphasis. */\nexport function Body({\n children,\n align = 'left',\n color = 'secondary',\n size = 'md',\n weight = 'regular',\n reveal,\n index,\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n size?: 'sm' | 'md' | 'lg'\n weight?: 'light' | 'regular' | 'medium' | 'semibold'\n reveal?: boolean\n index?: number\n}) {\n return (\n <div\n className={`text-pretty break-words ${reveal ? 'reveal' : ''} ${textWeightClasses[weight]} ${bodySizeClasses[size]} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n style={\n reveal && index !== undefined\n ? ({ '--stagger-index': String(index) } as CSSProperties)\n : undefined\n }\n >\n {children}\n </div>\n )\n}\n\n/**\n * Renders a body string that may contain `\\n` line breaks as separate\n * `<Body>` paragraphs with a gap between them. Use this instead of\n * `<Body>{string}</Body>` whenever the text comes from a template prop.\n */\nexport function BodyLines({\n children,\n size = 'md',\n color = 'secondary',\n}: {\n children: string\n size?: 'sm' | 'md' | 'lg'\n color?: 'default' | 'muted' | 'secondary' | 'accent' | 'inherit'\n}) {\n const lines = useMemo(\n () => children.split('\\n').filter(line => line.trim().length > 0),\n [children]\n )\n if (lines.length <= 1) {\n return (\n <Body color={color} size={size}>\n {children}\n </Body>\n )\n }\n return (\n <Stack gap=\"sm\">\n {lines.map((line, i) => (\n <Body color={color} key={`${String(i)}-${line.slice(0, 32)}`} size={size}>\n {line}\n </Body>\n ))}\n </Stack>\n )\n}\n\n/**\n * Small uppercase annotation. One size only (18px). Use for eyebrows,\n * figure captions, section markers, attribution lines.\n *\n * `orientation=\"vertical\"` sets the label in the margin, running\n * bottom-to-top — the Swiss gutter label treatment.\n */\nexport function Label({\n children,\n align = 'left',\n color = 'muted',\n font = 'mono',\n orientation = 'horizontal',\n reveal,\n index,\n}: {\n children: ReactNode\n align?: TextAlign\n color?: TextColor\n font?: 'mono' | 'sans'\n orientation?: 'horizontal' | 'vertical'\n reveal?: boolean\n index?: number\n}) {\n const fontClass = font === 'mono' ? 'font-mono' : 'font-sans'\n const orientClass =\n orientation === 'vertical' ? '[writing-mode:vertical-rl] [transform:rotate(180deg)]' : ''\n return (\n <span\n className={`font-medium text-[calc(18px*var(--slide-type-scale,1))] uppercase tabular-nums tracking-[0.18em] ${reveal ? 'reveal' : ''} ${fontClass} ${orientClass} ${textAlignClasses[align]} ${textColorClasses[color]}`}\n style={\n reveal && index !== undefined\n ? ({ '--stagger-index': String(index) } as CSSProperties)\n : undefined\n }\n >\n {children}\n </span>\n )\n}\n\n/**\n * Inline content highlight. `text-primary` is reserved for content\n * emphasis — if you want a ghost tint, use `text-foreground/XX` directly.\n */\nexport function Accent({\n children,\n color = 'accent',\n}: {\n children: ReactNode\n color?: 'accent' | 'default'\n}) {\n return (\n <span\n className={`font-semibold ${color === 'accent' ? 'text-[var(--theme-slide-accent,var(--primary))]' : 'text-foreground'}`}\n >\n {children}\n </span>\n )\n}\n\n/** Inline monospace for numbers, code, technical content. */\nexport function Mono({\n children,\n size = 'md',\n}: {\n children: ReactNode\n size?: 'sm' | 'md' | 'lg'\n}) {\n return <span className={`font-mono tabular-nums ${monoSizeClasses[size]}`}>{children}</span>\n}\n\n/**\n * Inline code token for use inside Body or template body props.\n * Uses `em`-relative sizing so it scales with whatever Body size it sits in.\n */\nexport function InlineCode({ children }: { children: ReactNode }) {\n return (\n <code className=\"rounded bg-foreground/10 px-[0.3em] py-[0.1em] font-mono text-[0.85em] text-foreground/90\">\n {children}\n </code>\n )\n}\n\nconst quoteTextClasses = {\n sm: 'text-[calc(40px*var(--slide-type-scale,1))] leading-[1.35]',\n lg: 'text-[calc(72px*var(--slide-type-scale,1))] leading-[1.15] tracking-[-0.01em]',\n} as const\n\nconst quoteGlyphClasses = {\n sm: 'absolute -top-12 -left-8 text-[calc(200px*var(--slide-type-scale,1))]',\n lg: 'absolute -top-[120px] -left-10 text-[calc(240px*var(--slide-type-scale,1))]',\n} as const\n\n/**\n * Pull quote. `sm` for inline quotes inside a content slide, `lg` for a\n * full-slide pull quote.\n *\n * The decorative open-quote glyph is positioned with a negative offset\n * so it sits just outside the text block — beautiful inline but liable\n * to clip when the quote is placed in the left column of a slide.\n * Pass `decorated={false}` to suppress the glyph (the Swiss editorial\n * treatment) and rely on rules + attribution to signal \"quote\".\n */\nexport function Quote({\n children,\n attribution,\n size = 'sm',\n decorated = true,\n}: {\n children: ReactNode\n attribution?: string\n size?: 'sm' | 'lg'\n decorated?: boolean\n}) {\n return (\n <blockquote className=\"wrap-break-word relative max-w-[1200px]\">\n {decorated && (\n <span\n aria-hidden=\"true\"\n className={`${quoteGlyphClasses[size]} font-instrument-serif text-foreground/10 leading-none`}\n >\n &ldquo;\n </span>\n )}\n <div\n className={`relative text-pretty font-instrument-serif text-[var(--theme-slide-quote-color,color-mix(in_oklch,var(--foreground)_90%,transparent))] italic ${quoteTextClasses[size]}`}\n >\n {children}\n </div>\n {attribution && (\n <footer className=\"mt-10 flex items-center gap-4\">\n <div className=\"h-px w-16 bg-foreground/25\" />\n <Label color=\"muted\">{attribution}</Label>\n </footer>\n )}\n </blockquote>\n )\n}\n\n// =============================================================================\n// MEDIA PRIMITIVES\n// =============================================================================\n\ntype ObjectFit = 'cover' | 'contain' | 'fill'\ntype AspectRatio = '16/9' | '4/3' | '1/1' | 'auto'\n\nconst aspectRatioClasses: Record<Exclude<AspectRatio, 'auto'>, string> = {\n '16/9': 'aspect-video',\n '4/3': 'aspect-[4/3]',\n '1/1': 'aspect-square',\n}\n\nconst mediaFitClasses: Record<ObjectFit, string> = {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n}\n\nconst iconSizes = { sm: 24, md: 48, lg: 72, xl: 96 } as const\n\nconst avatarSizeClasses = {\n sm: 'size-16',\n md: 'size-24',\n lg: 'size-32',\n xl: 'size-48',\n} as const\n\n// Inner component so the hook is always called unconditionally.\nfunction SlideCodeBlockRuntime({ code, language }: { code: string; language: string }) {\n const html = useShikiHighlight(code, language)\n if (!html) {\n return (\n <pre className=\"overflow-x-auto p-6\">\n <code className=\"font-mono text-foreground/40\">{code}</code>\n </pre>\n )\n }\n return (\n <div\n className=\"[&_pre]:overflow-x-auto [&_pre]:bg-transparent! [&_pre]:p-6\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: trusted Shiki output\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n}\n\n/**\n * Syntax-highlighted code block sized for the slide canvas.\n *\n * Two usage modes:\n * - Fenced code blocks in MDX (```tsx) render through this automatically via\n * the `pre` override in slideMdxComponents — pass nothing, `children` carries\n * the already-highlighted rehype-pretty-code output.\n * - Explicit JSX usage: pass a `code` string prop and Shiki highlights it at\n * runtime using the github-dark-dimmed theme.\n *\n * Font scales with --slide-type-scale like all other slide typography.\n */\nexport function SlideCodeBlock({\n children,\n language = 'tsx',\n code,\n dataTheme,\n}: {\n children?: ReactNode\n language?: string\n /** Plain code string — triggers runtime Shiki highlighting. */\n code?: string\n /** Forwarded from rehype-pretty-code's data-theme on the original <pre>. */\n dataTheme?: string\n}) {\n return (\n <div className=\"overflow-hidden rounded-lg border border-[color:var(--theme-slide-code-border,color-mix(in_oklch,var(--foreground)_10%,transparent))] bg-[var(--theme-slide-code-bg,var(--card))] font-mono leading-[1.65] [--code-size:calc(20px*var(--slide-type-scale,1))] [font-size:var(--code-size)]\">\n {language && (\n <div className=\"border-[color:var(--theme-slide-code-border,color-mix(in_oklch,var(--foreground)_10%,transparent))] border-b px-5 py-2.5\">\n <span className=\"font-mono text-[calc(11px*var(--slide-type-scale,1))] text-muted-foreground uppercase tracking-[0.12em]\">\n {language}\n </span>\n </div>\n )}\n {code !== undefined ? (\n <SlideCodeBlockRuntime code={code} language={language} />\n ) : (\n <pre\n className=\"overflow-x-auto p-6 [&_code]:bg-transparent [&_code]:p-0 [&_code]:font-[inherit] [&_code]:leading-[inherit]\"\n data-theme={dataTheme}\n >\n {children}\n </pre>\n )}\n </div>\n )\n}\n\n/** Image with fit modes and optional aspect-ratio container. Square corners by default. */\nexport function Image({\n src,\n alt,\n fit = 'contain',\n rounded = false,\n aspectRatio,\n className,\n caption,\n}: {\n src: string\n alt: string\n fit?: ObjectFit\n rounded?: boolean\n aspectRatio?: AspectRatio\n className?: string\n caption?: string\n}) {\n const useFixedRatio = aspectRatio && aspectRatio !== 'auto'\n const sizeClasses = useFixedRatio ? 'size-full' : 'max-h-full max-w-full'\n const roundedClass = rounded ? 'rounded-xl' : ''\n\n const img = (\n <img\n alt={alt}\n className={`${sizeClasses} ${mediaFitClasses[fit]} ${roundedClass} ${className ?? ''}`}\n height={800}\n src={src}\n width={1200}\n />\n )\n\n const media = useFixedRatio ? (\n <div\n className={`min-h-0 w-full overflow-hidden ${aspectRatioClasses[aspectRatio]} ${roundedClass}`}\n >\n {img}\n </div>\n ) : (\n img\n )\n\n if (!caption) return media\n\n return (\n <figure className=\"flex min-h-0 flex-col gap-3\">\n {media}\n <figcaption className=\"font-medium font-mono text-[calc(18px*var(--slide-type-scale,1))] text-muted-foreground uppercase tabular-nums tracking-[0.18em]\">\n {caption}\n </figcaption>\n </figure>\n )\n}\n\n/**\n * Video with autoplay/loop and optional aspect-ratio container.\n *\n * Play/pause is driven by IntersectionObserver so the video only runs when\n * its slide is visible. On exit the video pauses and resets to the start so\n * revisiting the slide always replays from the beginning — standard\n * presentation behavior. `autoPlay={false}` on the HTML element prevents\n * the browser from playing before visibility is confirmed.\n */\nexport function Video({\n src,\n fit = 'contain',\n rounded = false,\n aspectRatio,\n autoPlay = true,\n loop = true,\n muted = true,\n poster,\n caption,\n}: {\n src: string\n fit?: ObjectFit\n rounded?: boolean\n aspectRatio?: AspectRatio\n autoPlay?: boolean\n loop?: boolean\n muted?: boolean\n /** Static frame shown while the video is loading or the slide is off-screen. */\n poster?: string\n caption?: string\n}) {\n const videoRef = useRef<HTMLVideoElement>(null)\n\n useEffect(() => {\n const video = videoRef.current\n if (!(video && autoPlay)) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n video.play().catch((_err: unknown) => {\n /* autoplay blocked by browser policy */\n })\n } else {\n video.pause()\n video.currentTime = 0\n }\n },\n { threshold: 0.5 }\n )\n\n observer.observe(video)\n return () => observer.disconnect()\n }, [autoPlay])\n\n const useFixedRatio = aspectRatio && aspectRatio !== 'auto'\n const sizeClasses = useFixedRatio ? 'size-full' : 'max-h-full max-w-full'\n const roundedClass = rounded ? 'rounded-xl' : ''\n\n const videoEl = (\n <video\n autoPlay={false}\n className={`${sizeClasses} ${mediaFitClasses[fit]} ${roundedClass}`}\n loop={loop}\n muted={muted}\n playsInline\n poster={poster}\n preload=\"metadata\"\n ref={videoRef}\n >\n <source src={src} />\n <track default kind=\"captions\" srcLang=\"en\" />\n </video>\n )\n\n const media = useFixedRatio ? (\n <div\n className={`min-h-0 w-full overflow-hidden ${aspectRatioClasses[aspectRatio]} ${roundedClass}`}\n >\n {videoEl}\n </div>\n ) : (\n videoEl\n )\n\n if (!caption) return media\n\n return (\n <figure className=\"flex min-h-0 flex-col gap-3\">\n {media}\n <figcaption className=\"font-medium font-mono text-[calc(18px*var(--slide-type-scale,1))] text-muted-foreground uppercase tabular-nums tracking-[0.18em]\">\n {caption}\n </figcaption>\n </figure>\n )\n}\n\n/** Material icon at slide scale */\nexport function Icon({\n name,\n size = 'md',\n color = 'default',\n}: {\n name: string\n size?: 'sm' | 'md' | 'lg' | 'xl'\n color?: TextColor\n}) {\n const px = iconSizes[size]\n return (\n <IconifyIcon\n aria-hidden\n className={textColorClasses[color]}\n height={px}\n icon={`material-symbols:${name.replace(/_/g, '-')}-rounded`}\n width={px}\n />\n )\n}\n\n/** Circular avatar image. Avatars are the one primitive that stays rounded — intentional human marker. */\nexport function Avatar({\n src,\n alt,\n size = 'md',\n}: {\n src: string\n alt: string\n size?: 'sm' | 'md' | 'lg' | 'xl'\n}) {\n return (\n <img\n alt={alt}\n className={`rounded-full object-cover ${avatarSizeClasses[size]}`}\n height={192}\n src={src}\n width={192}\n />\n )\n}\n\n// =============================================================================\n// VISUAL PRIMITIVES\n// =============================================================================\n\ntype BoxVariant = 'default' | 'muted' | 'outline' | 'accent' | 'solid'\n\nconst boxVariantClasses: Record<BoxVariant, string> = {\n default: 'bg-[var(--theme-slide-surface,var(--card))]',\n muted: 'bg-muted/50',\n outline: 'border border-foreground/20',\n accent:\n 'bg-[var(--theme-slide-accent,var(--primary))] text-[var(--theme-slide-accent-foreground,var(--primary-foreground))]',\n solid: 'bg-foreground text-background',\n}\n\nconst boxPaddingClasses = {\n none: 'p-0',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-10',\n} as const\n\nconst badgeVariantClasses = {\n muted: 'bg-muted text-muted-foreground',\n accent:\n 'bg-[var(--theme-slide-accent,var(--primary))] text-[var(--theme-slide-accent-foreground,var(--primary-foreground))]',\n outline: 'border border-foreground/25 text-foreground',\n solid: 'bg-foreground text-background',\n} as const\n\nconst highlightVariantClasses = {\n accent:\n 'bg-[var(--theme-slide-accent,var(--primary))] text-[var(--theme-slide-accent-foreground,var(--primary-foreground))]',\n muted: 'bg-muted/30 border border-foreground/15',\n frame: 'border border-foreground/25',\n} as const\n\nconst colorBlockColorClasses = {\n primary:\n 'bg-[var(--theme-slide-accent,var(--primary))] text-[var(--theme-slide-accent-foreground,var(--primary-foreground))]',\n foreground: 'bg-foreground text-background',\n} as const\n\nconst colorBlockPaddingClasses = {\n none: 'p-0',\n sm: 'px-4 py-2',\n md: 'px-8 py-4',\n lg: 'px-12 py-6',\n} as const\n\n/** Container with background/border/padding. Square corners by default. */\nexport function Box({\n children,\n variant = 'default',\n padding = 'md',\n rounded = false,\n className = '',\n}: {\n children: ReactNode\n variant?: BoxVariant\n padding?: 'none' | 'sm' | 'md' | 'lg'\n rounded?: boolean\n className?: string\n}) {\n return (\n <div\n className={`${boxVariantClasses[variant]} ${boxPaddingClasses[padding]} ${rounded ? 'rounded-xl' : ''} ${className}`}\n >\n {children}\n </div>\n )\n}\n\nconst dividerThickness = { thin: 1, thick: 2 } as const\nconst dividerColorClasses = {\n accent: 'bg-[var(--theme-slide-accent,var(--primary))]',\n default: 'bg-foreground',\n muted: 'bg-foreground/20',\n} as const\n\n/** Horizontal or vertical rule. Accent is a solid 2px signal-color bar. */\nexport function Divider({\n direction = 'horizontal',\n color = 'muted',\n weight = 'thin',\n}: {\n direction?: 'horizontal' | 'vertical'\n color?: 'muted' | 'accent' | 'default'\n weight?: 'thin' | 'thick'\n}) {\n const px = dividerThickness[weight]\n const bg = dividerColorClasses[color]\n\n if (direction === 'vertical') {\n return <div className={`h-full ${bg}`} style={{ width: px }} />\n }\n\n return <div className={`w-full ${bg}`} style={{ height: px }} />\n}\n\n/** Small square tag. Shares type sizing with `Label` (18px) so a Badge\n * beside a Label reads on the same baseline. Hard-edged, hairline-framed —\n * the Swiss form-tag treatment. */\nexport function Badge({\n children,\n variant = 'muted',\n}: {\n children: ReactNode\n variant?: 'muted' | 'accent' | 'outline' | 'solid'\n}) {\n return (\n <span\n className={`inline-flex items-center px-3 py-1 font-medium font-mono text-[calc(18px*var(--slide-type-scale,1))] uppercase tabular-nums tracking-[0.12em] ${badgeVariantClasses[variant]}`}\n >\n {children}\n </span>\n )\n}\n\n/** Framed highlight block — hairline on all sides, no fill tint. Accent swaps to a solid signal-color block. */\nexport function Highlight({\n children,\n variant = 'accent',\n}: {\n children: ReactNode\n variant?: 'accent' | 'muted' | 'frame'\n}) {\n return <div className={`p-8 ${highlightVariantClasses[variant]}`}>{children}</div>\n}\n\n/**\n * Solid color block. Full-bleed primary / foreground rectangle — use\n * behind a word of Headline or a stat numeral for the Müller-Brockmann\n * \"color plate\" move. Accepts children so text sits on the block with\n * inverted color.\n */\nexport function ColorBlock({\n children,\n color = 'primary',\n padding = 'md',\n className = '',\n}: {\n children?: ReactNode\n color?: 'primary' | 'foreground'\n padding?: 'none' | 'sm' | 'md' | 'lg'\n className?: string\n}) {\n return (\n <span\n className={`inline-block ${colorBlockColorClasses[color]} ${colorBlockPaddingClasses[padding]} ${className}`}\n >\n {children}\n </span>\n )\n}\n\nconst padFigure = (v: number | string) => (typeof v === 'number' ? String(v).padStart(2, '0') : v)\n\n/**\n * Editorial form-stamp for media and data cells. Renders \"FIG. 03 / 14\"\n * or any register/total pair in mono tabular nums. Use absolutely\n * positioned inside a cell, or inline above a caption.\n */\nexport function FigureMark({\n register,\n total,\n prefix = 'FIG.',\n className = '',\n}: {\n register: number | string\n total?: number | string\n prefix?: string\n className?: string\n}) {\n return (\n <span\n className={`inline-flex items-baseline gap-2 font-medium font-mono text-[calc(14px*var(--slide-type-scale,1))] text-foreground/70 uppercase tabular-nums tracking-[0.2em] ${className}`}\n >\n <span>{prefix}</span>\n <span>{padFigure(register)}</span>\n {total !== undefined && (\n <>\n <span className=\"text-foreground/30\">/</span>\n <span className=\"text-foreground/50\">{padFigure(total)}</span>\n </>\n )}\n </span>\n )\n}\n\n/**\n * Large margin numeral — the Müller-Brockmann section marker. Renders a\n * giant extralight numeral pushed off to one side with a vertical\n * orientation. Place inside a 2-column slice on the outer edge of a\n * slide.\n *\n * <SectionMarker number=\"03\" caption=\"Foundations\" />\n */\nexport function SectionMarker({\n number,\n caption,\n side = 'left',\n}: {\n number: string\n caption?: string\n side?: 'left' | 'right'\n}) {\n const alignClass = side === 'left' ? 'items-start' : 'items-end'\n return (\n <div className={`flex h-full flex-col justify-between ${alignClass}`}>\n <Label color=\"muted\" orientation=\"vertical\">\n {caption ?? '■'}\n </Label>\n <span className=\"font-light text-[calc(280px*var(--slide-type-scale,1))] text-foreground tabular-nums leading-[0.8] tracking-[-0.05em]\">\n {number}\n </span>\n </div>\n )\n}\n\n// =============================================================================\n// LIST PRIMITIVES\n// =============================================================================\n\nconst listMarkerClasses = {\n dash: '[&_li]:before:content-[\"—\"] [&_li]:before:text-foreground/30 [&_li]:before:mr-4',\n number:\n '[counter-reset:item] [&_li]:before:content-[counter(item,decimal-leading-zero)] [&_li]:[counter-increment:item] [&_li]:before:text-foreground/40 [&_li]:before:mr-6 [&_li]:before:font-mono [&_li]:before:tabular-nums [&_li]:before:text-[calc(18px*var(--slide-type-scale,1))] [&_li]:before:tracking-[0.15em]',\n bullet:\n '[&_li]:before:content-[\"•\"] [&_li]:before:text-[var(--theme-slide-accent,var(--primary))] [&_li]:before:mr-4',\n none: '',\n} as const\n\n/** Styled list with custom markers. Numbered lists use tabular mono for Swiss register. */\nexport function List({\n children,\n marker = 'dash',\n gap = 'md',\n}: {\n children: ReactNode\n marker?: 'dash' | 'number' | 'bullet' | 'none'\n gap?: GapSize\n}) {\n return (\n <ul\n className={`flex flex-col ${gapClasses[gap]} ${listMarkerClasses[marker]} [&_li]:flex [&_li]:items-baseline`}\n data-marker={marker}\n >\n {children}\n </ul>\n )\n}\n\n/** List item — use inside List. Size matches `Body` md so inline body\n * text and list items read on the same baseline. */\nexport function Item({\n children,\n reveal,\n index,\n}: {\n children: ReactNode\n reveal?: boolean\n index?: number\n}) {\n return (\n <li\n className={`text-pretty text-[calc(28px*var(--slide-type-scale,1))] text-foreground/70 leading-[1.45] ${reveal ? 'reveal' : ''}`}\n style={\n reveal && index !== undefined\n ? ({ '--stagger-index': String(index) } as CSSProperties)\n : undefined\n }\n >\n {children}\n </li>\n )\n}\n\n// =============================================================================\n// UTILITY\n// =============================================================================\n\n/**\n * Entrance animation wrapper. Wraps any content in a div that animates in\n * when the slide becomes visible. Set `index` for staggered sequences.\n *\n * ```mdx\n * <Reveal index={0}>First item</Reveal>\n * <Reveal index={1}>Second item</Reveal>\n * ```\n */\nexport function Reveal({ children, index }: { children: ReactNode; index?: number }) {\n return (\n <div\n className=\"reveal\"\n style={\n index !== undefined ? ({ '--stagger-index': String(index) } as CSSProperties) : undefined\n }\n >\n {children}\n </div>\n )\n}\n\n/** Full-bleed container that breaks out of padding */\nexport function Bleed({ children }: { children: ReactNode }) {\n return <div className=\"absolute inset-0 flex items-center justify-center\">{children}</div>\n}\n\n/** Flex grow to push content */\nexport function Fill() {\n return <div className=\"flex-1\" />\n}\n\n/**\n * Live — renders a React component at natural browser scale inside a slide.\n *\n * The slide canvas (1920×1080) is shrunk via `transform: scale(s)` in\n * SlideStage. `Live` counter-acts that with `zoom: 1/s` (precomputed by\n * SlideStage as `--slide-stage-zoom`) so components render at their\n * natural CSS pixel size regardless of the window size.\n *\n * Size components with explicit CSS dimensions or Tailwind size utilities\n * (e.g. `w-96`, `max-w-lg`). The parent `<Demo>` frame clips overflow and\n * centers the content. Slide typography primitives (Headline, Body, etc.)\n * are isolated via `--slide-type-scale: 0`.\n *\n * ```mdx\n * <Demo aspectRatio=\"16/9\">\n * <Carousel className=\"max-w-lg\">…</Carousel>\n * </Demo>\n * ```\n */\nexport function Live({ children }: { children: ReactNode }) {\n return (\n <div\n style={\n {\n zoom: 'var(--slide-stage-zoom, 1)',\n '--slide-type-scale': '0',\n } as CSSProperties\n }\n >\n {children}\n </div>\n )\n}\nLive.displayName = 'Live'\n\n/**\n * Demo — renders an interactive React component inside an ExampleContainer-\n * style frame (dot-grid background, border, rounded corners) sized like an\n * image slot on a slide.\n *\n * The component always renders at natural browser scale regardless of the\n * slide stage zoom (via the `Live` counter-scale technique). The frame\n * matches the proportions and layout behaviour of `<Image>`.\n *\n * ```mdx\n * {/* Same panel slot as <Image> *\\/}\n * <Demo aspectRatio=\"16/9\">\n * <Carousel className=\"w-full h-full\">…</Carousel>\n * </Demo>\n *\n * {/* Framed component showcase with breathing room *\\/}\n * <Demo aspectRatio=\"4/3\" padding=\"md\" label=\"Hover state\">\n * <MyButton />\n * </Demo>\n * ```\n */\nconst demoPaddingValues = { none: '0px', sm: '12px', md: '20px', lg: '32px' } as const\n\nexport function Demo({\n children,\n aspectRatio = '16/9',\n padding = 'none',\n label,\n}: {\n children: ReactNode\n /** CSS aspect-ratio — same ergonomics as the `aspectRatio` prop on `<Image>`. Defaults to `\"16/9\"`. */\n aspectRatio?: string\n /** Inset padding inside the frame before the component renders. */\n padding?: 'none' | 'sm' | 'md' | 'lg'\n /** Optional figure caption rendered below the frame. */\n label?: string\n}) {\n const pad = demoPaddingValues[padding]\n\n return (\n <figure style={{ width: '100%', margin: 0 }}>\n {/* Frame — dot-grid chrome matching ExampleContainer */}\n <div\n style={{\n position: 'relative',\n width: '100%',\n aspectRatio,\n overflow: 'hidden',\n }}\n >\n {/* Content area — Live handles its own centering internally */}\n <div\n className=\"flex items-center justify-center\"\n style={{ position: 'absolute', inset: 0, padding: pad }}\n >\n <Live>{children}</Live>\n </div>\n </div>\n\n {label && (\n <figcaption\n style={\n {\n marginTop: '10px',\n fontSize: 'calc(13px * var(--slide-stage-scale, 1))',\n color: 'var(--muted-foreground)',\n '--slide-type-scale': '0',\n } as CSSProperties\n }\n >\n {label}\n </figcaption>\n )}\n </figure>\n )\n}\nDemo.displayName = 'Demo'\n\n/** Custom positioning wrapper */\nexport function Position({\n children,\n top,\n right,\n bottom,\n left,\n}: {\n children: ReactNode\n top?: number | string\n right?: number | string\n bottom?: number | string\n left?: number | string\n}) {\n const style: CSSProperties = {\n position: 'absolute',\n top,\n right,\n bottom,\n left,\n }\n\n return <div style={style}>{children}</div>\n}\n","import type { ReactNode } from 'react'\nimport { createContext, Fragment, useContext, useEffect } from 'react'\nimport { SyllabusDetectContext, useSlideRenderMode } from '../stores/render-mode'\n\n/**\n * Consumed by the MDX markdown wrappers (MarkdownParagraph, MarkdownUnorderedList,\n * etc.) to switch from slide-scale primitives to native web-MDX elements when\n * rendering inside a Syllabus block. This avoids the CSS !important reset layer\n * previously needed to undo slide typography inside the syllabus view.\n */\nexport const SyllabusContentContext = createContext(false)\n\n// =============================================================================\n// SYLLABUS ROOT\n// =============================================================================\n\n/**\n * Syllabus / handout block for a slide deck.\n *\n * In presentation mode: renders as a hidden DOM container so the slide stage\n * extractors (useSlidesDom, useSyllabus) can clone it into the reading layout.\n *\n * In web-syllabus mode: renders as a visible, styled document section.\n * Write standard MDX headings (## Overview, ## Objectives, etc.) as children —\n * no sub-component wrappers needed. Only <Syllabus.Meta> remains for\n * structured key-value metadata (duration, format, audience, etc.).\n */\nexport function Syllabus({ children }: { children: ReactNode }) {\n const mode = useSlideRenderMode()\n const notify = useContext(SyllabusDetectContext)\n\n useEffect(() => {\n if (mode === 'web-syllabus') {\n notify?.()\n }\n }, [mode, notify])\n\n if (mode === 'web-syllabus') {\n return (\n <SyllabusContentContext.Provider value={true}>\n <div className=\"flex flex-col gap-0 pb-8\">{children}</div>\n </SyllabusContentContext.Provider>\n )\n }\n return (\n <SyllabusContentContext.Provider value={true}>\n <div data-slide-syllabus hidden>\n {children}\n </div>\n </SyllabusContentContext.Provider>\n )\n}\nSyllabus.displayName = 'Syllabus'\n\n// =============================================================================\n// META BLOCK\n// =============================================================================\n\nexport interface SyllabusMetaProps {\n audience?: string\n date?: string\n duration?: string\n format?: string\n location?: string\n}\n\nconst Meta = ({ duration, audience, format, location, date }: SyllabusMetaProps) => {\n const mode = useSlideRenderMode()\n\n if (mode === 'web-syllabus') {\n const rows: [string, string][] = [\n ...(duration ? [['Duration', duration] as [string, string]] : []),\n ...(format ? [['Format', format] as [string, string]] : []),\n ...(audience ? [['Audience', audience] as [string, string]] : []),\n ...(location ? [['Location', location] as [string, string]] : []),\n ...(date ? [['Date', date] as [string, string]] : []),\n ]\n\n if (rows.length === 0) return null\n\n return (\n <div className=\"flex flex-col gap-4 py-8\">\n <p className=\"font-medium font-mono text-muted-foreground text-xs uppercase tracking-wider\">\n At a glance\n </p>\n <div className=\"grid grid-cols-[auto_1fr] gap-x-10 gap-y-2.5\">\n {rows.map(([label, value]) => (\n <Fragment key={label}>\n <span className=\"self-baseline pt-px font-medium font-mono text-muted-foreground text-xs uppercase tracking-wider\">\n {label}\n </span>\n <span className=\"text-[0.9375rem] text-foreground/90 leading-[1.7]\">{value}</span>\n </Fragment>\n ))}\n </div>\n </div>\n )\n }\n\n const rows: [label: string, value: string][] = []\n if (duration) rows.push(['Duration', duration])\n if (format) rows.push(['Format', format])\n if (audience) rows.push(['Audience', audience])\n if (location) rows.push(['Location', location])\n if (date) rows.push(['Date', date])\n\n return (\n <div data-syllabus-block=\"meta\">\n {rows.map(([label, value]) => (\n <div data-syllabus-meta-key={label.toLowerCase()} key={label}>\n <span data-syllabus-meta-label>{label}</span>\n <span data-syllabus-meta-value>{value}</span>\n </div>\n ))}\n </div>\n )\n}\nMeta.displayName = 'Syllabus.Meta'\n\nSyllabus.Meta = Meta\n","/**\n * Slide Templates\n *\n * Higher-level patterns that compose primitives for common slide layouts.\n * Use these for quick, consistent slides. Use primitives for custom layouts.\n *\n * Template aesthetic: Swiss / International Typographic Style. Flush-left\n * by default, hairline rules as structural chrome, solid color blocks\n * instead of frosted glass, tabular numerals across stats.\n */\n\nimport {\n Children,\n type ElementType,\n isValidElement,\n memo,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { useSlideRenderMode } from '../stores/render-mode'\nimport {\n Body,\n Cell,\n Center,\n Display,\n FigureMark,\n Grid,\n Headline,\n Item,\n Label,\n List,\n Quote,\n SectionMarker,\n Spacer,\n Split,\n Stack,\n Subtitle,\n Title,\n} from './primitives'\n\n// =============================================================================\n// BENTO HELPERS\n// =============================================================================\n\n/**\n * Find children whose `type` matches a specific component (slot identity check).\n * Used by compound bento templates to discover their named slots.\n */\nfunction findSlots(children: ReactNode, slotType: ElementType): ReactElement[] {\n return Children.toArray(children).filter(\n (child): child is ReactElement => isValidElement(child) && child.type === slotType\n )\n}\n\n/**\n * Detect whether a media src points to a video file.\n */\nconst VIDEO_RE = /\\.(webm|mp4|mov|ogg)(\\?|$)/i\nfunction isVideo(src: string): boolean {\n return VIDEO_RE.test(src)\n}\n\n/**\n * Renders an image or video that completely fills its parent cell.\n *\n * Bento templates need media to stretch into the full cell bounds (cropping\n * via object-cover) — the standard `<Image>`/`<Video>` primitives use\n * `max-h-full max-w-full` which leaves gaps when content is smaller than\n * the cell. This helper bypasses that with explicit `size-full object-cover`.\n *\n * Optional `figure` renders a mono form-stamp in the top-left corner, and\n * `caption` renders a flush-bottom-left caption block with a hairline\n * above it — both editorial treatments that make media feel \"published\"\n * instead of decorative.\n */\nconst BentoMedia = memo(\n ({\n src,\n alt = '',\n figure,\n caption,\n }: {\n src: string\n alt?: string\n figure?: { register: number | string; total?: number | string; prefix?: string }\n caption?: string\n }) => {\n return (\n <div className=\"relative min-h-0 flex-1 self-stretch overflow-hidden\">\n {isVideo(src) ? (\n <video\n autoPlay\n className=\"absolute inset-0 size-full object-cover\"\n loop\n muted\n playsInline\n >\n <source src={src} />\n <track kind=\"captions\" label={alt || 'Slide media'} />\n </video>\n ) : (\n <img\n alt={alt}\n className=\"absolute inset-0 size-full object-cover\"\n height={1080}\n src={src}\n width={1920}\n />\n )}\n {figure && (\n <div className=\"absolute top-4 left-4 bg-background/80 px-2 py-1 backdrop-blur-sm\">\n <FigureMark prefix={figure.prefix} register={figure.register} total={figure.total} />\n </div>\n )}\n {caption && (\n <div className=\"absolute right-4 bottom-4 left-4 border-white/50 border-t bg-black/50 px-4 pt-3 pb-2 backdrop-blur-sm\">\n <span className=\"font-medium font-mono text-[calc(14px*var(--slide-type-scale,1))] text-white/90 uppercase tracking-[0.15em]\">\n {caption}\n </span>\n </div>\n )}\n </div>\n )\n }\n)\nBentoMedia.displayName = 'BentoMedia'\n\n/**\n * Gallery-style media for Collage — preserves the full image aspect ratio with\n * object-contain so nothing is cropped. Relies on the parent Cell having a\n * muted variant so the empty padding reads as intentional framing.\n */\nconst CollageMedia = memo(({ src, alt = '' }: { src: string; alt?: string }) => {\n if (isVideo(src)) {\n return (\n <video autoPlay className=\"size-full object-contain\" loop muted playsInline>\n <source src={src} />\n <track kind=\"captions\" label={alt || 'Slide media'} />\n </video>\n )\n }\n return <img alt={alt} className=\"size-full object-contain\" height={1080} src={src} width={1920} />\n})\nCollageMedia.displayName = 'CollageMedia'\n\n// =============================================================================\n// COVER TEMPLATES\n// =============================================================================\n\n/**\n * Editorial cover slide — massive wrapping title top-left, optional eyebrow\n * (typically a year or date) top-right, optional credit bottom-left.\n * No subtitle, no badges, no image. Designed to feel like a magazine cover.\n *\n * The title uses the same pixel size as `Display lg` (160px) but semibold\n * weight — Display is decorative/light, the cover is authored.\n *\n * A full-width hairline above the title turns the cover into a masthead.\n */\nexport function CoverSlide({\n title,\n subtitle,\n eyebrow,\n credit,\n logo,\n}: {\n title: string\n /** Optional deck hook — one line under the main title (editorial cover). */\n subtitle?: string\n /** Small text anchored to the top-right corner — typically a year or date. */\n eyebrow?: string\n /** Small text anchored to the bottom-left corner — typically an author credit. */\n credit?: string\n /** Optional brand mark rendered inline just above the title. */\n logo?: ReactNode\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div className=\"flex h-full min-h-0 flex-1 flex-col\">\n <div className=\"flex items-baseline justify-between gap-8 border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <Label>▲ Cover</Label>\n {eyebrow && <Label>{eyebrow}</Label>}\n </div>\n\n <div className=\"flex-1\" />\n\n {logo && (\n <>\n {logo}\n <Spacer size=\"lg\" />\n </>\n )}\n\n <h1 className=\"min-w-0 max-w-3/4 text-balance break-words font-semibold text-[calc(160px*var(--slide-type-scale,1))] text-foreground leading-[0.85] tracking-[-0.04em]\">\n {title}\n </h1>\n\n {subtitle && (\n <>\n <Spacer size=\"md\" />\n <Body color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n </>\n )}\n\n {credit && (\n <>\n <Spacer size=\"lg\" />\n <div className=\"border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-4\">\n <Label color=\"muted\">{credit}</Label>\n </div>\n </>\n )}\n </div>\n )\n}\n\n// =============================================================================\n// FULL BLEED TEMPLATE\n// =============================================================================\n\n/** Full-bleed media slide — image/video fills the entire canvas.\n * Optional label+title render in a solid bottom-left block.\n *\n * The overlay uses a hard-edged black block with white type — no blur,\n * no transparency, no rounded corners. Swiss posters don't wash titles\n * over photos; they cut a plate and set them flat. */\nexport function FullBleedSlide({\n mediaSrc,\n mediaAlt = 'Visual',\n mediaType,\n label,\n title,\n}: {\n mediaSrc: string\n mediaAlt?: string\n mediaType?: 'image' | 'video'\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const showVideo = mediaType ? mediaType === 'video' : isVideo(mediaSrc)\n\n return (\n <div className=\"absolute inset-0\">\n {showVideo ? (\n <video autoPlay className=\"size-full object-cover\" loop muted playsInline>\n <source src={mediaSrc} />\n <track kind=\"captions\" label={mediaAlt} />\n </video>\n ) : (\n <img\n alt={mediaAlt}\n className=\"size-full object-cover\"\n height={800}\n src={mediaSrc}\n width={1200}\n />\n )}\n {(label ?? title) && (\n <div className=\"absolute bottom-12 left-12 max-w-[70%] bg-black px-10 py-8 text-white\">\n <Stack gap=\"xs\">\n {label && (\n <Label color=\"inherit\">\n <span className=\"text-white/70\">{label}</span>\n </Label>\n )}\n {title && (\n <Title color=\"inherit\">\n <span className=\"text-white\">{title}</span>\n </Title>\n )}\n </Stack>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Full-bleed image or video with **cover-style** typography — top masthead band\n * + bottom title plate, both solid black with white type (no blur, no tinted\n * washes). Use for workshop openers, chapter covers, and hero beats where\n * `CoverSlide` (type-only) is too empty but `FullBleedSlide` (small bottom-left\n * caption only) is too little structure.\n *\n * The photo shows in the middle band; keep contrast on the plates only.\n */\nexport function FullBleedCoverSlide({\n title,\n subtitle,\n eyebrow,\n credit,\n mediaSrc,\n mediaAlt = 'Cover',\n mediaType,\n mastheadLabel = '▲ Cover',\n}: {\n title: string\n /** Hook under the main title — muted, like `CoverSlide` subtitle. */\n subtitle?: string\n /** Small text on the top-right of the masthead band (e.g. year, “Workshop”). */\n eyebrow?: string\n /** Credit line in the bottom plate, above a hairline — like `CoverSlide`. */\n credit?: string\n mediaSrc: string\n mediaAlt?: string\n mediaType?: 'image' | 'video'\n /** Left label in the top band; defaults to the deck’s cover glyph. */\n mastheadLabel?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const showVideo = mediaType ? mediaType === 'video' : isVideo(mediaSrc)\n\n return (\n <div className=\"relative flex h-full min-h-0 flex-1 flex-col\">\n <div aria-hidden className=\"absolute inset-0 z-0\">\n {showVideo ? (\n <video autoPlay className=\"size-full object-cover\" loop muted playsInline>\n <source src={mediaSrc} />\n <track kind=\"captions\" label={mediaAlt} />\n </video>\n ) : (\n <img\n alt={mediaAlt}\n className=\"size-full object-cover\"\n height={1080}\n src={mediaSrc}\n width={1920}\n />\n )}\n </div>\n\n <div className=\"relative z-10 flex min-h-0 flex-1 flex-col\">\n <div className=\"flex shrink-0 items-baseline justify-between gap-6 border-white/20 border-b bg-black px-12 py-5\">\n <Label>\n <span className=\"text-white/85\">{mastheadLabel}</span>\n </Label>\n {eyebrow ? (\n <Label>\n <span className=\"text-white/60\">{eyebrow}</span>\n </Label>\n ) : (\n <span className=\"min-w-0\" />\n )}\n </div>\n\n <div className=\"min-h-0 flex-1\" />\n\n <div className=\"shrink-0 border-white/20 border-t bg-black px-12 pt-10 pb-8\">\n <h1 className=\"max-w-[95%] text-balance font-semibold text-[calc(160px*var(--slide-type-scale,1))] text-white leading-[0.88] tracking-[-0.04em]\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"mt-6 max-w-[960px] text-pretty text-[calc(36px*var(--slide-type-scale,1))] text-white/72 leading-[1.35]\">\n {subtitle}\n </p>\n )}\n {credit && (\n <div className=\"mt-8 border-white/20 border-t pt-6\">\n <Label>\n <span className=\"text-white/45\">{credit}</span>\n </Label>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\n// =============================================================================\n// QUOTE TEMPLATE\n// =============================================================================\n\n/**\n * Editorial quote slide — flush-left pull quote, attribution on its own\n * line under a hairline. Previously centered; now composed on the 12-col\n * grid so the quote sits on the same left edge as every other slide.\n */\nexport function QuoteSlide({ quote, attribution }: { quote: string; attribution?: string }) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div className=\"flex h-full min-h-0 flex-1 items-center\">\n <div className=\"w-full max-w-[1700px]\">\n <Stack gap=\"xl\">\n <div className=\"border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <Label font=\"mono\">◆ Quote</Label>\n </div>\n <p className=\"max-w-[1600px] text-balance break-words font-instrument-serif text-[calc(96px*var(--slide-type-scale,1))] text-[var(--theme-slide-quote-color,color-mix(in_oklch,var(--foreground)_90%,transparent))] italic leading-[1.1] tracking-[-0.015em]\">\n {quote}\n </p>\n {attribution && (\n <div className=\"flex items-baseline gap-6 border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-4\">\n <span className=\"font-medium font-mono text-[calc(18px*var(--slide-type-scale,1))] text-foreground/40 uppercase tracking-[0.18em]\">\n —\n </span>\n <Label color=\"muted\">{attribution}</Label>\n </div>\n )}\n </Stack>\n </div>\n </div>\n )\n}\n\n// =============================================================================\n// SECTION TEMPLATE\n// =============================================================================\n\ntype SectionAxis = 'editorial' | 'flush-left' | 'centered'\n\n/**\n * Section title slide.\n *\n * axis=\"editorial\" (default when `number` is set) — huge margin numeral\n * on the left, headline flush-left in the content area.\n * The Müller-Brockmann section marker treatment.\n * axis=\"flush-left\" — simple flush-left heading, no margin numeral.\n * axis=\"centered\" — legacy axial layout.\n *\n * With `imageSrc` the layout always falls into a text-left / media-right\n * split regardless of axis so the rhythm matches `Split` slides.\n */\nexport function SectionSlide({\n number,\n title,\n subtitle,\n imageSrc,\n imageAlt = 'Section',\n axis,\n}: {\n number?: string\n title: string\n subtitle?: string\n imageSrc?: string\n imageAlt?: string\n axis?: SectionAxis\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const resolvedAxis: SectionAxis = axis ?? (number ? 'editorial' : 'flush-left')\n\n if (imageSrc) {\n return (\n <Split gap=\"xl\" ratio=\"1/1\">\n <div className=\"flex items-center\">\n <Stack gap=\"none\" justify=\"center\">\n {number && (\n <>\n <Label font=\"mono\">■ {number}</Label>\n <Spacer size=\"md\" />\n </>\n )}\n <Headline>{title}</Headline>\n {subtitle && (\n <>\n <Spacer size=\"md\" />\n <Body color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n </>\n )}\n </Stack>\n </div>\n <div className=\"min-h-0 overflow-hidden\">\n <img\n alt={imageAlt}\n className=\"size-full object-cover\"\n height={600}\n src={imageSrc}\n width={800}\n />\n </div>\n </Split>\n )\n }\n\n if (resolvedAxis === 'editorial' && number) {\n return (\n <Grid cols={12} rows={1} ruled={false}>\n <Cell colSpan={3} colStart={1} padding=\"none\" rowSpan={1} rowStart={1}>\n <SectionMarker caption=\"Section\" number={number} />\n </Cell>\n <Cell colSpan={8} colStart={5} padding=\"none\" rowSpan={1} rowStart={1}>\n <div className=\"flex h-full flex-col justify-end\">\n <div className=\"border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <Stack gap=\"md\">\n <Label font=\"mono\">{`Chapter · ${number}`}</Label>\n <Headline>{title}</Headline>\n {subtitle && (\n <Body color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n )}\n </Stack>\n </div>\n </div>\n </Cell>\n </Grid>\n )\n }\n\n if (resolvedAxis === 'centered') {\n return (\n <Center>\n <Stack align=\"center\" className=\"max-w-[1200px]\" gap=\"none\">\n {number && (\n <>\n <Display align=\"center\" color=\"secondary\" size=\"md\">\n {number}\n </Display>\n <Spacer size=\"md\" />\n </>\n )}\n <Headline align=\"center\">{title}</Headline>\n {subtitle && (\n <>\n <Spacer size=\"md\" />\n <Body align=\"center\" color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n </>\n )}\n </Stack>\n </Center>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col justify-end\">\n <div className=\"border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <Stack gap=\"md\">\n {number && <Label font=\"mono\">■ {number}</Label>}\n <Headline>{title}</Headline>\n {subtitle && (\n <Body color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n )}\n </Stack>\n </div>\n </div>\n )\n}\n\n// =============================================================================\n// STATEMENT + SPLIT HALF (keynote-style rhythm)\n// =============================================================================\n\n/**\n * Thesis slide — one headline, optional kicker and subcopy.\n *\n * axis=\"flush-left\" (default) — Swiss editorial: kicker + headline\n * flush to the left, subtitle underneath capped at\n * a readable measure. A hairline rule above the\n * kicker ties the slide into the deck's frame.\n * axis=\"centered\" — legacy axial layout (opt-in only).\n */\nexport function StatementSlide({\n kicker,\n title,\n subtitle,\n axis = 'flush-left',\n}: {\n kicker?: string\n title: string\n subtitle?: string\n axis?: 'flush-left' | 'centered'\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n if (axis === 'centered') {\n return (\n <Center>\n <Stack align=\"center\" className=\"mx-auto max-w-[1100px] px-2\" gap=\"xl\" justify=\"center\">\n {kicker && (\n <Label align=\"center\" color=\"muted\" font=\"sans\">\n {kicker}\n </Label>\n )}\n <Headline align=\"center\">{title}</Headline>\n {subtitle && (\n <Body align=\"center\" color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n )}\n </Stack>\n </Center>\n )\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-1 items-center\">\n <div className=\"w-full max-w-[1600px] border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-8\">\n <Stack gap=\"xl\">\n {kicker && <Label font=\"mono\">{kicker}</Label>}\n <Headline>{title}</Headline>\n {subtitle && (\n <div className=\"max-w-[1100px]\">\n <Body color=\"muted\" size=\"lg\">\n {subtitle}\n </Body>\n </div>\n )}\n </Stack>\n </div>\n </div>\n )\n}\n\nconst splitHalfGaps = {\n md: 'gap-6',\n lg: 'gap-10',\n xl: 'gap-16',\n} as const\n\nfunction SplitHalfPanel({\n children,\n justify = 'center',\n}: {\n children: ReactNode\n justify?: 'start' | 'center' | 'end'\n}) {\n const justifyClass = { start: 'justify-start', center: 'justify-center', end: 'justify-end' }[\n justify\n ]\n return <div className={`flex min-h-0 flex-1 flex-col ${justifyClass}`}>{children}</div>\n}\n\n/**\n * Fifty-fifty deck split — vertical (columns) or horizontal (rows).\n * Use two `SplitHalf.Panel` children: narrative vs media, thesis vs proof, etc.\n */\nexport function SplitHalf({\n children,\n axis = 'vertical',\n gap = 'xl',\n label,\n title,\n}: {\n children: ReactNode\n axis?: 'horizontal' | 'vertical'\n gap?: keyof typeof splitHalfGaps\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const panels = findSlots(children, SplitHalfPanel).slice(0, 2)\n const gapClass = splitHalfGaps[gap]\n const gridClass =\n axis === 'vertical'\n ? `grid-cols-2 grid-rows-1 ${gapClass}`\n : `grid-cols-1 grid-rows-2 ${gapClass}`\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-10\">\n {(label ?? title) && (\n <div className=\"shrink-0 border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-4\">\n <Stack gap=\"xs\">\n {label && <Label>{label}</Label>}\n {title && <Title>{title}</Title>}\n </Stack>\n </div>\n )}\n <div className={`grid min-h-0 flex-1 ${gridClass} [&>*]:min-h-0`}>{panels}</div>\n </div>\n )\n}\nSplitHalf.Panel = SplitHalfPanel\n\n// =============================================================================\n// CLOSING TEMPLATE\n// =============================================================================\n\ninterface ClosingContact {\n /** Optional URL. When set, the value renders as an anchor — external\n * http(s) links open in a new tab; mailto: and tel: open natively. */\n href?: string\n label: string\n value: string\n}\n\nconst FULLY_QUALIFIED_URL = /^(https?:|mailto:|tel:)/i\nconst EXTERNAL_URL = /^https?:\\/\\//i\n\n/** Resolve a bare hostname like \"atom63.com\" into a full https URL.\n * Leaves fully-qualified URLs (http/https/mailto/tel) untouched. */\nfunction resolveContactHref(value: string): string {\n if (FULLY_QUALIFIED_URL.test(value)) {\n return value\n }\n return `https://${value}`\n}\n\nconst isExternalHref = (href: string) => EXTERNAL_URL.test(href)\n\n/** Single colophon entry: small label above, value below. When `href`\n * is present the value is rendered as a focusable, hover-able anchor\n * that picks up the deck's signal color. Each entry occupies the same\n * 3-col footprint so the footer reads as a uniform editorial row. */\nfunction ColophonItem({ label, value, href }: { label: string; value: string; href?: string }) {\n const valueClasses =\n 'text-pretty break-words font-normal text-[calc(28px*var(--slide-type-scale,1))] leading-[1.45] tabular-nums'\n return (\n <div className=\"col-span-3 flex flex-col gap-2\">\n <Label color=\"muted\" font=\"sans\">\n {label}\n </Label>\n {href ? (\n <a\n className={`${valueClasses} self-start text-foreground decoration-1 underline-offset-[6px] outline-none transition-colors hover:text-[var(--theme-slide-accent,var(--primary))] hover:underline focus-visible:text-[var(--theme-slide-accent,var(--primary))] focus-visible:underline`}\n href={href}\n rel={isExternalHref(href) ? 'noopener' : undefined}\n target={isExternalHref(href) ? '_blank' : undefined}\n >\n {value}\n </a>\n ) : (\n <p className={`${valueClasses} text-foreground`}>{value}</p>\n )}\n </div>\n )\n}\n\n/**\n * Editorial closing slide — a deliberate bookend rather than a reversed\n * cover. Title vertically centered so it reads as the final statement,\n * flanked by a giant ▼ glyph acting as a typographic full-stop — part of\n * the deck's primitive-shape vocabulary (▲ cover / ■ section / ◆ quote /\n * ▼ closing). The footer is a tabular colophon — Web / Email / Also —\n * each column labelled and aligned on the 12-col rhythm, so the last\n * page of the deck reads like the colophon of a book.\n */\nexport function ClosingSlide({\n title,\n eyebrow,\n website,\n email,\n handles,\n}: {\n title: string\n /** Small text anchored to the top-right corner (e.g. \"2026\", \"Q&A\"). */\n eyebrow?: string\n /** Primary website URL rendered on its own line. */\n website?: string\n /** Contact email rendered below the website. */\n email?: string\n /** Supplementary contacts (handles, sites, tools). Each entry takes\n * its own labelled column on the colophon row. Pass an `href` to\n * make the value clickable — `website` and `email` are auto-linked. */\n handles?: ClosingContact[]\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const handleItems = handles ?? []\n const hasContact = Boolean(website || email || handleItems.length > 0)\n\n return (\n <div className=\"flex h-full min-h-0 flex-1 flex-col\">\n {/* Masthead band */}\n <div className=\"flex items-baseline justify-between gap-8 border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <Label>▼</Label>\n {eyebrow && <Label>{eyebrow}</Label>}\n </div>\n\n {/* Body: title on the left, end-mark glyph on the right, vertically centered.\n The giant ▼ visually rhymes with the \"▼ Fin\" masthead so the page\n reads as unambiguously terminal — the primitive-shape tombstone\n of the deck. */}\n <div className=\"flex min-h-0 flex-1 items-center gap-12\">\n <h1 className=\"min-w-0 flex-1 text-balance break-words font-semibold text-[calc(160px*var(--slide-type-scale,1))] text-foreground leading-[0.85] tracking-[-0.04em]\">\n {title}\n </h1>\n <span\n aria-hidden=\"true\"\n className=\"shrink-0 self-end pb-10 font-light text-[calc(260px*var(--slide-type-scale,1))] text-foreground/15 leading-[0.8]\"\n >\n ▼\n </span>\n </div>\n\n {/* Colophon footer — every contact (Web, Email, supplementary handles)\n is rendered as a uniform 3-col entry so the footer reads as a\n single editorial row instead of \"two columns plus a tag list.\"\n Hierarchy comes from order (primary first), not weight. */}\n {hasContact && (\n <div className=\"border-[color:var(--theme-slide-rule-color,color-mix(in_oklch,var(--foreground)_25%,transparent))] border-t-[length:var(--theme-slide-rule-width,1px)] pt-6\">\n <div className=\"grid grid-cols-12 gap-x-6 gap-y-6\">\n {website && (\n <ColophonItem href={resolveContactHref(website)} label=\"Web\" value={website} />\n )}\n {email && <ColophonItem href={`mailto:${email}`} label=\"Email\" value={email} />}\n {handleItems.map(h => (\n <ColophonItem href={h.href} key={h.label} label={h.label} value={h.value} />\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// =============================================================================\n// BENTO TEMPLATES\n// =============================================================================\n\n// ── HeroBento ──────────────────────────────────────────────────────────────\n// 1 hero media (left 2/3) + 3 stacked supporting cards (right 1/3).\n// Supporting cards use the `rule` variant (top hairline, no backplate) so\n// the slide reads as aligned editorial columns rather than a filled\n// dashboard grid.\n\nfunction HeroBentoHero({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nfunction HeroBentoCard({ title, body }: { title: string; body?: ReactNode }) {\n return (\n <Stack gap=\"xs\" justify=\"start\">\n <Subtitle color=\"default\">{title}</Subtitle>\n {body && <Body size=\"sm\">{body}</Body>}\n </Stack>\n )\n}\n\nexport function HeroBento({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const heroSlot = findSlots(children, HeroBentoHero).at(0)\n const cardSlots = findSlots(children, HeroBentoCard).slice(0, 3)\n\n return (\n <Grid cols={12} gap=\"md\" label={label} rows={6} title={title}>\n <Cell colSpan={8} colStart={1} overflow=\"hidden\" padding=\"none\" rowSpan={6} rowStart={1}>\n {heroSlot}\n </Cell>\n {cardSlots.map((card, i) => (\n <Cell\n colSpan={4}\n colStart={9}\n key={`hero-bento-card-${String(i)}`}\n padding=\"sm\"\n rowSpan={2}\n rowStart={i * 2 + 1}\n variant=\"rule\"\n >\n {card}\n </Cell>\n ))}\n </Grid>\n )\n}\nHeroBento.Hero = HeroBentoHero\nHeroBento.Card = HeroBentoCard\n\n// ── MediaTrio ──────────────────────────────────────────────────────────────\n// 1 hero media + 2 stacked supporting media. For showcasing variants.\n// Grid: 12 cols × 2 rows. Hero = col 1-7 rows 1-2. Media = col 8-12 row 1 / row 2.\n\nfunction MediaTrioHero({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nfunction MediaTrioMedia({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nexport function MediaTrio({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const heroSlot = findSlots(children, MediaTrioHero).at(0)\n const mediaSlots = findSlots(children, MediaTrioMedia).slice(0, 2)\n\n return (\n <Grid cols={12} gap=\"md\" label={label} rows={2} title={title}>\n <Cell colSpan={7} colStart={1} overflow=\"hidden\" padding=\"none\" rowSpan={2} rowStart={1}>\n {heroSlot}\n </Cell>\n {mediaSlots.map((media, i) => (\n <Cell\n colSpan={5}\n colStart={8}\n key={`media-trio-${String(i)}`}\n overflow=\"hidden\"\n padding=\"none\"\n rowSpan={1}\n rowStart={i + 1}\n >\n {media}\n </Cell>\n ))}\n </Grid>\n )\n}\nMediaTrio.Hero = MediaTrioHero\nMediaTrio.Media = MediaTrioMedia\n\n// ── StatBento ──────────────────────────────────────────────────────────────\n// Narrative body (optional) + up to 6 flat stats in a 3-column grid.\n// Stats are chrome-less — numeral + label with a top hairline per cell so\n// the row reads as a tabular form, not a dashboard of cards.\n\nfunction StatBentoBody({ children }: { children: ReactNode }) {\n return (\n <Stack className=\"max-w-[960px]\" gap=\"md\" justify=\"center\">\n <Body color=\"default\" size=\"lg\">\n {children}\n </Body>\n </Stack>\n )\n}\n\nfunction StatBentoStat({ value, label }: { value: string; label: string }) {\n // Stack fills the cell and anchors to the bottom edge — Swiss stat\n // tables read as \"numerals rising from a floor\" rather than floating.\n return (\n <Stack align=\"start\" className=\"min-h-0 flex-1\" gap=\"sm\" justify=\"end\">\n <Display color=\"default\" size=\"md\" weight=\"light\">\n {value}\n </Display>\n <Body color=\"muted\" size=\"sm\">\n {label}\n </Body>\n </Stack>\n )\n}\n\nconst DEFAULT_STATS_PER_ROW = 3\nconst MAX_STATS = 6\n\nexport function StatBento({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const bodySlot = findSlots(children, StatBentoBody).at(0)\n const statSlots = findSlots(children, StatBentoStat).slice(0, MAX_STATS)\n\n // Four stats naturally read as a single tabular row across the slide\n // (12 / 4 = 3 cols each), so we widen the layout instead of wrapping\n // 3 + 1. Three or fewer also fits a single row; five or six wrap to\n // two rows on the default 3-up rhythm.\n const count = statSlots.length\n const columns = count === 4 ? 4 : DEFAULT_STATS_PER_ROW\n const colSpanPer = 12 / columns\n const singleRow = count <= columns\n const rows = 8\n const statRowOffsetBase = bodySlot ? 5 : 1\n const statRowSpan = bodySlot ? (singleRow ? 4 : 2) : singleRow ? 8 : 4\n\n return (\n <Grid cols={12} label={label} rows={rows} title={title}>\n {bodySlot && (\n <Cell colSpan={8} colStart={1} padding=\"none\" rowSpan={4} rowStart={1}>\n {bodySlot}\n </Cell>\n )}\n {statSlots.map((stat, i) => {\n const row = Math.floor(i / columns)\n const col = i % columns\n return (\n <Cell\n colSpan={colSpanPer}\n colStart={col * colSpanPer + 1}\n key={`stat-bento-${String(i)}`}\n padding=\"sm\"\n rowSpan={statRowSpan}\n rowStart={statRowOffsetBase + row * statRowSpan}\n variant=\"rule\"\n >\n {stat}\n </Cell>\n )\n })}\n </Grid>\n )\n}\nStatBento.Body = StatBentoBody\nStatBento.Stat = StatBentoStat\n\n// ── Collage ────────────────────────────────────────────────────────────────\n// 1 featured image + 2–4 supporting images. For brand sheets, identity systems,\n// and mixed-aspect galleries. Uses object-contain with hairline-framed cells\n// so the full image is visible — the padding reads as intentional framing.\n\nfunction CollageFeatured({ src, alt = '' }: { src: string; alt?: string }) {\n return <CollageMedia alt={alt} src={src} />\n}\n\nfunction CollageImage({ src, alt = '' }: { src: string; alt?: string }) {\n return <CollageMedia alt={alt} src={src} />\n}\n\nexport function Collage({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const featuredSlot = findSlots(children, CollageFeatured).at(0)\n const imageSlots = findSlots(children, CollageImage).slice(0, 4)\n const count = imageSlots.length\n\n if (count >= 4) {\n const positions: { col: number; row: number }[] = [\n { col: 7, row: 1 },\n { col: 10, row: 1 },\n { col: 7, row: 5 },\n { col: 10, row: 5 },\n ]\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={6} colStart={1} overflow=\"hidden\" rowSpan={8} rowStart={1} variant=\"frame\">\n {featuredSlot}\n </Cell>\n {imageSlots.map((image, i) => {\n const pos = positions[i]\n if (!pos) return null\n return (\n <Cell\n colSpan={3}\n colStart={pos.col}\n key={`collage-4-${String(i)}`}\n overflow=\"hidden\"\n rowSpan={4}\n rowStart={pos.row}\n variant=\"frame\"\n >\n {image}\n </Cell>\n )\n })}\n </Grid>\n )\n }\n\n if (count === 3) {\n const stacks = [\n { row: 1, span: 3 },\n { row: 4, span: 2 },\n { row: 6, span: 3 },\n ]\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={8} colStart={1} overflow=\"hidden\" rowSpan={8} rowStart={1} variant=\"frame\">\n {featuredSlot}\n </Cell>\n {imageSlots.map((image, i) => {\n const pos = stacks[i]\n if (!pos) return null\n return (\n <Cell\n colSpan={4}\n colStart={9}\n key={`collage-3-${String(i)}`}\n overflow=\"hidden\"\n rowSpan={pos.span}\n rowStart={pos.row}\n variant=\"frame\"\n >\n {image}\n </Cell>\n )\n })}\n </Grid>\n )\n }\n\n if (count === 2) {\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={8} colStart={1} overflow=\"hidden\" rowSpan={8} rowStart={1} variant=\"frame\">\n {featuredSlot}\n </Cell>\n {imageSlots.map((image, i) => (\n <Cell\n colSpan={4}\n colStart={9}\n key={`collage-2-${String(i)}`}\n overflow=\"hidden\"\n rowSpan={4}\n rowStart={i * 4 + 1}\n variant=\"frame\"\n >\n {image}\n </Cell>\n ))}\n </Grid>\n )\n }\n\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={12} colStart={1} overflow=\"hidden\" rowSpan={8} rowStart={1} variant=\"frame\">\n {featuredSlot}\n </Cell>\n {imageSlots.map((image, i) => (\n <Cell\n colSpan={12}\n colStart={1}\n key={`collage-1-${String(i)}`}\n overflow=\"hidden\"\n rowSpan={8}\n rowStart={1}\n variant=\"frame\"\n >\n {image}\n </Cell>\n ))}\n </Grid>\n )\n}\nCollage.Featured = CollageFeatured\nCollage.Image = CollageImage\n\n// ── QuoteWithMedia ─────────────────────────────────────────────────────────\n// Large quote on the left + supporting media on the right.\n\nfunction QuoteWithMediaQuote({ text, attribution }: { text: string; attribution?: string }) {\n return (\n <div className=\"flex h-full items-center\">\n <Quote attribution={attribution}>{text}</Quote>\n </div>\n )\n}\n\nfunction QuoteWithMediaMedia({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nexport function QuoteWithMedia({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const quoteSlot = findSlots(children, QuoteWithMediaQuote).at(0)\n const mediaSlot = findSlots(children, QuoteWithMediaMedia).at(0)\n\n return (\n <Grid cols={12} label={label} rows={1} title={title}>\n <Cell colSpan={6} colStart={1} rowSpan={1} rowStart={1}>\n {quoteSlot}\n </Cell>\n <Cell colSpan={6} colStart={7} overflow=\"hidden\" padding=\"none\" rowSpan={1} rowStart={1}>\n {mediaSlot}\n </Cell>\n </Grid>\n )\n}\nQuoteWithMedia.Quote = QuoteWithMediaQuote\nQuoteWithMedia.Media = QuoteWithMediaMedia\n\n// ── SplitWithStat ──────────────────────────────────────────────────────────\n// Text + media side-by-side (top 3/4) with a stat strip below (bottom 1/4).\n// Stats use the `rule` variant so the strip reads as a form row, not a\n// row of cards.\n\nfunction SplitWithStatText({\n title: cellTitle,\n body,\n bullets,\n}: {\n title: string\n body?: ReactNode\n bullets?: string[]\n}) {\n return (\n <Stack gap=\"md\" justify=\"center\">\n <Subtitle color=\"default\">{cellTitle}</Subtitle>\n {body && <Body>{body}</Body>}\n {bullets && bullets.length > 0 && (\n <List marker=\"dash\">\n {bullets.map(item => (\n <Item key={item}>{item}</Item>\n ))}\n </List>\n )}\n </Stack>\n )\n}\n\nfunction SplitWithStatMedia({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nfunction SplitWithStatStat({ value, label }: { value: string; label: string }) {\n return (\n <Stack align=\"start\" gap=\"xs\" justify=\"start\">\n <Display color=\"default\" size=\"sm\" weight=\"light\">\n {value}\n </Display>\n <Label>{label}</Label>\n </Stack>\n )\n}\n\nexport function SplitWithStat({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const textSlot = findSlots(children, SplitWithStatText).at(0)\n const mediaSlot = findSlots(children, SplitWithStatMedia).at(0)\n const statSlots = findSlots(children, SplitWithStatStat).slice(0, 4)\n\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={6} colStart={1} padding=\"none\" rowSpan={6} rowStart={1}>\n {textSlot}\n </Cell>\n <Cell colSpan={6} colStart={7} overflow=\"hidden\" padding=\"none\" rowSpan={6} rowStart={1}>\n {mediaSlot}\n </Cell>\n {statSlots.map((stat, i) => (\n <Cell\n colSpan={3}\n colStart={i * 3 + 1}\n key={`split-stat-${String(i)}`}\n padding=\"sm\"\n rowSpan={2}\n rowStart={7}\n variant=\"rule\"\n >\n {stat}\n </Cell>\n ))}\n </Grid>\n )\n}\nSplitWithStat.Text = SplitWithStatText\nSplitWithStat.Media = SplitWithStatMedia\nSplitWithStat.Stat = SplitWithStatStat\n\n// ── TextLead ───────────────────────────────────────────────────────────────\n// Single big text block with an optional supporting media row.\n\nfunction TextLeadText({\n title: cellTitle,\n body,\n bullets,\n}: {\n title?: string\n body?: ReactNode\n bullets?: string[]\n}) {\n return (\n <Stack className=\"min-h-0 max-w-[960px] flex-1\" gap=\"md\" justify=\"center\">\n {cellTitle && <Subtitle color=\"default\">{cellTitle}</Subtitle>}\n {body && <Body size=\"lg\">{body}</Body>}\n {bullets && bullets.length > 0 && (\n <List marker=\"dash\">\n {bullets.map(item => (\n <Item key={item}>{item}</Item>\n ))}\n </List>\n )}\n </Stack>\n )\n}\n\nfunction TextLeadMedia({ src, alt = '' }: { src: string; alt?: string }) {\n return <BentoMedia alt={alt} src={src} />\n}\n\nexport function TextLead({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const textSlot = findSlots(children, TextLeadText).at(0)\n const mediaSlots = findSlots(children, TextLeadMedia).slice(0, 3)\n const mediaCount = mediaSlots.length\n\n if (mediaCount === 0) {\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={12} colStart={1} padding=\"none\" rowSpan={8} rowStart={1}>\n {textSlot}\n </Cell>\n </Grid>\n )\n }\n\n if (mediaCount === 1) {\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={7} colStart={1} padding=\"none\" rowSpan={8} rowStart={1}>\n {textSlot}\n </Cell>\n <Cell colSpan={5} colStart={8} overflow=\"hidden\" padding=\"none\" rowSpan={8} rowStart={1}>\n {mediaSlots[0]}\n </Cell>\n </Grid>\n )\n }\n\n const mediaColSpan = mediaCount === 2 ? 6 : 4\n return (\n <Grid cols={12} label={label} rows={8} title={title}>\n <Cell colSpan={12} colStart={1} padding=\"none\" rowSpan={5} rowStart={1}>\n {textSlot}\n </Cell>\n {mediaSlots.map((media, i) => (\n <Cell\n colSpan={mediaColSpan}\n colStart={i * mediaColSpan + 1}\n key={`text-lead-media-${String(i)}`}\n overflow=\"hidden\"\n padding=\"none\"\n rowSpan={3}\n rowStart={6}\n >\n {media}\n </Cell>\n ))}\n </Grid>\n )\n}\nTextLead.Text = TextLeadText\nTextLead.Media = TextLeadMedia\n\n// ── TimelineBento ──────────────────────────────────────────────────────────\n// Text intro + chronological row of 3 steps. Every cell shares the same\n// architecture: a leading glyph at Display sm (72px) — a step numeral\n// on phases, an em-dash on the intro — then the title and body below\n// it. All four cells center their content vertically within the cell,\n// so short and tall stacks both sit on the same mid-line while the\n// leading glyphs line up as the dominant visual rhythm across the slide.\n\nfunction TimelineBentoIntro({ title: cellTitle, body }: { title: string; body?: ReactNode }) {\n return (\n <Stack className=\"min-h-0 flex-1\" gap=\"md\" justify=\"center\">\n <span\n aria-hidden=\"true\"\n className=\"font-light text-[calc(72px*var(--slide-type-scale,1))] text-foreground/30 leading-[0.85]\"\n >\n —\n </span>\n <Subtitle color=\"default\">{cellTitle}</Subtitle>\n {body && <Body size=\"sm\">{body}</Body>}\n </Stack>\n )\n}\n\nfunction TimelineBentoStep({\n step,\n title: cellTitle,\n body,\n}: {\n step?: string\n title: string\n body?: ReactNode\n}) {\n return (\n <Stack className=\"min-h-0 flex-1\" gap=\"md\" justify=\"center\">\n {step && (\n <Display color=\"default\" size=\"sm\" weight=\"light\">\n {step}\n </Display>\n )}\n <Subtitle>{cellTitle}</Subtitle>\n {body && <Body size=\"sm\">{body}</Body>}\n </Stack>\n )\n}\n\nexport function TimelineBento({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const introSlot = findSlots(children, TimelineBentoIntro).at(0)\n const stepSlots = findSlots(children, TimelineBentoStep).slice(0, 3)\n\n // Cells use variant=\"none\" — the per-cell top hairline would compete\n // with the Grid masthead rule up top and the slide-frame chrome, and\n // in a timeline the leading Display numeral is already the strongest\n // signal of \"new column\". The grid column gutters supply all the\n // separation the row needs.\n return (\n <Grid cols={12} label={label} rows={1} title={title}>\n <Cell colSpan={3} colStart={1} padding=\"none\" rowSpan={1} rowStart={1}>\n {introSlot}\n </Cell>\n {stepSlots.map((step, i) => (\n <Cell\n colSpan={3}\n colStart={4 + i * 3}\n key={`timeline-step-${String(i)}`}\n padding=\"none\"\n rowSpan={1}\n rowStart={1}\n >\n {step}\n </Cell>\n ))}\n </Grid>\n )\n}\nTimelineBento.Intro = TimelineBentoIntro\nTimelineBento.Step = TimelineBentoStep\n\n// ── FullBleedGallery ───────────────────────────────────────────────────────\n// Edge-to-edge image grid that bypasses the slide content padding.\n// Each cell fills with object-cover. Optional label/title text renders as a\n// solid black plate in the top-left — no frosted glass.\n\nfunction FullBleedGalleryImage({ src, alt = '' }: { src: string; alt?: string }) {\n if (isVideo(src)) {\n return (\n <video autoPlay className=\"size-full object-cover\" loop muted playsInline>\n <source src={src} />\n <track kind=\"captions\" label={alt || 'Slide media'} />\n </video>\n )\n }\n return <img alt={alt} className=\"size-full object-cover\" height={1080} src={src} width={1920} />\n}\n\nexport function FullBleedGallery({\n children,\n label,\n title,\n}: {\n children: ReactNode\n label?: string\n title?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const imageSlots = findSlots(children, FullBleedGalleryImage).slice(0, 6)\n const count = imageSlots.length\n\n const gridStyle =\n count === 2\n ? {\n gridTemplateColumns: '1fr 1fr',\n gridTemplateRows: '1fr',\n }\n : count === 3\n ? {\n gridTemplateColumns: 'repeat(3, 1fr)',\n gridTemplateRows: '1fr',\n }\n : count === 4\n ? {\n gridTemplateColumns: '1fr 1fr',\n gridTemplateRows: '1fr 1fr',\n }\n : {\n gridTemplateColumns: 'repeat(3, 1fr)',\n gridTemplateRows: '1fr 1fr',\n }\n\n const hasOverlay = Boolean(label || title)\n\n return (\n <div className=\"absolute inset-0\">\n <div className=\"grid size-full gap-1 p-1\" style={gridStyle}>\n {imageSlots.map((image, i) => (\n <div\n className=\"relative overflow-hidden bg-muted/20\"\n key={`full-bleed-gallery-${String(i)}`}\n >\n {image}\n </div>\n ))}\n </div>\n\n {hasOverlay && (\n <div className=\"absolute top-8 left-8 max-w-[60%] bg-black px-8 py-6 text-white\">\n <Stack gap=\"xs\">\n {label && (\n <Label color=\"inherit\">\n <span className=\"text-white/70\">{label}</span>\n </Label>\n )}\n {title && (\n <Title color=\"inherit\">\n <span className=\"text-white\">{title}</span>\n </Title>\n )}\n </Stack>\n </div>\n )}\n </div>\n )\n}\nFullBleedGallery.Image = FullBleedGalleryImage\n\n// =============================================================================\n// IMAGE-ONLY TEMPLATES\n// =============================================================================\n\nfunction ImageCaption({ text }: { text: string }) {\n return (\n <div className=\"absolute right-0 bottom-0 left-0 bg-black/60 px-10 py-5 backdrop-blur-lh\">\n <Label color=\"inherit\">\n <span className=\"text-white/80\">{text}</span>\n </Label>\n </div>\n )\n}\n\nfunction ImageCell({ src, alt }: { src: string; alt: string }) {\n if (isVideo(src)) {\n return (\n <video autoPlay className=\"size-full object-cover\" loop muted playsInline>\n <source src={src} />\n <track kind=\"captions\" label={alt || 'Slide media'} />\n </video>\n )\n }\n return <img alt={alt} className=\"size-full object-cover\" height={1080} src={src} width={1920} />\n}\n\n/**\n * Single full-bleed image. Use when the visual is the entire message.\n * Optional caption renders as a translucent bottom bar.\n */\nexport function ImageSlide({\n src,\n alt = '',\n caption,\n}: {\n src: string\n alt?: string\n /** Short descriptor — renders as a translucent bottom bar. */\n caption?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div className=\"absolute inset-0 overflow-hidden\">\n <ImageCell alt={alt} src={src} />\n {caption && <ImageCaption text={caption} />}\n </div>\n )\n}\n\n/**\n * Two images side by side, equal width, full bleed.\n * A hairline gap separates the panels — editorial column rule.\n */\nexport function ImageDuoSlide({\n left,\n right,\n caption,\n}: {\n left: { src: string; alt?: string }\n right: { src: string; alt?: string }\n /** Short descriptor — renders as a translucent bottom bar spanning both images. */\n caption?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n return (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"grid size-full grid-cols-2 gap-0.5\">\n <div className=\"overflow-hidden\">\n <ImageCell alt={left.alt ?? ''} src={left.src} />\n </div>\n <div className=\"overflow-hidden\">\n <ImageCell alt={right.alt ?? ''} src={right.src} />\n </div>\n </div>\n {caption && <ImageCaption text={caption} />}\n </div>\n )\n}\n\n/**\n * Three images in equal columns, full bleed.\n * Accepts 2–3 images; fewer than 3 leaves remaining columns as a muted placeholder.\n */\nexport function ImageTrioSlide({\n images,\n caption,\n}: {\n images: { src: string; alt?: string }[]\n /** Short descriptor — renders as a translucent bottom bar spanning all columns. */\n caption?: string\n}) {\n const mode = useSlideRenderMode()\n if (mode === 'web-syllabus') return null\n const slots = images.slice(0, 3)\n return (\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"grid size-full grid-cols-3 gap-0.5\">\n {slots.map((img, i) => (\n <div className=\"overflow-hidden\" key={`trio-${String(i)}`}>\n <ImageCell alt={img.alt ?? ''} src={img.src} />\n </div>\n ))}\n {slots.length < 3 &&\n Array.from({ length: 3 - slots.length }).map((_, i) => (\n <div className=\"bg-muted/20\" key={`trio-empty-${String(i)}`} />\n ))}\n </div>\n {caption && <ImageCaption text={caption} />}\n </div>\n )\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * MDX STYLES - Consolidated style definitions\n * Extracted to separate file to avoid circular dependencies\n *\n * IMPORTANT: Two styling paths exist for MDX elements:\n *\n * 1. Component mapping (mdxComponents) — applies to markdown syntax (e.g. ![alt](src))\n * and lowercase HTML tags that MDX routes through the provider. Styles live in\n * `mdxStyles.content.*` and are applied via `cn()` in each component.\n *\n * 2. Root selectors (below) — apply to raw JSX written directly in MDX files\n * (e.g. <figure><video ... /></figure>). These bypass the component mapping,\n * so styles must be applied via descendant selectors on the root wrapper.\n *\n * When changing spacing/styles for media or figures, update BOTH paths or the\n * styling will be inconsistent between markdown syntax and raw JSX usage.\n */\n\nexport const mdxStyles = {\n // wrapper you put around MDX content container (highly recommended)\n // Note: .not-mdx, .example-container, and .component-preview will opt-out of all typography styles\n root: [\n 'mdx text-foreground',\n // Raw JSX figures bypass component mapping — must style via root selectors\n '[&_figure]:my-8 [&_figure:first-child]:mt-0 [&_figure:last-child]:mb-0 sm:[&_figure]:my-10',\n '[&_figure>video]:mt-0 [&_figure>video]:w-full [&_figure>video]:rounded-lg [&_figure>video]:border [&_figure>video]:border-border',\n '[&_figure>img]:mt-0 [&_figure>img]:w-full [&_figure>img]:rounded-lg',\n '[&_figure>iframe]:w-full [&_figure>iframe]:rounded-lg [&_figure>iframe]:border [&_figure>iframe]:border-border',\n '[&_figure>figcaption]:mt-3 [&_figure>figcaption]:text-center [&_figure>figcaption]:text-sm [&_figure>figcaption]:text-muted-foreground [&_figure>figcaption]:leading-relaxed',\n // Reset only the live demo wrapper; rendered components keep their own internal rhythm.\n '[&_.example-container_.not-mdx]:!m-0',\n '[&_.not-mdx:not(.example-container):not(.callout):not(.mdx-page-meta):not(.mdx-page-nav):not([data-media])]:!m-0',\n '[&_.not-mdx>a]:!no-underline',\n '[&>.callout+.callout]:mt-4',\n '[&_.foundation-preview_p]:!m-0 [&_.foundation-preview_p]:![font-size:unset] [&_.foundation-preview_p]:![line-height:unset]',\n // .example-container — MDX typography is suppressed via React Context (useMdxStyle hook),\n // so no CSS overrides are needed here. Components inside control their own styles.\n ].join(' '),\n\n spacing: {\n component: 'my-5 first:mt-0 last:mb-0',\n media: 'my-8 first:mt-0 last:mb-0 sm:my-10',\n mediaLg: 'my-12 first:mt-0 last:mb-0 sm:my-16',\n mediaSm: 'my-6 first:mt-0 last:mb-0',\n },\n\n headings: {\n h1: 'text-4xl font-semibold tracking-tight scroll-mt-24 mt-10 first:mt-0 sm:text-5xl',\n h2: 'text-2xl font-semibold tracking-tight scroll-mt-24 mt-10 first:mt-0 sm:text-3xl',\n h3: 'text-xl font-semibold tracking-tight scroll-mt-24 mt-8 first:mt-0 sm:text-2xl',\n h4: 'text-lg font-semibold tracking-tight scroll-mt-24 mt-6 first:mt-0',\n h5: 'text-base font-semibold scroll-mt-24 mt-6 first:mt-0',\n h6: 'text-sm font-semibold text-secondary-foreground scroll-mt-24 mt-6 first:mt-0',\n },\n\n text: {\n paragraph:\n 'text-base text-secondary-foreground leading-relaxed mt-4 first:mt-0 last:mb-0 [&_a]:underline [&_a]:underline-offset-4',\n lead: 'text-lg text-secondary-foreground leading-relaxed mt-4 first:mt-0',\n small: 'text-sm text-secondary-foreground leading-relaxed',\n },\n\n content: {\n // links\n link: 'font-normal underline underline-offset-4 decoration-2 decoration-foreground/30 hover:decoration-foreground/70 transition-colors',\n\n // emphasis\n strong: 'font-semibold text-foreground',\n em: 'italic',\n del: 'line-through text-secondary-foreground',\n ins: 'underline decoration-green-500/70',\n\n // inline code\n inlineCode:\n 'rounded-xs bg-muted/50 px-1 py-0.5 font-mono text-xs leading-snug font-medium text-foreground ring-[0.5px] ring-inset ring-accent',\n\n // code blocks (pre)\n pre: 'overflow-x-auto rounded-lg border border-border bg-card p-4 text-sm leading-relaxed [&_code]:bg-transparent [&_code]:border-0 [&_code]:p-0 [&_code]:font-normal [&_code]:leading-relaxed [&_code]:ring-0 [&_code]:text-sm',\n code: 'font-mono text-sm leading-relaxed font-normal', // used inside <pre><code>\n\n // blockquote\n blockquote:\n 'mt-6 border-l-4 border-border bg-muted/50 px-4 py-3 text-base italic text-secondary-foreground rounded-r [&_p]:mt-2 [&_p:first-child]:mt-0',\n\n // lists\n ul: 'mt-4 list-disc space-y-2 pl-4 [&_ul]:mt-2 [&_ul]:space-y-2 [&_ul]:pl-4 [&_a]:underline [&_a]:underline-offset-4',\n ol: 'mt-4 list-decimal space-y-2 pl-4 [&_ol]:mt-2 [&_ol]:space-y-2 [&_ol]:pl-4 [&_a]:underline [&_a]:underline-offset-4',\n li: 'text-base leading-relaxed text-secondary-foreground',\n\n // hr\n hr: 'my-8 border-t border-border sm:my-10',\n\n // kbd\n kbd: 'inline-flex h-6 select-none items-center gap-1 rounded-lg border border-border bg-muted px-2 font-mono text-xs font-medium text-secondary-foreground',\n\n // tables (wrap recommended)\n tableWrapper:\n 'mdx-table-wrapper mt-6 w-full overflow-x-auto rounded-lg border border-border bg-background sm:mt-8',\n table: 'w-full border-collapse text-sm [&_code]:text-xs',\n thead: 'bg-muted',\n tbody: '[&_tr:last-child]:border-0',\n tr: 'border-b border-border hover:bg-muted/40 transition-colors',\n th: 'h-9 px-3 text-left align-middle font-semibold text-foreground',\n td: 'px-3 py-2 align-middle text-secondary-foreground',\n caption: 'mt-3 text-xs text-secondary-foreground',\n\n // media — vertical rhythm aligned with spacing.media / mediaLg tokens\n img: 'my-8 rounded-lg first:mt-0 last:mb-0 sm:my-10',\n figure: 'my-8 first:mt-0 last:mb-0 sm:my-10',\n figcaption: 'mt-3 text-center text-sm text-muted-foreground leading-relaxed',\n iframe: 'my-8 first:mt-0 last:mb-0 w-full rounded-lg border border-border sm:my-10',\n video: 'my-8 first:mt-0 last:mb-0 w-full rounded-lg border border-border sm:my-10',\n audio: 'my-8 first:mt-0 last:mb-0 w-full sm:my-10',\n\n // details/summary\n details:\n 'mt-6 rounded-lg border border-border bg-card p-4 [&>*:first-child:not(summary)]:mt-0 [&>summary+*]:mt-3',\n summary:\n 'cursor-pointer select-none font-semibold text-foreground [&::-webkit-details-marker]:hidden',\n\n // misc semantics\n mark: 'rounded-sm bg-yellow-200 px-1 text-foreground dark:bg-yellow-800/60',\n sub: 'text-xs align-sub',\n sup: 'text-xs align-super',\n abbr: 'cursor-help border-b border-dotted border-secondary-foreground',\n cite: 'italic text-secondary-foreground',\n dfn: 'font-semibold',\n time: 'text-secondary-foreground',\n var: 'font-mono italic',\n samp: 'rounded-lg bg-muted px-1 font-mono text-xs',\n output: 'rounded-lg border border-border bg-muted px-2 py-1 font-mono text-xs',\n },\n\n layout: {\n callout: {\n base: 'my-4 rounded-lg border p-4 first:mt-0 last:mb-0 sm:my-5 [&_p]:mt-2 [&_p]:text-base [&_p]:leading-relaxed [&_p:first-child]:mt-0',\n info: 'border-blue-500/40 bg-blue-50/60 text-blue-950 dark:border-blue-500/40 dark:bg-blue-950/40 dark:text-blue-50',\n warning:\n 'border-yellow-500/40 bg-yellow-50/60 text-yellow-950 dark:border-yellow-500/40 dark:bg-yellow-950/40 dark:text-yellow-50',\n error:\n 'border-red-500/40 bg-red-50/60 text-red-950 dark:border-red-500/40 dark:bg-red-950/40 dark:text-red-50',\n success:\n 'border-green-500/40 bg-green-50/60 text-green-950 dark:border-green-500/40 dark:bg-green-950/40 dark:text-green-50',\n },\n },\n} as const\n\nexport type CalloutType = 'info' | 'warning' | 'error' | 'success'\n","/**\n * Vendored lightweight MDX prose components for @atom63/slides.\n *\n * Intentionally excludes: mermaid diagrams, photoswipe/lightbox, shiki syntax\n * highlighting, CopyButton, @atom63/ui, @atom63/mdx. Plain styled HTML only.\n *\n * Generated as part of the slides/@atom63/mdx decoupling (issue context: slides-decouple).\n */\n\nimport type { ComponentProps } from 'react'\nimport { cn } from '../lib/cn'\nimport { mdxStyles } from './mdx-styles'\n\n// ---------------------------------------------------------------------------\n// Headings\n// ---------------------------------------------------------------------------\n\nfunction Heading1({ className, ...props }: ComponentProps<'h1'>) {\n return <h1 className={cn(mdxStyles.headings.h1, className)} {...props} />\n}\n\nfunction Heading2({ className, ...props }: ComponentProps<'h2'>) {\n return <h2 className={cn(mdxStyles.headings.h2, className)} {...props} />\n}\n\nfunction Heading3({ className, ...props }: ComponentProps<'h3'>) {\n return <h3 className={cn(mdxStyles.headings.h3, className)} {...props} />\n}\n\nfunction Heading4({ className, ...props }: ComponentProps<'h4'>) {\n return <h4 className={cn(mdxStyles.headings.h4, className)} {...props} />\n}\n\nfunction Heading5({ className, ...props }: ComponentProps<'h5'>) {\n return <h5 className={cn(mdxStyles.headings.h5, className)} {...props} />\n}\n\nfunction Heading6({ className, ...props }: ComponentProps<'h6'>) {\n return <h6 className={cn(mdxStyles.headings.h6, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Text / paragraph\n// ---------------------------------------------------------------------------\n\nfunction Paragraph({ className, ...props }: ComponentProps<'p'>) {\n return <p className={cn(mdxStyles.text.paragraph, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nfunction UnorderedList({ className, ...props }: ComponentProps<'ul'>) {\n return <ul className={cn(mdxStyles.content.ul, className)} {...props} />\n}\n\nfunction OrderedList({ className, ...props }: ComponentProps<'ol'>) {\n return <ol className={cn(mdxStyles.content.ol, className)} {...props} />\n}\n\nfunction ListItem({ className, ...props }: ComponentProps<'li'>) {\n return <li className={cn(mdxStyles.content.li, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Blockquote\n// ---------------------------------------------------------------------------\n\nfunction Blockquote({ className, ...props }: ComponentProps<'blockquote'>) {\n return <blockquote className={cn(mdxStyles.content.blockquote, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Inline elements\n// ---------------------------------------------------------------------------\n\nfunction Anchor({ className, href, target, rel, children, ...props }: ComponentProps<'a'>) {\n const isExternal = typeof href === 'string' && href.startsWith('http')\n return (\n <a\n href={href}\n className={cn(mdxStyles.content.link, className)}\n target={isExternal ? (target ?? '_blank') : target}\n rel={isExternal ? (rel ? `${rel} noopener noreferrer` : 'noopener noreferrer') : rel}\n {...props}\n >\n {children}\n </a>\n )\n}\n\nfunction Strong({ className, ...props }: ComponentProps<'strong'>) {\n return <strong className={cn(mdxStyles.content.strong, className)} {...props} />\n}\n\nfunction Em({ className, ...props }: ComponentProps<'em'>) {\n return <em className={cn(mdxStyles.content.em, className)} {...props} />\n}\n\nfunction Del({ className, ...props }: ComponentProps<'del'>) {\n return <del className={cn(mdxStyles.content.del, className)} {...props} />\n}\n\nfunction Ins({ className, ...props }: ComponentProps<'ins'>) {\n return <ins className={cn(mdxStyles.content.ins, className)} {...props} />\n}\n\nfunction Code({ className, ...props }: ComponentProps<'code'>) {\n const isBlock = className?.includes('language-')\n return <code className={cn(isBlock ? mdxStyles.content.code : mdxStyles.content.inlineCode, className)} {...props} />\n}\n\nfunction Kbd({ className, ...props }: ComponentProps<'kbd'>) {\n return <kbd className={cn(mdxStyles.content.kbd, className)} {...props} />\n}\n\nfunction Mark({ className, ...props }: ComponentProps<'mark'>) {\n return <mark className={cn(mdxStyles.content.mark, className)} {...props} />\n}\n\nfunction Sub({ className, ...props }: ComponentProps<'sub'>) {\n return <sub className={cn(mdxStyles.content.sub, className)} {...props} />\n}\n\nfunction Sup({ className, ...props }: ComponentProps<'sup'>) {\n return <sup className={cn(mdxStyles.content.sup, className)} {...props} />\n}\n\nfunction Abbr({ className, ...props }: ComponentProps<'abbr'>) {\n return <abbr className={cn(mdxStyles.content.abbr, className)} {...props} />\n}\n\nfunction Cite({ className, ...props }: ComponentProps<'cite'>) {\n return <cite className={cn(mdxStyles.content.cite, className)} {...props} />\n}\n\nfunction Dfn({ className, ...props }: ComponentProps<'dfn'>) {\n return <dfn className={cn(mdxStyles.content.dfn, className)} {...props} />\n}\n\nfunction Time({ className, ...props }: ComponentProps<'time'>) {\n return <time className={cn(mdxStyles.content.time, className)} {...props} />\n}\n\nfunction Var({ className, ...props }: ComponentProps<'var'>) {\n return <var className={cn(mdxStyles.content.var, className)} {...props} />\n}\n\nfunction Samp({ className, ...props }: ComponentProps<'samp'>) {\n return <samp className={cn(mdxStyles.content.samp, className)} {...props} />\n}\n\nfunction Output({ className, ...props }: ComponentProps<'output'>) {\n return <output className={cn(mdxStyles.content.output, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Details / summary\n// ---------------------------------------------------------------------------\n\nfunction Details({ className, ...props }: ComponentProps<'details'>) {\n return <details className={cn(mdxStyles.content.details, className)} {...props} />\n}\n\nfunction Summary({ className, ...props }: ComponentProps<'summary'>) {\n return <summary className={cn(mdxStyles.content.summary, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Media elements\n// ---------------------------------------------------------------------------\n\nfunction Iframe({ className, ...props }: ComponentProps<'iframe'>) {\n return <iframe className={cn(mdxStyles.content.iframe, className)} {...props} />\n}\n\nfunction Video({ className, ...props }: ComponentProps<'video'>) {\n return <video className={cn(mdxStyles.content.video, className)} {...props} />\n}\n\nfunction Audio({ className, ...props }: ComponentProps<'audio'>) {\n return <audio className={cn(mdxStyles.content.audio, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Code block (pre + code — no syntax highlighting)\n// ---------------------------------------------------------------------------\n\nfunction Pre({ className, children, ...props }: ComponentProps<'pre'>) {\n return (\n <pre className={cn(mdxStyles.content.pre, className)} {...props}>\n {children}\n </pre>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Horizontal rule\n// ---------------------------------------------------------------------------\n\nfunction Hr({ className, ...props }: ComponentProps<'hr'>) {\n return <hr className={cn(mdxStyles.content.hr, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Image (plain — no lightbox)\n// ---------------------------------------------------------------------------\n\nfunction Img({ className, alt = '', ...props }: ComponentProps<'img'>) {\n // biome-ignore lint/correctness/useImageSize: MDX often omits dimensions; max-w-full preserves layout\n return <img alt={alt} className={cn(mdxStyles.content.img, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Tables (plain HTML — no @atom63/ui wrappers)\n// ---------------------------------------------------------------------------\n\nfunction TableEl({ className, ...props }: ComponentProps<'table'>) {\n return (\n <div className={mdxStyles.content.tableWrapper}>\n <table className={cn(mdxStyles.content.table, className)} {...props} />\n </div>\n )\n}\n\nfunction Thead({ className, ...props }: ComponentProps<'thead'>) {\n return <thead className={cn(mdxStyles.content.thead, className)} {...props} />\n}\n\nfunction Tbody({ className, ...props }: ComponentProps<'tbody'>) {\n return <tbody className={cn(mdxStyles.content.tbody, className)} {...props} />\n}\n\nfunction Tr({ className, ...props }: ComponentProps<'tr'>) {\n return <tr className={cn(mdxStyles.content.tr, className)} {...props} />\n}\n\nfunction Th({ className, ...props }: ComponentProps<'th'>) {\n return <th className={cn(mdxStyles.content.th, className)} {...props} />\n}\n\nfunction Td({ className, ...props }: ComponentProps<'td'>) {\n return <td className={cn(mdxStyles.content.td, className)} {...props} />\n}\n\nfunction Caption({ className, ...props }: ComponentProps<'caption'>) {\n return <caption className={cn(mdxStyles.content.caption, className)} {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const mdxComponents = {\n h1: Heading1,\n h2: Heading2,\n h3: Heading3,\n h4: Heading4,\n h5: Heading5,\n h6: Heading6,\n p: Paragraph,\n ul: UnorderedList,\n ol: OrderedList,\n li: ListItem,\n blockquote: Blockquote,\n a: Anchor,\n strong: Strong,\n em: Em,\n del: Del,\n ins: Ins,\n code: Code,\n kbd: Kbd,\n mark: Mark,\n sub: Sub,\n sup: Sup,\n abbr: Abbr,\n cite: Cite,\n dfn: Dfn,\n time: Time,\n var: Var,\n samp: Samp,\n output: Output,\n details: Details,\n summary: Summary,\n iframe: Iframe,\n video: Video,\n audio: Audio,\n pre: Pre,\n hr: Hr,\n img: Img,\n table: TableEl,\n thead: Thead,\n tbody: Tbody,\n tr: Tr,\n th: Th,\n td: Td,\n caption: Caption,\n}\n","import { mdxComponents } from './vendored-mdx-components'\nimport { mdxStyles } from './mdx-styles'\nimport type { ReactNode } from 'react'\nimport { useContext } from 'react'\nimport {\n Caption,\n Divider as LegacyDivider,\n Overline,\n Section,\n Slide,\n SlideGrid,\n SlideImage,\n SlideNumber,\n SlideVideo,\n TalkTrack,\n} from './components'\nimport {\n Accent,\n Avatar,\n Badge,\n // Utility\n Bleed,\n Body,\n // Visual\n Box,\n Cell,\n Center,\n // Signal blocks\n ColorBlock,\n // Layout\n Columns,\n Demo,\n // Typography\n Display,\n Divider,\n // Editorial marks\n FigureMark,\n Fill,\n Grid,\n Headline,\n Highlight,\n Icon,\n // Media\n Image,\n InlineCode,\n Item,\n Label,\n // List\n List,\n Live,\n Mono,\n Position,\n Quote,\n Reveal,\n Row,\n SectionMarker,\n SlideCodeBlock,\n Spacer,\n Split,\n Stack,\n Subtitle,\n Title,\n Trio,\n Video,\n} from './primitives'\nimport { Syllabus, SyllabusContentContext } from './syllabus'\nimport {\n ClosingSlide,\n Collage,\n CoverSlide,\n FullBleedCoverSlide,\n FullBleedGallery,\n HeroBento,\n MediaTrio,\n QuoteSlide,\n QuoteWithMedia,\n SectionSlide,\n SplitHalf,\n SplitWithStat,\n StatBento,\n StatementSlide,\n TextLead,\n TimelineBento,\n} from './templates'\n\nfunction SlideBreak() {\n return <hr data-slide-break />\n}\nSlideBreak.displayName = 'SlideBreak'\n\n// Delegates raw markdown tags to typography primitives so there's a single\n// source of truth for type sizes. Authors can still use <Headline>, <Title>,\n// etc. explicitly in JSX; this just makes `# heading` and `- item` markdown\n// render with the same tokens.\n//\n// Inside <Syllabus>, SyllabusContentContext is true — each wrapper switches to\n// native HTML elements styled with mdxStyles tokens (web/article scale) instead\n// of slide-scale primitives. This removes the need for CSS !important resets.\nconst MarkdownHeading1 = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <h1 className={mdxStyles.headings.h1}>{children}</h1>\n ) : (\n <Headline>{children}</Headline>\n )\n}\nconst MarkdownHeading2 = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <h2 className={mdxStyles.headings.h2}>{children}</h2>\n ) : (\n <Title>{children}</Title>\n )\n}\nconst MarkdownHeading3 = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <h3 className={mdxStyles.headings.h3}>{children}</h3>\n ) : (\n <Subtitle color=\"default\">{children}</Subtitle>\n )\n}\nconst MarkdownParagraph = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <p className={mdxStyles.text.paragraph}>{children}</p>\n ) : (\n <div className=\"mt-[0.75em] first:mt-0\">{children}</div>\n )\n}\nconst MarkdownUnorderedList = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <ul className={mdxStyles.content.ul}>{children}</ul>\n ) : (\n <List marker=\"dash\">{children}</List>\n )\n}\nconst MarkdownOrderedList = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <ol className={mdxStyles.content.ol}>{children}</ol>\n ) : (\n <List marker=\"number\">{children}</List>\n )\n}\nconst MarkdownListItem = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? <li className={mdxStyles.content.li}>{children}</li> : <Item>{children}</Item>\n}\nconst MarkdownStrong = ({ children }: { children?: ReactNode }) => (\n <strong className=\"font-semibold text-foreground\">{children}</strong>\n)\nconst MarkdownInlineCode = ({ children }: { children?: ReactNode }) => (\n <code className=\"rounded bg-foreground/8 px-[0.35em] py-[0.1em] font-mono text-[0.85em] text-foreground/90\">\n {children}\n </code>\n)\nconst MarkdownBlockquote = ({ children }: { children?: ReactNode }) => {\n const inSyllabus = useContext(SyllabusContentContext)\n return inSyllabus ? (\n <blockquote className=\"my-4 rounded-sm bg-muted/40 px-4 py-3 text-base text-secondary-foreground italic leading-relaxed [&_p:first-child]:mt-0 [&_p]:mt-2\">\n {children}\n </blockquote>\n ) : (\n <blockquote className=\"relative max-w-[900px] text-pretty font-instrument-serif text-3xl text-foreground/80 italic leading-normal\">\n {children}\n </blockquote>\n )\n}\n// rehype-pretty-code wraps <pre> in <figure data-rehype-pretty-code-figure>.\n// Strip the figure (it carries web prose margins) and route <pre> through\n// SlideCodeBlock so font sizes scale with --slide-type-scale.\nconst MarkdownFigure = ({ children }: { children?: ReactNode }) => <>{children}</>\nconst MarkdownPre = ({\n children,\n ...props\n}: React.HTMLAttributes<HTMLPreElement> & { 'data-language'?: string; 'data-theme'?: string }) => (\n <SlideCodeBlock dataTheme={props['data-theme']} language={props['data-language']}>\n {children}\n </SlideCodeBlock>\n)\n\nexport const slideMdxComponents = {\n ...mdxComponents,\n\n // Markdown tag → typography primitive (single source of truth)\n h1: MarkdownHeading1,\n h2: MarkdownHeading2,\n h3: MarkdownHeading3,\n p: MarkdownParagraph,\n ul: MarkdownUnorderedList,\n ol: MarkdownOrderedList,\n li: MarkdownListItem,\n strong: MarkdownStrong,\n code: MarkdownInlineCode,\n blockquote: MarkdownBlockquote,\n figure: MarkdownFigure,\n pre: MarkdownPre,\n\n // Slide-specific components (legacy)\n hr: SlideBreak,\n TalkTrack,\n Syllabus,\n Slide,\n SlideImage,\n SlideVideo,\n SlideGrid,\n Overline,\n Caption,\n LegacyDivider,\n SlideNumber,\n Section,\n\n // Layout primitives\n Columns,\n Grid,\n Cell,\n Split,\n Trio,\n Stack,\n Row,\n Center,\n Spacer,\n\n // Typography primitives\n Display,\n Headline,\n Title,\n Subtitle,\n Body,\n Label,\n Accent,\n Mono,\n InlineCode,\n Quote,\n SlideCodeBlock,\n\n // Media primitives\n Image,\n Video,\n Icon,\n Avatar,\n\n // Visual primitives\n Box,\n Divider,\n Badge,\n Highlight,\n ColorBlock,\n FigureMark,\n SectionMarker,\n\n // List primitives\n List,\n Item,\n\n // Utility primitives\n Bleed,\n Fill,\n Demo,\n Live,\n Position,\n Reveal,\n\n // Template patterns (compose primitives)\n CoverSlide,\n FullBleedCoverSlide,\n QuoteSlide,\n SectionSlide,\n StatementSlide,\n SplitHalf,\n ClosingSlide,\n\n // Bento templates\n HeroBento,\n MediaTrio,\n StatBento,\n Collage,\n FullBleedGallery,\n QuoteWithMedia,\n SplitWithStat,\n TextLead,\n TimelineBento,\n}\n","import { mdxComponents } from './vendored-mdx-components'\nimport type { HTMLAttributes, ImgHTMLAttributes, ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\n/**\n * MDX component map for content inside `<Syllabus>` blocks.\n *\n * Spreads `mdxComponents` as the base (tables, code blocks with copy button,\n * links, kbd, strong, em, details/summary, images, etc.) and overrides only\n * what genuinely differs for a reading panel:\n * — Headings: document scale (mdxComponents uses text-5xl/3xl for article pages)\n * — Prose (p, ul, ol, li): serif body + compact rhythm\n * — Blockquote: reading-mode style\n * — img: compact vertical rhythm (my-4 vs my-10)\n * — Slide typography primitives → document-scale equivalents\n */\n\nconst syllabusBody = 'text-[0.9375rem] leading-[1.7] text-foreground/90'\n\n// =============================================================================\n// SLIDE PRIMITIVE → DOCUMENT-SCALE OVERRIDES\n// =============================================================================\n\nfunction SyllabusBody({ children }: { children?: ReactNode }) {\n return (\n <p className={cn(syllabusBody, 'my-3 text-pretty first:mt-0 last:mb-0 [&+&]:mt-2')}>\n {children}\n </p>\n )\n}\n\nfunction SyllabusHeadline({ children }: { children?: ReactNode }) {\n return (\n <h1 className=\"mt-6 mb-3 text-balance font-semibold text-2xl text-foreground tracking-tight first:mt-0 sm:text-[1.65rem]\">\n {children}\n </h1>\n )\n}\n\nfunction SyllabusTitle({ children }: { children?: ReactNode }) {\n return (\n <h2 className=\"mt-8 mb-3 text-balance font-semibold text-foreground text-xl tracking-tight sm:text-[1.35rem]\">\n {children}\n </h2>\n )\n}\n\nfunction SyllabusSubtitle({ children }: { children?: ReactNode }) {\n return (\n <h3 className=\"mt-6 mb-2 text-balance font-medium text-foreground text-lg tracking-tight\">\n {children}\n </h3>\n )\n}\n\nfunction SyllabusDisplay({ children }: { children?: ReactNode }) {\n return (\n <div className=\"my-4 text-balance font-light text-2xl text-foreground tabular-nums tracking-tight sm:text-3xl\">\n {children}\n </div>\n )\n}\n\nfunction SyllabusLabel({ children }: { children?: ReactNode }) {\n return (\n <span className=\"font-medium font-mono text-muted-foreground text-xs uppercase tracking-wider\">\n {children}\n </span>\n )\n}\n\nfunction SyllabusMono({ children }: { children?: ReactNode }) {\n return <span className=\"font-mono text-foreground/90 text-sm tabular-nums\">{children}</span>\n}\n\nfunction SyllabusAccent({ children }: { children?: ReactNode }) {\n return <span className=\"font-semibold text-primary\">{children}</span>\n}\n\ninterface SyllabusQuoteProps {\n attribution?: string\n children?: ReactNode\n decorated?: boolean\n size?: 'lg' | 'sm'\n}\n\nfunction SyllabusQuote({ children, attribution }: SyllabusQuoteProps) {\n return (\n <blockquote className=\"my-6 border-foreground/20 border-l-2 pl-4\">\n <p className=\"text-pretty text-foreground/90 text-lg italic leading-relaxed md:text-xl\">\n {children}\n </p>\n {attribution ? (\n <footer className=\"mt-3 text-muted-foreground text-sm not-italic\">— {attribution}</footer>\n ) : null}\n </blockquote>\n )\n}\n\nconst listGap = { sm: 'space-y-1', md: 'space-y-1.5', lg: 'space-y-2' } as const\n\nfunction SyllabusList({\n children,\n marker = 'dash',\n gap = 'md',\n}: {\n children?: ReactNode\n gap?: keyof typeof listGap\n marker?: 'bullet' | 'dash' | 'none' | 'number'\n}) {\n const gapClass = listGap[gap] ?? listGap.md\n if (marker === 'none') {\n return <ul className={cn(syllabusBody, 'my-3 list-none pl-0', gapClass)}>{children}</ul>\n }\n if (marker === 'number') {\n return (\n <ol\n className={cn(\n syllabusBody,\n 'my-3 list-decimal pl-6',\n gapClass,\n 'marker:font-mono marker:text-muted-foreground/60 marker:text-sm marker:tabular-nums'\n )}\n >\n {children}\n </ol>\n )\n }\n return (\n <ul\n className={cn(syllabusBody, 'my-3 list-disc pl-6 marker:text-muted-foreground/60', gapClass)}\n >\n {children}\n </ul>\n )\n}\n\nfunction SyllabusItem({ children }: { children?: ReactNode }) {\n return <li className={cn(syllabusBody, '[&_p]:my-1')}>{children}</li>\n}\n\n// =============================================================================\n// COMPONENT MAP\n// =============================================================================\n\nexport const syllabusMdxComponents = {\n // All common HTML elements (tables, code blocks with copy button, links, kbd,\n // strong, em, details/summary, misc semantics, media) from the shared map.\n ...mdxComponents,\n\n // Headings: document scale — mdxComponents uses text-5xl/3xl for article pages,\n // and h6 adds a dropdown Icon that doesn't belong in a reading context.\n h1: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h1\n className=\"mt-6 mb-3 text-balance font-semibold text-2xl text-foreground tracking-tight first:mt-0 sm:text-[1.65rem]\"\n {...props}\n />\n ),\n h2: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h2\n className=\"mt-8 mb-3 text-balance font-semibold text-foreground text-xl tracking-tight sm:text-[1.35rem]\"\n {...props}\n />\n ),\n h3: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h3\n className=\"mt-6 mb-2 text-balance font-medium text-foreground text-lg tracking-tight\"\n {...props}\n />\n ),\n h4: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h4 className=\"mt-4 mb-2 text-pretty font-semibold text-base text-foreground\" {...props} />\n ),\n h5: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h5 className=\"mt-4 mb-2 font-semibold text-foreground text-sm\" {...props} />\n ),\n h6: (props: HTMLAttributes<HTMLHeadingElement>) => (\n <h6\n className=\"mt-3 mb-2 font-semibold text-foreground text-xs uppercase tracking-wide\"\n {...props}\n />\n ),\n\n // Prose: reading-scale body text.\n p: (props: HTMLAttributes<HTMLParagraphElement>) => (\n <p\n className={cn(syllabusBody, 'my-3 text-pretty first:mt-0 last:mb-0 [&+&]:mt-2')}\n {...props}\n />\n ),\n ul: (props: HTMLAttributes<HTMLUListElement>) => (\n <ul\n className={cn(\n syllabusBody,\n 'my-3 list-disc space-y-1.5 pl-6 marker:text-muted-foreground/60'\n )}\n {...props}\n />\n ),\n ol: (props: HTMLAttributes<HTMLOListElement>) => (\n <ol\n className={cn(\n syllabusBody,\n 'my-3 list-decimal space-y-1.5 pl-6 marker:font-mono marker:text-muted-foreground/60 marker:text-sm marker:tabular-nums'\n )}\n {...props}\n />\n ),\n li: (props: HTMLAttributes<HTMLLIElement>) => (\n <li className={cn(syllabusBody, '[&_p]:my-1')} {...props} />\n ),\n blockquote: (props: HTMLAttributes<HTMLElement>) => (\n <blockquote\n className={cn(\n syllabusBody,\n 'my-4 border-foreground/20 border-l-2 pl-4 text-muted-foreground italic'\n )}\n {...props}\n />\n ),\n\n // Image: compact vertical rhythm in a reading panel (my-4 vs my-10).\n img: ({ alt, className, ...props }: ImgHTMLAttributes<HTMLImageElement>) => (\n // biome-ignore lint/correctness/useImageSize: MDX often omits dimensions; max-w-full preserves layout\n <img\n alt={alt ?? ''}\n className={cn('my-4 h-auto max-w-full rounded-md border border-border/40', className)}\n {...props}\n />\n ),\n\n // Slide typography primitives → document-scale equivalents.\n Body: SyllabusBody,\n Headline: SyllabusHeadline,\n Title: SyllabusTitle,\n Subtitle: SyllabusSubtitle,\n Display: SyllabusDisplay,\n Label: SyllabusLabel,\n Mono: SyllabusMono,\n Accent: SyllabusAccent,\n Quote: SyllabusQuote,\n List: SyllabusList,\n Item: SyllabusItem,\n}\n","'use client'\n\nimport * as React from 'react'\n\nconst ButtonGroupContext = React.createContext(false)\n\nfunction ButtonGroupProvider({ children }: { children: React.ReactNode }) {\n return <ButtonGroupContext.Provider value={true}>{children}</ButtonGroupContext.Provider>\n}\n\nfunction useButtonGroupContext() {\n return React.useContext(ButtonGroupContext)\n}\n\nexport { ButtonGroupProvider, useButtonGroupContext }\n","export const focusVisibleThemeClassName =\n 'focus-visible:outline-solid focus-visible:[outline-color:var(--theme-focus-outline-color)] focus-visible:[outline-offset:var(--theme-focus-outline-offset)] focus-visible:[outline-width:var(--theme-focus-outline-width)] focus-visible:[box-shadow:var(--theme-focus-shadow)]'\n\nexport const hasFocusVisibleThemeClassName =\n 'has-focus-visible:outline-solid has-focus-visible:[outline-color:var(--theme-focus-outline-color)] has-focus-visible:[outline-offset:var(--theme-focus-outline-offset)] has-focus-visible:[outline-width:var(--theme-focus-outline-width)] has-focus-visible:[box-shadow:var(--theme-focus-shadow)]'\n","import type * as React from 'react'\n\nimport { Loader2 } from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\nexport function Spinner({ className, ...props }: React.ComponentProps<'svg'>): React.ReactElement {\n return (\n <Loader2\n aria-label=\"Loading\"\n className={cn('size-4 animate-spin motion-reduce:animate-none', className)}\n data-slot=\"spinner\"\n role=\"status\"\n {...props}\n />\n )\n}\n","'use client'\n\nimport { mergeProps } from '@base-ui/react/merge-props'\nimport { useRender } from '@base-ui/react/use-render'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { useButtonGroupContext } from './button-group-context'\nimport { cn } from '../../lib/cn'\nimport { focusVisibleThemeClassName } from './lib/theme-contract'\nimport { Spinner } from './spinner'\n\nconst primaryFilledVariant =\n '[--theme-button-active-background:color-mix(in_oklch,var(--primary)_90%,transparent)] [--theme-button-background:var(--primary)] [--theme-button-border-color:var(--primary)] [--theme-button-foreground:var(--primary-foreground)] [--theme-button-hover-background:color-mix(in_oklch,var(--primary)_90%,transparent)] [--theme-button-loading-foreground:var(--primary-foreground)]'\n\nconst buttonContractStyles =\n '[background:var(--theme-button-background)] text-(--theme-button-foreground) [border-color:var(--theme-button-border-color)] [box-shadow:var(--theme-button-shadow)] [text-shadow:var(--theme-button-text-shadow)] hover:[background:var(--theme-button-hover-background)] hover:[border-color:var(--theme-button-hover-border-color)] data-pressed:[background:var(--theme-button-active-background)] data-pressed:[border-color:var(--theme-button-active-border-color)] *:data-[slot=button-loading-indicator]:text-(--theme-button-loading-foreground)'\n\n/** Lucide/SVG + Material icon scale per button size (use `size` on MaterialIcon only to override). */\nconst buttonIconChildStyles =\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:[filter:var(--theme-button-icon-filter)] [&_svg:not([class*='opacity-'])]:opacity-80 [&_.material-symbols-rounded]:[filter:var(--theme-button-icon-filter)] [&_.material-symbols-rounded]:leading-none [&_.material-symbols-rounded]:shrink-0\"\n\nconst buttonMotionStyles =\n 'origin-center transform-gpu motion-safe:transition-[box-shadow,transform] motion-safe:duration-150 motion-safe:ease-out hover:[transform:scale(var(--button-hover-scale))_rotate(var(--button-hover-rotate))] active:[transform:scale(var(--button-tap-scale))_rotate(var(--button-tap-rotate))] data-pressed:[transform:scale(var(--button-tap-scale))_rotate(var(--button-tap-rotate))] motion-reduce:transform-none'\n\n/** Invisible coarse-pointer hit slop on ::before so ::after stays free for theme gel layers. */\nconst buttonCoarseHitTargetClassName =\n 'pointer-coarse:before:top-1/2 pointer-coarse:before:right-auto pointer-coarse:before:bottom-auto pointer-coarse:before:left-1/2 pointer-coarse:before:h-11 pointer-coarse:before:min-h-11 pointer-coarse:before:w-full pointer-coarse:before:min-w-11 pointer-coarse:before:max-w-none pointer-coarse:before:-translate-x-1/2 pointer-coarse:before:-translate-y-1/2'\n\nexport const buttonVariants = cva(\n `relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-[var(--button-radius)] border [--button-radius:var(--radius-lg)] [--theme-button-active-border-color:var(--theme-button-hover-border-color)] [--theme-button-active-background:var(--theme-button-hover-background)] [--theme-button-border-color:transparent] [--theme-button-hover-border-color:var(--theme-button-border-color)] [--theme-button-hover-background:var(--theme-button-background)] [--theme-button-icon-filter:none] [--theme-button-loading-foreground:var(--theme-button-foreground)] [--theme-button-shadow:var(--theme-control-shadow)] [--theme-button-text-shadow:none] [border-style:var(--theme-control-border-style)] [border-width:var(--theme-control-border-width)] font-medium text-base outline-none transition-shadow active:[background:var(--theme-button-active-background)] active:[border-color:var(--theme-button-active-border-color)] active:[border-style:var(--theme-control-active-border-style)] before:pointer-events-none before:absolute before:inset-0 before:rounded-[max(0px,calc(var(--button-radius)-var(--theme-control-border-width)))] ${buttonCoarseHitTargetClassName} focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 data-loading:select-none data-loading:text-transparent data-pressed:[border-style:var(--theme-control-active-border-style)] sm:text-sm [&_svg]:-mx-0.5 ${buttonContractStyles} ${focusVisibleThemeClassName} ${buttonIconChildStyles}`,\n {\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n variants: {\n size: {\n default:\n \"h-9 px-[calc(--spacing(3)-1px)] [--button-icon-font-size:1.125rem] sm:h-8 sm:[--button-icon-font-size:1rem] [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4\",\n icon: \"size-9 [--button-icon-font-size:1.125rem] sm:size-8 sm:[--button-icon-font-size:1rem] [&_svg]:mx-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4\",\n 'icon-lg':\n \"size-10 [--button-icon-font-size:1.25rem] sm:size-9 sm:[--button-icon-font-size:1.125rem] [&_svg]:mx-0 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n 'icon-sm':\n \"size-8 [--button-icon-font-size:1rem] sm:size-7 sm:[--button-icon-font-size:0.875rem] [&_svg]:mx-0 [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n 'icon-xl':\n \"size-11 [--button-icon-font-size:1.375rem] sm:size-10 sm:[--button-icon-font-size:1.25rem] [&_svg]:mx-0 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n 'icon-xs':\n \"size-7 [--button-radius:var(--radius-md)] [--button-icon-font-size:0.875rem] sm:size-6 sm:[--button-icon-font-size:0.875rem] [&_svg]:mx-0 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5\",\n lg: 'h-10 px-[calc(--spacing(3.5)-1px)] [--button-icon-font-size:1.125rem] sm:h-9 sm:[--button-icon-font-size:1rem]',\n sm: \"h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] [--button-icon-font-size:1rem] sm:h-7 sm:[--button-icon-font-size:0.875rem] [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n tile: \"h-auto min-h-20 w-full flex-col gap-1.5 whitespace-normal px-3 py-3 text-center [--button-icon-font-size:1.5rem] [&_svg:not([class*='size-'])]:size-6\",\n xl: \"h-11 px-[calc(--spacing(4)-1px)] text-lg [--button-icon-font-size:1.25rem] sm:h-10 sm:text-base sm:[--button-icon-font-size:1.125rem] [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n xs: \"h-7 gap-1 px-[calc(--spacing(2)-1px)] text-sm [--button-radius:var(--radius-md)] [--button-icon-font-size:0.875rem] sm:h-6 sm:text-xs sm:[--button-icon-font-size:0.875rem] [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n },\n variant: {\n default:\n '[--theme-button-active-background:color-mix(in_oklch,var(--foreground)_90%,transparent)] [--theme-button-background:var(--foreground)] [--theme-button-border-color:var(--foreground)] [--theme-button-foreground:var(--background)] [--theme-button-hover-background:color-mix(in_oklch,var(--foreground)_90%,transparent)] [--theme-button-loading-foreground:var(--background)]',\n primary: primaryFilledVariant,\n destructive:\n '[--theme-button-active-background:color-mix(in_oklch,var(--destructive)_90%,transparent)] [--theme-button-background:var(--destructive)] [--theme-button-border-color:var(--destructive)] [--theme-button-foreground:white] [--theme-button-hover-background:color-mix(in_oklch,var(--destructive)_90%,transparent)] [--theme-button-loading-foreground:white]',\n 'destructive-outline':\n '[--theme-button-active-background:color-mix(in_oklch,var(--destructive)_15%,transparent)] [--theme-button-active-border-color:color-mix(in_oklch,var(--destructive)_30%,transparent)] [--theme-button-background:color-mix(in_oklch,var(--destructive)_10%,transparent)] [--theme-button-border-color:color-mix(in_oklch,var(--destructive)_20%,transparent)] [--theme-button-foreground:var(--destructive)] [--theme-button-hover-background:color-mix(in_oklch,var(--destructive)_15%,transparent)] [--theme-button-hover-border-color:color-mix(in_oklch,var(--destructive)_30%,transparent)] [--theme-button-loading-foreground:var(--destructive)]',\n ghost:\n '[--theme-button-active-background:var(--accent)] [--theme-button-background:transparent] [--theme-button-border-color:transparent] [--theme-button-foreground:var(--foreground)] [--theme-button-hover-background:var(--accent)] [--theme-button-loading-foreground:var(--foreground)]',\n link: '[--theme-button-active-background:transparent] [--theme-button-background:transparent] [--theme-button-border-color:transparent] [--theme-button-foreground:var(--foreground)] [--theme-button-hover-background:transparent] [--theme-button-loading-foreground:var(--foreground)] underline-offset-4 hover:underline data-pressed:underline',\n outline:\n '[--theme-button-active-background:color-mix(in_oklch,var(--accent)_50%,transparent)] [--theme-button-background:var(--popover)] [--theme-button-border-color:var(--input)] [--theme-button-foreground:var(--foreground)] [--theme-button-hover-background:color-mix(in_oklch,var(--accent)_50%,transparent)] [--theme-button-loading-foreground:var(--foreground)] not-dark:bg-clip-padding dark:[--theme-button-active-background:color-mix(in_oklch,var(--input)_64%,transparent)] dark:[--theme-button-background:color-mix(in_oklch,var(--input)_32%,transparent)] dark:[--theme-button-hover-background:color-mix(in_oklch,var(--input)_64%,transparent)]',\n secondary:\n '[--theme-button-active-background:color-mix(in_oklch,var(--secondary)_80%,transparent)] [--theme-button-background:var(--secondary)] [--theme-button-border-color:transparent] [--theme-button-foreground:var(--secondary-foreground)] [--theme-button-hover-background:color-mix(in_oklch,var(--secondary)_90%,transparent)] [--theme-button-loading-foreground:var(--secondary-foreground)]',\n overlay:\n '[--theme-button-active-background:color-mix(in_oklch,var(--dark)_34%,transparent)] [--theme-button-active-border-color:color-mix(in_oklch,var(--light)_18%,transparent)] [--theme-button-background:color-mix(in_oklch,var(--dark)_26%,transparent)] [--theme-button-border-color:color-mix(in_oklch,var(--light)_14%,transparent)] [--theme-button-foreground:var(--light)] [--theme-button-hover-background:color-mix(in_oklch,var(--dark)_30%,transparent)] [--theme-button-hover-border-color:color-mix(in_oklch,var(--light)_22%,transparent)] [--theme-button-icon-filter:drop-shadow(0_1px_1px_color-mix(in_oklch,var(--dark)_64%,transparent))] [--theme-button-loading-foreground:var(--light)] [--theme-button-shadow:0_1px_3px_color-mix(in_oklch,var(--dark)_18%,transparent)] [--theme-button-text-shadow:0_1px_1px_color-mix(in_oklch,var(--dark)_64%,transparent)] backdrop-blur-md backdrop-saturate-125',\n glass:\n '[--theme-button-active-background:color-mix(in_oklch,var(--dark)_34%,transparent)] [--theme-button-active-border-color:color-mix(in_oklch,var(--light)_18%,transparent)] [--theme-button-background:color-mix(in_oklch,var(--dark)_26%,transparent)] [--theme-button-border-color:color-mix(in_oklch,var(--light)_14%,transparent)] [--theme-button-foreground:var(--light)] [--theme-button-hover-background:color-mix(in_oklch,var(--dark)_30%,transparent)] [--theme-button-hover-border-color:color-mix(in_oklch,var(--light)_22%,transparent)] [--theme-button-icon-filter:drop-shadow(0_1px_1px_color-mix(in_oklch,var(--dark)_64%,transparent))] [--theme-button-loading-foreground:var(--light)] [--theme-button-shadow:0_1px_3px_color-mix(in_oklch,var(--dark)_18%,transparent)] [--theme-button-text-shadow:0_1px_1px_color-mix(in_oklch,var(--dark)_64%,transparent)] backdrop-blur-md backdrop-saturate-125',\n },\n },\n }\n)\n\nexport interface ButtonProps extends useRender.ComponentProps<'button'> {\n 'data-slot'?: string\n variant?: VariantProps<typeof buttonVariants>['variant']\n size?: VariantProps<typeof buttonVariants>['size']\n loading?: boolean\n /** @deprecated Use `render` instead */\n asChild?: boolean\n withMotion?: boolean\n motionProps?: {\n hoverScale?: number\n tapScale?: number\n hoverRotate?: number\n tapRotate?: number\n }\n}\n\ntype ButtonMotionStyle = React.CSSProperties & {\n '--button-hover-scale'?: number\n '--button-tap-scale'?: number\n '--button-hover-rotate'?: string\n '--button-tap-rotate'?: string\n}\n\nexport function Button({\n className,\n variant,\n size,\n render,\n asChild = false,\n children,\n loading = false,\n disabled: disabledProp,\n withMotion,\n motionProps = {\n hoverScale: 1,\n tapScale: 0.98,\n hoverRotate: 0,\n tapRotate: 0,\n },\n 'data-slot': triggerSlot,\n style,\n ...props\n}: ButtonProps): React.ReactElement {\n const isInButtonGroup = useButtonGroupContext()\n const shouldUseMotion = withMotion ?? !isInButtonGroup\n const isDisabled = Boolean(loading || disabledProp)\n const resolvedRender =\n render ?? (asChild && React.isValidElement(children) ? children : undefined)\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>['type'] = resolvedRender\n ? undefined\n : 'button'\n const motionStyle: ButtonMotionStyle | undefined = shouldUseMotion\n ? {\n '--button-hover-rotate': `${motionProps.hoverRotate}deg`,\n '--button-hover-scale': motionProps.hoverScale,\n '--button-tap-rotate': `${motionProps.tapRotate}deg`,\n '--button-tap-scale': motionProps.tapScale,\n transformOrigin: 'center',\n ...style,\n }\n : style\n\n const defaultProps = {\n 'aria-disabled': loading || undefined,\n children: (\n <>\n {resolvedRender ? undefined : children}\n {loading ? (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inline-flex items-center justify-center\"\n data-slot=\"button-loading-indicator\"\n >\n <Spinner />\n </span>\n ) : null}\n </>\n ),\n className: cn(\n buttonVariants({ className, size, variant }),\n shouldUseMotion && buttonMotionStyles\n ),\n 'data-button': '',\n 'data-loading': loading ? '' : undefined,\n 'data-size': size ?? 'default',\n 'data-slot': 'button',\n 'data-trigger-slot': triggerSlot,\n 'data-variant': variant ?? 'default',\n disabled: isDisabled,\n style: motionStyle,\n type: typeValue,\n }\n\n return useRender({\n defaultTagName: 'button',\n props: mergeProps<'button'>(defaultProps, props),\n render: resolvedRender,\n })\n}\n","import { Separator as SeparatorPrimitive } from '@base-ui/react/separator'\nimport type React from 'react'\nimport { cn } from '../../lib/cn'\n\nconst separatorDefaultClassName =\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:not-[[class^='h-']]:not-[[class*='_h-']]:self-stretch\"\n\nfunction separatorGradientClassName(orientation: 'horizontal' | 'vertical'): string {\n if (orientation === 'vertical') {\n return 'w-px shrink-0 self-stretch bg-gradient-to-b from-transparent via-border/60 to-transparent'\n }\n return 'h-px w-full shrink-0 bg-gradient-to-r from-transparent via-border/60 to-transparent'\n}\n\nexport type SeparatorProps = SeparatorPrimitive.Props & {\n /** Solid border (default) or soft edge-to-edge gradient fade. */\n variant?: 'default' | 'gradient'\n}\n\nexport function Separator({\n className,\n orientation = 'horizontal',\n variant = 'default',\n ...props\n}: SeparatorProps): React.ReactElement {\n return (\n <SeparatorPrimitive\n className={cn(\n variant === 'gradient'\n ? separatorGradientClassName(orientation)\n : separatorDefaultClassName,\n className\n )}\n data-slot=\"separator\"\n data-variant={variant}\n orientation={orientation}\n {...props}\n />\n )\n}\n\nexport { SeparatorPrimitive }\n","import { mergeProps } from '@base-ui/react/merge-props'\nimport { useRender } from '@base-ui/react/use-render'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { ButtonGroupProvider } from './button-group-context'\nimport { cn } from '../../lib/cn'\nimport { Separator } from './separator'\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch overflow-hidden rounded-[var(--button-group-radius)] border-solid [--button-group-radius:var(--theme-button-group-radius,var(--radius-lg))] [--theme-button-group-background:transparent] [--theme-button-group-border-color:transparent] [--theme-button-group-border-width:0px] [--theme-button-group-separator-color:var(--input)] [--theme-button-group-shadow:none] [--theme-button-group-text-background:var(--muted)] [--theme-button-group-text-border-color:var(--input)] [--theme-button-group-text-foreground:var(--foreground)] [background:var(--theme-button-group-background)] [border-color:var(--theme-button-group-border-color)] [border-width:var(--theme-button-group-border-width)] [box-shadow:var(--theme-button-group-shadow)] *:focus-visible:relative *:focus-visible:z-[var(--z-layer-base)] has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-[var(--button-group-radius)] [&>[data-slot=button-group-text]]:rounded-[var(--button-group-radius)] [&>[data-button]]:h-full [&>[data-button]]:!rounded-[var(--button-group-radius)] [&>[data-button]]:[--button-radius:var(--button-group-radius)] [&>[data-button]]:before:!shadow-none [&>[data-slot=input-control]]:flex-1 [&>[data-slot=input-control]]:rounded-[var(--button-group-radius)] [&>[data-slot=input-control]]:!border-input [&>[data-slot=input-control]]:before:rounded-[inherit] [&>[data-slot=input-control]:has(:focus-visible)]:!ring-0 [&>[data-slot=input-control]:has(:focus-visible)]:!ring-offset-0 [&>[data-slot=input-control]>[data-slot=input]]:h-full [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n '[&>[data-slot]:has(~[data-slot])]:!rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:!rounded-r-[var(--button-group-radius)] [&>[data-slot]~[data-slot]]:!rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0 [&>[data-slot=input-control]:not(:last-child)]:rounded-r-none [&>[data-slot=input-control]:not(:first-child)]:rounded-l-none [&>[data-slot=input-control]:not(:first-child)]:border-l-0',\n vertical:\n 'flex-col [&>[data-slot]:has(~[data-slot])]:!rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:!rounded-b-[var(--button-group-radius)] [&>[data-slot]~[data-slot]]:!rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0 [&>[data-slot=input-control]:not(:last-child)]:rounded-b-none [&>[data-slot=input-control]:not(:first-child)]:rounded-t-none [&>[data-slot=input-control]:not(:first-child)]:border-t-0',\n },\n size: {\n default:\n '[&>[data-slot=button-group-text]]:h-9 [&>[data-button]]:h-9 [&>[data-slot=input-control]]:h-9 sm:[&>[data-slot=button-group-text]]:h-8 sm:[&>[data-button]]:h-8 sm:[&>[data-slot=input-control]]:h-8',\n icon: '[&>[data-button]]:size-9 [&>[data-slot=input-control]]:h-9 sm:[&>[data-button]]:size-8 sm:[&>[data-slot=input-control]]:h-8',\n 'icon-lg':\n '[&>[data-button]]:size-10 [&>[data-slot=input-control]]:h-10 sm:[&>[data-button]]:size-9 sm:[&>[data-slot=input-control]]:h-9',\n 'icon-sm':\n '[&>[data-button]]:size-8 [&>[data-slot=input-control]]:h-8 sm:[&>[data-button]]:size-7 sm:[&>[data-slot=input-control]]:h-7',\n 'icon-xl':\n '[&>[data-button]]:size-11 [&>[data-slot=input-control]]:h-11 sm:[&>[data-button]]:size-10 sm:[&>[data-slot=input-control]]:h-10',\n 'icon-xs':\n '[--button-group-radius:var(--radius-md)] [&>[data-button]]:size-7 [&>[data-slot=input-control]]:h-7 sm:[&>[data-button]]:size-6 sm:[&>[data-slot=input-control]]:h-6',\n lg: '[&>[data-slot=button-group-text]]:h-10 [&>[data-button]]:h-10 [&>[data-slot=input-control]]:h-10 sm:[&>[data-slot=button-group-text]]:h-9 sm:[&>[data-button]]:h-9 sm:[&>[data-slot=input-control]]:h-9',\n sm: '[&>[data-slot=button-group-text]]:h-8 [&>[data-button]]:h-8 [&>[data-slot=input-control]]:h-8 sm:[&>[data-slot=button-group-text]]:h-7 sm:[&>[data-button]]:h-7 sm:[&>[data-slot=input-control]]:h-7',\n xl: '[&>[data-slot=button-group-text]]:h-11 [&>[data-button]]:h-11 [&>[data-slot=input-control]]:h-11 sm:[&>[data-slot=button-group-text]]:h-10 sm:[&>[data-button]]:h-10 sm:[&>[data-slot=input-control]]:h-10',\n xs: '[--button-group-radius:var(--radius-md)] [&>[data-slot=button-group-text]]:h-7 [&>[data-button]]:h-7 [&>[data-slot=input-control]]:h-7 sm:[&>[data-slot=button-group-text]]:h-6 sm:[&>[data-button]]:h-6 sm:[&>[data-slot=input-control]]:h-6',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n size: 'default',\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n size,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof buttonGroupVariants>) {\n const resolvedOrientation = orientation ?? 'horizontal'\n const resolvedSize = size ?? 'default'\n\n return (\n <ButtonGroupProvider>\n <div\n data-slot=\"button-group\"\n data-orientation={resolvedOrientation}\n data-size={resolvedSize}\n className={cn(buttonGroupVariants({ orientation, size }), className)}\n {...props}\n />\n </ButtonGroupProvider>\n )\n}\n\nfunction ButtonGroupText({ className, render, ...props }: useRender.ComponentProps<'div'>) {\n return useRender({\n defaultTagName: 'div',\n props: mergeProps<'div'>(\n {\n className: cn(\n \"flex items-center gap-2 rounded-[var(--button-group-radius)] border border-input bg-muted px-2.5 text-sm font-medium [background:var(--theme-button-group-text-background,var(--muted))] [border-color:var(--theme-button-group-text-border-color,var(--input))] [color:var(--theme-button-group-text-foreground,var(--foreground))] [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n ),\n },\n props\n ),\n render,\n state: {\n slot: 'button-group-text',\n },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n 'relative z-[var(--z-layer-base)] shrink-0 [background:var(--theme-button-group-separator-color,var(--input))] data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-auto data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch',\n className\n )}\n {...props}\n />\n )\n}\n\nexport { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants }\n","import type * as React from 'react'\n\nimport { cn } from '../../lib/cn'\n\nfunction Kbd({ className, ...props }: React.ComponentProps<'kbd'>) {\n return (\n <kbd\n className={cn(\n \"pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm bg-muted in-data-[slot=tooltip-content]:bg-background/20 px-1 font-medium font-sans in-data-[slot=tooltip-content]:text-background text-muted-foreground text-xs dark:in-data-[slot=tooltip-content]:bg-background/10 [&_svg:not([class*='size-'])]:size-3\",\n className\n )}\n data-slot=\"kbd\"\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n className={cn('inline-flex items-center gap-1', className)}\n data-slot=\"kbd-group\"\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","'use client'\n\nimport type * as React from 'react'\n\nimport { cn } from '../../lib/cn'\n\nfunction Label({ className, ...props }: React.ComponentProps<'label'>) {\n return (\n <label\n className={cn(\n 'text-base flex select-none items-center gap-2 font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\n className\n )}\n data-slot=\"label\"\n {...props}\n />\n )\n}\n\nexport { Label }\n","'use client'\n\nimport { Tabs } from '@base-ui/react/tabs'\nimport type React from 'react'\nimport { cn } from '../../lib/cn'\nimport { focusVisibleThemeClassName } from './lib/theme-contract'\n\nexport interface SegmentControlItem {\n icon?: React.ReactNode\n label: string\n value: string\n}\n\nexport interface SegmentControlProps {\n activeVariant?: 'neutral' | 'primary'\n animateBackplate?: boolean\n className?: string\n items: SegmentControlItem[]\n onValueChange: (value: string) => void\n size?: 'default' | 'sm' | 'lg'\n tabClassName?: string\n value: string\n variant?: 'icon' | 'label'\n}\n\nexport function SegmentControl({\n activeVariant = 'neutral',\n animateBackplate = true,\n items,\n value,\n onValueChange,\n className,\n size = 'default',\n tabClassName,\n variant = 'icon',\n}: SegmentControlProps) {\n return (\n <Tabs.Root\n data-slot=\"segment-control\"\n onValueChange={newValue => {\n if (newValue && newValue !== value) {\n onValueChange(newValue as string)\n }\n }}\n value={value || items[0]?.value}\n >\n <Tabs.List\n className={cn(\n 'relative isolate z-[var(--z-layer-default)] inline-flex items-center justify-center overflow-hidden border text-(--theme-segment-item-foreground) backdrop-blur-sm [--segment-active-radius:calc(var(--segment-shell-radius)-var(--segment-inset))] [--segment-item-radius:var(--segment-active-radius)] [background:var(--theme-segment-list-background)] [border-color:var(--theme-segment-list-border-color)] [border-style:var(--theme-tabs-list-border-style)] [border-width:var(--theme-tabs-list-border-width)] [box-shadow:var(--theme-segment-list-shadow)] rounded-[var(--segment-shell-radius)]',\n size === 'default' &&\n 'h-8 gap-0.5 p-0.5 [--segment-inset:2px] [--segment-shell-radius:var(--radius-lg)]',\n size === 'sm' &&\n 'h-7 gap-0.5 p-0.5 [--segment-inset:2px] [--segment-shell-radius:var(--radius-md)]',\n size === 'lg' &&\n 'h-10 gap-0.5 p-1 [--segment-inset:4px] [--segment-shell-radius:var(--radius-xl)]',\n className\n )}\n data-active-variant={activeVariant}\n data-backplate-animation={animateBackplate ? 'on' : 'off'}\n data-size={size}\n data-slot=\"segment-control-list\"\n data-variant={variant}\n >\n {items.map(item => (\n <Tabs.Tab\n aria-label={item.label}\n className={cn(\n 'relative z-[var(--z-layer-base)] inline-flex cursor-pointer items-center justify-center rounded-[var(--segment-item-radius)] text-(--theme-segment-item-foreground) transition-[background-color,box-shadow,color,filter,opacity] duration-150 ease-out [text-shadow:var(--theme-segment-item-text-shadow)] hover:[background:var(--theme-segment-item-hover-background)] hover:text-(--theme-segment-item-hover-foreground) hover:shadow-none data-active:text-(--theme-segment-active-foreground) data-active:shadow-none data-active:[text-shadow:var(--theme-segment-active-text-shadow)] data-active:hover:bg-transparent data-active:hover:text-(--theme-segment-active-foreground)',\n 'focus-visible:z-[var(--z-layer-sticky)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background',\n focusVisibleThemeClassName,\n 'data-disabled:pointer-events-none data-disabled:opacity-50 disabled:pointer-events-none disabled:opacity-50',\n variant === 'icon' && 'aspect-square',\n variant === 'icon' && size === 'default' && 'size-7',\n variant === 'icon' && size === 'sm' && 'size-6',\n variant === 'icon' && size === 'lg' && 'size-8',\n variant === 'label' && 'h-full min-w-0 gap-2 px-2.5 font-medium text-xs leading-none',\n variant === 'label' && size === 'sm' && 'px-2 text-[11px]',\n variant === 'label' && size === 'lg' && 'px-3.5 text-sm',\n '[&_svg]:pointer-events-none [&_svg]:size-full [&_svg]:shrink-0 [&_svg:not([class*=\"opacity-\"])]:opacity-72 data-active:[&_svg]:[filter:var(--theme-segment-active-icon-filter)] data-active:[&_svg:not([class*=\"opacity-\"])]:opacity-100',\n tabClassName\n )}\n key={item.value}\n data-slot=\"segment-control-item\"\n title={item.label}\n value={item.value}\n >\n {variant === 'icon' ? (\n <span\n className={cn(\n 'inline-flex aspect-square items-center justify-center',\n size === 'default' && 'size-4',\n size === 'sm' && 'size-3.5',\n size === 'lg' && 'size-4.5'\n )}\n data-slot=\"segment-control-icon\"\n >\n {item.icon ?? item.label}\n </span>\n ) : (\n <>\n {item.icon ? (\n <span\n className={cn(\n 'inline-flex aspect-square shrink-0 items-center justify-center',\n size === 'sm' ? 'size-3.5' : 'size-4'\n )}\n data-slot=\"segment-control-icon\"\n >\n {item.icon}\n </span>\n ) : null}\n <span className=\"min-w-0 truncate\" data-slot=\"segment-control-label\">\n {item.label}\n </span>\n </>\n )}\n </Tabs.Tab>\n ))}\n\n <Tabs.Indicator\n className={cn(\n 'absolute top-1/2 left-0 z-[var(--z-layer-below)] h-(--active-tab-height) w-(--active-tab-width) origin-center translate-x-(--active-tab-left) -translate-y-1/2 rounded-[var(--segment-active-radius)] border [background:var(--theme-segment-active-background)] [background-color:var(--theme-segment-active-background-color)] [border-color:var(--theme-segment-active-border-color)] [border-style:var(--theme-tabs-active-border-style)] [border-width:var(--theme-tabs-active-border-width)] [box-shadow:var(--theme-segment-active-shadow)]',\n animateBackplate\n ? 'transition-[width,translate,scale] duration-200 ease-out motion-reduce:transition-none'\n : 'transition-none'\n )}\n data-backplate-animation={animateBackplate ? 'on' : 'off'}\n data-slot=\"tab-indicator\"\n />\n </Tabs.List>\n </Tabs.Root>\n )\n}\n","'use client'\n\nimport { Switch as SwitchPrimitive } from '@base-ui/react/switch'\n\nimport { cn } from '../../lib/cn'\nimport { focusVisibleThemeClassName } from './lib/theme-contract'\n\nfunction Switch({ className, ...props }: SwitchPrimitive.Root.Props) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n `inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-[var(--switch-radius)] border p-px outline-none transition-[background-color,border-color,box-shadow] duration-150 ease-out [--switch-radius:var(--radius-3xl)] [--thumb-size:--spacing(5)] [border-style:var(--theme-selection-border-style)] [border-width:var(--theme-selection-border-width)] [box-shadow:var(--theme-switch-track-shadow)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(4)] ${focusVisibleThemeClassName}`,\n className\n )}\n data-slot=\"switch\"\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'pointer-events-none block aspect-square h-full origin-left rounded-[max(0px,calc(var(--switch-radius)-1px))] border bg-background shadow-sm/5 will-change-transform [border-style:var(--theme-switch-thumb-border-style)] [border-width:var(--theme-switch-thumb-border-width)] [box-shadow:var(--theme-switch-thumb-shadow)] [transition:translate_150ms_ease-out,scale_100ms_ease-out_100ms,transform-origin_150ms_ease-out] in-[[role=switch]:active,[data-slot=label]:active]:not-data-disabled:scale-x-110 data-checked:origin-[var(--thumb-size)_50%] data-checked:translate-x-[calc(var(--thumb-size)-4px)]'\n )}\n data-slot=\"switch-thumb\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { isValidElement } from 'react'\n\nexport type AsChildProps = {\n /** Merges trigger props onto the single child element (Radix-compatible). Prefer `render` for explicit control. */\n asChild?: boolean\n}\n\nexport function resolveTriggerRender(\n asChild: boolean | undefined,\n render: ReactElement | undefined,\n children: ReactNode\n): ReactElement | undefined {\n if (render) {\n return render\n }\n if (asChild && isValidElement(children)) {\n return children\n }\n return undefined\n}\n\nexport type TriggerSlotProps = AsChildProps & {\n render?: ReactElement\n children?: ReactNode\n}\n\nexport function splitTriggerSlotProps({ asChild, render, children }: TriggerSlotProps): {\n render?: ReactElement\n children?: ReactNode\n} {\n const resolvedRender = resolveTriggerRender(asChild, render, children)\n\n // Explicit `render` — children compose into the render element (Base UI / shadcn).\n if (render) {\n return { render: resolvedRender, children }\n }\n\n // `asChild` — the single child element is the trigger.\n if (asChild && resolvedRender) {\n return { render: resolvedRender, children: undefined }\n }\n\n return {\n render: resolvedRender,\n children: resolvedRender ? undefined : children,\n }\n}\n","'use client'\n\nimport * as React from 'react'\n\ntype PortalContainer = HTMLElement | ShadowRoot | null | undefined\n\nconst PortalContainerContext = React.createContext<PortalContainer>(undefined)\n\nfunction PortalContainerProvider({\n children,\n container,\n}: {\n children: React.ReactNode\n container: PortalContainer\n}) {\n return (\n <PortalContainerContext.Provider value={container}>{children}</PortalContainerContext.Provider>\n )\n}\n\nfunction usePortalContainer() {\n return React.useContext(PortalContainerContext) ?? undefined\n}\n\nexport { PortalContainerProvider, usePortalContainer }\n","'use client'\n\nimport { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip'\n\nimport { cn } from '../../lib/cn'\nimport { splitTriggerSlotProps, type TriggerSlotProps } from './lib/render-slot'\nimport { usePortalContainer } from './portal-container'\n\nconst TooltipCreateHandle = TooltipPrimitive.createHandle\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nfunction TooltipTrigger({\n asChild,\n render,\n children,\n ...props\n}: TooltipPrimitive.Trigger.Props & TriggerSlotProps) {\n if (render) {\n return <TooltipPrimitive.Trigger data-tooltip-trigger=\"\" render={render} {...props} />\n }\n const slot = splitTriggerSlotProps({ asChild, render, children })\n if (slot.render) {\n return <TooltipPrimitive.Trigger data-tooltip-trigger=\"\" {...props} {...slot} />\n }\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} {...slot} />\n}\n\nfunction TooltipPopup({\n className,\n align = 'center',\n portalContainer,\n sideOffset = 4,\n side = 'top',\n children,\n ...props\n}: TooltipPrimitive.Popup.Props & {\n align?: TooltipPrimitive.Positioner.Props['align']\n portalContainer?: TooltipPrimitive.Portal.Props['container']\n side?: TooltipPrimitive.Positioner.Props['side']\n sideOffset?: TooltipPrimitive.Positioner.Props['sideOffset']\n}) {\n const contextPortalContainer = usePortalContainer()\n const container = portalContainer ?? contextPortalContainer\n\n return (\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Positioner\n align={align}\n className=\"z-[var(--z-layer-tooltip)] h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom,transform] data-instant:transition-none\"\n data-slot=\"tooltip-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <TooltipPrimitive.Popup\n className={cn(\n 'relative flex h-(--popup-height,auto) w-(--popup-width,auto) origin-(--transform-origin) text-balance rounded-md border bg-popover not-dark:bg-clip-padding text-popover-foreground text-xs transition-[width,height,scale,opacity] [border-style:var(--theme-overlay-border-style)] [border-width:var(--theme-overlay-border-width)] [box-shadow:var(--theme-overlay-shadow)] before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-md)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] data-ending-style:scale-98 data-starting-style:scale-98 data-ending-style:opacity-0 data-starting-style:opacity-0 data-instant:duration-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]',\n className\n )}\n data-slot=\"tooltip-popup\"\n {...props}\n >\n <TooltipPrimitive.Viewport\n className=\"relative size-full overflow-clip px-(--viewport-inline-padding) py-1 [--viewport-inline-padding:--spacing(2)] data-instant:transition-none **:data-current:data-ending-style:opacity-0 **:data-current:data-starting-style:opacity-0 **:data-previous:data-ending-style:opacity-0 **:data-previous:data-starting-style:opacity-0 **:data-current:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:truncate **:data-current:opacity-100 **:data-previous:opacity-100 **:data-current:transition-opacity **:data-previous:transition-opacity\"\n data-slot=\"tooltip-viewport\"\n >\n {children}\n </TooltipPrimitive.Viewport>\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport {\n TooltipCreateHandle,\n TooltipProvider,\n Tooltip,\n TooltipTrigger,\n TooltipPopup,\n TooltipPopup as TooltipContent,\n}\n","import { Lock } from 'lucide-react'\nimport { Button } from '../primitives'\nimport { useCallback, useEffect, useState } from 'react'\n\nexport interface SlideGateProvider {\n fetchConfigured: (slug: string) => Promise<boolean>\n gateEnvVarName: (slug: string) => string\n isUnlocked: (slug: string) => boolean\n setUnlocked: (slug: string) => void\n verify: (slug: string, code: string) => Promise<boolean>\n}\n\ninterface SlidePasswordGateProps {\n deckTitle: string\n gateProvider: SlideGateProvider\n onBack: () => void\n onUnlock: () => void\n slug: string\n renderCodeGate?: (props: {\n backLabel: string\n onBack: () => void\n onUnlock: () => void\n subtitle: string\n title: string\n verifyCode: (code: string) => Promise<boolean>\n }) => React.ReactNode\n}\n\nexport function SlidePasswordGate({\n deckTitle,\n slug,\n onUnlock,\n onBack,\n gateProvider,\n renderCodeGate,\n}: SlidePasswordGateProps) {\n const [configured, setConfigured] = useState<boolean | null>(null)\n\n useEffect(() => {\n let cancelled = false\n gateProvider.fetchConfigured(slug).then(v => {\n if (!cancelled) setConfigured(v)\n })\n return () => {\n cancelled = true\n }\n }, [slug, gateProvider])\n\n const handleUnlock = () => {\n gateProvider.setUnlocked(slug)\n onUnlock()\n }\n\n const verifyCode = useCallback(\n (code: string) => gateProvider.verify(slug, code),\n [slug, gateProvider]\n )\n\n const envName = gateProvider.gateEnvVarName(slug)\n\n if (configured === null) {\n return (\n <div className=\"flex size-full flex-col items-center justify-center px-8\">\n <p className=\"text-muted-foreground text-sm\">Checking access…</p>\n </div>\n )\n }\n\n if (!configured) {\n return (\n <div className=\"flex size-full flex-col items-center justify-center gap-6 px-8\">\n <div className=\"flex size-16 items-center justify-center rounded-full bg-warning/15 text-warning\">\n <Lock aria-hidden className=\"size-8\" />\n </div>\n <div className=\"max-w-sm text-center\">\n <h2 className=\"mb-2 font-semibold text-foreground text-lg\">{deckTitle} is locked</h2>\n <p className=\"text-base text-muted-foreground\">\n Set <code className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-xs\">{envName}</code>{' '}\n in your server environment to enable the passcode.\n </p>\n </div>\n <Button onClick={onBack} variant=\"outline\">\n Back\n </Button>\n </div>\n )\n }\n\n if (renderCodeGate) {\n return (\n <>\n {renderCodeGate({\n backLabel: 'Back',\n onBack,\n onUnlock: handleUnlock,\n subtitle: 'Enter the 4-digit code to view this deck.',\n title: `${deckTitle} is locked`,\n verifyCode,\n })}\n </>\n )\n }\n\n // Fallback: simple locked message (no CodeGate dependency)\n return (\n <div className=\"flex size-full flex-col items-center justify-center gap-6 px-8\">\n <div className=\"flex size-16 items-center justify-center rounded-full bg-warning/15 text-warning\">\n <Lock aria-hidden className=\"size-8\" />\n </div>\n <div className=\"text-center\">\n <h2 className=\"mb-2 font-semibold text-foreground text-lg\">{deckTitle} is locked</h2>\n <p className=\"text-muted-foreground text-sm\">Enter the passcode to continue.</p>\n </div>\n <Button onClick={onBack} variant=\"outline\">\n Back\n </Button>\n </div>\n )\n}\n","import { type RefObject, useEffect, useRef } from 'react'\n\nconst SWIPE_THRESHOLD_PX = 50\n\n/**\n * Attaches touch-swipe navigation to a container element.\n *\n * - Leftward swipe (deltaX < -50px) → onNext\n * - Rightward swipe (deltaX > 50px) → onPrev\n * - Vertical-dominant swipes are ignored so the user can scroll slide content.\n * - Confirmed horizontal swipes call `event.preventDefault()` to suppress\n * browser back/forward gesture on mobile Safari/Chrome.\n */\nexport function useSwipeNav(\n ref: RefObject<HTMLElement | null>,\n {\n onNext,\n onPrev,\n }: {\n onNext: () => void\n onPrev: () => void\n }\n) {\n const startX = useRef(0)\n const startY = useRef(0)\n // Refs for callbacks so listener identity doesn't change when slideCount\n // (and thus goNext/goPrev) gets a new identity — avoids listener churn.\n const onNextRef = useRef(onNext)\n const onPrevRef = useRef(onPrev)\n onNextRef.current = onNext\n onPrevRef.current = onPrev\n\n useEffect(() => {\n const el = ref.current\n if (!el) {\n return\n }\n\n const handleTouchStart = (e: TouchEvent) => {\n const touch = e.touches[0]\n if (!touch) {\n return\n }\n startX.current = touch.clientX\n startY.current = touch.clientY\n }\n\n const handleTouchEnd = (e: TouchEvent) => {\n const touch = e.changedTouches[0]\n if (!touch) {\n return\n }\n const deltaX = touch.clientX - startX.current\n const deltaY = touch.clientY - startY.current\n\n // Ignore vertical-dominant swipes\n if (Math.abs(deltaY) > Math.abs(deltaX)) {\n return\n }\n\n if (deltaX < -SWIPE_THRESHOLD_PX) {\n e.preventDefault()\n onNextRef.current()\n } else if (deltaX > SWIPE_THRESHOLD_PX) {\n e.preventDefault()\n onPrevRef.current()\n }\n }\n\n el.addEventListener('touchstart', handleTouchStart, { passive: true })\n el.addEventListener('touchend', handleTouchEnd, { passive: false })\n\n return () => {\n el.removeEventListener('touchstart', handleTouchStart)\n el.removeEventListener('touchend', handleTouchEnd)\n }\n }, [ref])\n}\n","import { type RefObject, useEffect } from 'react'\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\ninterface UseFocusTrapOptions {\n /** When false, the trap is inert (no focus moves, no listeners). */\n active: boolean\n /** Called when Escape is pressed inside the trapped container. */\n onEscape?: () => void\n}\n\n/**\n * Traps keyboard focus within `containerRef` while `active`.\n *\n * - Moves initial focus into the container on activation (first focusable\n * element, falling back to the container itself).\n * - Loops Tab / Shift+Tab within the container.\n * - Calls `onEscape` on Escape.\n * - Restores focus to the previously focused element on deactivation.\n */\nexport function useFocusTrap(\n containerRef: RefObject<HTMLElement | null>,\n { active, onEscape }: UseFocusTrapOptions\n) {\n useEffect(() => {\n if (!active) return\n const container = containerRef.current\n if (!container) return\n\n const previouslyFocused = document.activeElement as HTMLElement | null\n\n const getFocusable = () =>\n Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n el => el.offsetParent !== null || el === document.activeElement\n )\n\n // Move initial focus into the panel.\n const focusables = getFocusable()\n if (focusables.length > 0) {\n focusables[0].focus()\n } else {\n container.focus()\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onEscape?.()\n return\n }\n if (event.key !== 'Tab') return\n\n const items = getFocusable()\n if (items.length === 0) {\n event.preventDefault()\n container.focus()\n return\n }\n\n const first = items[0]\n const last = items[items.length - 1]\n const activeEl = document.activeElement\n\n if (event.shiftKey) {\n if (activeEl === first || !container.contains(activeEl)) {\n event.preventDefault()\n last.focus()\n }\n } else if (activeEl === last || !container.contains(activeEl)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n container.addEventListener('keydown', handleKeyDown)\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown)\n // Restore focus to the trigger if it's still in the document.\n if (previouslyFocused?.isConnected) {\n previouslyFocused.focus()\n }\n }\n }, [active, containerRef, onEscape])\n}\n","import { Button, Kbd, Label, SegmentControl, Separator, Switch } from '../primitives'\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react'\nimport type { RefObject } from 'react'\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useFocusTrap } from '../../hooks/use-focus-trap'\nimport {\n type SlideConfigPadding,\n type SlideConfigTypographyScale,\n useSlideConfig,\n} from '../../stores/config-store'\n\nconst PANEL_VISIBLE = { opacity: 1, y: 0 } as const\nconst PANEL_HIDDEN = { opacity: 0, y: -4 } as const\nconst PANEL_TRANSITION = { duration: 0.15, ease: [0.16, 1, 0.3, 1] } as const\n\nconst PANEL_WIDTH = 272\n\ninterface SlideConfigPanelProps {\n anchorRef: RefObject<HTMLElement | null>\n isOpen: boolean\n onClose: () => void\n}\n\nconst PADDING_OPTIONS: { label: string; value: SlideConfigPadding }[] = [\n { label: 'Small', value: 'sm' },\n { label: 'Medium', value: 'md' },\n { label: 'Large', value: 'lg' },\n]\n\nconst TYPE_SCALE_OPTIONS: { label: string; value: SlideConfigTypographyScale }[] = [\n { label: '0.9×', value: 'sm' },\n { label: '1.0×', value: 'md' },\n { label: '1.1×', value: 'lg' },\n { label: '1.2×', value: 'xl' },\n]\n\nfunction SwitchRow({\n checked,\n label,\n onChange,\n}: {\n checked: boolean\n label: string\n onChange: (next: boolean) => void\n}) {\n return (\n <div className=\"flex items-center justify-between gap-3 py-0.5\">\n <Label className=\"cursor-pointer font-medium text-foreground text-sm\">{label}</Label>\n <Switch aria-label={label} checked={checked} onCheckedChange={onChange} />\n </div>\n )\n}\n\nexport function SlideConfigPanel({ anchorRef, isOpen, onClose }: SlideConfigPanelProps) {\n const padding = useSlideConfig(state => state.padding)\n const typographyScale = useSlideConfig(state => state.typographyScale)\n const showPagination = useSlideConfig(state => state.showPagination)\n const showInlineTalkTrack = useSlideConfig(state => state.showInlineTalkTrack)\n const updateConfig = useSlideConfig(state => state.updateConfig)\n const reset = useSlideConfig(state => state.reset)\n const panelRef = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<{ top: number; left: number }>({ top: 56, left: 16 })\n const reducedMotion = Boolean(useReducedMotion())\n\n // Trap focus within the panel while open: move initial focus in, loop Tab,\n // close on Escape, and restore focus to the trigger on close.\n useFocusTrap(panelRef, { active: isOpen, onEscape: onClose })\n\n // Compute position from anchor button so the panel opens below it,\n // right-aligned to the button's right edge, clamped to stay on-screen.\n useLayoutEffect(() => {\n if (!(anchorRef.current && isOpen)) return\n const rect = anchorRef.current.getBoundingClientRect()\n const left = Math.min(rect.right - PANEL_WIDTH, window.innerWidth - PANEL_WIDTH - 8)\n setPos({ top: rect.bottom + 6, left: Math.max(8, left) })\n }, [anchorRef, isOpen])\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, onClose])\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node\n if (panelRef.current?.contains(target)) return\n if (anchorRef.current?.contains(target)) return\n onClose()\n }\n window.addEventListener('mousedown', handleClick)\n return () => window.removeEventListener('mousedown', handleClick)\n }, [isOpen, onClose, anchorRef])\n\n const handleReset = useCallback(() => {\n reset()\n onClose()\n }, [reset, onClose])\n\n const handlePaddingChange = useCallback(\n (value: SlideConfigPadding) => updateConfig({ padding: value }),\n [updateConfig]\n )\n\n const handleTypographyScaleChange = useCallback(\n (value: SlideConfigTypographyScale) => updateConfig({ typographyScale: value }),\n [updateConfig]\n )\n\n const handlePaginationChange = useCallback(\n (show: boolean) => updateConfig({ showPagination: show }),\n [updateConfig]\n )\n\n const handleTalkTrackChange = useCallback(\n (show: boolean) => updateConfig({ showInlineTalkTrack: show }),\n [updateConfig]\n )\n\n // Portal renders outside the presentation surface transform context so that\n // position:fixed resolves against the viewport, matching getBoundingClientRect().\n return createPortal(\n <AnimatePresence>\n {isOpen && (\n <motion.div\n animate={PANEL_VISIBLE}\n className=\"fixed z-50 overflow-hidden rounded-xl border border-border bg-background/95 shadow-lg backdrop-blur-xl\"\n exit={reducedMotion ? { opacity: 0 } : PANEL_HIDDEN}\n initial={reducedMotion ? { opacity: 0 } : PANEL_HIDDEN}\n key=\"slide-config-panel\"\n ref={panelRef}\n style={{ top: pos.top, left: pos.left, width: PANEL_WIDTH }}\n tabIndex={-1}\n transition={reducedMotion ? { duration: 0 } : PANEL_TRANSITION}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-border/60 border-b px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n <span\n aria-hidden=\"true\"\n className=\"block size-3 shrink-0 rounded-full ring-1 ring-border ring-inset\"\n style={{ backgroundColor: 'var(--primary)' }}\n />\n <span className=\"font-semibold text-foreground text-sm\">Slide settings</span>\n </div>\n <Kbd>C</Kbd>\n </div>\n\n <div className=\"space-y-3 p-3\">\n {/* Layout card */}\n <section className=\"space-y-3 rounded-lg border border-border/60 bg-card p-3 shadow-none\">\n <div className=\"space-y-1.5\">\n <Label className=\"font-medium text-foreground text-xs\">Padding</Label>\n <SegmentControl\n className=\"w-full\"\n items={PADDING_OPTIONS.map(opt => ({ label: opt.label, value: opt.value }))}\n onValueChange={value => handlePaddingChange(value as SlideConfigPadding)}\n size=\"sm\"\n tabClassName=\"w-full\"\n value={padding}\n variant=\"label\"\n />\n </div>\n\n <Separator />\n\n <div className=\"space-y-1.5\">\n <Label className=\"font-medium text-foreground text-xs\">Type scale</Label>\n <SegmentControl\n className=\"w-full\"\n items={TYPE_SCALE_OPTIONS.map(opt => ({ label: opt.label, value: opt.value }))}\n onValueChange={value =>\n handleTypographyScaleChange(value as SlideConfigTypographyScale)\n }\n size=\"sm\"\n tabClassName=\"w-full font-mono tabular-nums\"\n value={typographyScale}\n variant=\"label\"\n />\n </div>\n </section>\n\n {/* Chrome card */}\n <section className=\"space-y-2.5 rounded-lg border border-border/60 bg-card p-3 shadow-none\">\n <SwitchRow\n checked={showPagination}\n label=\"Pagination overlay\"\n onChange={handlePaginationChange}\n />\n <Separator />\n <SwitchRow\n checked={showInlineTalkTrack}\n label=\"Inline talk track\"\n onChange={handleTalkTrackChange}\n />\n </section>\n\n <Button className=\"w-full\" onClick={handleReset} size=\"lg\" variant=\"ghost\">\n Reset to defaults\n </Button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>,\n document.body\n )\n}\n","/**\n * Design-time dimensions for the virtual slide canvas. All slides are authored\n * against a fixed 1920×1080 stage; thumbnails and the live stage scale this\n * canvas down to fit their containers via CSS transform.\n */\nexport const DESIGN_WIDTH = 1920\nexport const DESIGN_HEIGHT = 1080\n","import type { RefObject } from 'react'\nimport { memo, useLayoutEffect, useRef } from 'react'\nimport { DESIGN_HEIGHT, DESIGN_WIDTH } from './dimensions'\n\n/** Extract the target slide's root element from the source container. */\nfunction extractSlideElement(source: HTMLElement, targetSlide: number): HTMLElement | null {\n let slideIdx = 0\n for (const child of source.children) {\n const el = child as HTMLElement\n if (el.hasAttribute('data-slide-break')) {\n slideIdx++\n continue\n }\n if (\n el.hasAttribute('data-slide-talktrack') ||\n el.hasAttribute('data-slide-section') ||\n el.hasAttribute('data-slide-syllabus')\n ) {\n continue\n }\n if (slideIdx === targetSlide) {\n return el\n }\n }\n return null\n}\n\n/**\n * Captured-frame cache: gif/video frames are expensive to rasterize, so we draw\n * each once and reuse the data URL. Keyed by deck generation + media src so a\n * deck edit (new generation) invalidates stale frames. A `null` value means the\n * frame couldn't be captured (e.g. cross-origin taint) — fall back to a neutral\n * block. Bounded so long sessions don't grow it unbounded.\n */\nconst THUMB_FRAME_CACHE = new Map<string, string | null>()\nconst THUMB_FRAME_CACHE_MAX = 200\n\nconst THUMB_FRAME_MAX_WIDTH = 480\n\nfunction neutralPlaceholder(reference: HTMLElement): HTMLDivElement {\n const placeholder = document.createElement('div')\n placeholder.className = reference.className\n placeholder.style.backgroundColor = 'oklch(0.5 0 0 / 0.2)'\n return placeholder\n}\n\nfunction staticImage(src: string, className: string): HTMLImageElement {\n const img = document.createElement('img')\n img.src = src\n img.className = className\n img.decoding = 'async'\n img.setAttribute('aria-hidden', 'true')\n return img\n}\n\n/** Draw a single frame of a loaded <img>/<video> to a data URL. Returns null on\n * a tainted (cross-origin) canvas or any draw failure. Result is cached. */\nfunction captureFrame(\n el: HTMLImageElement | HTMLVideoElement,\n naturalWidth: number,\n naturalHeight: number,\n cacheKey: string\n): string | null {\n if (THUMB_FRAME_CACHE.has(cacheKey)) {\n return THUMB_FRAME_CACHE.get(cacheKey) ?? null\n }\n let url: string | null = null\n try {\n const ratio = naturalWidth > 0 ? naturalHeight / naturalWidth : 0.5625\n const width = Math.min(naturalWidth || THUMB_FRAME_MAX_WIDTH, THUMB_FRAME_MAX_WIDTH)\n const height = Math.max(1, Math.round(width * ratio))\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n const ctx = canvas.getContext('2d')\n if (ctx) {\n ctx.drawImage(el, 0, 0, width, height)\n url = canvas.toDataURL('image/jpeg', 0.72)\n }\n } catch {\n url = null\n }\n if (THUMB_FRAME_CACHE.size >= THUMB_FRAME_CACHE_MAX) {\n THUMB_FRAME_CACHE.clear()\n }\n THUMB_FRAME_CACHE.set(cacheKey, url)\n return url\n}\n\n/**\n * Replace a cloned media node with a STATIC representation so thumbnails are\n * accurate without autoplay:\n * - static <img>: leave as-is (the live deck already decoded the src — cache hit)\n * - animated GIF: freeze to a captured first/current frame\n * - <video>: poster if set, else a captured current frame, else neutral block\n * `live` is the on-stage element (which has loaded pixels); `clone` is the node\n * in the thumbnail subtree being rendered.\n */\nfunction replaceThumbnailMedia(\n live: HTMLElement | undefined,\n clone: HTMLElement,\n generation: number\n): void {\n if (!live) {\n clone.replaceWith(neutralPlaceholder(clone))\n return\n }\n\n if (clone.tagName === 'IMG') {\n const liveImg = live as HTMLImageElement\n const src = liveImg.currentSrc || liveImg.src\n const isAnimated = /\\.gif(\\?|#|$)/i.test(src)\n if (isAnimated) {\n const url =\n liveImg.complete && liveImg.naturalWidth > 0\n ? captureFrame(\n liveImg,\n liveImg.naturalWidth,\n liveImg.naturalHeight,\n `${generation}:gif:${src}`\n )\n : null\n clone.replaceWith(url ? staticImage(url, clone.className) : neutralPlaceholder(clone))\n }\n // Static image: leave the cloned <img> as-is — same src is already cached.\n return\n }\n\n // <video>: never keep a live (autoplaying) video in a thumbnail.\n const liveVideo = live as HTMLVideoElement\n if (liveVideo.poster) {\n clone.replaceWith(staticImage(liveVideo.poster, clone.className))\n return\n }\n if (liveVideo.readyState >= 2 && liveVideo.videoWidth > 0) {\n const url = captureFrame(\n liveVideo,\n liveVideo.videoWidth,\n liveVideo.videoHeight,\n `${generation}:vid:${liveVideo.currentSrc || liveVideo.src}`\n )\n clone.replaceWith(url ? staticImage(url, clone.className) : neutralPlaceholder(clone))\n return\n }\n clone.replaceWith(neutralPlaceholder(clone))\n}\n\nexport const SlideThumbnail = memo(\n ({\n slideIndex,\n isCurrent,\n sourceRef,\n scale,\n onSelect,\n generation = 0,\n }: {\n slideIndex: number\n isCurrent: boolean\n sourceRef: RefObject<HTMLDivElement | null>\n scale: number\n onSelect: (index: number) => void\n generation?: number\n }) => {\n const cloneRef = useRef<HTMLDivElement>(null)\n\n // Clone only the target slide rather than the entire deck container.\n // Cloning the full container (all N slides) × visible thumbnail count creates\n // O(N×T) DOM nodes. For decks with Shiki-highlighted code blocks — which\n // generate hundreds of <span> tags each — this can exhaust browser memory.\n //\n // Strategy: shallow-clone the source container (copies its flex/layout classes\n // and inline CSS vars, no children), then deep-clone only the target slide into\n // it. Slide primitives use flex-1 / h-full which need a flex parent — without\n // the wrapper they collapse. This keeps layout correct at O(single_slide) cost.\n useLayoutEffect(() => {\n const source = sourceRef.current\n const container = cloneRef.current\n if (!(source && container)) {\n return\n }\n\n const slideEl = extractSlideElement(source, slideIndex)\n if (!slideEl) {\n container.replaceChildren()\n return\n }\n\n // Shallow clone preserves all CSS classes and inline styles (padding,\n // --slide-type-scale, etc.) without copying any sibling slide nodes.\n const wrapper = source.cloneNode(false) as HTMLElement\n const slideClone = slideEl.cloneNode(true) as HTMLElement\n // Non-current slides have display:none set by hideElement. Clear it so\n // the clone is always visible regardless of the slide's live visibility.\n slideClone.style.display = ''\n\n // Freeze media to static frames so thumbnails are accurate without\n // autoplay. Pair each cloned node with its live on-stage source (same DOM\n // order) so we can read already-decoded pixels — static <img> is kept,\n // gif/video collapse to a captured frame (cached) or a neutral block.\n const liveMedia = slideEl.querySelectorAll<HTMLElement>('img, video')\n const cloneMedia = slideClone.querySelectorAll<HTMLElement>('img, video')\n for (let i = 0; i < cloneMedia.length; i++) {\n replaceThumbnailMedia(liveMedia[i], cloneMedia[i], generation)\n }\n\n // Replace Shiki-highlighted code blocks with placeholder divs. A single\n // highlighted block generates hundreds of <span> tags; at thumbnail scale\n // the syntax colouring is unreadable anyway.\n for (const pre of slideClone.querySelectorAll<HTMLElement>('pre[data-theme]')) {\n const placeholder = document.createElement('div')\n placeholder.className = pre.className\n placeholder.style.borderRadius = '0.25rem'\n placeholder.style.backgroundColor = 'oklch(0.5 0 0 / 0.1)'\n pre.replaceWith(placeholder)\n }\n\n wrapper.appendChild(slideClone)\n container.replaceChildren(wrapper)\n }, [slideIndex, sourceRef, generation])\n\n return (\n <button\n aria-label={`Go to slide ${String(slideIndex + 1)}`}\n aria-current={isCurrent ? 'true' : undefined}\n className={`group relative w-full cursor-pointer overflow-hidden rounded-lg text-left transition-colors ${\n isCurrent\n ? 'border-primary ring-1 ring-primary/30'\n : 'border-border/40 hover:border-border'\n }`}\n onClick={() => onSelect(slideIndex)}\n style={{ aspectRatio: '16 / 9', borderWidth: isCurrent ? 2 : 1, borderStyle: 'solid' }}\n type=\"button\"\n >\n <div\n className=\"pointer-events-none relative origin-top-left bg-background text-left\"\n style={{\n width: DESIGN_WIDTH,\n height: DESIGN_HEIGHT,\n transform: `scale(${String(scale)})`,\n }}\n >\n <div className=\"absolute inset-0 text-left\" ref={cloneRef} />\n </div>\n\n <span className=\"absolute right-2 bottom-1.5 z-10 rounded bg-foreground/60 px-1.5 py-0.5 font-mono text-[10px] text-background/80\">\n {slideIndex + 1}\n </span>\n </button>\n )\n }\n)\nSlideThumbnail.displayName = 'SlideThumbnail'\n","import { useVirtualizer } from '@tanstack/react-virtual'\nimport type { RefObject } from 'react'\nimport { memo, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { DESIGN_WIDTH } from './dimensions'\nimport { SlideThumbnail } from './thumbnail'\n\nconst GRID_COLS = 4\n/** Horizontal padding: p-8 = 32px each side */\nconst PAD_X = 64\n/** gap-4 between columns (3 internal gaps per row) */\nconst GAP = 16\n\nfunction useOverviewScale(scrollRef: RefObject<HTMLDivElement | null>) {\n const [scale, setScale] = useState(0)\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) {\n return\n }\n\n let raf = 0\n const measure = () => {\n const inner = el.clientWidth - PAD_X\n const cell = (inner - GAP * (GRID_COLS - 1)) / GRID_COLS\n if (cell > 0) {\n const next = cell / DESIGN_WIDTH\n setScale(prev => (Math.abs(prev - next) < 0.0005 ? prev : next))\n }\n }\n\n const scheduleMeasure = () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n raf = requestAnimationFrame(() => {\n raf = 0\n measure()\n })\n }\n\n measure()\n\n const observer = new ResizeObserver(scheduleMeasure)\n observer.observe(el)\n return () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n observer.disconnect()\n }\n }, [scrollRef])\n\n return scale\n}\n\ninterface SlideOverviewProps {\n currentSlide: number\n generation?: number\n onSelect: (index: number) => void\n slideCount: number\n sourceRef: RefObject<HTMLDivElement | null>\n}\n\nfunction SlideOverviewComponent({\n slideCount,\n currentSlide,\n sourceRef,\n onSelect,\n generation,\n}: SlideOverviewProps) {\n const scrollRef = useRef<HTMLDivElement>(null)\n const scale = useOverviewScale(scrollRef)\n const rowCount = Math.ceil(slideCount / GRID_COLS)\n\n const virtualizer = useVirtualizer({\n count: rowCount,\n estimateSize: () => 200,\n getScrollElement: () => scrollRef.current,\n overscan: 2,\n paddingEnd: 32,\n paddingStart: 32,\n })\n\n useLayoutEffect(() => {\n if (slideCount === 0 || scale <= 0) {\n return\n }\n const row = Math.floor(currentSlide / GRID_COLS)\n virtualizer.scrollToIndex(row, { align: 'center' })\n }, [currentSlide, scale, slideCount, virtualizer])\n\n return (\n <div\n className=\"scrollbar-reveal absolute inset-0 z-30 overflow-auto bg-background/95 backdrop-blur-sm\"\n ref={scrollRef}\n >\n <div className=\"relative\" style={{ height: `${String(virtualizer.getTotalSize())}px` }}>\n {virtualizer.getVirtualItems().map(vRow => (\n <div\n className=\"pb-4\"\n data-index={vRow.index}\n key={vRow.key}\n ref={virtualizer.measureElement}\n style={{\n left: 0,\n paddingLeft: '2rem',\n paddingRight: '2rem',\n position: 'absolute',\n top: 0,\n transform: `translateY(${String(vRow.start)}px)`,\n width: '100%',\n }}\n >\n <div className=\"grid grid-cols-4 gap-4\">\n {Array.from({ length: GRID_COLS }, (_, c) => {\n const i = vRow.index * GRID_COLS + c\n if (i >= slideCount) {\n return <div key={`empty-${String(c)}`} />\n }\n return (\n <SlideThumbnail\n generation={generation}\n isCurrent={i === currentSlide}\n key={`slide-${String(i)}`}\n onSelect={onSelect}\n scale={scale}\n slideIndex={i}\n sourceRef={sourceRef}\n />\n )\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport const SlideOverview = memo(SlideOverviewComponent)\n","import type React from 'react'\nimport type { ReactNode } from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { DESIGN_HEIGHT, DESIGN_WIDTH } from './dimensions'\n\nexport function SlideStage({\n children,\n theme = 'auto',\n preset,\n}: {\n children: ReactNode\n /**\n * Deck theme from frontmatter. `'auto'` inherits the site theme; `'dark'`\n * and `'light'` force the canvas regardless of the site setting.\n */\n theme?: 'auto' | 'dark' | 'light'\n /** Optional style preset from frontmatter */\n preset?: string\n}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [scale, setScale] = useState(1)\n\n const recalculate = useCallback(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n const { width, height } = container.getBoundingClientRect()\n const scaleX = width / DESIGN_WIDTH\n const scaleY = height / DESIGN_HEIGHT\n const next = Math.min(scaleX, scaleY)\n setScale(prev => (Math.abs(prev - next) < 0.0005 ? prev : next))\n }, [])\n\n useEffect(() => {\n recalculate()\n\n const container = containerRef.current\n if (!container) {\n return\n }\n\n let raf = 0\n const observer = new ResizeObserver(() => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n raf = requestAnimationFrame(() => {\n raf = 0\n recalculate()\n })\n })\n observer.observe(container)\n return () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n observer.disconnect()\n }\n }, [recalculate])\n\n // 'auto' adds no class so the canvas inherits whichever theme class\n // (`light` / `dark`) the site theme system has placed on <html>. 'light' and\n // 'dark' force the canvas regardless of the surrounding theme.\n const themeClass = theme === 'auto' ? '' : theme\n\n return (\n <div\n className=\"relative flex-1 overflow-hidden bg-[var(--theme-slide-stage-bg,transparent)]\"\n ref={containerRef}\n >\n <div\n className={`absolute top-1/2 left-1/2 overflow-hidden bg-[var(--theme-slide-bg,var(--background))] ring-1 ring-[color:var(--theme-slide-stage-slide-ring,rgba(0,0,0,0.08))] ${themeClass}`}\n data-slide-preset={preset}\n style={\n {\n width: DESIGN_WIDTH,\n height: DESIGN_HEIGHT,\n transform: `translate(-50%, -50%) scale(${scale})`,\n '--slide-stage-scale': String(scale),\n '--slide-stage-zoom': String(1 / scale),\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n </div>\n )\n}\n","import { Link, Printer } from 'lucide-react'\nimport { Button } from '../primitives'\nimport { MDXProvider } from '@mdx-js/react'\nimport type { ComponentType } from 'react'\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { toast } from 'sonner'\nimport { slideMdxComponents } from '../../content/mdx-components'\nimport { syllabusMdxComponents } from '../../content/syllabus-mdx-components'\nimport type { DeckOutline } from '../../hooks/use-deck-outline'\nimport { SlideRenderModeContext } from '../../stores/render-mode'\nimport './syllabus-print.css'\n\n// Null component for suppressing MDX slide-break separators (---) in reading view.\nconst Null = () => null\n\n// Merged reading-mode component map for the in-app syllabus panel.\n// slideMdxComponents covers slide JSX — all template/layout components return\n// null in \"web-syllabus\" mode so they're invisible in the reading view.\n// syllabusMdxComponents overrides HTML tags (h1-h6, p, ul, a, …) with\n// document-scale styles appropriate for a reading panel.\n// hr is null to suppress MDX \"---\" slide-break separators.\nconst panelMdxComponents = {\n ...slideMdxComponents,\n ...syllabusMdxComponents,\n hr: Null,\n}\n\nconst PRINT_CLONE_ID = 'syllabus-print-clone'\nconst PRESERVE_TAGS = new Set(['STYLE', 'LINK', 'SCRIPT'])\n\n/**\n * Hide all non-essential body children for printing; returns the hidden\n * elements so they can be restored. Mirrors the resume-app strategy —\n * dodges the presentation chrome / transform-stack mess by\n * pulling the printable subtree to `<body>` and blanking out siblings.\n */\nfunction hideBodyChildren(): HTMLElement[] {\n const hidden: HTMLElement[] = []\n for (const child of Array.from(document.body.children) as HTMLElement[]) {\n if (PRESERVE_TAGS.has(child.tagName)) {\n continue\n }\n child.style.setProperty('display', 'none', 'important')\n hidden.push(child)\n }\n return hidden\n}\n\ninterface SyllabusViewProps {\n content: ComponentType\n contentVersion?: number\n deckDate: string\n deckDescription?: string\n deckTitle: string\n outline: DeckOutline\n shareUrl?: string\n}\n\n/**\n * Reading layout for the syllabus. Renders the deck MDX directly in\n * \"web-syllabus\" mode so all slide templates return null and only\n * <Syllabus> blocks are visible — with full interactivity (links, hover).\n *\n * Previously used a DOM-clone strategy (cloneNode) but JS event listeners\n * don't fire on cloned nodes inside the presentation surface's CSS containment context,\n * breaking all link interactions.\n */\nexport function SyllabusView({\n content: Content,\n contentVersion = 0,\n deckTitle,\n deckDescription,\n deckDate,\n outline,\n shareUrl,\n}: SyllabusViewProps) {\n const articleRef = useRef<HTMLElement>(null)\n // Set synchronously right before window.print() so this handler only takes\n // over the print when the syllabus initiated it — otherwise another app's\n // print (e.g. the resume) isn't clobbered by the syllabus clone/hide.\n const printRequestedRef = useRef(false)\n\n // Print pipeline — clone the article into <body> and hide siblings on\n // beforeprint so the browser prints from a flat, untransformed subtree.\n // This sidesteps the presentation overlay's `position:absolute` + transform stack\n // that otherwise confuses paginated layout.\n useEffect(() => {\n let hiddenSiblings: HTMLElement[] = []\n let savedTitle = ''\n\n const beforePrint = () => {\n // Only own the print when the syllabus's own print button started it.\n if (!printRequestedRef.current) {\n return\n }\n const source = articleRef.current\n if (!source) {\n return\n }\n savedTitle = document.title\n // Chrome / Safari / Firefox use document.title verbatim as the\n // suggested PDF filename, so lead with \"Syllabus\" to make the\n // file's purpose obvious in the user's downloads folder.\n document.title = `Syllabus — ${deckTitle}`\n\n const clone = source.cloneNode(true) as HTMLElement\n clone.id = PRINT_CLONE_ID\n // Strip the action button row from the clone — `print:hidden` would\n // also work, but removing the node guarantees no stray spacing on\n // browsers that resolve responsive variants oddly during print.\n for (const el of clone.querySelectorAll<HTMLElement>('[data-syllabus-actions]')) {\n el.remove()\n }\n hiddenSiblings = hideBodyChildren()\n\n // index.html locks html/body/root to `position:fixed; overflow:hidden`\n // for the SPA chrome. That cap clips printed content to one\n // page. Override here and restore in afterPrint.\n for (const sel of ['html', 'body', '#root']) {\n const el = document.querySelector<HTMLElement>(sel)\n if (!el) {\n continue\n }\n el.style.setProperty('position', 'static', 'important')\n el.style.setProperty('overflow', 'visible', 'important')\n el.style.setProperty('height', 'auto', 'important')\n el.style.setProperty('width', 'auto', 'important')\n }\n\n document.body.appendChild(clone)\n }\n\n const afterPrint = () => {\n printRequestedRef.current = false\n const clone = document.getElementById(PRINT_CLONE_ID)\n if (clone) {\n clone.remove()\n }\n for (const el of hiddenSiblings) {\n el.style.removeProperty('display')\n }\n hiddenSiblings = []\n\n // Restore SPA layout constraints removed in beforePrint.\n for (const sel of ['html', 'body', '#root']) {\n const el = document.querySelector<HTMLElement>(sel)\n if (!el) {\n continue\n }\n el.style.removeProperty('position')\n el.style.removeProperty('overflow')\n el.style.removeProperty('height')\n el.style.removeProperty('width')\n }\n\n if (savedTitle) {\n document.title = savedTitle\n savedTitle = ''\n }\n }\n\n window.addEventListener('beforeprint', beforePrint)\n window.addEventListener('afterprint', afterPrint)\n return () => {\n window.removeEventListener('beforeprint', beforePrint)\n window.removeEventListener('afterprint', afterPrint)\n }\n }, [deckTitle])\n\n const formattedDate = useMemo(() => formatLongDate(deckDate), [deckDate])\n\n const handleCopyLink = useCallback(async () => {\n if (!shareUrl) {\n return\n }\n try {\n await navigator.clipboard.writeText(shareUrl)\n toast.success('Share link copied')\n } catch {\n toast.error('Could not copy link')\n }\n }, [shareUrl])\n\n const handlePrint = useCallback(() => {\n printRequestedRef.current = true\n window.print()\n }, [])\n\n return (\n <div\n className=\"scrollbar-reveal size-full overflow-y-auto bg-muted/25 text-foreground print:bg-white\"\n data-syllabus-root\n >\n <article\n className=\"syllabus-document mx-auto max-w-[40rem] bg-background px-6 py-10 shadow-sm sm:px-8 sm:py-12 print:max-w-none print:bg-white print:px-0 print:py-0 print:shadow-none\"\n ref={articleRef}\n >\n <header className=\"mb-10 border-border/60 border-t-[3px] pt-8 print:mb-8 print:border-t-2 print:pt-6\">\n <p className=\"mb-3 font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-[0.22em]\">\n Syllabus\n </p>\n <h1 className=\"text-balance font-medium text-[1.75rem] text-foreground leading-[1.2] tracking-tight print:text-[1.65rem]\">\n {deckTitle}\n </h1>\n {deckDescription && (\n <p className=\"mt-4 max-w-prose text-pretty text-[0.9375rem] text-muted-foreground leading-[1.65] print:text-[0.9rem]\">\n {deckDescription}\n </p>\n )}\n <div className=\"mt-5 flex flex-wrap items-center gap-x-3 gap-y-1 font-mono text-[11px] text-muted-foreground/80 uppercase tracking-wider\">\n <span>{formattedDate}</span>\n {outline.totalSlides > 0 && (\n <>\n <span aria-hidden className=\"text-muted-foreground/40\">\n ·\n </span>\n <span>{outline.totalSlides} slides</span>\n </>\n )}\n </div>\n\n <div className=\"mt-7 flex flex-wrap gap-2 print:hidden\" data-syllabus-actions>\n {shareUrl && (\n <Button onClick={handleCopyLink} size=\"lg\" type=\"button\" variant=\"outline\">\n <Link aria-hidden className=\"size-3.5\" />\n Copy link\n </Button>\n )}\n <Button onClick={handlePrint} size=\"lg\" type=\"button\" variant=\"outline\">\n <Printer aria-hidden className=\"size-3.5\" />\n Print\n </Button>\n </div>\n </header>\n\n <div className=\"syllabus-prose\">\n <SlideRenderModeContext.Provider value=\"web-syllabus\">\n <MDXProvider components={panelMdxComponents}>\n <Content key={contentVersion} />\n </MDXProvider>\n </SlideRenderModeContext.Provider>\n </div>\n\n <footer className=\"mt-14 border-border/40 border-t pt-6 text-center text-[11px] text-muted-foreground/55 print:mt-8\">\n Designed in Code by You Zhang &copy; ATOM63\n </footer>\n </article>\n </div>\n )\n}\n\nfunction formatLongDate(input: string): string {\n const d = new Date(input)\n if (Number.isNaN(d.getTime())) {\n return input\n }\n return d.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n}\n","import {\n Button,\n ButtonGroup,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../primitives'\nimport { BookOpen, ChevronLeft, ChevronRight, LayoutGrid, SlidersHorizontal } from 'lucide-react'\nimport type { Ref } from 'react'\n\ninterface MobileBottomBarProps {\n configButtonRef: Ref<HTMLButtonElement>\n currentSlide: number\n hasSyllabus: boolean\n isConfigOpen: boolean\n isSyllabusActive: boolean\n onNext: () => void\n onPrev: () => void\n onToggleConfig: () => void\n onToggleOverview: () => void\n onToggleSyllabus: () => void\n showOverview: boolean\n slideCount: number\n}\n\nexport function MobileBottomBar({\n configButtonRef,\n currentSlide,\n hasSyllabus,\n isConfigOpen,\n isSyllabusActive,\n onNext,\n onPrev,\n onToggleConfig,\n onToggleOverview,\n onToggleSyllabus,\n showOverview,\n slideCount,\n}: MobileBottomBarProps) {\n return (\n <div className=\"shrink-0 border-border/40 border-t bg-background\">\n {/* Row 1 — secondary actions */}\n <div className=\"flex items-center justify-end gap-1.5 px-3 pt-1.5\">\n <TooltipProvider>\n <ButtonGroup size=\"icon-sm\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n onClick={onToggleOverview}\n size=\"icon-sm\"\n type=\"button\"\n variant={showOverview ? 'secondary' : 'ghost'}\n >\n <LayoutGrid aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"top\">\n {showOverview ? 'Hide overview' : 'Slide overview'}\n </TooltipContent>\n </Tooltip>\n\n {hasSyllabus && (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n onClick={onToggleSyllabus}\n size=\"icon-sm\"\n type=\"button\"\n variant={isSyllabusActive ? 'secondary' : 'ghost'}\n >\n <BookOpen aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"top\">\n {isSyllabusActive ? 'Back to slides' : 'View syllabus'}\n </TooltipContent>\n </Tooltip>\n )}\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n onClick={onToggleConfig}\n ref={configButtonRef}\n size=\"icon-sm\"\n type=\"button\"\n variant={isConfigOpen ? 'secondary' : 'ghost'}\n >\n <SlidersHorizontal aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"top\">\n {isConfigOpen ? 'Close settings' : 'Slide settings'}\n </TooltipContent>\n </Tooltip>\n </ButtonGroup>\n </TooltipProvider>\n </div>\n\n {/* Row 2 — navigation */}\n <div className=\"flex items-center px-3 pt-1 pb-3\">\n <ButtonGroup size=\"icon-sm\">\n <Button\n aria-label=\"Previous slide\"\n onClick={onPrev}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronLeft aria-hidden />\n </Button>\n </ButtonGroup>\n <span className=\"flex-1 text-center font-mono text-muted-foreground text-xs tabular-nums\">\n {currentSlide + 1} / {slideCount}\n </span>\n <ButtonGroup size=\"icon-sm\">\n <Button\n aria-label=\"Next slide\"\n onClick={onNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ChevronRight aria-hidden />\n </Button>\n </ButtonGroup>\n </div>\n </div>\n )\n}\n","import {\n Button,\n ButtonGroup,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../primitives'\nimport { ArrowLeft } from 'lucide-react'\nimport { MDXProvider } from '@mdx-js/react'\nimport type { CSSProperties, Ref, RefObject } from 'react'\nimport { useRef } from 'react'\nimport { slideMdxComponents } from '../../content/mdx-components'\nimport type { DeckOutline } from '../../hooks/use-deck-outline'\nimport { useSwipeNav } from '../../hooks/use-swipe-nav'\nimport { SlidePaddingContext, useSlideConfig } from '../../stores/config-store'\nimport type { SlideDeckItem } from '../../types'\nimport { SlideConfigPanel } from '../config/config-panel'\nimport { SlideOverview } from '../stage/overview'\nimport { SlideStage } from '../stage/stage'\nimport { SyllabusView } from '../syllabus/syllabus-view'\nimport { MobileBottomBar } from './mobile-bottom-bar'\n\nexport interface MobilePresentationLayoutProps {\n configButtonRef: Ref<HTMLButtonElement>\n contentRef: RefObject<HTMLDivElement | null>\n currentSlideIndex: number\n deck: SlideDeckItem\n deckVersion: number\n domGeneration: number\n framePadding: { px: number; py: number }\n goNext: () => void\n goPrev: () => void\n handleOverviewSelect: (index: number) => void\n hasSyllabus: boolean\n isConfigOpen: boolean\n isSyllabusActive: boolean\n onBack: () => void\n onCloseConfig: () => void\n onToggleConfig: () => void\n onToggleOverview: () => void\n onToggleSyllabus: () => void\n outline: DeckOutline\n shareUrl: string | undefined\n showOverview: boolean\n slideCount: number\n typographyScaleValue: number\n}\n\nexport function MobilePresentationLayout({\n configButtonRef,\n contentRef,\n currentSlideIndex,\n deck,\n deckVersion,\n domGeneration,\n framePadding,\n goNext,\n goPrev,\n handleOverviewSelect,\n hasSyllabus,\n isConfigOpen,\n isSyllabusActive,\n onBack,\n onCloseConfig,\n onToggleConfig,\n onToggleOverview,\n onToggleSyllabus,\n outline,\n shareUrl,\n showOverview,\n slideCount,\n typographyScaleValue,\n}: MobilePresentationLayoutProps) {\n const Content = deck.content ?? (() => null)\n const theme = deck.meta.theme ?? 'auto'\n const preset = deck.meta.preset\n const padding = useSlideConfig(state => state.padding)\n\n // Attach swipe gestures to the slide stage area\n const stageRef = useRef<HTMLDivElement>(null)\n useSwipeNav(stageRef, { onNext: goNext, onPrev: goPrev })\n\n return (\n <div className=\"flex h-full flex-col bg-background\" data-slide-app>\n {/* Slim top bar */}\n <div className=\"flex h-11 shrink-0 items-center gap-2 border-border/40 border-b px-3\">\n <TooltipProvider>\n <ButtonGroup size=\"icon-sm\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button onClick={onBack} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n <ArrowLeft aria-hidden />\n </Button>\n }\n />\n <TooltipContent>Back to decks</TooltipContent>\n </Tooltip>\n </ButtonGroup>\n </TooltipProvider>\n <span className=\"min-w-0 flex-1 truncate font-medium text-foreground/80 text-sm\">\n {deck.meta.title}\n </span>\n </div>\n\n {/* Main area: slide stage or syllabus.\n IMPORTANT: The SlideStage + content div are always rendered (never\n unmounted) so that contentRef stays attached to the DOM. useSlidesDom\n holds a MutationObserver on contentRef.current — if it goes null the\n observer detaches and slide visibility won't recover when switching\n back from syllabus. We use `hidden` to visually hide it instead. */}\n <div className=\"relative min-h-0 flex-1\" ref={stageRef}>\n <div className={isSyllabusActive ? 'hidden' : 'flex size-full flex-col'}>\n <SlideStage preset={preset} theme={theme}>\n <div\n className=\"scrollbar-reveal flex size-full min-h-0 flex-col justify-center overflow-y-auto\"\n data-slide-content\n data-slide-theme={theme}\n ref={contentRef}\n style={\n {\n paddingLeft: `${framePadding.px}px`,\n paddingRight: `${framePadding.px}px`,\n paddingTop: `${framePadding.py}px`,\n paddingBottom: `${framePadding.py}px`,\n '--slide-frame-px': `${framePadding.px}px`,\n '--slide-frame-py': `${framePadding.py}px`,\n '--slide-type-scale': String(typographyScaleValue),\n } as CSSProperties\n }\n >\n <SlidePaddingContext.Provider value={padding}>\n <MDXProvider components={slideMdxComponents}>\n <Content key={deckVersion} />\n </MDXProvider>\n </SlidePaddingContext.Provider>\n </div>\n </SlideStage>\n </div>\n\n {isSyllabusActive && (\n <SyllabusView\n content={Content}\n contentVersion={deckVersion}\n deckDate={deck.meta.date}\n deckDescription={deck.meta.description}\n deckTitle={deck.meta.title}\n outline={outline}\n shareUrl={shareUrl}\n />\n )}\n\n {showOverview && (\n <SlideOverview\n currentSlide={currentSlideIndex}\n generation={domGeneration}\n onSelect={handleOverviewSelect}\n slideCount={slideCount}\n sourceRef={contentRef}\n />\n )}\n </div>\n\n {/* Bottom controls */}\n <MobileBottomBar\n configButtonRef={configButtonRef}\n currentSlide={currentSlideIndex}\n hasSyllabus={hasSyllabus}\n isConfigOpen={isConfigOpen}\n isSyllabusActive={isSyllabusActive}\n onNext={goNext}\n onPrev={goPrev}\n onToggleConfig={onToggleConfig}\n onToggleOverview={onToggleOverview}\n onToggleSyllabus={onToggleSyllabus}\n showOverview={showOverview}\n slideCount={slideCount}\n />\n\n <SlideConfigPanel\n anchorRef={configButtonRef as RefObject<HTMLElement | null>}\n isOpen={isConfigOpen}\n onClose={onCloseConfig}\n />\n </div>\n )\n}\n","import { memo } from 'react'\n\nimport {\n FRAME_PADDING_PX,\n SLIDE_FRAME_WATERMARK_PX,\n useSlideConfig,\n} from '../../stores/config-store'\n\n/** Inset (px) from the slide edge for the four corner register marks.\n * Positioning them in the bleed — outside both the content padding and\n * the watermark metadata row — so they never touch text, media, or the\n * folio chrome. This matches real printer's registration-mark\n * placement: marks sit on the trim corners, not on the live area. */\nconst TRIM_MARK_INSET_PX = 14\n\n/** Register-mark cross — a tiny plus glyph used to mark the four trim\n * corners of the slide. Structural, not decorative. */\nfunction RegistrationMark() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"text-foreground/20\"\n fill=\"none\"\n height={12}\n viewBox=\"0 0 12 12\"\n width={12}\n >\n <title>register mark</title>\n <line stroke=\"currentColor\" strokeWidth={1} x1={6} x2={6} y1={0} y2={12} />\n <line stroke=\"currentColor\" strokeWidth={1} x1={0} x2={12} y1={6} y2={6} />\n </svg>\n )\n}\n\n/** Decorative text frame overlay — positions metadata in the margin area\n * between the slide edge and the content grid. Also renders four\n * register-mark crosshairs at the corners of the content area and a\n * hairline rule above the footer watermark so the chrome reads like a\n * printed form instead of a web UI.\n *\n * Memoized so it only re-renders when the section/slide-count/title\n * actually change, not on every parent re-render. */\nfunction SlideFrameComponent({\n section,\n currentSlide,\n totalSlides,\n deckTitle,\n}: {\n section: string | null\n currentSlide: number\n totalSlides: number\n deckTitle: string\n}) {\n const padding = useSlideConfig(s => s.padding)\n const { px } = FRAME_PADDING_PX[padding]\n const { pb, pt } = SLIDE_FRAME_WATERMARK_PX[padding]\n\n const current = String(currentSlide + 1).padStart(2, '0')\n const total = String(totalSlides).padStart(2, '0')\n\n // Offset the glyph by -6 (half its 12px size) so the crosshair is\n // visually centered at the trim inset, not just flush-anchored to it.\n const markOffset = TRIM_MARK_INSET_PX - 6\n\n return (\n <div className=\"pointer-events-none absolute inset-0 z-10\">\n {/* Top-left: section label */}\n <div className=\"absolute\" style={{ left: px, top: pt }}>\n {section && (\n <span className=\"font-medium font-mono text-muted-foreground text-xs uppercase tabular-nums tracking-[0.22em]\">\n ■ {section}\n </span>\n )}\n </div>\n\n {/* Top-right: slide counter */}\n <div className=\"absolute flex items-baseline gap-1\" style={{ right: px, top: pt }}>\n <span className=\"font-mono text-muted-foreground text-xs tabular-nums tracking-[0.1em]\">\n {current}\n </span>\n <span className=\"font-mono text-muted-foreground text-xs\">/</span>\n <span className=\"font-mono text-muted-foreground text-xs tabular-nums tracking-[0.1em]\">\n {total}\n </span>\n </div>\n\n {/* Corner registration marks at the slide trim corners */}\n <div className=\"absolute\" style={{ left: markOffset, top: markOffset }}>\n <RegistrationMark />\n </div>\n <div className=\"absolute\" style={{ right: markOffset, top: markOffset }}>\n <RegistrationMark />\n </div>\n <div className=\"absolute\" style={{ bottom: markOffset, left: markOffset }}>\n <RegistrationMark />\n </div>\n <div className=\"absolute\" style={{ right: markOffset, bottom: markOffset }}>\n <RegistrationMark />\n </div>\n\n {/* Bottom-left: deck title with a hairline rule above it */}\n <div className=\"absolute flex items-center gap-3\" style={{ bottom: pb, left: px, right: px }}>\n <span className=\"font-mono text-muted-foreground text-xs uppercase tabular-nums tracking-[0.2em]\">\n {deckTitle}\n </span>\n <div className=\"h-px flex-1 bg-foreground/10\" />\n </div>\n </div>\n )\n}\n\nexport const SlideFrame = memo(SlideFrameComponent)\n","import { CONFIG_GAP_PX, FRAME_PADDING_PX, useSlideConfig } from '../../stores/config-store'\n\n/**\n * Design layout grid overlay for the 1920×1080 slide viewport.\n *\n * Renders the actual CSS Grid that the `Grid` primitive uses under the hood:\n * 12 columns × 8 rows with the current config's gutter and frame margin.\n * The overlay is live — switching padding in the config panel also resizes\n * this visualization so the guide always matches what the templates render.\n */\nconst COLUMNS = 12\nconst ROWS = 8\n\n// Static cells — never change, so created once at module load rather than on\n// every render. Parent re-renders (slide navigation) would otherwise allocate\n// 96 React elements per frame while the grid overlay is open.\nconst GRID_CELLS = Array.from({ length: COLUMNS * ROWS }, (_, i) => (\n <div className=\"bg-info/[0.04]\" key={`cell-${String(i)}`} />\n))\n\nexport function SlideLayoutGrid() {\n const configPadding = useSlideConfig(state => state.padding)\n const { px: marginX, py: marginY } = FRAME_PADDING_PX[configPadding]\n const gutter = CONFIG_GAP_PX[configPadding]\n\n return (\n <div className=\"pointer-events-none absolute inset-0 z-20\">\n {/* Margin boundary */}\n <div\n className=\"absolute border border-info/15 border-dashed\"\n style={{\n top: marginY,\n left: marginX,\n right: marginX,\n bottom: marginY,\n }}\n />\n\n {/* 12 × 8 grid (mirrors the real Grid primitive) */}\n <div\n className=\"absolute\"\n style={{\n top: marginY,\n left: marginX,\n right: marginX,\n bottom: marginY,\n display: 'grid',\n gridTemplateColumns: `repeat(${String(COLUMNS)}, minmax(0, 1fr))`,\n gridTemplateRows: `repeat(${String(ROWS)}, minmax(0, 1fr))`,\n gap: `${String(gutter)}px`,\n }}\n >\n {GRID_CELLS}\n </div>\n\n {/* Horizontal center line */}\n <div className=\"absolute top-1/2 left-0 h-px w-full bg-destructive/15\" />\n\n {/* Vertical center line */}\n <div className=\"absolute top-0 left-1/2 h-full w-px bg-destructive/15\" />\n\n {/* Horizontal thirds */}\n <div\n className=\"absolute left-0 h-px w-full bg-destructive/[0.07]\"\n style={{ top: '33.333%' }}\n />\n <div\n className=\"absolute left-0 h-px w-full bg-destructive/[0.07]\"\n style={{ top: '66.666%' }}\n />\n\n {/* Grid label — reflects current config */}\n <div className=\"absolute top-2 left-3\">\n <span className=\"font-mono text-info/30 text-sm uppercase tracking-widest\">\n {`${String(COLUMNS)}×${String(ROWS)} · ${String(gutter)}px gutter · ${String(marginX)}/${String(marginY)}px frame`}\n </span>\n </div>\n </div>\n )\n}\n","import { PanelLeft } from 'lucide-react'\nimport { Button } from '../primitives'\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react'\nimport type React from 'react'\nimport { memo, useEffect, useState } from 'react'\nimport { cn } from '../../lib/cn'\n\nconst RESIZE_STEP = 16\n\ninterface PresentationSidebarProps {\n children: React.ReactNode\n className?: string\n isOverlay?: boolean\n isVisible: boolean\n maxWidth?: number\n minWidth?: number\n onClose?: () => void\n onWidthChange?: (width: number) => void\n overlayMaxWidth?: number\n side?: 'left' | 'right'\n width: number\n}\n\nexport function PresentationSidebar({\n children,\n className,\n isOverlay = false,\n isVisible,\n maxWidth = 320,\n minWidth = 160,\n onClose,\n onWidthChange,\n overlayMaxWidth = 280,\n side = 'left',\n width,\n}: PresentationSidebarProps) {\n const [isResizing, setIsResizing] = useState(false)\n const [startX, setStartX] = useState(0)\n const [startWidth, setStartWidth] = useState(0)\n const reducedMotion = Boolean(useReducedMotion())\n\n const handleMouseDown = (event: React.MouseEvent) => {\n if (isOverlay) return\n event.preventDefault()\n setIsResizing(true)\n setStartX(event.clientX)\n setStartWidth(width)\n }\n\n const handleResizeKeyDown = (event: React.KeyboardEvent) => {\n if (isOverlay) return\n let nextWidth: number | null = null\n // For a left sidebar, ArrowRight grows it; for a right sidebar the\n // directions invert so the key matches the visual edge being dragged.\n const grow = side === 'right' ? -RESIZE_STEP : RESIZE_STEP\n switch (event.key) {\n case 'ArrowLeft':\n nextWidth = width - grow\n break\n case 'ArrowRight':\n nextWidth = width + grow\n break\n case 'Home':\n nextWidth = minWidth\n break\n case 'End':\n nextWidth = maxWidth\n break\n default:\n return\n }\n event.preventDefault()\n onWidthChange?.(Math.max(minWidth, Math.min(maxWidth, nextWidth)))\n }\n\n useEffect(() => {\n if (!isResizing) return\n\n const handleMouseMove = (event: MouseEvent) => {\n const delta = event.clientX - startX\n const adjustedDelta = side === 'right' ? -delta : delta\n const nextWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + adjustedDelta))\n onWidthChange?.(nextWidth)\n }\n\n const handleMouseUp = () => setIsResizing(false)\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n }, [isResizing, maxWidth, minWidth, onWidthChange, side, startWidth, startX])\n\n const effectiveWidth = isOverlay ? Math.min(width, overlayMaxWidth) : width\n\n return (\n <>\n <AnimatePresence initial={false}>\n {isVisible && isOverlay && (\n <motion.div\n animate={{ opacity: 1 }}\n className=\"absolute inset-0 z-40 bg-background/40\"\n exit={{ opacity: 0 }}\n initial={{ opacity: 0 }}\n onClick={onClose}\n transition={{ duration: reducedMotion ? 0 : 0.2 }}\n />\n )}\n </AnimatePresence>\n\n <motion.div\n animate={{ width: isVisible ? effectiveWidth : 0 }}\n className={cn(\n 'relative flex flex-shrink-0 flex-col overflow-hidden border-[color:var(--theme-slide-sidebar-border)] bg-[var(--theme-slide-sidebar-bg)]',\n // Only draw the divider when the panel is open — a collapsed panel\n // (width 0) would otherwise still render its 1px side border as a\n // stray line at the canvas edge.\n isVisible && (side === 'right' ? 'border-l' : 'border-r'),\n isOverlay && side === 'left' && 'absolute top-0 bottom-0 left-0 z-50 shadow-xl',\n isOverlay && side === 'right' && 'absolute top-0 right-0 bottom-0 z-50 shadow-xl',\n className\n )}\n initial={{ width: 0 }}\n style={{ pointerEvents: isVisible ? 'auto' : 'none' }}\n transition={\n isResizing || reducedMotion\n ? { duration: 0 }\n : { type: 'spring', damping: 30, stiffness: 300 }\n }\n >\n <div className=\"flex flex-1 flex-col overflow-hidden\" style={{ minWidth: effectiveWidth }}>\n {children}\n </div>\n\n {!isOverlay && (\n // biome-ignore lint/a11y/useSemanticElements: a focusable, keyboard-resizable splitter handle must be a <button> with role=\"separator\"; <hr> cannot be interactive\n <button\n aria-label=\"Resize sidebar\"\n aria-orientation=\"vertical\"\n aria-valuemax={maxWidth}\n aria-valuemin={minWidth}\n aria-valuenow={Math.round(width)}\n className={cn(\n 'absolute top-0 h-full w-0.5 cursor-col-resize transition-colors hover:bg-border focus-visible:bg-ring focus-visible:outline-none',\n side === 'right' ? 'left-0' : 'right-0',\n isResizing && 'bg-ring'\n )}\n onKeyDown={handleResizeKeyDown}\n onMouseDown={handleMouseDown}\n role=\"separator\"\n tabIndex={0}\n type=\"button\"\n />\n )}\n </motion.div>\n </>\n )\n}\n\ninterface PresentationToolbarProps {\n className?: string\n left?: React.ReactNode\n middle?: React.ReactNode\n right?: React.ReactNode\n}\n\nexport const PresentationToolbar = memo(\n ({ className, left, middle, right }: PresentationToolbarProps) => (\n <div\n className={cn(\n 'flex h-11 items-center justify-between gap-2 border-[color:var(--theme-slide-toolbar-border)] border-b bg-[var(--theme-slide-toolbar-bg)] px-2 shadow-sm',\n className\n )}\n >\n {left && <div className=\"flex shrink-0 items-center gap-1\">{left}</div>}\n {middle && <div className=\"min-w-0 flex-1 items-center\">{middle}</div>}\n {right && <div className=\"flex shrink-0 items-center gap-1\">{right}</div>}\n </div>\n )\n)\n\nPresentationToolbar.displayName = 'PresentationToolbar'\n\ninterface PresentationSidebarToggleProps {\n isVisible: boolean\n onToggle: () => void\n}\n\nexport function PresentationSidebarToggle({ isVisible, onToggle }: PresentationSidebarToggleProps) {\n return (\n <Button\n onClick={onToggle}\n size=\"icon\"\n title={isVisible ? 'Hide sidebar' : 'Show sidebar'}\n type=\"button\"\n variant=\"ghost\"\n withMotion={false}\n >\n <PanelLeft aria-hidden />\n </Button>\n )\n}\n\ninterface PresentationStatusBarProps {\n children: React.ReactNode\n className?: string\n}\n\nexport function PresentationStatusBar({ children, className }: PresentationStatusBarProps) {\n return (\n <div\n className={cn(\n 'flex items-center border-[color:var(--theme-slide-statusbar-border)] border-t bg-[var(--theme-slide-statusbar-bg)] px-4 py-1.5',\n className\n )}\n >\n <span className=\"text-muted-foreground text-sm\">{children}</span>\n </div>\n )\n}\n","import type { RefObject } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { DESIGN_WIDTH } from '../stage/dimensions'\nimport { SlideThumbnail } from '../stage/thumbnail'\n\ninterface SlidePresenterPipProps {\n currentSlideIndex: number\n currentTalkTrack: string | null\n generation?: number\n nextSlideIndex: number | null\n slideCount: number\n sourceRef: RefObject<HTMLDivElement | null>\n}\n\n// Thumbnails inside the PiP are read-only — clicking does nothing.\nconst handleNoopSelect = () => {\n // intentionally empty\n}\n\nfunction useThumbnailScale(containerRef: RefObject<HTMLDivElement | null>): number {\n const [scale, setScale] = useState(0)\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) {\n return\n }\n const measure = () => {\n const width = el.clientWidth\n if (width > 0) {\n setScale(width / DESIGN_WIDTH)\n }\n }\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [containerRef])\n\n return scale\n}\n\nexport function SlidePresenterPip({\n currentSlideIndex,\n nextSlideIndex,\n slideCount,\n currentTalkTrack,\n sourceRef,\n generation,\n}: SlidePresenterPipProps) {\n const measureRef = useRef<HTMLDivElement>(null)\n const scale = useThumbnailScale(measureRef)\n\n return (\n <div className=\"flex h-full flex-col gap-4 bg-background p-4 text-foreground\">\n <div className=\"flex items-center justify-end\">\n <span className=\"font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-wider\">\n {currentSlideIndex + 1} / {slideCount}\n </span>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-wider\">\n Current\n </div>\n <div ref={measureRef}>\n <SlideThumbnail\n generation={generation}\n isCurrent\n onSelect={handleNoopSelect}\n scale={scale}\n slideIndex={currentSlideIndex}\n sourceRef={sourceRef}\n />\n </div>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-wider\">\n {nextSlideIndex === null ? 'End of deck' : `Next · ${nextSlideIndex + 1}`}\n </div>\n {nextSlideIndex === null ? (\n <div\n className=\"flex w-full items-center justify-center rounded-lg border border-border/40 border-dashed text-muted-foreground/60 text-xs\"\n style={{ aspectRatio: '16 / 9' }}\n >\n End\n </div>\n ) : (\n <SlideThumbnail\n generation={generation}\n isCurrent={false}\n onSelect={handleNoopSelect}\n scale={scale}\n slideIndex={nextSlideIndex}\n sourceRef={sourceRef}\n />\n )}\n </div>\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col gap-1.5 overflow-hidden\">\n <div className=\"font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-wider\">\n Talk track\n </div>\n <div className=\"scrollbar-reveal min-h-0 flex-1 overflow-y-auto rounded-lg border border-border/40 bg-card/30 p-3\">\n {currentTalkTrack ? (\n <p className=\"whitespace-pre-line text-foreground text-sm leading-relaxed\">\n {currentTalkTrack}\n </p>\n ) : (\n <p className=\"text-muted-foreground/40 text-xs italic\">No talk track for this slide</p>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { useVirtualizer } from '@tanstack/react-virtual'\nimport type { RefObject } from 'react'\nimport { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { DESIGN_WIDTH } from '../stage/dimensions'\nimport { SlideThumbnail } from '../stage/thumbnail'\nimport { PresentationSidebar } from './chrome'\n\n/** Measure the inner container width to scale thumbnails dynamically. */\nfunction useSidebarScale(containerRef: RefObject<HTMLDivElement | null>) {\n const [scale, setScale] = useState(0)\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) {\n return\n }\n\n let raf = 0\n const measure = () => {\n // Account for padding (p-2 = 8px each side)\n const availableWidth = el.clientWidth - 16\n if (availableWidth > 0) {\n const next = availableWidth / DESIGN_WIDTH\n setScale(prev => (Math.abs(prev - next) < 0.0005 ? prev : next))\n }\n }\n\n const scheduleMeasure = () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n raf = requestAnimationFrame(() => {\n raf = 0\n measure()\n })\n }\n\n measure()\n\n const observer = new ResizeObserver(scheduleMeasure)\n observer.observe(el)\n return () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n observer.disconnect()\n }\n }, [containerRef])\n\n return scale\n}\n\nexport function SlideSidebar({\n slideCount,\n currentSlide,\n sourceRef,\n onSelect,\n isVisible,\n isOverlay,\n width,\n onWidthChange,\n onClose,\n generation,\n}: {\n slideCount: number\n currentSlide: number\n sourceRef: RefObject<HTMLDivElement | null>\n onSelect: (index: number) => void\n isVisible: boolean\n isOverlay: boolean\n width: number\n onWidthChange: (width: number) => void\n onClose: () => void\n generation?: number\n}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const scale = useSidebarScale(containerRef)\n\n const virtualizer = useVirtualizer({\n count: slideCount,\n estimateSize: () => 120,\n getScrollElement: () => containerRef.current,\n overscan: 5,\n paddingEnd: 8,\n paddingStart: 8,\n })\n\n useLayoutEffect(() => {\n if (slideCount === 0 || scale <= 0) {\n return\n }\n virtualizer.scrollToIndex(currentSlide, { align: 'center' })\n }, [currentSlide, scale, slideCount, virtualizer])\n\n return (\n <PresentationSidebar\n isOverlay={isOverlay}\n isVisible={isVisible}\n maxWidth={320}\n minWidth={160}\n onClose={onClose}\n onWidthChange={onWidthChange}\n width={width}\n >\n <div\n className=\"scrollbar-reveal flex-1 overflow-y-auto\"\n ref={containerRef}\n style={{ minWidth: width }}\n >\n <div\n className=\"relative w-full\"\n style={{ height: `${String(virtualizer.getTotalSize())}px` }}\n >\n {virtualizer.getVirtualItems().map(vRow => (\n <div\n className=\"px-2 pb-2\"\n data-index={vRow.index}\n key={vRow.key}\n ref={virtualizer.measureElement}\n style={{\n left: 0,\n position: 'absolute',\n top: 0,\n transform: `translateY(${String(vRow.start)}px)`,\n width: '100%',\n }}\n >\n <SlideThumbnail\n generation={generation}\n isCurrent={vRow.index === currentSlide}\n onSelect={onSelect}\n scale={scale}\n slideIndex={vRow.index}\n sourceRef={sourceRef}\n />\n </div>\n ))}\n </div>\n </div>\n </PresentationSidebar>\n )\n}\n","import { PresentationStatusBar } from './chrome'\n\ninterface SlideStatusBarProps {\n currentSlide?: number\n deckCount?: number\n totalSlides?: number\n view: 'picker' | 'presentation'\n}\n\nexport function SlideStatusBar({\n view,\n deckCount,\n currentSlide,\n totalSlides,\n}: SlideStatusBarProps) {\n if (view === 'picker') {\n return (\n <PresentationStatusBar>\n {deckCount ?? 0} deck{deckCount !== 1 ? 's' : ''}\n </PresentationStatusBar>\n )\n }\n\n return (\n <PresentationStatusBar>\n {(currentSlide ?? 0) + 1} / {totalSlides ?? 0}\n </PresentationStatusBar>\n )\n}\n","import {\n Button,\n ButtonGroup,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../primitives'\nimport {\n ArrowLeft,\n BookOpen,\n Code,\n Grid3x3,\n LayoutGrid,\n Maximize,\n Presentation,\n RefreshCw,\n SlidersHorizontal,\n} from 'lucide-react'\nimport type { Ref } from 'react'\nimport { memo } from 'react'\nimport { PresentationSidebarToggle, PresentationToolbar } from './chrome'\n\ninterface PresentationToolbarProps {\n configButtonRef?: Ref<HTMLButtonElement>\n hasSyllabus?: boolean\n isConfigOpen?: boolean\n isPresenterMode: boolean\n isPresenterSupported?: boolean\n isSyllabusActive?: boolean\n onRefreshDeck?: () => void\n onToggleConfig?: () => void\n onToggleFullscreen?: () => void\n onToggleGrid?: () => void\n onToggleOverview?: () => void\n onTogglePresenter?: () => void\n onToggleSource?: () => void\n isSourceOpen?: boolean\n onToggleSyllabus?: () => void\n showGrid: boolean\n showOverview: boolean\n}\n\nconst ToolbarButton = memo(\n ({\n label,\n children,\n onClick,\n variant = 'ghost',\n disabled,\n buttonRef,\n }: {\n label: string\n children: React.ReactNode\n onClick?: () => void\n variant?: 'ghost' | 'secondary'\n disabled?: boolean\n buttonRef?: Ref<HTMLButtonElement>\n }) => (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n ref={buttonRef}\n size=\"icon-sm\"\n type=\"button\"\n variant={variant}\n >\n {children}\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n )\n)\nToolbarButton.displayName = 'ToolbarButton'\n\nconst PresentationToolbarButtons = memo(\n ({\n configButtonRef,\n hasSyllabus = false,\n isConfigOpen = false,\n isPresenterMode,\n isPresenterSupported = true,\n isSyllabusActive = false,\n onRefreshDeck,\n onToggleConfig,\n onToggleSyllabus,\n showGrid,\n showOverview,\n onTogglePresenter,\n onToggleFullscreen,\n onToggleGrid,\n onToggleOverview,\n onToggleSource,\n isSourceOpen = false,\n }: PresentationToolbarProps) => {\n const presenterLabel = !isPresenterSupported\n ? 'Presenter window requires Chrome 116+'\n : isPresenterMode\n ? 'Exit presenter window (P)'\n : 'Open presenter window (P)'\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {onRefreshDeck && (\n <ButtonGroup size=\"icon-sm\">\n <ToolbarButton label=\"Reload deck\" onClick={onRefreshDeck}>\n <RefreshCw aria-hidden />\n </ToolbarButton>\n </ButtonGroup>\n )}\n {hasSyllabus && onToggleSyllabus && (\n <ButtonGroup size=\"icon-sm\">\n <ToolbarButton\n label={isSyllabusActive ? 'Back to slides' : 'View syllabus'}\n onClick={onToggleSyllabus}\n variant={isSyllabusActive ? 'secondary' : 'ghost'}\n >\n <BookOpen aria-hidden />\n </ToolbarButton>\n </ButtonGroup>\n )}\n <ButtonGroup size=\"icon-sm\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={showOverview ? 'Hide overview' : 'Slide overview'}\n onClick={onToggleOverview}\n size=\"icon-sm\"\n type=\"button\"\n variant={showOverview ? 'secondary' : 'ghost'}\n >\n <LayoutGrid aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">\n {showOverview ? 'Hide overview' : 'Slide overview'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={showGrid ? 'Hide layout grid' : 'Layout grid'}\n onClick={onToggleGrid}\n size=\"icon-sm\"\n type=\"button\"\n variant={showGrid ? 'secondary' : 'ghost'}\n >\n <Grid3x3 aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">\n {showGrid ? 'Hide layout grid' : 'Layout grid'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={isConfigOpen ? 'Close settings' : 'Slide settings'}\n ref={configButtonRef}\n onClick={onToggleConfig}\n size=\"icon-sm\"\n type=\"button\"\n variant={isConfigOpen ? 'secondary' : 'ghost'}\n >\n <SlidersHorizontal aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">\n {isConfigOpen ? 'Close settings' : 'Slide settings'}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={presenterLabel}\n disabled={!isPresenterSupported}\n onClick={onTogglePresenter}\n size=\"icon-sm\"\n type=\"button\"\n variant={isPresenterMode ? 'secondary' : 'ghost'}\n >\n <Presentation aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">{presenterLabel}</TooltipContent>\n </Tooltip>\n {onToggleSource && (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={isSourceOpen ? 'Hide MDX source' : 'View MDX source'}\n aria-pressed={isSourceOpen}\n onClick={onToggleSource}\n size=\"icon-sm\"\n type=\"button\"\n variant={isSourceOpen ? 'secondary' : 'ghost'}\n >\n <Code aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">\n {isSourceOpen ? 'Hide MDX source' : 'View MDX source'}\n </TooltipContent>\n </Tooltip>\n )}\n </ButtonGroup>\n <ButtonGroup size=\"icon-sm\">\n <ToolbarButton label=\"Fullscreen (F)\" onClick={onToggleFullscreen}>\n <Maximize aria-hidden />\n </ToolbarButton>\n </ButtonGroup>\n </div>\n )\n }\n)\nPresentationToolbarButtons.displayName = 'PresentationToolbarButtons'\n\ninterface SlideToolbarProps extends Partial<PresentationToolbarProps> {\n isSidebarVisible?: boolean\n onBack: () => void\n onToggleSidebar?: () => void\n view: 'picker' | 'presentation'\n}\n\nexport function SlideToolbar({\n view,\n onBack,\n configButtonRef,\n hasSyllabus = false,\n isConfigOpen = false,\n isSidebarVisible = false,\n isSyllabusActive = false,\n onToggleSidebar,\n isPresenterMode = false,\n isPresenterSupported = true,\n showGrid = false,\n showOverview = false,\n ...toggleProps\n}: SlideToolbarProps) {\n const isPresentationView = view === 'presentation'\n\n const breadcrumb = !isPresentationView ? (\n <span className=\"font-medium text-foreground text-xs\">Slides</span>\n ) : undefined\n\n const left = isPresentationView ? (\n <div className=\"flex items-center gap-1.5\">\n <ButtonGroup size=\"icon-sm\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Back to decks\"\n onClick={onBack}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ArrowLeft aria-hidden />\n </Button>\n }\n />\n <TooltipContent side=\"bottom\">Back to decks</TooltipContent>\n </Tooltip>\n </ButtonGroup>\n {onToggleSidebar && (\n <ButtonGroup size=\"icon-sm\">\n <PresentationSidebarToggle isVisible={isSidebarVisible} onToggle={onToggleSidebar} />\n </ButtonGroup>\n )}\n </div>\n ) : undefined\n\n const right = isPresentationView ? (\n <PresentationToolbarButtons\n configButtonRef={configButtonRef}\n hasSyllabus={hasSyllabus}\n isConfigOpen={isConfigOpen}\n isPresenterMode={isPresenterMode}\n isPresenterSupported={isPresenterSupported}\n isSyllabusActive={isSyllabusActive}\n showGrid={showGrid}\n showOverview={showOverview}\n {...toggleProps}\n />\n ) : undefined\n\n return (\n <TooltipProvider>\n <PresentationToolbar left={left} middle={breadcrumb} right={right} />\n </TooltipProvider>\n )\n}\n","import { MDXProvider } from '@mdx-js/react'\nimport type { CSSProperties, Dispatch, Ref, RefObject, SetStateAction } from 'react'\nimport { createPortal } from 'react-dom'\nimport { slideMdxComponents } from '../../content/mdx-components'\nimport type { DeckOutline } from '../../hooks/use-deck-outline'\nimport type { usePresenterPip } from '../../hooks/use-presenter-pip'\nimport { SlidePaddingContext, useSlideConfig } from '../../stores/config-store'\nimport type { SlideDeckItem } from '../../types'\nimport { SlideConfigPanel } from '../config/config-panel'\nimport { SlideFrame } from '../stage/frame'\nimport { SlideLayoutGrid } from '../stage/layout-grid'\nimport { SlideOverview } from '../stage/overview'\nimport { SlideStage } from '../stage/stage'\nimport { SyllabusView } from '../syllabus/syllabus-view'\nimport { PresentationSidebar } from './chrome'\nimport { SlidePresenterPip } from './presenter-pip'\nimport { SlideSidebar } from './sidebar'\nimport { SlideStatusBar } from './status-bar'\nimport { SlideToolbar } from './toolbar'\n\nexport interface DesktopPresentationLayoutProps {\n configButtonRef: Ref<HTMLButtonElement>\n containerRef: RefObject<HTMLDivElement | null>\n contentAreaRef: RefObject<HTMLDivElement | null>\n contentRef: RefObject<HTMLDivElement | null>\n currentSection: string | null\n currentSlideIndex: number\n currentTalkTrack: string | null\n deck: SlideDeckItem\n deckVersion: number\n domGeneration: number\n framePadding: { px: number; py: number }\n handleOverviewSelect: (index: number) => void\n hasSyllabus: boolean\n isConfigOpen: boolean\n isFullscreen: boolean\n isOverlay: boolean\n isSidebarVisible: boolean\n isSyllabusActive: boolean\n onBack: () => void\n onCloseConfig: () => void\n onCloseSidebar: () => void\n onCloseSyllabus: () => void\n onRefreshDeck: () => void\n onSyllabusWidthChange: (w: number) => void\n onToggleConfig: () => void\n onToggleFullscreen: () => void\n onToggleGrid: () => void\n onToggleOverview: () => void\n onTogglePresenter: () => void\n onToggleSidebar: () => void\n onToggleSource?: () => void\n isSourceOpen?: boolean\n onToggleSyllabus: () => void\n onWidthChange: (w: number) => void\n outline: DeckOutline\n presenterPip: ReturnType<typeof usePresenterPip>\n setCurrentSlideIndex: Dispatch<SetStateAction<number>>\n shareUrl: string | undefined\n showGrid: boolean\n showInlineTalkTrack: boolean\n showOverview: boolean\n showPagination: boolean\n sidebarWidth: number\n slideCount: number\n syllabusWidth: number\n typographyScaleValue: number\n}\n\nexport function DesktopPresentationLayout({\n configButtonRef,\n containerRef,\n contentAreaRef,\n contentRef,\n currentSection,\n currentSlideIndex,\n currentTalkTrack,\n deck,\n deckVersion,\n domGeneration,\n framePadding,\n handleOverviewSelect,\n hasSyllabus,\n isConfigOpen,\n isFullscreen,\n isOverlay,\n isSidebarVisible,\n isSyllabusActive,\n onBack,\n onCloseConfig,\n onCloseSidebar,\n onRefreshDeck,\n onToggleConfig,\n onToggleFullscreen,\n onToggleGrid,\n onToggleOverview,\n onTogglePresenter,\n onToggleSidebar,\n onToggleSource,\n isSourceOpen,\n onCloseSyllabus,\n onToggleSyllabus,\n onSyllabusWidthChange,\n onWidthChange,\n outline,\n syllabusWidth,\n presenterPip,\n setCurrentSlideIndex,\n shareUrl,\n showGrid,\n showInlineTalkTrack,\n showOverview,\n showPagination,\n sidebarWidth,\n slideCount,\n typographyScaleValue,\n}: DesktopPresentationLayoutProps) {\n const showChrome = !(isFullscreen || presenterPip.isOpen)\n const padding = useSlideConfig(state => state.padding)\n\n const Content = deck.content ?? (() => null)\n const theme = deck.meta.theme ?? 'auto'\n const preset = deck.meta.preset\n\n return (\n <div\n className={`flex h-full flex-col ${isFullscreen ? 'bg-background' : ''}`}\n data-slide-app\n ref={containerRef}\n >\n {showChrome && (\n <SlideToolbar\n configButtonRef={configButtonRef}\n hasSyllabus={hasSyllabus}\n isConfigOpen={isConfigOpen}\n isPresenterMode={presenterPip.isOpen}\n isPresenterSupported={presenterPip.isSupported}\n isSidebarVisible={isSidebarVisible}\n isSourceOpen={isSourceOpen}\n isSyllabusActive={isSyllabusActive}\n onBack={onBack}\n onRefreshDeck={onRefreshDeck}\n onToggleConfig={onToggleConfig}\n onToggleFullscreen={onToggleFullscreen}\n onToggleGrid={onToggleGrid}\n onToggleOverview={onToggleOverview}\n onTogglePresenter={onTogglePresenter}\n onToggleSidebar={onToggleSidebar}\n onToggleSource={onToggleSource}\n onToggleSyllabus={onToggleSyllabus}\n showGrid={showGrid}\n showOverview={showOverview}\n view=\"presentation\"\n />\n )}\n\n <div className=\"relative flex min-h-0 flex-1\" ref={contentAreaRef}>\n {showChrome && (\n <SlideSidebar\n currentSlide={currentSlideIndex}\n generation={domGeneration}\n isOverlay={isOverlay}\n isVisible={isSidebarVisible}\n onClose={onCloseSidebar}\n onSelect={setCurrentSlideIndex}\n onWidthChange={onWidthChange}\n slideCount={slideCount}\n sourceRef={contentRef}\n width={sidebarWidth}\n />\n )}\n {/* Stage + syllabus side panel share a flex row so the slide\n rescales automatically when the panel opens/closes. */}\n <div className=\"flex min-h-0 flex-1\">\n <SlideStage preset={preset} theme={theme}>\n {showGrid && <SlideLayoutGrid />}\n {showPagination && (\n <SlideFrame\n currentSlide={currentSlideIndex}\n deckTitle={deck.meta.title}\n section={currentSection}\n totalSlides={slideCount}\n />\n )}\n <div\n className=\"scrollbar-reveal flex size-full min-h-0 flex-col justify-center overflow-y-auto transition-[padding] duration-300 ease-out\"\n data-slide-content\n data-slide-theme={theme}\n ref={contentRef}\n style={\n {\n paddingLeft: `${framePadding.px}px`,\n paddingRight: `${framePadding.px}px`,\n paddingTop: `${framePadding.py}px`,\n paddingBottom: `${framePadding.py}px`,\n '--slide-frame-px': `${framePadding.px}px`,\n '--slide-frame-py': `${framePadding.py}px`,\n '--slide-type-scale': String(typographyScaleValue),\n } as CSSProperties\n }\n >\n <SlidePaddingContext.Provider value={padding}>\n <MDXProvider components={slideMdxComponents}>\n <Content key={deckVersion} />\n </MDXProvider>\n </SlidePaddingContext.Provider>\n </div>\n </SlideStage>\n\n <PresentationSidebar\n isOverlay={isOverlay}\n isVisible={isSyllabusActive && !presenterPip.isOpen}\n maxWidth={600}\n minWidth={320}\n onClose={onCloseSyllabus}\n onWidthChange={onSyllabusWidthChange}\n overlayMaxWidth={400}\n side=\"right\"\n width={syllabusWidth}\n >\n <SyllabusView\n content={Content}\n contentVersion={deckVersion}\n deckDate={deck.meta.date}\n deckDescription={deck.meta.description}\n deckTitle={deck.meta.title}\n outline={outline}\n shareUrl={shareUrl}\n />\n </PresentationSidebar>\n </div>\n\n {showOverview && (\n <SlideOverview\n currentSlide={currentSlideIndex}\n generation={domGeneration}\n onSelect={handleOverviewSelect}\n slideCount={slideCount}\n sourceRef={contentRef}\n />\n )}\n </div>\n\n {showInlineTalkTrack && showChrome && (\n <div className=\"border-border/50 border-t bg-secondary/30 px-6 py-4\">\n <div className=\"mb-1 font-medium font-mono text-[10px] text-muted-foreground uppercase tracking-wider\">\n Talk track\n </div>\n <div className=\"scrollbar-reveal max-h-32 overflow-y-auto\" key={currentTalkTrack}>\n {currentTalkTrack ? (\n <p className=\"whitespace-pre-line text-base text-foreground/80 leading-relaxed\">\n {currentTalkTrack}\n </p>\n ) : (\n <p className=\"text-muted-foreground/40 text-xs italic\">\n No talk track for this slide\n </p>\n )}\n </div>\n </div>\n )}\n\n {showChrome && (\n <SlideStatusBar\n currentSlide={currentSlideIndex}\n totalSlides={slideCount}\n view=\"presentation\"\n />\n )}\n\n {presenterPip.pipRoot &&\n createPortal(\n <SlidePresenterPip\n currentSlideIndex={currentSlideIndex}\n currentTalkTrack={currentTalkTrack}\n generation={domGeneration}\n nextSlideIndex={currentSlideIndex + 1 < slideCount ? currentSlideIndex + 1 : null}\n slideCount={slideCount}\n sourceRef={contentRef}\n />,\n presenterPip.pipRoot\n )}\n\n <SlideConfigPanel\n anchorRef={configButtonRef as RefObject<HTMLElement | null>}\n isOpen={isConfigOpen}\n onClose={onCloseConfig}\n />\n </div>\n )\n}\n","import { type RefObject, useLayoutEffect, useState } from 'react'\n\nexport interface OutlineSection {\n endSlide: number\n section: string\n /** Number of slides covered by this section (inclusive). */\n slideCount: number\n startSlide: number\n}\n\nexport interface DeckOutline {\n /** Sections in document order, each with the slide range it covers. */\n sections: OutlineSection[]\n /** Total slides in the deck — same number `useSlidesDom` reports. */\n totalSlides: number\n}\n\nconst EMPTY_OUTLINE: DeckOutline = { sections: [], totalSlides: 0 }\n\n/**\n * Walks the deck DOM to derive a structured outline from `<Section>` markers\n * and `<hr data-slide-break>` boundaries. Sections \"carry forward\": a Section\n * marker labels the slide it precedes plus all slides until the next marker.\n *\n * Re-runs whenever the source mounts or `generation` bumps (HMR / manual deck\n * refresh signals from `useSlidesDom`).\n */\nexport function useDeckOutline(\n sourceRef: RefObject<HTMLDivElement | null>,\n generation = 0\n): DeckOutline {\n const [outline, setOutline] = useState<DeckOutline>(EMPTY_OUTLINE)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: generation is an explicit invalidation trigger\n useLayoutEffect(() => {\n const container = sourceRef.current\n if (!container) {\n return\n }\n\n const sections: Array<{ section: string; startSlide: number }> = []\n let slideIdx = 0\n\n for (const child of container.children) {\n const el = child as HTMLElement\n if (el.hasAttribute('data-slide-break')) {\n slideIdx++\n continue\n }\n if (el.hasAttribute('data-slide-section')) {\n const text = el.textContent?.trim()\n if (text) {\n sections.push({ section: text, startSlide: slideIdx })\n }\n }\n }\n\n const totalSlides = slideIdx + 1\n const built: OutlineSection[] = sections.map((entry, i) => {\n const next = sections[i + 1]\n const endSlide = next ? next.startSlide - 1 : totalSlides - 1\n return {\n section: entry.section,\n startSlide: entry.startSlide,\n endSlide,\n slideCount: endSlide - entry.startSlide + 1,\n }\n })\n\n setOutline(prev => {\n if (\n prev.totalSlides === totalSlides &&\n prev.sections.length === built.length &&\n prev.sections.every(\n (s, i) =>\n s.section === built[i].section &&\n s.startSlide === built[i].startSlide &&\n s.endSlide === built[i].endSlide\n )\n ) {\n return prev\n }\n return { sections: built, totalSlides }\n })\n }, [sourceRef, generation])\n\n return outline\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nexport function useFullscreen() {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n useEffect(() => {\n const handleChange = () => {\n setIsFullscreen(document.fullscreenElement === containerRef.current)\n }\n\n document.addEventListener('fullscreenchange', handleChange)\n return () => document.removeEventListener('fullscreenchange', handleChange)\n }, [])\n\n const toggleFullscreen = useCallback(() => {\n if (!containerRef.current) {\n return\n }\n\n if (document.fullscreenElement) {\n // Can reject if exiting is blocked; the fullscreenchange listener keeps\n // isFullscreen authoritative either way.\n document.exitFullscreen().catch(error => {\n console.error('Failed to exit fullscreen:', error)\n })\n } else {\n // Rejects on user denial / locked fullscreen — swallow so it doesn't\n // surface as an unhandled rejection.\n containerRef.current.requestFullscreen().catch(error => {\n console.error('Failed to enter fullscreen:', error)\n })\n }\n }, [])\n\n return { containerRef, isFullscreen, toggleFullscreen }\n}\n","import { useEffect, useState } from 'react'\n\nconst QUERY = '(max-width: 767px)'\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === 'undefined') {\n return false\n }\n return window.matchMedia(QUERY).matches\n })\n\n useEffect(() => {\n const mql = window.matchMedia(QUERY)\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches)\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n }, [])\n\n return isMobile\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\n// Document Picture-in-Picture API types (not yet in standard lib.dom)\ninterface DocumentPictureInPictureOptions {\n height?: number\n width?: number\n}\n\ninterface DocumentPictureInPictureApi {\n requestWindow: (options?: DocumentPictureInPictureOptions) => Promise<Window>\n readonly window: Window | null\n}\n\ndeclare global {\n interface Window {\n readonly documentPictureInPicture?: DocumentPictureInPictureApi\n }\n}\n\nconst PIP_WIDTH = 640\nconst PIP_HEIGHT = 480\n\n/**\n * Mirror parent document's stylesheets, base URI, and theme classes into\n * the PiP document so cloned content renders identically.\n */\nfunction setupPipDocument(source: Document, target: Document): void {\n // Set base href so relative URLs in cloned <img>/<video> resolve correctly\n const baseTag = target.createElement('base')\n baseTag.href = source.baseURI\n target.head.appendChild(baseTag)\n\n // Clone all linked stylesheets and inline style tags from parent head\n const styleNodes = source.head.querySelectorAll('link[rel=\"stylesheet\"], style')\n for (const node of styleNodes) {\n target.head.appendChild(node.cloneNode(true))\n }\n\n // Mirror root attributes (data-theme, color-scheme, etc.) and class lists\n for (const attr of source.documentElement.attributes) {\n target.documentElement.setAttribute(attr.name, attr.value)\n }\n target.documentElement.className = source.documentElement.className\n target.body.className = source.body.className\n\n // Reset PiP body margin so the React root can fill the viewport\n target.body.style.margin = '0'\n target.body.style.height = '100vh'\n}\n\ninterface UsePresenterPipResult {\n close: () => void\n isOpen: boolean\n isSupported: boolean\n open: () => Promise<void>\n pipRoot: HTMLElement | null\n pipWindow: Window | null\n toggle: () => Promise<void>\n}\n\n/**\n * Manages a Document Picture-in-Picture window. The caller renders content\n * into `pipRoot` via `createPortal`. State is reactive because the React\n * tree spans both the parent window and the PiP window.\n */\nexport function usePresenterPip(): UsePresenterPipResult {\n const [pipWindow, setPipWindow] = useState<Window | null>(null)\n const [pipRoot, setPipRoot] = useState<HTMLElement | null>(null)\n const isOpeningRef = useRef(false)\n\n const isSupported = typeof window !== 'undefined' && 'documentPictureInPicture' in window\n\n const close = useCallback(() => {\n if (pipWindow) {\n pipWindow.close()\n }\n }, [pipWindow])\n\n const open = useCallback(async () => {\n if (!isSupported || pipWindow || isOpeningRef.current) {\n return\n }\n const api = window.documentPictureInPicture\n if (!api) {\n return\n }\n isOpeningRef.current = true\n try {\n const win = await api.requestWindow({\n width: PIP_WIDTH,\n height: PIP_HEIGHT,\n })\n\n setupPipDocument(document, win.document)\n\n const root = win.document.createElement('div')\n root.style.height = '100%'\n win.document.body.appendChild(root)\n\n // Self-removing so a closed PiP window leaves no stale listener.\n const handlePageHide = () => {\n win.removeEventListener('pagehide', handlePageHide)\n setPipWindow(null)\n setPipRoot(null)\n }\n win.addEventListener('pagehide', handlePageHide)\n\n setPipWindow(win)\n setPipRoot(root)\n } catch (error) {\n // requestWindow rejects on blocked permissions / policy. Swallow it so the\n // failure doesn't become an unhandled rejection; finally re-arms isOpeningRef\n // so a later attempt can still open.\n console.error('Failed to open presenter Picture-in-Picture window:', error)\n } finally {\n isOpeningRef.current = false\n }\n }, [isSupported, pipWindow])\n\n const toggle = useCallback(async () => {\n if (pipWindow) {\n close()\n return\n }\n await open()\n }, [pipWindow, open, close])\n\n // Close on Escape from the main window\n useEffect(() => {\n if (!pipWindow) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close()\n }\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [pipWindow, close])\n\n // Cleanup on unmount: close any open PiP window\n useEffect(() => {\n return () => {\n if (pipWindow) {\n pipWindow.close()\n }\n }\n }, [pipWindow])\n\n return {\n isOpen: pipWindow !== null,\n isSupported,\n open,\n close,\n toggle,\n pipRoot,\n pipWindow,\n }\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\n// Tracks the currently-running entrance animation per slide element so we\n// can cancel it before starting a new one when navigating rapidly. WeakMap\n// lets the element (and animation) be GC'd once the slide is removed from DOM.\nconst slideEntranceAnims = new WeakMap<HTMLElement, Animation>()\n\nfunction isBreak(el: HTMLElement): boolean {\n return el.hasAttribute('data-slide-break')\n}\n\nfunction isTalkTrack(el: HTMLElement): boolean {\n return el.hasAttribute('data-slide-talktrack')\n}\n\n/** Join block-level children with double newlines so paragraphs stay separate when rendered as plain text. Falls back to textContent for leaf nodes. */\nfunction extractBlockText(el: HTMLElement): string {\n if (el.children.length === 0) return el.textContent ?? ''\n const parts: string[] = []\n for (const child of el.children) {\n const text = (child as HTMLElement).textContent?.trim()\n if (text) {\n parts.push(text)\n }\n }\n return parts.join('\\n\\n')\n}\n\nfunction isSection(el: HTMLElement): boolean {\n return el.hasAttribute('data-slide-section')\n}\n\nfunction isSyllabus(el: HTMLElement): boolean {\n return el.hasAttribute('data-slide-syllabus')\n}\n\nfunction hideElement(el: HTMLElement) {\n el.style.display = 'none'\n // Cancel any in-flight entrance animation so it doesn't run as a ghost on a\n // display:none element. Animation.cancel() fires oncancel (not onfinish), so\n // we also delete the WeakMap entry here — onfinish won't do it.\n const anim = slideEntranceAnims.get(el)\n if (anim) {\n anim.cancel()\n slideEntranceAnims.delete(el)\n }\n for (const video of el.querySelectorAll<HTMLVideoElement>('video')) {\n video.pause()\n // Remove <source> srcs to release the WebMediaPlayer. Chrome creates one\n // WebMediaPlayer per <video> element in the document; with many slides in\n // the tree the count exceeds Chrome's limit (~75) and floods the console\n // with \"too many WebMediaPlayers\" warnings. Storing the src in a data\n // attribute lets showElement restore it without a React re-render.\n for (const source of video.querySelectorAll<HTMLSourceElement>('source')) {\n const src = source.getAttribute('src')\n if (src !== null) {\n source.dataset.deferredSrc = src\n source.removeAttribute('src')\n }\n }\n video.load()\n }\n}\n\nfunction showElement(el: HTMLElement, animate: boolean) {\n el.style.display = ''\n\n // Restore <source> srcs that were deferred by hideElement, then resume play.\n for (const video of el.querySelectorAll<HTMLVideoElement>('video')) {\n let restored = false\n for (const source of video.querySelectorAll<HTMLSourceElement>('source')) {\n const deferred = source.dataset.deferredSrc\n if (deferred !== undefined) {\n source.setAttribute('src', deferred)\n source.removeAttribute('data-deferred-src')\n restored = true\n }\n }\n if (restored) {\n video.load()\n }\n }\n\n // Resume autoplay videos that were paused when the slide was hidden.\n for (const video of el.querySelectorAll<HTMLVideoElement>('video[autoplay]')) {\n video.play().catch(() => {\n // autoplay blocked by browser policy — ignore\n })\n }\n\n // Reset CSS reveal animations so they replay on every slide entry.\n // Batch: write animation:none for all reveals → one reflow on the container\n // → write animation:'' for all reveals. N elements = 1 layout recalculation\n // instead of 1 per element.\n const reveals = el.querySelectorAll<HTMLElement>('.reveal')\n if (reveals.length > 0) {\n for (const reveal of reveals) {\n reveal.style.animation = 'none'\n }\n // biome-ignore lint/complexity/noVoid: single reflow to commit all animation resets before re-enabling\n void el.offsetHeight\n for (const reveal of reveals) {\n reveal.style.animation = ''\n }\n }\n\n if (animate) {\n // Cancel any still-running entrance animation so rapid navigation doesn't\n // stack multiple Animation objects on the same element.\n slideEntranceAnims.get(el)?.cancel()\n const anim = el.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: 180,\n easing: 'ease-out',\n })\n slideEntranceAnims.set(el, anim)\n anim.onfinish = () => {\n slideEntranceAnims.delete(el)\n }\n }\n}\n\ninterface ProcessResult {\n section: string | null\n slideCount: number\n talkTrack: string | null\n}\n\n// Sections \"carry forward\" — the most recent section heading at-or-before the\n// current slide wins, so that subsequent slides inherit the section label.\nfunction handleMetaElement(\n el: HTMLElement,\n slideIdx: number,\n currentSlide: number,\n meta: { talkTrack: string | null; section: string | null }\n) {\n if (isSection(el)) {\n hideElement(el)\n const text = el.textContent\n if (slideIdx <= currentSlide) {\n meta.section = text\n }\n return true\n }\n if (isTalkTrack(el)) {\n hideElement(el)\n if (slideIdx === currentSlide) {\n meta.talkTrack = extractBlockText(el)\n }\n return true\n }\n if (isSyllabus(el)) {\n hideElement(el)\n return true\n }\n return false\n}\n\nfunction processChildren(\n children: HTMLCollection,\n currentSlide: number,\n shouldAnimate: boolean\n): ProcessResult {\n let slideIdx = 0\n const meta = { talkTrack: null as string | null, section: null as string | null }\n\n for (const child of children) {\n const el = child as HTMLElement\n\n if (isBreak(el)) {\n hideElement(el)\n slideIdx++\n continue\n }\n\n if (handleMetaElement(el, slideIdx, currentSlide, meta)) {\n continue\n }\n\n if (slideIdx === currentSlide) {\n showElement(el, shouldAnimate)\n } else {\n hideElement(el)\n }\n }\n\n return { slideCount: slideIdx + 1, talkTrack: meta.talkTrack, section: meta.section }\n}\n\n/**\n * @param currentSlide - Index of the currently visible slide.\n * @param contentGeneration - Bumped when the deck MDX is manually refreshed.\n * @param isActive - Whether the content container is mounted in the DOM.\n * Pass `false` while the deck is gated (e.g. password lock) so the hook\n * can attach its observer / rescan as soon as the container appears.\n * Without this signal, both effects would early-return on the initial\n * render (when `contentRef.current` is null) and never re-run after the\n * gate clears, leaving every slide visible at once.\n */\nexport function useSlidesDom(currentSlide: number, contentGeneration = 0, isActive = true) {\n const contentRef = useRef<HTMLDivElement>(null)\n const [slideCount, setSlideCount] = useState(0)\n const [currentTalkTrack, setCurrentTalkTrack] = useState<string | null>(null)\n const [currentSection, setCurrentSection] = useState<string | null>(null)\n const [domGeneration, setDomGeneration] = useState(0)\n const prevSlideRef = useRef(-1)\n const prevIsActiveRef = useRef(false)\n\n // When content transitions from inactive → active (e.g. password gate\n // dismissed), bump domGeneration so useSyllabus / useDeckOutline re-scan\n // the newly mounted content. The MutationObserver can't cover this case\n // because it is set up in a useEffect (after paint) while the content is\n // already committed to the DOM by then.\n useLayoutEffect(() => {\n if (isActive && !prevIsActiveRef.current) {\n setDomGeneration(g => g + 1)\n }\n prevIsActiveRef.current = isActive\n }, [isActive])\n\n // Watch for structural changes inside the content container (HMR module\n // swaps add/remove slide nodes) and bump domGeneration so the rescan effect\n // and downstream thumbnail clones invalidate. Observed scope is intentionally\n // narrow:\n // - childList + subtree → catches added/removed slides (HMR, dynamic content)\n // - NO attributes → showElement/hideElement set inline styles; observing\n // them would create an infinite loop with the rescan effect below.\n // - NO characterData → runtime stateful slides updating text would\n // constantly bust thumbnail clones.\n // Mutations are coalesced via rAF so a burst of HMR updates triggers one bump.\n useEffect(() => {\n if (!isActive) {\n return\n }\n const container = contentRef.current\n if (!container) {\n return\n }\n\n let raf = 0\n const bump = () => {\n if (raf !== 0) {\n return\n }\n raf = requestAnimationFrame(() => {\n raf = 0\n setDomGeneration(g => g + 1)\n })\n }\n\n const observer = new MutationObserver(bump)\n observer.observe(container, { childList: true, subtree: true })\n return () => {\n if (raf !== 0) {\n cancelAnimationFrame(raf)\n }\n observer.disconnect()\n }\n }, [isActive])\n\n // After a print cycle the browser briefly applies @media print layout,\n // which causes the SlideStage ResizeObserver to fire and can clear the\n // manually-set display:none inline styles during React reconciliation.\n // No tracked dependency changes after afterprint, so processChildren\n // would never re-run without this listener. The rAF defers the bump\n // until the browser has removed print CSS and restored screen layout.\n useEffect(() => {\n const handleAfterPrint = () => {\n requestAnimationFrame(() => {\n setDomGeneration(g => g + 1)\n })\n }\n window.addEventListener('afterprint', handleAfterPrint)\n return () => {\n window.removeEventListener('afterprint', handleAfterPrint)\n }\n }, [])\n\n // contentGeneration bumps when MDX is manually refreshed (deckVersion).\n // domGeneration bumps when the DOM mutates (HMR, dynamic structural changes).\n // isActive flips when a gate (e.g. password lock) clears and the container\n // mounts. Any of these should trigger a rescan.\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentional invalidation when deck DOM is replaced\n useLayoutEffect(() => {\n if (!isActive) {\n return\n }\n const container = contentRef.current\n if (!container) {\n return\n }\n\n const isFirstRender = prevSlideRef.current === -1\n const slideChanged = prevSlideRef.current !== currentSlide\n const shouldAnimate = slideChanged && !isFirstRender\n\n const result = processChildren(container.children, currentSlide, shouldAnimate)\n\n prevSlideRef.current = currentSlide\n setSlideCount(c => (c === result.slideCount ? c : result.slideCount))\n setCurrentTalkTrack(t => (t === result.talkTrack ? t : result.talkTrack))\n setCurrentSection(s => (s === result.section ? s : result.section))\n }, [currentSlide, contentGeneration, domGeneration, isActive])\n\n return useMemo(\n () => ({ contentRef, slideCount, currentTalkTrack, currentSection, domGeneration }),\n [slideCount, currentTalkTrack, currentSection, domGeneration]\n )\n}\n","import { type RefObject, useLayoutEffect, useState } from 'react'\n\nexport interface SyllabusSnapshot {\n hasSyllabus: boolean\n}\n\nconst EMPTY: SyllabusSnapshot = { hasSyllabus: false }\nconst HAS: SyllabusSnapshot = { hasSyllabus: true }\n\n/**\n * Returns whether the deck contains a non-empty `<Syllabus>` block.\n * The actual node cloning is handled by `<SyllabusView>`, which reads from\n * the same `sourceRef`. Keeping this hook cheap means it can drive UI\n * affordances like \"hide the syllabus toggle when there's nothing to show\"\n * without holding stale DOM references across HMR.\n */\nexport function useSyllabus(\n sourceRef: RefObject<HTMLDivElement | null>,\n generation = 0\n): SyllabusSnapshot {\n const [snapshot, setSnapshot] = useState<SyllabusSnapshot>(EMPTY)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: generation is an explicit invalidation trigger\n useLayoutEffect(() => {\n const container = sourceRef.current\n if (!container) {\n return\n }\n\n const root = container.querySelector('[data-slide-syllabus]')\n const has = root !== null && root.children.length > 0\n\n setSnapshot(prev => {\n if (prev.hasSyllabus === has) return prev\n return has ? HAS : EMPTY\n })\n }, [sourceRef, generation])\n\n return snapshot\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\ninterface UseSyllabusToggleOptions {\n hasSyllabus: boolean\n initialView?: 'slides' | 'syllabus'\n onViewChange?: (view: 'slides' | 'syllabus') => void\n slug: string\n}\n\ninterface UseSyllabusToggleResult {\n closeSyllabus: () => void\n isSyllabusActive: boolean\n shareUrl: string | undefined\n toggleSyllabus: () => void\n}\n\n/**\n * Encapsulates the in-app syllabus view toggle:\n * - tracks whether the syllabus is the current inner view,\n * - notifies the parent on every change so the URL can carry `view=syllabus`,\n * - falls back to the slides view automatically if the syllabus disappears\n * (e.g. the author removed the `<Syllabus>` block via HMR), so the user\n * isn't stranded on an empty surface,\n * - builds the canonical share URL for the standalone syllabus route.\n *\n * The fallback only fires after `hasSyllabus` has been `true` at least once.\n * This prevents the initial mount race where `hasSyllabus` starts `false`\n * (DOM not yet rendered) from immediately clobbering `initialView='syllabus'`.\n */\nexport function useSyllabusToggle({\n hasSyllabus,\n initialView = 'slides',\n onViewChange,\n slug,\n}: UseSyllabusToggleOptions): UseSyllabusToggleResult {\n const [innerView, setInnerView] = useState<'slides' | 'syllabus'>(initialView)\n const isSyllabusActive = innerView === 'syllabus'\n // Tracks whether the deck has confirmed it has a syllabus at least once.\n // Guards against the initial-mount false-negative when hasSyllabus is still\n // false while the MDX tree hasn't rendered yet.\n const hasSyllabusEverBeenTrue = useRef(hasSyllabus)\n\n const toggleSyllabus = useCallback(() => {\n setInnerView(prev => (prev === 'syllabus' ? 'slides' : 'syllabus'))\n }, [])\n\n const closeSyllabus = useCallback(() => {\n setInnerView('slides')\n }, [])\n\n useEffect(() => {\n if (hasSyllabus) {\n hasSyllabusEverBeenTrue.current = true\n }\n // Only fall back when the syllabus genuinely disappears (HMR removal),\n // not on the initial render before the DOM has settled.\n if (innerView === 'syllabus' && !hasSyllabus && hasSyllabusEverBeenTrue.current) {\n setInnerView('slides')\n }\n }, [hasSyllabus, innerView])\n\n // Store in a ref so identity changes (e.g. when the parent rebuilds the\n // callback because `currentSlide` changed) do NOT re-trigger this effect —\n // we only want to notify when `innerView` itself changes.\n const onViewChangeRef = useRef(onViewChange)\n onViewChangeRef.current = onViewChange\n\n useEffect(() => {\n onViewChangeRef.current?.(innerView)\n }, [innerView])\n\n const shareUrl = useMemo(() => {\n if (typeof window === 'undefined') {\n return undefined\n }\n return `${window.location.origin}/syllabus/${slug}`\n }, [slug])\n\n return { isSyllabusActive, toggleSyllabus, closeSyllabus, shareUrl }\n}\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { SlidePasswordGate } from '../components/config/password-gate'\nimport { MobilePresentationLayout } from '../components/mobile/mobile-layout'\nimport { DesktopPresentationLayout } from '../components/presentation/desktop-layout'\nimport { useDeckOutline } from '../hooks/use-deck-outline'\nimport { useFullscreen } from '../hooks/use-fullscreen'\nimport { useIsMobile } from '../hooks/use-is-mobile'\nimport { usePresenterPip } from '../hooks/use-presenter-pip'\nimport { useSlidesDom } from '../hooks/use-slides-dom'\nimport { useSyllabus } from '../hooks/use-syllabus'\nimport { useSyllabusToggle } from '../hooks/use-syllabus-toggle'\nimport { FRAME_PADDING_PX, TYPOGRAPHY_SCALE_VALUES, useSlideConfig } from '../stores/config-store'\nimport type { SlidesPlayerProps } from './slides-player-types'\n\n/**\n * Host-agnostic presentation player. Receives a fully-loaded deck and renders\n * the full presentation UI (stage, sidebar, toolbar, keyboard nav).\n *\n * The host is responsible for: page meta, content loading, gate persistence,\n * and routing. This component only handles presentation orchestration.\n */\nexport function SlidesPlayer({\n deck,\n initialSlide = 0,\n onBack,\n onSlideChange,\n onToggleSource,\n isSourceOpen,\n gateProvider,\n renderCodeGate,\n}: SlidesPlayerProps) {\n const [deckUnlocked, setDeckUnlocked] = useState(() => {\n if (!gateProvider) return true\n const isLocked = deck.meta.locked ?? false\n if (!isLocked) return true\n return gateProvider.isUnlocked(deck.slug)\n })\n\n const isLocked = deck.meta.locked ?? false\n\n if (isLocked && !deckUnlocked) {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background px-4\">\n <SlidePasswordGate\n deckTitle={deck.meta.title}\n gateProvider={gateProvider!}\n onBack={onBack}\n onUnlock={() => setDeckUnlocked(true)}\n renderCodeGate={renderCodeGate}\n slug={deck.slug}\n />\n </div>\n )\n }\n\n return (\n <SlidesPlayerMounted\n deck={deck}\n initialSlide={initialSlide}\n isSourceOpen={isSourceOpen}\n onBack={onBack}\n onSlideChange={onSlideChange}\n onToggleSource={onToggleSource}\n />\n )\n}\n\nconst PAGE_NAV_NEXT_KEYS = ['ArrowRight', 'ArrowDown', ' ']\nconst PAGE_NAV_PREV_KEYS = ['ArrowLeft', 'ArrowUp']\n\nfunction SlidesPlayerMounted({\n deck,\n initialSlide,\n onBack,\n onSlideChange,\n onToggleSource,\n isSourceOpen,\n}: {\n deck: SlidesPlayerProps['deck']\n initialSlide: number\n onBack: () => void\n onSlideChange?: (index: number) => void\n onToggleSource?: () => void\n isSourceOpen?: boolean\n}) {\n const [currentSlideIndex, setCurrentSlideIndex] = useState(initialSlide)\n const [showGrid, setShowGrid] = useState(false)\n const [showOverview, setShowOverview] = useState(false)\n const [isConfigOpen, setIsConfigOpen] = useState(false)\n const [isSidebarVisible, setIsSidebarVisible] = useState(true)\n const [sidebarWidth, setSidebarWidth] = useState(208)\n const [syllabusWidth, setSyllabusWidth] = useState(400)\n const [contentVersion, setContentVersion] = useState(0)\n const configButtonRef = useRef<HTMLButtonElement>(null)\n const contentAreaRef = useRef<HTMLDivElement>(null)\n\n const configPadding = useSlideConfig(state => state.padding)\n const showPagination = useSlideConfig(state => state.showPagination)\n const showInlineTalkTrack = useSlideConfig(state => state.showInlineTalkTrack)\n const typographyScale = useSlideConfig(state => state.typographyScale)\n const framePadding = FRAME_PADDING_PX[configPadding]\n const typographyScaleValue = TYPOGRAPHY_SCALE_VALUES[typographyScale]\n\n const { containerRef, isFullscreen, toggleFullscreen } = useFullscreen()\n const presenterPip = usePresenterPip()\n\n const isMobile = useIsMobile()\n\n // When the layout switches (mobile ↔ desktop), the div holding ref={contentRef}\n // remounts. useSlidesDom's effects don't see the new node because contentRef is\n // a plain ref — bumping contentVersion forces a re-scan before the browser paints.\n // biome-ignore lint/correctness/useExhaustiveDependencies: isMobile is the change trigger, not a value consumed in the body\n useLayoutEffect(() => {\n setContentVersion(v => v + 1)\n }, [isMobile])\n\n const { contentRef, slideCount, currentTalkTrack, currentSection, domGeneration } = useSlidesDom(\n currentSlideIndex,\n contentVersion,\n true\n )\n const outline = useDeckOutline(contentRef, domGeneration)\n const { hasSyllabus } = useSyllabus(contentRef, domGeneration)\n const { isSyllabusActive, toggleSyllabus, closeSyllabus, shareUrl } = useSyllabusToggle({\n hasSyllabus,\n slug: deck.slug,\n })\n\n // Clamp to a valid index once slideCount resolves from MDX\n useEffect(() => {\n if (slideCount < 1) {\n return\n }\n setCurrentSlideIndex(prev => (prev >= slideCount ? slideCount - 1 : prev))\n }, [slideCount])\n\n // Notify host of slide changes without pushing history entries\n useEffect(() => {\n onSlideChange?.(currentSlideIndex)\n }, [currentSlideIndex, onSlideChange])\n\n const goNext = useCallback(() => {\n setCurrentSlideIndex(prev => Math.min(prev + 1, slideCount - 1))\n }, [slideCount])\n\n const goPrev = useCallback(() => {\n setCurrentSlideIndex(prev => Math.max(prev - 1, 0))\n }, [])\n\n const goFirst = useCallback(() => {\n setCurrentSlideIndex(0)\n }, [])\n\n const goLast = useCallback(() => {\n setCurrentSlideIndex(slideCount - 1)\n }, [slideCount])\n\n const handleOverviewSelect = useCallback((index: number) => {\n setCurrentSlideIndex(index)\n setShowOverview(false)\n }, [])\n\n // Keyboard navigation — active on the standalone page and forwarded to the\n // presenter Picture-in-Picture window. Keydown fires in the focused document's\n // context, so the PiP window (a separate document) needs its own listener;\n // both share the handler below so navigation behaves identically in either.\n //\n // Refs keep all volatile values current so the listener is registered once\n // on mount and never torn down / re-added as callbacks or showOverview change.\n const goNextRef = useRef(goNext)\n const goPrevRef = useRef(goPrev)\n const goFirstRef = useRef(goFirst)\n const goLastRef = useRef(goLast)\n const showOverviewRef = useRef(showOverview)\n const toggleFullscreenRef = useRef(toggleFullscreen)\n const togglePresenterRef = useRef(presenterPip.toggle)\n goNextRef.current = goNext\n goPrevRef.current = goPrev\n goFirstRef.current = goFirst\n goLastRef.current = goLast\n showOverviewRef.current = showOverview\n toggleFullscreenRef.current = toggleFullscreen\n togglePresenterRef.current = presenterPip.toggle\n\n const playerRef = useRef<HTMLDivElement>(null)\n\n // Shared keydown logic for the main player and the PiP presenter window.\n // Returns true when the key was handled (and preventDefault was called).\n const handleNavKeyDown = useCallback((e: KeyboardEvent): boolean => {\n const el = e.target as HTMLElement\n const tag = el?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el?.isContentEditable) {\n return false\n }\n const key = e.key\n if (key === 'Escape' && showOverviewRef.current) {\n e.preventDefault()\n setShowOverview(false)\n return true\n }\n\n let handled = true\n if (PAGE_NAV_NEXT_KEYS.includes(key)) {\n goNextRef.current()\n } else if (PAGE_NAV_PREV_KEYS.includes(key)) {\n goPrevRef.current()\n } else if (key === 'Home') {\n goFirstRef.current()\n } else if (key === 'End') {\n goLastRef.current()\n } else if (key === 'f' || key === 'F') {\n toggleFullscreenRef.current()\n } else if (key === 'p' || key === 'P') {\n togglePresenterRef.current()\n } else {\n handled = false\n }\n\n if (handled) {\n e.preventDefault()\n }\n return handled\n }, [])\n\n useEffect(() => {\n const el = playerRef.current\n if (!el) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (handleNavKeyDown(e)) {\n // Keep focus on the stable player root. The sidebar thumbnail list is\n // virtualized, so the focused thumbnail unmounts as the list scrolls;\n // without this, focus falls to <body> after ~one viewport of nav and\n // arrow keys stop reaching this handler (they revert to page scroll).\n playerRef.current?.focus()\n }\n }\n el.addEventListener('keydown', handleKeyDown)\n return () => {\n el.removeEventListener('keydown', handleKeyDown)\n }\n }, [handleNavKeyDown])\n\n // Forward navigation keys typed while the presenter PiP window has focus.\n // Its keydown events fire in the PiP document, so they never reach the main\n // player's listener above — the PiP window needs its own.\n const pipWindow = presenterPip.pipWindow\n useEffect(() => {\n if (!pipWindow) return\n pipWindow.addEventListener('keydown', handleNavKeyDown)\n return () => {\n pipWindow.removeEventListener('keydown', handleNavKeyDown)\n }\n }, [pipWindow, handleNavKeyDown])\n\n useEffect(() => {\n playerRef.current?.focus()\n }, [])\n\n const handleRefreshDeck = useCallback(() => {\n setContentVersion(v => v + 1)\n }, [])\n\n if (isMobile) {\n return (\n <div\n className=\"flex h-full flex-col bg-transparent outline-none\"\n ref={playerRef}\n tabIndex={-1}\n >\n <div className=\"min-h-0 flex-1\">\n <MobilePresentationLayout\n configButtonRef={configButtonRef}\n contentRef={contentRef}\n currentSlideIndex={currentSlideIndex}\n deck={deck}\n deckVersion={0}\n domGeneration={domGeneration}\n framePadding={framePadding}\n goNext={goNext}\n goPrev={goPrev}\n handleOverviewSelect={handleOverviewSelect}\n hasSyllabus={hasSyllabus}\n isConfigOpen={isConfigOpen}\n isSyllabusActive={isSyllabusActive}\n onBack={onBack}\n onCloseConfig={() => setIsConfigOpen(false)}\n onToggleConfig={() => setIsConfigOpen(prev => !prev)}\n onToggleOverview={() => setShowOverview(prev => !prev)}\n onToggleSyllabus={toggleSyllabus}\n outline={outline}\n shareUrl={shareUrl}\n showOverview={showOverview}\n slideCount={slideCount}\n typographyScaleValue={typographyScaleValue}\n />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col bg-transparent outline-none\" ref={playerRef} tabIndex={-1}>\n <div className=\"min-h-0 flex-1\">\n <DesktopPresentationLayout\n configButtonRef={configButtonRef}\n containerRef={containerRef}\n contentAreaRef={contentAreaRef}\n contentRef={contentRef}\n currentSection={currentSection}\n currentSlideIndex={currentSlideIndex}\n currentTalkTrack={currentTalkTrack}\n deck={deck}\n deckVersion={0}\n domGeneration={domGeneration}\n framePadding={framePadding}\n handleOverviewSelect={handleOverviewSelect}\n hasSyllabus={hasSyllabus}\n isConfigOpen={isConfigOpen}\n isFullscreen={isFullscreen}\n isOverlay={false}\n isSidebarVisible={isSidebarVisible}\n isSourceOpen={isSourceOpen}\n isSyllabusActive={isSyllabusActive}\n onBack={onBack}\n onCloseConfig={() => setIsConfigOpen(false)}\n onCloseSidebar={() => setIsSidebarVisible(false)}\n onCloseSyllabus={closeSyllabus}\n onRefreshDeck={handleRefreshDeck}\n onSyllabusWidthChange={setSyllabusWidth}\n onToggleConfig={() => setIsConfigOpen(prev => !prev)}\n onToggleFullscreen={toggleFullscreen}\n onToggleGrid={() => setShowGrid(prev => !prev)}\n onToggleOverview={() => setShowOverview(prev => !prev)}\n onTogglePresenter={presenterPip.toggle}\n onToggleSidebar={() => setIsSidebarVisible(prev => !prev)}\n onToggleSource={onToggleSource}\n onToggleSyllabus={toggleSyllabus}\n onWidthChange={setSidebarWidth}\n outline={outline}\n presenterPip={presenterPip}\n setCurrentSlideIndex={setCurrentSlideIndex}\n shareUrl={shareUrl}\n showGrid={showGrid}\n showInlineTalkTrack={showInlineTalkTrack}\n showOverview={showOverview}\n showPagination={showPagination}\n sidebarWidth={sidebarWidth}\n slideCount={slideCount}\n syllabusWidth={syllabusWidth}\n typographyScaleValue={typographyScaleValue}\n />\n </div>\n </div>\n )\n}\n","/** The kind of fillable content a slot accepts. Layout enums are out of scope. */\nexport type SlotKind = 'text' | 'richtext' | 'media' | 'list'\n\n/** A single fillable field — a direct template prop or a compound-slot prop. */\nexport interface SlotDef {\n /** Prop name as written in MDX/JSX. */\n key: string\n kind: SlotKind\n required: boolean\n /** Human-readable label for editor UIs. */\n label: string\n /**\n * True when the prop is a repeated scalar value that is NOT a compound child\n * (e.g. ImageTrioSlide.images, ClosingSlide.handles). Repeated compound\n * children (e.g. HeroBento.Card) are modeled via SlotGroupDef, not this flag.\n */\n array?: boolean\n}\n\n/** A compound child slot, e.g. `HeroBento.Card`, with cardinality + its own props. */\nexport interface SlotGroupDef {\n /** Sub-component name as written after the dot, e.g. \"Card\" for HeroBento.Card. */\n name: string\n min: number\n max: number\n props: SlotDef[]\n}\n\nexport type TemplateCategory =\n | 'cover'\n | 'statement'\n | 'quote'\n | 'media'\n | 'gallery'\n | 'data'\n | 'split'\n | 'closing'\n\n/** Full machine-readable description of one author-facing template. */\nexport interface TemplateDef {\n /** Component name as written in MDX, e.g. \"HeroBento\". */\n name: string\n label: string\n category: TemplateCategory\n /** Direct props on the template component. */\n props: SlotDef[]\n /** Compound child slots; empty for simple templates. */\n slots: SlotGroupDef[]\n}\n\n/** Registry of every author-facing template, keyed by component name. */\nexport const templateRegistry: Record<string, TemplateDef> = {\n CoverSlide: {\n name: 'CoverSlide',\n label: 'Editorial cover',\n category: 'cover',\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'subtitle', kind: 'richtext', required: false, label: 'Subtitle' },\n { key: 'eyebrow', kind: 'text', required: false, label: 'Eyebrow' },\n { key: 'credit', kind: 'text', required: false, label: 'Credit' },\n { key: 'logo', kind: 'richtext', required: false, label: 'Logo' },\n ],\n slots: [],\n },\n FullBleedSlide: {\n name: 'FullBleedSlide',\n label: 'Full-bleed media',\n category: 'media',\n props: [\n { key: 'mediaSrc', kind: 'media', required: true, label: 'Media' },\n { key: 'mediaAlt', kind: 'text', required: false, label: 'Media alt text' },\n { key: 'label', kind: 'text', required: false, label: 'Caption label' },\n { key: 'title', kind: 'text', required: false, label: 'Caption title' },\n ],\n slots: [],\n },\n FullBleedCoverSlide: {\n name: 'FullBleedCoverSlide',\n label: 'Full-bleed cover',\n category: 'cover',\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'subtitle', kind: 'richtext', required: false, label: 'Subtitle' },\n { key: 'eyebrow', kind: 'text', required: false, label: 'Eyebrow' },\n { key: 'credit', kind: 'text', required: false, label: 'Credit' },\n { key: 'mediaSrc', kind: 'media', required: true, label: 'Background media' },\n { key: 'mediaAlt', kind: 'text', required: false, label: 'Media alt text' },\n { key: 'mastheadLabel', kind: 'text', required: false, label: 'Masthead label' },\n ],\n slots: [],\n },\n QuoteSlide: {\n name: 'QuoteSlide',\n label: 'Editorial quote',\n category: 'quote',\n props: [\n { key: 'quote', kind: 'richtext', required: true, label: 'Quote' },\n { key: 'attribution', kind: 'text', required: false, label: 'Attribution' },\n ],\n slots: [],\n },\n SectionSlide: {\n name: 'SectionSlide',\n label: 'Section divider',\n category: 'statement',\n props: [\n { key: 'number', kind: 'text', required: false, label: 'Section number' },\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'subtitle', kind: 'richtext', required: false, label: 'Subtitle' },\n { key: 'imageSrc', kind: 'media', required: false, label: 'Image' },\n { key: 'imageAlt', kind: 'text', required: false, label: 'Image alt text' },\n ],\n slots: [],\n },\n StatementSlide: {\n name: 'StatementSlide',\n label: 'Statement / thesis',\n category: 'statement',\n props: [\n { key: 'kicker', kind: 'text', required: false, label: 'Kicker' },\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'subtitle', kind: 'richtext', required: false, label: 'Subtitle' },\n ],\n slots: [],\n },\n SplitHalf: {\n name: 'SplitHalf',\n label: '50/50 split',\n category: 'split',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Panel',\n min: 0,\n max: 2,\n props: [{ key: 'children', kind: 'richtext', required: true, label: 'Panel content' }],\n },\n ],\n },\n ClosingSlide: {\n name: 'ClosingSlide',\n label: 'Closing / colophon',\n category: 'closing',\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'eyebrow', kind: 'text', required: false, label: 'Eyebrow' },\n { key: 'website', kind: 'text', required: false, label: 'Website' },\n { key: 'email', kind: 'text', required: false, label: 'Email' },\n { key: 'handles', kind: 'list', required: false, label: 'Contact handles', array: true },\n ],\n slots: [],\n },\n HeroBento: {\n name: 'HeroBento',\n label: 'Hero + cards',\n category: 'media',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Hero',\n min: 0,\n max: 1,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n {\n name: 'Card',\n min: 0,\n max: 3,\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Card title' },\n { key: 'body', kind: 'richtext', required: false, label: 'Card body' },\n ],\n },\n ],\n },\n MediaTrio: {\n name: 'MediaTrio',\n label: 'Hero + two media',\n category: 'media',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Hero',\n min: 0,\n max: 1,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n {\n name: 'Media',\n min: 0,\n max: 2,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n ],\n },\n StatBento: {\n name: 'StatBento',\n label: 'Narrative + stats',\n category: 'data',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Body',\n min: 0,\n max: 1,\n props: [{ key: 'children', kind: 'richtext', required: true, label: 'Body' }],\n },\n {\n name: 'Stat',\n min: 0,\n max: 6,\n props: [\n { key: 'value', kind: 'text', required: true, label: 'Value' },\n { key: 'label', kind: 'text', required: true, label: 'Label' },\n ],\n },\n ],\n },\n Collage: {\n name: 'Collage',\n label: 'Featured + crops',\n category: 'gallery',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Featured',\n min: 0,\n max: 1,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n {\n name: 'Image',\n min: 0,\n max: 4,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n ],\n },\n QuoteWithMedia: {\n name: 'QuoteWithMedia',\n label: 'Quote + media',\n category: 'quote',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Quote',\n min: 0,\n max: 1,\n props: [\n { key: 'text', kind: 'richtext', required: true, label: 'Quote' },\n { key: 'attribution', kind: 'text', required: false, label: 'Attribution' },\n ],\n },\n {\n name: 'Media',\n min: 0,\n max: 1,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n ],\n },\n SplitWithStat: {\n name: 'SplitWithStat',\n label: 'Text + media + stats',\n category: 'data',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Text',\n min: 0,\n max: 1,\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'body', kind: 'richtext', required: false, label: 'Body' },\n { key: 'bullets', kind: 'list', required: false, label: 'Bullets', array: true },\n ],\n },\n {\n name: 'Media',\n min: 0,\n max: 1,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n {\n name: 'Stat',\n min: 0,\n max: 4,\n props: [\n { key: 'value', kind: 'text', required: true, label: 'Value' },\n { key: 'label', kind: 'text', required: true, label: 'Label' },\n ],\n },\n ],\n },\n TextLead: {\n name: 'TextLead',\n label: 'Text lead + media',\n category: 'media',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Text',\n min: 0,\n max: 1,\n props: [\n { key: 'title', kind: 'text', required: false, label: 'Title' },\n { key: 'body', kind: 'richtext', required: false, label: 'Body' },\n { key: 'bullets', kind: 'list', required: false, label: 'Bullets', array: true },\n ],\n },\n {\n name: 'Media',\n min: 0,\n max: 3,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n ],\n },\n TimelineBento: {\n name: 'TimelineBento',\n label: 'Timeline steps',\n category: 'data',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Masthead label' },\n { key: 'title', kind: 'text', required: false, label: 'Masthead title' },\n ],\n slots: [\n {\n name: 'Intro',\n min: 0,\n max: 1,\n props: [\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'body', kind: 'richtext', required: false, label: 'Body' },\n ],\n },\n {\n name: 'Step',\n min: 0,\n max: 3,\n props: [\n { key: 'step', kind: 'text', required: false, label: 'Step number' },\n { key: 'title', kind: 'text', required: true, label: 'Title' },\n { key: 'body', kind: 'richtext', required: false, label: 'Body' },\n ],\n },\n ],\n },\n FullBleedGallery: {\n name: 'FullBleedGallery',\n label: 'Full-bleed gallery',\n category: 'gallery',\n props: [\n { key: 'label', kind: 'text', required: false, label: 'Overlay label' },\n { key: 'title', kind: 'text', required: false, label: 'Overlay title' },\n ],\n slots: [\n {\n name: 'Image',\n min: 0,\n max: 6,\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n ],\n },\n ],\n },\n ImageSlide: {\n name: 'ImageSlide',\n label: 'Single image',\n category: 'media',\n props: [\n { key: 'src', kind: 'media', required: true, label: 'Image' },\n { key: 'alt', kind: 'text', required: false, label: 'Alt text' },\n { key: 'caption', kind: 'text', required: false, label: 'Caption' },\n ],\n slots: [],\n },\n ImageDuoSlide: {\n name: 'ImageDuoSlide',\n label: 'Two images',\n category: 'media',\n props: [\n { key: 'left', kind: 'media', required: true, label: 'Left image' },\n { key: 'right', kind: 'media', required: true, label: 'Right image' },\n { key: 'caption', kind: 'text', required: false, label: 'Caption' },\n ],\n slots: [],\n },\n ImageTrioSlide: {\n name: 'ImageTrioSlide',\n label: 'Three images',\n category: 'gallery',\n props: [\n { key: 'images', kind: 'media', required: true, label: 'Images', array: true },\n { key: 'caption', kind: 'text', required: false, label: 'Caption' },\n ],\n slots: [],\n },\n}\n\n/** Union of every registered template name, derived from the registry. */\nexport type TemplateName = keyof typeof templateRegistry\n\n/** All registered template names. */\nexport const templateNames: readonly TemplateName[] = Object.keys(templateRegistry) as TemplateName[]\n\n/** Look up one template definition by component name. */\nexport function getTemplate(name: string): TemplateDef | undefined {\n return templateRegistry[name]\n}\n\n/** Every template definition, insertion order. */\nexport function listTemplates(): TemplateDef[] {\n return Object.values(templateRegistry)\n}\n"]}