本文へ移動
cccskills
無料GitHub で公開

frontend-slides

Browser-based HTML presentation generation.

インストール方法を見る

含まれるファイル(40)

  • SKILL.md13.2 KB
  • references/pptx-conversion.md9.7 KB
  • references/slide-controller.md9.4 KB
  • scripts/assemble-controllers.py5.7 KB
  • scripts/assemble-layouts.py6.3 KB
  • scripts/assemble-styles.py6.8 KB
  • scripts/validate-slides.py7.7 KB
  • templates/base.css998 B
  • templates/controllers/countdown-timer.js695 B
  • templates/controllers/indicator.css389 B
  • templates/controllers/slide-controller.js2.8 KB
  • templates/controllers/speaker-notes.css319 B
  • templates/controllers/speaker-notes.js500 B
  • templates/layouts/code.css442 B
  • templates/layouts/code.html134 B
  • templates/layouts/content.css628 B
  • templates/layouts/content.html143 B
  • templates/layouts/grid.css694 B
  • templates/layouts/grid.html271 B
  • templates/layouts/image.css352 B
  • templates/layouts/image.html146 B
  • templates/layouts/quote.css383 B
  • templates/layouts/quote.html144 B
  • templates/layouts/section-break.css290 B
  • templates/layouts/section-break.html75 B
  • templates/layouts/title.css385 B
  • templates/layouts/title.html109 B
  • templates/presets/arctic-minimal.css356 B
  • templates/presets/carbon-ember.css355 B
  • templates/presets/chalk-board.css351 B
  • templates/presets/glacier-blue.css359 B
  • templates/presets/lavender-mist.css354 B
  • templates/presets/obsidian-gold.css346 B
  • templates/presets/rose-noir.css369 B
  • templates/presets/sage-paper.css346 B
  • templates/presets/slate-coral.css364 B
  • templates/presets/solar-sand.css348 B
  • templates/presets/steel-wire.css422 B
  • templates/presets/void-neon.css433 B
  • tests/overflow-fixture.html4.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Frontend Slides Skill

Generate browser-based HTML presentations as a single self-contained .html file. Three entry paths: new build from topic/notes, PPTX-to-HTML conversion, or enhancement of an existing HTML deck.

Routing disambiguation: When the user says only "slides" or "deck" without specifying format, ask exactly one question before proceeding: "Should this be an HTML file (opens in browser) or a PowerPoint file (.pptx)?" This skill only produces HTML — it converts an existing PPTX to HTML but cannot generate a new .pptx file.

Style Presets

Assemble CSS: python3 skills/frontend/frontend-slides/scripts/assemble-styles.py --preset <name>. Use --list for all 12, --mood <word> to match.

