@thanh01.pmt/presentation-kit 0.2.18 → 0.3.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 (56) hide show
  1. package/README.md +26 -0
  2. package/dist/ai/index.cjs +16 -15
  3. package/dist/ai/index.cjs.map +1 -1
  4. package/dist/ai/index.d.cts +3 -2
  5. package/dist/ai/index.d.ts +3 -2
  6. package/dist/ai/index.js +2 -1
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/assets/fonts/NOTICE.md +25 -0
  9. package/dist/assets/fonts/SOURCES.json +47 -0
  10. package/dist/assets/fonts/fira-code.woff2 +0 -0
  11. package/dist/assets/fonts/inter.woff2 +0 -0
  12. package/dist/assets/fonts/jetbrains-mono.woff2 +0 -0
  13. package/dist/assets/fonts/playfair-display.woff2 +0 -0
  14. package/dist/assets/fonts/plus-jakarta-sans.woff2 +0 -0
  15. package/dist/assets/fonts/space-grotesk.woff2 +0 -0
  16. package/dist/{chunk-DDOUFYLK.js → chunk-3DXMAPAY.js} +3 -3
  17. package/dist/{chunk-DDOUFYLK.js.map → chunk-3DXMAPAY.js.map} +1 -1
  18. package/dist/chunk-3Q4RMZVQ.cjs +867 -0
  19. package/dist/chunk-3Q4RMZVQ.cjs.map +1 -0
  20. package/dist/{chunk-JJQDQIRG.js → chunk-5HIDQQHE.js} +288 -855
  21. package/dist/chunk-5HIDQQHE.js.map +1 -0
  22. package/dist/{chunk-SFBEDDGU.cjs → chunk-5WEZOGQA.cjs} +292 -866
  23. package/dist/chunk-5WEZOGQA.cjs.map +1 -0
  24. package/dist/{chunk-DIHFQ5LF.cjs → chunk-CVEC72CT.cjs} +4 -4
  25. package/dist/{chunk-DIHFQ5LF.cjs.map → chunk-CVEC72CT.cjs.map} +1 -1
  26. package/dist/chunk-V6X7D44H.js +854 -0
  27. package/dist/chunk-V6X7D44H.js.map +1 -0
  28. package/dist/{click-css-Bcc1CkTN.d.cts → click-css-C8VciwZ6.d.cts} +1 -1
  29. package/dist/{click-css-B2s9B_uP.d.ts → click-css-COIiFo1I.d.ts} +1 -1
  30. package/dist/index.cjs +90 -69
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +46 -5
  33. package/dist/index.d.ts +46 -5
  34. package/dist/index.js +5 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/node/index.cjs +117 -0
  37. package/dist/node/index.cjs.map +1 -0
  38. package/dist/node/index.d.cts +36 -0
  39. package/dist/node/index.d.ts +36 -0
  40. package/dist/node/index.js +105 -0
  41. package/dist/node/index.js.map +1 -0
  42. package/dist/{presets-D_hfPJX9.d.ts → presets-DPRGtpO-.d.ts} +1 -1
  43. package/dist/{presets-BYvgAAkJ.d.cts → presets-MIi91wZg.d.cts} +1 -1
  44. package/dist/react/index.cjs +17 -16
  45. package/dist/react/index.cjs.map +1 -1
  46. package/dist/react/index.d.cts +4 -3
  47. package/dist/react/index.d.ts +4 -3
  48. package/dist/react/index.js +4 -3
  49. package/dist/react/index.js.map +1 -1
  50. package/dist/{types-C3d04zzP.d.cts → types-CvxCxWus.d.cts} +1 -67
  51. package/dist/{types-C3d04zzP.d.ts → types-CvxCxWus.d.ts} +1 -67
  52. package/dist/types-k_eae8UV.d.cts +74 -0
  53. package/dist/types-k_eae8UV.d.ts +74 -0
  54. package/package.json +8 -2
  55. package/dist/chunk-JJQDQIRG.js.map +0 -1
  56. package/dist/chunk-SFBEDDGU.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/layout/serializer.ts","../src/core/layout/presets.ts"],"names":[],"mappings":"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","file":"chunk-V6X7D44H.js","sourcesContent":["import yaml from 'js-yaml';\nimport type { LayoutBoxConfig, SlideLayoutData } from '../../types.js';\n\n/**\n * Serialize a SlideLayoutData object into a Markdown HTML comment\n */\nexport function serializeLayoutToComment(layout: SlideLayoutData): string {\n if (!layout.boxes || layout.boxes.length === 0) return '';\n\n const cleanData = {\n boxes: layout.boxes.map(box => {\n const b: Record<string, unknown> = {\n id: box.id,\n target: box.target || `h1`,\n pos: [\n Math.round(box.pos[0]),\n Math.round(box.pos[1]),\n Math.round(box.pos[2]),\n Math.round(box.pos[3]),\n ],\n };\n if (box.fontSize) b.fontSize = box.fontSize;\n if (box.color) b.color = box.color;\n if (box.textAlign) b.textAlign = box.textAlign;\n if (box.style) b.style = box.style;\n return b;\n }),\n };\n\n const yamlStr = yaml.dump(cleanData, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n }).trim();\n\n return `<!-- layout:\\n ${yamlStr.split('\\n').join('\\n ')}\\n-->`;\n}\n\n/**\n * Split a Markdown presentation into individual slide strings,\n * properly handling frontmatter and code blocks.\n */\nexport function splitMarkdownSlides(markdown: string): {\n frontmatter: string | null;\n slides: string[];\n} {\n const lines = markdown.split('\\n');\n let frontmatter: string | null = null;\n const slideBuffers: string[][] = [];\n let currentBuffer: string[] = [];\n\n let inCodeFence = false;\n let inFrontmatter = false;\n let lineIdx = 0;\n\n // Check for leading frontmatter\n if (lines.length > 0 && lines[0].trim() === '---') {\n inFrontmatter = true;\n const fmBuffer: string[] = [lines[0]];\n lineIdx = 1;\n\n while (lineIdx < lines.length) {\n const line = lines[lineIdx];\n fmBuffer.push(line);\n if (line.trim() === '---') {\n frontmatter = fmBuffer.join('\\n');\n lineIdx++;\n break;\n }\n lineIdx++;\n }\n }\n\n // Iterate remaining lines to collect slides\n for (let i = lineIdx; i < lines.length; i++) {\n const line = lines[i];\n\n if (/^```/.test(line.trim())) {\n inCodeFence = !inCodeFence;\n currentBuffer.push(line);\n continue;\n }\n\n if (!inCodeFence && line.trim() === '---') {\n slideBuffers.push(currentBuffer);\n currentBuffer = [];\n continue;\n }\n\n currentBuffer.push(line);\n }\n\n slideBuffers.push(currentBuffer);\n\n const slides = slideBuffers.map(b => b.join('\\n'));\n return { frontmatter, slides };\n}\n\n/**\n * Update or insert a layout comment inside a specific slide's markdown\n */\nexport function updateSlideLayoutInMarkdown(\n markdown: string,\n slideIndex: number,\n layout: SlideLayoutData | null\n): string {\n const { frontmatter, slides } = splitMarkdownSlides(markdown);\n\n if (slideIndex < 0 || slideIndex >= slides.length) {\n return markdown;\n }\n\n let slideContent = slides[slideIndex];\n\n // Regex to detect existing layout comment\n const layoutCommentRegex = /<!--\\s*layout:\\s*[\\s\\S]*?-->/i;\n\n const newComment = layout && layout.boxes && layout.boxes.length > 0\n ? serializeLayoutToComment(layout)\n : '';\n\n if (layoutCommentRegex.test(slideContent)) {\n if (newComment) {\n slideContent = slideContent.replace(layoutCommentRegex, newComment);\n } else {\n slideContent = slideContent.replace(layoutCommentRegex, '').trim();\n }\n } else if (newComment) {\n // Prepend layout comment to the slide\n const trimmed = slideContent.trimStart();\n slideContent = `${newComment}\\n\\n${trimmed}`;\n }\n\n slides[slideIndex] = slideContent;\n\n // Reassemble deck\n const joinedSlides = slides.join('\\n---\\n');\n if (frontmatter) {\n return `${frontmatter}\\n\\n${joinedSlides}`;\n }\n return joinedSlides;\n}\n\n/**\n * Update text content inside a specific slide's markdown.\n * Replaces oldText with newText within the given slideIndex.\n */\nexport function updateSlideTextInMarkdown(\n markdown: string,\n slideIndex: number,\n oldText: string,\n newText: string\n): string {\n const { frontmatter, slides } = splitMarkdownSlides(markdown);\n\n if (slideIndex < 0 || slideIndex >= slides.length) {\n return markdown;\n }\n\n const cleanOld = oldText.trim();\n const cleanNew = newText.trim();\n if (!cleanOld || cleanOld === cleanNew) return markdown;\n\n let slideContent = slides[slideIndex];\n\n // Try exact match first\n if (slideContent.includes(cleanOld)) {\n slideContent = slideContent.replace(cleanOld, cleanNew);\n } else {\n // Check line-by-line stripping markdown decorators (#, -, *, >, `)\n const lines = slideContent.split('\\n');\n let replaced = false;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const stripped = line.replace(/^[#\\s\\-\\*\\>]+/, '').replace(/[*_`]/g, '').trim();\n if (stripped === cleanOld) {\n const prefixMatch = line.match(/^([#\\s\\-\\*\\>]+)/);\n const prefix = prefixMatch ? prefixMatch[1] : '';\n lines[i] = `${prefix}${cleanNew}`;\n replaced = true;\n break;\n }\n }\n\n if (replaced) {\n slideContent = lines.join('\\n');\n } else {\n // Escape regex characters and try matching regex\n const escaped = cleanOld.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(escaped, 'i');\n if (regex.test(slideContent)) {\n slideContent = slideContent.replace(regex, cleanNew);\n } else {\n // Fuzzy word match\n const words = cleanOld.split(/\\s+/).filter(w => w.length > 2);\n if (words.length > 0) {\n const pattern = words.map(w => w.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('[\\\\s\\\\S]*?');\n const fuzzyRegex = new RegExp(pattern, 'i');\n if (fuzzyRegex.test(slideContent)) {\n slideContent = slideContent.replace(fuzzyRegex, cleanNew);\n }\n }\n }\n }\n }\n\n slides[slideIndex] = slideContent;\n\n const joinedSlides = slides.join('\\n---\\n');\n if (frontmatter) {\n return `${frontmatter}\\n\\n${joinedSlides}`;\n }\n return joinedSlides;\n}\n\n/**\n * Remove an element (line) and its layout box from a specific slide's markdown.\n */\nexport function removeSlideElementFromMarkdown(\n markdown: string,\n slideIndex: number,\n options: {\n content?: string;\n boxId?: string;\n target?: string;\n }\n): string {\n const { frontmatter, slides } = splitMarkdownSlides(markdown);\n\n if (slideIndex < 0 || slideIndex >= slides.length) {\n return markdown;\n }\n\n let slideContent = slides[slideIndex];\n const cleanContent = options.content?.trim();\n\n // 1. Remove text line from slide content if content provided\n if (cleanContent) {\n const lines = slideContent.split('\\n');\n let removed = false;\n\n // Filter out the line matching the content\n const updatedLines = lines.filter(line => {\n if (removed) return true;\n const stripped = line.replace(/^[#\\s\\-\\*\\>]+/, '').replace(/[*_`]/g, '').trim();\n if (stripped === cleanContent || line.includes(cleanContent)) {\n removed = true;\n return false;\n }\n return true;\n });\n\n if (removed) {\n slideContent = updatedLines.join('\\n');\n }\n }\n\n // 2. Remove box from layout YAML if layout exists\n const layoutCommentRegex = /<!--\\s*layout:\\s*([\\s\\S]*?)-->/i;\n const match = slideContent.match(layoutCommentRegex);\n if (match && match[1]) {\n try {\n const parsed = yaml.load(match[1]) as { boxes?: LayoutBoxConfig[] } | null;\n if (parsed && Array.isArray(parsed.boxes)) {\n const remainingBoxes = parsed.boxes.filter(b => {\n if (options.boxId && b.id === options.boxId) return false;\n if (options.target && b.target === options.target) return false;\n return true;\n });\n\n if (remainingBoxes.length > 0) {\n const yamlStr = yaml.dump({ boxes: remainingBoxes }, { indent: 2, lineWidth: -1, noRefs: true }).trim();\n slideContent = slideContent.replace(layoutCommentRegex, `<!-- layout:\\n ${yamlStr.split('\\n').join('\\n ')}\\n-->`);\n } else {\n slideContent = slideContent.replace(layoutCommentRegex, '').trim();\n }\n }\n } catch {\n // Ignore YAML parse error\n }\n }\n\n slides[slideIndex] = slideContent;\n const joinedSlides = slides.join('\\n---\\n');\n if (frontmatter) {\n return `${frontmatter}\\n\\n${joinedSlides}`;\n }\n return joinedSlides;\n}\n\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @learnwell/presentation-kit — Slide Layout Presets\n// Catalog of battle-tested single-slide layout templates with 1280x720 canvas coordinates\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideLayoutData } from '../../types.js';\n\nexport type SlideLayoutCategory =\n | 'cover'\n | 'content'\n | 'split'\n | 'code'\n | 'metrics'\n | 'diagram'\n | 'quote'\n | 'assessment';\n\nexport interface SlideLayoutPreset {\n id: string;\n name: string;\n category: SlideLayoutCategory;\n description: string;\n layout: SlideLayoutData;\n markdownSnippet: string;\n}\n\nexport const SLIDE_LAYOUT_PRESETS: SlideLayoutPreset[] = [\n {\n id: 'title-hero',\n name: 'Title & Speaker Cover',\n category: 'cover',\n description: 'High-impact opening slide with large title, subtitle, and speaker credentials.',\n layout: {\n boxes: [\n {\n id: 'title',\n target: 'h1',\n pos: [100, 180, 1080, 140],\n fontSize: '3rem',\n textAlign: 'center',\n },\n {\n id: 'subtitle',\n target: 'h3',\n pos: [100, 350, 1080, 70],\n fontSize: '1.5rem',\n textAlign: 'center',\n },\n {\n id: 'speaker-meta',\n target: 'p',\n pos: [100, 460, 1080, 80],\n fontSize: '1.1rem',\n textAlign: 'center',\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: title\n target: h1\n pos: [100, 180, 1080, 140]\n fontSize: 3rem\n textAlign: center\n - id: subtitle\n target: h3\n pos: [100, 350, 1080, 70]\n fontSize: 1.5rem\n textAlign: center\n - id: speaker-meta\n target: p\n pos: [100, 460, 1080, 80]\n fontSize: 1.1rem\n textAlign: center\n-->\n\n# 🚀 Engineering Scalable Cloud Systems\n### Principles, Bottlenecks, and Real-World Architecture Patterns\n\n**Presenter:** Senior Systems Architect | **Duration:** 45 mins | **Level:** Intermediate\n\n<!--\nPresenter Notes:\n- Welcome the audience and outline today's primary engineering goals.\n- Spark curiosity with an opening hook about scaling under high concurrency.\n-->`,\n },\n\n {\n id: 'two-column-split',\n name: 'Two-Column Comparison',\n category: 'split',\n description: 'Balanced side-by-side comparison for legacy vs modern patterns or pros vs cons.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 50, 1120, 70],\n fontSize: '2rem',\n },\n {\n id: 'col-left',\n target: '.columns-2 > div:first-child',\n pos: [80, 150, 530, 510],\n },\n {\n id: 'col-right',\n target: '.columns-2 > div:last-child',\n pos: [670, 150, 530, 510],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 50, 1120, 70]\n fontSize: 2rem\n - id: col-left\n target: '.columns-2 > div:first-child'\n pos: [80, 150, 530, 510]\n - id: col-right\n target: '.columns-2 > div:last-child'\n pos: [670, 150, 530, 510]\n-->\n\n## ⚖️ Monolithic Polling vs Event-Driven Architecture\n\n<div class=\"columns-2\">\n<div>\n\n### 🔴 Legacy Polling\n- Heavy database CPU overhead on idle cycles\n- High network latency between updates\n- Prone to cascading timeouts during spikes\n\n</div>\n<div>\n\n### 🟢 Event-Driven Streams\n- Real-time event propagation via webhooks\n- Zero idle compute waste with serverless consumers\n- Automatic backpressure and queue isolation\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Emphasize the core failure mode of periodic polling under sudden load spikes.\n- Ask the room if anyone has experienced database lockups caused by polling loops.\n-->`,\n },\n\n {\n id: 'code-explainer',\n name: 'Code Walkthrough & Analysis',\n category: 'code',\n description: 'Syntax-highlighted code block on the left with step-by-step key annotations on the right.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 45, 1120, 65],\n fontSize: '1.9rem',\n },\n {\n id: 'code-box',\n target: '.columns-2 > div:first-child',\n pos: [80, 135, 630, 535],\n },\n {\n id: 'notes-box',\n target: '.columns-2 > div:last-child',\n pos: [740, 135, 460, 535],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 45, 1120, 65]\n fontSize: 1.9rem\n - id: code-box\n target: '.columns-2 > div:first-child'\n pos: [80, 135, 630, 535]\n - id: notes-box\n target: '.columns-2 > div:last-child'\n pos: [740, 135, 460, 535]\n-->\n\n## 💻 Robust Async Transaction Pipeline\n\n<div class=\"columns-2\">\n<div>\n\n\\`\\`\\`ts\n// Process payment with idempotency guarantee\nexport async function processPayment(order: Order) {\n const isValid = await validateOrder(order);\n if (!isValid) throw new Error(\"ValidationFailed\");\n\n const receipt = await chargeCard(order);\n return sendConfirmation(receipt);\n}\n\\`\\`\\`\n\n</div>\n<div>\n\n### 🔍 Key Engineering Invariants:\n1. **Early Guard Clause:** Validates payload immediately at line 3 before triggering external calls.\n2. **Deterministic Sequence:** Enforces strict order of operations using native \\`await\\`.\n3. **Audit Trail:** Returns immutable payment receipt upon successful execution.\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Walk through lines 1 to 7 sequentially.\n- Cold-call check: \"What happens if line 6 throws a network timeout?\"\n- Cognitive scaffolding: Highlight the importance of idempotency keys in payment APIs.\n-->`,\n },\n\n {\n id: 'metrics-3-card',\n name: '3-Metric Key Results Grid',\n category: 'metrics',\n description: 'Three high-visibility KPI stat cards for benchmarks, impact, and success criteria.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 50, 1120, 70],\n fontSize: '2rem',\n textAlign: 'center',\n },\n {\n id: 'metric-1',\n target: '.columns-3 > div:nth-child(1)',\n pos: [80, 165, 340, 485],\n },\n {\n id: 'metric-2',\n target: '.columns-3 > div:nth-child(2)',\n pos: [470, 165, 340, 485],\n },\n {\n id: 'metric-3',\n target: '.columns-3 > div:nth-child(3)',\n pos: [860, 165, 340, 485],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 50, 1120, 70]\n fontSize: 2rem\n textAlign: center\n - id: metric-1\n target: '.columns-3 > div:nth-child(1)'\n pos: [80, 165, 340, 485]\n - id: metric-2\n target: '.columns-3 > div:nth-child(2)'\n pos: [470, 165, 340, 485]\n - id: metric-3\n target: '.columns-3 > div:nth-child(3)'\n pos: [860, 165, 340, 485]\n-->\n\n## 📊 Performance & Reliability Benchmarks\n\n<div class=\"columns-3\">\n<div>\n\n# ⚡ 99.99%\n### SLA Availability\nHigh-availability multi-region cluster with automated failover routing.\n\n</div>\n<div>\n\n# 🚀 15ms\n### P99 Latency\nSub-20ms roundtrip response time via distributed edge caching.\n\n</div>\n<div>\n\n# 🛡️ Zero\n### Unhandled Breaches\nFull SOC2 Type II compliance and end-to-end payload encryption.\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Highlight the 15ms P99 latency target as the primary technical milestone.\n- Connect these metrics directly to the architecture decisions discussed next.\n-->`,\n },\n\n {\n id: 'process-flow',\n name: 'Architecture & Process Flow',\n category: 'diagram',\n description: 'Multi-stage workflow with responsive Mermaid diagram and phase summaries.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 45, 1120, 65],\n fontSize: '1.9rem',\n },\n {\n id: 'diagram-box',\n target: 'pre.mermaid, .mermaid',\n pos: [80, 130, 1120, 310],\n },\n {\n id: 'summary-box',\n target: 'ul, p',\n pos: [80, 465, 1120, 205],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 45, 1120, 65]\n fontSize: 1.9rem\n - id: diagram-box\n target: 'pre.mermaid, .mermaid'\n pos: [80, 130, 1120, 310]\n - id: summary-box\n target: 'ul, p'\n pos: [80, 465, 1120, 205]\n-->\n\n## 🔄 End-to-End Data Ingestion Pipeline\n\n\\`\\`\\`mermaid\ngraph LR\n A[1. Client Ingress] --> B[2. API Gateway]\n B --> C[3. Auth Verifier]\n C --> D[4. Distributed DB]\n style A fill:#0284c7,stroke:#38bdf8,stroke-width:2px,color:#fff\n style B fill:#1e293b,stroke:#64748b,stroke-width:2px,color:#fff\n style C fill:#059669,stroke:#34d399,stroke-width:2px,color:#fff\n style D fill:#7c3aed,stroke:#a78bfa,stroke-width:2px,color:#fff\n\\`\\`\\`\n\n- **Ingress & Gateway:** Rate-limits traffic and applies reverse-proxy load balancing.\n- **Verification & Storage:** Decodes cryptographic JWT tokens before transactional write commit.\n\n<!--\nPresenter Notes:\n- Trace each hop across the diagram from left to right.\n- Ask: \"Where should rate limiting be applied to prevent DDoS attacks?\"\n-->`,\n },\n\n {\n id: 'quote-highlight',\n name: 'Core Principle & Quote Highlight',\n category: 'quote',\n description: 'Prominent quote callout for fundamental engineering rules or memorable mantras.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [100, 100, 1080, 80],\n fontSize: '2.2rem',\n textAlign: 'center',\n },\n {\n id: 'quote-box',\n target: 'blockquote',\n pos: [140, 230, 1000, 360],\n fontSize: '1.4rem',\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [100, 100, 1080, 80]\n fontSize: 2.2rem\n textAlign: center\n - id: quote-box\n target: blockquote\n pos: [140, 230, 1000, 360]\n fontSize: 1.4rem\n-->\n\n## 💡 Foundational Architecture Principle\n\n> \"Simplicity is prerequisite for reliability. A well-engineered distributed system is one where a new engineer can understand the request flow within their first hour.\"\n> \n> — **Edsger W. Dijkstra**\n\n<!--\nPresenter Notes:\n- Pause for 5 seconds of silence to let the quote sink in.\n- Ask: \"How do our current architectural choices reflect this principle?\"\n-->`,\n },\n\n {\n id: 'quiz-checkpoint',\n name: 'Interactive Formative Checkpoint',\n category: 'assessment',\n description: 'Interactive multiple-choice diagnostic checkpoint with A/B/C/D voting options.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 45, 1120, 65],\n fontSize: '1.9rem',\n },\n {\n id: 'question-callout',\n target: 'blockquote',\n pos: [80, 130, 1120, 110],\n fontSize: '1.2rem',\n },\n {\n id: 'options-list',\n target: 'ul',\n pos: [80, 260, 1120, 390],\n fontSize: '1.15rem',\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 45, 1120, 65]\n fontSize: 1.9rem\n - id: question-callout\n target: blockquote\n pos: [80, 130, 1120, 110]\n fontSize: 1.2rem\n - id: options-list\n target: ul\n pos: [80, 260, 1120, 390]\n fontSize: 1.15rem\n-->\n\n## 🎯 Formative Checkpoint: Verify Your Understanding\n\n> **Question:** In an event-driven architecture, which pattern guarantees that messages are never permanently lost if a downstream consumer crashes?\n\n- **A.** Direct HTTP POST call with a short 2-second timeout\n- **B.** Persistent Message Broker with Dead-Letter Queue (DLQ) & retry policy\n- **C.** In-memory client RAM cache without disk persistence\n- **D.** Discarding failed packets and prompting the user to re-submit\n\n<!--\nPresenter Notes:\n- Give students 30 seconds to vote on option A, B, C, or D.\n- Correct answer: B.\n- Explain why options A and C introduce catastrophic data loss in production.\n-->`,\n },\n\n {\n id: 'tiered-practice-3cards',\n name: 'Tiered Differentiation (Bronze / Silver / Gold)',\n category: 'content',\n description: 'Three progressive competency tiers allowing self-paced learning acceleration.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 45, 1120, 65],\n fontSize: '1.9rem',\n },\n {\n id: 'tier-bronze',\n target: '.columns-3 > div:nth-child(1)',\n pos: [80, 140, 350, 520],\n },\n {\n id: 'tier-silver',\n target: '.columns-3 > div:nth-child(2)',\n pos: [465, 140, 350, 520],\n },\n {\n id: 'tier-gold',\n target: '.columns-3 > div:nth-child(3)',\n pos: [850, 140, 350, 520],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 45, 1120, 65]\n fontSize: 1.9rem\n - id: tier-bronze\n target: '.columns-3 > div:nth-child(1)'\n pos: [80, 140, 350, 520]\n - id: tier-silver\n target: '.columns-3 > div:nth-child(2)'\n pos: [465, 140, 350, 520]\n - id: tier-gold\n target: '.columns-3 > div:nth-child(3)'\n pos: [850, 140, 350, 520]\n-->\n\n## 🛠️ Hands-On Challenge: 3-Tier Differentiation\n\n<div class=\"columns-3\">\n<div>\n\n### 🥉 Bronze Tier\n- Implement basic handler logic\n- Pass 3 baseline unit tests\n- *Goal: Foundational mastery*\n\n</div>\n<div>\n\n### 🥈 Silver Tier\n- Add boundary error handling\n- Enforce O(N) memory complexity\n- *Goal: Production-ready code*\n\n</div>\n<div>\n\n### 🥇 Gold Tier\n- Design distributed retry queue\n- Add 95% automated test coverage\n- *Goal: Architectural leadership*\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- All learners begin at Bronze to establish baseline competency.\n- Accelerate self-directed learners to Silver and Gold as they complete each tier.\n-->`,\n },\n\n {\n id: 'agenda-timeline',\n name: 'Session Agenda & Milestones',\n category: 'content',\n description: 'Structured time-budgeted agenda mapping stages to measurable deliverables.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 45, 1120, 65],\n fontSize: '1.9rem',\n },\n {\n id: 'table-box',\n target: 'table',\n pos: [80, 140, 1120, 520],\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 45, 1120, 65]\n fontSize: 1.9rem\n - id: table-box\n target: table\n pos: [80, 140, 1120, 520]\n-->\n\n## 🗺️ Milestone Roadmap & Time Budget\n\n| Allocated Time | Session Stage | Core Learning Focus | Deliverable Milestone |\n|:---:|---|---|---|\n| **05 mins** | Warm-Up | Real-World Scenario & Context | Identify system bottleneck |\n| **15 mins** | Concept Discovery | Core Architectural Patterns | Deconstruct message queue models |\n| **20 mins** | Hands-On Lab | Tiered Code Implementation | Complete Bronze + Silver tasks |\n| **05 mins** | Wrap-Up | Formative Checkpoint & Debrief | Consolidate key principles |\n\n<!--\nPresenter Notes:\n- Walk through the time budget so students understand expectations and pacing.\n-->`,\n },\n\n {\n id: 'takeaways-summary',\n name: 'Key Takeaways & Wrap-up',\n category: 'content',\n description: 'Three memorable synthesis takeaways with actionable next steps.',\n layout: {\n boxes: [\n {\n id: 'heading',\n target: 'h2',\n pos: [80, 50, 1120, 70],\n fontSize: '2rem',\n },\n {\n id: 'list-box',\n target: 'ol',\n pos: [80, 150, 1120, 340],\n fontSize: '1.25rem',\n },\n {\n id: 'callout-next',\n target: 'blockquote',\n pos: [80, 520, 1120, 140],\n fontSize: '1.1rem',\n },\n ],\n },\n markdownSnippet: `<!-- layout:\n boxes:\n - id: heading\n target: h2\n pos: [80, 50, 1120, 70]\n fontSize: 2rem\n - id: list-box\n target: ol\n pos: [80, 150, 1120, 340]\n fontSize: 1.25rem\n - id: callout-next\n target: blockquote\n pos: [80, 520, 1120, 140]\n fontSize: 1.1rem\n-->\n\n## 🏁 Key Takeaways & Action Items\n\n1. **Decouple Before Scaling:** Separate producer rate from consumer processing capacity.\n2. **Design for Failure:** Always configure retries, backoff intervals, and dead-letter queues.\n3. **Measure End-to-End:** Track P99 latency and error rates across all distributed boundaries.\n\n> 📝 **Next Action Item:** Complete the Silver Tier refactoring challenge before our next peer-review session.\n\n<!--\nPresenter Notes:\n- Deliver a crisp 2-minute wrap-up reinforcing the 3 core takeaways.\n- Acknowledge strong peer collaboration during the hands-on lab.\n-->`,\n },\n];\n\n/**\n * Find a preset by its unique ID\n */\nexport function getSlideLayoutPresetById(id: string): SlideLayoutPreset | undefined {\n return SLIDE_LAYOUT_PRESETS.find(p => p.id === id);\n}\n\n/**\n * Filter presets by category\n */\nexport function getSlideLayoutPresetsByCategory(category: SlideLayoutCategory): SlideLayoutPreset[] {\n return SLIDE_LAYOUT_PRESETS.filter(p => p.category === category);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { a as SlideRenderOptions, b as SlideRenderResult, c as SlideRenderAsyncResult, T as ThemeTokens, d as SlideTheme, B as BuiltInTheme } from './types-C3d04zzP.cjs';
1
+ import { a as SlideRenderOptions, b as SlideRenderResult, c as SlideRenderAsyncResult, T as ThemeTokens, d as SlideTheme, B as BuiltInTheme } from './types-CvxCxWus.cjs';
2
2
 
3
3
  interface RenderMarpResult {
4
4
  html: string;
@@ -1,4 +1,4 @@
1
- import { a as SlideRenderOptions, b as SlideRenderResult, c as SlideRenderAsyncResult, T as ThemeTokens, d as SlideTheme, B as BuiltInTheme } from './types-C3d04zzP.js';
1
+ import { a as SlideRenderOptions, b as SlideRenderResult, c as SlideRenderAsyncResult, T as ThemeTokens, d as SlideTheme, B as BuiltInTheme } from './types-CvxCxWus.js';
2
2
 
3
3
  interface RenderMarpResult {
4
4
  html: string;
package/dist/index.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkDIHFQ5LF_cjs = require('./chunk-DIHFQ5LF.cjs');
4
- var chunkSFBEDDGU_cjs = require('./chunk-SFBEDDGU.cjs');
3
+ var chunkCVEC72CT_cjs = require('./chunk-CVEC72CT.cjs');
4
+ var chunk3Q4RMZVQ_cjs = require('./chunk-3Q4RMZVQ.cjs');
5
+ var chunk5WEZOGQA_cjs = require('./chunk-5WEZOGQA.cjs');
5
6
  var chunkHSVXH7DD_cjs = require('./chunk-HSVXH7DD.cjs');
6
7
 
7
8
  // src/engine.ts
@@ -19,14 +20,14 @@ function createEngine(config = {}) {
19
20
  }
20
21
  return {
21
22
  render: (markdown, options) => {
22
- return chunkDIHFQ5LF_cjs.renderSlide(markdown, mergeOptions(options));
23
+ return chunkCVEC72CT_cjs.renderSlide(markdown, mergeOptions(options));
23
24
  },
24
25
  renderAsync: async (markdown, options) => {
25
- return chunkDIHFQ5LF_cjs.renderSlideAsync(markdown, mergeOptions(options));
26
+ return chunkCVEC72CT_cjs.renderSlideAsync(markdown, mergeOptions(options));
26
27
  },
27
28
  getThemeCss: (theme, containerId) => {
28
- const resolved = chunkDIHFQ5LF_cjs.resolveTheme(theme);
29
- return chunkDIHFQ5LF_cjs.generateScopedCss2(resolved, containerId);
29
+ const resolved = chunkCVEC72CT_cjs.resolveTheme(theme);
30
+ return chunkCVEC72CT_cjs.generateScopedCss2(resolved, containerId);
30
31
  }
31
32
  };
32
33
  }
@@ -102,8 +103,8 @@ async function convertMarkdownToPptx(markdown, options) {
102
103
  pptx.layout = "LAYOUT_WIDE";
103
104
  if (options?.title) pptx.title = options.title;
104
105
  if (options?.author) pptx.author = options.author;
105
- const renderResult = chunkDIHFQ5LF_cjs.renderSlide(markdown);
106
- const { slides } = chunkSFBEDDGU_cjs.splitMarkdownSlides(markdown);
106
+ const renderResult = chunkCVEC72CT_cjs.renderSlide(markdown);
107
+ const { slides } = chunk3Q4RMZVQ_cjs.splitMarkdownSlides(markdown);
107
108
  const isDark = options?.theme !== "light";
108
109
  const defaultBg = isDark ? "14151B" : "FFFFFF";
109
110
  const defaultText = isDark ? "F1F5F9" : "1E293B";
@@ -202,179 +203,199 @@ async function convertMarkdownToPptx(markdown, options) {
202
203
 
203
204
  Object.defineProperty(exports, "convertTextArrows", {
204
205
  enumerable: true,
205
- get: function () { return chunkDIHFQ5LF_cjs.convertTextArrows; }
206
+ get: function () { return chunkCVEC72CT_cjs.convertTextArrows; }
206
207
  });
207
208
  Object.defineProperty(exports, "countSlides", {
208
209
  enumerable: true,
209
- get: function () { return chunkDIHFQ5LF_cjs.countSlides; }
210
+ get: function () { return chunkCVEC72CT_cjs.countSlides; }
210
211
  });
211
212
  Object.defineProperty(exports, "darkThemeTokens", {
212
213
  enumerable: true,
213
- get: function () { return chunkDIHFQ5LF_cjs.darkThemeTokens; }
214
+ get: function () { return chunkCVEC72CT_cjs.darkThemeTokens; }
214
215
  });
215
216
  Object.defineProperty(exports, "defineTheme", {
216
217
  enumerable: true,
217
- get: function () { return chunkDIHFQ5LF_cjs.defineTheme; }
218
+ get: function () { return chunkCVEC72CT_cjs.defineTheme; }
218
219
  });
219
220
  Object.defineProperty(exports, "detectMermaidBlocks", {
220
221
  enumerable: true,
221
- get: function () { return chunkDIHFQ5LF_cjs.detectMermaidBlocks; }
222
+ get: function () { return chunkCVEC72CT_cjs.detectMermaidBlocks; }
222
223
  });
223
224
  Object.defineProperty(exports, "extractLayoutsAndNotes", {
224
225
  enumerable: true,
225
- get: function () { return chunkDIHFQ5LF_cjs.extractLayoutsAndNotes; }
226
+ get: function () { return chunkCVEC72CT_cjs.extractLayoutsAndNotes; }
226
227
  });
227
228
  Object.defineProperty(exports, "extractMarpSource", {
228
229
  enumerable: true,
229
- get: function () { return chunkDIHFQ5LF_cjs.extractMarpSource; }
230
+ get: function () { return chunkCVEC72CT_cjs.extractMarpSource; }
230
231
  });
231
232
  Object.defineProperty(exports, "extractMaxClicks", {
232
233
  enumerable: true,
233
- get: function () { return chunkDIHFQ5LF_cjs.extractMaxClicks; }
234
+ get: function () { return chunkCVEC72CT_cjs.extractMaxClicks; }
234
235
  });
235
236
  Object.defineProperty(exports, "filterPresenterNotes", {
236
237
  enumerable: true,
237
- get: function () { return chunkDIHFQ5LF_cjs.filterPresenterNotes; }
238
+ get: function () { return chunkCVEC72CT_cjs.filterPresenterNotes; }
238
239
  });
239
240
  Object.defineProperty(exports, "generateClickCss", {
240
241
  enumerable: true,
241
- get: function () { return chunkDIHFQ5LF_cjs.generateClickCss; }
242
+ get: function () { return chunkCVEC72CT_cjs.generateClickCss; }
242
243
  });
243
244
  Object.defineProperty(exports, "generateLayoutCss", {
244
245
  enumerable: true,
245
- get: function () { return chunkDIHFQ5LF_cjs.generateLayoutCss; }
246
+ get: function () { return chunkCVEC72CT_cjs.generateLayoutCss; }
246
247
  });
247
248
  Object.defineProperty(exports, "generateScopedCss", {
248
249
  enumerable: true,
249
- get: function () { return chunkDIHFQ5LF_cjs.generateScopedCss2; }
250
+ get: function () { return chunkCVEC72CT_cjs.generateScopedCss2; }
250
251
  });
251
252
  Object.defineProperty(exports, "generateScopedCssFromTokens", {
252
253
  enumerable: true,
253
- get: function () { return chunkDIHFQ5LF_cjs.generateScopedCss; }
254
+ get: function () { return chunkCVEC72CT_cjs.generateScopedCss; }
254
255
  });
255
256
  Object.defineProperty(exports, "getThemeTokens", {
256
257
  enumerable: true,
257
- get: function () { return chunkDIHFQ5LF_cjs.getThemeTokens; }
258
+ get: function () { return chunkCVEC72CT_cjs.getThemeTokens; }
258
259
  });
259
260
  Object.defineProperty(exports, "isLayoutComment", {
260
261
  enumerable: true,
261
- get: function () { return chunkDIHFQ5LF_cjs.isLayoutComment; }
262
+ get: function () { return chunkCVEC72CT_cjs.isLayoutComment; }
262
263
  });
263
264
  Object.defineProperty(exports, "lightThemeTokens", {
264
265
  enumerable: true,
265
- get: function () { return chunkDIHFQ5LF_cjs.lightThemeTokens; }
266
+ get: function () { return chunkCVEC72CT_cjs.lightThemeTokens; }
266
267
  });
267
268
  Object.defineProperty(exports, "navyThemeTokens", {
268
269
  enumerable: true,
269
- get: function () { return chunkDIHFQ5LF_cjs.navyThemeTokens; }
270
+ get: function () { return chunkCVEC72CT_cjs.navyThemeTokens; }
270
271
  });
271
272
  Object.defineProperty(exports, "parseLayoutFromComment", {
272
273
  enumerable: true,
273
- get: function () { return chunkDIHFQ5LF_cjs.parseLayoutFromComment; }
274
+ get: function () { return chunkCVEC72CT_cjs.parseLayoutFromComment; }
274
275
  });
275
276
  Object.defineProperty(exports, "postprocessClicks", {
276
277
  enumerable: true,
277
- get: function () { return chunkDIHFQ5LF_cjs.postprocessClicks; }
278
+ get: function () { return chunkCVEC72CT_cjs.postprocessClicks; }
278
279
  });
279
280
  Object.defineProperty(exports, "preprocessClicks", {
280
281
  enumerable: true,
281
- get: function () { return chunkDIHFQ5LF_cjs.preprocessClicks; }
282
+ get: function () { return chunkCVEC72CT_cjs.preprocessClicks; }
282
283
  });
283
284
  Object.defineProperty(exports, "renderMarp", {
284
285
  enumerable: true,
285
- get: function () { return chunkDIHFQ5LF_cjs.renderMarp; }
286
+ get: function () { return chunkCVEC72CT_cjs.renderMarp; }
286
287
  });
287
288
  Object.defineProperty(exports, "renderMermaidDiagrams", {
288
289
  enumerable: true,
289
- get: function () { return chunkDIHFQ5LF_cjs.renderMermaidDiagrams; }
290
+ get: function () { return chunkCVEC72CT_cjs.renderMermaidDiagrams; }
290
291
  });
291
292
  Object.defineProperty(exports, "renderSlide", {
292
293
  enumerable: true,
293
- get: function () { return chunkDIHFQ5LF_cjs.renderSlide; }
294
+ get: function () { return chunkCVEC72CT_cjs.renderSlide; }
294
295
  });
295
296
  Object.defineProperty(exports, "renderSlideAsync", {
296
297
  enumerable: true,
297
- get: function () { return chunkDIHFQ5LF_cjs.renderSlideAsync; }
298
+ get: function () { return chunkCVEC72CT_cjs.renderSlideAsync; }
298
299
  });
299
300
  Object.defineProperty(exports, "resolveTheme", {
300
301
  enumerable: true,
301
- get: function () { return chunkDIHFQ5LF_cjs.resolveTheme; }
302
+ get: function () { return chunkCVEC72CT_cjs.resolveTheme; }
302
303
  });
303
304
  Object.defineProperty(exports, "sanitizeMermaidCode", {
304
305
  enumerable: true,
305
- get: function () { return chunkDIHFQ5LF_cjs.sanitizeMermaidCode; }
306
+ get: function () { return chunkCVEC72CT_cjs.sanitizeMermaidCode; }
307
+ });
308
+ Object.defineProperty(exports, "SLIDE_LAYOUT_PRESETS", {
309
+ enumerable: true,
310
+ get: function () { return chunk3Q4RMZVQ_cjs.SLIDE_LAYOUT_PRESETS; }
311
+ });
312
+ Object.defineProperty(exports, "getSlideLayoutPresetById", {
313
+ enumerable: true,
314
+ get: function () { return chunk3Q4RMZVQ_cjs.getSlideLayoutPresetById; }
315
+ });
316
+ Object.defineProperty(exports, "getSlideLayoutPresetsByCategory", {
317
+ enumerable: true,
318
+ get: function () { return chunk3Q4RMZVQ_cjs.getSlideLayoutPresetsByCategory; }
319
+ });
320
+ Object.defineProperty(exports, "removeSlideElementFromMarkdown", {
321
+ enumerable: true,
322
+ get: function () { return chunk3Q4RMZVQ_cjs.removeSlideElementFromMarkdown; }
323
+ });
324
+ Object.defineProperty(exports, "serializeLayoutToComment", {
325
+ enumerable: true,
326
+ get: function () { return chunk3Q4RMZVQ_cjs.serializeLayoutToComment; }
327
+ });
328
+ Object.defineProperty(exports, "splitMarkdownSlides", {
329
+ enumerable: true,
330
+ get: function () { return chunk3Q4RMZVQ_cjs.splitMarkdownSlides; }
331
+ });
332
+ Object.defineProperty(exports, "updateSlideLayoutInMarkdown", {
333
+ enumerable: true,
334
+ get: function () { return chunk3Q4RMZVQ_cjs.updateSlideLayoutInMarkdown; }
335
+ });
336
+ Object.defineProperty(exports, "updateSlideTextInMarkdown", {
337
+ enumerable: true,
338
+ get: function () { return chunk3Q4RMZVQ_cjs.updateSlideTextInMarkdown; }
306
339
  });
307
340
  Object.defineProperty(exports, "HTML_SLIDE_PRESETS", {
308
341
  enumerable: true,
309
- get: function () { return chunkSFBEDDGU_cjs.HTML_SLIDE_PRESETS; }
342
+ get: function () { return chunk5WEZOGQA_cjs.HTML_SLIDE_PRESETS; }
310
343
  });
311
344
  Object.defineProperty(exports, "HTML_THEMES", {
312
345
  enumerable: true,
313
- get: function () { return chunkSFBEDDGU_cjs.HTML_THEMES; }
346
+ get: function () { return chunk5WEZOGQA_cjs.HTML_THEMES; }
314
347
  });
315
- Object.defineProperty(exports, "SLIDE_LAYOUT_PRESETS", {
348
+ Object.defineProperty(exports, "SLIDE_UTILITY_CSS", {
316
349
  enumerable: true,
317
- get: function () { return chunkSFBEDDGU_cjs.SLIDE_LAYOUT_PRESETS; }
350
+ get: function () { return chunk5WEZOGQA_cjs.SLIDE_UTILITY_CSS; }
351
+ });
352
+ Object.defineProperty(exports, "buildBespokeSlideMarkup", {
353
+ enumerable: true,
354
+ get: function () { return chunk5WEZOGQA_cjs.buildBespokeSlideMarkup; }
318
355
  });
319
356
  Object.defineProperty(exports, "compileHtmlDeck", {
320
357
  enumerable: true,
321
- get: function () { return chunkSFBEDDGU_cjs.compileHtmlDeck; }
358
+ get: function () { return chunk5WEZOGQA_cjs.compileHtmlDeck; }
322
359
  });
323
360
  Object.defineProperty(exports, "compileHtmlDeckAsync", {
324
361
  enumerable: true,
325
- get: function () { return chunkSFBEDDGU_cjs.compileHtmlDeckAsync; }
362
+ get: function () { return chunk5WEZOGQA_cjs.compileHtmlDeckAsync; }
326
363
  });
327
364
  Object.defineProperty(exports, "generateHtmlShell", {
328
365
  enumerable: true,
329
- get: function () { return chunkSFBEDDGU_cjs.generateHtmlShell; }
366
+ get: function () { return chunk5WEZOGQA_cjs.generateHtmlShell; }
330
367
  });
331
368
  Object.defineProperty(exports, "getHighlighter", {
332
369
  enumerable: true,
333
- get: function () { return chunkSFBEDDGU_cjs.getHighlighter; }
334
- });
335
- Object.defineProperty(exports, "getSlideLayoutPresetById", {
336
- enumerable: true,
337
- get: function () { return chunkSFBEDDGU_cjs.getSlideLayoutPresetById; }
338
- });
339
- Object.defineProperty(exports, "getSlideLayoutPresetsByCategory", {
340
- enumerable: true,
341
- get: function () { return chunkSFBEDDGU_cjs.getSlideLayoutPresetsByCategory; }
370
+ get: function () { return chunk5WEZOGQA_cjs.getHighlighter; }
342
371
  });
343
372
  Object.defineProperty(exports, "highlightCodeBlocks", {
344
373
  enumerable: true,
345
- get: function () { return chunkSFBEDDGU_cjs.highlightCodeBlocks; }
374
+ get: function () { return chunk5WEZOGQA_cjs.highlightCodeBlocks; }
346
375
  });
347
376
  Object.defineProperty(exports, "highlightDeckCodeBlocks", {
348
377
  enumerable: true,
349
- get: function () { return chunkSFBEDDGU_cjs.highlightDeckCodeBlocks; }
378
+ get: function () { return chunk5WEZOGQA_cjs.highlightDeckCodeBlocks; }
350
379
  });
351
- Object.defineProperty(exports, "normalizeSlideSlots", {
380
+ Object.defineProperty(exports, "listUtilityClasses", {
352
381
  enumerable: true,
353
- get: function () { return chunkSFBEDDGU_cjs.normalizeSlideSlots; }
382
+ get: function () { return chunk5WEZOGQA_cjs.listUtilityClasses; }
354
383
  });
355
- Object.defineProperty(exports, "removeSlideElementFromMarkdown", {
384
+ Object.defineProperty(exports, "normalizeSlideSlots", {
356
385
  enumerable: true,
357
- get: function () { return chunkSFBEDDGU_cjs.removeSlideElementFromMarkdown; }
386
+ get: function () { return chunk5WEZOGQA_cjs.normalizeSlideSlots; }
358
387
  });
359
388
  Object.defineProperty(exports, "resolveHtmlTheme", {
360
389
  enumerable: true,
361
- get: function () { return chunkSFBEDDGU_cjs.resolveHtmlTheme; }
390
+ get: function () { return chunk5WEZOGQA_cjs.resolveHtmlTheme; }
362
391
  });
363
- Object.defineProperty(exports, "serializeLayoutToComment", {
392
+ Object.defineProperty(exports, "sanitizeSlideHtml", {
364
393
  enumerable: true,
365
- get: function () { return chunkSFBEDDGU_cjs.serializeLayoutToComment; }
394
+ get: function () { return chunk5WEZOGQA_cjs.sanitizeSlideHtml; }
366
395
  });
367
- Object.defineProperty(exports, "splitMarkdownSlides", {
368
- enumerable: true,
369
- get: function () { return chunkSFBEDDGU_cjs.splitMarkdownSlides; }
370
- });
371
- Object.defineProperty(exports, "updateSlideLayoutInMarkdown", {
372
- enumerable: true,
373
- get: function () { return chunkSFBEDDGU_cjs.updateSlideLayoutInMarkdown; }
374
- });
375
- Object.defineProperty(exports, "updateSlideTextInMarkdown", {
396
+ Object.defineProperty(exports, "validateBespokeSlideHtml", {
376
397
  enumerable: true,
377
- get: function () { return chunkSFBEDDGU_cjs.updateSlideTextInMarkdown; }
398
+ get: function () { return chunk5WEZOGQA_cjs.validateBespokeSlideHtml; }
378
399
  });
379
400
  Object.defineProperty(exports, "FRONTEND_SLIDES_CORE_RULES", {
380
401
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine.ts","../src/core/export/pptx-converter.ts"],"names":["renderSlide","renderSlideAsync","resolveTheme","generateScopedCss","splitMarkdownSlides"],"mappings":"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","file":"index.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// Engine Factory — createEngine() for advanced usage\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideEngine, SlideEngineConfig, SlideRenderOptions, SlideRenderResult, SlideRenderAsyncResult, BuiltInTheme, SlideTheme } from './types.js';\nimport { renderSlide, renderSlideAsync } from './core/render.js';\nimport { resolveTheme, generateScopedCss } from './themes/index.js';\n\n/**\n * Create a slide engine instance with default configuration.\n *\n * @example\n * ```ts\n * const engine = createEngine({ theme: 'dark' });\n *\n * // Synchronous\n * const result = engine.render(markdown);\n *\n * // Async (with Shiki highlighting)\n * const fullResult = await engine.renderAsync(markdown);\n *\n * // Get theme CSS independently\n * const css = engine.getThemeCss('navy');\n * ```\n */\nexport function createEngine(config: SlideEngineConfig = {}): SlideEngine {\n const defaultTheme = config.theme ?? 'dark';\n const defaultEnableShiki = config.enableShiki ?? true;\n const defaultEnableMermaid = config.enableMermaid ?? true;\n\n function mergeOptions(options?: SlideRenderOptions): SlideRenderOptions {\n return {\n theme: options?.theme ?? defaultTheme,\n enableShiki: options?.enableShiki ?? defaultEnableShiki,\n enableMermaid: options?.enableMermaid ?? defaultEnableMermaid,\n containerId: options?.containerId,\n };\n }\n\n return {\n render: (markdown: string, options?: SlideRenderOptions): SlideRenderResult => {\n return renderSlide(markdown, mergeOptions(options));\n },\n\n renderAsync: async (markdown: string, options?: SlideRenderOptions): Promise<SlideRenderAsyncResult> => {\n return renderSlideAsync(markdown, mergeOptions(options));\n },\n\n getThemeCss: (theme: BuiltInTheme | SlideTheme, containerId?: string): string => {\n const resolved = resolveTheme(theme);\n return generateScopedCss(resolved, containerId);\n },\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// pptx-converter.ts — Pure JS converter: Marp Markdown + Layouts → Native PPTX\n//\n// Generates native, fully editable PowerPoint textboxes and shapes\n// that open directly in PowerPoint, Keynote, and Google Slides.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { renderSlide } from '../render.js';\nimport { splitMarkdownSlides } from '../layout/serializer.js';\nimport type { LayoutBoxConfig } from '../../types.js';\n\nexport interface PptxExportOptions {\n title?: string;\n author?: string;\n theme?: 'dark' | 'light' | 'navy';\n}\n\n/**\n * Convert font size string ('2.5rem', '32px', '24pt') to pt number for PPTX\n */\nexport function parseFontSizeToPt(sizeStr?: string, defaultPt: number = 18): number {\n if (!sizeStr) return defaultPt;\n const trimmed = sizeStr.trim().toLowerCase();\n\n if (trimmed.endsWith('rem')) {\n const rem = parseFloat(trimmed);\n return Math.round(rem * 16 * 0.75) || defaultPt;\n }\n if (trimmed.endsWith('px')) {\n const px = parseFloat(trimmed);\n return Math.round(px * 0.75) || defaultPt;\n }\n if (trimmed.endsWith('pt')) {\n return parseInt(trimmed, 10) || defaultPt;\n }\n const num = parseFloat(trimmed);\n return !isNaN(num) ? Math.round(num) : defaultPt;\n}\n\n/**\n * Clean hex color string (removes leading #)\n */\nexport function cleanHexColor(colorStr?: string, defaultHex: string = '1F2937'): string {\n if (!colorStr) return defaultHex;\n const hex = colorStr.trim().replace(/^#/, '');\n if (/^[0-9A-Fa-f]{6}$/.test(hex)) return hex.toUpperCase();\n if (/^[0-9A-Fa-f]{3}$/.test(hex)) {\n return hex.split('').map(c => c + c).join('').toUpperCase();\n }\n return defaultHex;\n}\n\n/**\n * Extract slide-level background color directive from slide markdown\n */\nfunction extractSlideBgColor(slideMd: string, defaultColor: string): string {\n const match = slideMd.match(/<!--\\s*_backgroundColor:\\s*([^\\s>]+)\\s*-->/i);\n if (match && match[1]) {\n return cleanHexColor(match[1], defaultColor);\n }\n return defaultColor;\n}\n\n/**\n * Parse plain markdown lines into simple text items\n */\ninterface SimpleBlock {\n type: 'heading' | 'paragraph' | 'bullet' | 'code';\n level?: number;\n text: string;\n}\n\nfunction parseSimpleMarkdown(md: string): SimpleBlock[] {\n const lines = md.split('\\n');\n const blocks: SimpleBlock[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('<!--') && trimmed.endsWith('-->')) continue;\n\n // Heading\n const hMatch = trimmed.match(/^(#{1,6})\\s+(.*)$/);\n if (hMatch && hMatch[1] && hMatch[2]) {\n blocks.push({\n type: 'heading',\n level: hMatch[1].length,\n text: hMatch[2].replace(/\\*\\*(.*?)\\*\\*/g, '$1').replace(/\\*(.*?)\\*/g, '$1'),\n });\n continue;\n }\n\n // Bullet\n if (/^[-*+]\\s+/.test(trimmed)) {\n blocks.push({\n type: 'bullet',\n text: trimmed.replace(/^[-*+]\\s+/, '').replace(/\\*\\*(.*?)\\*\\*/g, '$1'),\n });\n continue;\n }\n\n // Paragraph\n blocks.push({\n type: 'paragraph',\n text: trimmed.replace(/\\*\\*(.*?)\\*\\*/g, '$1').replace(/\\*(.*?)\\*/g, '$1'),\n });\n }\n\n return blocks;\n}\n\n/**\n * Convert Marp Markdown presentation to an editable PPTX file using pptxgenjs.\n *\n * Each box in `layout.boxes` maps directly from 1280x720 canvas px to 13.33 x 7.5 inch PPTX coordinates.\n */\nexport async function convertMarkdownToPptx(\n markdown: string,\n options?: PptxExportOptions\n): Promise<Uint8Array> {\n const PptxGenModule = await import('pptxgenjs');\n const PptxGenClass = (PptxGenModule as any).default || PptxGenModule;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pptx = new (PptxGenClass as any)();\n\n pptx.layout = 'LAYOUT_WIDE'; // 16:9 aspect ratio (13.33 x 7.5 inches)\n if (options?.title) pptx.title = options.title;\n if (options?.author) pptx.author = options.author;\n\n const renderResult = renderSlide(markdown);\n const { slides } = splitMarkdownSlides(markdown);\n\n const isDark = options?.theme !== 'light';\n const defaultBg = isDark ? '14151B' : 'FFFFFF';\n const defaultText = isDark ? 'F1F5F9' : '1E293B';\n const defaultHeading = isDark ? '38BDF8' : '0284C7';\n\n // Coordinate scales from 1280x720 to 13.33x7.5 inches\n const scaleX = 13.33 / 1280;\n const scaleY = 7.5 / 720;\n\n slides.forEach((slideMd, slideIndex) => {\n const pptxSlide = pptx.addSlide();\n\n // 1. Set background\n const bgColor = extractSlideBgColor(slideMd, defaultBg);\n pptxSlide.background = { color: bgColor };\n\n // 2. Add Speaker / Teacher Notes\n const notes = renderResult.notes?.[slideIndex];\n if (notes && notes.length > 0) {\n pptxSlide.addNotes(notes.join('\\n\\n'));\n }\n\n // 3. Layout boxes\n const layout = renderResult.layouts?.[slideIndex];\n const blocks = parseSimpleMarkdown(slideMd);\n\n if (layout && layout.boxes && layout.boxes.length > 0) {\n // Freeform layout: Render boxes with exact pos\n for (const box of layout.boxes) {\n const [x, y, w, h] = box.pos;\n const xInch = Math.max(0, x * scaleX);\n const yInch = Math.max(0, y * scaleY);\n const wInch = Math.min(13.33 - xInch, w * scaleX);\n const hInch = Math.min(7.5 - yInch, h * scaleY);\n\n // Find corresponding text\n let contentText = '';\n if (box.target === 'h1') {\n contentText = blocks.find(b => b.type === 'heading' && b.level === 1)?.text || 'Heading';\n } else if (box.target === 'h2') {\n contentText = blocks.find(b => b.type === 'heading' && b.level === 2)?.text || 'Subheading';\n } else {\n contentText = blocks.find(b => b.type === 'paragraph' || b.type === 'bullet')?.text || 'Content block';\n }\n\n const fontSizePt = parseFontSizeToPt(box.fontSize, box.target === 'h1' ? 28 : 16);\n const colorHex = cleanHexColor(box.color, box.target === 'h1' ? defaultHeading : defaultText);\n\n pptxSlide.addText(contentText, {\n x: xInch,\n y: yInch,\n w: wInch,\n h: hInch,\n fontSize: fontSizePt,\n color: colorHex,\n align: box.textAlign ?? 'left',\n bold: box.target?.startsWith('h') ?? false,\n fontFace: 'Arial',\n });\n }\n } else {\n // Flow layout fallback: Stack headings and paragraphs nicely\n let currentY = 0.8;\n const marginX = 1.0;\n const contentWidth = 11.33;\n\n for (const block of blocks) {\n if (block.type === 'heading') {\n const fontSize = block.level === 1 ? 30 : block.level === 2 ? 22 : 18;\n const color = block.level === 1 ? defaultHeading : defaultText;\n\n pptxSlide.addText(block.text, {\n x: marginX,\n y: currentY,\n w: contentWidth,\n h: 0.8,\n fontSize,\n color,\n bold: true,\n fontFace: 'Arial',\n });\n currentY += 0.9;\n } else if (block.type === 'bullet') {\n pptxSlide.addText(block.text, {\n x: marginX + 0.3,\n y: currentY,\n w: contentWidth - 0.3,\n h: 0.45,\n fontSize: 15,\n color: defaultText,\n bullet: true,\n fontFace: 'Arial',\n });\n currentY += 0.5;\n } else {\n pptxSlide.addText(block.text, {\n x: marginX,\n y: currentY,\n w: contentWidth,\n h: 0.5,\n fontSize: 15,\n color: defaultText,\n fontFace: 'Arial',\n });\n currentY += 0.55;\n }\n\n if (currentY > 6.5) break; // Prevent vertical overflow off slide\n }\n }\n });\n\n const pptxArray = (await pptx.write({ outputType: 'arraybuffer' })) as ArrayBuffer;\n return new Uint8Array(pptxArray);\n}\n"]}
1
+ {"version":3,"sources":["../src/engine.ts","../src/core/export/pptx-converter.ts"],"names":["renderSlide","renderSlideAsync","resolveTheme","generateScopedCss","splitMarkdownSlides"],"mappings":"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","file":"index.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// Engine Factory — createEngine() for advanced usage\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideEngine, SlideEngineConfig, SlideRenderOptions, SlideRenderResult, SlideRenderAsyncResult, BuiltInTheme, SlideTheme } from './types.js';\nimport { renderSlide, renderSlideAsync } from './core/render.js';\nimport { resolveTheme, generateScopedCss } from './themes/index.js';\n\n/**\n * Create a slide engine instance with default configuration.\n *\n * @example\n * ```ts\n * const engine = createEngine({ theme: 'dark' });\n *\n * // Synchronous\n * const result = engine.render(markdown);\n *\n * // Async (with Shiki highlighting)\n * const fullResult = await engine.renderAsync(markdown);\n *\n * // Get theme CSS independently\n * const css = engine.getThemeCss('navy');\n * ```\n */\nexport function createEngine(config: SlideEngineConfig = {}): SlideEngine {\n const defaultTheme = config.theme ?? 'dark';\n const defaultEnableShiki = config.enableShiki ?? true;\n const defaultEnableMermaid = config.enableMermaid ?? true;\n\n function mergeOptions(options?: SlideRenderOptions): SlideRenderOptions {\n return {\n theme: options?.theme ?? defaultTheme,\n enableShiki: options?.enableShiki ?? defaultEnableShiki,\n enableMermaid: options?.enableMermaid ?? defaultEnableMermaid,\n containerId: options?.containerId,\n };\n }\n\n return {\n render: (markdown: string, options?: SlideRenderOptions): SlideRenderResult => {\n return renderSlide(markdown, mergeOptions(options));\n },\n\n renderAsync: async (markdown: string, options?: SlideRenderOptions): Promise<SlideRenderAsyncResult> => {\n return renderSlideAsync(markdown, mergeOptions(options));\n },\n\n getThemeCss: (theme: BuiltInTheme | SlideTheme, containerId?: string): string => {\n const resolved = resolveTheme(theme);\n return generateScopedCss(resolved, containerId);\n },\n };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// pptx-converter.ts — Pure JS converter: Marp Markdown + Layouts → Native PPTX\n//\n// Generates native, fully editable PowerPoint textboxes and shapes\n// that open directly in PowerPoint, Keynote, and Google Slides.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { renderSlide } from '../render.js';\nimport { splitMarkdownSlides } from '../layout/serializer.js';\nimport type { LayoutBoxConfig } from '../../types.js';\n\nexport interface PptxExportOptions {\n title?: string;\n author?: string;\n theme?: 'dark' | 'light' | 'navy';\n}\n\n/**\n * Convert font size string ('2.5rem', '32px', '24pt') to pt number for PPTX\n */\nexport function parseFontSizeToPt(sizeStr?: string, defaultPt: number = 18): number {\n if (!sizeStr) return defaultPt;\n const trimmed = sizeStr.trim().toLowerCase();\n\n if (trimmed.endsWith('rem')) {\n const rem = parseFloat(trimmed);\n return Math.round(rem * 16 * 0.75) || defaultPt;\n }\n if (trimmed.endsWith('px')) {\n const px = parseFloat(trimmed);\n return Math.round(px * 0.75) || defaultPt;\n }\n if (trimmed.endsWith('pt')) {\n return parseInt(trimmed, 10) || defaultPt;\n }\n const num = parseFloat(trimmed);\n return !isNaN(num) ? Math.round(num) : defaultPt;\n}\n\n/**\n * Clean hex color string (removes leading #)\n */\nexport function cleanHexColor(colorStr?: string, defaultHex: string = '1F2937'): string {\n if (!colorStr) return defaultHex;\n const hex = colorStr.trim().replace(/^#/, '');\n if (/^[0-9A-Fa-f]{6}$/.test(hex)) return hex.toUpperCase();\n if (/^[0-9A-Fa-f]{3}$/.test(hex)) {\n return hex.split('').map(c => c + c).join('').toUpperCase();\n }\n return defaultHex;\n}\n\n/**\n * Extract slide-level background color directive from slide markdown\n */\nfunction extractSlideBgColor(slideMd: string, defaultColor: string): string {\n const match = slideMd.match(/<!--\\s*_backgroundColor:\\s*([^\\s>]+)\\s*-->/i);\n if (match && match[1]) {\n return cleanHexColor(match[1], defaultColor);\n }\n return defaultColor;\n}\n\n/**\n * Parse plain markdown lines into simple text items\n */\ninterface SimpleBlock {\n type: 'heading' | 'paragraph' | 'bullet' | 'code';\n level?: number;\n text: string;\n}\n\nfunction parseSimpleMarkdown(md: string): SimpleBlock[] {\n const lines = md.split('\\n');\n const blocks: SimpleBlock[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('<!--') && trimmed.endsWith('-->')) continue;\n\n // Heading\n const hMatch = trimmed.match(/^(#{1,6})\\s+(.*)$/);\n if (hMatch && hMatch[1] && hMatch[2]) {\n blocks.push({\n type: 'heading',\n level: hMatch[1].length,\n text: hMatch[2].replace(/\\*\\*(.*?)\\*\\*/g, '$1').replace(/\\*(.*?)\\*/g, '$1'),\n });\n continue;\n }\n\n // Bullet\n if (/^[-*+]\\s+/.test(trimmed)) {\n blocks.push({\n type: 'bullet',\n text: trimmed.replace(/^[-*+]\\s+/, '').replace(/\\*\\*(.*?)\\*\\*/g, '$1'),\n });\n continue;\n }\n\n // Paragraph\n blocks.push({\n type: 'paragraph',\n text: trimmed.replace(/\\*\\*(.*?)\\*\\*/g, '$1').replace(/\\*(.*?)\\*/g, '$1'),\n });\n }\n\n return blocks;\n}\n\n/**\n * Convert Marp Markdown presentation to an editable PPTX file using pptxgenjs.\n *\n * Each box in `layout.boxes` maps directly from 1280x720 canvas px to 13.33 x 7.5 inch PPTX coordinates.\n */\nexport async function convertMarkdownToPptx(\n markdown: string,\n options?: PptxExportOptions\n): Promise<Uint8Array> {\n const PptxGenModule = await import('pptxgenjs');\n const PptxGenClass = (PptxGenModule as any).default || PptxGenModule;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pptx = new (PptxGenClass as any)();\n\n pptx.layout = 'LAYOUT_WIDE'; // 16:9 aspect ratio (13.33 x 7.5 inches)\n if (options?.title) pptx.title = options.title;\n if (options?.author) pptx.author = options.author;\n\n const renderResult = renderSlide(markdown);\n const { slides } = splitMarkdownSlides(markdown);\n\n const isDark = options?.theme !== 'light';\n const defaultBg = isDark ? '14151B' : 'FFFFFF';\n const defaultText = isDark ? 'F1F5F9' : '1E293B';\n const defaultHeading = isDark ? '38BDF8' : '0284C7';\n\n // Coordinate scales from 1280x720 to 13.33x7.5 inches\n const scaleX = 13.33 / 1280;\n const scaleY = 7.5 / 720;\n\n slides.forEach((slideMd, slideIndex) => {\n const pptxSlide = pptx.addSlide();\n\n // 1. Set background\n const bgColor = extractSlideBgColor(slideMd, defaultBg);\n pptxSlide.background = { color: bgColor };\n\n // 2. Add Speaker / Teacher Notes\n const notes = renderResult.notes?.[slideIndex];\n if (notes && notes.length > 0) {\n pptxSlide.addNotes(notes.join('\\n\\n'));\n }\n\n // 3. Layout boxes\n const layout = renderResult.layouts?.[slideIndex];\n const blocks = parseSimpleMarkdown(slideMd);\n\n if (layout && layout.boxes && layout.boxes.length > 0) {\n // Freeform layout: Render boxes with exact pos\n for (const box of layout.boxes) {\n const [x, y, w, h] = box.pos;\n const xInch = Math.max(0, x * scaleX);\n const yInch = Math.max(0, y * scaleY);\n const wInch = Math.min(13.33 - xInch, w * scaleX);\n const hInch = Math.min(7.5 - yInch, h * scaleY);\n\n // Find corresponding text\n let contentText = '';\n if (box.target === 'h1') {\n contentText = blocks.find(b => b.type === 'heading' && b.level === 1)?.text || 'Heading';\n } else if (box.target === 'h2') {\n contentText = blocks.find(b => b.type === 'heading' && b.level === 2)?.text || 'Subheading';\n } else {\n contentText = blocks.find(b => b.type === 'paragraph' || b.type === 'bullet')?.text || 'Content block';\n }\n\n const fontSizePt = parseFontSizeToPt(box.fontSize, box.target === 'h1' ? 28 : 16);\n const colorHex = cleanHexColor(box.color, box.target === 'h1' ? defaultHeading : defaultText);\n\n pptxSlide.addText(contentText, {\n x: xInch,\n y: yInch,\n w: wInch,\n h: hInch,\n fontSize: fontSizePt,\n color: colorHex,\n align: box.textAlign ?? 'left',\n bold: box.target?.startsWith('h') ?? false,\n fontFace: 'Arial',\n });\n }\n } else {\n // Flow layout fallback: Stack headings and paragraphs nicely\n let currentY = 0.8;\n const marginX = 1.0;\n const contentWidth = 11.33;\n\n for (const block of blocks) {\n if (block.type === 'heading') {\n const fontSize = block.level === 1 ? 30 : block.level === 2 ? 22 : 18;\n const color = block.level === 1 ? defaultHeading : defaultText;\n\n pptxSlide.addText(block.text, {\n x: marginX,\n y: currentY,\n w: contentWidth,\n h: 0.8,\n fontSize,\n color,\n bold: true,\n fontFace: 'Arial',\n });\n currentY += 0.9;\n } else if (block.type === 'bullet') {\n pptxSlide.addText(block.text, {\n x: marginX + 0.3,\n y: currentY,\n w: contentWidth - 0.3,\n h: 0.45,\n fontSize: 15,\n color: defaultText,\n bullet: true,\n fontFace: 'Arial',\n });\n currentY += 0.5;\n } else {\n pptxSlide.addText(block.text, {\n x: marginX,\n y: currentY,\n w: contentWidth,\n h: 0.5,\n fontSize: 15,\n color: defaultText,\n fontFace: 'Arial',\n });\n currentY += 0.55;\n }\n\n if (currentY > 6.5) break; // Prevent vertical overflow off slide\n }\n }\n });\n\n const pptxArray = (await pptx.write({ outputType: 'arraybuffer' })) as ArrayBuffer;\n return new Uint8Array(pptxArray);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,10 @@
1
- export { h as ClickCssOptions, f as ClickPostprocessResult, C as ClickPreprocessResult, j as countSlides, d as defineTheme, e as extractMaxClicks, g as generateClickCss, l as generateScopedCss, k as getThemeTokens, c as postprocessClicks, p as preprocessClicks, i as renderMarp, r as renderSlide, a as renderSlideAsync, b as resolveTheme } from './click-css-Bcc1CkTN.cjs';
2
- import { h as SlideEngineConfig, i as SlideEngine, T as ThemeTokens, M as MermaidBlock, S as SlideLayoutData, f as HtmlThemeName, j as HtmlDeckTheme, H as HtmlLayoutPresetId, k as HtmlSlidePreset, e as HtmlDeckData, l as HtmlCompileOptions, C as CompiledHtmlDeckResult } from './types-C3d04zzP.cjs';
3
- export { B as BuiltInTheme, g as HtmlSlideSlotData, m as HtmlSlotDefinition, L as LayoutBoxConfig, c as SlideRenderAsyncResult, a as SlideRenderOptions, b as SlideRenderResult, d as SlideTheme } from './types-C3d04zzP.cjs';
1
+ export { h as ClickCssOptions, f as ClickPostprocessResult, C as ClickPreprocessResult, j as countSlides, d as defineTheme, e as extractMaxClicks, g as generateClickCss, l as generateScopedCss, k as getThemeTokens, c as postprocessClicks, p as preprocessClicks, i as renderMarp, r as renderSlide, a as renderSlideAsync, b as resolveTheme } from './click-css-C8VciwZ6.cjs';
2
+ import { e as SlideEngineConfig, f as SlideEngine, T as ThemeTokens, M as MermaidBlock, S as SlideLayoutData } from './types-CvxCxWus.cjs';
3
+ export { B as BuiltInTheme, L as LayoutBoxConfig, c as SlideRenderAsyncResult, a as SlideRenderOptions, b as SlideRenderResult, d as SlideTheme } from './types-CvxCxWus.cjs';
4
4
  import { Highlighter } from 'shiki';
5
- export { a as SLIDE_LAYOUT_PRESETS, S as SlideLayoutCategory, c as SlideLayoutPreset, g as getSlideLayoutPresetById, b as getSlideLayoutPresetsByCategory } from './presets-BYvgAAkJ.cjs';
5
+ export { a as SLIDE_LAYOUT_PRESETS, S as SlideLayoutCategory, c as SlideLayoutPreset, g as getSlideLayoutPresetById, b as getSlideLayoutPresetsByCategory } from './presets-MIi91wZg.cjs';
6
+ import { c as HtmlThemeName, e as HtmlDeckTheme, b as HtmlLayoutPresetId, f as HtmlSlidePreset, a as HtmlDeckData, H as HtmlCompileOptions, C as CompiledHtmlDeckResult } from './types-k_eae8UV.cjs';
7
+ export { d as HtmlSlideSlotData, g as HtmlSlotDefinition } from './types-k_eae8UV.cjs';
6
8
  export { FRONTEND_SLIDES_CORE_RULES, FrontendSlidesSkillOptions, STYLE_PRESETS, StylePresetItem, TEMPLATES_CATALOG, TemplateCatalogItem, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getStylePresetById, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from './skills/index.cjs';
7
9
  import 'zod';
8
10
 
@@ -177,6 +179,13 @@ interface GenerateHtmlShellOptions {
177
179
  slideCount: number;
178
180
  customHeadTags?: string;
179
181
  deckId?: string;
182
+ /**
183
+ * Self-contained @font-face CSS (base64 woff2). When provided the shell emits
184
+ * NO external font links, so the deck renders with its typography on a machine
185
+ * with no network. Built by the Node-only `presentation-kit/node` entry
186
+ * (`loadEmbeddedFontFaceCss`) — the main entry stays fs-free for browsers.
187
+ */
188
+ fontFaceCss?: string;
180
189
  }
181
190
  declare function generateHtmlShell(options: GenerateHtmlShellOptions): string;
182
191
 
@@ -199,4 +208,36 @@ declare function compileHtmlDeckAsync(deckData: HtmlDeckData, options?: HtmlComp
199
208
 
200
209
  declare function normalizeSlideSlots(slide: any): Record<string, any>;
201
210
 
202
- export { CompiledHtmlDeckResult, type GenerateHtmlShellOptions, HTML_SLIDE_PRESETS, HTML_THEMES, HtmlCompileOptions, HtmlDeckData, HtmlDeckTheme, HtmlLayoutPresetId, HtmlSlidePreset, HtmlThemeName, MermaidBlock, type PptxExportOptions, SlideEngine, SlideEngineConfig, SlideLayoutData, ThemeTokens, cleanHexColor, compileHtmlDeck, compileHtmlDeckAsync, convertMarkdownToPptx, convertTextArrows, createEngine, darkThemeTokens, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, filterPresenterNotes, generateHtmlShell, generateLayoutCss, generateScopedCss as generateScopedCssFromTokens, getHighlighter, highlightCodeBlocks, highlightDeckCodeBlocks, isLayoutComment, lightThemeTokens, navyThemeTokens, normalizeSlideSlots, parseFontSizeToPt, parseLayoutFromComment, removeSlideElementFromMarkdown, renderMermaidDiagrams, resolveHtmlTheme, sanitizeMermaidCode, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown };
211
+ interface SanitizedSlideHtml {
212
+ html: string;
213
+ /** Human-readable notes about what was stripped — surfaced to logs/repair prompts. */
214
+ removed: string[];
215
+ }
216
+ /**
217
+ * Strips executable and externally-fetching content from authored slide markup.
218
+ * Idempotent: sanitizing sanitized output changes nothing.
219
+ */
220
+ declare function sanitizeSlideHtml(raw: string): SanitizedSlideHtml;
221
+ interface BespokeSlideValidation {
222
+ valid: boolean;
223
+ issues: string[];
224
+ }
225
+ interface BespokeSlideContract {
226
+ /** Hard cap on authored characters — bounds prompt/token waste per slide. */
227
+ maxChars?: number;
228
+ /** Minimum characters of real content, i.e. not an empty shell. */
229
+ minChars?: number;
230
+ }
231
+ /**
232
+ * Fail-closed contract for authored slide markup. A slide that fails here must
233
+ * be rejected (or sent back for repair) — never compiled into the deck.
234
+ */
235
+ declare function validateBespokeSlideHtml(raw: string, contract?: BespokeSlideContract): BespokeSlideValidation;
236
+ /** Wraps sanitized authored markup into the stage contract the deck shell expects. */
237
+ declare function buildBespokeSlideMarkup(raw: string): string;
238
+
239
+ declare const SLIDE_UTILITY_CSS: string;
240
+ /** Every class defined by {@link SLIDE_UTILITY_CSS} — used by the coverage guard. */
241
+ declare function listUtilityClasses(): string[];
242
+
243
+ export { type BespokeSlideContract, type BespokeSlideValidation, CompiledHtmlDeckResult, type GenerateHtmlShellOptions, HTML_SLIDE_PRESETS, HTML_THEMES, HtmlCompileOptions, HtmlDeckData, HtmlDeckTheme, HtmlLayoutPresetId, HtmlSlidePreset, HtmlThemeName, MermaidBlock, type PptxExportOptions, SLIDE_UTILITY_CSS, type SanitizedSlideHtml, SlideEngine, SlideEngineConfig, SlideLayoutData, ThemeTokens, buildBespokeSlideMarkup, cleanHexColor, compileHtmlDeck, compileHtmlDeckAsync, convertMarkdownToPptx, convertTextArrows, createEngine, darkThemeTokens, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, filterPresenterNotes, generateHtmlShell, generateLayoutCss, generateScopedCss as generateScopedCssFromTokens, getHighlighter, highlightCodeBlocks, highlightDeckCodeBlocks, isLayoutComment, lightThemeTokens, listUtilityClasses, navyThemeTokens, normalizeSlideSlots, parseFontSizeToPt, parseLayoutFromComment, removeSlideElementFromMarkdown, renderMermaidDiagrams, resolveHtmlTheme, sanitizeMermaidCode, sanitizeSlideHtml, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown, validateBespokeSlideHtml };