본문으로 건너뛰기

Reactive Presentation Skill

Build interactive HTML presentation slideshows with Canvas animations, quizzes, dark theme, and keyboard navigation. Deployed to GitHub Pages.

Trigger Keywords

Activated by the following keywords:

  • "create slides", "build a presentation", "make a slideshow"
  • "training slides", "interactive presentation"
  • "Canvas animation slides", "reactive presentation"

Provided Resources

assets/

Framework files (copy to common/):

FileDescription
theme.cssDark theme, Pretendard font, 16:9 layout, all component styles
theme-override-template.cssTemplate for PPTX-extracted CSS overrides
slide-framework.jsSlideFramework class (keyboard, touch, progress bar, presenter view)
slide-renderer.jsSlideRenderer class: JSON to HTML dynamic rendering
presenter-view.jsPresenterView class (draggable splitters, BroadcastChannel sync)
animation-utils.jsCanvas primitives, AnimationLoop, TimelineAnimation, Colors, Ease
quiz-component.jsQuizManager (auto-grading, feedback)
export-utils.jsExportUtils (PDF export, ZIP download)

scripts/

ScriptDescription
extract_pptx_theme.pyPPTX theme extraction to CSS overrides + images
remarp_to_slides.pyRemarp markdown to HTML slide conversion
marp_to_slides.pyMarp markdown to HTML slide conversion (legacy)
extract_aws_icons.pyAWS Architecture Icons extraction

references/

Reference DocDescription
framework-guide.mdCSS classes, JS functions, HTML template API reference
slide-patterns.mdHTML patterns by slide type, Canvas animation patterns
remarp-format-guide.mdRemarp markdown format specification (recommended)
marp-format-guide.mdMarp markdown format specification (legacy)
pptx-theme-guide.mdPPTX theme extraction usage, color mapping, troubleshooting
aws-icons-guide.mdAWS Architecture Icons usage, naming conventions
canvas-animation-prompt.mdCanvas prompt to JS code generation guide
interactive-patterns-guide.mdInteractive slide patterns (simulators, dashboards, etc.)
colors-reference.mdAWS color palette
data-visualization-guide.mdCharts, dashboards, KPI cards design patterns

icons/

AWS Architecture Icons (4,224 files):

DirectoryDescription
Architecture-Service-Icons_07312025/Service-level icons (121 categories)
Architecture-Group-Icons_07312025/Group icons (Cloud, VPC, Region, Subnet)
Category-Icons_07312025/Category-level icons (4 sizes)
Resource-Icons_07312025/Resource-level icons (22 categories)
others/Third-party icons (LangChain, Grafana, etc.)

Key Features

Control fragment animations, Canvas DSL, speaker notes, and slide transitions directly in markdown:

---
remarp: true
title: My Presentation
theme: aws-dark
---

# Slide Title
@type: content

This is a paragraph {.click}

:::click
This appears on click
:::

:::notes
{timing: 2min}
Speaker notes here
:::

PPTX Theme Extraction

python3 scripts/extract_pptx_theme.py <pptx_path> -o {repo}/common/pptx-theme/

Generated outputs:

  • theme-manifest.json — Extracted colors, fonts, logos, footer
  • theme-override.css — CSS variable overrides
  • images/ — Logos, background images

Data Visualization Patterns

The reactive-presentation framework supports multiple data visualization techniques for creating impactful slides.

Typography Hierarchy

ElementSizeWeightAdditional
Hero stat3.5rem+700text-shadow: 0 0 20px var(--accent-glow)
KPI value2.4rem700Monospace font
Card title1.1rem600text-wrap: balance
Body text1rem400
Label/caption0.85rem500Secondary color

CSS-Only Charts

For lightweight visualizations without JavaScript dependencies:

/* Horizontal bar chart */
.bar-chart .bar {
height: 24px;
background: linear-gradient(90deg, var(--accent) 0%, var(--accent-light) 100%);
border-radius: 4px;
transition: width 0.6s ease-out;
}

