360-panorama-viewer
Build a fully self-contained 360° equirectangular panorama viewer as a single HTML file. The viewer uses Three.js to render…
Create polished PowerPoint (.pptx) presentations directly from a topic or content description. Uses HTML as an invisible internal design intermediate — the HTML is never shown to the user. The final and only deliverable is a .pptx file saved to outputs/. Use this skill whenever
$ npx -y skills add happycapy-ai/happycapy-skills --skill pptx --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/pptxContext preview
The summary Claude sees to decide when to auto-load this skill.
Create polished PowerPoint (.pptx) presentations directly from a topic or content description. Uses HTML as an invisible internal design intermediate — the HTML is never shown to the user. The final and only deliverable is a .pptx file saved to outputs/. Use this skill whenever
name: pptx description: > Create polished PowerPoint (.pptx) presentations directly from a topic or content description. Uses HTML as an invisible internal design intermediate — the HTML is never shown to the user. The final and only deliverable is a .pptx file saved to outputs/. Use this skill whenever the user asks to: make a PPT / PowerPoint / 幻灯片 / 演示文稿, generate slides about a topic, or turn any content into a presentation deck. Supports Chinese and English. Always outputs .pptx, never HTML.
Generate a polished PPTX in three phases. The HTML draft is purely internal — never reference or expose it to the user.
Write a single self-contained HTML presentation to `tmp/<name>-draft.html`.
**Design principles:**
This HTML serves one purpose: capture **color theme + slide structure + text content + layout intent** before building the PPTX.
1. Read `tmp/<name>-draft.html` 2. Extract the CSS color theme using `extract_theme_from_html()` from `scripts/pptx_builder.py` 3. Write a one-off build script to `tmp/<name>-build.py`:
4. Run: `python3 tmp/<name>-build.py`
import sys
sys.path.insert(0, "/home/node/.claude/skills/pptx/scripts")
from pptx_builder import Builder, extract_theme_from_html
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
html = open("tmp/deck-draft.html").read()
theme = extract_theme_from_html(html) # {"bg":"#0b0b0b", "accent":"#c9a84c", ...}
b = Builder(theme)slide = b.new_slide() # blank slide with bg fill
# Shapes
b.rect(slide, x, y, w, h, fill="bg1", border="dim")
b.hline(slide, x, y, w, color="accent")
b.oval(slide, x, y, w, h, fill="bg1")
b.card(slide, x, y, w, h) # shortcut for bg1 card with border
# Text
b.txt(slide, "text", x, y, w, h,
size=14, bold=False, italic=False,
color="text", # theme key or "#hexcode"
align=PP_ALIGN.LEFT)
b.multicolor_txt(slide, [ # mixed colors in one line
{"text": "White ", "size": 52, "bold": True, "color": "text"},
{"text": "Gold", "size": 52, "bold": True, "italic": True, "color": "accent"},
], x, y, w, h, align=PP_ALIGN.LEFT)
# Helpers
b.eyebrow(slide, "LABEL", x, y) # small gold uppercase label
b.logo(slide, "Name", x, y)
b.slide_number(slide, n=1, total=9)
# Grid of cards
b.grid_cards(slide, items, x0, y0, card_w, card_h, gap,
cols=4, draw_fn=fn) # fn(slide, b, item, cx, cy, cw, ch)
b.save("outputs/deck.pptx")**Color keys:** any key from the theme dict (`"bg"`, `"bg1"`, `"text"`, `"muted"`, `"accent"`, `"dim"`, etc.) or a raw `"#rrggbb"` string.
**Slide size:** 13.33 × 7.5 in (16:9). Set automatically by Builder.
| Slide type | Approach | |---|---| | Cover | Oversized multicolor title (Pt 100–130), gold rule, tagline below | | Content | Eyebrow + heading + description + card grid | | Split | Left column: text + bullets. Right column: visual card panel | | Quote | Centered quote Pt 44–60, accent line above | | CTA | Centered heading + description + gold button rect + stats row |
**Limits per slide:** 1 heading, max 6 bullets, max 6 cards in a grid.
**Cover with giant title:**
s = b.new_slide()
b.multicolor_txt(s, [
{"text": "My ", "size": 120, "bold": True, "color": "text"},
{"text": "Brand", "size": 120, "bold": True, "color": "accent"},
], Inches(0.8), Inches(1.0), Inches(12), Inches(3.5))
b.hline(s, Inches(0.8), Inches(4.8), Inches(2.5))
b.txt(s, "Tagline text here", Inches(0.8), Inches(5.1), Inches(7), Inches(0.9),
size=16, color="muted")
b.slide_number(s, 1, 9)**Card grid:**
items = [("📝", "Title", "Description"), ...]
def draw(slide, b, item, cx, cy, cw, ch):
ico, lbl, desc = item
b.txt(slide, ico, cx+Inches(0.2), cy+Inches(0.2), cw, Inches(0.5), size=20)
b.txt(slide, lbl, cx+Inches(0.2), cy+Inches(0.8), cw-Inches(0.4), Inches(0.45), size=12, bold=True)
b.txt(slide, desc, cx+Inches(0.2), cy+Inches(1.3), cw-Inches(0.4), Inches(0.65), size=10, color="muted")
b.grid_cards(s, items, Inches(0.8), Inches(3.4), Inches(2.9), Inches(2.1), Inches(0.22), cols=4, draw_fn=draw)**Bullet list with gold dots:**
bullets = ["Item one", "Item two", "Item three"]
for i, text in enumerate(bullets):
fy = Inches(3.5) + i * Inches(0.55)
b.oval(s, Inches(0.8), fy + Inches(0.15), Inches(0.12), Inches(0.12), fill="accent")
b.txt(s, text, Inches(1.1), fy, Inches(5.0), Inches(0.45), size=13)**Gold CTA button:**
b.rect(s, Inches(4.7), Inches(5.1), Inches(3.9), Inches(0.6), fill="accent", border=None)
b.txt(s, "Get Started →", Inches(4.7), Inches(5.13), Inches(3.9), Inches(0.55),
size=13, bold=True, color="bg", align=PP_ALIGN.CENTER)A curated collection of high-quality Claude Code skills to enhance your development workflow
Build a fully self-contained 360° equirectangular panorama viewer as a single HTML file. The viewer uses Three.js to render…
Expert in building 3D experiences for the web - Three.js, React Three Fiber, Spline, WebGL, and interactive 3D scenes. Covers…
Reusable fixed-style PPTX generation skill for the Acid Labels visual brand — bold acid-green (#A9FF7A) operating-guide aesthetic…
Generate AI images with FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: FLUX Dev LoRA, FLUX.2…
Generate AI videos with Google Veo, Seedance, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 1.5…
Reusable fixed-style PPTX generation skill for the Apricot Ritual Index visual brand — warm apricot background (#FDDEB6),…