@thanh01.pmt/presentation-kit 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.cjs +427 -0
- package/dist/ai/index.cjs.map +1 -0
- package/dist/ai/index.d.cts +206 -0
- package/dist/ai/index.d.ts +206 -0
- package/dist/ai/index.js +415 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/chunk-HBMXEPZJ.js +745 -0
- package/dist/chunk-HBMXEPZJ.js.map +1 -0
- package/dist/{chunk-FATGZ25L.js → chunk-JOW4QWKF.js} +3 -101
- package/dist/chunk-JOW4QWKF.js.map +1 -0
- package/dist/chunk-OEAOYF7C.cjs +756 -0
- package/dist/chunk-OEAOYF7C.cjs.map +1 -0
- package/dist/{chunk-O4Y3VEOA.cjs → chunk-VLAPHJOC.cjs} +2 -103
- package/dist/chunk-VLAPHJOC.cjs.map +1 -0
- package/dist/click-css-BGZI3XKk.d.cts +124 -0
- package/dist/click-css-eWONB-hS.d.ts +124 -0
- package/dist/index.cjs +51 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/presets-B1N2_jKl.d.ts +22 -0
- package/dist/presets-JpoJbNKE.d.cts +22 -0
- package/dist/react/index.cjs +39 -12
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +3 -2
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.js +29 -2
- package/dist/react/index.js.map +1 -1
- package/dist/{click-css-C84mdmU0.d.cts → types-DnR81ReX.d.cts} +1 -122
- package/dist/{click-css-C84mdmU0.d.ts → types-DnR81ReX.d.ts} +1 -122
- package/package.json +10 -3
- package/dist/chunk-FATGZ25L.js.map +0 -1
- package/dist/chunk-O4Y3VEOA.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-HBMXEPZJ.js","sourcesContent":["import yaml from 'js-yaml';\nimport type { 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// @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: 'Bìa & Giới thiệu (Title Cover)',\n category: 'cover',\n description: 'Slide bìa mở đầu ấn tượng với tiêu đề lớn, phụ đề và thông tin giảng viên.',\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# 🚀 Tiêu Đề Bài Giảng Chính\n### Phụ đề ngắn gọn, truyền cảm hứng và định vị mục tiêu\n\n**Giảng viên:** Thầy Nguyễn Văn A | **Thời lượng:** 45 phút | **Cấp độ:** Trung cấp\n\n<!--\nPresenter Notes:\n- Chào mừng học viên, giới thiệu mục tiêu bài học hôm nay.\n- Khơi gợi sự tò mò bằng câu hỏi mở đầu về bài toán thực tế.\n-->`,\n },\n\n {\n id: 'two-column-split',\n name: 'So Sánh 2 Cột (2-Column Comparison)',\n category: 'split',\n description: 'Bố cục chia đôi màn hình để so sánh phương pháp cũ vs mới, lý thuyết vs thực tế.',\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## ⚖️ So Sánh Khái Niệm & Giải Pháp\n\n<div class=\"columns-2\">\n<div>\n\n### 🔴 Cách Tiếp Cận Cũ\n- Xử lý thủ công, tốn nhiều nhân lực\n- Dễ phát sinh sai số do thao tác lặp lại\n- Khó mở rộng khi tải tăng đột biến\n\n</div>\n<div>\n\n### 🟢 Giải Pháp Tối Ưu Mới\n- Tự động hóa hoàn toàn luồng xử lý\n- Giám sát trạng thái thời gian thực\n- Khả năng co giãn linh hoạt theo nhu cầu\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Nhấn mạnh điểm nghẽn lớn nhất ở cột bên trái.\n- Dẫn chứng số liệu thực tế chứng minh tính hiệu quả của cột phải.\n-->`,\n },\n\n {\n id: 'code-explainer',\n name: 'Giải Thích Code (Code Walkthrough)',\n category: 'code',\n description: 'Cột trái hiển thị code snippet có đánh số, cột phải giải thích từng bước hoạt động.',\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## 💻 Phân Tích Cấu Trúc Mã Nguồn\n\n<div class=\"columns-2\">\n<div>\n\n\\`\\`\\`ts\n// Khởi tạo quy trình kiểm tra dữ liệu\nexport async function processPayment(order: Order) {\n const isValid = await validateOrder(order);\n if (!isValid) throw new Error(\"Invalid\");\n\n const receipt = await chargeCard(order);\n return sendConfirmation(receipt);\n}\n\\`\\`\\`\n\n</div>\n<div>\n\n### 🔍 3 Điểm Cần Chú Ý:\n1. **Kiểm tra sớm (Guard Clause):** Kiểm tra tính hợp lệ ngay dòng 3 để tránh gọi hàm tốn chi phí.\n2. **Bất đồng bộ (Async/Await):** Đảm bảo thứ tự gọi API tài chính chuẩn xác.\n3. **Phản hồi người dùng:** Trả về biên lai hoàn chỉnh sau khi giao dịch thành công.\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Yêu cầu học viên xác định dòng code nào là rủi ro nhất nếu kết nối mạng bị rớt.\n- Nhắc lại nguyên tắc Fail-Fast trong lập trình phòng thủ.\n-->`,\n },\n\n {\n id: 'metrics-3-card',\n name: 'Lưới 3 Chỉ Số (3-Metric Dashboard)',\n category: 'metrics',\n description: 'Hiển thị 3 chỉ số quan trọng (KPIs, Benchmarks, Impact) dạng card nổi bật.',\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## 📊 3 Chỉ Số Thành Công Của Dự Án\n\n<div class=\"columns-3\">\n<div>\n\n# ⚡ 99.9%\n### Độ Sẵn Sàng (Uptime)\nHệ thống vận hành liên tục 24/7 với khả năng tự phục hồi lỗi tức thì.\n\n</div>\n<div>\n\n# 🚀 10x\n### Tốc Độ Xử Lý\nRút ngắn thời gian biên dịch và phản hồi người dùng từ giây xuống mili-giây.\n\n</div>\n<div>\n\n# 🛡️ 0\n### Lỗ Hổng Bảo Mật\nĐạt chuẩn đánh giá an toàn OWASP và mã hóa dữ liệu đầu cuối.\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Trình bày lần lượt 3 mục tiêu đo lường được của hệ thống.\n- Nhấn mạnh chỉ số thứ 2 là trọng tâm kỹ thuật của bài học hôm nay.\n-->`,\n },\n\n {\n id: 'process-flow',\n name: 'Sơ Đồ Quy Trình (Process / Flowchart)',\n category: 'diagram',\n description: 'Quy trình nhiều bước với sơ đồ Mermaid trực quan kèm ghi chú tóm tắt.',\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## 🔄 Kiến Trúc Luồng Dữ Liệu 4 Bước\n\n\\`\\`\\`mermaid\ngraph LR\n A[1. Client Request] --> B[2. API Gateway]\n B --> C[3. Auth Service]\n C --> D[4. Database Cluster]\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- **Giai đoạn 1 & 2:** Tiếp nhận yêu cầu từ client, điều hướng tải và giới hạn tần suất (Rate Limiting).\n- **Giai đoạn 3 & 4:** Xác thực token JWT phân quyền trước khi truy vấn dữ liệu từ DB Cluster.\n\n<!--\nPresenter Notes:\n- Trỏ trực tiếp vào từng node của sơ đồ Mermaid khi thuyết trình.\n- Đặt câu hỏi: \"Nếu bước 3 thất bại thì bước 4 có được gọi không?\"\n-->`,\n },\n\n {\n id: 'quote-highlight',\n name: 'Thông Điệp Then Chốt (Quote / Highlight)',\n category: 'quote',\n description: 'Trích dẫn danh ngôn hoặc nguyên tắc vàng cần ghi nhớ sâu sắc.',\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## 💡 Nguyên Tắc Thiết Kế Cốt Lõi\n\n> \"Sự đơn giản là điều kiện tiên quyết cho độ tin cậy. Một kiến trúc tốt là khi bất kỳ lập trình viên mới nào cũng có thể đọc hiểu luồng hoạt động chỉ sau 15 phút.\"\n> \n> — **Edsger W. Dijkstra**\n\n<!--\nPresenter Notes:\n- Dừng lại 5 giây im lặng để cả lớp cùng suy ngẫm về thông điệp.\n- Yêu cầu một học viên chia sẻ suy nghĩ về cách áp dụng nguyên tắc này vào bài tập lớn.\n-->`,\n },\n\n {\n id: 'quiz-checkpoint',\n name: 'Trắc Nghiệm Tương Tác (Quiz Checkpoint)',\n category: 'assessment',\n description: 'Câu hỏi tương tác Formative Checkpoint kèm các lựa chọn A/B/C/D để lớp bình chọn.',\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## 🎯 Kiểm Tra Nhanh: Bạn Đã Hiểu Đúng?\n\n> **Câu hỏi:** Trong kiến trúc Microservices, cơ chế nào giúp đảm bảo tin nhắn không bị thất lạc khi dịch vụ nhận gặp sự cố tạm thời?\n\n- **A.** Gọi API HTTP trực tiếp với timeout ngắn\n- **B.** Sử dụng Message Queue (Hàng đợi tin nhắn) có cơ chế Retry & DLQ\n- **C.** Lưu tạm vào bộ nhớ RAM của máy khách (Client In-Memory Storage)\n- **D.** Bỏ qua tin nhắn bị lỗi và thông báo người dùng gửi lại từ đầu\n\n<!--\nPresenter Notes:\n- Dành 30 giây cho học viên giơ tay hoặc bình chọn đáp án.\n- Đáp án chính xác: B.\n- Giải thích vì sao đáp án A và C tiềm ẩn nguy cơ mất mát dữ liệu nghiêm trọng.\n-->`,\n },\n\n {\n id: 'tiered-practice-3cards',\n name: 'Thực Hành Phân Hóa (Tiered Practice)',\n category: 'content',\n description: '3 cấp bậc nhiệm vụ Đồng - Bạc - Vàng để học sinh tự chọn mức thử thách phù hợp.',\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## 🛠️ Thử Thách Phân Hóa 3 Cấp Độ (Tiered Lab)\n\n<div class=\"columns-3\">\n<div>\n\n### 🥉 Hạng Đồng (Bronze)\n- Viết hàm xử lý cơ bản\n- Vượt qua 3 test case mẫu\n- *Mục tiêu: Đạt chuẩn kiến thức cơ bản*\n\n</div>\n<div>\n\n### 🥈 Hạng Bạc (Silver)\n- Thêm kiểm tra điều kiện biên\n- Tối ưu độ phức tạp thuật toán O(N)\n- *Mục tiêu: Vững vàng kỹ năng thực chiến*\n\n</div>\n<div>\n\n### 🥇 Hạng Vàng (Gold)\n- Thiết kế tính năng mở rộng\n- Viết Unit Test tự động bao phủ 90%\n- *Mục tiêu: Sáng tạo & bứt phá*\n\n</div>\n</div>\n\n<!--\nPresenter Notes:\n- Toàn bộ lớp đều bắt đầu từ Hạng Đồng để đảm bảo hiểu bài.\n- Khuyến khích học viên đã xong Bronze chủ động thử sức với Silver và Gold.\n-->`,\n },\n\n {\n id: 'agenda-timeline',\n name: 'Lộ Trình Buổi Học (Agenda Table)',\n category: 'content',\n description: 'Bảng lộ trình thời gian chi tiết theo từng giai đoạn và sản phẩm đầu ra.',\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## 🗺️ Lộ Trình Hoạt Động & Mục Tiêu\n\n| Thời lượng | Giai đoạn | Trọng tâm hoạt động | Kết quả đạt được |\n|:---:|---|---|---|\n| **05'** | Khởi động | Tình huống thực tế & Thử thách | Nhận diện bài toán cần giải |\n| **15'** | Khám phá | Phân tích 2 khái niệm cốt lõi | Hiểu bản chất thuật toán |\n| **20'** | Thực hành | Code Lab tại máy theo 3 bậc | Hoàn thành tối thiểu Hạng Đồng |\n| **05'** | Tổng kết | Trắc nghiệm phản xạ & Đánh giá | Hệ thống hóa toàn bộ kiến thức |\n\n<!--\nPresenter Notes:\n- Giới thiệu tổng quan để học viên biết rõ cấu trúc buổi học và chủ động phân bổ thời gian.\n-->`,\n },\n\n {\n id: 'takeaways-summary',\n name: 'Tổng Kết Cốt Lõi (Key Takeaways)',\n category: 'content',\n description: 'Slide kết luận với 3 bài học đắt giá nhất và hành động tiếp theo.',\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## 🏁 3 Điều Cần Nhớ Sau Buổi Học\n\n1. **Hiểu bản chất trước khi viết mã:** Thuật toán đúng luôn quan trọng hơn cú pháp bóng bẩy.\n2. **Kiểm soát điều kiện biên:** 80% lỗi hệ thống phát sinh từ các dữ liệu đầu vào không lường trước.\n3. **Thiết kế hướng mô-đun:** Chia nhỏ vấn đề lớn thành các hàm độc lập dễ kiểm thử.\n\n> 📝 **Nhiệm vụ về nhà:** Hoàn thiện bài thực hành Hạng Bạc và chuẩn bị câu hỏi cho buổi Review tuần tới.\n\n<!--\nPresenter Notes:\n- Tóm tắt súc tích trong 2 phút cuối buổi.\n- Tuyên dương các bạn có giải pháp xuất sắc trong phần thực hành.\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"]}
|
|
@@ -1258,104 +1258,6 @@ function extractLayoutsAndNotes(rawComments) {
|
|
|
1258
1258
|
}
|
|
1259
1259
|
return { layouts, notes };
|
|
1260
1260
|
}
|
|
1261
|
-
function serializeLayoutToComment(layout) {
|
|
1262
|
-
if (!layout.boxes || layout.boxes.length === 0) return "";
|
|
1263
|
-
const cleanData = {
|
|
1264
|
-
boxes: layout.boxes.map((box) => {
|
|
1265
|
-
const b = {
|
|
1266
|
-
id: box.id,
|
|
1267
|
-
target: box.target || `h1`,
|
|
1268
|
-
pos: [
|
|
1269
|
-
Math.round(box.pos[0]),
|
|
1270
|
-
Math.round(box.pos[1]),
|
|
1271
|
-
Math.round(box.pos[2]),
|
|
1272
|
-
Math.round(box.pos[3])
|
|
1273
|
-
]
|
|
1274
|
-
};
|
|
1275
|
-
if (box.fontSize) b.fontSize = box.fontSize;
|
|
1276
|
-
if (box.color) b.color = box.color;
|
|
1277
|
-
if (box.textAlign) b.textAlign = box.textAlign;
|
|
1278
|
-
if (box.style) b.style = box.style;
|
|
1279
|
-
return b;
|
|
1280
|
-
})
|
|
1281
|
-
};
|
|
1282
|
-
const yamlStr = yaml.dump(cleanData, {
|
|
1283
|
-
indent: 2,
|
|
1284
|
-
lineWidth: -1,
|
|
1285
|
-
noRefs: true
|
|
1286
|
-
}).trim();
|
|
1287
|
-
return `<!-- layout:
|
|
1288
|
-
${yamlStr.split("\n").join("\n ")}
|
|
1289
|
-
-->`;
|
|
1290
|
-
}
|
|
1291
|
-
function splitMarkdownSlides(markdown) {
|
|
1292
|
-
const lines = markdown.split("\n");
|
|
1293
|
-
let frontmatter = null;
|
|
1294
|
-
const slideBuffers = [];
|
|
1295
|
-
let currentBuffer = [];
|
|
1296
|
-
let inCodeFence = false;
|
|
1297
|
-
let lineIdx = 0;
|
|
1298
|
-
if (lines.length > 0 && lines[0].trim() === "---") {
|
|
1299
|
-
const fmBuffer = [lines[0]];
|
|
1300
|
-
lineIdx = 1;
|
|
1301
|
-
while (lineIdx < lines.length) {
|
|
1302
|
-
const line = lines[lineIdx];
|
|
1303
|
-
fmBuffer.push(line);
|
|
1304
|
-
if (line.trim() === "---") {
|
|
1305
|
-
frontmatter = fmBuffer.join("\n");
|
|
1306
|
-
lineIdx++;
|
|
1307
|
-
break;
|
|
1308
|
-
}
|
|
1309
|
-
lineIdx++;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
for (let i = lineIdx; i < lines.length; i++) {
|
|
1313
|
-
const line = lines[i];
|
|
1314
|
-
if (/^```/.test(line.trim())) {
|
|
1315
|
-
inCodeFence = !inCodeFence;
|
|
1316
|
-
currentBuffer.push(line);
|
|
1317
|
-
continue;
|
|
1318
|
-
}
|
|
1319
|
-
if (!inCodeFence && line.trim() === "---") {
|
|
1320
|
-
slideBuffers.push(currentBuffer);
|
|
1321
|
-
currentBuffer = [];
|
|
1322
|
-
continue;
|
|
1323
|
-
}
|
|
1324
|
-
currentBuffer.push(line);
|
|
1325
|
-
}
|
|
1326
|
-
slideBuffers.push(currentBuffer);
|
|
1327
|
-
const slides = slideBuffers.map((b) => b.join("\n"));
|
|
1328
|
-
return { frontmatter, slides };
|
|
1329
|
-
}
|
|
1330
|
-
function updateSlideLayoutInMarkdown(markdown, slideIndex, layout) {
|
|
1331
|
-
const { frontmatter, slides } = splitMarkdownSlides(markdown);
|
|
1332
|
-
if (slideIndex < 0 || slideIndex >= slides.length) {
|
|
1333
|
-
return markdown;
|
|
1334
|
-
}
|
|
1335
|
-
let slideContent = slides[slideIndex];
|
|
1336
|
-
const layoutCommentRegex = /<!--\s*layout:\s*[\s\S]*?-->/i;
|
|
1337
|
-
const newComment = layout && layout.boxes && layout.boxes.length > 0 ? serializeLayoutToComment(layout) : "";
|
|
1338
|
-
if (layoutCommentRegex.test(slideContent)) {
|
|
1339
|
-
if (newComment) {
|
|
1340
|
-
slideContent = slideContent.replace(layoutCommentRegex, newComment);
|
|
1341
|
-
} else {
|
|
1342
|
-
slideContent = slideContent.replace(layoutCommentRegex, "").trim();
|
|
1343
|
-
}
|
|
1344
|
-
} else if (newComment) {
|
|
1345
|
-
const trimmed = slideContent.trimStart();
|
|
1346
|
-
slideContent = `${newComment}
|
|
1347
|
-
|
|
1348
|
-
${trimmed}`;
|
|
1349
|
-
}
|
|
1350
|
-
slides[slideIndex] = slideContent;
|
|
1351
|
-
const joinedSlides = slides.join("\n---\n");
|
|
1352
|
-
if (frontmatter) {
|
|
1353
|
-
return `${frontmatter}
|
|
1354
|
-
|
|
1355
|
-
${joinedSlides}`;
|
|
1356
|
-
}
|
|
1357
|
-
return joinedSlides;
|
|
1358
|
-
}
|
|
1359
1261
|
|
|
1360
1262
|
// src/core/layout/css-generator.ts
|
|
1361
1263
|
function generateLayoutCss(layouts, containerId = "marp-container") {
|
|
@@ -1476,6 +1378,6 @@ async function renderSlideAsync(markdown, options) {
|
|
|
1476
1378
|
};
|
|
1477
1379
|
}
|
|
1478
1380
|
|
|
1479
|
-
export { convertTextArrows, countSlides, darkThemeTokens, defineTheme, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, extractMaxClicks, filterPresenterNotes, generateClickCss, generateLayoutCss, generateScopedCss, generateScopedCss2, getHighlighter, getThemeTokens, highlightCodeBlocks, isLayoutComment, lightThemeTokens, navyThemeTokens, parseLayoutFromComment, postprocessClicks, preprocessClicks, renderMarp, renderMermaidDiagrams, renderSlide, renderSlideAsync, resolveTheme, sanitizeMermaidCode
|
|
1480
|
-
//# sourceMappingURL=chunk-
|
|
1481
|
-
//# sourceMappingURL=chunk-
|
|
1381
|
+
export { convertTextArrows, countSlides, darkThemeTokens, defineTheme, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, extractMaxClicks, filterPresenterNotes, generateClickCss, generateLayoutCss, generateScopedCss, generateScopedCss2, getHighlighter, getThemeTokens, highlightCodeBlocks, isLayoutComment, lightThemeTokens, navyThemeTokens, parseLayoutFromComment, postprocessClicks, preprocessClicks, renderMarp, renderMermaidDiagrams, renderSlide, renderSlideAsync, resolveTheme, sanitizeMermaidCode };
|
|
1382
|
+
//# sourceMappingURL=chunk-JOW4QWKF.js.map
|
|
1383
|
+
//# sourceMappingURL=chunk-JOW4QWKF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/arrow-converter.ts","../src/core/source-extractor.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/navy.ts","../src/themes/scoped-css.ts","../src/themes/index.ts","../src/plugins/mermaid.ts","../src/plugins/shiki.ts","../src/vclick/preprocessor.ts","../src/vclick/postprocessor.ts","../src/vclick/click-css.ts","../src/core/layout/parser.ts","../src/core/layout/css-generator.ts","../src/core/render.ts"],"names":["generateScopedCss","decodeHtmlEntities","totalClicks"],"mappings":"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","file":"chunk-JOW4QWKF.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// Arrow Converter — Text arrows → Unicode arrows\n// Ported from: apps/web/app/api/render-marp/route.ts\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Converts text arrows (->, -->, --->, =>, ==>, <->, etc.) into clean Unicode\n * arrows while strictly preserving YAML frontmatter, code fences, inline code,\n * HTML comments, and style tags.\n */\nexport function convertTextArrows(text: string): string {\n if (!text) return '';\n\n let content = text;\n let yamlFrontmatter = '';\n\n // 1. Preserve YAML frontmatter at the beginning of markdown (e.g. --- ... ---)\n const yamlMatch = content.match(/^(---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$))/);\n if (yamlMatch?.[1]) {\n yamlFrontmatter = yamlMatch[1];\n content = content.slice(yamlFrontmatter.length);\n }\n\n // 2. Split by code fences, inline code, HTML comments, and style tags\n const segments = content.split(/(```[\\s\\S]*?```|`[^`\\n]+`|<!--[\\s\\S]*?-->|<style[\\s\\S]*?<\\/style>)/g);\n\n const processedContent = segments\n .map((segment) => {\n // If it's a code block, inline code, HTML comment, or style tag, leave untouched\n if (\n segment.startsWith('```') ||\n segment.startsWith('`') ||\n segment.startsWith('<!--') ||\n segment.startsWith('<style')\n ) {\n return segment;\n }\n\n return (\n segment\n // Bi-directional double arrows\n .replace(/<={3,}>/g, '⟺')\n .replace(/<==>/g, '⟺')\n .replace(/<=>/g, '⇔')\n // Bi-directional single arrows\n .replace(/<-{3,}>/g, '⟷')\n .replace(/<-->/g, '⟷')\n .replace(/<->/g, '↔')\n // Long right double arrows\n .replace(/={3,}>/g, '⟹')\n .replace(/==>/g, '⟹')\n .replace(/(^|\\s)=>(?=\\s|$|[.,:;!?\\)])/g, '$1⇒')\n // Long left double arrows\n .replace(/<={3,}/g, '⟸')\n .replace(/<==/g, '⟸')\n .replace(/(^|\\s)<=(?=\\s|$|[.,:;!?\\)])/g, '$1⇐')\n // Long right single arrows (----> -> ⟶, ---> -> ⟶, --> -> ⟶, -> -> →)\n .replace(/-{3,}>/g, '⟶')\n .replace(/-->/g, '⟶')\n .replace(/(^|\\s)->(?=\\s|$|[.,:;!?\\)])/g, '$1→')\n // Long left single arrows (<---- -> ⟵, <--- -> ⟵, <-- -> ⟵, <- -> ←)\n .replace(/<-{3,}/g, '⟵')\n .replace(/<--/g, '⟵')\n .replace(/(^|\\s)<-(?=\\s|$|[.,:;!?\\)])/g, '$1←')\n // LaTeX math arrows\n .replace(/\\$\\\\rightarrow\\$/g, '→')\n .replace(/\\$\\\\leftarrow\\$/g, '←')\n .replace(/\\$\\\\Rightarrow\\$/g, '⇒')\n .replace(/\\$\\\\Leftarrow\\$/g, '⇐')\n .replace(/\\\\rightarrow/g, '→')\n .replace(/\\\\leftarrow/g, '←')\n .replace(/\\\\Rightarrow/g, '⇒')\n .replace(/\\\\Leftarrow/g, '⇐')\n );\n })\n .join('');\n\n return yamlFrontmatter + processedContent;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Source Extractor — Extract clean Marp source from markdown wrappers\n// Ported from: apps/web/components/MarpSlideViewer.tsx\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Extracts clean Marp source from markdown that may be wrapped in code fences\n * or preceded by conversational preamble.\n *\n * Handles:\n * - Wrapped in ```markdown ... ``` or ```marp ... ``` or ```md ... ```\n * - Conversational preamble before the first frontmatter ---\n */\nexport function extractMarpSource(raw: string): string {\n if (!raw) return '';\n let text = raw.trim();\n\n // If wrapped in ```markdown ... ``` or ```marp ... ``` or ```md ... ```\n const codeBlockMatch = text.match(/^```(?:markdown|marp|md)?\\s*\\n([\\s\\S]*?)\\n```\\s*$/i);\n if (codeBlockMatch?.[1]) {\n text = codeBlockMatch[1].trim();\n }\n\n // If there is conversational preamble before the first frontmatter ---\n const firstFrontmatter = text.search(/^---\\s*$/m);\n if (firstFrontmatter > 0 && text.includes('marp: true')) {\n text = text.substring(firstFrontmatter).trim();\n }\n\n return text;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Dark Theme — Studio Dark (#14151b)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const darkThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#14151b',\n cardBorder: '1px solid rgba(255, 255, 255, 0.08)',\n cardShadow: '0 8px 24px -4px rgba(0, 0, 0, 0.4)',\n\n // Typography — Calm single-hue readability (Zinc-200)\n text: '#cbd5e1',\n heading: '#e4e4e7',\n bold: '#ffffff',\n link: '#60a5fa',\n meta: '#94a3b8',\n\n // Code\n codeBg: '#0c0c0e',\n codeText: '#e4e4e7',\n inlineCodeBg: '#0c0c0e',\n inlineCodeText: '#e4e4e7',\n codeBorder: 'rgba(255, 255, 255, 0.08)',\n\n // Blockquotes\n quoteBg: 'rgba(255, 255, 255, 0.04)',\n quoteBorder: 'rgba(255, 255, 255, 0.15)',\n quoteText: '#e4e4e7',\n\n // Tables\n tableHeaderBg: 'rgba(255, 255, 255, 0.04)',\n tableBorder: 'rgba(255, 255, 255, 0.08)',\n tableRowHover: 'rgba(255, 255, 255, 0.02)',\n tableText: '#cbd5e1',\n tableEvenRow: 'rgba(255, 255, 255, 0.03)',\n\n // Mermaid\n mermaidDark: true,\n mermaidVariables: {\n darkMode: 'true',\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #27272a !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #e4e4e7 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(255, 255, 255, 0.02) !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #a1a1aa !important;\n }\n .edgePath path {\n stroke: #71717a !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #71717a !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Light Theme — Keynote White (#ffffff)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const lightThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#ffffff',\n cardBorder: '1px solid rgba(0, 0, 0, 0.08)',\n cardShadow: '0 4px 16px -2px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.03)',\n\n // Typography — Calm single-hue readability (Zinc-800)\n text: '#3f3f46',\n heading: '#27272a',\n bold: '#18181b',\n link: '#2563eb',\n meta: '#71717a',\n\n // Code\n codeBg: '#f4f4f5',\n codeText: '#27272a',\n inlineCodeBg: '#f4f4f5',\n inlineCodeText: '#27272a',\n codeBorder: 'rgba(0, 0, 0, 0.08)',\n\n // Blockquotes\n quoteBg: '#f8f9fa',\n quoteBorder: 'rgba(0, 0, 0, 0.15)',\n quoteText: '#27272a',\n\n // Tables\n tableHeaderBg: '#f8fafc',\n tableBorder: '#e2e8f0',\n tableRowHover: 'rgba(0, 0, 0, 0.02)',\n tableText: '#3f3f46',\n tableEvenRow: '#f8fafc',\n\n // Mermaid\n mermaidDark: false,\n mermaidVariables: {\n darkMode: 'false',\n background: '#ffffff',\n primaryColor: '#f4f4f6',\n primaryTextColor: '#18181b',\n primaryBorderColor: 'rgba(0, 0, 0, 0.15)',\n lineColor: '#94a3b8',\n secondaryColor: '#fafafa',\n tertiaryColor: '#f4f4f5',\n textColor: '#18181b',\n mainBkg: '#f8fafc',\n nodeBorder: 'rgba(0, 0, 0, 0.15)',\n clusterBkg: 'rgba(0, 0, 0, 0.015)',\n clusterBorder: 'rgba(0, 0, 0, 0.1)',\n titleColor: '#18181b',\n edgeLabelBackground: '#f1f5f9',\n actorBorder: 'rgba(0, 0, 0, 0.2)',\n actorBkg: '#f4f4f6',\n actorTextColor: '#18181b',\n actorLineColor: '#94a3b8',\n signalColor: '#18181b',\n signalTextColor: '#18181b',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #f1f5f9 !important;\n stroke: rgba(0, 0, 0, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #334155 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(0, 0, 0, 0.015) !important;\n stroke: rgba(0, 0, 0, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #64748b !important;\n }\n .edgePath path {\n stroke: #94a3b8 !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #94a3b8 !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Navy Theme — Deep Navy (#0f172a)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const navyThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#0f172a',\n cardBorder: '1px solid rgba(255, 255, 255, 0.08)',\n cardShadow: '0 8px 24px -4px rgba(0, 0, 0, 0.4)',\n\n // Typography — Calm single-hue readability (Zinc-200)\n text: '#94a3b8',\n heading: '#f8fafc',\n bold: '#ffffff',\n link: '#38bdf8',\n meta: '#94a3b8',\n\n // Code\n codeBg: '#020617',\n codeText: '#e4e4e7',\n inlineCodeBg: '#020617',\n inlineCodeText: '#e4e4e7',\n codeBorder: 'rgba(255, 255, 255, 0.08)',\n\n // Blockquotes — Navy uses sky tint\n quoteBg: 'rgba(56, 189, 248, 0.06)',\n quoteBorder: 'rgba(255, 255, 255, 0.15)',\n quoteText: '#e4e4e7',\n\n // Tables\n tableHeaderBg: 'rgba(255, 255, 255, 0.04)',\n tableBorder: 'rgba(255, 255, 255, 0.08)',\n tableRowHover: 'rgba(255, 255, 255, 0.02)',\n tableText: '#94a3b8',\n tableEvenRow: 'rgba(56, 189, 248, 0.03)',\n\n // Mermaid — reuse dark config with navy tint\n mermaidDark: true,\n mermaidVariables: {\n darkMode: 'true',\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #27272a !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #e4e4e7 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(255, 255, 255, 0.02) !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #a1a1aa !important;\n }\n .edgePath path {\n stroke: #71717a !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #71717a !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Scoped CSS Generator — Theme-specific CSS for 1280x720 Marp canvas\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\n/**\n * Sanitize a string for safe use as a CSS selector (ID).\n * Escapes characters that are special in CSS selectors.\n */\nfunction sanitizeCssId(id: string): string {\n // CSS.escape() is available in modern browsers and Node 20+\n // Fallback: manual escape for common problematic chars\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(id);\n }\n return id.replace(/([\"'\\\\()\\[\\]#.;,{}\\s!@#$%^&*=+|<>?/~`])/g, '\\\\$1');\n}\n\n/**\n * Generate scoped CSS string for a given theme.\n * This CSS overrides Marp defaults for 1280×720 canvas typography using\n * the container ID for CSS isolation.\n */\nexport function generateScopedCss(tokens: ThemeTokens, containerId: string = 'marp-container'): string {\n const safeId = sanitizeCssId(containerId);\n return `\n/* ── Isolation: Scope all styles to #${safeId} ── */\n#${safeId} {\n width: 100%;\n}\n\n/* Base Slide Card Styling (Thin hairline border) */\n#${safeId} svg[data-marpit-svg] {\n background-color: ${tokens.background} !important;\n border-radius: 12px !important;\n border: ${tokens.cardBorder} !important;\n box-shadow: ${tokens.cardShadow} !important;\n overflow: hidden !important;\n transition: border-color 0.15s ease;\n}\n\n/* Slide Inner Section (1280x720 Canvas Coordinate Scale) */\n#${safeId} section:not([data-background-color]):not([style*=\"background\"]),\n#${safeId} foreignObject > section:not([data-background-color]):not([style*=\"background\"]) {\n background-color: ${tokens.background} !important;\n}\n\n#${safeId} section,\n#${safeId} foreignObject > section {\n color: ${tokens.text} !important;\n font-family: var(--font-sans), Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n padding: 50px 60px !important;\n box-sizing: border-box !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: center !important;\n}\n\n/* Force inline display for emojis, twemojis, and inline text emojis */\n#${safeId} section img.emoji,\n#${safeId} section img[data-marp-twemoji],\n#${safeId} section .emoji {\n display: inline-block !important;\n vertical-align: -0.15em !important;\n height: 1.15em !important;\n width: 1.15em !important;\n margin: 0 0.15em !important;\n}\n\n/* Mermaid Diagram styling inside Marp Canvas */\n#${safeId} section .marp-mermaid-rendered {\n width: 100% !important;\n display: flex !important;\n justify-content: center !important;\n align-items: center !important;\n margin: 16px 0 !important;\n}\n\n#${safeId} section .marp-mermaid-rendered svg {\n display: block !important;\n max-width: 100% !important;\n max-height: 420px !important;\n width: auto !important;\n height: auto !important;\n}\n\n#${safeId} section .marp-mermaid-rendered svg * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n}\n\n#${safeId} section .katex,\n#${safeId} section .katex-html {\n display: inline-block !important;\n vertical-align: baseline !important;\n}\n\n#${safeId} section strong,\n#${safeId} section b,\n#${safeId} section em,\n#${safeId} section span {\n display: inline !important;\n}\n\n/* ── Typography Scale for 1280x720 Canvas ── */\n#${safeId} section h1 {\n font-size: 38px !important;\n font-weight: 700 !important;\n line-height: 1.25 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 18px 0 !important;\n letter-spacing: -0.02em !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section h2 {\n font-size: 28px !important;\n font-weight: 600 !important;\n line-height: 1.3 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 16px 0 !important;\n letter-spacing: -0.01em !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section h3 {\n font-size: 22px !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 14px 0 !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section p,\n#${safeId} section li {\n font-size: 18px !important;\n line-height: 1.7 !important;\n color: ${tokens.text} !important;\n margin-top: 0 !important;\n margin-bottom: 12px !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section strong,\n#${safeId} section b {\n color: ${tokens.bold} !important;\n font-weight: 600 !important;\n}\n\n#${safeId} section a {\n color: ${tokens.link} !important;\n text-decoration: underline !important;\n text-decoration-thickness: 1px !important;\n text-underline-offset: 2px !important;\n}\n\n#${safeId} section a:hover {\n opacity: 0.85 !important;\n}\n\n#${safeId} section ul,\n#${safeId} section ol {\n margin: 0 0 16px 28px !important;\n padding: 0 !important;\n}\n\n#${safeId} section li {\n margin-bottom: 8px !important;\n}\n\n/* Blockquotes / Callout Cards */\n#${safeId} section blockquote {\n background: ${tokens.quoteBg} !important;\n border-left: 3px solid ${tokens.quoteBorder} !important;\n border-radius: 6px !important;\n padding: 16px 24px !important;\n margin: 16px 0 !important;\n color: ${tokens.quoteText} !important;\n}\n#${safeId} section blockquote p {\n color: ${tokens.quoteText} !important;\n font-size: 18px !important;\n margin: 0 !important;\n}\n\n/* Code Blocks & Inline Code (Monospace font standard) */\n#${safeId} section code {\n font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;\n font-style: normal !important;\n font-size: 15px !important;\n background: ${tokens.inlineCodeBg} !important;\n color: ${tokens.inlineCodeText} !important;\n padding: 2px 8px !important;\n border-radius: 6px !important;\n border: 1px solid ${tokens.codeBorder} !important;\n}\n\n#${safeId} section pre {\n background: ${tokens.codeBg} !important;\n border: 1px solid ${tokens.codeBorder} !important;\n border-radius: 8px !important;\n padding: 18px 22px !important;\n margin: 16px 0 !important;\n overflow-x: auto !important;\n}\n\n#${safeId} section pre code {\n background: transparent !important;\n border: none !important;\n padding: 0 !important;\n font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;\n font-style: normal !important;\n font-size: 15px !important;\n line-height: 1.6 !important;\n color: ${tokens.codeText} !important;\n}\n\n/* Tables */\ndiv#${safeId} svg foreignObject section table,\n#${safeId} section table {\n width: 100% !important;\n border-collapse: collapse !important;\n margin: 16px 0 !important;\n font-size: 17px !important;\n background-color: transparent !important;\n background: transparent !important;\n display: table !important;\n}\n\ndiv#${safeId} svg foreignObject section table tr,\n#${safeId} section table tr {\n background-color: transparent !important;\n background: transparent !important;\n border-top: 1px solid ${tokens.tableBorder} !important;\n}\n\ndiv#${safeId} svg foreignObject section table tbody tr:nth-child(2n),\n#${safeId} section table tbody tr:nth-child(2n) {\n background-color: ${tokens.tableEvenRow ?? tokens.tableHeaderBg} !important;\n}\n\ndiv#${safeId} svg foreignObject section table thead tr,\n#${safeId} section table thead tr {\n background-color: ${tokens.tableHeaderBg} !important;\n}\n\ndiv#${safeId} svg foreignObject section table th,\n#${safeId} section table th {\n background-color: ${tokens.tableHeaderBg} !important;\n color: ${tokens.heading} !important;\n font-weight: 600 !important;\n padding: 10px 16px !important;\n border: 1px solid ${tokens.tableBorder} !important;\n text-align: left !important;\n}\n\ndiv#${safeId} svg foreignObject section table td,\n#${safeId} section table td {\n padding: 10px 16px !important;\n border: 1px solid ${tokens.tableBorder} !important;\n color: ${tokens.tableText} !important;\n background-color: transparent !important;\n}\n\ndiv#${safeId} svg foreignObject section table tr:hover td,\n#${safeId} section table tr:hover td {\n background-color: ${tokens.tableRowHover} !important;\n}\n\n/* Header & Footer */\n#${safeId} section header,\n#${safeId} section footer {\n position: absolute !important;\n left: 60px !important;\n right: 60px !important;\n font-size: 14px !important;\n color: ${tokens.meta} !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n opacity: 0.8 !important;\n}\n\n#${safeId} section header {\n top: 24px !important;\n border-bottom: 1px solid ${tokens.tableBorder} !important;\n padding-bottom: 6px !important;\n}\n\n#${safeId} section footer {\n bottom: 24px !important;\n border-top: 1px solid ${tokens.tableBorder} !important;\n padding-top: 6px !important;\n}\n\n/* Multi-column Grid & Flex Layout Utilities */\n#${safeId} section .columns,\n#${safeId} section .grid-2 {\n display: grid !important;\n grid-template-columns: 1fr 1fr !important;\n gap: 28px !important;\n width: 100% !important;\n margin: 16px 0 !important;\n align-items: start !important;\n}\n\n#${safeId} section .columns > div,\n#${safeId} section .grid-2 > div {\n min-width: 0 !important;\n}\n\n#${safeId} section .card {\n background: ${tokens.quoteBg} !important;\n border: 1px solid ${tokens.cardBorder} !important;\n border-radius: 10px !important;\n padding: 18px 22px !important;\n margin: 12px 0 !important;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;\n}\n\n#${safeId} section .card.highlight {\n border-left: 4px solid ${tokens.link} !important;\n}\n\n#${safeId} section .card.warning {\n border-left: 4px solid #f59e0b !important;\n}\n\n#${safeId} section .card.success {\n border-left: 4px solid #10b981 !important;\n}\n\n/* Marp Split Layout Container */\n#${safeId} section[data-marpit-advanced-background=\"background\"] {\n display: flex !important;\n flex-direction: row !important;\n padding: 0 !important;\n}\n\n#${safeId} section[data-marpit-advanced-background=\"background\"] > .marpit-advanced-background-container {\n flex: 0 0 50% !important;\n height: 100% !important;\n position: relative !important;\n}\n\n#${safeId} section[data-marpit-advanced-background=\"background\"] > .marpit-advanced-background-container + * {\n flex: 1 !important;\n padding: 50px 60px !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: center !important;\n}\n\n/* Hide Raw Marp Image Artifacts */\n#${safeId} section img[data-marp-bg] {\n display: none !important;\n}\n`;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Theme System — Registry, resolution, and CSS generation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { BuiltInTheme, SlideTheme, ThemeTokens } from '../types.js';\nimport { darkThemeTokens } from './dark.js';\nimport { lightThemeTokens } from './light.js';\nimport { navyThemeTokens } from './navy.js';\nimport { generateScopedCss as _generateScopedCss } from './scoped-css.js';\n\n/** Built-in theme registry */\nconst builtInThemes: Record<BuiltInTheme, ThemeTokens> = {\n dark: darkThemeTokens,\n light: lightThemeTokens,\n navy: navyThemeTokens,\n};\n\n/**\n * Get theme tokens by built-in name.\n */\nexport function getThemeTokens(theme: BuiltInTheme): ThemeTokens {\n return builtInThemes[theme];\n}\n\n/**\n * Resolve a theme (built-in name or custom SlideTheme) to a full SlideTheme object.\n */\nexport function resolveTheme(theme: BuiltInTheme | SlideTheme | undefined): SlideTheme {\n if (!theme) {\n return { name: 'dark', tokens: builtInThemes.dark };\n }\n\n if (typeof theme === 'string') {\n return { name: theme, tokens: builtInThemes[theme] };\n }\n\n return theme;\n}\n\n/**\n * Define a custom theme with full token control.\n */\nexport function defineTheme(definition: { name: string; tokens: ThemeTokens }): SlideTheme {\n return {\n name: definition.name,\n tokens: definition.tokens,\n };\n}\n\n/**\n * Generate scoped CSS for a theme.\n */\nexport function generateScopedCss(\n theme: SlideTheme,\n containerId?: string,\n): string {\n return _generateScopedCss(theme.tokens, containerId);\n}\n\n// Re-export sub-modules (token objects for advanced usage)\nexport { darkThemeTokens } from './dark.js';\nexport { lightThemeTokens } from './light.js';\nexport { navyThemeTokens } from './navy.js';\nexport { generateScopedCss as generateScopedCssFromTokens } from './scoped-css.js';\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Mermaid Plugin — Lazy-loaded diagram detection and DOM-based rendering\n// Ported from: apps/web/components/MarpSlideViewer.tsx + MermaidRenderer.tsx\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { MermaidBlock } from '../types.js';\n\n/** Singleton mermaid module promise */\nlet mermaidModulePromise: Promise<typeof import('mermaid').default> | null = null;\n/** Track if singleton init failed so we can retry */\nlet mermaidFailed = false;\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\n/**\n * Decode HTML entities in code content.\n */\nfunction decodeHtmlEntities(html: string): string {\n return html\n .replace(/&/g, '&') // MUST be first to avoid double-decode\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/ /g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCharCode(Number(code)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex: string) => String.fromCharCode(parseInt(hex, 16)));\n}\n\n/**\n * Check if raw text looks like valid mermaid diagram code.\n */\nfunction isValidMermaidCode(text: string): boolean {\n if (!text || text.length > 2500) return false;\n if (text.startsWith('---') || text.includes('marp: true')) return false;\n\n // Check for known mermaid diagram headers\n const hasHeader =\n /^(?:graph\\s+(?:TD|TB|LR|RL|BT)|flowchart\\s+(?:TD|TB|LR|RL|BT)|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|quadrantChart|journey|timeline|xychart|C4Context)\\b/i.test(\n text,\n );\n\n // Must have at least one connection indicator\n const hasConnections =\n text.includes('-->') ||\n text.includes('->>') ||\n text.includes('---') ||\n text.includes('[') ||\n text.includes('(');\n\n return hasHeader && text.includes('\\n') && hasConnections;\n}\n\n/**\n * Detect mermaid blocks in rendered Marp HTML.\n * Returns array of MermaidBlock with raw and sanitized code.\n */\nexport function detectMermaidBlocks(html: string): MermaidBlock[] {\n const blocks: MermaidBlock[] = [];\n\n // Match <pre><code class=\"language-mermaid|diagram|graph\">...</code></pre>\n const regex =\n /<pre><code class=\"language-(?:mermaid|diagram|graph)\">([\\s\\S]*?)<\\/code><\\/pre>/g;\n\n let match;\n let index = 0;\n\n while ((match = regex.exec(html)) !== null) {\n const code = decodeHtmlEntities(match[1]);\n if (isValidMermaidCode(code)) {\n blocks.push({\n index: index++,\n code,\n sanitizedCode: sanitizeMermaidCode(code),\n });\n }\n }\n\n return blocks;\n}\n\n// ─── Sanitization ────────────────────────────────────────────────────────────\n\n/**\n * Sanitize mermaid code — fix common issues that cause render failures.\n * Ported from: apps/web/components/MermaidRenderer.tsx sanitizeMermaidCode()\n */\nexport function sanitizeMermaidCode(chart: string, isDark = false): string {\n let code = (chart || '').trim();\n\n // Remove markdown code fences if wrapped\n code = code.replace(/^```(?:mermaid|diagram|graph)?\\s*/i, '').replace(/```$/i, '').trim();\n\n // If missing diagram header, prepend flowchart TD\n if (\n code &&\n !/^(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|journey|quadrantChart|xychart|C4Context|timeline)/i.test(\n code,\n )\n ) {\n code = `flowchart TD\\n${code}`;\n }\n\n // Fix unquoted node labels with special characters in square brackets\n code = code.replace(\n /([a-zA-Z0-9_-]+)\\[([^\\]\\n\\r\"]+)\\]/g,\n (match, id: string, label: string) => {\n const trimmed = label.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) return match;\n return `${id}[\"${trimmed.replace(/\"/g, \"'\")}\"]`;\n },\n );\n\n // Fix unquoted node labels with special characters in rounded nodes\n code = code.replace(\n /([a-zA-Z0-9_-]+)\\(([^)\\n\\r\"]+)\\)/g,\n (match, id: string, label: string) => {\n const trimmed = label.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) return match;\n return `${id}(\"${trimmed.replace(/\"/g, \"'\")}\")`;\n },\n );\n\n // Fix subgraphs with spaces in name (Mermaid v10+ requires: subgraph id [Title])\n code = code.replace(\n /^\\s*subgraph\\s+([A-Za-z0-9_ -]+)\\s*$/gm,\n (match, rawName: string) => {\n const trimmed = rawName.trim();\n if (trimmed.includes('[') || trimmed.includes(']')) return match;\n const cleanId = trimmed.replace(/[^A-Za-z0-9_]/g, '_');\n return ` subgraph ${cleanId} [\"${trimmed}\"]`;\n },\n );\n\n return code;\n}\n\n// ─── DOM Rendering ───────────────────────────────────────────────────────────\n\n/**\n * Get or create the Mermaid singleton module.\n */\nasync function getMermaid(): Promise<typeof import('mermaid').default> {\n if (mermaidFailed) {\n mermaidModulePromise = null;\n mermaidFailed = false;\n }\n\n if (!mermaidModulePromise) {\n mermaidModulePromise = import('mermaid')\n .then((mod) => mod.default)\n .catch((err) => {\n mermaidModulePromise = null;\n mermaidFailed = true;\n throw new Error(`[presentation-kit] Failed to load Mermaid: ${err}`);\n });\n }\n return mermaidModulePromise;\n}\n\n/**\n * Configuration for Mermaid initialization.\n * Matches the detailed config from MarpSlideViewer.\n */\nfunction getMermaidConfig(isDark: boolean) {\n const tokens = isDark\n ? {\n darkMode: true,\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n }\n : {\n darkMode: false,\n background: '#ffffff',\n primaryColor: '#f4f4f6',\n primaryTextColor: '#18181b',\n primaryBorderColor: 'rgba(0, 0, 0, 0.15)',\n lineColor: '#94a3b8',\n secondaryColor: '#fafafa',\n tertiaryColor: '#f4f4f5',\n textColor: '#18181b',\n mainBkg: '#f8fafc',\n nodeBorder: 'rgba(0, 0, 0, 0.15)',\n clusterBkg: 'rgba(0, 0, 0, 0.015)',\n clusterBorder: 'rgba(0, 0, 0, 0.1)',\n titleColor: '#18181b',\n edgeLabelBackground: '#f1f5f9',\n actorBorder: 'rgba(0, 0, 0, 0.2)',\n actorBkg: '#f4f4f6',\n actorTextColor: '#18181b',\n actorLineColor: '#94a3b8',\n signalColor: '#18181b',\n signalTextColor: '#18181b',\n };\n\n return {\n startOnLoad: false,\n suppressErrorRendering: true,\n theme: isDark ? ('dark' as const) : ('neutral' as const),\n securityLevel: 'loose' as const,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n flowchart: {\n htmlLabels: false,\n useMaxWidth: false,\n padding: 32,\n nodeSpacing: 55,\n rankSpacing: 60,\n curve: 'basis' as const,\n },\n themeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: ${isDark ? '#27272a' : '#f1f5f9'} !important;\n stroke: ${isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'} !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: ${isDark ? '#e4e4e7' : '#334155'} !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: ${isDark ? 'rgba(255, 255, 255, 0.02)' : 'rgba(0, 0, 0, 0.015)'} !important;\n stroke: ${isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'} !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: ${isDark ? '#a1a1aa' : '#64748b'} !important;\n }\n .edgePath path {\n stroke: ${isDark ? '#71717a' : '#94a3b8'} !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: ${isDark ? '#71717a' : '#94a3b8'} !important;\n }\n `,\n themeVariables: tokens,\n };\n}\n\n/**\n * Render mermaid diagrams inside a container element.\n * Lazy-loads mermaid module on first call.\n *\n * This function MUST run in a browser environment (needs DOM).\n * Returns early gracefully in SSR/Node.js environments.\n */\nexport async function renderMermaidDiagrams(\n container: HTMLElement,\n theme: 'dark' | 'light' | 'navy' = 'dark',\n): Promise<void> {\n // Guard: SSR/Node.js environments have no DOM\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n console.warn('[presentation-kit] renderMermaidDiagrams skipped: no DOM available (SSR)');\n return;\n }\n\n const mermaid = await getMermaid();\n const isDark = theme === 'dark' || theme === 'navy';\n\n mermaid.initialize(getMermaidConfig(isDark));\n\n // Find mermaid code blocks in container\n const codeNodes = Array.from(\n container.querySelectorAll('pre > code, pre, .marp-mermaid-rendered'),\n );\n\n const mermaidNodes = codeNodes.filter((node) => {\n if ((node as HTMLElement).classList.contains('marp-mermaid-rendered')) return true;\n const text = node.textContent?.trim() || '';\n const className = (node as HTMLElement).className || '';\n\n // Never treat frontmatter or large blocks as mermaid\n if (text.startsWith('---') || text.includes('marp: true') || text.length > 2500) {\n return false;\n }\n\n return (\n className.includes('language-mermaid') ||\n className.includes('language-diagram') ||\n className.includes('language-graph') ||\n isValidMermaidCode(text)\n );\n });\n\n if (mermaidNodes.length === 0) return;\n\n for (let i = 0; i < mermaidNodes.length; i++) {\n const node = mermaidNodes[i] as HTMLElement;\n const isAlreadyWrapper = node.classList.contains('marp-mermaid-rendered');\n const rawChartCode = isAlreadyWrapper\n ? node.getAttribute('data-chart-code') || ''\n : node.textContent?.trim() || '';\n\n if (!rawChartCode) continue;\n\n const preEl = isAlreadyWrapper\n ? node\n : node.tagName.toLowerCase() === 'pre'\n ? node\n : node.parentElement;\n if (!preEl) continue;\n\n const sanitizedCode = sanitizeMermaidCode(rawChartCode, isDark);\n const diagId = `slide_mermaid_${Date.now()}_${i}_${Math.floor(Math.random() * 10000)}`;\n\n try {\n let { svg } = await mermaid.render(diagId, sanitizedCode);\n\n // Strip SVG clip-path attributes to eliminate clipping issues\n svg = svg\n .replace(/clip-path=\"url\\(#[^\"]+\\)\"/gi, '')\n .replace(/clip-path=\"[^\"]*\"/gi, '')\n .replace(/<clipPath[\\s\\S]*?<\\/clipPath>/gi, '');\n\n const wrapper = document.createElement('div');\n wrapper.className =\n 'marp-mermaid-rendered my-3 flex items-center justify-center p-3 rounded-xl bg-black/5 dark:bg-white/5 border border-black/10 dark:border-white/10 [&_svg]:max-w-full [&_svg]:h-auto';\n wrapper.setAttribute('data-chart-code', rawChartCode);\n wrapper.setAttribute('data-mermaid-processed', 'true');\n wrapper.innerHTML = svg;\n preEl.replaceWith(wrapper);\n } catch (renderErr) {\n console.warn('[presentation-kit] Mermaid render error:', renderErr);\n }\n }\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Shiki Plugin — Lazy singleton syntax highlighting for code blocks\n// Pattern: Ported from Slidev composables/useShiki.ts\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { Highlighter } from 'shiki';\n\n/** Singleton highlighter promise — created once, reused everywhere */\nlet highlighterPromise: Promise<Highlighter> | null = null;\n/** Track if singleton init failed so we can retry */\nlet highlighterFailed = false;\n\n/** Supported languages for syntax highlighting */\nconst SUPPORTED_LANGS = [\n 'javascript',\n 'typescript',\n 'python',\n 'cpp',\n 'c',\n 'java',\n 'html',\n 'css',\n 'json',\n 'yaml',\n 'bash',\n 'shell',\n 'sql',\n 'go',\n 'rust',\n 'swift',\n 'kotlin',\n 'ruby',\n 'php',\n 'xml',\n 'markdown',\n 'dockerfile',\n 'toml',\n 'ini',\n 'graphql',\n 'prisma',\n 'solidity',\n] as const;\n\n/**\n * Get or create the Shiki highlighter singleton.\n * First call lazy-loads the WASM module (~3MB); subsequent calls return cached instance.\n */\nexport async function getHighlighter(): Promise<Highlighter> {\n if (highlighterFailed) {\n // Reset so we can retry after a failure\n highlighterPromise = null;\n highlighterFailed = false;\n }\n\n if (!highlighterPromise) {\n highlighterPromise = import('shiki')\n .then((mod) =>\n mod.createHighlighter({\n themes: ['vitesse-dark', 'vitesse-light'],\n langs: [...SUPPORTED_LANGS],\n }),\n )\n .catch((err) => {\n // Reset singleton on failure so next call retries\n highlighterPromise = null;\n highlighterFailed = true;\n throw new Error(`[presentation-kit] Failed to load Shiki highlighter: ${err}`);\n });\n }\n return highlighterPromise;\n}\n\n/**\n * Decode HTML entities in code content (e.g. < → <, & → &)\n */\nfunction decodeHtmlEntities(html: string): string {\n return html\n .replace(/&/g, '&') // MUST be first to avoid double-decode (e.g. &lt; → < → <)\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/ /g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCharCode(Number(code)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex: string) => String.fromCharCode(parseInt(hex, 16)));\n}\n\n/**\n * Map slide theme name to Shiki theme.\n */\nfunction getShikiTheme(theme: string): string {\n if (theme === 'light') return 'vitesse-light';\n return 'vitesse-dark';\n}\n\n/**\n * Post-process rendered HTML: replace <pre><code class=\"language-xxx\"> blocks\n * with Shiki-highlighted HTML.\n *\n * This is async because Shiki WASM must be loaded on first call.\n */\nexport async function highlightCodeBlocks(\n html: string,\n theme: string = 'dark',\n): Promise<string> {\n // Quick check — if no code blocks, return early\n if (!html.includes('<pre><code')) return html;\n\n const highlighter = await getHighlighter();\n const shikiTheme = getShikiTheme(theme);\n\n // Replace <pre><code class=\"language-xxx\">...</code></pre>\n return html.replace(\n /<pre><code class=\"language-(\\w+)\">([\\s\\S]*?)<\\/code><\\/pre>/g,\n (_, lang: string, code: string) => {\n const decoded = decodeHtmlEntities(code);\n try {\n return highlighter.codeToHtml(decoded, { lang, theme: shikiTheme });\n } catch {\n // If language not supported, return original\n return `<pre><code class=\"language-${lang}\">${code}</code></pre>`;\n }\n },\n );\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click Preprocessor — Convert <!-- click --> / <!-- clicks --> to wrapped divs\n// Runs BEFORE Marp renders. Wraps content INSIDE divs for robust HTML structure.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickPreprocessResult {\n /** Processed markdown with HTML click markers */\n markdown: string;\n /** Total number of click groups assigned */\n totalClicks: number;\n}\n\n/**\n * Preprocess markdown to convert click directives to HTML wrappers.\n *\n * Syntax:\n * - `<!-- click -->` → Block-level: wraps next block in data-click-group=\"N\"\n * - `<!-- clicks -->` → Item-level: marks list for auto-expansion in postprocessor\n *\n * Auto-assigns sequential indices (1, 2, 3, ...) based on order of appearance.\n *\n * IMPORTANT: Skips code fences (``` ... ```) to avoid converting directives\n * inside code blocks.\n *\n * Strategy: Each `<!-- click -->` opens a `<div data-click-group=\"N\">` that wraps\n * all content until the next `<!-- click -->` / `<!-- clicks -->` or end of slide.\n * The postprocessor only needs to handle `<!-- clicks -->` (list expansion).\n */\nexport function preprocessClicks(markdown: string): ClickPreprocessResult {\n if (!markdown || !markdown.trim()) {\n return { markdown, totalClicks: 0 };\n }\n\n // Split markdown into segments: code fences vs normal content\n // Code fences are preserved untouched\n const segments = splitByCodeFences(markdown);\n\n let clickIndex = 0;\n let totalClicks = 0;\n let inClickBlock = false;\n\n const processed = segments\n .map((segment) => {\n // Code fences — pass through untouched\n if (segment.isCodeFence) {\n return segment.content;\n }\n\n // Normal content — process click directives\n let content = segment.content;\n\n // Replace <!-- click --> and <!-- clicks --> with HTML markers\n content = content.replace(\n /^<!--\\s*(click|clicks)\\s*-->$/gm,\n (match, type: string) => {\n clickIndex++;\n\n // Close previous click block if open\n const closePrev = inClickBlock ? '</div>\\n' : '';\n inClickBlock = true;\n\n if (type === 'clicks') {\n totalClicks++;\n // clicks marker — will be expanded in postprocessor\n return `${closePrev}<div data-clicks=\"${clickIndex}\">`;\n } else {\n totalClicks++;\n // click marker — wraps everything until next marker\n return `${closePrev}<div data-click-group=\"${clickIndex}\">`;\n }\n },\n );\n\n return content;\n })\n .join('');\n\n // Close the last click block if open\n const result = inClickBlock ? processed + '</div>' : processed;\n\n return { markdown: result, totalClicks };\n}\n\n/** Represents a segment of markdown (either code fence or normal content) */\ninterface Segment {\n content: string;\n isCodeFence: boolean;\n}\n\n/**\n * Split markdown into code fence and non-code-fence segments.\n * Code fences (``` ... ```) are preserved untouched.\n */\nfunction splitByCodeFences(markdown: string): Segment[] {\n const segments: Segment[] = [];\n const regex = /^(```[\\s\\S]*?^```)/gm;\n\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(markdown)) !== null) {\n // Add non-code content before this fence\n if (match.index > lastIndex) {\n segments.push({\n content: markdown.slice(lastIndex, match.index),\n isCodeFence: false,\n });\n }\n // Add the code fence itself\n segments.push({\n content: match[0],\n isCodeFence: true,\n });\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining content\n if (lastIndex < markdown.length) {\n segments.push({\n content: markdown.slice(lastIndex),\n isCodeFence: false,\n });\n }\n\n return segments;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click Postprocessor — Expand <!-- clicks --> list items after Marp render\n//\n// The preprocessor already handles <!-- click --> wrapping (block-level).\n// This postprocessor only handles <!-- clicks --> (item-level list expansion).\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickPostprocessResult {\n /** HTML with click groups applied */\n html: string;\n /** Total number of individual click groups (after expanding clicks) */\n totalClicks: number;\n}\n\n/**\n * Post-process rendered Marp HTML to expand clicks (item-level) list items.\n *\n * The preprocessor wraps <!-- click --> blocks in <div data-click-group=\"N\">.\n * This postprocessor handles <!-- clicks --> by splitting list items into\n * individual click groups.\n *\n * Pattern: <div data-clicks=\"N\">...<ul><li>...</li></ul>...</div>\n * Becomes: multiple <div data-click-group=\"N\">...<ul><li>...</li></ul>...</div>\n *\n * @param html - Raw Marp-rendered HTML (with click-group and clicks markers)\n * @returns HTML with all click groups expanded\n */\nexport function postprocessClicks(html: string): ClickPostprocessResult {\n if (!html || !html.includes('data-clicks')) {\n // No clicks markers — count existing click-groups\n const totalClicks = extractMaxClicks(html);\n return { html, totalClicks };\n }\n\n let result = html;\n let totalClicks = 0;\n\n // Handle <!-- clicks --> markers: expand list items into individual click groups\n // Pattern: <div data-clicks=\"N\">...(content with <ul>/<ol>)...</div>\n result = result.replace(\n /<div data-clicks=\"(\\d+)\">([\\s\\S]*?)<\\/div>/g,\n (_, startIdx: string, innerContent: string) => {\n const start = parseInt(startIdx, 10);\n\n // Check if inner content contains a list\n const listMatch = innerContent.match(/((?:<[^>]+>)*?<(?:ul|ol)[^>]*>[\\s\\S]*?<\\/(?:ul|ol)>)/);\n\n if (!listMatch) {\n // No list found — treat as single click group\n totalClicks++;\n return `<div data-click-group=\"${start}\">${innerContent}</div>`;\n }\n\n // Extract list items\n const listBlock = listMatch[0];\n const liRegex = /<li[^>]*>[\\s\\S]*?<\\/li>/g;\n const items: string[] = [];\n let liMatch;\n while ((liMatch = liRegex.exec(listBlock)) !== null) {\n items.push(liMatch[0]);\n }\n\n if (items.length === 0) {\n totalClicks++;\n return `<div data-click-group=\"${start}\">${innerContent}</div>`;\n }\n\n // Get list wrapper tags\n const listOpenTag = listBlock.match(/<(ul|ol)[^>]*>/)?.[0] ?? '<ul>';\n const listCloseTag = listBlock.match(/<\\/(ul|ol)>$/)?.[0] ?? '</ul>';\n\n // Wrap each item in its own click group\n let clickIdx = start;\n const wrappedItems = items.map((item) => {\n const idx = clickIdx++;\n totalClicks++;\n return `<div data-click-group=\"${idx}\">${listOpenTag}${item}${listCloseTag}</div>`;\n });\n\n return wrappedItems.join('\\n');\n },\n );\n\n // Also count any click-groups that were already in the HTML (from <!-- click -->)\n const existingGroups = extractMaxClicks(result);\n if (existingGroups > totalClicks) {\n totalClicks = existingGroups;\n }\n\n return { html: result, totalClicks };\n}\n\n/**\n * Extract max click index from rendered HTML.\n * Scans for all data-click-group=\"N\" attributes and returns the max N.\n */\nexport function extractMaxClicks(html: string): number {\n const matches = html.match(/data-click-group=\"(\\d+)\"/g);\n if (!matches) return 0;\n\n let max = 0;\n for (const match of matches) {\n const num = parseInt(match.match(/data-click-group=\"(\\d+)\"/)?.[1] ?? '0', 10);\n if (num > max) max = num;\n }\n return max;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click CSS — Scoped CSS for click-to-reveal animations\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickCssOptions {\n /** Container ID to scope CSS (default: no scope, global) */\n containerId?: string;\n /** Animation duration in ms (default: 300) */\n duration?: number;\n /** Animation easing (default: 'ease') */\n easing?: string;\n /** Y offset for slide-up animation in px (default: 8) */\n offsetY?: number;\n /** Use slide-up animation (default: true) */\n slideUp?: boolean;\n /** Use fade animation (default: true) */\n fade?: boolean;\n}\n\n/**\n * Generate CSS for click-to-reveal system.\n *\n * Elements with `data-click-group=\"N\"` are hidden by default.\n * Adding class `visible` reveals them with animation.\n *\n * @param options - Animation options\n * @returns CSS string to inject via <style>\n */\nexport function generateClickCss(options?: ClickCssOptions): string {\n const {\n containerId,\n duration = 300,\n easing = 'ease',\n offsetY = 8,\n slideUp = true,\n fade = true,\n } = options ?? {};\n\n const prefix = containerId ? `#${containerId} ` : '';\n\n const opacityFrom = fade ? '0' : '1';\n const transformFrom = slideUp ? `translateY(${offsetY}px)` : 'none';\n const opacityTo = '1';\n const transformTo = 'translateY(0)';\n\n return `\n/* ── Click-to-Reveal System ── */\n${prefix}[data-click-group] {\n opacity: ${opacityFrom};\n ${slideUp ? `transform: ${transformFrom};` : ''}\n transition: opacity ${duration}ms ${easing}, transform ${duration}ms ${easing};\n pointer-events: none;\n}\n\n${prefix}[data-click-group].visible {\n opacity: ${opacityTo};\n ${slideUp ? `transform: ${transformTo};` : ''}\n pointer-events: auto;\n}\n\n`;\n}\n","import yaml from 'js-yaml';\nimport type { LayoutBoxConfig, SlideLayoutData } from '../../types.js';\n\n/**\n * Check if a comment string represents a layout definition\n */\nexport function isLayoutComment(comment: string): boolean {\n const trimmed = comment.trim();\n return trimmed.startsWith('layout:') || trimmed.startsWith('layout :');\n}\n\n/**\n * Parse YAML layout data from a comment string\n */\nexport function parseLayoutFromComment(comment: string): SlideLayoutData | null {\n try {\n const trimmed = comment.trim();\n if (!isLayoutComment(trimmed)) return null;\n\n const parsed = yaml.load(trimmed) as { layout?: { boxes?: LayoutBoxConfig[] }; boxes?: LayoutBoxConfig[] } | null;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const boxes = parsed.boxes ?? parsed.layout?.boxes;\n if (Array.isArray(boxes)) {\n return { boxes };\n }\n return null;\n } catch (err) {\n console.warn('[presentation-kit] Failed to parse layout comment YAML:', err);\n return null;\n }\n}\n\n/**\n * Filter presenter notes from a slide's comment list,\n * excluding layout blocks and Marp system directives.\n */\nexport function filterPresenterNotes(comments: string[]): string[] {\n return comments\n .map(c => c.trim())\n .filter(c => {\n if (!c) return false;\n // Skip layout definitions\n if (isLayoutComment(c)) return false;\n // Skip Marp directives like <!-- _backgroundColor: ... --> or <!-- paginate: true -->\n if (/^_?[a-zA-Z0-9_-]+\\s*:/i.test(c) && !c.toLowerCase().startsWith('note:')) {\n return false;\n }\n return true;\n })\n .map(c => {\n // If starts with \"note:\" or \"_note:\", strip the prefix\n return c.replace(/^_?note:\\s*/i, '').trim();\n });\n}\n\n/**\n * Extract per-slide layout data and presenter notes from Marp's comments array.\n */\nexport function extractLayoutsAndNotes(rawComments: (string[] | undefined)[]): {\n layouts: (SlideLayoutData | null)[];\n notes: string[][];\n} {\n const layouts: (SlideLayoutData | null)[] = [];\n const notes: string[][] = [];\n\n for (const slideComments of rawComments) {\n if (!slideComments || slideComments.length === 0) {\n layouts.push(null);\n notes.push([]);\n continue;\n }\n\n let slideLayout: SlideLayoutData | null = null;\n\n for (const comment of slideComments) {\n if (isLayoutComment(comment)) {\n const parsed = parseLayoutFromComment(comment);\n if (parsed) {\n slideLayout = parsed;\n }\n }\n }\n\n layouts.push(slideLayout);\n notes.push(filterPresenterNotes(slideComments));\n }\n\n return { layouts, notes };\n}\n","import type { SlideLayoutData } from '../../types.js';\n\n/**\n * Generate scoped CSS for per-slide layout overrides.\n *\n * Targets each slide's section within Marp's 1280x720 SVG coordinate space.\n */\nexport function generateLayoutCss(\n layouts: (SlideLayoutData | null)[],\n containerId: string = 'marp-container'\n): string {\n const cssRules: string[] = [];\n\n layouts.forEach((layout, index) => {\n if (!layout || !layout.boxes || layout.boxes.length === 0) return;\n\n const slideNum = index + 1;\n const slideSectionSelector = `#${containerId} svg[data-marpit-svg]:nth-of-type(${slideNum}) section, #${containerId} .marpit > svg:nth-of-type(${slideNum}) section`;\n\n // Make section position: relative so absolute boxes position correctly within 1280x720 canvas\n cssRules.push(`\n/* Slide ${slideNum} Layout Container */\n${slideSectionSelector} {\n position: relative !important;\n display: block !important;\n}`);\n\n for (const box of layout.boxes) {\n if (!box || !Array.isArray(box.pos) || box.pos.length < 4) continue;\n\n const [x, y, w, h] = box.pos;\n // Target selector inside the slide\n const targetSelector = box.target || `[data-box-id=\"${box.id}\"]`;\n const ruleSelector = `${slideSectionSelector} ${targetSelector}`;\n\n const styles: string[] = [\n `position: absolute !important`,\n `left: ${Math.round(x)}px !important`,\n `top: ${Math.round(y)}px !important`,\n `width: ${Math.round(w)}px !important`,\n `min-height: ${Math.round(h)}px !important`,\n `box-sizing: border-box !important`,\n `margin: 0 !important`,\n ];\n\n if (box.fontSize) {\n styles.push(`font-size: ${box.fontSize} !important`);\n }\n if (box.color) {\n styles.push(`color: ${box.color} !important`);\n }\n if (box.textAlign) {\n styles.push(`text-align: ${box.textAlign} !important`);\n }\n if (box.style) {\n styles.push(box.style);\n }\n\n cssRules.push(`\n${ruleSelector} {\n ${styles.join(';\\n ')};\n}`);\n }\n });\n\n return cssRules.join('\\n');\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Core Render — Client-side Marp rendering\n// Replaces: apps/web/app/api/render-marp (server-side HTTP roundtrip)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { Marp } from '@marp-team/marp-core';\nimport type { SlideRenderResult, SlideRenderAsyncResult, SlideRenderOptions, MermaidBlock } from '../types.js';\nimport { convertTextArrows } from './arrow-converter.js';\nimport { extractMarpSource } from './source-extractor.js';\nimport { resolveTheme, generateScopedCss } from '../themes/index.js';\nimport { detectMermaidBlocks } from '../plugins/mermaid.js';\nimport { highlightCodeBlocks } from '../plugins/shiki.js';\nimport { preprocessClicks } from '../vclick/preprocessor.js';\nimport { postprocessClicks } from '../vclick/postprocessor.js';\nimport { generateClickCss } from '../vclick/click-css.js';\nimport { extractLayoutsAndNotes, generateLayoutCss } from './layout/index.js';\n\ninterface RenderMarpResult {\n html: string;\n css: string;\n comments: (string[] | undefined)[];\n maxClicks: number;\n}\n\n/**\n * Low-level synchronous Marp render.\n * Preprocesses clicks, converts arrows, renders Marp, postprocesses clicks.\n */\nexport function renderMarp(\n markdown: string,\n containerId: string = 'marp-container',\n enableClicks: boolean = false,\n): RenderMarpResult {\n const cleanSource = extractMarpSource(markdown);\n \n const { markdown: clickProcessed, totalClicks } = enableClicks\n ? preprocessClicks(cleanSource)\n : { markdown: cleanSource, totalClicks: 0 };\n \n const arrowsConverted = convertTextArrows(clickProcessed);\n\n const marp = new Marp({\n container: { tag: 'div', id: containerId },\n html: true,\n emoji: { unicode: true },\n });\n\n const { html, css, comments } = marp.render(arrowsConverted);\n\n // Postprocess click groups if clicks were preprocessed\n if (enableClicks && totalClicks > 0) {\n const { html: processedHtml, totalClicks: finalClicks } = postprocessClicks(html);\n return { html: processedHtml, css, comments: (comments ?? []) as (string[] | undefined)[], maxClicks: finalClicks };\n }\n\n return { html, css, comments: (comments ?? []) as (string[] | undefined)[], maxClicks: 0 };\n}\n\n/**\n * Count slides in rendered Marp HTML by detecting <svg data-marpit-svg> elements.\n */\nexport function countSlides(html: string): number {\n const matches = html.match(/<svg[^>]*data-marpit-svg/g);\n return matches ? matches.length : 1;\n}\n\n/**\n * High-level synchronous render — resolves theme, generates scoped CSS,\n * detects mermaid blocks. Does NOT apply Shiki or Mermaid rendering.\n */\nexport function renderSlide(\n markdown: string,\n options?: SlideRenderOptions,\n): SlideRenderResult {\n const containerId = options?.containerId ?? 'marp-container';\n const theme = resolveTheme(options?.theme ?? 'dark');\n const enableClicks = options?.enableClicks ?? false;\n\n const { html, css, comments, maxClicks } = renderMarp(markdown, containerId, enableClicks);\n const themeCss = generateScopedCss(theme, containerId);\n const slideCount = countSlides(html);\n const mermaidBlocks = options?.enableMermaid !== false\n ? detectMermaidBlocks(html)\n : [];\n const clickCss = enableClicks\n ? generateClickCss({ containerId })\n : '';\n\n const { layouts, notes } = extractLayoutsAndNotes(comments);\n const layoutCss = generateLayoutCss(layouts, containerId);\n\n return {\n html,\n css,\n themeCss,\n layoutCss,\n slideCount,\n mermaidBlocks,\n clickCss,\n maxClicks,\n notes,\n layouts,\n };\n}\n\n/**\n * High-level async render — applies Shiki syntax highlighting.\n * Mermaid blocks are returned separately (DOM-based, consumer renders them).\n */\nexport async function renderSlideAsync(\n markdown: string,\n options?: SlideRenderOptions,\n): Promise<SlideRenderAsyncResult> {\n const containerId = options?.containerId ?? 'marp-container';\n const theme = resolveTheme(options?.theme ?? 'dark');\n const enableClicks = options?.enableClicks ?? false;\n\n const { html, css, comments, maxClicks } = renderMarp(markdown, containerId, enableClicks);\n const themeCss = generateScopedCss(theme, containerId);\n const slideCount = countSlides(html);\n const mermaidBlocks = options?.enableMermaid !== false\n ? detectMermaidBlocks(html)\n : [];\n const clickCss = enableClicks\n ? generateClickCss({ containerId })\n : '';\n\n const { layouts, notes } = extractLayoutsAndNotes(comments);\n const layoutCss = generateLayoutCss(layouts, containerId);\n\n // Apply Shiki syntax highlighting\n const enableShiki = options?.enableShiki ?? true;\n const processedHtml = enableShiki\n ? await highlightCodeBlocks(html, theme.name)\n : html;\n\n return {\n html,\n css,\n themeCss,\n layoutCss,\n processedHtml,\n slideCount,\n mermaidBlocks,\n clickCss,\n maxClicks,\n notes,\n layouts,\n };\n}\n"]}
|