/* Progress ring */
.progress-ring {
--progress: 75;
background: conic-gradient(
var(--accent) calc(var(--progress) * 1%),
var(--surface-2) 0
);
}

KPI Card Layout

<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-label">Latency</div>
<div class="kpi-value">42<span class="kpi-unit">ms</span></div>
<div class="kpi-trend positive">-15% vs last week</div>
</div>
</div>

Chart.js Integration

For dynamic charts, embed Chart.js in :::script blocks:

:::html
<canvas id="myChart" width="400" height="200"></canvas>
:::

:::script
new Chart(document.getElementById('myChart'), {
type: 'bar',
data: {
labels: ['Jan', 'Feb', 'Mar'],
datasets: [{
data: [12, 19, 3],
backgroundColor: ['#6c5ce7', '#a29bfe', '#dfe6e9']
}]
}
});
:::

Canvas vs HTML Decision Guide

The 4-Box Rule

Before using Canvas, count the total boxes and icons on your slide:

Element CountApproachWhy
1-4 boxes:::canvas DSL allowedSimple enough for Canvas coordinates
5+ boxes:::html + :::css requiredFlexbox/Grid handles complex layouts better

Decision Matrix

Content TypeUse CanvasUse HTML
Simple A→B→C flowYes
3-tier architectureYes
Service ecosystem mapYes
Step-by-step animationYes
Multi-layer diagramYes
Interactive dashboardYes (with :::script)

HTML Architecture Pattern

For 5+ elements, use this pattern:

:::html
<div class="flow-h">
<div class="flow-group bg-blue" data-fragment-index="1">
<div class="flow-group-label">Collect</div>
<div class="icon-item">
<img src="../common/aws-icons/services/Arch_Amazon-CloudWatch_48.svg">
<span>CloudWatch</span>
</div>
</div>
<div class="flow-arrow"></div>
<div class="flow-group bg-orange" data-fragment-index="2">
<div class="flow-group-label">Analyze</div>
<div class="flow-box">DevOps Guru</div>
</div>
</div>
:::

Remarp Workflow Detail

The 9-step workflow for creating presentations:

Step 1: Theme Setup (Optional)

If PPTX template is provided:

python3 scripts/extract_pptx_theme.py template.pptx -o common/pptx-theme/

Step 2: Content Planning

Answer these questions during planning:

  • Topic & audience — technical depth, learning objectives
  • Duration — determines block count (20-35 min per block)
  • Quiz inclusion — yes/no for end-of-block quizzes
  • Speaker info — name, title, company

Step 3: Create Project Structure

{slug}/
├── _presentation.md # Global settings
├── 01-fundamentals.md # Block 1
├── 02-deep-dive.md # Block 2
└── animations/ # Canvas animation modules

Step 4: Write Remarp Content

Use @type directives for slide types:

TypeUsage
@type: coverSession cover slide
@type: titleBlock title slide
@type: contentStandard content
@type: compareA vs B comparison
@type: tabsTabbed content
@type: canvasCanvas animation
@type: quizQuiz slide
@type: agendaSession agenda

Step 5: Build HTML

# Full build
python3 scripts/remarp_to_slides.py build {repo}/{slug}/

# Incremental build (changed blocks only)
python3 scripts/remarp_to_slides.py sync {repo}/{slug}/

# Single block
python3 scripts/remarp_to_slides.py build {repo}/{slug}/ --block 01-fundamentals

Step 6: Review & Iterate

Edit Remarp source or request changes via prompt, then rebuild.

Step 7: Enhancement

Add Canvas animations, interactive elements, AWS icons.

Step 8: Quality Review

Mandatory: Run content-review-agent and achieve PASS (85+ score).

Step 9: Deploy

git add common/ {slug}/ index.html
git commit -m "feat: add {name} presentation"
git push origin main

