@usetheo/ui 0.1.0-next.0 → 0.1.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +116 -9
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugin-Atb0VKtr.d.ts +172 -0
  6. package/dist/slide/index.d.ts +212 -0
  7. package/dist/slide/index.js +714 -0
  8. package/dist/slide/index.js.map +1 -0
  9. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  10. package/dist/slide/plugins/emoji/index.js +157 -0
  11. package/dist/slide/plugins/emoji/index.js.map +1 -0
  12. package/dist/slide/plugins/math/index.d.ts +13 -0
  13. package/dist/slide/plugins/math/index.js +145 -0
  14. package/dist/slide/plugins/math/index.js.map +1 -0
  15. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  16. package/dist/slide/plugins/mermaid/index.js +218 -0
  17. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  18. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  19. package/dist/slide/plugins/shiki/index.js +87 -0
  20. package/dist/slide/plugins/shiki/index.js.map +1 -0
  21. package/dist/slide/themes/default.css +256 -0
  22. package/dist/slide/themes/layouts.css +143 -0
  23. package/dist/slide/themes/violet-forge.css +256 -0
  24. package/dist/slide-deck/index.css +52 -0
  25. package/dist/slide-deck/index.css.map +1 -0
  26. package/dist/slide-deck/index.d.ts +377 -0
  27. package/dist/slide-deck/index.js +1797 -0
  28. package/dist/slide-deck/index.js.map +1 -0
  29. package/dist/whiteboard/index.d.ts +258 -0
  30. package/dist/whiteboard/index.js +738 -0
  31. package/dist/whiteboard/index.js.map +1 -0
  32. package/package.json +141 -9
  33. package/registry/r/agent-composer.json +4 -4
  34. package/registry/r/agent-editor.json +9 -9
  35. package/registry/r/agent-error-card.json +2 -2
  36. package/registry/r/agent-event.json +4 -4
  37. package/registry/r/agent-handoff.json +2 -2
  38. package/registry/r/agent-profile.json +2 -2
  39. package/registry/r/agent-starting-state.json +2 -2
  40. package/registry/r/agent-stream.json +9 -9
  41. package/registry/r/agent-streaming.json +2 -2
  42. package/registry/r/agent-timeline.json +4 -4
  43. package/registry/r/approval-card.json +4 -4
  44. package/registry/r/artifact-preview.json +2 -2
  45. package/registry/r/attachment-chip.json +4 -4
  46. package/registry/r/audit-log-entry.json +3 -3
  47. package/registry/r/auto-compact-notice.json +2 -2
  48. package/registry/r/avatar.json +2 -2
  49. package/registry/r/badge.json +2 -2
  50. package/registry/r/browser-controls.json +2 -2
  51. package/registry/r/build-log-stream.json +2 -2
  52. package/registry/r/button.json +2 -2
  53. package/registry/r/capability-indicator.json +3 -3
  54. package/registry/r/card.json +2 -2
  55. package/registry/r/chat-composer.json +3 -3
  56. package/registry/r/chat-message.json +3 -3
  57. package/registry/r/chat-thread.json +2 -2
  58. package/registry/r/checkbox.json +2 -2
  59. package/registry/r/command-palette.json +4 -4
  60. package/registry/r/context-card.json +3 -3
  61. package/registry/r/context-window-bar.json +2 -2
  62. package/registry/r/cost-meter.json +2 -2
  63. package/registry/r/created-files-card.json +3 -3
  64. package/registry/r/cron-job-card.json +2 -2
  65. package/registry/r/cron-jobs-list.json +3 -3
  66. package/registry/r/deployment-row.json +3 -3
  67. package/registry/r/dialog.json +2 -2
  68. package/registry/r/diff-viewer.json +2 -2
  69. package/registry/r/domain-config.json +6 -6
  70. package/registry/r/empty-state.json +3 -3
  71. package/registry/r/env-var-editor.json +5 -5
  72. package/registry/r/folder-context-card.json +3 -3
  73. package/registry/r/folder-selector.json +2 -2
  74. package/registry/r/form-field.json +2 -2
  75. package/registry/r/hook-config.json +2 -2
  76. package/registry/r/hook-event-log.json +2 -2
  77. package/registry/r/input.json +2 -2
  78. package/registry/r/intent-selector.json +3 -3
  79. package/registry/r/label.json +2 -2
  80. package/registry/r/lane-board.json +2 -2
  81. package/registry/r/login-split.json +2 -2
  82. package/registry/r/mcp-server-card.json +2 -2
  83. package/registry/r/mcp-server-list.json +3 -3
  84. package/registry/r/memory-editor.json +3 -3
  85. package/registry/r/mention-menu.json +3 -3
  86. package/registry/r/metrics-panel.json +2 -2
  87. package/registry/r/model-card.json +3 -3
  88. package/registry/r/model-selector.json +2 -2
  89. package/registry/r/permission-matrix.json +2 -2
  90. package/registry/r/permission-modal.json +4 -4
  91. package/registry/r/preview-env-card.json +5 -5
  92. package/registry/r/preview-panel.json +3 -3
  93. package/registry/r/progress-checklist.json +3 -3
  94. package/registry/r/project-card.json +5 -5
  95. package/registry/r/project-switcher.json +2 -2
  96. package/registry/r/quick-action-chips.json +3 -3
  97. package/registry/r/radio-group.json +2 -2
  98. package/registry/r/recent-folders-list.json +2 -2
  99. package/registry/r/rollback-ui.json +4 -4
  100. package/registry/r/rule-card.json +3 -3
  101. package/registry/r/rule-editor.json +10 -10
  102. package/registry/r/rule-types.json +1 -1
  103. package/registry/r/run-stats.json +2 -2
  104. package/registry/r/running-tasks-panel.json +2 -2
  105. package/registry/r/scroll-area.json +2 -2
  106. package/registry/r/select.json +2 -2
  107. package/registry/r/session-list-item.json +2 -2
  108. package/registry/r/session-timeline.json +2 -2
  109. package/registry/r/sheet.json +2 -2
  110. package/registry/r/sidebar.json +2 -2
  111. package/registry/r/skeleton.json +2 -2
  112. package/registry/r/skill-card.json +4 -4
  113. package/registry/r/skill-editor.json +10 -10
  114. package/registry/r/skills-list.json +3 -3
  115. package/registry/r/social-auth-row.json +3 -3
  116. package/registry/r/steps-rail.json +2 -2
  117. package/registry/r/sub-agent-dispatch.json +2 -2
  118. package/registry/r/switch.json +2 -2
  119. package/registry/r/system-prompt-editor.json +2 -2
  120. package/registry/r/tabs.json +2 -2
  121. package/registry/r/task-header.json +4 -4
  122. package/registry/r/task-plan.json +2 -2
  123. package/registry/r/terminal-panel.json +2 -2
  124. package/registry/r/textarea.json +2 -2
  125. package/registry/r/theme-provider.json +2 -2
  126. package/registry/r/theme-script.json +1 -1
  127. package/registry/r/theo-ui-provider.json +2 -2
  128. package/registry/r/toast.json +2 -2
  129. package/registry/r/token-usage-chart.json +2 -2
  130. package/registry/r/tool-call-card.json +3 -3
  131. package/registry/r/tool-call.json +2 -2
  132. package/registry/r/tool-result.json +2 -2
  133. package/registry/r/tools-list.json +3 -3
  134. package/registry/r/tooltip.json +2 -2
  135. package/registry/r/topnav.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/primitives/slide/alerts.ts","../../src/components/primitives/slide/marpit-bg.ts","../../src/components/primitives/slide/plugin.ts","../../src/components/primitives/slide/sanitize.ts","../../src/components/primitives/slide/schema.ts","../../src/components/primitives/slide/frontmatter.ts","../../src/components/primitives/slide/validate.ts","../../src/components/primitives/slide/parse.ts","../../src/components/primitives/slide/use-slide-fit.ts","../../src/components/primitives/slide/slide.tsx","../../src/components/composites/slide-deck/context.tsx","../../src/components/composites/slide-deck/controls.tsx","../../src/components/composites/slide-deck/fragments.ts","../../src/components/composites/slide-deck/presenter-view.tsx","../../src/components/composites/slide-deck/print-styles.ts","../../src/components/composites/slide-deck/progress-bar.tsx","../../src/components/composites/slide-deck/slide-number.tsx","../../src/components/composites/slide-deck/notes.ts","../../src/components/composites/slide-deck/split-deck.ts","../../src/components/composites/slide-deck/thumbnails.tsx","../../src/components/composites/slide-deck/use-deck-hash-routing.ts","../../src/components/composites/slide-deck/use-deck-keyboard.ts","../../src/components/composites/slide-deck/use-deck-state.ts","../../src/components/composites/slide-deck/use-deck-swipe.ts","../../src/components/composites/slide-deck/use-fullscreen.ts","../../src/components/composites/slide-deck/slide-deck.tsx","../../src/components/composites/slide-deck/schema.ts"],"names":["jsx","jsxs","useState","useEffect","useRef","useMemo","useCallback","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GFM alerts post-processor — converts `> [!NOTE]` blockquotes into\n * `<aside class=\"theo-slide-alert\" data-theo-slide-alert-type=\"...\">` (ADR D3 of\n * the slide-rich-content plan).\n *\n * GitHub Flavored Markdown introduced this convention in 2023 for callouts.\n * `remark-gfm` (already in our dep tree) parses the blockquote but does NOT\n * distinguish alerts from regular blockquotes. We post-process the mdast tree\n * to detect the canonical marker and annotate with `hName` + `hProperties` so\n * `mdast-util-to-hast` emits the desired hast element.\n *\n * Five tag families are supported, mirroring GitHub:\n * - NOTE (info / blue)\n * - TIP (success / green)\n * - IMPORTANT (purple)\n * - WARNING (yellow)\n * - CAUTION (red)\n *\n * Case-insensitive. Marker is stripped from the rendered text. Regular\n * blockquotes (without `[!TYPE]` prefix) are left untouched.\n */\nimport type { Blockquote, Paragraph, Root, Text } from \"mdast\";\n\n/** Canonical alert types — used by CSS via `data-theo-slide-alert-type=\"...\"`. */\nexport const ALERT_TYPES = [\"note\", \"tip\", \"important\", \"warning\", \"caution\"] as const;\nexport type AlertType = (typeof ALERT_TYPES)[number];\n\nconst ALERT_RE = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*(?:\\r?\\n|$)/i;\n\n/**\n * Walk a mdast tree and mutate any blockquote that opens with `[!TYPE]` into\n * an `<aside>` annotation. Mutation is in-place to keep the pipeline allocation\n * profile flat; the same tree is returned for chainability.\n */\nexport function detectAlerts(tree: Root): Root {\n for (const node of tree.children) {\n if (node.type !== \"blockquote\") continue;\n transformIfAlert(node);\n }\n return tree;\n}\n\nfunction transformIfAlert(node: Blockquote): void {\n const firstChild = node.children[0];\n if (!firstChild || firstChild.type !== \"paragraph\") return;\n const paragraph = firstChild as Paragraph;\n const firstInline = paragraph.children[0];\n if (!firstInline || firstInline.type !== \"text\") return;\n const text = firstInline as Text;\n const match = ALERT_RE.exec(text.value);\n if (!match) return;\n\n const matched = match[1];\n if (!matched) return;\n const type = matched.toLowerCase() as AlertType;\n\n // Strip the marker from the rendered text.\n text.value = text.value.replace(ALERT_RE, \"\");\n // If the first inline became empty, drop it so the paragraph doesn't render\n // an empty leading line.\n if (text.value === \"\" && paragraph.children.length > 1) {\n paragraph.children.shift();\n }\n // Annotate so mdast-util-to-hast emits <aside> with the data attribute.\n node.data = {\n ...node.data,\n hName: \"aside\",\n hProperties: {\n ...((node.data as { hProperties?: Record<string, unknown> })?.hProperties ?? {}),\n className: [\"theo-slide-alert\"],\n \"data-theo-slide-alert-type\": type,\n },\n };\n}\n","/**\n * Marpit-style `![bg](url)` background syntax detector.\n *\n * Marpit popularised the convention of declaring a slide background via a\n * standalone image whose alt-text starts with `bg`:\n *\n * ![bg](https://example.com/photo.jpg)\n * ![bg cover](url) ![bg fit](url) ![bg left](url) ![bg right](url)\n *\n * LLMs trained on Marp output emit this naturally, so the slide primitive\n * adopts the same surface — but in a STRICTLY safe way:\n *\n * 1. Only triggers when the paragraph contains a SINGLE image (avoids\n * collisions with inline images mixed with text).\n * 2. First-bg-wins (multiple `![bg]` directives in one slide → only the first\n * is honoured; the others are also dropped from the tree to prevent\n * duplicate rendering).\n * 3. The extracted result goes into `ParsedSlide.extractedBackground` (D18 /\n * EC-5) and the Slide component prefers an explicit `frontmatter.backgroundImage`\n * over the Marpit extraction.\n * 4. URL sanitization happens at the caller (`parseSlide`) via `sanitizeBgUrl`.\n */\nimport type { Image, Paragraph, Root } from \"mdast\";\n\nconst BG_ALT_RE = /^bg(?:\\s+(\\w+))?/i;\n\nconst VALID_MODIFIERS = new Set([\"cover\", \"fit\", \"left\", \"right\"]);\n\nexport interface ExtractedMarpitBackground {\n url: string;\n modifier?: \"cover\" | \"fit\" | \"left\" | \"right\";\n}\n\n/**\n * Walk the mdast tree, extract the first `![bg](url)` directive, drop ALL\n * matching paragraphs from the tree. Returns a new tree (children array\n * is filtered; node identities are preserved otherwise).\n */\nexport function extractMarpitBackgrounds(tree: Root): {\n tree: Root;\n background?: ExtractedMarpitBackground;\n} {\n let background: ExtractedMarpitBackground | undefined;\n const filteredChildren = tree.children.filter((node) => {\n if (node.type !== \"paragraph\") return true;\n const p = node as Paragraph;\n // Single-child guard: paragraphs with mixed content (text + image) are\n // kept as-is — only \"image-only\" paragraphs are candidates.\n if (p.children.length !== 1) return true;\n const child = p.children[0];\n if (!child || child.type !== \"image\") return true;\n const img = child as Image;\n const match = BG_ALT_RE.exec(img.alt ?? \"\");\n if (!match) return true;\n // Capture once; drop subsequent bg paragraphs to avoid duplicate output.\n if (!background) {\n const modifierRaw = match[1]?.toLowerCase();\n const modifier =\n modifierRaw && VALID_MODIFIERS.has(modifierRaw)\n ? (modifierRaw as \"cover\" | \"fit\" | \"left\" | \"right\")\n : undefined;\n background = {\n url: img.url,\n modifier,\n };\n }\n return false; // drop this paragraph from the tree\n });\n return {\n tree: { ...tree, children: filteredChildren },\n background,\n };\n}\n","/**\n * Slide plugin contract — extension points for rich-content engines.\n *\n * Plugins are composable transformers applied during `parseSlide`. Each plugin\n * may inspect/mutate the mdast tree (before HTML conversion), the hast tree\n * (after HTML conversion, before sanitize), and override React component\n * renderers (after sanitize). They may also declare sanitize-schema extensions\n * so custom tags (e.g. Shiki spans, KaTeX MathML, Mermaid SVG) survive the\n * security barrier.\n *\n * Design rules (ADRs in `.claude/knowledge-base/plans/slide-rich-content-plan.md`):\n * D1 — explicit `plugins` prop (no auto-detect).\n * D2 — plugin shape: { name, mdastTransform?, hastTransform?, components? }.\n * D13 — execution order: mdast → hast → sanitize (with merged extensions) → components.\n * D16 — plugin error isolation: each plugin call is try/catch wrapped; errors\n * are collected, not thrown.\n * D17 — sanitize-schema merge is OBLIGATORY for plugins emitting non-default\n * tags; without it, the sanitize step silently strips the content.\n *\n * Sanitize is the security barrier. Plugins NEVER bypass `hast-util-sanitize`.\n */\nimport type { Root as HastRoot } from \"hast\";\nimport type { Root as MdastRoot } from \"mdast\";\nimport type { FC } from \"react\";\nimport type { SlideValidationError } from \"./schema.js\";\n\n/** Sanitize schema extension declared by a plugin. Merged with `defaultSchema` in `parseSlide`. */\nexport interface SlideSanitizeExtension {\n /** Additional element tag names allowed past the sanitizer. */\n tagNames?: string[];\n /** Additional attribute allow-list keyed by tag name (or `\"*\"` for all tags). */\n attributes?: Record<string, string[]>;\n}\n\n/** A composable transformer + component-override unit. */\nexport interface SlidePlugin {\n /** Stable identifier used in PLUGIN_ERROR messages and dev logs. */\n name: string;\n /** Mutate the mdast tree before HTML conversion. Return value is forwarded. */\n mdastTransform?: (tree: MdastRoot) => Promise<MdastRoot> | MdastRoot;\n /** Mutate the hast tree after HTML conversion, before sanitize. */\n hastTransform?: (tree: HastRoot) => Promise<HastRoot> | HastRoot;\n /** React component overrides merged into the consumer's `components` map. */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n components?: Record<string, FC<any>>;\n /** Sanitize-schema extension. Required for plugins emitting non-default tags. */\n sanitizeSchemaExtension?: SlideSanitizeExtension;\n}\n\n/** Merged sanitize-schema extensions from all plugins. */\nexport interface MergedSanitizeExtensions {\n tagNames: string[];\n attributes: Record<string, string[]>;\n}\n\n/** Composer over a plugin array. Hooks orchestrate transformation + error isolation. */\nexport interface PluginComposer {\n /** Run all `mdastTransform` hooks in array order. Collects errors. */\n runMdast(tree: MdastRoot, errors: SlideValidationError[]): Promise<MdastRoot>;\n /** Run all `hastTransform` hooks in array order. Collects errors. */\n runHast(tree: HastRoot, errors: SlideValidationError[]): Promise<HastRoot>;\n /** Merge all plugin component overrides; later-plugin-wins on conflict. */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n mergedComponents(): Record<string, FC<any>>;\n /** Merge sanitize-schema extensions across all plugins (dedupes tag names). */\n mergedSanitizeExtensions(): MergedSanitizeExtensions;\n}\n\n/**\n * Build a composer over an array of plugins.\n *\n * Order semantics:\n * - mdast transforms run sequentially in array order.\n * - hast transforms run sequentially in array order.\n * - components merge: later plugin wins on conflict (Object.assign semantics).\n * - sanitize-schema extensions: union of tag names; union of attributes by tag.\n *\n * Error semantics (D16):\n * - Each plugin call is wrapped in try/catch.\n * - On throw, an error of code `PLUGIN_ERROR` is pushed to `errors[]` and the\n * pipeline continues with the **non-transformed** input from that plugin\n * (i.e. subsequent plugins see the tree that failed plugin received).\n * - The composer NEVER throws; `parseSlide` keeps its \"never throws on input\"\n * contract (RFC 0002 D9).\n */\nexport function composePlugins(plugins: SlidePlugin[]): PluginComposer {\n return {\n async runMdast(tree, errors) {\n let current = tree;\n for (const p of plugins) {\n if (!p.mdastTransform) continue;\n const previous = current;\n try {\n const result = await p.mdastTransform(current);\n if (!result || result.type !== \"root\") {\n // Defensive: a buggy plugin may return a non-Root node. Reject and\n // keep the previous tree so subsequent plugins see a valid input.\n throw new Error(\"mdastTransform returned non-Root node\");\n }\n current = result;\n } catch (e) {\n current = previous;\n errors.push(makePluginError(p.name, \"mdastTransform\", e));\n }\n }\n return current;\n },\n async runHast(tree, errors) {\n let current = tree;\n for (const p of plugins) {\n if (!p.hastTransform) continue;\n const previous = current;\n try {\n const result = await p.hastTransform(current);\n if (!result || result.type !== \"root\") {\n throw new Error(\"hastTransform returned non-Root node\");\n }\n current = result;\n } catch (e) {\n current = previous;\n errors.push(makePluginError(p.name, \"hastTransform\", e));\n }\n }\n return current;\n },\n mergedComponents() {\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n const out: Record<string, FC<any>> = {};\n for (const p of plugins) {\n if (p.components) Object.assign(out, p.components);\n }\n return out;\n },\n mergedSanitizeExtensions() {\n const tagNames = new Set<string>();\n const attributes: Record<string, Set<string>> = {};\n for (const p of plugins) {\n const ext = p.sanitizeSchemaExtension;\n if (!ext) continue;\n if (ext.tagNames) {\n for (const tag of ext.tagNames) tagNames.add(tag);\n }\n if (ext.attributes) {\n for (const [tag, attrs] of Object.entries(ext.attributes)) {\n if (!attributes[tag]) attributes[tag] = new Set();\n for (const a of attrs) attributes[tag].add(a);\n }\n }\n }\n const mergedAttrs: Record<string, string[]> = {};\n for (const [tag, set] of Object.entries(attributes)) {\n mergedAttrs[tag] = Array.from(set);\n }\n return {\n tagNames: Array.from(tagNames),\n attributes: mergedAttrs,\n };\n },\n };\n}\n\nfunction makePluginError(\n name: string,\n hook: \"mdastTransform\" | \"hastTransform\",\n e: unknown,\n): SlideValidationError {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n code: \"PLUGIN_ERROR\",\n path: [],\n message: `Plugin '${name}' failed in ${hook}: ${msg}`,\n got: name,\n };\n}\n","/**\n * Sanitize schema for slide body hast trees.\n *\n * ADR D8: `defaultSchema` from `hast-util-sanitize` is used WITHOUT extensions\n * in v0.1. The default schema:\n * - Strips `<script>`, `<iframe>`, `<object>`, `<embed>`, `<form>`, `<input>`,\n * `<style>`, `<link>` and other dangerous tags.\n * - Keeps `clobberPrefix: \"user-content-\"` so user-supplied IDs cannot\n * clobber DOM lookups.\n * - Allows the standard CommonMark + GFM safe subset (h1-h6, p, ul, ol, li,\n * blockquote, code, pre, a[href], img[src/alt], table family, em, strong,\n * del, br, hr, etc.).\n *\n * A `looseSlideSanitizeSchema` (with `figure`/`figcaption`) is an explicit\n * opt-in for v0.2 — gated by security review.\n */\nimport type { Element, Root } from \"hast\";\nimport type { MergedSanitizeExtensions } from \"./plugin.js\";\n\nlet cachedBuiltSchema: import(\"hast-util-sanitize\").Schema | undefined;\n\n/**\n * Tier 1 built-in extensions to the default sanitize schema. These cover the\n * tags emitted by built-in Slide features (alerts in `aside`, layout / header\n * / footer / paginate metadata attributes on the outer section wrapper). They\n * are NOT plugin-declared because they ship with the Slide primitive.\n *\n * Note: layout / header / footer / paginate are applied at the React component\n * level (outside the hast tree), so their attributes don't need sanitize rules.\n * Only `aside` (alerts) ends up in the hast.\n */\nconst TIER_1_TAG_NAMES: string[] = [\"aside\"];\nconst TIER_1_ATTRIBUTES: Record<string, string[]> = {\n aside: [\"className\", \"data-theo-slide-alert-type\"],\n \"*\": [\"className\"],\n};\n\n/**\n * Lazy accessor for the sanitize schema.\n *\n * Always merges `defaultSchema` with the Tier 1 baseline (aside + className).\n * When `extensions` is provided, plugin-declared tag names + attributes are\n * unioned on top (D17 / EC-3). Plugins NEVER bypass sanitize — they declare\n * what they need via `sanitizeSchemaExtension`.\n *\n * Implementation notes:\n * - The baseline schema (default + Tier 1) is cached.\n * - Plugin-merged schemas are NOT cached (depends on combination).\n */\nexport async function getSlideSanitizeSchema(\n extensions?: MergedSanitizeExtensions,\n): Promise<import(\"hast-util-sanitize\").Schema> {\n const baseline = await getBaselineSchema();\n if (\n !extensions ||\n (extensions.tagNames.length === 0 && Object.keys(extensions.attributes).length === 0)\n ) {\n return baseline;\n }\n return mergeSchema(baseline, extensions);\n}\n\nasync function getBaselineSchema(): Promise<import(\"hast-util-sanitize\").Schema> {\n if (cachedBuiltSchema) return cachedBuiltSchema;\n const { defaultSchema } = await import(\"hast-util-sanitize\");\n cachedBuiltSchema = mergeSchema(defaultSchema, {\n tagNames: TIER_1_TAG_NAMES,\n attributes: TIER_1_ATTRIBUTES,\n });\n return cachedBuiltSchema;\n}\n\nfunction mergeSchema(\n base: import(\"hast-util-sanitize\").Schema,\n extensions: MergedSanitizeExtensions,\n): import(\"hast-util-sanitize\").Schema {\n // Merge tag names (deduplicated set).\n const baseTagNames = (base.tagNames ?? []) as string[];\n const tagSet = new Set<string>(baseTagNames);\n for (const t of extensions.tagNames) tagSet.add(t);\n // Merge attributes per tag.\n const baseAttrs = (base.attributes ?? {}) as Record<string, unknown[]>;\n const mergedAttrs: Record<string, unknown[]> = { ...baseAttrs };\n for (const [tag, attrs] of Object.entries(extensions.attributes)) {\n const baseline = (mergedAttrs[tag] ?? []) as unknown[];\n const seen = new Set<string>();\n const combined: unknown[] = [];\n for (const a of baseline) {\n const key = typeof a === \"string\" ? a : JSON.stringify(a);\n if (!seen.has(key)) {\n seen.add(key);\n combined.push(a);\n }\n }\n for (const a of attrs) {\n if (!seen.has(a)) {\n seen.add(a);\n combined.push(a);\n }\n }\n mergedAttrs[tag] = combined;\n }\n return {\n ...base,\n tagNames: Array.from(tagSet),\n attributes: mergedAttrs,\n } as import(\"hast-util-sanitize\").Schema;\n}\n\n/** Count elements by tagName in a hast tree. Used for BANNED_TAG detection (ADR D13). */\nexport function collectTagCounts(tree: Root | Element): Map<string, number> {\n const counts = new Map<string, number>();\n const walk = (node: Root | Element | { type: string; children?: unknown[] }): void => {\n if (node.type === \"element\") {\n const tag = (node as Element).tagName;\n counts.set(tag, (counts.get(tag) ?? 0) + 1);\n }\n const children = (node as { children?: unknown[] }).children;\n if (Array.isArray(children)) {\n for (const child of children) {\n if (child && typeof child === \"object\" && \"type\" in child) {\n walk(child as Root | Element);\n }\n }\n }\n };\n walk(tree);\n return counts;\n}\n","/**\n * Zod schema for the Slide YAML frontmatter (`SlideFrontmatter`) and the\n * composed `SlideInput` (frontmatter + body).\n *\n * Design (see RFC 0002 and the plan in\n * `.claude/knowledge-base/plans/slide-view-primitive-plan.md` §16.3 and ADRs D4 / D14):\n *\n * - **`.strict()`** on frontmatter — unknown keys produce `INVALID_FRONTMATTER`\n * with a precise path, so an LLM can self-correct.\n * - Numeric values are `.finite()` to reject `NaN` / `Infinity`. (Currently no\n * numeric directives ship; keep the helper for future fields.)\n * - String values capped to defensible sizes to reject DoS-shaped inputs.\n * - `body` capped to 50 KB (≈30 slides' worth of text) per the sanity rule.\n * - `theme` is the canonical enum of built-in themes. Custom themes are not\n * registered via frontmatter in v0.1 — caller wraps `<Slide>` with their\n * own CSS overrides.\n */\nimport { z } from \"zod\";\n\n/** Built-in slide themes. Adding a theme means landing a CSS file in `themes/`. */\nexport const slideTheme = z.enum([\"default\", \"violet-forge\"]);\nexport type SlideTheme = z.infer<typeof slideTheme>;\n\n/** Built-in slide layouts (rich-content plan T2.1). */\nexport const slideLayout = z.enum([\n \"default\",\n \"title\",\n \"two-column\",\n \"image-right\",\n \"image-left\",\n \"code-output\",\n \"section\",\n]);\nexport type SlideLayout = z.infer<typeof slideLayout>;\n\nconst cssColor = z.string().max(64);\n// BCP-47 language tag — loose validation, just sanity to reject obvious junk.\nconst langTag = z\n .string()\n .regex(/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/, \"Expected BCP-47 language tag\")\n .max(35);\n\n// EC-7 / rich-content T3.1 helpers.\nconst SAFE_URL_SCHEMES = [\"http://\", \"https://\"];\n\n/**\n * Sanitize a `backgroundImage` URL.\n *\n * Allowed: `http(s)://...` URLs (validated via `URL` constructor).\n * Rejected: `javascript:`, `vbscript:`, all `data:` URLs (EC-7 — perf + DoS).\n * Accepts a bare URL or a `url(...)` wrapper. Returns the unwrapped URL on\n * success, `null` on rejection.\n */\nexport function sanitizeBgUrl(input: string): string | null {\n try {\n const trimmed = input.trim();\n const url = trimmed.startsWith(\"url(\")\n ? trimmed.replace(/^url\\(\\s*['\"]?/, \"\").replace(/['\"]?\\s*\\)$/, \"\")\n : trimmed;\n const lower = url.toLowerCase();\n if (lower.startsWith(\"javascript:\") || lower.startsWith(\"vbscript:\")) return null;\n // EC-7: reject ALL data: URLs (including data:image/*) — slides inflate the\n // markdown payload and shifts loading cost. Consumer should host images.\n if (lower.startsWith(\"data:\")) return null;\n if (!SAFE_URL_SCHEMES.some((s) => lower.startsWith(s))) return null;\n new URL(url); // throws on malformed\n return url;\n } catch {\n return null;\n }\n}\n\n/** YAML frontmatter accepted by `<Slide>`. */\nexport const slideFrontmatter = z\n .object({\n theme: slideTheme.optional(),\n /** Rich-content T2: built-in layout (CSS grid). */\n layout: slideLayout.optional(),\n /** Rich-content T3: background URL (sanitized: http(s) only). */\n backgroundImage: z\n .string()\n .max(500_000)\n .transform((v) => {\n if (!v) return undefined;\n const sanitized = sanitizeBgUrl(v);\n return sanitized ?? undefined;\n })\n .optional(),\n /** Rich-content T3: CSS gradient string (validated by prefix). */\n backgroundGradient: z\n .string()\n .max(500)\n .regex(\n /^(linear|radial|conic)-gradient\\(/i,\n \"Must start with linear-/radial-/conic-gradient(\",\n )\n .optional(),\n /** Rich-content T5: header overlay text (plain, ≤ 200 chars). */\n header: z.string().max(200).optional(),\n /** Rich-content T5: footer overlay text (plain, ≤ 200 chars). */\n footer: z.string().max(200).optional(),\n /** Rich-content T5: pagination — `true` shows page number, `\"skip\"` hides. */\n paginate: z.union([z.boolean(), z.literal(\"skip\"), z.literal(\"hold\")]).optional(),\n lang: langTag.optional(),\n color: cssColor.optional(),\n backgroundColor: cssColor.optional(),\n })\n .strict();\nexport type SlideFrontmatter = z.infer<typeof slideFrontmatter>;\n\n/** Composed input: validated frontmatter object + raw markdown body string. */\nexport const slideInput = z.object({\n frontmatter: slideFrontmatter,\n body: z.string().max(50_000),\n});\nexport type SlideInput = z.infer<typeof slideInput>;\n\n/** Discrete validation-error codes — kept centralized so consumers can pattern-match safely. */\nexport type SlideValidationErrorCode =\n | \"INVALID_FRONTMATTER\"\n | \"FRONTMATTER_TOO_LARGE\"\n | \"MULTIPLE_SLIDES\"\n | \"CONTENT_TOO_LARGE\"\n | \"BANNED_TAG\"\n | \"BANNED_ATTRIBUTE\"\n | \"INVALID_ASPECT_RATIO\"\n // Rich-content plan (Tier 1 + Tier 2 plugins):\n | \"PLUGIN_ERROR\" // D16: a plugin's mdast/hast transform threw — pipeline continued\n | \"PLUGIN_PEER_DEP_MISSING\" // EC-2: dynamic import of a plugin's peer-dep failed\n | \"MARPIT_BG_UNSAFE_URL\"; // D18/EC-5: Marpit ![bg](url) rejected by URL sanitizer\n\nexport interface SlideValidationError {\n /** Path inside the input (frontmatter key, ['body'], or []). */\n path: (string | number)[];\n /** Human-readable explanation. */\n message: string;\n /** Discriminator for consumers. */\n code: SlideValidationErrorCode;\n /** Offending value when extractable from Zod's `received` or by walking the input. */\n got?: unknown;\n}\n","/**\n * Lightweight, dependency-free extractor that separates YAML frontmatter from\n * the markdown body.\n *\n * Strips a leading BOM (``) before matching the regex — common when\n * markdown is pasted from Word/Notion. See plan ADR D14 and edge-case EC-4.\n *\n * Returns `{ rawFrontmatter, body, tooLarge? }`:\n * - `rawFrontmatter`: the YAML string between the two `---` delimiters, or\n * `null` if no frontmatter is present.\n * - `body`: the markdown after the closing `---\\n` (or the full input when\n * no frontmatter).\n * - `tooLarge`: `true` if `rawFrontmatter` exceeds `MAX_RAW_FRONTMATTER`\n * bytes — the caller turns this into `FRONTMATTER_TOO_LARGE`.\n */\n\n/** Maximum size of the raw frontmatter string before YAML parsing. 10 KB cap. */\nexport const MAX_RAW_FRONTMATTER = 10_240;\n\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n([\\s\\S]*)$/;\nconst BOM = \"\";\n\nexport interface ExtractFrontmatterResult {\n rawFrontmatter: string | null;\n body: string;\n tooLarge?: boolean;\n}\n\nexport function extractFrontmatter(md: string): ExtractFrontmatterResult {\n const normalized = md.startsWith(BOM) ? md.slice(1) : md;\n const match = FRONTMATTER_RE.exec(normalized);\n if (!match) {\n return { rawFrontmatter: null, body: normalized };\n }\n const raw = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n if (raw.length > MAX_RAW_FRONTMATTER) {\n return { rawFrontmatter: raw, body, tooLarge: true };\n }\n return { rawFrontmatter: raw, body };\n}\n","import { extractFrontmatter } from \"./frontmatter.js\";\n/**\n * Async validator for slide markdown input.\n *\n * Returns `Promise<ValidationResult>` (ADR D11 — sync impossible because\n * `yaml` and `mdast-util-from-markdown` are lazy-imported peer-deps).\n *\n * Pipeline:\n * 1. Strip BOM + extract frontmatter (`frontmatter.ts`).\n * 2. Reject `FRONTMATTER_TOO_LARGE` early if raw > 10 KB (ADR D14).\n * 3. Parse YAML in safe mode → validate against `slideFrontmatter` (Zod).\n * 4. Validate body length → emit `CONTENT_TOO_LARGE` if > 50 KB.\n * 5. Detect multi-slide via mdast `thematicBreak` walk (ADR D12) — not\n * a regex, so `---` inside fenced code blocks does not false-positive.\n * 6. Return `{ ok, input, errors[] }`.\n *\n * Errors are structured so an LLM can self-correct from the callback.\n */\nimport {\n type SlideFrontmatter,\n type SlideInput,\n type SlideValidationError,\n slideFrontmatter,\n} from \"./schema.js\";\n\nexport type ValidationResult =\n | { ok: true; input: SlideInput; errors: SlideValidationError[] }\n | { ok: false; errors: SlideValidationError[] };\n\ninterface ZodLikeIssue {\n path: ReadonlyArray<string | number>;\n message: string;\n code: string;\n received?: unknown;\n}\n\nconst MAX_BODY = 50_000;\n\nfunction valueAtPath(input: unknown, path: ReadonlyArray<string | number>): unknown {\n let cursor: unknown = input;\n for (const segment of path) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n cursor = (cursor as Record<string | number, unknown>)[segment];\n }\n return cursor;\n}\n\nfunction formatZodIssue(\n issue: ZodLikeIssue,\n input: unknown,\n pathPrefix: (string | number)[],\n): SlideValidationError {\n const error: SlideValidationError = {\n path: [...pathPrefix, ...issue.path],\n message: issue.message,\n code: \"INVALID_FRONTMATTER\",\n };\n if (\"received\" in issue && issue.received !== undefined) {\n error.got = issue.received;\n } else if (issue.path.length > 0) {\n const value = valueAtPath(input, issue.path);\n if (value !== undefined) error.got = value;\n }\n return error;\n}\n\nasync function detectMultiSlide(body: string): Promise<{\n multi: boolean;\n firstSlideBody: string;\n}> {\n // mdast-based — regex would false-positive on `---` inside fenced code blocks.\n // Cost: one extra parse. Cheap; would be parsed again in `parse.ts` anyway.\n const { fromMarkdown } = await import(\"mdast-util-from-markdown\");\n const tree = fromMarkdown(body);\n const hrIdx = tree.children.findIndex((n) => n.type === \"thematicBreak\");\n if (hrIdx === -1) {\n return { multi: false, firstSlideBody: body };\n }\n const firstHr = tree.children[hrIdx];\n const offset = firstHr?.position?.start.offset;\n if (typeof offset !== \"number\") {\n return { multi: true, firstSlideBody: body };\n }\n return { multi: true, firstSlideBody: body.slice(0, offset) };\n}\n\n/**\n * Validate the markdown input. Returns errors structured for LLM self-correction.\n *\n * Async because frontmatter YAML parsing and mdast multi-slide detection both\n * use lazy-imported peer-deps (yaml + mdast-util-from-markdown).\n */\nexport async function validateSlide(markdown: string): Promise<ValidationResult> {\n const errors: SlideValidationError[] = [];\n const extracted = extractFrontmatter(markdown);\n\n if (extracted.tooLarge) {\n errors.push({\n code: \"FRONTMATTER_TOO_LARGE\",\n path: [],\n message: `Raw frontmatter exceeds ${10_240} bytes.`,\n got: extracted.rawFrontmatter?.length,\n });\n return { ok: false, errors };\n }\n\n let frontmatter: SlideFrontmatter = {};\n if (extracted.rawFrontmatter !== null) {\n let parsed: unknown;\n try {\n const yaml = await import(\"yaml\");\n parsed = yaml.parse(extracted.rawFrontmatter);\n } catch (e) {\n errors.push({\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: e instanceof Error ? e.message : \"YAML parse failed.\",\n got: extracted.rawFrontmatter,\n });\n return { ok: false, errors };\n }\n if (parsed === null || parsed === undefined) {\n // empty frontmatter — treat as {}\n frontmatter = {};\n } else if (typeof parsed !== \"object\" || Array.isArray(parsed)) {\n errors.push({\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: \"Frontmatter must be a YAML mapping (object).\",\n got: parsed,\n });\n return { ok: false, errors };\n } else {\n const result = slideFrontmatter.safeParse(parsed);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push(formatZodIssue(issue as unknown as ZodLikeIssue, parsed, []));\n }\n return { ok: false, errors };\n }\n frontmatter = result.data;\n }\n }\n\n let body = extracted.body;\n\n if (body.length > MAX_BODY) {\n errors.push({\n code: \"CONTENT_TOO_LARGE\",\n path: [\"body\"],\n message: `Body exceeds ${MAX_BODY} characters.`,\n got: body.length,\n });\n return { ok: false, errors };\n }\n\n const multi = await detectMultiSlide(body);\n if (multi.multi) {\n body = multi.firstSlideBody;\n errors.push({\n code: \"MULTIPLE_SLIDES\",\n path: [\"body\"],\n message:\n \"Input contains a top-level thematic break (---). <Slide> renders single-slide markdown only. Only the first slide was rendered.\",\n });\n }\n\n return { ok: true, input: { frontmatter, body }, errors };\n}\n","import type { Root as HastRoot } from \"hast\";\n/**\n * Markdown → React tree pipeline for the Slide primitive.\n *\n * parseSlide(markdown)\n * ├─ validateSlide(markdown) → { frontmatter, body, errors? }\n * ├─ parseBody(body) → mdast Root (micromark + GFM)\n * ├─ mdastToHast(mdastTree) → hast Root (allowDangerousHtml: false)\n * ├─ sanitizeHast(hastTree) → hast Root + BANNED_TAG diff (ADR D13)\n * └─ hastToReact(hastTree) → React tree (jsx-runtime, no innerHTML)\n *\n * Every transform is composed of lazy-imported peer-deps so the slide bundle\n * stays under budget and never vendors the markdown stack into the barrel\n * (ADR D2 / D3 of the slide plan).\n */\nimport type { Root as MdastRoot } from \"mdast\";\nimport type { ReactElement } from \"react\";\nimport { detectAlerts } from \"./alerts.js\";\nimport { extractMarpitBackgrounds } from \"./marpit-bg.js\";\nimport { type MergedSanitizeExtensions, type SlidePlugin, composePlugins } from \"./plugin.js\";\nimport { collectTagCounts, getSlideSanitizeSchema } from \"./sanitize.js\";\nimport { type SlideFrontmatter, type SlideValidationError, sanitizeBgUrl } from \"./schema.js\";\nimport { validateSlide } from \"./validate.js\";\n\nexport interface ParseSlideOptions {\n /** Override individual element renderers (passed to hast-util-to-jsx-runtime). */\n components?: Record<string, unknown>;\n /** Rich-content plugins (Tier 2). Order matters — D13 / RFC 0004. */\n plugins?: SlidePlugin[];\n}\n\nexport interface ExtractedBackground {\n /** Sanitized URL (http/https only). */\n url: string;\n /** Optional Marpit modifier: `cover` | `fit` | `left` | `right`. */\n modifier?: \"cover\" | \"fit\" | \"left\" | \"right\";\n}\n\nexport interface ParsedSlide {\n frontmatter: SlideFrontmatter;\n /** React element renderable as the body of a slide. Always defined (may be empty Fragment). */\n tree: ReactElement;\n /** Validation + sanitize errors collected during parsing. Empty on success. */\n errors: SlideValidationError[];\n /** True when the input contained a top-level thematic break and only the first slide was rendered. */\n truncated: boolean;\n /**\n * Background image extracted from Marpit `![bg](url)` syntax (D18 / EC-5).\n * Precedence: `frontmatter.backgroundImage` > `extractedBackground.url`.\n */\n extractedBackground?: ExtractedBackground;\n}\n\nexport async function parseBody(body: string): Promise<MdastRoot> {\n const [{ fromMarkdown }, { gfmFromMarkdown }, { gfm }] = await Promise.all([\n import(\"mdast-util-from-markdown\"),\n import(\"mdast-util-gfm\"),\n import(\"micromark-extension-gfm\"),\n ]);\n return fromMarkdown(body, {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n });\n}\n\nexport async function mdastToHast(tree: MdastRoot): Promise<HastRoot> {\n const { toHast } = await import(\"mdast-util-to-hast\");\n const hast = toHast(tree, { allowDangerousHtml: false });\n if (!hast || hast.type !== \"root\") {\n return { type: \"root\", children: hast ? [hast] : [] } as HastRoot;\n }\n return hast as HastRoot;\n}\n\nexport async function sanitizeHast(\n tree: HastRoot,\n extensions?: MergedSanitizeExtensions,\n): Promise<{ tree: HastRoot; bannedTags: string[] }> {\n const schema = await getSlideSanitizeSchema(extensions);\n const { sanitize } = await import(\"hast-util-sanitize\");\n const preCount = collectTagCounts(tree);\n const safe = sanitize(tree, schema);\n const safeRoot: HastRoot =\n safe.type === \"root\" ? (safe as HastRoot) : ({ type: \"root\", children: [safe] } as HastRoot);\n const postCount = collectTagCounts(safeRoot);\n const bannedTags: string[] = [];\n for (const [tag, before] of preCount) {\n const after = postCount.get(tag) ?? 0;\n if (after < before) {\n // Push once per stripped tag name; agents can self-correct from this signal.\n bannedTags.push(tag);\n }\n }\n return { tree: safeRoot, bannedTags };\n}\n\nexport async function hastToReact(\n tree: HastRoot,\n components?: Record<string, unknown>,\n): Promise<ReactElement> {\n const { Fragment, jsx, jsxs } = await import(\"react/jsx-runtime\");\n const { toJsxRuntime } = await import(\"hast-util-to-jsx-runtime\");\n return toJsxRuntime(tree, {\n Fragment,\n jsx,\n jsxs,\n components,\n }) as ReactElement;\n}\n\n/**\n * Public entry point. Validates → parses → sanitizes → returns a React tree.\n *\n * Never throws on input. Errors (validation, BANNED_TAG) are collected into\n * `errors[]` so callers can show them via `onValidationError`.\n */\nexport async function parseSlide(\n markdown: string,\n opts: ParseSlideOptions = {},\n): Promise<ParsedSlide> {\n const errors: SlideValidationError[] = [];\n let frontmatter: SlideFrontmatter = {};\n let body = markdown;\n let truncated = false;\n\n const validation = await validateSlide(markdown);\n if (validation.ok) {\n frontmatter = validation.input.frontmatter;\n body = validation.input.body;\n errors.push(...validation.errors);\n truncated = validation.errors.some((e) => e.code === \"MULTIPLE_SLIDES\");\n } else {\n errors.push(...validation.errors);\n // Best-effort recovery: render the body as if frontmatter was absent.\n // This preserves \"never throw, always render something\" contract.\n body = markdown;\n }\n\n const compose = composePlugins(opts.plugins ?? []);\n\n const rawMdast = await parseBody(body);\n // Tier 1 — GFM alerts (D3): in-tree post-process, no plugin needed.\n // Runs BEFORE plugin mdastTransforms so plugins observing the tree see the\n // normalized aside shape (consistent with how `> [!NOTE]` is treated as\n // native GFM by consumers).\n detectAlerts(rawMdast);\n // Tier 1 — Marpit ![bg](url) (D18 / EC-5): extract before plugins run so the\n // tree handed to plugins is free of bg directives.\n const { tree: mdastNoBg, background: marpitBg } = extractMarpitBackgrounds(rawMdast);\n let extractedBackground: ExtractedBackground | undefined;\n if (marpitBg) {\n const safeUrl = sanitizeBgUrl(marpitBg.url);\n if (safeUrl) {\n extractedBackground = { url: safeUrl, modifier: marpitBg.modifier };\n } else {\n errors.push({\n code: \"MARPIT_BG_UNSAFE_URL\",\n path: [],\n message: \"Marpit ![bg](url) rejected: unsafe scheme or malformed URL.\",\n got: marpitBg.url.slice(0, 80),\n });\n }\n }\n const transformedMdast = await compose.runMdast(mdastNoBg, errors);\n const rawHast = await mdastToHast(transformedMdast);\n const transformedHast = await compose.runHast(rawHast, errors);\n\n // D17 / EC-3: merge plugin sanitize-schema extensions with defaultSchema so\n // plugins emitting non-default tags (Shiki spans, KaTeX MathML, Mermaid SVG)\n // survive the security barrier. Sanitize ALWAYS runs.\n const sanitizeExtensions = compose.mergedSanitizeExtensions();\n const { tree: safeTree, bannedTags } = await sanitizeHast(transformedHast, sanitizeExtensions);\n for (const tag of bannedTags) {\n errors.push({\n code: \"BANNED_TAG\",\n path: [\"body\"],\n message: `Tag <${tag}> was stripped by the slide sanitizer.`,\n got: tag,\n });\n }\n\n // D2 / D13: plugin component overrides merge on top of consumer's components;\n // plugin definitions win on conflict (last-write-wins in mergedComponents).\n const mergedComponents = {\n ...(opts.components ?? {}),\n ...compose.mergedComponents(),\n };\n const tree = await hastToReact(safeTree, mergedComponents);\n\n return { frontmatter, tree, errors, truncated, extractedBackground };\n}\n","/**\n * Container-fit hook for the Slide primitive.\n *\n * Observes the host element via `ResizeObserver` and computes a CSS scale\n * factor that fits the fixed logical canvas (default 1280×720) inside it,\n * preserving aspect ratio. Clamped to `[minScale, maxScale]`.\n *\n * Algorithm: `scale = clamp(min(W / canvasW, H / canvasH), min, max)`.\n *\n * Adapted from Reveal.js `transformSlides` (see reference doc §4.5 / §14.2).\n *\n * Cleanup: disconnects the observer on unmount or when deps change.\n */\nimport { type RefObject, useEffect, useState } from \"react\";\n\nexport interface UseSlideFitOptions {\n /** Lower clamp for scale. Default 0.1. */\n minScale?: number;\n /** Upper clamp for scale. Default 4. */\n maxScale?: number;\n}\n\nexport function useSlideFit(\n ref: RefObject<HTMLElement | null>,\n canvasW: number,\n canvasH: number,\n opts: UseSlideFitOptions = {},\n): number {\n const { minScale = 0.1, maxScale = 4 } = opts;\n const [scale, setScale] = useState(1);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n if (typeof ResizeObserver === \"undefined\") {\n // Test environments without ResizeObserver: do a one-shot measurement.\n const { width, height } = el.getBoundingClientRect();\n if (width > 0 && height > 0) {\n const raw = Math.min(width / canvasW, height / canvasH);\n setScale(Math.max(minScale, Math.min(raw, maxScale)));\n }\n return;\n }\n const update = (): void => {\n const { width, height } = el.getBoundingClientRect();\n if (width <= 0 || height <= 0) return;\n const raw = Math.min(width / canvasW, height / canvasH);\n const clamped = Math.max(minScale, Math.min(raw, maxScale));\n if (Number.isFinite(clamped)) setScale(clamped);\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref, canvasW, canvasH, minScale, maxScale]);\n\n return scale;\n}\n","import {\n type FC,\n type ReactElement,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n/**\n * `<Slide>` — view-only primitive that renders markdown + YAML frontmatter\n * into a themed, fixed-aspect surface. Lives in the isolated subpath\n * `@usetheo/ui/slide`.\n *\n * See RFC 0002 (`docs/rfcs/0002-slide.md`) and the plan in\n * `.claude/knowledge-base/plans/slide-view-primitive-plan.md`.\n *\n * SSR note: initial render returns the section wrapper; the parsed React tree\n * fills in client-side via the useEffect → `parseSlide` chain. Consumers\n * wrapping in Suspense / skeleton can mitigate visible jump.\n *\n * Performance tip: pass a memoized `onValidationError` (via `useCallback`)\n * and a memoized `components` map. Inline arrows recreate on each render\n * and cause re-parses.\n */\nimport { type ParsedSlide, parseSlide } from \"./parse.js\";\nimport type { SlidePlugin } from \"./plugin.js\";\nimport type { SlideValidationError } from \"./schema.js\";\nimport type { SlideTheme } from \"./themes/index.js\";\nimport { useSlideFit } from \"./use-slide-fit.js\";\n\nexport type { SlideTheme } from \"./themes/index.js\";\nexport type {\n SlideValidationError,\n SlideValidationErrorCode,\n} from \"./schema.js\";\nexport type { SlidePlugin } from \"./plugin.js\";\n\nexport interface SlideAspectRatio {\n width: number;\n height: number;\n}\n\nexport interface SlideProps {\n /**\n * Slide markdown. CommonMark + GFM + optional YAML frontmatter delimited\n * by `---`. Top-level horizontal rules (`---` on their own line outside\n * frontmatter) imply a deck split and trigger `MULTIPLE_SLIDES`; only the\n * first slide is rendered.\n *\n * Note: `<figure>`/`<figcaption>` tags are stripped by the default\n * sanitize schema (D8). Use `<img>` directly for captionless images.\n */\n markdown: string;\n /** Theme name. Defaults to `\"default\"`. */\n theme?: SlideTheme;\n /**\n * Aspect ratio of the logical canvas. Default `\"16:9\"` → 1280×720.\n * Custom `{ width, height }` accepted; zero/negative/NaN fallback to 16:9.\n */\n aspectRatio?: \"16:9\" | \"4:3\" | SlideAspectRatio;\n /** Lower clamp for container-fit scale. Default 0.1. */\n minScale?: number;\n /** Upper clamp for container-fit scale. Default 4. */\n maxScale?: number;\n /** Best-effort callback invoked in useEffect when validation/sanitize emits errors. */\n onValidationError?: (errors: SlideValidationError[]) => void;\n /** Override individual element renderers (passed to hast-util-to-jsx-runtime). */\n // biome-ignore lint/suspicious/noExplicitAny: third-party component override map\n components?: Record<string, FC<any>>;\n /**\n * Rich-content plugins (Tier 2). Each plugin transforms the mdast/hast tree\n * or adds React component overrides. Pass MEMOIZED arrays to avoid re-parses\n * on every render (D15).\n *\n * @example\n * const plugins = useMemo(() => [emojiPlugin(), shikiPlugin()], []);\n * <Slide markdown={md} plugins={plugins} />\n */\n plugins?: SlidePlugin[];\n /** Accessible label for the slide. Defaults to `\"Slide\"`. */\n \"aria-label\"?: string;\n /** Optional class applied to the outer host element (sizing/positioning hook). */\n className?: string;\n}\n\nconst ASPECT_PRESETS: Record<\"16:9\" | \"4:3\", SlideAspectRatio> = {\n \"16:9\": { width: 1280, height: 720 },\n \"4:3\": { width: 960, height: 720 },\n};\n\n/**\n * Resolve aspectRatio prop to concrete dimensions. Invalid custom values\n * (zero, negative, non-finite) silently fall back to 16:9 — surfaced via\n * `INVALID_ASPECT_RATIO` error in `onValidationError`. ADR D14.\n */\nfunction resolveCanvas(ar: SlideProps[\"aspectRatio\"]): {\n width: number;\n height: number;\n invalid?: boolean;\n} {\n if (!ar || ar === \"16:9\") return ASPECT_PRESETS[\"16:9\"];\n if (ar === \"4:3\") return ASPECT_PRESETS[\"4:3\"];\n if (\n ar.width <= 0 ||\n ar.height <= 0 ||\n !Number.isFinite(ar.width) ||\n !Number.isFinite(ar.height)\n ) {\n return { ...ASPECT_PRESETS[\"16:9\"], invalid: true };\n }\n return ar;\n}\n\nexport const Slide: FC<SlideProps> = ({\n markdown,\n theme = \"default\",\n aspectRatio = \"16:9\",\n minScale,\n maxScale,\n onValidationError,\n components,\n plugins,\n className,\n \"aria-label\": ariaLabel = \"Slide\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvas = useMemo(() => resolveCanvas(aspectRatio), [aspectRatio]);\n const scale = useSlideFit(containerRef, canvas.width, canvas.height, {\n minScale,\n maxScale,\n });\n\n const [parsed, setParsed] = useState<ParsedSlide | null>(null);\n\n // Surface INVALID_ASPECT_RATIO immediately when the prop is invalid.\n // Independent of markdown parsing so consumers see the signal even with\n // an empty markdown payload.\n useEffect(() => {\n if (canvas.invalid && onValidationError) {\n onValidationError([\n {\n code: \"INVALID_ASPECT_RATIO\",\n path: [\"aspectRatio\"],\n message:\n \"aspectRatio width/height must be positive finite numbers; falling back to 16:9.\",\n got: aspectRatio,\n },\n ]);\n }\n }, [canvas.invalid, onValidationError, aspectRatio]);\n\n // EC-7 / version counter — prevents older parses from overwriting newer\n // ones on rapid prop changes.\n const versionRef = useRef(0);\n useEffect(() => {\n const myVersion = ++versionRef.current;\n let cancelled = false;\n parseSlide(markdown, { components, plugins }).then(\n (result) => {\n if (cancelled || myVersion !== versionRef.current) return;\n setParsed(result);\n if (result.errors.length > 0 && onValidationError) {\n onValidationError(result.errors);\n }\n },\n (err: unknown) => {\n // Defensive: parseSlide promises to never throw, but if a runtime\n // failure escapes (e.g. peer-dep missing), surface a synthetic error\n // and keep the slide visible with empty body.\n if (cancelled || myVersion !== versionRef.current) return;\n if (onValidationError) {\n onValidationError([\n {\n code: \"INVALID_FRONTMATTER\",\n path: [],\n message: err instanceof Error ? err.message : \"parseSlide rejected.\",\n },\n ]);\n }\n setParsed({\n frontmatter: {},\n tree: emptyFragment(),\n errors: [],\n truncated: false,\n });\n },\n );\n return () => {\n cancelled = true;\n };\n }, [markdown, components, plugins, onValidationError]);\n\n const treeNode: ReactNode = parsed?.tree ?? null;\n const slideThemeAttr: SlideTheme = theme;\n\n // Tier 1 — frontmatter-driven attributes & overlays.\n const fm = parsed?.frontmatter ?? {};\n const layout = fm.layout;\n // Background precedence: explicit frontmatter > Marpit ![bg](url) (D18 / EC-5).\n const bgUrl = fm.backgroundImage ?? parsed?.extractedBackground?.url;\n const bgModifier = parsed?.extractedBackground?.modifier;\n const bgGradient = fm.backgroundGradient;\n const headerText = fm.header;\n const footerText = fm.footer;\n const paginateValue = fm.paginate;\n const showPaginate = paginateValue === true;\n\n // Background style: gradient > image > inherited.\n const backgroundImageStyle: string | undefined = bgGradient\n ? bgGradient\n : bgUrl\n ? `url(\"${bgUrl}\")`\n : undefined;\n\n return (\n <div\n ref={containerRef}\n className={[\"theo-slide-host\", className].filter(Boolean).join(\" \")}\n data-theo-slide-host\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n width: \"100%\",\n height: \"100%\",\n }}\n >\n {/*\n Section is taken out of normal flow with position:absolute so its\n 1280×720 layout box doesn't inflate the host. `translate(-50%, -50%)`\n anchors the section's center to the host's center; the scale applies\n relative to that same origin. Mirrors Reveal.js transformSlides()\n (see `.claude/knowledge-base/reference/slide.md` §4.5 / §14.2).\n */}\n <section\n aria-roledescription=\"slide\"\n aria-label={ariaLabel}\n className=\"theo-slide\"\n data-theo-slide-theme={slideThemeAttr}\n data-theo-slide-layout={layout ?? \"default\"}\n data-theo-slide-bg-modifier={bgModifier}\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n width: canvas.width,\n height: canvas.height,\n transform: `translate(-50%, -50%) scale(${scale})`,\n transformOrigin: \"center\",\n padding: \"var(--theo-slide-padding, 64px)\",\n color: \"inherit\",\n // Background fills the canvas. When neither image nor gradient is set,\n // the slide inherits the parent surface (same pattern as Whiteboard).\n background: \"transparent\",\n // Only set backgroundImage + ancillary props when one is provided —\n // otherwise the shorthand `background: transparent` is preserved as-is\n // (important for the inherit-from-parent guarantee).\n ...(backgroundImageStyle\n ? {\n backgroundImage: backgroundImageStyle,\n backgroundSize: bgModifier === \"fit\" ? \"contain\" : \"cover\",\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n }\n : {}),\n fontFamily:\n \"var(--theo-slide-font-family, system-ui, -apple-system, 'Segoe UI', sans-serif)\",\n fontSize: \"var(--theo-slide-font-base, 28px)\",\n lineHeight: 1.5,\n boxSizing: \"border-box\",\n overflow: \"hidden\",\n }}\n >\n {headerText ? (\n <div className=\"theo-slide-header\" aria-hidden=\"true\">\n {headerText}\n </div>\n ) : null}\n {treeNode}\n {footerText ? (\n <div className=\"theo-slide-footer\" aria-hidden=\"true\">\n {footerText}\n </div>\n ) : null}\n {showPaginate ? (\n <div className=\"theo-slide-paginate\" aria-hidden=\"true\">\n 1\n </div>\n ) : null}\n </section>\n </div>\n );\n};\n\n/** Empty React fragment placeholder used when parseSlide fails fatally. */\nfunction emptyFragment(): ReactElement {\n // Cheap fallback that does not require importing Fragment from react/jsx-runtime.\n // Using a real element keeps the type as ReactElement (not ReactNode).\n return { type: \"span\", props: { children: null }, key: null } as unknown as ReactElement;\n}\n","/**\n * DeckContext — internal Context shared between `<SlideDeck>` and its\n * dot-namespace sub-components (`<SlideDeck.Controls>`, etc.). ADR D14.\n */\nimport { type Dispatch, createContext, useContext } from \"react\";\nimport type { SlidePlugin } from \"../../primitives/slide/index.js\";\nimport type { SlideDeckSlide, SlideDeckTransition } from \"./schema.js\";\nimport type { DeckAction, DeckState } from \"./use-deck-state.js\";\n\nexport interface DeckContextValue {\n state: DeckState;\n dispatch: Dispatch<DeckAction>;\n slides: SlideDeckSlide[];\n transition: SlideDeckTransition;\n deckId: string;\n /** Rich-content plugins relayed to every inner `<Slide>` (D15). */\n plugins?: SlidePlugin[];\n /** Toggle browser fullscreen on the deck root. Safe to call when unsupported. */\n toggleFullscreen: () => void | Promise<void>;\n /** Trigger native print dialog with deck-specific @page CSS. */\n print: () => void;\n}\n\nexport const DeckContext = createContext<DeckContextValue | null>(null);\n\nexport function useDeckContext(): DeckContextValue {\n const ctx = useContext(DeckContext);\n if (!ctx) {\n throw new Error(\n \"SlideDeck sub-components must be used inside <SlideDeck>. \" +\n \"Wrap them in <SlideDeck slides={...}>.\",\n );\n }\n return ctx;\n}\n","/**\n * `<SlideDeck.Controls>` — prev/next buttons + slide indicator (\"3 / 12\").\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ControlsProps {\n className?: string;\n}\n\nexport const Controls: FC<ControlsProps> = ({ className }) => {\n const { state, dispatch } = useDeckContext();\n const atStart = state.currentIndex <= 0;\n const atEnd = state.currentIndex >= state.totalSlides - 1;\n return (\n <div\n className={[\"theo-slide-deck-controls\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-controls\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Previous slide\"\n disabled={atStart}\n onClick={() => dispatch({ type: \"PREV_SLIDE\" })}\n className=\"theo-slide-deck-controls-prev\"\n >\n ←\n </button>\n <span\n aria-live=\"polite\"\n className=\"theo-slide-deck-controls-indicator\"\n style={{ fontVariantNumeric: \"tabular-nums\", minWidth: 64, textAlign: \"center\" }}\n >\n {state.totalSlides === 0 ? \"0 / 0\" : `${state.currentIndex + 1} / ${state.totalSlides}`}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next slide\"\n disabled={atEnd}\n onClick={() => dispatch({ type: \"NEXT_SLIDE\" })}\n className=\"theo-slide-deck-controls-next\"\n >\n →\n </button>\n </div>\n );\n};\n","/**\n * Progressive fragments detector (ADR D12).\n *\n * Marpit convention: lists with `*` (asterisco) marker — instead of `-` or `+`\n * — become fragment-revealed lists. Each item is a step.\n *\n * Implementation: regex pre-pass on raw markdown counts top-of-line `* ` markers.\n * Decision (EC-9): mixed `*` and `-` in the same list is rare; we count ONLY\n * `* ` items as fragments. Plain `- item` lists remain non-fragmented.\n *\n * v0.4: counts only. CSS attribute application happens at render time inside\n * `<SlideDeck.Slides>`, post-parse, by walking the rendered DOM.\n */\n\nconst FRAGMENT_MARKER_RE = /^\\s*\\*\\s+\\S/gm;\n\n/**\n * Count fragment markers in raw markdown.\n *\n * Detects only `*` at start of a line followed by space + non-whitespace.\n * Avoids matching `**bold**`, `*italic*`, or `_ * _` patterns.\n */\nexport function countFragmentsInMarkdown(markdown: string): number {\n if (!markdown) return 0;\n // Strip fenced code blocks first to avoid counting * inside code.\n const stripped = markdown.replace(/```[\\s\\S]*?```/g, \"\");\n const matches = stripped.match(FRAGMENT_MARKER_RE);\n return matches ? matches.length : 0;\n}\n","/**\n * `<SlideDeck.PresenterView>` — inline split-screen panel.\n *\n * Pragmatic v0.4 scope: renders an in-page panel (current slide + next slide +\n * speaker notes + timer) when `state.presenterMode === true`. The separate\n * window via `window.open` + `BroadcastChannel` is deferred to v0.5 (consumer\n * demand will trigger the upgrade — D6 of the plan is reduced to inline panel).\n *\n * Toggling presenter mode is dispatched via hotkey (n/N/p/P, see useDeckKeyboard).\n */\nimport { type FC, useEffect, useRef, useState } from \"react\";\nimport { Slide } from \"../../primitives/slide/index.js\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface PresenterViewProps {\n className?: string;\n}\n\nfunction formatElapsed(ms: number): string {\n const s = Math.floor(ms / 1000);\n const mm = Math.floor(s / 60)\n .toString()\n .padStart(2, \"0\");\n const ss = (s % 60).toString().padStart(2, \"0\");\n return `${mm}:${ss}`;\n}\n\nexport const PresenterView: FC<PresenterViewProps> = ({ className }) => {\n const { state, slides } = useDeckContext();\n const startedAt = useRef<number | null>(null);\n const [elapsed, setElapsed] = useState(0);\n\n // Initialize the timer when presenter mode first opens; reset when closed.\n useEffect(() => {\n if (state.presenterMode) {\n if (startedAt.current === null) {\n startedAt.current = Date.now();\n }\n const interval = window.setInterval(() => {\n if (startedAt.current !== null) {\n setElapsed(Date.now() - startedAt.current);\n }\n }, 1000);\n return () => window.clearInterval(interval);\n }\n startedAt.current = null;\n setElapsed(0);\n return undefined;\n }, [state.presenterMode]);\n\n if (!state.presenterMode) return null;\n\n const current = slides[state.currentIndex];\n const next = slides[state.currentIndex + 1];\n const notes = current?.notes;\n\n return (\n <aside\n className={[\"theo-slide-deck-presenter\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-presenter\n aria-label=\"Presenter view\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gridTemplateRows: \"auto 1fr\",\n gap: 16,\n padding: 16,\n background: \"color-mix(in srgb, currentColor 6%, transparent)\",\n borderRadius: 8,\n }}\n >\n <header\n style={{\n gridColumn: \"1 / -1\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: 14, fontWeight: 600 }}>Presenter view</h3>\n <span\n aria-label=\"Elapsed time\"\n style={{ fontVariantNumeric: \"tabular-nums\", fontSize: 14 }}\n >\n {formatElapsed(elapsed)}\n </span>\n </header>\n <section aria-label=\"Current slide preview\">\n <h4 style={{ margin: \"0 0 8px\", fontSize: 12, opacity: 0.7 }}>Current</h4>\n <div\n style={{\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n border: \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n }}\n >\n {current ? <Slide markdown={current.markdown} aria-label=\"Current slide\" /> : null}\n </div>\n </section>\n <section aria-label=\"Next slide preview\">\n <h4 style={{ margin: \"0 0 8px\", fontSize: 12, opacity: 0.7 }}>Next</h4>\n <div\n style={{\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n border: \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n opacity: next ? 1 : 0.4,\n }}\n >\n {next ? (\n <Slide markdown={next.markdown} aria-label=\"Next slide\" />\n ) : (\n <div style={{ padding: 16, fontSize: 14, opacity: 0.6 }}>End of deck</div>\n )}\n </div>\n </section>\n {notes ? (\n <section\n aria-label=\"Speaker notes\"\n style={{\n gridColumn: \"1 / -1\",\n background: \"color-mix(in srgb, currentColor 8%, transparent)\",\n padding: 12,\n borderRadius: 6,\n fontSize: 14,\n whiteSpace: \"pre-wrap\",\n }}\n >\n <strong>Notes: </strong>\n {notes}\n </section>\n ) : null}\n </aside>\n );\n};\n","/**\n * Print CSS injection (ADR D7).\n *\n * Injects a `<style id=\"theo-slide-deck-print\">` element into the document\n * head with `@page` + `@media print` rules that render `.theo-slide-deck-print-container`\n * with one slide per page. Calls `window.print()`. Removes the style on the\n * `afterprint` event (cleanup runs regardless of print cancel/complete).\n */\n\nconst STYLE_ID = \"theo-slide-deck-print-styles\";\nconst PRINT_CSS = `\n@media print {\n @page {\n size: 1280px 720px;\n margin: 0;\n }\n body > * {\n visibility: hidden;\n }\n .theo-slide-deck-print-container,\n .theo-slide-deck-print-container * {\n visibility: visible;\n }\n .theo-slide-deck-print-container {\n position: absolute;\n inset: 0;\n }\n .theo-slide-deck-print-slide {\n page-break-after: always;\n break-after: page;\n width: 1280px;\n height: 720px;\n overflow: hidden;\n }\n .theo-slide-deck-print-slide:last-child {\n page-break-after: auto;\n break-after: auto;\n }\n}\n`;\n\nexport function injectPrintStyles(): HTMLStyleElement {\n if (typeof document === \"undefined\") {\n throw new Error(\"injectPrintStyles requires a document (browser env)\");\n }\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = PRINT_CSS;\n document.head.appendChild(style);\n }\n return style;\n}\n\nexport function removePrintStyles(): void {\n if (typeof document === \"undefined\") return;\n const style = document.getElementById(STYLE_ID);\n if (style) style.remove();\n}\n\nexport interface PrintDeckOptions {\n /** Optional callback fired after print dialog closes (success or cancel). */\n onAfterPrint?: () => void;\n}\n\n/**\n * Trigger native print dialog with deck-specific CSS injected.\n *\n * The `afterprint` event listener is cleaned up automatically. Idempotent —\n * calling twice in quick succession is safe (style is reused).\n */\nexport function printDeck(opts: PrintDeckOptions = {}): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n injectPrintStyles();\n const cleanup = (): void => {\n removePrintStyles();\n window.removeEventListener(\"afterprint\", cleanup);\n opts.onAfterPrint?.();\n };\n window.addEventListener(\"afterprint\", cleanup);\n window.print();\n}\n","/**\n * `<SlideDeck.ProgressBar>` — horizontal HTML5 progress element.\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ProgressBarProps {\n className?: string;\n}\n\nexport const ProgressBar: FC<ProgressBarProps> = ({ className }) => {\n const { state } = useDeckContext();\n // Edge case: totalSlides=0 → 0% safely.\n const value = state.totalSlides === 0 ? 0 : state.currentIndex + 1;\n const max = Math.max(1, state.totalSlides);\n return (\n <progress\n className={[\"theo-slide-deck-progress\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-progress\n value={value}\n max={max}\n aria-label=\"Slide progress\"\n />\n );\n};\n","/**\n * `<SlideDeck.SlideNumber>` — decorative \"N / Total\" overlay.\n *\n * aria-hidden because the live indicator in <Controls> already announces the\n * current position; this is purely visual chrome.\n */\nimport type { FC } from \"react\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface SlideNumberProps {\n className?: string;\n}\n\nexport const SlideNumber: FC<SlideNumberProps> = ({ className }) => {\n const { state } = useDeckContext();\n if (state.totalSlides === 0) return null;\n return (\n <div\n className={[\"theo-slide-deck-slide-number\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-slide-number\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n bottom: 12,\n right: 16,\n fontVariantNumeric: \"tabular-nums\",\n fontSize: 14,\n opacity: 0.6,\n }}\n >\n {state.currentIndex + 1} / {state.totalSlides}\n </div>\n );\n};\n","/**\n * Speaker notes extractor (ADR D11).\n *\n * Sintaxe: HTML comments `<!-- notes: ... -->` ou `<!-- note: ... -->`.\n * Aceita ambos singular e plural. Texto interno é plain (sem markdown nesting\n * em v0.4 — pode vir em v0.5).\n *\n * Returns the body with comments removed and the aggregated notes string.\n */\n\nconst NOTES_RE = /<!--\\s*notes?:\\s*([\\s\\S]*?)\\s*-->/gi;\n\nexport interface ExtractNotesResult {\n body: string;\n notes: string | undefined;\n}\n\nexport function extractNotes(md: string): ExtractNotesResult {\n const matches = [...md.matchAll(NOTES_RE)];\n if (matches.length === 0) {\n return { body: md, notes: undefined };\n }\n const notes = matches\n .map((m) => (m[1] ?? \"\").trim())\n .filter((s) => s.length > 0)\n .join(\"\\n\\n\");\n const body = md.replace(NOTES_RE, \"\").trim();\n return { body, notes: notes.length > 0 ? notes : undefined };\n}\n","/**\n * Split a markdown string into individual slides at top-level `thematicBreak`s.\n *\n * Mirrors the Slide primitive's `detectMultiSlide` algorithm (D12 of RFC 0002),\n * but returns ALL slides instead of truncating.\n *\n * ADR D15: strips global frontmatter FIRST so the leading `---\\n...\\n---\\n`\n * delimiter is not parsed as a `thematicBreak` (which would yield a phantom\n * empty slide #0).\n *\n * The first slide may have its own frontmatter (kept attached); subsequent\n * slides do not parse frontmatter again (consumer's `<Slide markdown>` does\n * per-slide validation).\n */\nimport { extractFrontmatter } from \"../../primitives/slide/index.js\";\nimport { extractNotes } from \"./notes.js\";\nimport type { SlideDeckSlide } from \"./schema.js\";\n\nexport async function splitDeck(markdown: string): Promise<SlideDeckSlide[]> {\n // D15: strip leading global frontmatter so its `---` delimiters are not\n // mistaken for slide separators.\n const { body: bodyAfterFM } = extractFrontmatter(markdown);\n\n if (bodyAfterFM.trim().length === 0) {\n return [];\n }\n\n const { fromMarkdown } = await import(\"mdast-util-from-markdown\");\n const tree = fromMarkdown(bodyAfterFM);\n\n const breakOffsets: number[] = [];\n for (const node of tree.children) {\n if (node.type === \"thematicBreak\") {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n if (typeof start === \"number\" && typeof end === \"number\") {\n breakOffsets.push(start);\n breakOffsets.push(end);\n }\n }\n }\n\n if (breakOffsets.length === 0) {\n // Single-slide deck.\n const { body, notes } = extractNotes(bodyAfterFM);\n if (body.trim().length === 0 && !notes) return [];\n return [{ markdown: body, notes }];\n }\n\n // Build ranges between (or excluding) the `---` tokens.\n const slides: SlideDeckSlide[] = [];\n const positions: number[] = [0];\n // breakOffsets is [start0, end0, start1, end1, ...]. We want to skip the\n // `---` itself but include the content between them.\n for (let i = 0; i < breakOffsets.length; i += 2) {\n const start = breakOffsets[i];\n const end = breakOffsets[i + 1];\n if (typeof start === \"number\") positions.push(start);\n if (typeof end === \"number\") positions.push(end);\n }\n positions.push(bodyAfterFM.length);\n\n // Pair adjacent positions to form slide ranges (skip the `---` segments).\n for (let i = 0; i < positions.length - 1; i += 2) {\n const start = positions[i];\n const end = positions[i + 1];\n if (typeof start !== \"number\" || typeof end !== \"number\") continue;\n const chunk = bodyAfterFM.slice(start, end).trim();\n if (chunk.length === 0) continue;\n const { body, notes } = extractNotes(chunk);\n if (body.trim().length === 0 && !notes) continue;\n slides.push({ markdown: body, notes });\n }\n\n return slides;\n}\n","/**\n * `<SlideDeck.Thumbnails>` — sidebar with mini Slide instances.\n *\n * Performance strategy:\n * - Each thumbnail renders the actual `<Slide>` inside a scaled wrapper (~0.18×).\n * - IntersectionObserver lazy-loads thumbnails — off-screen ones show a\n * placeholder skeleton instead of parsing the markdown.\n * - EC-13: when IntersectionObserver is undefined (legacy env / SSR), falls\n * back to eager render. Acceptable for decks ≤ 50 slides.\n *\n * Click handler dispatches JUMP_TO. Auto-scroll keeps current thumbnail visible.\n */\nimport { type FC, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Slide } from \"../../primitives/slide/index.js\";\nimport { useDeckContext } from \"./context.js\";\n\nexport interface ThumbnailsProps {\n className?: string;\n /** Scale of each thumbnail. Default 0.18. */\n scale?: number;\n}\n\nconst CANVAS_W = 1280;\nconst CANVAS_H = 720;\n\ninterface ThumbnailItemProps {\n markdown: string;\n index: number;\n isCurrent: boolean;\n scale: number;\n eager: boolean;\n onSelect: (index: number) => void;\n registerRef: (index: number, el: HTMLElement | null) => void;\n}\n\nconst ThumbnailItem: FC<ThumbnailItemProps> = ({\n markdown,\n index,\n isCurrent,\n scale,\n eager,\n onSelect,\n registerRef,\n}) => {\n const [revealed, setRevealed] = useState(eager);\n\n const setRef = useCallback(\n (el: HTMLElement | null) => {\n registerRef(index, el);\n if (eager) return;\n if (!el) return;\n if (typeof IntersectionObserver === \"undefined\") {\n // EC-13 fallback: no IO, render eagerly.\n setRevealed(true);\n return;\n }\n const io = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setRevealed(true);\n io.disconnect();\n break;\n }\n }\n },\n { rootMargin: \"200px\" },\n );\n io.observe(el);\n },\n [index, eager, registerRef],\n );\n\n const w = Math.round(CANVAS_W * scale);\n const h = Math.round(CANVAS_H * scale);\n return (\n <button\n ref={setRef}\n type=\"button\"\n onClick={() => onSelect(index)}\n data-theo-slide-deck-thumbnail\n data-current={isCurrent || undefined}\n aria-label={`Slide ${index + 1}`}\n aria-current={isCurrent ? \"page\" : undefined}\n className=\"theo-slide-deck-thumbnail\"\n style={{\n width: w,\n height: h,\n padding: 0,\n border: isCurrent ? \"2px solid currentColor\" : \"1px solid rgba(127,127,127,0.3)\",\n borderRadius: 6,\n overflow: \"hidden\",\n position: \"relative\",\n cursor: \"pointer\",\n flexShrink: 0,\n background: \"transparent\",\n }}\n >\n <div\n style={{\n width: CANVAS_W,\n height: CANVAS_H,\n transform: `scale(${scale})`,\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n }}\n >\n {revealed ? (\n <Slide markdown={markdown} aria-label={`Thumbnail ${index + 1}`} />\n ) : (\n <div\n data-theo-slide-deck-thumbnail-placeholder\n style={{\n width: \"100%\",\n height: \"100%\",\n background: \"rgba(127,127,127,0.08)\",\n }}\n />\n )}\n </div>\n </button>\n );\n};\n\nexport const Thumbnails: FC<ThumbnailsProps> = ({ className, scale = 0.18 }) => {\n const { state, dispatch, slides } = useDeckContext();\n const refs = useRef<Map<number, HTMLElement>>(new Map());\n\n const registerRef = useCallback((index: number, el: HTMLElement | null) => {\n if (el) {\n refs.current.set(index, el);\n } else {\n refs.current.delete(index);\n }\n }, []);\n\n const onSelect = useCallback(\n (index: number) => {\n dispatch({ type: \"JUMP_TO\", index });\n },\n [dispatch],\n );\n\n // Auto-scroll current into view.\n useEffect(() => {\n const el = refs.current.get(state.currentIndex);\n if (el && \"scrollIntoView\" in el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"nearest\", inline: \"nearest\" });\n }\n }, [state.currentIndex]);\n\n // EC-13: eager mode when IO is absent.\n const eagerAll = useMemo(() => typeof IntersectionObserver === \"undefined\", []);\n\n return (\n <ul\n className={[\"theo-slide-deck-thumbnails\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-thumbnails\n aria-label=\"Slide thumbnails\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n overflowY: \"auto\",\n padding: 8,\n listStyle: \"none\",\n margin: 0,\n }}\n >\n {slides.map((slide, index) => (\n <li key={`${slide.id ?? index}-${index}`}>\n <ThumbnailItem\n markdown={slide.markdown}\n index={index}\n isCurrent={index === state.currentIndex}\n scale={scale}\n eager={eagerAll || index < 3 /* first 3 always eager for snappy first paint */}\n onSelect={onSelect}\n registerRef={registerRef}\n />\n </li>\n ))}\n </ul>\n );\n};\n","/**\n * Hash routing hook (ADR D13).\n *\n * Pattern `#/N` (1-based). Bidirectional sync:\n * - Initial state: read via `useDeckState`'s lazy `initFromHash` (D17 SSR-safe).\n * - hashchange event → JUMP_TO.\n * - currentIndex change → `history.replaceState` (does NOT trigger hashchange,\n * so no infinite loop — verified in test EC-10).\n */\nimport { type Dispatch, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckHashRoutingOptions {\n enabled?: boolean;\n totalSlides: number;\n currentIndex: number;\n}\n\n/** Read hash → return 0-based index, or undefined if not present/invalid. */\nexport function readHashIndex(hash: string): number | undefined {\n if (!hash || hash === \"#\" || hash === \"#/\") return undefined;\n const match = hash.match(/^#\\/(\\d+)/);\n if (!match) return undefined;\n const oneBased = Number.parseInt(match[1] ?? \"\", 10);\n if (!Number.isFinite(oneBased) || oneBased < 1) return undefined;\n return oneBased - 1;\n}\n\n/** SSR-safe wrapper for initial hash read (D17). */\nexport function readInitialHash(): number | undefined {\n if (typeof window === \"undefined\") return undefined;\n return readHashIndex(window.location.hash);\n}\n\n/** Format index → hash string. */\nexport function formatHash(zeroBasedIndex: number): string {\n return `#/${zeroBasedIndex + 1}`;\n}\n\nexport function useDeckHashRouting(\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckHashRoutingOptions,\n): void {\n const { enabled = true, totalSlides, currentIndex } = opts;\n\n // Listen for hashchange (back/forward, manual edit, shared link click).\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n const handler = (): void => {\n const idx = readHashIndex(window.location.hash);\n if (typeof idx !== \"number\") return;\n const clamped = Math.max(0, Math.min(idx, Math.max(0, totalSlides - 1)));\n dispatch({ type: \"JUMP_TO\", index: clamped });\n };\n window.addEventListener(\"hashchange\", handler);\n return () => window.removeEventListener(\"hashchange\", handler);\n }, [enabled, totalSlides, dispatch]);\n\n // Sync currentIndex → hash via replaceState (silent, no hashchange fired).\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n const targetHash = formatHash(currentIndex);\n if (window.location.hash === targetHash) return;\n // replaceState does NOT trigger hashchange — verified in test EC-10.\n window.history.replaceState(null, \"\", targetHash);\n }, [enabled, currentIndex]);\n}\n","/**\n * Keyboard navigation hook (ADR D9).\n *\n * Hardcoded bindings (no remap in v0.4):\n * ArrowRight, Space, PageDown → NEXT_SLIDE\n * ArrowLeft, PageUp → PREV_SLIDE\n * Home → JUMP_TO 0\n * End → JUMP_TO last\n * Escape → SET_FULLSCREEN false\n * f / F → toggleFullscreen callback\n * n / N / p / P → TOGGLE_PRESENTER\n * Ctrl+P / Meta+P → onPrint callback (preventDefault)\n *\n * Guards: ignora events quando target é INPUT, TEXTAREA, ou contentEditable\n * (consumer pode ter inputs em modais sem conflito).\n */\nimport { type Dispatch, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckKeyboardOptions {\n enabled?: boolean;\n totalSlides: number;\n onToggleFullscreen?: () => void;\n onPrint?: () => void;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\nexport function useDeckKeyboard(\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckKeyboardOptions,\n): void {\n const { enabled = true, totalSlides, onToggleFullscreen, onPrint } = opts;\n useEffect(() => {\n if (!enabled) return;\n const handler = (event: KeyboardEvent): void => {\n if (isEditableTarget(event.target)) return;\n\n const key = event.key;\n const isPrintCombo = (event.ctrlKey || event.metaKey) && (key === \"p\" || key === \"P\");\n\n if (isPrintCombo) {\n event.preventDefault();\n onPrint?.();\n return;\n }\n\n switch (key) {\n case \"ArrowRight\":\n case \" \":\n case \"Spacebar\":\n case \"PageDown\":\n dispatch({ type: \"NEXT_SLIDE\" });\n break;\n case \"ArrowLeft\":\n case \"PageUp\":\n dispatch({ type: \"PREV_SLIDE\" });\n break;\n case \"Home\":\n dispatch({ type: \"JUMP_TO\", index: 0 });\n break;\n case \"End\":\n dispatch({ type: \"JUMP_TO\", index: Math.max(0, totalSlides - 1) });\n break;\n case \"Escape\":\n dispatch({ type: \"SET_FULLSCREEN\", value: false });\n break;\n case \"f\":\n case \"F\":\n onToggleFullscreen?.();\n break;\n case \"n\":\n case \"N\":\n case \"p\":\n case \"P\":\n dispatch({ type: \"TOGGLE_PRESENTER\" });\n break;\n default:\n return;\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [enabled, totalSlides, dispatch, onToggleFullscreen, onPrint]);\n}\n","/**\n * Deck state machine (ADR D5).\n *\n * Single useReducer governs all deck-level state transitions: currentIndex,\n * currentFragment, presenterMode, fullscreen, transitionDirection.\n *\n * NEXT_SLIDE advances fragment first if `currentFragment < totalFragmentsInCurrent`,\n * else advances slide. PREV_SLIDE mirrors. JUMP_TO clamps to valid range.\n *\n * ADR D17: lazy init reads hash via `initFromHash` callback when provided —\n * SSR-safe (callback guards `typeof window !== \"undefined\"`).\n */\nimport { type Dispatch, useReducer } from \"react\";\n\nexport interface DeckState {\n currentIndex: number;\n currentFragment: number;\n presenterMode: boolean;\n fullscreen: boolean;\n transitionDirection: \"none\" | \"next\" | \"prev\";\n totalSlides: number;\n totalFragmentsInCurrent: number;\n}\n\nexport type DeckAction =\n | { type: \"NEXT_SLIDE\" }\n | { type: \"PREV_SLIDE\" }\n | { type: \"JUMP_TO\"; index: number }\n | { type: \"NEXT_FRAGMENT\" }\n | { type: \"PREV_FRAGMENT\" }\n | { type: \"RESET_FRAGMENTS\" }\n | { type: \"TOGGLE_PRESENTER\" }\n | { type: \"SET_FULLSCREEN\"; value: boolean }\n | { type: \"UPDATE_TOTAL_SLIDES\"; total: number }\n | { type: \"UPDATE_TOTAL_FRAGMENTS\"; total: number }\n | { type: \"TRANSITION_END\" };\n\nexport function deckReducer(state: DeckState, action: DeckAction): DeckState {\n switch (action.type) {\n case \"NEXT_SLIDE\": {\n // Advance fragment first when there are remaining fragments.\n if (state.currentFragment < state.totalFragmentsInCurrent) {\n return { ...state, currentFragment: state.currentFragment + 1 };\n }\n const next = Math.min(state.currentIndex + 1, Math.max(0, state.totalSlides - 1));\n if (next === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: next,\n currentFragment: 0,\n transitionDirection: \"next\",\n };\n }\n case \"PREV_SLIDE\": {\n if (state.currentFragment > 0) {\n return { ...state, currentFragment: state.currentFragment - 1 };\n }\n const prev = Math.max(state.currentIndex - 1, 0);\n if (prev === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: prev,\n currentFragment: 0,\n transitionDirection: \"prev\",\n };\n }\n case \"JUMP_TO\": {\n const clamped = Math.max(0, Math.min(action.index, Math.max(0, state.totalSlides - 1)));\n if (clamped === state.currentIndex) return state;\n return {\n ...state,\n currentIndex: clamped,\n currentFragment: 0,\n transitionDirection: \"none\",\n };\n }\n case \"NEXT_FRAGMENT\": {\n if (state.currentFragment >= state.totalFragmentsInCurrent) return state;\n return { ...state, currentFragment: state.currentFragment + 1 };\n }\n case \"PREV_FRAGMENT\": {\n if (state.currentFragment <= 0) return state;\n return { ...state, currentFragment: state.currentFragment - 1 };\n }\n case \"RESET_FRAGMENTS\":\n return { ...state, currentFragment: 0 };\n case \"TOGGLE_PRESENTER\":\n return { ...state, presenterMode: !state.presenterMode };\n case \"SET_FULLSCREEN\":\n return state.fullscreen === action.value ? state : { ...state, fullscreen: action.value };\n case \"UPDATE_TOTAL_SLIDES\": {\n const next = Math.max(0, action.total);\n const clampedIdx = Math.max(0, Math.min(state.currentIndex, Math.max(0, next - 1)));\n return { ...state, totalSlides: next, currentIndex: clampedIdx };\n }\n case \"UPDATE_TOTAL_FRAGMENTS\":\n return { ...state, totalFragmentsInCurrent: Math.max(0, action.total) };\n case \"TRANSITION_END\":\n return state.transitionDirection === \"none\"\n ? state\n : { ...state, transitionDirection: \"none\" };\n }\n}\n\nexport interface UseDeckStateOptions {\n initialIndex?: number;\n totalSlides: number;\n /** Lazy initializer hook (D17): returns initial index, e.g. parsing hash. */\n initFromHash?: () => number | undefined;\n}\n\nfunction initDeckState(init: UseDeckStateOptions): DeckState {\n const total = Math.max(0, init.totalSlides);\n let idx = init.initialIndex ?? 0;\n if (init.initFromHash) {\n const fromHash = init.initFromHash();\n if (typeof fromHash === \"number\" && Number.isFinite(fromHash)) {\n idx = fromHash;\n }\n }\n const clamped = Math.max(0, Math.min(idx, Math.max(0, total - 1)));\n return {\n currentIndex: clamped,\n currentFragment: 0,\n presenterMode: false,\n fullscreen: false,\n transitionDirection: \"none\",\n totalSlides: total,\n totalFragmentsInCurrent: 0,\n };\n}\n\nexport function useDeckState(\n opts: UseDeckStateOptions,\n): readonly [DeckState, Dispatch<DeckAction>] {\n const [state, dispatch] = useReducer(deckReducer, opts, initDeckState);\n return [state, dispatch] as const;\n}\n","/**\n * Touch swipe hook (ADR D10).\n *\n * Detecta swipe horizontal via Pointer Events nativos:\n * - threshold: 50px de deslocamento\n * - velocity: > 0.3 px/ms\n * - direction guard: |dx| > 2*|dy| (bloqueia swipe vertical / scroll)\n *\n * Swipe left (dx < 0) → NEXT_SLIDE\n * Swipe right (dx > 0) → PREV_SLIDE\n *\n * EC-6: pointercancel limpa o tracking state (mobile browser pode cancelar mid-swipe).\n * EC-7: tracking limita ao primeiro pointerId (multi-touch é ignorado).\n */\nimport { type Dispatch, type RefObject, useEffect } from \"react\";\nimport type { DeckAction } from \"./use-deck-state.js\";\n\nexport interface UseDeckSwipeOptions {\n enabled?: boolean;\n}\n\ninterface TrackedPointer {\n pointerId: number;\n startX: number;\n startY: number;\n startedAt: number;\n}\n\nconst SWIPE_THRESHOLD_PX = 50;\nconst SWIPE_VELOCITY_PX_PER_MS = 0.3;\n\nexport function useDeckSwipe(\n ref: RefObject<HTMLElement | null>,\n dispatch: Dispatch<DeckAction>,\n opts: UseDeckSwipeOptions = {},\n): void {\n const { enabled = true } = opts;\n useEffect(() => {\n if (!enabled) return;\n const el = ref.current;\n if (!el) return;\n\n let tracked: TrackedPointer | null = null;\n\n const onPointerDown = (e: PointerEvent): void => {\n // EC-7: ignore secondary pointers (multi-touch).\n if (tracked !== null) return;\n tracked = {\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n startedAt: e.timeStamp,\n };\n };\n\n const onPointerUp = (e: PointerEvent): void => {\n if (!tracked || e.pointerId !== tracked.pointerId) return;\n const dx = e.clientX - tracked.startX;\n const dy = e.clientY - tracked.startY;\n const dt = Math.max(1, e.timeStamp - tracked.startedAt);\n tracked = null;\n\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n const velocity = absDx / dt;\n\n // Direction guard: horizontal-dominant swipe only.\n if (absDx < absDy * 2) return;\n // Threshold + velocity guard.\n if (absDx < SWIPE_THRESHOLD_PX) return;\n if (velocity < SWIPE_VELOCITY_PX_PER_MS) return;\n\n if (dx < 0) {\n dispatch({ type: \"NEXT_SLIDE\" });\n } else if (dx > 0) {\n dispatch({ type: \"PREV_SLIDE\" });\n }\n };\n\n const onPointerCancel = (e: PointerEvent): void => {\n // EC-6: clear tracking on cancel (browser back gesture, system interruption).\n if (tracked && e.pointerId === tracked.pointerId) {\n tracked = null;\n }\n };\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n el.addEventListener(\"pointerup\", onPointerUp);\n el.addEventListener(\"pointercancel\", onPointerCancel);\n return () => {\n el.removeEventListener(\"pointerdown\", onPointerDown);\n el.removeEventListener(\"pointerup\", onPointerUp);\n el.removeEventListener(\"pointercancel\", onPointerCancel);\n };\n }, [enabled, ref, dispatch]);\n}\n","/**\n * Cross-browser fullscreen hook (ADR D6 area / EC-8).\n *\n * Wraps `Element.requestFullscreen()` + Safari `webkit*` prefix. Listens\n * `fullscreenchange` (+ webkit) to sync state when user presses Esc via the\n * native UI.\n *\n * EC-8: iOS Safari < 16 doesn't expose fullscreen on arbitrary elements (only\n * `<video>`). Feature-detect — when unavailable, hook is a no-op and `toggle`\n * is safe to call.\n */\nimport { type RefObject, useCallback, useEffect, useState } from \"react\";\n\ninterface VendoredElement extends HTMLElement {\n webkitRequestFullscreen?: () => Promise<void>;\n}\n\ninterface VendoredDocument extends Document {\n webkitFullscreenElement?: Element | null;\n webkitExitFullscreen?: () => Promise<void>;\n}\n\nfunction isFullscreenSupported(): boolean {\n if (typeof document === \"undefined\") return false;\n const doc = document as VendoredDocument;\n const el = document.documentElement as VendoredElement;\n return (\n Boolean(el.requestFullscreen ?? el.webkitRequestFullscreen) &&\n Boolean(doc.exitFullscreen ?? doc.webkitExitFullscreen)\n );\n}\n\nfunction currentFullscreenElement(): Element | null {\n if (typeof document === \"undefined\") return null;\n const doc = document as VendoredDocument;\n return document.fullscreenElement ?? doc.webkitFullscreenElement ?? null;\n}\n\nexport interface UseFullscreenResult {\n isFullscreen: boolean;\n toggle: () => Promise<void>;\n isSupported: boolean;\n}\n\nexport function useFullscreen(ref: RefObject<HTMLElement | null>): UseFullscreenResult {\n const supported = isFullscreenSupported();\n const [isFullscreen, setFullscreen] = useState(false);\n\n useEffect(() => {\n if (!supported) return;\n const handler = (): void => {\n setFullscreen(currentFullscreenElement() !== null);\n };\n document.addEventListener(\"fullscreenchange\", handler);\n document.addEventListener(\"webkitfullscreenchange\", handler);\n return () => {\n document.removeEventListener(\"fullscreenchange\", handler);\n document.removeEventListener(\"webkitfullscreenchange\", handler);\n };\n }, [supported]);\n\n const toggle = useCallback(async (): Promise<void> => {\n if (!supported) return;\n const el = ref.current as VendoredElement | null;\n if (!el) return;\n const doc = document as VendoredDocument;\n try {\n if (currentFullscreenElement()) {\n await (doc.exitFullscreen?.() ?? doc.webkitExitFullscreen?.());\n } else {\n await (el.requestFullscreen?.() ?? el.webkitRequestFullscreen?.());\n }\n } catch {\n // User denied or API unavailable — silent fallback. Defensive: never throw.\n }\n }, [ref, supported]);\n\n return { isFullscreen, toggle, isSupported: supported };\n}\n","import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n/**\n * `<SlideDeck>` — composite engine orchestrating N `<Slide>` primitives.\n *\n * Subpath-isolated at `@usetheo/ui/slide-deck` (ADR D1). Imports `<Slide>` via\n * the public package path so consumer's installed peer-deps are reused.\n *\n * See RFC 0003 and the plan in\n * `.claude/knowledge-base/plans/slide-deck-composite-plan.md`.\n *\n * Two render modes:\n * - DEFAULT layout: no children → renders canonical chrome (Slides + Controls\n * + ProgressBar + SlideNumber + PresenterView + buttons).\n * - HEADLESS: children provided → consumer composes own layout from\n * `<SlideDeck.X>` sub-components and a shared DeckContext.\n *\n * SSR-safe: parses markdown only inside `useEffect`. Hash routing uses lazy\n * `initFromHash` (D17) to avoid hydration mismatch. Reducer clamps\n * `currentIndex` whenever `slides.length` changes (EC-4 reconciliation).\n */\nimport { Slide, type SlidePlugin } from \"../../primitives/slide/index.js\";\nimport { DeckContext, type DeckContextValue, useDeckContext } from \"./context.js\";\nimport { Controls } from \"./controls.js\";\nimport { countFragmentsInMarkdown } from \"./fragments.js\";\nimport { PresenterView } from \"./presenter-view.js\";\nimport { printDeck } from \"./print-styles.js\";\nimport { ProgressBar } from \"./progress-bar.js\";\nimport type { SlideDeckInput, SlideDeckSlide, SlideDeckTransition } from \"./schema.js\";\nimport { SlideNumber } from \"./slide-number.js\";\nimport { splitDeck } from \"./split-deck.js\";\nimport { Thumbnails } from \"./thumbnails.js\";\nimport { readInitialHash, useDeckHashRouting } from \"./use-deck-hash-routing.js\";\nimport { useDeckKeyboard } from \"./use-deck-keyboard.js\";\nimport { useDeckState } from \"./use-deck-state.js\";\nimport { useDeckSwipe } from \"./use-deck-swipe.js\";\nimport { useFullscreen } from \"./use-fullscreen.js\";\n\nimport \"./transitions.css\";\n\nexport interface SlideDeckProps {\n /** Markdown string (auto-split) or pre-parsed slide array. */\n slides: SlideDeckInput;\n /** Initial slide index (0-based). Default 0. */\n initialIndex?: number;\n /** Transition preset. Default \"fade\". */\n transition?: SlideDeckTransition;\n /** Enable keyboard navigation. Default true. */\n enableKeyboard?: boolean;\n /** Enable touch/pointer swipe navigation. Default true. */\n enableTouch?: boolean;\n /** Enable hash routing (#/N). Default true. */\n enableHashRouting?: boolean;\n /** Optional unique deck id (auto-generated UUID if absent). */\n deckId?: string;\n /** Called after each navigation. */\n onIndexChange?: (index: number, slide: SlideDeckSlide | undefined) => void;\n /** Headless mode: render custom chrome using `<SlideDeck.X>` sub-components. */\n children?: ReactNode;\n /** Outer className for the deck root. */\n className?: string;\n /** Accessible label for the deck region. Defaults to \"Slide deck\". */\n \"aria-label\"?: string;\n /**\n * Rich-content plugins relayed to every inner `<Slide>` (D15 / RFC 0004).\n * Pass MEMOIZED arrays to avoid re-parses on every render.\n */\n plugins?: SlidePlugin[];\n}\n\nfunction generateDeckId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `deck-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nconst SlideDeckBase: FC<SlideDeckProps> = ({\n slides: slidesInput,\n initialIndex = 0,\n transition = \"fade\",\n enableKeyboard = true,\n enableTouch = true,\n enableHashRouting = true,\n deckId: deckIdProp,\n onIndexChange,\n children,\n className,\n \"aria-label\": ariaLabel = \"Slide deck\",\n plugins,\n}) => {\n const generatedId = useId();\n const deckId = deckIdProp ?? generatedId ?? generateDeckId();\n const rootRef = useRef<HTMLDivElement>(null);\n\n const [parsedSlides, setParsedSlides] = useState<SlideDeckSlide[]>(() => {\n return Array.isArray(slidesInput) ? slidesInput : [];\n });\n\n // Async parse when string markdown is passed. Re-run when prop changes.\n useEffect(() => {\n if (Array.isArray(slidesInput)) {\n setParsedSlides(slidesInput);\n return;\n }\n let cancelled = false;\n splitDeck(slidesInput).then(\n (result) => {\n if (!cancelled) setParsedSlides(result);\n },\n () => {\n if (!cancelled) setParsedSlides([]);\n },\n );\n return () => {\n cancelled = true;\n };\n }, [slidesInput]);\n\n const [state, dispatch] = useDeckState({\n initialIndex,\n totalSlides: parsedSlides.length,\n initFromHash: enableHashRouting ? readInitialHash : undefined,\n });\n\n // EC-4: reconcile when slides.length changes.\n const previousLengthRef = useRef(0);\n useEffect(() => {\n const length = parsedSlides.length;\n dispatch({ type: \"UPDATE_TOTAL_SLIDES\", total: length });\n // First non-empty parse → honour `initialIndex` (or hash) which was clamped\n // to 0 during initial mount when totalSlides was still 0.\n if (previousLengthRef.current === 0 && length > 0) {\n let target = initialIndex;\n if (enableHashRouting) {\n const hashIdx = readInitialHash();\n if (typeof hashIdx === \"number\") target = hashIdx;\n }\n if (target > 0) {\n dispatch({ type: \"JUMP_TO\", index: target });\n }\n }\n previousLengthRef.current = length;\n }, [parsedSlides.length, dispatch, initialIndex, enableHashRouting]);\n\n // Update totalFragmentsInCurrent when slide content changes.\n useEffect(() => {\n const current = parsedSlides[state.currentIndex];\n const count = current ? countFragmentsInMarkdown(current.markdown) : 0;\n dispatch({ type: \"UPDATE_TOTAL_FRAGMENTS\", total: count });\n }, [parsedSlides, state.currentIndex, dispatch]);\n\n const fullscreen = useFullscreen(rootRef);\n\n // Sync state.fullscreen with browser API. When user presses Esc on native UI.\n useEffect(() => {\n dispatch({ type: \"SET_FULLSCREEN\", value: fullscreen.isFullscreen });\n }, [fullscreen.isFullscreen, dispatch]);\n\n // EC-3 / D16: transition timeout fallback so rapid nav doesn't leave state stuck.\n useEffect(() => {\n if (state.transitionDirection === \"none\") return;\n const t = setTimeout(() => dispatch({ type: \"TRANSITION_END\" }), 300);\n return () => clearTimeout(t);\n }, [state.transitionDirection, dispatch]);\n\n const onPrint = useCallback(() => {\n printDeck();\n }, []);\n\n useDeckKeyboard(dispatch, {\n enabled: enableKeyboard,\n totalSlides: parsedSlides.length,\n onToggleFullscreen: fullscreen.toggle,\n onPrint,\n });\n\n useDeckSwipe(rootRef, dispatch, { enabled: enableTouch });\n\n useDeckHashRouting(dispatch, {\n enabled: enableHashRouting,\n totalSlides: parsedSlides.length,\n currentIndex: state.currentIndex,\n });\n\n // Fire onIndexChange callback when currentIndex changes.\n const lastIndexRef = useRef(state.currentIndex);\n useEffect(() => {\n if (lastIndexRef.current !== state.currentIndex) {\n lastIndexRef.current = state.currentIndex;\n onIndexChange?.(state.currentIndex, parsedSlides[state.currentIndex]);\n }\n }, [state.currentIndex, parsedSlides, onIndexChange]);\n\n const contextValue: DeckContextValue = useMemo(\n () => ({\n state,\n dispatch,\n slides: parsedSlides,\n transition,\n deckId,\n plugins,\n toggleFullscreen: fullscreen.toggle,\n print: onPrint,\n }),\n [state, dispatch, parsedSlides, transition, deckId, plugins, fullscreen.toggle, onPrint],\n );\n\n return (\n <DeckContext.Provider value={contextValue}>\n <div\n ref={rootRef}\n aria-roledescription=\"slide deck\"\n aria-label={ariaLabel}\n data-theo-slide-deck\n data-theo-slide-deck-fullscreen={state.fullscreen ? \"true\" : undefined}\n className={[\"theo-slide-deck\", className].filter(Boolean).join(\" \")}\n style={{ position: \"relative\", width: \"100%\", height: \"100%\" }}\n >\n {/* Live region for screen readers announcing slide changes. */}\n {/* biome-ignore lint/a11y/useSemanticElements: ARIA live region needs explicit role for screen reader announcement; no native HTML equivalent for status updates from non-form, non-output content. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style={{\n position: \"absolute\",\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0,0,0,0)\",\n whiteSpace: \"nowrap\",\n border: 0,\n }}\n >\n {parsedSlides.length > 0\n ? `Slide ${state.currentIndex + 1} of ${parsedSlides.length}`\n : \"Empty deck\"}\n </div>\n {children ?? <DefaultDeckLayout />}\n {/* Hidden print container — visible only during @media print. */}\n <PrintContainer slides={parsedSlides} plugins={plugins} />\n </div>\n </DeckContext.Provider>\n );\n};\n\nconst SlidesView: FC<{ className?: string }> = ({ className }) => {\n const { state, slides, transition, plugins } = useDeckContext();\n const current = slides[state.currentIndex];\n return (\n <div\n className={[\"theo-slide-deck-slide-frame\", className].filter(Boolean).join(\" \")}\n data-theo-slide-deck-transition={transition}\n data-theo-slide-deck-direction={state.transitionDirection}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\n {current ? (\n <div\n key={state.currentIndex}\n data-theo-slide-deck-slide-state=\"incoming\"\n style={{ position: \"absolute\", inset: 0 }}\n >\n <Slide\n markdown={current.markdown}\n plugins={plugins}\n aria-label={`Slide ${state.currentIndex + 1}`}\n />\n </div>\n ) : (\n <div\n data-theo-slide-deck-empty\n style={{\n display: \"grid\",\n placeItems: \"center\",\n height: \"100%\",\n opacity: 0.6,\n fontSize: 14,\n }}\n >\n Empty deck\n </div>\n )}\n </div>\n );\n};\n\nconst PresenterButton: FC<{ className?: string }> = ({ className }) => {\n const { state, dispatch } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => dispatch({ type: \"TOGGLE_PRESENTER\" })}\n aria-pressed={state.presenterMode}\n aria-label={state.presenterMode ? \"Close presenter view\" : \"Open presenter view\"}\n className={[\"theo-slide-deck-presenter-button\", className].filter(Boolean).join(\" \")}\n >\n {state.presenterMode ? \"Close presenter\" : \"Presenter\"}\n </button>\n );\n};\n\nconst FullscreenButton: FC<{ className?: string }> = ({ className }) => {\n const { state, toggleFullscreen } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => void toggleFullscreen()}\n aria-pressed={state.fullscreen}\n aria-label={state.fullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className={[\"theo-slide-deck-fullscreen-button\", className].filter(Boolean).join(\" \")}\n >\n {state.fullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n </button>\n );\n};\n\nconst PrintButton: FC<{ className?: string }> = ({ className }) => {\n const { print } = useDeckContext();\n return (\n <button\n type=\"button\"\n onClick={() => print()}\n aria-label=\"Print or save deck as PDF\"\n className={[\"theo-slide-deck-print-button\", className].filter(Boolean).join(\" \")}\n >\n Print\n </button>\n );\n};\n\nconst PrintContainer: FC<{ slides: SlideDeckSlide[]; plugins?: SlidePlugin[] }> = ({\n slides,\n plugins,\n}) => {\n return (\n <div\n className=\"theo-slide-deck-print-container\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n visibility: \"hidden\",\n }}\n >\n {slides.map((slide, index) => (\n <div\n key={`print-${slide.id ?? index}`}\n className=\"theo-slide-deck-print-slide\"\n style={{ width: 1280, height: 720 }}\n >\n <Slide\n markdown={slide.markdown}\n plugins={plugins}\n aria-label={`Print slide ${index + 1}`}\n />\n </div>\n ))}\n </div>\n );\n};\n\nconst DefaultDeckLayout: FC = () => {\n return (\n <div\n className=\"theo-slide-deck-default-layout\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr\",\n gridTemplateRows: \"1fr auto\",\n gap: 8,\n height: \"100%\",\n }}\n >\n <SlidesView />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"4px 8px\",\n flexWrap: \"wrap\",\n }}\n >\n <Controls />\n <ProgressBar />\n <div style={{ display: \"flex\", gap: 4 }}>\n <PresenterButton />\n <FullscreenButton />\n <PrintButton />\n </div>\n </div>\n <SlideNumber />\n <PresenterView />\n </div>\n );\n};\n\ntype SlideDeckComponent = FC<SlideDeckProps> & {\n Slides: FC<{ className?: string }>;\n Controls: typeof Controls;\n ProgressBar: typeof ProgressBar;\n SlideNumber: typeof SlideNumber;\n Thumbnails: typeof Thumbnails;\n PresenterView: typeof PresenterView;\n PresenterButton: FC<{ className?: string }>;\n FullscreenButton: FC<{ className?: string }>;\n PrintButton: FC<{ className?: string }>;\n};\n\nconst SlideDeck = SlideDeckBase as SlideDeckComponent;\nSlideDeck.Slides = SlidesView;\nSlideDeck.Controls = Controls;\nSlideDeck.ProgressBar = ProgressBar;\nSlideDeck.SlideNumber = SlideNumber;\nSlideDeck.Thumbnails = Thumbnails;\nSlideDeck.PresenterView = PresenterView;\nSlideDeck.PresenterButton = PresenterButton;\nSlideDeck.FullscreenButton = FullscreenButton;\nSlideDeck.PrintButton = PrintButton;\n\nexport { SlideDeck };\n","/**\n * Zod schema for `<SlideDeck>` input.\n *\n * Two shapes accepted (ADR D4):\n * - `string` — full markdown, split internally by `splitDeck` (top-level\n * `thematicBreak`, see ADR D3 / D12 of Slide).\n * - `SlideDeckSlide[]` — pre-parsed array (CMS/DB consumers).\n *\n * See `.claude/knowledge-base/plans/slide-deck-composite-plan.md` §16.3.\n */\nimport { z } from \"zod\";\n\nexport const slideDeckSlide = z.object({\n /** Markdown content of this slide. Capped at 50 KB (same as Slide body). */\n markdown: z.string().max(50_000),\n /** Optional id for hash routing (defaults to numeric index, 1-based). */\n id: z\n .string()\n .regex(/^[a-z0-9-]+$/, \"id must be lowercase kebab-case\")\n .max(64)\n .optional(),\n /** Speaker notes (plain text extracted from <!-- notes: ... --> comments). */\n notes: z.string().max(5_000).optional(),\n});\n\n/** Composed input — `slides` prop accepts either form. */\nexport const slideDeckInput = z.union([z.string().max(500_000), z.array(slideDeckSlide).max(500)]);\n\nexport type SlideDeckSlide = z.infer<typeof slideDeckSlide>;\nexport type SlideDeckInput = z.infer<typeof slideDeckInput>;\n\n/** Transition presets. ADR D8. */\nexport const slideDeckTransition = z.enum([\"none\", \"fade\", \"slide\"]);\nexport type SlideDeckTransition = z.infer<typeof slideDeckTransition>;\n"]}