| name | reactive-presentation |
| description | Create interactive HTML presentation slideshows with Canvas animations, quizzes, light/dark themes, keyboard navigation, and screenshot-based PPTX export (editable/native PPTX is the aws-light-fcd skill). Deploy to GitHub Pages. Use when user asks to: create interactive/web slides, build an HTML presentation, make a web slideshow, training slides, Canvas animation slides, export web slides to PowerPoint images, or mentions 'reactive presentation'. Supports PPTX template theming and Remarp markdown content authoring. Supports multi-block training sessions (30min-3hr), technical deep-dives, and workshop content. |
| allowed-tools | ["Read","Write","Edit","Bash","Glob","Grep"] |
Reactive Presentation
Build interactive HTML slideshows deployed via GitHub Pages. No build tools โ pure HTML/CSS/JS with a shared framework (nav, animations, quizzes). Authoring format is Remarp markdown (Marp = legacy maintenance only).
{skill-dir} = {plugin-dir}/skills/reactive-presentation. New to Remarp? See REMARP.md.
์์ธ ์์ฑ ๊ท์นยทํยท๋ณต์ฌ์ฉ ํ
ํ๋ฆฟ์ references/authoring-rules.md (validation ๊ท์น, Forbidden AI-tells, Interactive ํจํด/ํญ ํ
ํ๋ฆฟ, Slide Type ๊ฒฐ์ , HTML Architecture). ์ค์ ์ฌ๋ผ์ด๋๋ฅผ ์์ฑยท๊ฒ์ฆํ ๋ ์ด ๋ฌธ์๋ฅผ ์ฝ์ผ์ธ์.
Workflow (9 phases)
Phase 1 โ Theme Setup (optional, PPTX ์ ๊ณต ์)
python3 {skill-dir}/scripts/extract_pptx_theme.py <pptx_path> -o {repo}/common/pptx-theme/
์์ฑ๋ฌผ: theme-manifest.json(colors/fonts/logos/footer/layout) ยท theme-override.css ยท images/. ๋งค๋ํ์คํธ ๋งคํ โ _presentation.md: slide_size.aspect_ratioโratio, footer_textโtheme.footer, logos[0]โtheme.logo. theme-override.css๋ฅผ common/์ ๋ณต์ฌ. ์์ธ: references/pptx-theme-guide.md. (AWS ์์ด์ฝ์ build๊ฐ ์ฐธ์กฐ๋ถ๋ง ์๋ ๋ณต์ฌ โ ์๋ ์ถ์ถ ๋ถํ์.)
Phase 2 โ Content Authoring
ํ๋๋ ์ง๋ฌธ (planning ์ ํ์ธ, ๋น ์ง ๊ฒ๋ง ์ง๋ฌธ):
- Topic & audience / Duration(๋ธ๋ก๋น 20-35๋ถ + 5๋ถ ํด์) / Target repo(๊ธฐ๋ณธ
~/reactive_presentation/) / Language(KOยทEN, ๊ธฐ์ ์ฉ์ด๋ ์์ด) / Aspect ratio(๊ธฐ๋ณธ 16:9)
- Design refs (REQUIRED, skippable): "์ฐธ๊ณ ๋์์ธ(PPTX/PDF/์ด๋ฏธ์ง/๊ธฐ์กด ํ๋ ์ ํ
์ด์
๊ฒฝ๋ก)์ด ์๋์? (๋๋ skip)" โ ์ ๊ณต ์ ๋ธ๋๋ฉ+๋ ์ด์์ ์ถ์ถ(
.pptx=Phase 1, .pdf/์ด๋ฏธ์ง=์๊ฐ ๋ ์ด์์ ์ฐธ๊ณ ). ๊ธฐ์กด ํ๋ ์ ํ
์ด์
์ ~/oh-my-skill-tester/๋ ์๋ ํ์ํด ๋ชฉ๋ก ์ ์. skip ์ CSS-only cover + ๊ธฐ๋ณธ theme + _presentation.md์ footer/logo ์๋ ์ค์ ํ์.
๋์์ธ ํ๋ (ํ์ โ ์์ฑ ์ 2-pass): references/design-direction.md๋ฅผ
์ฝ๊ณ Subject/Palette/Type/Signature ํ๋์ ์ธ์ด ๋ค anti-default ์๊ธฐ๋นํ์ ํต๊ณผํ๊ณ ์์ฑ ์์.
ํ
๋ง ์ ํ: ๊ธฐ๋ณธ(AWS ์ฝ์ ๋ผ์ดํธ) ยท theme: { mode: dark }(squid-ink night) ยท
theme: { preset: paper }(๊ตฌ ์ ๋ฃฉ, ์๋์ ์ ํ ์๋ง) ยท PPTX ์ถ์ถ(ํญ์ ์ฐ์ ).
- Speaker (skippable): ์ด๋ฆยท์งํจยท์์ โ frontmatter
speaker{name,title,company} (MEMORY.md์ ์ ์ฅยท์ฌ์ฌ์ฉ)
- Level (REQUIRED): 100/200/300/400 โ frontmatter
level
- Quiz (skippable): ๋ธ๋ก ๋ ๋ณต์ต ํด์ฆ? โ frontmatter
quiz(true/false). ๋ฏธํฌํจ ์ Key Takeaways๋ก ๋์ฒด. ์ ์ฒด ์๊ฐ โ duration(blocks ํฉ๊ณผ ์ผ์น)
ํ๋ก์ ํธ ๊ตฌ์กฐ (๋ฉํฐํ์ผ): _presentation.md(๊ธ๋ก๋ฒ theme/footer/logo/blocks) + NN-block.md(remarp:true) + animations/(Canvas JS).
_presentation.md ํ์ (ratio/footer/logo): ratio: "16:9" ๋๋ฝ ์ ํ๋ฆฌ๋ทฐ ๋น์จ ๊นจ์ง. PPTX ์์ผ๋ฉด theme:์ footerยทlogo ์๋ ์ค์ :
ratio: "16:9"
theme: { footer: "ยฉ 2026 Company. All rights reserved.", logo: "./common/logo.png" }
Remarp ํต์ฌ: remarp: true frontmatter ยท @type/@layout/@transition/@theme ๋๋ ํฐ๋ธ ยท {.click}ยท:::click ํ๋๊ทธ๋จผํธ ยท :::notes ์คํผ์ปค ๋
ธํธ ยท :::canvas DSL ยท ::: left/::: right ์ปฌ๋ผ. ์ ์ฒด ๋ฌธ๋ฒ: references/remarp-format-guide.md.
์คํผ์ปค ๋
ธํธ (ํ์): ๋ชจ๋ ์ฌ๋ผ์ด๋์ :::notes โ 150์+ (๊ถ์ฅ 300500), {timing}/{cue} ๋ง์ปค + [์์ฝ](35 ๋ถ๋ฆฟ) + ๊ตฌ์ด์ฒด ์คํฌ๋ฆฝํธ. ๋๋ฝ/๋ฌด๊ตฌ์กฐ ์ MISSING_NOTES/NOTE_STRUCTURE ๊ฒฝ๊ณ . ์คํค๋ง: remarp-format-guide.md "Structured Note Schema".
โ ๏ธ Interactive-First: 3+ ํ์ํญ๋ชฉโํญ ยท 4+ ๋์ดโgrid ์นด๋(๋ถ๋ฆฟ ๊ธ์ง) ยท 5+ ๋ฐ์คโ:::html+:::css(canvas ๊ธ์ง) ยท :::html์ 3+ ๋์์์๋ฉด fragment fade-up๋ก reactive. ์์นยทํญ ํ
ํ๋ฆฟยท์์ ํ ํฐ: authoring-rules.md ยง4.
๋์ ํฌ๋งท (๋ช
์ ์์ฒญ ์๋ง): slides.json(๋ฐํ์ ๋ ๋, slide-patterns.md "JSON Authoring Mode") ยท Marp(๋ ๊ฑฐ์, marp-format-guide.md).
Phase 2.5 โ Convert PPTX/PDF (optional)
python3 {skill-dir}/scripts/convert_to_remarp.py <input.pptx|pdf> -o {repo}/{slug}/ --lang ko
๋ณํ ํ .md์์ @speaker/{.click}/:::canvas/@type ์์ ํธ์ง. PDF๋ ์ด๋ฏธ์ง ๋ฐฐ๊ฒฝ+์ถ์ถ ํ
์คํธ.
Phase 2.8 โ Validate (Rejection Loop, ํ์ โ build ์ )
python3 {skill-dir}/scripts/remarp_to_slides.py validate {repo}/{slug}/
โ ๏ธ CRITICAL 0๊ฑด์ด์ด์ผ build. ๊ท์น ํยทVerdictยท์๋๊ต์ ์ง์นจ: authoring-rules.md ยง1. CRITICAL ์์ผ๋ฉด ์์ ํ ์ฌ๊ฒ์ฆ(์ต๋ 3ํ).
Phase 3 โ Build
python3 {skill-dir}/scripts/remarp_to_slides.py build {repo}/{slug}/
python3 {skill-dir}/scripts/remarp_to_slides.py build {repo}/{slug}/ --block 01-fundamentals
python3 {skill-dir}/scripts/remarp_to_slides.py sync {repo}/{slug}/
python3 {skill-dir}/scripts/remarp_to_slides.py issues {repo}/{slug}/ [--json]
Phase 4 โ Review & Iterate
์ฝํ
์ธ ์์ฑ ํ ์ฌ์ฉ์์๊ฒ ์ ํ์ง๋ฅผ ์ ์: โ Remarp ์ง์ ์์ ํ "๋ฐ์ํด์ฃผ์ธ์"(โ Claude๊ฐ ์ฝ๊ณ sync) ยท โก ํ๋กฌํํธ๋ก ์์ ์์ฒญ(โ Remarp+HTML ๋์ ์์ ) ยท โข ์งํ.
๊ท์น: RemarpโHTML ๋๊ธฐ ์ ์ง(Remarp๊ฐ ์์ค) ยท ๊ธฐ์กด Canvas/quiz/์ธํฐ๋์
๋ณด์กด ยท ๋ณ๊ฒฝ ์ฌ๋ผ์ด๋๋ง ์์ ยท ๋ฌด์์ด ๋ฐ๋์๋์ง ์์ฝ.
Phase 5 โ Enhancement
@type: canvas ์ฌ๋ผ์ด๋์ Canvas ์ ๋๋ฉ์ด์
๊ตฌํ(animation-utils.js) ยท ๋ณต์ก ์ธํฐ๋์
๋ณด๊ฐ ยท presenter view(P) ๋
ธํธ ํ์ธ.
Phase 6 โ Set Up Structure
์คํฌ assets/*๋ฅผ repo common/์ ๋ณต์ฌ: cp {skill-dir}/assets/* {repo}/common/. ๊ตฌ์กฐ: {repo}/index.html(ํ๋ธ) + common/(theme.css, slide-framework.js, slide-renderer.js, presenter-view.js, animation-utils.js, quiz-component.js, export-utils.js, [aws-icons/], [pptx-theme/]) + {slug}/(TOC index.html + NN-block.html). TOC์ export ๋ฒํผ:
<div class="export-toolbar">
<button class="export-btn" onclick="ExportUtils.exportPDF({ title: 'Title' })">Export PDF</button>
<button class="export-btn" onclick="ExportUtils.exportPPTX({ title: 'Title' })">Export PPTX</button>
<button class="export-btn" onclick="ExportUtils.downloadZIP()">Download ZIP</button>
</div>
<script src="../common/export-utils.js"></script>
(๋น๋๊ฐ ์์ฑํ๋ toc.html์๋ ๋ธ๋ก๋ณ/์ ์ฒด PDFยทZIPยทPPTX ๋ฒํผ์ด ์ด๋ฏธ ํฌํจ๋จ.)
Phase 7 โ Quality Review (ํ์ โ ์๋ต ๋ถ๊ฐ)
- content-review-agent ํธ์ถ โ
review content at [๊ฒฝ๋ก] ยท 2. FAIL/REVIEW ์ ์์ ํ ์ฌ๋ฆฌ๋ทฐ(์ต๋ 3ํ) ยท 3. PASS(โฅ85์ ) ํ์๋ง ์๋ฃ ์ ์ธ.
โ ๏ธ ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐฐํฌ ๊ธ์ง.
Phase 8 โ Verify
๋ธ๋ก๋ณ ์ ๊ฒ: ์ฌ๋ผ์ด๋ ์ ์ผ์น ยท SlideFramework ์ต์
(footer/logoSrc/presenterNotes) ยท ๋ชจ๋ Canvas ID์ setupCanvas() ยท quiz data-quiz/data-correct ยท ../common/ ์๋๊ฒฝ๋ก ยท theme-override.css ๋งํฌ๋จ(PPTX ์ถ์ถ ์) ยท ์ธ์ด ยท ์ฒซ ์ฌ๋ผ์ด๋=Session Cover(ยง0a/ยง0b, .title-slide ์๋) ยท ๋ง์ง๋ง=Thank You(๋ชฉ์ฐจ ๋งํฌ).
Screenshot ๊ฒ์ฆ (ํ์): Playwright MCP๋ก FHD 1920ร1080(์ฃผ ํด์๋) + 4K 3840ร2160์์ ๋ชจ๋ ์ธํฐ๋ํฐ๋ธ/Canvas ์ฌ๋ผ์ด๋ ์บก์ฒ. ํ์ธ: ํ
์คํธ ๊ฐ๋
์ฑยท์บ๋ฒ์ค ๋น์จยท์ค๋ฒํ๋ก์ฐ ์์ยท์ปจํธ๋กค ํ์. ์ธํฐ๋์
(ํญ/์ฌ๋ผ์ด๋/๋ฒํผ) ํ ์บก์ฒ. Canvas step ์ฌ๋ผ์ด๋๋ ArrowDown/Up์ผ๋ก ์ ์ฒด step ์ํํ๋ฉฐ ๊ฐ step ์บก์ฒ(๊ฒน์นจยท์ ๋ ฌยท๊ฐ๋
์ฑ). N(๋
ธํธ)ยทF(ํ์คํฌ๋ฆฐ) ์ค์ผ์ผ๋ง ํ์ธ. ์บก์ฒ ๊ฒํ ์ ๋์์ธ ์๊ธฐ๋นํ: references/design-direction.md ยง6 ์ ์ ์ฒดํฌ๋ฆฌ์คํธ ์ ์ฉ.
์ค์ผ์ผ๋ง: ๊ณ ์ 1920ร1080 ๋์์ธ ์บ๋ฒ์ค + transform: scale(min(vw/1920, vh/1080)) โ FHD/4K ํฝ์
์ผ๊ด.
Phase 8.5 โ PPTX Export (์์ฒญ ์)
"PPT/PPTX๋ก ๋ด๋ณด๋ด๊ธฐ" ์์ฒญ ์ ๋ ๊ฒฝ๋ก:
pip install 'playwright>=1.40' 'python-pptx>=1.0' && playwright install chromium
python3 {skill-dir}/scripts/export_pptx.py {repo}/{slug}/ -o {slug}.pptx
- ๋ธ๋ผ์ฐ์ ๊ฒฝ๋ก(๋๊ตฌ ์ค์น ๋ถํ์):
toc.html์ Export PPTX ๋ฒํผ(ExportUtils.exportPPTX, html2canvas+PptxGenJS CDN โ ํ์ง์ headless ๊ฒฝ๋ก๊ฐ ์ฐ์).
- ๊ฐ ์ฌ๋ผ์ด๋๋ fragment ์ ์ฒด ๊ณต๊ฐ + Canvas ์ต์ข
step ์ํ๋ก ์บก์ฒ๋๊ณ ,
:::notes๊ฐ PPTX ์คํผ์ปค ๋
ธํธ๋ก ๋ค์ด๊ฐ.
- ์ ๋ขฐ ๊ฒฝ๊ณ: ์ง์ ๋น๋ํ ๋ฑ๋ง export (์บก์ฒ ์ค ๋ฑ์ HTML/JS๊ฐ headless ๋ธ๋ผ์ฐ์ ์์ ์คํ๋จ).
- ๋ค์ดํฐ๋ธ(ํธ์ง ๊ฐ๋ฅํ) PPTX๊ฐ ํ์ํ๋ฉด ์ด ์คํฌ์ด ์๋๋ผ
aws-light-fcd ์คํฌ๋ก ๋ผ์ฐํ
(presentation-agent ๋์คํจ์ฒ ๊ท์น).
Phase 9 โ Deploy
git add common/ {slug}/ index.html && git commit -m "feat: add {name} interactive training" && git push origin main
GitHub Pages: Settings โ Pages โ main / root.
์์ฑ ๊ท์นยทํจํด (์์ธ โ ์์ฑ/๊ฒ์ฆ ์ ์ฝ๊ธฐ)
- references/authoring-rules.md โ Validation ๊ท์น(ยง1) ยท Forbidden AI-tells(ยง2) ยท Slide Title Voice(ยง3) ยท Interactive ํจํด+ํญ ํ
ํ๋ฆฟ+์์ ํ ํฐ(ยง4) ยท Slide Type ๊ฒฐ์ + Canvas vs html/diagram(ยง5) ยท HTML Architecture flow ํจํด(ยง6)
:::canvas๋ฅผ ์ฐ๊ธฐ ์ ๋ฐ๋์ references/canvas-authoring-guide.md (DSL ๋ฌธ๋ฒ, ํ์ ์ขํ ๊ณต์, fragment ์์). validate๊ฐ CANVAS_OVERLAP backstop.
- ๋ทฐ์ด ๋จ์ถํค(โโ Space โโ F N P O S B Esc 1-9): references/keyboard-shortcuts.md.
Quality Assurance (์ฌ์ค ๊ฒ์ฆ โ YAML/config ์ธ์ฉ ์)
- Canvas ๋น๋ก ์ค์ผ์ผ: ๋ชจ๋ Canvas๋
ResizeObserver + BASE_W/BASE_H + ctx.scale(scale*dpr, scale*dpr) ํจํด ํ์ (FHD/4K ๋์). setupCanvas() ๋จ๋
๊ธ์ง (px max-width ๊ณ ์ ๋จ). slide-patterns.md ยง5.
- Karpenter v1:
expireAfter๋ spec.template.spec (NOT spec.disruption). ๋ฉํธ๋ฆญ์ _total ์ ๋ฏธ์ฌ. (karpenter.sh ํ์ธ)
- Grafana Loki: derivedFields๋
regex (NOT matcherRegex).
- GitBook ์ต์ปค: ํ๊ธ ์ ๋ชฉ์ ํ๊ธ ์ฌ๋ฌ๊ทธ (
## 1. ๊ด์ธก์ฑ โ #1-๊ด์ธก์ฑ, ์ซ์ ๋ค ์ ์ ๊ฑฐ, ๊ณต๋ฐฑโํ์ดํ).
- K8s:
topologySpreadConstraints๋ labelSelector ํ์. VPA Auto๋ deprecated (โ Recreate).
Resources
assets/ (โ common/): design-tokens.css ยท theme.css ยท theme-override-template.css ยท slide-framework.js ยท slide-renderer.js ยท presenter-view.js ยท animation-utils.js ยท quiz-component.js ยท export-utils.js
scripts/: extract_pptx_theme.py ยท remarp_to_slides.py ยท export_pptx.py(headless PPTX) ยท marp_to_slides.py(๋ ๊ฑฐ์) ยท extract_aws_icons.py
references/: design-direction.md(๋์์ธ ์์น/ํ
๋ง ์ ํ) ยท authoring-rules.md(์์ฑ ๊ท์น/ํจํด) ยท framework-guide.md(CSS/JS API) ยท slide-patterns.md(ํ์
๋ณ ํจํด) ยท remarp-format-guide.md(Remarp ๋ฌธ๋ฒ) ยท interactive-patterns-guide.md(๊ณ ๊ธ ์ธํฐ๋์
) ยท canvas-authoring-guide.md(Canvas DSL) ยท colors-reference.md(ํ ํฐ) ยท pptx-theme-guide.md ยท aws-icons-guide.md ยท keyboard-shortcuts.md ยท marp-format-guide.md(๋ ๊ฑฐ์)
โก ํ ํฐ ์ ์ฝ: slide-patterns.mdยทinteractive-patterns-guide.mdยทremarp-format-guide.md๋ ํฐ ํ์ผ(๊ฐ ~25Kํ ํฐ)์
๋๋ค. ์ ์ฒด๋ฅผ Readํ์ง ๋ง๊ณ ์๋จ <!-- SECTION INDEX -->์ ์ ํ ๋ผ์ธ๋ฒํธ๋ก ํ์ํ ## ์น์
์ offset-read ํ์ธ์ (์: Read(file, offset=L, limit=๋ค์์น์
LโL)). ํด๋น ์น์
์ด ๋ค๋ฅธ ##/ยง๋ฅผ ์ฐธ์กฐํ๋ฉด ๊ทธ ์น์
๋ ํจ๊ป ์ฝ์ผ์ธ์(๊ต์ฐจ์ฐธ์กฐ ๋๋ฝ ๋ฐฉ์ง).