Interactive Pattern Guide

Simulator Pattern

For parameter exploration (VPA, cost calculators):

:::html
<div class="simulator-layout">
<div class="slider-group">
<label>CPU Request</label>
<input type="range" id="cpu" min="50" max="2000" value="250">
<span id="cpu-val">250m</span>
</div>
<div class="yaml-output" id="output"></div>
</div>
:::

:::script
document.getElementById('cpu').oninput = function() {
document.getElementById('cpu-val').textContent = this.value + 'm';
updateYAML();
};
:::

Calculator Pattern

For cost/metric calculations:

:::html
<div class="calculator">
<div class="input-group">
<label>Instances</label>
<input type="number" id="instances" value="3">
</div>
<div class="result">
<span class="label">Monthly Cost</span>
<span class="value" id="cost">$0</span>
</div>
</div>
:::

Dashboard Pattern

For monitoring/metrics displays:

:::html
<div class="dashboard-grid">
<div class="stat-panel">
<div class="stat-label">Active Pods</div>
<div class="stat-value" id="pods">12</div>
</div>
<div class="node-grid" id="nodes"></div>
<div class="controls">
<button onclick="scaleOut()">Scale Out</button>
<button onclick="scaleIn()">Scale In</button>
</div>
</div>
:::

Speaker Notes Writing Guide

All slides must include :::notes blocks meeting these requirements:

Requirements

CriterionRequirement
Minimum length150 characters per slide
Recommended length300-500 characters (1-3 minutes speaking)
StructureTiming marker → Intro → Key points → Cues → Transition

Structure Template

:::notes
{timing: 2min}
[Opening hook that connects to previous slide]

Key points to cover:
- Point 1 with real-world example or analogy
- Point 2 with practical tip
- Point 3 addressing common misconception

{cue: question}
Ask audience: "Has anyone experienced...?"

{cue: transition}
Now that we understand X, let's see how Y builds on this...
:::

Good Example

:::notes
{timing: 3min}
Before diving into the code, let's understand why VPA matters.

Traditional resource allocation is like buying clothes for a growing child —
you either waste money on oversized clothes or constantly buy new ones. VPA
solves this by automatically adjusting container resources based on actual usage.

Key insight: VPA doesn't just save costs — it improves application stability
by preventing OOM kills and CPU throttling.

{cue: pause}
Take a moment to think about your current resource allocation strategy.

{cue: transition}
With this mental model in place, let's look at the configuration options...
:::

Bad Example (What NOT to do)

:::notes
This slide shows VPA configuration.
:::

Problems: Too short, no timing, repeats slide content, no engagement cues.


Slide Types

Content TypePatternInteractive Element
Simple flow (boxes ≤4)Canvas Animation:::canvas DSL, step navigation
Complex architecture (boxes 5+)HTML Architecture:::html + :::css (flexbox/grid)
A vs B comparisonCompare Toggle.compare-toggle buttons
Config variantsTab Content.tab-bar + YAML code blocks
Step-by-step processTimeline.timeline animation
Monitoring/dashboard (boxes 5+)HTML Dashboard:::html + :::script
Best practicesChecklist.checklist toggle
Block summaryQuizdata-quiz + 3-4 questions

Keyboard Shortcuts

KeyAction
← →Previous/Next slide
↑ ↓Cycle tabs/compare options
FFullscreen
PPresenter view
NSpeaker notes panel
OOverview mode

Usage Example

User: "Create an EKS introduction presentation"

1. presentation-agent called
2. Remarp content written
3. HTML build: python3 scripts/remarp_to_slides.py build {slug}/
4. content-review-agent review
5. GitHub Pages deployment

Quality Review (Required)

After content completion, before deployment:

  1. Call content-review-agent
  2. Achieve PASS (85+ score) before deployment
  3. Re-review after fixes if FAIL/REVIEW verdict
Required

Skipping this step and deploying is prohibited.