@thanh01.pmt/presentation-kit 0.2.17 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +26 -0
  2. package/dist/ai/index.cjs +33 -28
  3. package/dist/ai/index.cjs.map +1 -1
  4. package/dist/ai/index.d.cts +4 -3
  5. package/dist/ai/index.d.ts +4 -3
  6. package/dist/ai/index.js +3 -2
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/assets/fonts/NOTICE.md +25 -0
  9. package/dist/assets/fonts/SOURCES.json +47 -0
  10. package/dist/assets/fonts/fira-code.woff2 +0 -0
  11. package/dist/assets/fonts/inter.woff2 +0 -0
  12. package/dist/assets/fonts/jetbrains-mono.woff2 +0 -0
  13. package/dist/assets/fonts/playfair-display.woff2 +0 -0
  14. package/dist/assets/fonts/plus-jakarta-sans.woff2 +0 -0
  15. package/dist/assets/fonts/space-grotesk.woff2 +0 -0
  16. package/dist/chunk-3Q4RMZVQ.cjs +867 -0
  17. package/dist/chunk-3Q4RMZVQ.cjs.map +1 -0
  18. package/dist/chunk-HSVXH7DD.cjs +1624 -0
  19. package/dist/chunk-HSVXH7DD.cjs.map +1 -0
  20. package/dist/{chunk-NYLDRVHZ.js → chunk-I5RG2L3M.js} +4 -78
  21. package/dist/chunk-I5RG2L3M.js.map +1 -0
  22. package/dist/{chunk-7QHDWDSB.js → chunk-INAOTYLK.cjs} +437 -849
  23. package/dist/chunk-INAOTYLK.cjs.map +1 -0
  24. package/dist/{chunk-TGI6YSZP.cjs → chunk-JBGGQGSQ.cjs} +4 -80
  25. package/dist/chunk-JBGGQGSQ.cjs.map +1 -0
  26. package/dist/{chunk-JNTRKKJX.cjs → chunk-OCP2TAY2.js} +421 -868
  27. package/dist/chunk-OCP2TAY2.js.map +1 -0
  28. package/dist/chunk-V6X7D44H.js +854 -0
  29. package/dist/chunk-V6X7D44H.js.map +1 -0
  30. package/dist/chunk-VRXEXUHR.js +1610 -0
  31. package/dist/chunk-VRXEXUHR.js.map +1 -0
  32. package/dist/{click-css-Bcc1CkTN.d.cts → click-css-C8VciwZ6.d.cts} +1 -1
  33. package/dist/{click-css-B2s9B_uP.d.ts → click-css-COIiFo1I.d.ts} +1 -1
  34. package/dist/index.cjs +143 -110
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +62 -6
  37. package/dist/index.d.ts +62 -6
  38. package/dist/index.js +6 -5
  39. package/dist/index.js.map +1 -1
  40. package/dist/node/index.cjs +117 -0
  41. package/dist/node/index.cjs.map +1 -0
  42. package/dist/node/index.d.cts +36 -0
  43. package/dist/node/index.d.ts +36 -0
  44. package/dist/node/index.js +105 -0
  45. package/dist/node/index.js.map +1 -0
  46. package/dist/{presets-D_hfPJX9.d.ts → presets-DPRGtpO-.d.ts} +1 -1
  47. package/dist/{presets-BYvgAAkJ.d.cts → presets-MIi91wZg.d.cts} +1 -1
  48. package/dist/react/index.cjs +17 -16
  49. package/dist/react/index.cjs.map +1 -1
  50. package/dist/react/index.d.cts +4 -3
  51. package/dist/react/index.d.ts +4 -3
  52. package/dist/react/index.js +4 -3
  53. package/dist/react/index.js.map +1 -1
  54. package/dist/skills/index.cjs +16 -12
  55. package/dist/skills/index.d.cts +36 -20
  56. package/dist/skills/index.d.ts +36 -20
  57. package/dist/skills/index.js +1 -1
  58. package/dist/{types-C3d04zzP.d.cts → types-CvxCxWus.d.cts} +1 -67
  59. package/dist/{types-C3d04zzP.d.ts → types-CvxCxWus.d.ts} +1 -67
  60. package/dist/types-k_eae8UV.d.cts +74 -0
  61. package/dist/types-k_eae8UV.d.ts +74 -0
  62. package/package.json +8 -2
  63. package/dist/chunk-6R6L6KSC.cjs +0 -601
  64. package/dist/chunk-6R6L6KSC.cjs.map +0 -1
  65. package/dist/chunk-7QHDWDSB.js.map +0 -1
  66. package/dist/chunk-BHJXQCVE.js +0 -588
  67. package/dist/chunk-BHJXQCVE.js.map +0 -1
  68. package/dist/chunk-JNTRKKJX.cjs.map +0 -1
  69. package/dist/chunk-NYLDRVHZ.js.map +0 -1
  70. package/dist/chunk-TGI6YSZP.cjs.map +0 -1
