@thanh01.pmt/presentation-kit 0.2.9 → 0.2.10

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkTV6NFIIV_cjs = require('../chunk-TV6NFIIV.cjs');
3
+ var chunk3Q4RMZVQ_cjs = require('../chunk-3Q4RMZVQ.cjs');
4
4
  var zod = require('zod');
5
5
 
6
6
  var listSlidePresetsSchema = zod.z.object({
@@ -64,7 +64,7 @@ var generateDeckOutlineSchema = zod.z.object({
64
64
  // src/ai/tools.ts
65
65
  function executeListSlidePresets(params) {
66
66
  const category = params?.category;
67
- const presets = !category || category === "all" ? chunkTV6NFIIV_cjs.SLIDE_LAYOUT_PRESETS : chunkTV6NFIIV_cjs.getSlideLayoutPresetsByCategory(category);
67
+ const presets = !category || category === "all" ? chunk3Q4RMZVQ_cjs.SLIDE_LAYOUT_PRESETS : chunk3Q4RMZVQ_cjs.getSlideLayoutPresetsByCategory(category);
68
68
  return {
69
69
  count: presets.length,
70
70
  presets: presets.map((p) => ({
@@ -78,7 +78,7 @@ function executeListSlidePresets(params) {
78
78
  };
79
79
  }
80
80
  function executeCreateSlideFromPreset(params) {
81
- const preset = chunkTV6NFIIV_cjs.getSlideLayoutPresetById(params.presetId);
81
+ const preset = chunk3Q4RMZVQ_cjs.getSlideLayoutPresetById(params.presetId);
82
82
  if (!preset) {
83
83
  return {
84
84
  success: false,
@@ -86,7 +86,7 @@ function executeCreateSlideFromPreset(params) {
86
86
  error: `Preset with ID "${params.presetId}" not found. Use listSlidePresets to see available layout templates.`
87
87
  };
88
88
  }
89
- const layoutComment = chunkTV6NFIIV_cjs.serializeLayoutToComment(preset.layout);
89
+ const layoutComment = chunk3Q4RMZVQ_cjs.serializeLayoutToComment(preset.layout);
90
90
  const title = params.title;
91
91
  const subtitle = params.subtitle ? `
92
92
  ### ${params.subtitle}` : "";
@@ -227,7 +227,7 @@ Presenter Notes:
227
227
  function executeApplySlideLayout(params) {
228
228
  let layoutData = null;
229
229
  if (params.presetId) {
230
- const preset = chunkTV6NFIIV_cjs.getSlideLayoutPresetById(params.presetId);
230
+ const preset = chunk3Q4RMZVQ_cjs.getSlideLayoutPresetById(params.presetId);
231
231
  if (!preset) {
232
232
  return {
233
233
  success: false,
@@ -239,7 +239,7 @@ function executeApplySlideLayout(params) {
239
239
  } else if (params.boxes && params.boxes.length > 0) {
240
240
  layoutData = { boxes: params.boxes };
241
241
  }
242
- const updatedMarkdown = chunkTV6NFIIV_cjs.updateSlideLayoutInMarkdown(
242
+ const updatedMarkdown = chunk3Q4RMZVQ_cjs.updateSlideLayoutInMarkdown(
243
243
  params.markdown,
244
244
  params.slideIndex,
245
245
  layoutData
@@ -250,7 +250,7 @@ function executeApplySlideLayout(params) {
250
250
  };
251
251
  }
252
252
  function executeUpdatePresenterNotes(params) {
253
- const { frontmatter, slides } = chunkTV6NFIIV_cjs.splitMarkdownSlides(params.markdown);
253
+ const { frontmatter, slides } = chunk3Q4RMZVQ_cjs.splitMarkdownSlides(params.markdown);
254
254
  if (params.slideIndex < 0 || params.slideIndex >= slides.length) {
255
255
  return {
256
256
  success: false,
package/dist/ai/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetsByCategory, getSlideLayoutPresetById, serializeLayoutToComment, updateSlideLayoutInMarkdown, splitMarkdownSlides } from '../chunk-ZPASRL75.js';
1
+ import { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetsByCategory, getSlideLayoutPresetById, serializeLayoutToComment, updateSlideLayoutInMarkdown, splitMarkdownSlides } from '../chunk-V6X7D44H.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  var listSlidePresetsSchema = z.object({
@@ -96,17 +96,6 @@ function updateSlideLayoutInMarkdown(markdown, slideIndex, layout) {
96
96
 
97
97
  ${trimmed}`;
98
98
  }
99
- if (layout && layout.boxes) {
100
- for (const box of layout.boxes) {
101
- if (box.content && box.content.trim() && !slideContent.includes(box.content.trim())) {
102
- const prefix = box.target === "h1" ? "# " : box.target === "h2" ? "## " : box.target === "h3" ? "### " : "";
103
- slideContent = `${slideContent.trimEnd()}
104
-
105
- ${prefix}${box.content.trim()}
106
- `;
107
- }
108
- }
109
- }
110
99
  slides[slideIndex] = slideContent;
111
100
  const joinedSlides = slides.join("\n---\n");
112
101
  if (frontmatter) {
@@ -874,5 +863,5 @@ exports.serializeLayoutToComment = serializeLayoutToComment;
874
863
  exports.splitMarkdownSlides = splitMarkdownSlides;
875
864
  exports.updateSlideLayoutInMarkdown = updateSlideLayoutInMarkdown;
876
865
  exports.updateSlideTextInMarkdown = updateSlideTextInMarkdown;
877
- //# sourceMappingURL=chunk-TV6NFIIV.cjs.map
878
- //# sourceMappingURL=chunk-TV6NFIIV.cjs.map
866
+ //# sourceMappingURL=chunk-3Q4RMZVQ.cjs.map
867
+ //# sourceMappingURL=chunk-3Q4RMZVQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/layout/serializer.ts","../src/core/layout/presets.ts"],"names":["yaml"],"mappings":"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","file":"chunk-3Q4RMZVQ.cjs","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"]}
@@ -90,17 +90,6 @@ function updateSlideLayoutInMarkdown(markdown, slideIndex, layout) {
90
90
 
91
91
  ${trimmed}`;
92
92
  }
93
- if (layout && layout.boxes) {
94
- for (const box of layout.boxes) {
95
- if (box.content && box.content.trim() && !slideContent.includes(box.content.trim())) {
96
- const prefix = box.target === "h1" ? "# " : box.target === "h2" ? "## " : box.target === "h3" ? "### " : "";
97
- slideContent = `${slideContent.trimEnd()}
98
-
99
- ${prefix}${box.content.trim()}
100
- `;
101
- }
102
- }
103
- }
104
93
  slides[slideIndex] = slideContent;
105
94
  const joinedSlides = slides.join("\n---\n");
106
95
  if (frontmatter) {
@@ -861,5 +850,5 @@ function getSlideLayoutPresetsByCategory(category) {
861
850
  }
862
851
 
863
852
  export { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, removeSlideElementFromMarkdown, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown };
864
- //# sourceMappingURL=chunk-ZPASRL75.js.map
865
- //# sourceMappingURL=chunk-ZPASRL75.js.map
853
+ //# sourceMappingURL=chunk-V6X7D44H.js.map
854
+ //# sourceMappingURL=chunk-V6X7D44H.js.map
@@ -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"]}
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkTGI6YSZP_cjs = require('./chunk-TGI6YSZP.cjs');
4
- var chunkTV6NFIIV_cjs = require('./chunk-TV6NFIIV.cjs');
4
+ var chunk3Q4RMZVQ_cjs = require('./chunk-3Q4RMZVQ.cjs');
5
5
 
6
6
  // src/engine.ts
7
7
  function createEngine(config = {}) {
@@ -102,7 +102,7 @@ async function convertMarkdownToPptx(markdown, options) {
102
102
  if (options?.title) pptx.title = options.title;
103
103
  if (options?.author) pptx.author = options.author;
104
104
  const renderResult = chunkTGI6YSZP_cjs.renderSlide(markdown);
105
- const { slides } = chunkTV6NFIIV_cjs.splitMarkdownSlides(markdown);
105
+ const { slides } = chunk3Q4RMZVQ_cjs.splitMarkdownSlides(markdown);
106
106
  const isDark = options?.theme !== "light";
107
107
  const defaultBg = isDark ? "14151B" : "FFFFFF";
108
108
  const defaultText = isDark ? "F1F5F9" : "1E293B";
@@ -313,35 +313,35 @@ Object.defineProperty(exports, "sanitizeMermaidCode", {
313
313
  });
314
314
  Object.defineProperty(exports, "SLIDE_LAYOUT_PRESETS", {
315
315
  enumerable: true,
316
- get: function () { return chunkTV6NFIIV_cjs.SLIDE_LAYOUT_PRESETS; }
316
+ get: function () { return chunk3Q4RMZVQ_cjs.SLIDE_LAYOUT_PRESETS; }
317
317
  });
318
318
  Object.defineProperty(exports, "getSlideLayoutPresetById", {
319
319
  enumerable: true,
320
- get: function () { return chunkTV6NFIIV_cjs.getSlideLayoutPresetById; }
320
+ get: function () { return chunk3Q4RMZVQ_cjs.getSlideLayoutPresetById; }
321
321
  });
322
322
  Object.defineProperty(exports, "getSlideLayoutPresetsByCategory", {
323
323
  enumerable: true,
324
- get: function () { return chunkTV6NFIIV_cjs.getSlideLayoutPresetsByCategory; }
324
+ get: function () { return chunk3Q4RMZVQ_cjs.getSlideLayoutPresetsByCategory; }
325
325
  });
326
326
  Object.defineProperty(exports, "removeSlideElementFromMarkdown", {
327
327
  enumerable: true,
328
- get: function () { return chunkTV6NFIIV_cjs.removeSlideElementFromMarkdown; }
328
+ get: function () { return chunk3Q4RMZVQ_cjs.removeSlideElementFromMarkdown; }
329
329
  });
330
330
  Object.defineProperty(exports, "serializeLayoutToComment", {
331
331
  enumerable: true,
332
- get: function () { return chunkTV6NFIIV_cjs.serializeLayoutToComment; }
332
+ get: function () { return chunk3Q4RMZVQ_cjs.serializeLayoutToComment; }
333
333
  });
334
334
  Object.defineProperty(exports, "splitMarkdownSlides", {
335
335
  enumerable: true,
336
- get: function () { return chunkTV6NFIIV_cjs.splitMarkdownSlides; }
336
+ get: function () { return chunk3Q4RMZVQ_cjs.splitMarkdownSlides; }
337
337
  });
338
338
  Object.defineProperty(exports, "updateSlideLayoutInMarkdown", {
339
339
  enumerable: true,
340
- get: function () { return chunkTV6NFIIV_cjs.updateSlideLayoutInMarkdown; }
340
+ get: function () { return chunk3Q4RMZVQ_cjs.updateSlideLayoutInMarkdown; }
341
341
  });
342
342
  Object.defineProperty(exports, "updateSlideTextInMarkdown", {
343
343
  enumerable: true,
344
- get: function () { return chunkTV6NFIIV_cjs.updateSlideTextInMarkdown; }
344
+ get: function () { return chunk3Q4RMZVQ_cjs.updateSlideTextInMarkdown; }
345
345
  });
346
346
  exports.cleanHexColor = cleanHexColor;
347
347
  exports.convertMarkdownToPptx = convertMarkdownToPptx;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { resolveTheme, generateScopedCss2, renderSlideAsync, renderSlide } from './chunk-NYLDRVHZ.js';
2
2
  export { convertTextArrows, countSlides, darkThemeTokens, defineTheme, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, extractMaxClicks, filterPresenterNotes, generateClickCss, generateLayoutCss, generateScopedCss2 as generateScopedCss, generateScopedCss as generateScopedCssFromTokens, getHighlighter, getThemeTokens, highlightCodeBlocks, isLayoutComment, lightThemeTokens, navyThemeTokens, parseLayoutFromComment, postprocessClicks, preprocessClicks, renderMarp, renderMermaidDiagrams, renderSlide, renderSlideAsync, resolveTheme, sanitizeMermaidCode } from './chunk-NYLDRVHZ.js';
3
- import { splitMarkdownSlides } from './chunk-ZPASRL75.js';
4
- export { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, removeSlideElementFromMarkdown, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown } from './chunk-ZPASRL75.js';
3
+ import { splitMarkdownSlides } from './chunk-V6X7D44H.js';
4
+ export { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, removeSlideElementFromMarkdown, serializeLayoutToComment, splitMarkdownSlides, updateSlideLayoutInMarkdown, updateSlideTextInMarkdown } from './chunk-V6X7D44H.js';
5
5
 
6
6
  // src/engine.ts
7
7
  function createEngine(config = {}) {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkTGI6YSZP_cjs = require('../chunk-TGI6YSZP.cjs');
4
- var chunkTV6NFIIV_cjs = require('../chunk-TV6NFIIV.cjs');
4
+ var chunk3Q4RMZVQ_cjs = require('../chunk-3Q4RMZVQ.cjs');
5
5
  var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -611,10 +611,12 @@ function SlideDesignOverlay({
611
611
  setBoxes(layout?.boxes ?? []);
612
612
  }, [layout, slideIndex]);
613
613
  const selectedBox = boxes.find((b) => b.id === selectedId) ?? null;
614
+ const hasMovedRef = react.useRef(false);
614
615
  const [dragging, setDragging] = react.useState(null);
615
616
  const handleMouseDown = (e, box, type) => {
616
617
  e.preventDefault();
617
618
  e.stopPropagation();
619
+ hasMovedRef.current = false;
618
620
  setSelectedId(box.id);
619
621
  setDragging({
620
622
  type,
@@ -631,6 +633,9 @@ function SlideDesignOverlay({
631
633
  const scaleY = 720 / rect.height;
632
634
  const dx = (e.clientX - dragging.startX) * scaleX;
633
635
  const dy = (e.clientY - dragging.startY) * scaleY;
636
+ if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {
637
+ hasMovedRef.current = true;
638
+ }
634
639
  const [origX, origY, origW, origH] = dragging.startPos;
635
640
  setBoxes((prev) => {
636
641
  const updated = prev.map((b) => {
@@ -683,9 +688,10 @@ function SlideDesignOverlay({
683
688
  });
684
689
  }, [dragging, onLayoutChange]);
685
690
  const handleMouseUp = react.useCallback(() => {
686
- if (dragging && onSave) {
691
+ if (dragging && hasMovedRef.current && onSave) {
687
692
  onSave({ boxes });
688
693
  }
694
+ hasMovedRef.current = false;
689
695
  setDragging(null);
690
696
  }, [dragging, boxes, onSave]);
691
697
  react.useEffect(() => {
@@ -823,7 +829,7 @@ function SlideDesignOverlay({
823
829
  "select",
824
830
  {
825
831
  onChange: (e) => {
826
- const preset = chunkTV6NFIIV_cjs.SLIDE_LAYOUT_PRESETS.find((p) => p.id === e.target.value);
832
+ const preset = chunk3Q4RMZVQ_cjs.SLIDE_LAYOUT_PRESETS.find((p) => p.id === e.target.value);
827
833
  if (preset) {
828
834
  const clonedBoxes = JSON.parse(JSON.stringify(preset.layout.boxes));
829
835
  setBoxes(clonedBoxes);
@@ -843,7 +849,7 @@ function SlideDesignOverlay({
843
849
  title: "\xC1p d\u1EE5ng m\u1EABu b\u1ED1 c\u1EE5c c\xF3 s\u1EB5n",
844
850
  children: [
845
851
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, style: { backgroundColor: isLight ? "#ffffff" : "#1e1f29", color: subtextColor }, children: "M\u1EABu b\u1ED1 c\u1EE5c (Presets)..." }),
846
- chunkTV6NFIIV_cjs.SLIDE_LAYOUT_PRESETS.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.id, style: { backgroundColor: isLight ? "#ffffff" : "#1e1f29", color: isLight ? "#0f172a" : "#f8fafc" }, children: p.name }, p.id))
852
+ chunk3Q4RMZVQ_cjs.SLIDE_LAYOUT_PRESETS.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.id, style: { backgroundColor: isLight ? "#ffffff" : "#1e1f29", color: isLight ? "#0f172a" : "#f8fafc" }, children: p.name }, p.id))
847
853
  ]
848
854
  }
849
855
  ),
@@ -914,8 +920,9 @@ function SlideDesignOverlay({
914
920
  style: {
915
921
  width: "100%",
916
922
  height: "100%",
917
- background: "transparent",
918
- border: "none",
923
+ backgroundColor: isLight ? "#ffffff" : isNavy ? "#0b132b" : "#181920",
924
+ border: isLight ? "1px solid #0284c7" : "1px solid #38bdf8",
925
+ borderRadius: "4px",
919
926
  outline: "none",
920
927
  resize: "none",
921
928
  fontSize: box.fontSize ?? (box.target === "h1" ? "2.2rem" : "1.1rem"),
@@ -924,8 +931,9 @@ function SlideDesignOverlay({
924
931
  fontFamily: "Inter, sans-serif",
925
932
  fontWeight: box.target === "h1" ? 700 : 400,
926
933
  lineHeight: 1.25,
927
- padding: 0,
928
- margin: 0
934
+ padding: "4px 6px",
935
+ margin: 0,
936
+ boxShadow: "0 4px 16px rgba(0,0,0,0.25)"
929
937
  }
930
938
  }
931
939
  ) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -939,20 +947,9 @@ function SlideDesignOverlay({
939
947
  style: {
940
948
  width: "100%",
941
949
  height: "100%",
942
- fontSize: box.fontSize ?? (box.target === "h1" ? "2.2rem" : "1.1rem"),
943
- color: box.color ?? (isLight ? "#0f172a" : "#f8fafc"),
944
- textAlign: box.textAlign ?? "left",
945
- fontFamily: "Inter, sans-serif",
946
- fontWeight: box.target === "h1" ? 700 : 400,
947
- lineHeight: 1.25,
948
- wordBreak: "break-word",
949
- userSelect: "none",
950
- cursor: "pointer",
951
- display: "flex",
952
- alignItems: "center"
950
+ cursor: "pointer"
953
951
  },
954
- title: "Click \u0111\xFAp \u0111\u1EC3 s\u1EEDa ch\u1EEF",
955
- children: box.content ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: box.content }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { opacity: 0.45, fontStyle: "italic", fontSize: "12px" }, children: box.target === "h1" ? "Ti\xEAu \u0111\u1EC1 (Click \u0111\xFAp \u0111\u1EC3 s\u1EEDa)..." : "N\u1ED9i dung (Click \u0111\xFAp \u0111\u1EC3 s\u1EEDa)..." })
952
+ title: "Click \u0111\xFAp \u0111\u1EC3 s\u1EEDa ch\u1EEF"
956
953
  }
957
954
  )
958
955
  }
@@ -1465,7 +1462,7 @@ function SlideViewer({
1465
1462
  onSave: (layout) => {
1466
1463
  setLiveLayout(layout);
1467
1464
  if (onSaveMarkdown) {
1468
- const updated = chunkTV6NFIIV_cjs.updateSlideLayoutInMarkdown(markdown, currentIndex, layout);
1465
+ const updated = chunk3Q4RMZVQ_cjs.updateSlideLayoutInMarkdown(markdown, currentIndex, layout);
1469
1466
  onSaveMarkdown(updated);
1470
1467
  }
1471
1468
  },