Templates: templates/base.css (mandatory base), templates/presets/*.css (preset :root variables).

PresetMoodUse Case
obsidian-goldimpressedexecutive briefings, boards
arctic-minimalfocusedengineering, dev conferences
carbon-emberenergizedproduct launches, pitches
sage-paperinspiredthought leadership, narrative
void-neonfuturisticdev tools, AI, hackathons
slate-coralcontemporarySaaS demos, sales
chalk-boardeducationalworkshops, training
glacier-bluetrustedfinancial, legal, healthcare
rose-noirartisticfashion, design portfolios
solar-sandwarmnon-profit, community
steel-wireindustrialdata science, DevOps
lavender-mistcalmwellness, meditation

Slide Layouts

Assemble layout CSS: python3 skills/frontend/frontend-slides/scripts/assemble-layouts.py --layouts title,content,code. --all for everything, --include-html for HTML templates.

Each layout in templates/layouts/ has paired .html + .css: title, content, grid, code, quote, image, section-break.

Controller Diagnostics

Assemble controller: python3 skills/frontend/frontend-slides/scripts/assemble-controllers.py --core. Add --features speaker-notes,countdown-timer.

SymptomCheckFix
Skips slides on keypressgrep -c 'navigating'Add navigating guard to go()
Trackpad jumps to endrg 'clearTimeout'150ms debounce on wheel
Animations never firegrep 'display.*none'Use opacity:0 not display:none
Swipe fires on scrollgrep 'screenY'abs(dy) > abs(dx) guard
Space scrolls pagegrep -A1 'Space'e.preventDefault() before next()

Instructions

Phase 1: DETECT

Identify which of the three paths applies:

PathSignalAction
New buildUser provides topic, outline, or notes -- no existing fileProceed to Phase 2 to gather content
PPTX conversionUser provides a .pptx file pathExtract with python-pptx; collect slides, notes, and asset order; then proceed to Phase 3
HTML enhancementUser provides an existing .html deckRead the file; identify what needs improving; skip to Phase 4

GATE 1: Do not proceed without identifying the path. If the input is ambiguous (e.g., "make me a deck" with no file and no topic), ask one question to resolve it.


Phase 2: DISCOVER CONTENT

Ask exactly three questions -- no more:

  1. What is the purpose of this presentation? (e.g., pitch, tutorial, conference talk, internal review)
  2. How many slides? (approximate is fine)
  3. What is the content state? (bullet points, full prose, raw notes, nothing yet)

Collect or generate the content before touching any style decisions.

GATE 2: Content exists (or the user has confirmed topic-only intent with an explicit "I'll provide content as we go") before Phase 3 begins. Do not start style work with no content direction.


Phase 3: DISCOVER STYLE

Use the Style Presets table (above) to map mood to preset names.

Two sub-paths:

Sub-path A -- User names a preset directly: Skip previews. Confirm the preset name exists in the Style Presets table. Proceed to Phase 4.

Sub-path B -- User does not know the preset: Ask for mood using exactly these four options: impressed / energized / focused / inspired. Map the mood to candidate presets using the Style Presets table -- translate the user's mood description to a preset name rather than asking them to choose from a list. Generate 3 single-slide HTML preview files in .design/slide-previews/ -- one per candidate preset -- using real slide content (not placeholder lorem ipsum). Present the previews and ask the user to pick.

GATE 3: User has either named a preset from the Style Presets table or selected one of the three previews. A vague direction like "make it look professional" is not sufficient -- a named preset must be confirmed before Phase 4. If no selection is made, regenerate previews with different presets. Never fall back to a generic purple gradient; presets exist to avoid exactly that.


Phase 4: BUILD

Build the presentation as a single .html file with all CSS and JS inline (no external CDN dependencies). Follow these rules:

  1. CSS base block verbatim: Copy the mandatory CSS base block from templates/base.css exactly as written -- do not paraphrase or rewrite it. Apply the chosen preset's theme variables on top. The base block must be present character-for-character because the validation script checks for it.

  2. Viewport fit on every slide: Every .slide element must have height: 100vh; height: 100dvh; overflow: hidden. When content overflows, split the slide into multiple slides -- never shrink text, add scrollbars, or set min-height that could allow growth past 100dvh. A slide with scrollable content is a web page, not a slide.

  3. Density limits: One idea per slide, one headline that wins. Maximum 6 bullets per content slide and about 12 words per bullet. If content needs a 7th bullet, split into two slides -- dense text is unreadable in presentation context.

  4. Responsive sizing: All body text must use clamp() for font sizing. No fixed-height content boxes (height: 300px on inner elements). For images or code blocks that need height constraints, use max-height: min(Xvh, Ypx) with overflow: hidden.

  5. CSS negation rule: Never write -clamp(...) -- browsers silently compute it to 0, causing text to disappear. Always write calc(-1 * clamp(...)) when a negative value is needed.

  6. JS controller class: Implement SlideController with all of the following (not optional):

    • Keyboard: ArrowRight/ArrowLeft/Space forward; ArrowLeft/Backspace backward; Home/End for first/last
    • Touch/swipe: touchstart/touchend with 50px threshold
    • Wheel: debounced wheel event (150ms) -- without debounce, wheel events cause multi-slide jumps. Add a navigating flag that blocks re-entry during transition.
    • Slide index indicator: currentSlide / totalSlides visible in corner
    • Intersection Observer: add .visible class when slide enters viewport for reveal animations. Use opacity: 0 + transform: translateY(20px) to hide slides before reveal -- never display: none, which prevents Intersection Observer callbacks.
  7. Reduced-motion: Include a @media (prefers-reduced-motion: reduce) block that suppresses all transitions and animations.

  8. Font loading: Use @font-face with font-display: swap and a system font stack fallback. Never reference external CDN fonts without a local fallback. Missing font-display: swap causes invisible text during load (FOIT).

  9. PPTX path: If converting from PPTX, use python-pptx to extract text, notes, and asset paths. Preserve slide notes and maintain asset order. If python-pptx is unavailable, print a clear error and ask the user to install it (pip install python-pptx) or provide content manually -- do not silently skip content.

Optional features (off by default, add only when user requests):

  • Speaker notes panel toggled by n key
  • @media print CSS for PDF-via-browser export
  • Configurable countdown timer overlay

GATE 4: The output HTML file exists on disk and contains the verbatim mandatory CSS base block from templates/base.css. Verify with a string search before proceeding -- a file that "looks right" is not sufficient.


Phase 5: VALIDATE

Run the deterministic validation script:

python3 skills/frontend/frontend-slides/scripts/validate-slides.py path/to/output.html

Exit codes:

  • 0 -- All slides pass at all 9 breakpoints. Proceed to Phase 6.
  • 1 -- Overflow detected. The script prints which slides overflow at which breakpoints. Fix by splitting the overflowing slides. Re-run validation. Do not proceed until exit code is 0. Content that fits at 1920x1080 but overflows at 375x667 still fails -- clamp() sizing solves most cases; if not, split the slide.
  • 2 -- Playwright unavailable. Fall back to the manual checklist gate below. Tell the user validation is running in manual mode and is less reliable.

Manual checklist gate (fallback, only when exit code is 2):

For every slide, verify all of the following. If any item fails, fix it before proceeding.

  • height: 100vh and height: 100dvh present on .slide
  • overflow: hidden present on .slide
  • All body text uses clamp() for font sizing
  • No fixed-height content boxes (no height: 300px on inner elements)
  • No min-height on .slide that could allow growth past 100dvh
  • No -clamp(...) patterns anywhere in CSS

Look, then fix (final check): Run the core doc's section 10 loop on the title slide, the densest content slide, and one code or chart slide, at 1280x720 and 375x667. Each slide should pass the squint and grayscale tests with one clear headline. Fix, re-render, and stop after about three rounds.

GATE 5: Exit code 0 from the validation script, or -- only if Playwright is unavailable (exit code 2) -- explicit user confirmation that the manual checklist passed for every slide. User confirmation must enumerate the slide count checked. The look-then-fix loop has run, or the user has the checklist when no renderer exists.


Phase 6: DELIVER

  1. Delete .design/slide-previews/ unless the user explicitly asked to keep them:

    rm -rf .design/slide-previews/
    
  2. Open the file with the OS-appropriate command:

    • macOS: open path/to/output.html
    • Linux: xdg-open path/to/output.html
    • Windows: start path/to/output.html
  3. Print a delivery summary:

    File:    path/to/output.html
    Preset:  [preset-name]
    Slides:  [N]
    Theme:   [3 CSS custom properties easiest to change for re-theming]
    

GATE 6: Delivery summary printed. File exists at the stated path. Previews deleted (or user confirmed to keep). Task is complete only when all three conditions are met.

Error Handling

ErrorCauseResolution
-clamp(...) in CSSCSS negation of clamp() is silently ignored by browsers -- it computes to 0Replace every instance with calc(-1 * clamp(...)). Run a grep search for -clamp before delivery.
Font load failure / FOUTExternal font CDN unreachable, or @font-face src missing format() hintUse font-display: swap on every @font-face. Include a system font stack fallback. Test offline.
PPTX extraction errorpython-pptx unavailable, or PPTX uses embedded OLE objectsPrint a clear error message naming the missing dependency. Ask the user to pip install python-pptx or provide content manually. Do not silently skip slides.
Playwright unavailable (exit 2)playwright not installed or Chromium browser not availableFall back to the manual checklist gate in Phase 5. Explicitly tell the user validation is running in manual mode and is less reliable.
Overflow at one breakpoint onlyContent fits at 1920x1080 but overflows at 375x667clamp() sizing solves most cases. If not, split the slide. Never set a smaller viewport as "not important."
Reveal animations not triggeringIntersection Observer threshold too high, or slides hidden with display:noneUse display: flex with opacity: 0 + transform for hidden slides. Never use display: none on slides that need IO callbacks.
JS controller not advancingwheel event not debounced, causing multi-slide jumpsEnforce 150ms debounce on wheel. Add a navigating flag that blocks re-entry during transition.

Deep References

SignalReference
Phase 3 onward: any style, layout, or visual choice (load first)skills/shared-patterns/ui-design-judgment.md, then ui-design-recipes.md and ui-design-examples.md in the same folder
Phase 4 BUILD: JS controller implementationreferences/slide-controller.md
Phase 1 DETECT: PPTX extraction and conversionreferences/pptx-conversion.md

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

accounts

無料

Manage multiple Claude Code accounts: add, list, check, launch, and install shell aliases for 10+ isolated CLAUDE_CONFIG_DIR profiles.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

Improve architecture across modules by deepening interfaces.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

Assessment: read-only inspection, codebase overview, value analysis, health checks, ADR consultation, decision analysis, multi-perspective critique.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

Background memory consolidation — overnight review, merge, and injection payload for memory files.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

Jev-driven browser automation: Jev picks operations, programs execute, a text model writes field values only when Jev cannot pick one from the goal.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

Write, compose, integrate, and improve programs that call Jev, TypeSafe's System One judgment model.

日本語の概要は準備中です。原文の説明を表示しています。

notque/vexjoy-agent4412026年10月11日 更新

notque のスキルをすべて見る

このスキルの問題を報告する