@@ -0,0 +1,867 @@
1
+ 'use strict';
2
+
3
+ var yaml = require('js-yaml');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var yaml__default = /*#__PURE__*/_interopDefault(yaml);
8
+
9
+ // src/core/layout/serializer.ts
10
+ function serializeLayoutToComment(layout) {
11
+ if (!layout.boxes || layout.boxes.length === 0) return "";
12
+ const cleanData = {
13
+ boxes: layout.boxes.map((box) => {
14
+ const b = {
15
+ id: box.id,
16
+ target: box.target || `h1`,
17
+ pos: [
18
+ Math.round(box.pos[0]),
19
+ Math.round(box.pos[1]),
20
+ Math.round(box.pos[2]),
21
+ Math.round(box.pos[3])
22
+ ]
23
+ };
24
+ if (box.fontSize) b.fontSize = box.fontSize;
25
+ if (box.color) b.color = box.color;
26
+ if (box.textAlign) b.textAlign = box.textAlign;
27
+ if (box.style) b.style = box.style;
28
+ return b;
29
+ })
30
+ };
31
+ const yamlStr = yaml__default.default.dump(cleanData, {
32
+ indent: 2,
33
+ lineWidth: -1,
34
+ noRefs: true
35
+ }).trim();
36
+ return `<!-- layout:
37
+ ${yamlStr.split("\n").join("\n ")}
38
+ -->`;
39
+ }
40
+ function splitMarkdownSlides(markdown) {
41
+ const lines = markdown.split("\n");
42
+ let frontmatter = null;
43
+ const slideBuffers = [];
44
+ let currentBuffer = [];
45
+ let inCodeFence = false;
46
+ let lineIdx = 0;
47
+ if (lines.length > 0 && lines[0].trim() === "---") {
48
+ const fmBuffer = [lines[0]];
49
+ lineIdx = 1;
50
+ while (lineIdx < lines.length) {
51
+ const line = lines[lineIdx];
52
+ fmBuffer.push(line);
53
+ if (line.trim() === "---") {
54
+ frontmatter = fmBuffer.join("\n");
55
+ lineIdx++;
56
+ break;
57
+ }
58
+ lineIdx++;
59
+ }
60
+ }
61
+ for (let i = lineIdx; i < lines.length; i++) {
62
+ const line = lines[i];
63
+ if (/^```/.test(line.trim())) {
64
+ inCodeFence = !inCodeFence;
65
+ currentBuffer.push(line);
66
+ continue;
67
+ }
68
+ if (!inCodeFence && line.trim() === "---") {
69
+ slideBuffers.push(currentBuffer);
70
+ currentBuffer = [];
71
+ continue;
72
+ }
73
+ currentBuffer.push(line);
74
+ }
75
+ slideBuffers.push(currentBuffer);
76
+ const slides = slideBuffers.map((b) => b.join("\n"));
77
+ return { frontmatter, slides };
78
+ }
79
+ function updateSlideLayoutInMarkdown(markdown, slideIndex, layout) {
80
+ const { frontmatter, slides } = splitMarkdownSlides(markdown);
81
+ if (slideIndex < 0 || slideIndex >= slides.length) {
82
+ return markdown;
83
+ }
84
+ let slideContent = slides[slideIndex];
85
+ const layoutCommentRegex = /<!--\s*layout:\s*[\s\S]*?-->/i;
86
+ const newComment = layout && layout.boxes && layout.boxes.length > 0 ? serializeLayoutToComment(layout) : "";
87
+ if (layoutCommentRegex.test(slideContent)) {
88
+ if (newComment) {
89
+ slideContent = slideContent.replace(layoutCommentRegex, newComment);
90
+ } else {
91
+ slideContent = slideContent.replace(layoutCommentRegex, "").trim();
92
+ }
93
+ } else if (newComment) {
94
+ const trimmed = slideContent.trimStart();
95
+ slideContent = `${newComment}
96
+
97
+ ${trimmed}`;
98
+ }
99
+ slides[slideIndex] = slideContent;
100
+ const joinedSlides = slides.join("\n---\n");
101
+ if (frontmatter) {
102
+ return `${frontmatter}
103
+
104
+ ${joinedSlides}`;
105
+ }
106
+ return joinedSlides;
107
+ }
108
+ function updateSlideTextInMarkdown(markdown, slideIndex, oldText, newText) {
109
+ const { frontmatter, slides } = splitMarkdownSlides(markdown);
110
+ if (slideIndex < 0 || slideIndex >= slides.length) {
111
+ return markdown;
112
+ }
113
+ const cleanOld = oldText.trim();
114
+ const cleanNew = newText.trim();
115
+ if (!cleanOld || cleanOld === cleanNew) return markdown;
116
+ let slideContent = slides[slideIndex];
117
+ if (slideContent.includes(cleanOld)) {
118
+ slideContent = slideContent.replace(cleanOld, cleanNew);
119
+ } else {
120
+ const lines = slideContent.split("\n");
121
+ let replaced = false;
122
+ for (let i = 0; i < lines.length; i++) {
123
+ const line = lines[i];
124
+ const stripped = line.replace(/^[#\s\-\*\>]+/, "").replace(/[*_`]/g, "").trim();
125
+ if (stripped === cleanOld) {
126
+ const prefixMatch = line.match(/^([#\s\-\*\>]+)/);
127
+ const prefix = prefixMatch ? prefixMatch[1] : "";
128
+ lines[i] = `${prefix}${cleanNew}`;
129
+ replaced = true;
130
+ break;
131
+ }
132
+ }
133
+ if (replaced) {
134
+ slideContent = lines.join("\n");
135
+ } else {
136
+ const escaped = cleanOld.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
137
+ const regex = new RegExp(escaped, "i");
138
+ if (regex.test(slideContent)) {
139
+ slideContent = slideContent.replace(regex, cleanNew);
140
+ } else {
141
+ const words = cleanOld.split(/\s+/).filter((w) => w.length > 2);
142
+ if (words.length > 0) {
143
+ const pattern = words.map((w) => w.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[\\s\\S]*?");
144
+ const fuzzyRegex = new RegExp(pattern, "i");
145
+ if (fuzzyRegex.test(slideContent)) {
146
+ slideContent = slideContent.replace(fuzzyRegex, cleanNew);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ slides[slideIndex] = slideContent;
153
+ const joinedSlides = slides.join("\n---\n");
154
+ if (frontmatter) {
155
+ return `${frontmatter}
156
+
157
+ ${joinedSlides}`;
158
+ }
159
+ return joinedSlides;
160
+ }
161
+ function removeSlideElementFromMarkdown(markdown, slideIndex, options) {
162
+ const { frontmatter, slides } = splitMarkdownSlides(markdown);
163
+ if (slideIndex < 0 || slideIndex >= slides.length) {
164
+ return markdown;
165
+ }
166
+ let slideContent = slides[slideIndex];
167
+ const cleanContent = options.content?.trim();
168
+ if (cleanContent) {
169
+ const lines = slideContent.split("\n");
170
+ let removed = false;
171
+ const updatedLines = lines.filter((line) => {
172
+ if (removed) return true;
173
+ const stripped = line.replace(/^[#\s\-\*\>]+/, "").replace(/[*_`]/g, "").trim();
174
+ if (stripped === cleanContent || line.includes(cleanContent)) {
175
+ removed = true;
176
+ return false;
177
+ }
178
+ return true;
179
+ });
180
+ if (removed) {
181
+ slideContent = updatedLines.join("\n");
182
+ }
183
+ }
184
+ const layoutCommentRegex = /<!--\s*layout:\s*([\s\S]*?)-->/i;
185
+ const match = slideContent.match(layoutCommentRegex);
186
+ if (match && match[1]) {
187
+ try {
188
+ const parsed = yaml__default.default.load(match[1]);
189
+ if (parsed && Array.isArray(parsed.boxes)) {
190
+ const remainingBoxes = parsed.boxes.filter((b) => {
191
+ if (options.boxId && b.id === options.boxId) return false;
192
+ if (options.target && b.target === options.target) return false;
193
+ return true;
194
+ });
195
+ if (remainingBoxes.length > 0) {
196
+ const yamlStr = yaml__default.default.dump({ boxes: remainingBoxes }, { indent: 2, lineWidth: -1, noRefs: true }).trim();
197
+ slideContent = slideContent.replace(layoutCommentRegex, `<!-- layout:
198
+ ${yamlStr.split("\n").join("\n ")}
199
+ -->`);
200
+ } else {
201
+ slideContent = slideContent.replace(layoutCommentRegex, "").trim();
202
+ }
203
+ }
204
+ } catch {
205
+ }
206
+ }
207
+ slides[slideIndex] = slideContent;
208
+ const joinedSlides = slides.join("\n---\n");
209
+ if (frontmatter) {
210
+ return `${frontmatter}
211
+
212
+ ${joinedSlides}`;
213
+ }
214
+ return joinedSlides;
215
+ }
216
+
217
+ // src/core/layout/presets.ts
218
+ var SLIDE_LAYOUT_PRESETS = [
219
+ {
220
+ id: "title-hero",
221
+ name: "Title & Speaker Cover",
222
+ category: "cover",
223
+ description: "High-impact opening slide with large title, subtitle, and speaker credentials.",
224
+ layout: {
225
+ boxes: [
226
+ {
227
+ id: "title",
228
+ target: "h1",
229
+ pos: [100, 180, 1080, 140],
230
+ fontSize: "3rem",
231
+ textAlign: "center"
232
+ },
233
+ {
234
+ id: "subtitle",
235
+ target: "h3",
236
+ pos: [100, 350, 1080, 70],
237
+ fontSize: "1.5rem",
238
+ textAlign: "center"
239
+ },
240
+ {
241
+ id: "speaker-meta",
242
+ target: "p",
243
+ pos: [100, 460, 1080, 80],
244
+ fontSize: "1.1rem",
245
+ textAlign: "center"
246
+ }
247
+ ]
248
+ },
249
+ markdownSnippet: `<!-- layout:
250
+ boxes:
251
+ - id: title
252
+ target: h1
253
+ pos: [100, 180, 1080, 140]
254
+ fontSize: 3rem
255
+ textAlign: center
256
+ - id: subtitle
257
+ target: h3
258
+ pos: [100, 350, 1080, 70]
259
+ fontSize: 1.5rem
260
+ textAlign: center
261
+ - id: speaker-meta
262
+ target: p
263
+ pos: [100, 460, 1080, 80]
264
+ fontSize: 1.1rem
265
+ textAlign: center
266
+ -->
267
+
268
+ # \u{1F680} Engineering Scalable Cloud Systems
269
+ ### Principles, Bottlenecks, and Real-World Architecture Patterns
270
+
271
+ **Presenter:** Senior Systems Architect | **Duration:** 45 mins | **Level:** Intermediate
272
+
273
+ <!--
274
+ Presenter Notes:
275
+ - Welcome the audience and outline today's primary engineering goals.
276
+ - Spark curiosity with an opening hook about scaling under high concurrency.
277
+ -->`
278
+ },
279
+ {
280
+ id: "two-column-split",
281
+ name: "Two-Column Comparison",
282
+ category: "split",
283
+ description: "Balanced side-by-side comparison for legacy vs modern patterns or pros vs cons.",
284
+ layout: {
285
+ boxes: [
286
+ {
287
+ id: "heading",
288
+ target: "h2",
289
+ pos: [80, 50, 1120, 70],
290
+ fontSize: "2rem"
291
+ },
292
+ {
293
+ id: "col-left",
294
+ target: ".columns-2 > div:first-child",
295
+ pos: [80, 150, 530, 510]
296
+ },
297
+ {
298
+ id: "col-right",
299
+ target: ".columns-2 > div:last-child",
300
+ pos: [670, 150, 530, 510]
301
+ }
302
+ ]
303
+ },
304
+ markdownSnippet: `<!-- layout:
305
+ boxes:
306
+ - id: heading
307
+ target: h2
308
+ pos: [80, 50, 1120, 70]
309
+ fontSize: 2rem
310
+ - id: col-left
311
+ target: '.columns-2 > div:first-child'
312
+ pos: [80, 150, 530, 510]
313
+ - id: col-right
314
+ target: '.columns-2 > div:last-child'
315
+ pos: [670, 150, 530, 510]
316
+ -->
317
+
318
+ ## \u2696\uFE0F Monolithic Polling vs Event-Driven Architecture
319
+
320
+ <div class="columns-2">
321
+ <div>
322
+
323
+ ### \u{1F534} Legacy Polling
324
+ - Heavy database CPU overhead on idle cycles
325
+ - High network latency between updates
326
+ - Prone to cascading timeouts during spikes
327
+
328
+ </div>
329
+ <div>
330
+
331
+ ### \u{1F7E2} Event-Driven Streams
332
+ - Real-time event propagation via webhooks
333
+ - Zero idle compute waste with serverless consumers
334
+ - Automatic backpressure and queue isolation
335
+
336
+ </div>
337
+ </div>
338
+
339
+ <!--
340
+ Presenter Notes:
341
+ - Emphasize the core failure mode of periodic polling under sudden load spikes.
342
+ - Ask the room if anyone has experienced database lockups caused by polling loops.
343
+ -->`
344
+ },
345
+ {
346
+ id: "code-explainer",
347
+ name: "Code Walkthrough & Analysis",
348
+ category: "code",
349
+ description: "Syntax-highlighted code block on the left with step-by-step key annotations on the right.",
350
+ layout: {
351
+ boxes: [
352
+ {
353
+ id: "heading",
354
+ target: "h2",
355
+ pos: [80, 45, 1120, 65],
356
+ fontSize: "1.9rem"
357
+ },
358
+ {
359
+ id: "code-box",
360
+ target: ".columns-2 > div:first-child",
361
+ pos: [80, 135, 630, 535]
362
+ },
363
+ {
364
+ id: "notes-box",
365
+ target: ".columns-2 > div:last-child",
366
+ pos: [740, 135, 460, 535]
367
+ }
368
+ ]
369
+ },
370
+ markdownSnippet: `<!-- layout:
371
+ boxes:
372
+ - id: heading
373
+ target: h2
374
+ pos: [80, 45, 1120, 65]
375
+ fontSize: 1.9rem
376
+ - id: code-box
377
+ target: '.columns-2 > div:first-child'
378
+ pos: [80, 135, 630, 535]
379
+ - id: notes-box
380
+ target: '.columns-2 > div:last-child'
381
+ pos: [740, 135, 460, 535]
382
+ -->
383
+
384
+ ## \u{1F4BB} Robust Async Transaction Pipeline
385
+
386
+ <div class="columns-2">
387
+ <div>
388
+
389
+ \`\`\`ts
390
+ // Process payment with idempotency guarantee
391
+ export async function processPayment(order: Order) {
392
+ const isValid = await validateOrder(order);
393
+ if (!isValid) throw new Error("ValidationFailed");
394
+
395
+ const receipt = await chargeCard(order);
396
+ return sendConfirmation(receipt);
397
+ }
398
+ \`\`\`
399
+
400
+ </div>
401
+ <div>
402
+
403
+ ### \u{1F50D} Key Engineering Invariants:
404
+ 1. **Early Guard Clause:** Validates payload immediately at line 3 before triggering external calls.
405
+ 2. **Deterministic Sequence:** Enforces strict order of operations using native \`await\`.
406
+ 3. **Audit Trail:** Returns immutable payment receipt upon successful execution.
407
+
408
+ </div>
409
+ </div>
410
+
411
+ <!--
412
+ Presenter Notes:
413
+ - Walk through lines 1 to 7 sequentially.
414
+ - Cold-call check: "What happens if line 6 throws a network timeout?"
415
+ - Cognitive scaffolding: Highlight the importance of idempotency keys in payment APIs.
416
+ -->`
417
+ },
418
+ {
419
+ id: "metrics-3-card",
420
+ name: "3-Metric Key Results Grid",
421
+ category: "metrics",
422
+ description: "Three high-visibility KPI stat cards for benchmarks, impact, and success criteria.",
423
+ layout: {
424
+ boxes: [
425
+ {
426
+ id: "heading",
427
+ target: "h2",
428
+ pos: [80, 50, 1120, 70],
429
+ fontSize: "2rem",
430
+ textAlign: "center"
431
+ },
432
+ {
433
+ id: "metric-1",
434
+ target: ".columns-3 > div:nth-child(1)",
435
+ pos: [80, 165, 340, 485]
436
+ },
437
+ {
438
+ id: "metric-2",
439
+ target: ".columns-3 > div:nth-child(2)",
440
+ pos: [470, 165, 340, 485]
441
+ },
442
+ {
443
+ id: "metric-3",
444
+ target: ".columns-3 > div:nth-child(3)",
445
+ pos: [860, 165, 340, 485]
446
+ }
447
+ ]
448
+ },
449
+ markdownSnippet: `<!-- layout:
450
+ boxes:
451
+ - id: heading
452
+ target: h2
453
+ pos: [80, 50, 1120, 70]
454
+ fontSize: 2rem
455
+ textAlign: center
456
+ - id: metric-1
457
+ target: '.columns-3 > div:nth-child(1)'
458
+ pos: [80, 165, 340, 485]
459
+ - id: metric-2
460
+ target: '.columns-3 > div:nth-child(2)'
461
+ pos: [470, 165, 340, 485]
462
+ - id: metric-3
463
+ target: '.columns-3 > div:nth-child(3)'
464
+ pos: [860, 165, 340, 485]
465
+ -->
466
+
467
+ ## \u{1F4CA} Performance & Reliability Benchmarks
468
+
469
+ <div class="columns-3">
470
+ <div>
471
+
472
+ # \u26A1 99.99%
473
+ ### SLA Availability
474
+ High-availability multi-region cluster with automated failover routing.
475
+
476
+ </div>
477
+ <div>
478
+
479
+ # \u{1F680} 15ms
480
+ ### P99 Latency
481
+ Sub-20ms roundtrip response time via distributed edge caching.
482
+
483
+ </div>
484
+ <div>
485
+
486
+ # \u{1F6E1}\uFE0F Zero
487
+ ### Unhandled Breaches
488
+ Full SOC2 Type II compliance and end-to-end payload encryption.
489
+
490
+ </div>
491
+ </div>
492
+
493
+ <!--
494
+ Presenter Notes:
495
+ - Highlight the 15ms P99 latency target as the primary technical milestone.
496
+ - Connect these metrics directly to the architecture decisions discussed next.
497
+ -->`
498
+ },
499
+ {
500
+ id: "process-flow",
501
+ name: "Architecture & Process Flow",
502
+ category: "diagram",
503
+ description: "Multi-stage workflow with responsive Mermaid diagram and phase summaries.",
504
+ layout: {
505
+ boxes: [
506
+ {
507
+ id: "heading",
508
+ target: "h2",
509
+ pos: [80, 45, 1120, 65],
510
+ fontSize: "1.9rem"
511
+ },
512
+ {
513
+ id: "diagram-box",
514
+ target: "pre.mermaid, .mermaid",
515
+ pos: [80, 130, 1120, 310]
516
+ },
517
+ {
518
+ id: "summary-box",
519
+ target: "ul, p",
520
+ pos: [80, 465, 1120, 205]
521
+ }
522
+ ]
523
+ },
524
+ markdownSnippet: `<!-- layout:
525
+ boxes:
526
+ - id: heading
527
+ target: h2
528
+ pos: [80, 45, 1120, 65]
529
+ fontSize: 1.9rem
530
+ - id: diagram-box
531
+ target: 'pre.mermaid, .mermaid'
532
+ pos: [80, 130, 1120, 310]
533
+ - id: summary-box
534
+ target: 'ul, p'
535
+ pos: [80, 465, 1120, 205]
536
+ -->
537
+
538
+ ## \u{1F504} End-to-End Data Ingestion Pipeline
539
+
540
+ \`\`\`mermaid
541
+ graph LR
542
+ A[1. Client Ingress] --> B[2. API Gateway]
543
+ B --> C[3. Auth Verifier]
544
+ C --> D[4. Distributed DB]
545
+ style A fill:#0284c7,stroke:#38bdf8,stroke-width:2px,color:#fff
546
+ style B fill:#1e293b,stroke:#64748b,stroke-width:2px,color:#fff
547
+ style C fill:#059669,stroke:#34d399,stroke-width:2px,color:#fff
548
+ style D fill:#7c3aed,stroke:#a78bfa,stroke-width:2px,color:#fff
549
+ \`\`\`
550
+
551
+ - **Ingress & Gateway:** Rate-limits traffic and applies reverse-proxy load balancing.
552
+ - **Verification & Storage:** Decodes cryptographic JWT tokens before transactional write commit.
553
+
554
+ <!--
555
+ Presenter Notes:
556
+ - Trace each hop across the diagram from left to right.
557
+ - Ask: "Where should rate limiting be applied to prevent DDoS attacks?"
558
+ -->`
559
+ },
560
+ {
561
+ id: "quote-highlight",
562
+ name: "Core Principle & Quote Highlight",
563
+ category: "quote",
564
+ description: "Prominent quote callout for fundamental engineering rules or memorable mantras.",
565
+ layout: {
566
+ boxes: [
567
+ {
568
+ id: "heading",
569
+ target: "h2",
570
+ pos: [100, 100, 1080, 80],
571
+ fontSize: "2.2rem",
572
+ textAlign: "center"
573
+ },
574
+ {
575
+ id: "quote-box",
576
+ target: "blockquote",
577
+ pos: [140, 230, 1e3, 360],
578
+ fontSize: "1.4rem"
579
+ }
580
+ ]
581
+ },
582
+ markdownSnippet: `<!-- layout:
583
+ boxes:
584
+ - id: heading
585
+ target: h2
586
+ pos: [100, 100, 1080, 80]
587
+ fontSize: 2.2rem
588
+ textAlign: center
589
+ - id: quote-box
590
+ target: blockquote
591
+ pos: [140, 230, 1000, 360]
592
+ fontSize: 1.4rem
593
+ -->
594
+
595
+ ## \u{1F4A1} Foundational Architecture Principle
596
+
597
+ > "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."
598
+ >
599
+ > \u2014 **Edsger W. Dijkstra**
600
+
601
+ <!--
602
+ Presenter Notes:
603
+ - Pause for 5 seconds of silence to let the quote sink in.
604
+ - Ask: "How do our current architectural choices reflect this principle?"
605
+ -->`
606
+ },
607
+ {
608
+ id: "quiz-checkpoint",
609
+ name: "Interactive Formative Checkpoint",
610
+ category: "assessment",
611
+ description: "Interactive multiple-choice diagnostic checkpoint with A/B/C/D voting options.",
612
+ layout: {
613
+ boxes: [
614
+ {
615
+ id: "heading",
616
+ target: "h2",
617
+ pos: [80, 45, 1120, 65],
618
+ fontSize: "1.9rem"
619
+ },
620
+ {
621
+ id: "question-callout",
622
+ target: "blockquote",
623
+ pos: [80, 130, 1120, 110],
624
+ fontSize: "1.2rem"
625
+ },
626
+ {
627
+ id: "options-list",
628
+ target: "ul",
629
+ pos: [80, 260, 1120, 390],
630
+ fontSize: "1.15rem"
631
+ }
632
+ ]
633
+ },
634
+ markdownSnippet: `<!-- layout:
635
+ boxes:
636
+ - id: heading
637
+ target: h2
638
+ pos: [80, 45, 1120, 65]
639
+ fontSize: 1.9rem
640
+ - id: question-callout
641
+ target: blockquote
642
+ pos: [80, 130, 1120, 110]
643
+ fontSize: 1.2rem
644
+ - id: options-list
645
+ target: ul
646
+ pos: [80, 260, 1120, 390]
647
+ fontSize: 1.15rem
648
+ -->
649
+
650
+ ## \u{1F3AF} Formative Checkpoint: Verify Your Understanding
651
+
652
+ > **Question:** In an event-driven architecture, which pattern guarantees that messages are never permanently lost if a downstream consumer crashes?
653
+
654
+ - **A.** Direct HTTP POST call with a short 2-second timeout
655
+ - **B.** Persistent Message Broker with Dead-Letter Queue (DLQ) & retry policy
656
+ - **C.** In-memory client RAM cache without disk persistence
657
+ - **D.** Discarding failed packets and prompting the user to re-submit
658
+
659
+ <!--
660
+ Presenter Notes:
661
+ - Give students 30 seconds to vote on option A, B, C, or D.
662
+ - Correct answer: B.
663
+ - Explain why options A and C introduce catastrophic data loss in production.
664
+ -->`
665
+ },
666
+ {
667
+ id: "tiered-practice-3cards",
668
+ name: "Tiered Differentiation (Bronze / Silver / Gold)",
669
+ category: "content",
670
+ description: "Three progressive competency tiers allowing self-paced learning acceleration.",
671
+ layout: {
672
+ boxes: [
673
+ {
674
+ id: "heading",
675
+ target: "h2",
676
+ pos: [80, 45, 1120, 65],
677
+ fontSize: "1.9rem"
678
+ },
679
+ {
680
+ id: "tier-bronze",
681
+ target: ".columns-3 > div:nth-child(1)",
682
+ pos: [80, 140, 350, 520]
683
+ },
684
+ {
685
+ id: "tier-silver",
686
+ target: ".columns-3 > div:nth-child(2)",
687
+ pos: [465, 140, 350, 520]
688
+ },
689
+ {
690
+ id: "tier-gold",
691
+ target: ".columns-3 > div:nth-child(3)",
692
+ pos: [850, 140, 350, 520]
693
+ }
694
+ ]
695
+ },
696
+ markdownSnippet: `<!-- layout:
697
+ boxes:
698
+ - id: heading
699
+ target: h2
700
+ pos: [80, 45, 1120, 65]
701
+ fontSize: 1.9rem
702
+ - id: tier-bronze
703
+ target: '.columns-3 > div:nth-child(1)'
704
+ pos: [80, 140, 350, 520]
705
+ - id: tier-silver
706
+ target: '.columns-3 > div:nth-child(2)'
707
+ pos: [465, 140, 350, 520]
708
+ - id: tier-gold
709
+ target: '.columns-3 > div:nth-child(3)'
710
+ pos: [850, 140, 350, 520]
711
+ -->
712
+
713
+ ## \u{1F6E0}\uFE0F Hands-On Challenge: 3-Tier Differentiation
714
+
715
+ <div class="columns-3">
716
+ <div>
717
+
718
+ ### \u{1F949} Bronze Tier
719
+ - Implement basic handler logic
720
+ - Pass 3 baseline unit tests
721
+ - *Goal: Foundational mastery*
722
+
723
+ </div>
724
+ <div>
725
+
726
+ ### \u{1F948} Silver Tier
727
+ - Add boundary error handling
728
+ - Enforce O(N) memory complexity
729
+ - *Goal: Production-ready code*
730
+
731
+ </div>
732
+ <div>
733
+
734
+ ### \u{1F947} Gold Tier
735
+ - Design distributed retry queue
736
+ - Add 95% automated test coverage
737
+ - *Goal: Architectural leadership*
738
+
739
+ </div>
740
+ </div>
741
+
742
+ <!--
743
+ Presenter Notes:
744
+ - All learners begin at Bronze to establish baseline competency.
745
+ - Accelerate self-directed learners to Silver and Gold as they complete each tier.
746
+ -->`
747
+ },
748
+ {
749
+ id: "agenda-timeline",
750
+ name: "Session Agenda & Milestones",
751
+ category: "content",
752
+ description: "Structured time-budgeted agenda mapping stages to measurable deliverables.",
753
+ layout: {
754
+ boxes: [
755
+ {
756
+ id: "heading",
757
+ target: "h2",
758
+ pos: [80, 45, 1120, 65],
759
+ fontSize: "1.9rem"
760
+ },
761
+ {
762
+ id: "table-box",
763
+ target: "table",
764
+ pos: [80, 140, 1120, 520]
765
+ }
766
+ ]
767
+ },
768
+ markdownSnippet: `<!-- layout:
769
+ boxes:
770
+ - id: heading
771
+ target: h2
772
+ pos: [80, 45, 1120, 65]
773
+ fontSize: 1.9rem
774
+ - id: table-box
775
+ target: table
776
+ pos: [80, 140, 1120, 520]
777
+ -->
778
+
779
+ ## \u{1F5FA}\uFE0F Milestone Roadmap & Time Budget
780
+
781
+ | Allocated Time | Session Stage | Core Learning Focus | Deliverable Milestone |
782
+ |:---:|---|---|---|
783
+ | **05 mins** | Warm-Up | Real-World Scenario & Context | Identify system bottleneck |
784
+ | **15 mins** | Concept Discovery | Core Architectural Patterns | Deconstruct message queue models |
785
+ | **20 mins** | Hands-On Lab | Tiered Code Implementation | Complete Bronze + Silver tasks |
786
+ | **05 mins** | Wrap-Up | Formative Checkpoint & Debrief | Consolidate key principles |
787
+
788
+ <!--
789
+ Presenter Notes:
790
+ - Walk through the time budget so students understand expectations and pacing.
791
+ -->`
792
+ },
793
+ {
794
+ id: "takeaways-summary",
795
+ name: "Key Takeaways & Wrap-up",
796
+ category: "content",
797
+ description: "Three memorable synthesis takeaways with actionable next steps.",
798
+ layout: {
799
+ boxes: [
800
+ {
801
+ id: "heading",
802
+ target: "h2",
803
+ pos: [80, 50, 1120, 70],
804
+ fontSize: "2rem"
805
+ },
806
+ {
807
+ id: "list-box",
808
+ target: "ol",
809
+ pos: [80, 150, 1120, 340],
810
+ fontSize: "1.25rem"
811
+ },
812
+ {
813
+ id: "callout-next",
814
+ target: "blockquote",
815
+ pos: [80, 520, 1120, 140],
816
+ fontSize: "1.1rem"
817
+ }
818
+ ]
819
+ },
820
+ markdownSnippet: `<!-- layout:
821
+ boxes:
822
+ - id: heading
823
+ target: h2
824
+ pos: [80, 50, 1120, 70]
825
+ fontSize: 2rem
826
+ - id: list-box
827
+ target: ol
828
+ pos: [80, 150, 1120, 340]
829
+ fontSize: 1.25rem
830
+ - id: callout-next
831
+ target: blockquote
832
+ pos: [80, 520, 1120, 140]
833
+ fontSize: 1.1rem
834
+ -->
835
+
836
+ ## \u{1F3C1} Key Takeaways & Action Items
837
+
838
+ 1. **Decouple Before Scaling:** Separate producer rate from consumer processing capacity.
839
+ 2. **Design for Failure:** Always configure retries, backoff intervals, and dead-letter queues.
840
+ 3. **Measure End-to-End:** Track P99 latency and error rates across all distributed boundaries.
841
+
842
+ > \u{1F4DD} **Next Action Item:** Complete the Silver Tier refactoring challenge before our next peer-review session.
843
+
844
+ <!--
845
+ Presenter Notes:
846
+ - Deliver a crisp 2-minute wrap-up reinforcing the 3 core takeaways.
847
+ - Acknowledge strong peer collaboration during the hands-on lab.
848
+ -->`
849
+ }
850
+ ];
851
+ function getSlideLayoutPresetById(id) {
852
+ return SLIDE_LAYOUT_PRESETS.find((p) => p.id === id);
853
+ }
854
+ function getSlideLayoutPresetsByCategory(category) {
855
+ return SLIDE_LAYOUT_PRESETS.filter((p) => p.category === category);
856
+ }
857
+
858
+ exports.SLIDE_LAYOUT_PRESETS = SLIDE_LAYOUT_PRESETS;
859
+ exports.getSlideLayoutPresetById = getSlideLayoutPresetById;
860
+ exports.getSlideLayoutPresetsByCategory = getSlideLayoutPresetsByCategory;
861
+ exports.removeSlideElementFromMarkdown = removeSlideElementFromMarkdown;
862
+ exports.serializeLayoutToComment = serializeLayoutToComment;
863
+ exports.splitMarkdownSlides = splitMarkdownSlides;
864
+ exports.updateSlideLayoutInMarkdown = updateSlideLayoutInMarkdown;
865
+ exports.updateSlideTextInMarkdown = updateSlideTextInMarkdown;
866
+ //# sourceMappingURL=chunk-3Q4RMZVQ.cjs.map
867
+ //# sourceMappingURL=chunk-3Q4RMZVQ.cjs.map