
Frontend Slides Editable
- 354 installs
- 452 repo stars
- Updated July 1, 2026
- archlizheng/frontend-slides-editable
frontend-slides-editable is a skill that generates zero-dependency single-file HTML presentations with a built-in in-browser editor for moving objects, reordering slides, and exporting HTML.
About
This skill generates single-file HTML slide presentations that remain editable in the browser after they are created. Developers use it when they want a self-contained deck with an in-browser editor that supports moving objects, reordering slides, text formatting, undo/redo, local save, and HTML export. It ports 34 real templates from beautiful-html-templates and can convert PPT/PDF decks into editable web decks.
- Generates zero-dependency single-file HTML presentations that stay editable in the browser
- Built-in editor: drag objects, multi-select with Ctrl+click, alignment snapping, undo/redo, Pages sidebar
- Ctrl+S persistence and export HTML, plus PPT/PDF-to-web conversion
Frontend Slides Editable by the numbers
- 354 all-time installs (skills.sh)
- Ranked #697 of 2,245 Frontend Development skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
frontend-slides-editable capabilities & compatibility
- Capabilities
- presentations · html export · slide editor
- Use cases
- presentations · frontend
What frontend-slides-editable says it does
Create zero-dependency, animation-rich HTML presentations that run entirely in the browser **with a built-in editor**
This skill is a **copy of the `frontend-slides` skill** extended with the editable deck runtime.
npx skills add https://github.com/archlizheng/frontend-slides-editable --skill frontend-slides-editableAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 354 |
|---|---|
| repo stars | ★ 452 |
| Last updated | July 1, 2026 |
| Repository | archlizheng/frontend-slides-editable ↗ |
How do you build editable slide decks in frontend?
Generate a single-file HTML deck that a user can keep editing in the browser (move objects, reorder slides, save, export).
Who is it for?
Delivering an editable HTML slide deck that runs entirely in the browser with no dependencies
Skip if: Read-only decks without editor weight (the parent frontend-slides skill is recommended for those)
When should I use this skill?
when the user wants a single-file HTML presentation that stays editable in the browser after generation
What you get
One self-contained editable HTML deck with drag/resize objects, slide reordering, save and export
- single-file editable HTML presentation
By the numbers
- 34 ported real-template presets from beautiful-html-templates
- 12 legacy runtime-smoke sample decks
Files
<objective> Frontend Slides (Editable)
Create zero-dependency, animation-rich HTML presentations that run entirely in the browser with a built-in editor: move objects, multi-select with Ctrl+click, alignment snapping, simple text formatting with font family + size controls, undo/redo, a Pages sidebar (slide thumbnails, drag to reorder, delete), Ctrl+S persistence, and export HTML.
This skill is a copy of the `frontend-slides` skill extended with the editable deck runtime. For read-only decks without editor weight, use the original `frontend-slides` skill instead (same skills directory layout). </objective>
<preset_fidelity> Parity with parent frontend-slides (style flexibility)
Adding edit mode must not replace preset authoring. The parent skill treats each choice in STYLE_PRESETS.md as a spec: per preset you implement its Layout prose, Signature Elements, typography, and colors — title slides and content slides differ across presets (e.g. Bold Signal’s card + big numerals vs. Notebook Tabs’ paper + edge tabs vs. Swiss Modern’s grid + red bar).
Normative behavior in Phase 3:
1. Read STYLE_PRESETS for the chosen preset(s) and reflect layout + signatures in HTML/CSS, not only :root colors and fonts. 2. The editable reference (examples/editable-deck-reference.html) supplies JS/CSS patterns (chrome, sidebar, objects, history) — not a frozen slide layout to paste on every deck. Do not reuse one generic “title + subtitle + corner rounded rectangle” geometry for every style. 3. *`examples/generated/presets/.html** are sample decks, not a layout shortcut. The 12 legacy samples are runtime smoke + visual previews; the 34 ported samples are real-template ports from beautiful-html-templates using the shared Swiss/reference runtime plus locked slot editing. For real deliveries, match the chosen preset/template grammar instead of reusing a generic README deck. 4. **Static chrome** (decorations that should not be draggable) may live outside .slide-edit-layer (e.g. background pseudo-elements, fixed nav chrome) per preset; **movable** copy and blocks stay as [data-slide-object]` inside the layer.
If runtime constraints ever conflict with a signature element, adapt the element (e.g. implement the same visual with CSS, or split into multiple objects) — do not drop preset identity for the sake of a single template. </preset_fidelity>
<template_ports> Real-template ports (slot-editable)
For the 34 ported presets from beautiful-html-templates, prefer the upstream template's mood / tone / density and visual grammar over color-token matching alone.
Interaction baseline: ported decks must use the same Swiss/reference editor chrome and object editor as examples/editable-deck-reference.html / swiss-modern.html. Native template slots are locked-layout content slots; user-added objects are normal [data-slide-object][data-oid] objects.
Important interaction contract: data-edit-slot is editable content, not a draggable component. In edit mode the user can click slot text/images to change their content with RTE/Undo/Redo/Save/Export, but the upstream template's layout grid, card geometry, decorative layers, and spacing stay locked. Only user-added objects in .slide-edit-layer become selectable, draggable, resizable components. Do not promise that every native template child will get object handles unless a separate componentization mode is explicitly requested and implemented.
Template edit modes:
data-template-edit-mode="slots"is the default. It is template-safe: authored content is editable through slots, while layout and decoration remain locked.data-template-edit-mode="components"is an optional generated mode for semantic blocks that can be represented as[data-slide-object].- In delivered ported decks, Unlock layout componentizes the current slide on demand by creating movable copies of editable slots in
.slide-edit-layer. The original native template DOM stays in place for fidelity, and the operation is undoable. - Never componentize every DOM node. Exclude backgrounds, grids, axes, ticks, decorative marks, texture/glitch layers, SVG paths, animation wrappers, and pure layout containers.
When using or extending a ported preset:
1. Treat the matching beautiful-html-templates/templates/{source_slug}/template.html as the visual system: preserve fonts, CSS variables, slide-level classes, layout grid, decorative DOM, and component grammar. 2. Edit authored content through slots, not by decomposing the template into draggable boxes. Use:
data-edit-slotdata-slot-type="text|image|metric|table-cell"data-slot-labeldata-slot-locked-layout="true"
3. Keep decorative elements locked unless the user should naturally change that exact item. Grids, paper texture, hairlines, scan lines, pixel/glitch layers, ornamental marks, and layout containers should not become draggable objects. 4. Preserve .slide-edit-layer for user-added freeform objects. Added objects can use [data-slide-object][data-oid] and the normal Swiss drag/resize/multi-select runtime; native template slots use the Swiss RTE/Undo/Redo/Save/Export path but do not get move/resize handles. 5. If a needed slide type is missing, design a new slide in the same template system: same fonts, palette, spacing rhythm, chrome, and component grammar. Do not mix in another template's visual language. </template_ports>
<discovery_gate> Discovery gate (do not skip)
Models often jump straight to generating HTML. For Mode A (new deck) and Mode B (PPT or PDF) after extraction, you must finish Phase 1 before Phase 2, and Phase 2 before Phase 3 — unless a narrow exception below applies.
Hard rule: Unless the user provides in one turn (or one clearly scoped batch) every item in the Phase 1 checklist, you must run Phase 1 first as one grouped message (or a structured question UI). If the batch is incomplete, send only the missing checklist items in the next message — do not guess slide count, outline depth, preset, or language. *Invoking `/frontend-slides-editable` or attaching this skill does not waive discovery. A one-liner (e.g. “用 skill 介绍它自己”, “做一份某某主题的演示”) is topic / intent only*, not a brief.
Phase 1 checklist (complete brief — all required without model inference):
| # | Dimension | What “done” means |
|---|---|---|
| 1 | Purpose | Pitch / teaching / conference / internal / meta-role (e.g. skill onboarding), etc. |
| 2 | Length | Slide-count band (e.g. short 5–10 / medium 10–20 / long 20+) or exact count — never inferred from topic alone |
| 3 | Content | Pasted outline, bullets, draft copy, or named source + extract scope (e.g. “README §X–Y only”); not “a theme” alone |
| 4 | Style direction | Phase 1 style preference cluster or a named preset from STYLE_PRESETS.md or explicit delegation (“you choose”) — if only “you choose”, Phase 2 still runs to narrow via recommendations/previews unless the user also explicitly skips previews |
| 5 | Editing | Confirm full editable runtime (this skill’s default) or explicit switch to parent read-only frontend-slides |
| 6 | Images | No / yes / unsure; if yes, files may arrive later, but intent is explicit |
| 7 | Mobile | Required answer: Desktop-first only (default) or Adapt for phone portrait + landscape; do not infer this silently |
| — | Language / locale | When prose is audience-facing and not already stated: monolingual / bilingual / per-locale files — ask in Phase 1 |
Images vs outline: Co-design outline ↔ images (Step 1.2) only after the user has real assets or links to evaluate. Do not skip Phase 1 dimensions just because images are pending; capture “yes, will provide” in Phase 1, then run image evaluation when files exist.
Mode B (PPT / PDF): After extract-pptx.py (.pptx) or extract-pdf.py (.pdf), present titles/summaries/asset counts and still run Phase 1 for anything extraction does not decide: length goals if restructuring, style direction, editing scope, locale, and image handling notes on extracted assets. Do not jump from “here’s the extract” straight to only style picking — close Phase 1 gaps first, then Phase 2, then codegen.
When Phase 1 and/or Phase 2 may be shortened (narrow exceptions only):
1. Explicit opt-out — User clearly skips discovery and/or previews (e.g. “跳过发现,你全部决定”, “no discovery — just generate”). 2. Complete written brief — Same batch already satisfies every Phase 1 checklist row without you guessing, and either (a) a named preset is chosen so Phase 2 can be a direct handoff to Phase 3, or (b) the user explicitly allows no previews and accepts your single recommended preset.
Default order: Phase 1 (grouped) → Phase 2 (show, don’t tell) → Phase 3. Never start Phase 3 to “save turns.”
Partial answers: Next message = only missing Phase 1 items, then resume Phase 2.
Never infer silence as approval. Mode C (enhance existing HTML): precise change list may skip full Phase 1–2; vague “make it better” → 1–2 clarifying questions first.
Anti-pattern: Generating HTML because the skill was attached or because you “already know” a good length or preset — failure mode.
Skipping discovery to “save turns” is a failure mode for this skill. </discovery_gate>
<core_principles> Core Principles
1. Zero Dependencies — Single HTML files with inline CSS/JS. No npm, no build tools. 2. Show, Don't Tell — Generate visual previews, not abstract choices. People discover what they want by seeing it. 3. Distinctive Design — No generic "AI slop." Every presentation must feel custom-crafted. 4. Viewport Fitting (NON-NEGOTIABLE) — Every slide MUST fit exactly within 100vh. No scrolling within slides, ever. Content overflows? Split into multiple slides. </core_principles>
<design_aesthetics> Design Aesthetics
You tend to converge toward generic, "on distribution" outputs. In frontend design, this creates what users call the "AI slop" aesthetic. Avoid this: make creative, distinctive frontends that surprise and delight.
Focus on:
- Typography: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics.
- Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. Draw from IDE themes and cultural aesthetics for inspiration.
- Motion: Use CSS-only animations and transitions in generated decks (this skill outputs single-file HTML, no React and no Motion library). Focus on high-impact moments: one well-orchestrated load with staggered reveals (
animation-delay) beats scattered micro-interactions. - Backgrounds: Create atmosphere and depth rather than defaulting to solid colors. Layer CSS gradients, use geometric patterns, or add contextual effects that match the overall aesthetic.
Avoid generic AI-generated aesthetics:
- Overused font families (Inter, Roboto, Arial, system fonts)
- Cliched color schemes (particularly purple gradients on white backgrounds)
- Predictable layouts and component patterns
- Cookie-cutter design that lacks context-specific character
Interpret creatively and make unexpected choices that feel genuinely designed for the context. Vary between light and dark themes, different fonts, different aesthetics. You still tend to converge on common choices (Space Grotesk, for example) across generations. Avoid this: it is critical that you think outside the box! </design_aesthetics>
<viewport_fitting_rules> Viewport Fitting Rules
These invariants apply to EVERY slide in EVERY presentation:
- Every
.slidemust haveheight: 100vh; height: 100dvh; overflow: hidden; - ALL font sizes and spacing must use
clamp(min, preferred, max)— never fixed px/rem - Content containers need
max-heightconstraints - Images:
max-height: min(50vh, 400px) - Breakpoints required for heights: 700px, 600px, 500px
- Include
prefers-reduced-motionsupport - Never negate CSS functions directly (
-clamp(),-min(),-max()are silently ignored) — usecalc(-1 * clamp(...))instead
When generating, read `viewport-base.css` and include its full contents in every presentation.
Content Density Limits Per Slide
| Slide Type | Maximum Content |
|---|---|
| Title slide | 1 heading + 1 subtitle + optional tagline |
| Content slide | 1 heading + 4-6 bullet points OR 1 heading + 2 paragraphs |
| Feature grid | 1 heading + 6 cards maximum (2x3 or 3x2) |
| Code slide | 1 heading + 8-10 lines of code |
| Quote slide | 1 quote (max 3 lines) + attribution |
| Image slide | 1 heading + 1 image (max 60vh height) |
Content exceeds limits? Split into multiple slides. Never cram, never scroll. </viewport_fitting_rules>
<quick_start> <mode_detection> Phase 0: Detect Mode
Determine what the user wants:
- Mode A: New Presentation — Create from scratch. Go to Phase 1.
- Mode B: PPT / PDF conversion — Convert a
.pptxor.pdffile. Go to Phase 4. - Mode C: Enhancement — Improve an existing HTML presentation. Read it, understand it, enhance. Follow Mode C modification rules below.
</mode_detection>
<mode_c_modification_rules> Mode C: Modification Rules
When enhancing existing presentations, viewport fitting is the biggest risk:
1. Before adding content: Count existing elements, check against density limits 2. Adding images: Must have max-height: min(50vh, 400px). If slide already has max content, split into two slides 3. Adding text: Max 4-6 bullets per slide. Exceeds limits? Split into continuation slides 4. After ANY modification, verify: .slide has overflow: hidden, new elements use clamp(), images have viewport-relative max-height, content fits at 1280x720 5. Proactively reorganize: If modifications will cause overflow, automatically split content and inform the user. Don't wait to be asked
When adding images to existing slides: Move image to new slide or reduce other content first. Never add images without checking if existing content already fills the viewport. </mode_c_modification_rules>
<phase_1_content_discovery> Phase 1: Content Discovery (New deck & PPT/PDF path)
Centralize Phase 1: For Mode A and for Mode B after extraction, deliver the checklist in one grouped interaction (see Discovery gate above) — not dribbled across many turns. If the user’s first message is incomplete, only ask missing items next.
Do not jump to style previews or HTML until Phase 1 is satisfied (exceptions: Discovery gate).
Ask ALL discovery questions (1–6 below) in that grouped interaction when starting from scratch. Use a structured question tool when available; otherwise one concise message:
Question 1 — Purpose (header: "Purpose"): What is this presentation for? Options: Pitch deck / Teaching-Tutorial / Conference talk / Internal presentation
Question 2 — Length (header: "Length"): Approximately how many slides? Options: Short 5-10 / Medium 10-20 / Long 20+
Question 3 — Content (header: "Content"): Do you have content ready? Options: All content ready / Rough notes / Topic only
Question 4 — Style preference (header: "Style Pref"): What visual direction sounds closest as a starting point? Options:
- "Recommend for me" — infer from audience, topic, and content
- "Clean / Professional" — restrained, polished, trustworthy
- "Bold / Experimental" — high-contrast, energetic, surprising
- "Editorial / Warm" — human, crafted, story-forward
- "Technical / Minimal" — precise, structured, product-like
- "I already know the preset" — skip to a direct preset choice
Question 5 — Editing scope (header: "Editing"): Confirm the user wants the full editable runtime (default for this skill): object layout, Pages sidebar, undo/redo. If they explicitly want a minimal read-only file only, switch to the parent frontend-slides skill instead — do not strip the runtime from this skill arbitrarily.
Question 6 — Assets / images (header: "Images"): Will this deck use image files you will provide (folder, uploads, or links)? Options: No images (CSS/graphics only) / Yes — I will provide images / Unsure — recommend
Question 7 — Mobile adaptation (header: "Mobile"): Should this editable deck be adapted for phone use in both portrait and landscape? Options: Desktop-first only (recommended; keeps the deck optimized for presenting/editing on desktop) / Adapt for phone portrait + landscape (adds mobile-specific CSS hooks, sidebar behavior, and extra viewport verification). This is a required Phase 1 answer for new decks and for PPT/PDF conversions after extraction.
Language / locale (include in the same grouped message when relevant): If the deliverable must be monolingual, bilingual, or localized (e.g. CN/EN on the same slides vs two files), ask once here when the user has not already stated it.
If the user has draft content (bullets, doc, outline), ask them to paste or attach it in the same turn or immediately after Phase 1.
<image_evaluation> Step 1.2: Image Evaluation (if images provided)
If Question 6 was No images or the user has not supplied any image files yet → proceed to Phase 2 after Phase 1 is otherwise complete (you may still ask them to add images later before Phase 3 if they change their mind).
If user provides an image folder (or links) after Phase 1 marked images as yes: 1. Scan — List all image files (.png, .jpg, .svg, .webp, etc.) 2. Inspect each image — Use the host's available image/file viewing capability 3. Evaluate — For each: what it shows, USABLE or NOT USABLE (with reason), what concept it represents, dominant colors 4. Co-design the outline — Curated images inform slide structure alongside text. This is NOT "plan slides then add images" — design around both from the start (e.g., 3 screenshots → 3 feature slides, 1 logo → title/closing slide) 5. Confirm the outline in one grouped follow-up (structured question UI when available): "Does this slide outline and image selection look right?" Options: Looks good / Adjust images / Adjust outline
Logo in previews: If a usable logo was identified, embed it (base64) into each style preview in Phase 2 — the user sees their brand styled three different ways. </image_evaluation> </phase_1_content_discovery>
<phase_2_style_discovery> Phase 2: Style Discovery (Show, don’t tell)
Start only after Phase 1 is complete (see Discovery gate).
Purpose: Narrow the aesthetic visually — most people can’t name what they want. Use HTML previews (and concrete anchors from STYLE_PRESETS.md + repo examples: examples/generated/presets/ smoke decks, examples/editable-deck-reference.html for runtime chrome) so the user picks direction, then preset or mix.
This is the "show, don't tell" phase.
<style_preference_first> Step 2.0: Style Preference First
Start from the style preference captured in Phase 1. Before asking the user how they want to choose, give a short recommendation list of 2-4 presets that best match their preference, audience, and content. Tie names to STYLE_PRESETS rows (and, when helpful, “see generated sample *.html for slug X”) so choices are grounded, not abstract.
Use this mapping as the starting point:
| Style preference | Suggested presets |
|---|---|
| Recommend for me | Infer from purpose + audience + content, then recommend 2-4 strongest fits |
| Clean / Professional | Bold Signal, Electric Studio, Swiss Modern |
| Bold / Experimental | Creative Voltage, Neon Cyber, Split Pastel |
| Editorial / Warm | Dark Botanical, Vintage Editorial, Paper & Ink |
| Technical / Minimal | Swiss Modern, Terminal Green, Notebook Tabs |
| I already know the preset | Skip recommendation explanation and go straight to preset picking |
Explain the recommendation briefly in concrete terms, for example: audience fit, energy level, brand tone, or content density.
If the user already chose "I already know the preset" in Phase 1, skip Step 2.1 and go straight to the preset picker. </style_preference_first>
<style_path> Step 2.1: Style Path
Ask how they want to choose (header: "Style"):
- "Pick from recommendations" (recommended) — Choose directly from the suggested presets (still show thumbnails or one-liner visual cues from presets when possible)
- "Show me options" — Generate 3 single-slide HTML previews (Step 2.3) to shrink the search space before locking a preset
- "I know what I want" — Pick from the full preset list in STYLE_PRESETS.md
If direct preset name: Confirm against STYLE_PRESETS, then Phase 3. If "you choose" from Phase 1: Default path = recommendations + offer previews before generating. </style_path>
<mood_selection> Step 2.2: Mood Selection (Guided Discovery)
Ask (header: "Vibe", multiSelect: true, max 2): What feeling should the audience have? Options:
- Impressed/Confident — Professional, trustworthy
- Excited/Energized — Innovative, bold
- Calm/Focused — Clear, thoughtful
- Inspired/Moved — Emotional, memorable
Use the user's style preference and recommended preset cluster to steer this question. If the preference already strongly determines the direction, keep the previews within that neighborhood instead of scattering across unrelated aesthetics. </mood_selection>
<style_previews> Step 2.3: Generate 3 Style Previews
Based on mood and the earlier style preference, generate 3 distinct single-slide HTML previews showing typography, colors, animation, and overall aesthetic. Read STYLE_PRESETS.md for available presets and their specifications.
| Mood | Suggested Presets |
|---|---|
| Impressed/Confident | Bold Signal, Electric Studio, Dark Botanical |
| Excited/Energized | Creative Voltage, Neon Cyber, Split Pastel |
| Calm/Focused | Notebook Tabs, Paper & Ink, Swiss Modern |
| Inspired/Moved | Dark Botanical, Vintage Editorial, Pastel Geometry |
Save previews under a project-local scratch folder (e.g. .claude-design-slide-previews/ or .design/slide-previews/) as style-a.html, style-b.html, style-c.html. Each should be self-contained, ~50-100 lines, showing one animated title slide.
Open each preview in the default browser when possible: macOS open path/to/file.html; Linux xdg-open path/to/file.html; Windows start path\to\file.html.
When possible, keep at least 2 of the 3 previews within the recommended preset family so the user sees relevant variations before they see outliers. </style_previews>
<user_picks> Step 2.4: User Picks
Ask (header: "Style"): Which style preview do you prefer? Options: Style A: [Name] / Style B: [Name] / Style C: [Name] / Mix elements
If "Mix elements", ask for specifics. </user_picks> </phase_2_style_discovery>
<phase_3_generate_presentation> Phase 3: Generate Presentation
Generate the full presentation using content from Phase 1 (text, or text + curated images) and style from Phase 2.
If images were provided, the slide outline already incorporates them from Step 1.2. If not, CSS-generated visuals (gradients, shapes, patterns) provide visual interest — this is a fully supported first-class path.
Before generating, read these supporting files:
- STYLE_PRESETS.md — Authoritative visual spec for the chosen preset (layout, signature, fonts, colors) — same role as in parent
frontend-slides - editor-runtime.md — DOM contract (
data-slide-object,data-oid, edit layer), history types, snap rules, generator checklist - examples/editable-deck-reference.html — Copy the deck runtime (editor + sidebar + history + persistence patterns); do not treat its slide markup as the only allowed layout
- html-template.md — HTML architecture and integration notes
- viewport-base.css — Mandatory CSS (include in full)
- animation-patterns.md — Animation reference for the chosen feeling
- For ported presets, also read local
beautiful-html-templates/templates/{source_slug}/template.htmlandtemplate.jsonwhen available; useSTYLE_PRESETS.mdas the index, but the upstream template as the detailed design grammar.
Key requirements:
- Single self-contained HTML file, all CSS/JS inline
- Include the FULL contents of viewport-base.css in the
<style>block - Preset fidelity: Implement Layout and Signature Elements from STYLE_PRESETS.md for the selected style. Vary structure slide-to-slide and preset-to-preset; avoid a single repeated title-slide prototype across all aesthetics (parent skill does not do that).
- Ported preset fidelity: For the 34 ported presets, preserve the upstream template DOM/CSS/classes and make authored content slot-editable. Prefer locked native layout + editable
data-edit-slotcontent over making every native element draggable. - Every slide
section.slidemust have a stableid; movable content lives in.slide-edit-layeras[data-slide-object][data-oid]per editor-runtime.md - Deck slide list: Never use a global
querySelectorAll('section.slide')when a filmstrip clones slides — use only slides under the deck wrapper (e.g..slides-offset+:scope > section.slide). See html-template.md §Regression guard. - Mobile adaptation: If Phase 1 selected phone support, set
data-mobile-adaptation="enabled"on<html>and include portrait + landscape media rules for the deck chrome, sidebar, and slide objects. If not selected, setdata-mobile-adaptation="desktop-default"so validation can distinguish an explicit desktop-first choice from an omitted decision. - Embed the editable deck runtime (from the reference example):
SlideDeck, object editor (select / drag / snap / RTE toolbar),SlideSidebar,HistoryStack, save/export - Use fonts from Fontshare or Google Fonts — never system fonts
- Add detailed comments explaining each section
- Every section needs a clear
/* === SECTION NAME === */comment block
</phase_3_generate_presentation>
<phase_4_ppt_conversion> Phase 4: PPT / PDF conversion
When converting PowerPoint (.pptx) or PDF (.pdf) files:
1. Extract content
- PPTX:
python3 scripts/extract-pptx.py <input.pptx> <output_dir>(install python-pptx if needed:pip install python-pptx) - PDF:
python3 scripts/extract-pdf.py <input.pdf> <output_dir>(install PyMuPDF if needed:pip install pymupdf). Optional:--raster-if-emptyrenders a page to PNG when that page has no extractable text and no embedded images (e.g. scanned-like pages still need separate OCR; this flag only captures a bitmap of the page). - Both writers emit the same intermediate: `extracted-slides.json` + `assets/` (one record per slide/page; PDF has no speaker notes — use
notes: "").
2. Confirm with user — Present extracted slide/page titles, content summaries, and image counts 3. Phase 1 (close gaps) — Extraction supplies content, but you still need explicit answers for anything not fixed by the file: style direction (or preset/delegate), full editable vs read-only, locale, length intent if merging/splitting slides, and image handling on extracted assets. One grouped follow-up for missing items only. 4. Phase 2 — Style discovery (previews / preset pick); see Phase 2: Style Discovery in this skill file 5. Generate HTML — Convert to chosen style, preserving all text, images (from assets/), slide order; PPTX: speaker notes as HTML comments. PDF: no notes in source — omit or leave comment placeholders only if the user supplies them separately.
PDF caveats: Text reading order and “title vs body” are heuristic; layout is not object-level like PPTX. Image-only PDFs need --raster-if-empty or external OCR for usable text. </phase_4_ppt_conversion> </quick_start>
<success_criteria> Phase 5: Delivery
1. Clean up — Delete the temporary slide-previews folder (see Phase 2) if it exists 2. Smoke check (quick) — Before handing off: open the file once; confirm no in-slide scrolling at ~1280×720; if mobile support was selected, also check ~390×844 portrait and ~844×390 landscape; in edit mode, open Pages, reorder one slide, Copy one slide, add +New Page, and refresh — no duplicate slides or object ids (regression guard); Export HTML opens and runs standalone 3. Open — Launch in default browser: macOS open [filename].html; Linux xdg-open [filename].html; Windows start [filename].html 4. Summarize — Tell the user:
- File location, style name, slide count
- Navigation: Arrow keys, Space, scroll/wheel (wheel disabled while edit mode on), click nav dots
- Edit mode:
Eenters edit mode. Hover the top-left to reveal Edit, Pages, and (while editing) Undo / Redo / Done; controls hide after the pointer leaves (~400ms). Done (same cluster) exits edit mode — the Edit button label stays Edit. Esc blurs text first, then exits edit mode when not typing in a text box - Pages sidebar for thumbnails, reorder (drag rows), hover Copy on a thumbnail to duplicate that page, delete slides, and use +New Page beside Export HTML to insert a blank style-matched page after the current slide
- Objects: drag ⠿ to move; hover × on an object or use Delete/Backspace to remove (multi-select confirms in English); drag corner resize on selected objects to change width/height (text reflows); Ctrl+click multi-select (macOS: Control key)
- Add element: Add element (top-left with Edit/Pages in edit mode) opens a menu: Text, Image (URL or placeholder), Video (URL + controls)
- Snap: aligns to slide center and other objects — not to the outer slide edges
- Text: click text to type; floating toolbar: B/I plus Font · Scale · Px drawers (click to expand cards for families, scale steps, px presets + custom); Ctrl+Z / Ctrl+Y or Ctrl+Shift+Z; Cmd+Z / Cmd+Y / Cmd+Shift+Z on macOS when not typing in
contenteditable - Save (
#btnSave, top-left next to Edit / Pages when editing — same hover reveal) or Ctrl+S / Cmd+S saves the full deck structure to localStorage; Export HTML remains in the Pages sidebar and should strip transient edit state - How to customize: slide theme
:rootvariables, *`--deck-chrome-** for edit UI (see [STYLE_PRESETS.md](STYLE_PRESETS.md) §Deck chrome tokens), font link,.revealanimations; keepdata-oid` unique when adding objects
</success_criteria>
<supporting_files> Supporting Files
| File | Purpose | When to Read |
|---|---|---|
| editor-runtime.md | DOM contract, undo types, snap rules, generator checklist | Phase 3 (before codegen) |
| examples/editable-deck-reference.html | Working reference: full runtime in one file | Phase 3 (copy/adapt JS/CSS) |
| STYLE_PRESETS.md | 46 curated visual presets with colors, fonts, and signature elements | Phase 2 (style selection) |
| viewport-base.css | Mandatory responsive CSS — copy into every presentation | Phase 3 (generation) |
| html-template.md | HTML structure, integration with editable runtime | Phase 3 (generation) |
| animation-patterns.md | CSS/JS animation snippets and effect-to-feeling guide | Phase 3 (generation) |
| scripts/extract-pptx.py | Python script for PPT content extraction | Phase 4 (PPTX) |
| scripts/extract-pdf.py | Python script for PDF page extraction (same JSON shape as PPTX) | Phase 4 (PDF) |
| README.md | Bilingual extended overview, comparison table, troubleshooting | Optional (users / maintainers) |
</supporting_files>
# Auto detect text files and perform LF normalization
* text=auto
.DS_Store
__pycache__/
*.pyc
.pytest_cache/
.mypy_cache/
.idea/
.vscode/
.design/
.claude-design-slide-previews/
examples/generated/test-artifacts/
# Vendor only the small source files needed for ported template generation.
# Keep the upstream checkout metadata and gallery screenshots out of this skill.
beautiful-html-templates/*
!beautiful-html-templates/
!beautiful-html-templates/LICENSE
!beautiful-html-templates/index.json
!beautiful-html-templates/templates/
beautiful-html-templates/templates/*
!beautiful-html-templates/templates/*/
!beautiful-html-templates/templates/*/template.html
!beautiful-html-templates/templates/*/template.json
!beautiful-html-templates/templates/*/deck-stage.js
!beautiful-html-templates/templates/*/styles.css
Animation Patterns Reference
Use this reference when generating presentations. Match animations to the intended feeling.
Effect-to-Feeling Guide
| Feeling | Animations | Visual Cues |
|---|---|---|
| Dramatic / Cinematic | Slow fade-ins (1-1.5s), large scale transitions (0.9 to 1), parallax scrolling | Dark backgrounds, spotlight effects, full-bleed images |
| Techy / Futuristic | Neon glow (box-shadow), glitch/scramble text, grid reveals | Particle systems (canvas), grid patterns, monospace accents, cyan/magenta/electric blue |
| Playful / Friendly | Bouncy easing (spring physics), floating/bobbing | Rounded corners, pastel/bright colors, hand-drawn elements |
| Professional / Corporate | Subtle fast animations (200-300ms), clean slides | Navy/slate/charcoal, precise spacing, data visualization focus |
| Calm / Minimal | Very slow subtle motion, gentle fades | High whitespace, muted palette, serif typography, generous padding |
| Editorial / Magazine | Staggered text reveals, image-text interplay | Strong type hierarchy, pull quotes, grid-breaking layouts, serif headlines + sans body |
Entrance Animations
/* Fade + Slide Up (most versatile) */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.6s var(--ease-out-expo),
transform 0.6s var(--ease-out-expo);
}
.visible .reveal {
opacity: 1;
transform: translateY(0);
}
/* Scale In */
.reveal-scale {
opacity: 0;
transform: scale(0.9);
transition: opacity 0.6s, transform 0.6s var(--ease-out-expo);
}
/* Slide from Left */
.reveal-left {
opacity: 0;
transform: translateX(-50px);
transition: opacity 0.6s, transform 0.6s var(--ease-out-expo);
}
/* Blur In */
.reveal-blur {
opacity: 0;
filter: blur(10px);
transition: opacity 0.8s, filter 0.8s var(--ease-out-expo);
}Background Effects
/* Gradient Mesh — layered radial gradients for depth */
.gradient-bg {
background:
radial-gradient(ellipse at 20% 80%, rgba(120, 0, 255, 0.3) 0%, transparent 50%),
radial-gradient(ellipse at 80% 20%, rgba(0, 255, 200, 0.2) 0%, transparent 50%),
var(--bg-primary);
}
/* Noise Texture — inline SVG for grain */
.noise-bg {
background-image: url("data:image/svg+xml,..."); /* Inline SVG noise */
}
/* Grid Pattern — subtle structural lines */
.grid-bg {
background-image:
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
background-size: 50px 50px;
}Interactive Effects
/* 3D Tilt on Hover — adds depth to cards/panels */
class TiltEffect {
constructor(element) {
this.element = element;
this.element.style.transformStyle = 'preserve-3d';
this.element.style.perspective = '1000px';
this.element.addEventListener('mousemove', (e) => {
const rect = this.element.getBoundingClientRect();
const x = (e.clientX - rect.left) / rect.width - 0.5;
const y = (e.clientY - rect.top) / rect.height - 0.5;
this.element.style.transform = `rotateY(${x * 10}deg) rotateX(${-y * 10}deg)`;
});
this.element.addEventListener('mouseleave', () => {
this.element.style.transform = 'rotateY(0) rotateX(0)';
});
}
}Troubleshooting
| Problem | Fix |
|---|---|
| Fonts not loading | Check Fontshare/Google Fonts URL; ensure font names match in CSS |
| Animations not triggering | Verify Intersection Observer is running; check .visible class is being added |
| Scroll snap not working | Ensure scroll-snap-type: y mandatory on html; each slide needs scroll-snap-align: start |
| Mobile issues | Disable heavy effects at 768px breakpoint; test touch events; reduce particle count |
| Performance issues | Use will-change sparingly; prefer transform/opacity animations; throttle scroll handlers |
{
"schema_version": 1,
"generated_at": "2026-05-13T22:07:57.226Z",
"template_count": 34,
"templates": [
{
"slug": "8-bit-orbit",
"name": "8-Bit Orbit",
"tagline": "Pixel-art neon arcade aesthetic on a deep navy void.",
"mood": [
"retro-tech",
"playful",
"cyberpunk",
"energetic"
],
"occasion": [
"gaming pitch",
"hackathon demo",
"web3 / crypto deck",
"indie product launch",
"developer tools",
"synthwave brand"
],
"tone": [
"geeky",
"neon",
"rebellious",
"sci-fi"
],
"formality": "low",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should feel like a CRT screen at 2am: cyberpunk, gaming, web3, indie dev tools, hackathon demos. Just as good for a tech talk that wants to lean into nostalgic-digital craft, a synthwave brand deck, or a creative review that wants to feel like a console.",
"avoid_for": "Contexts where the dark neon palette would actively work against the message — quiet institutional finance disclosures, healthcare patient-facing materials, traditional luxury.",
"slide_count": 10
},
{
"slug": "biennale-yellow",
"name": "Biennale Yellow",
"tagline": "Solar yellow on warm parchment with deep indigo serif and atmospheric sun-glow gradients.",
"mood": [
"editorial",
"atmospheric",
"warm",
"cultural-institution",
"poster-like"
],
"occasion": [
"exhibition or biennale",
"arts institution programme",
"design or typography conference",
"literary or curatorial publication",
"studio annual report",
"museum season announcement"
],
"tone": [
"literary",
"considered",
"contemplative",
"warm-modern",
"Dutch-editorial"
],
"formality": "high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like an art-biennale poster or a museum's annual programme: exhibition decks, arts-institution announcements, design conference brochures, curatorial pitches, literary publications, studio retrospectives. Equally good for any deck wanting Dutch-editorial atmosphere with an unmistakable single-color signature.",
"avoid_for": "Decks that need visual punch or saturated multi-color energy — the warm-paper canvas and one-yellow palette are intentionally quiet and atmospheric.",
"slide_count": 8
},
{
"slug": "block-frame",
"name": "BlockFrame",
"tagline": "Neobrutalist deck with pastel-neon color blocks and chunky black borders.",
"mood": [
"bold",
"playful",
"graphic",
"fresh"
],
"occasion": [
"creative agency pitch",
"indie SaaS launch",
"designer portfolio",
"brand redesign",
"modern startup deck"
],
"tone": [
"confident",
"graphic",
"pop",
"design-led"
],
"formality": "medium-low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel pop-graphic and design-led: indie SaaS launches, agency credentials, creative reviews, brand redesigns. Also a strong unexpected pick for tech, finance, or research when the speaker wants to land as confident and contemporary rather than buttoned-up.",
"avoid_for": "Contexts that require quiet institutional restraint or traditional weight (regulated disclosures, formal legal briefs).",
"slide_count": 10
},
{
"slug": "blue-professional",
"name": "Blue Professional",
"tagline": "Cream paper background with electric cobalt blue accents; clean modern professional.",
"mood": [
"professional",
"modern",
"calm",
"trustworthy"
],
"occasion": [
"B2B SaaS pitch",
"consulting deliverable",
"internal review",
"advisory pitch",
"investor update"
],
"tone": [
"clean",
"considered",
"polished",
"neutral"
],
"formality": "medium-high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel modern-considered and lightly authoritative: B2B SaaS pitches, consulting deliverables, advisory updates, investor reports. Also a clean, tasteful choice whenever you want to read as professional without going stiff — research synthesis, internal reviews, brand work for service businesses.",
"avoid_for": "Contexts where the deck should feel hot, playful, or intentionally informal — the cool electric-blue restraint will read as overly polished.",
"slide_count": 10
},
{
"slug": "bold-poster",
"name": "Bold Poster",
"tagline": "Editorial poster aesthetic with massive Shrikhand display and a single fire-engine red accent.",
"mood": [
"bold",
"editorial",
"loud",
"confident"
],
"occasion": [
"brand manifesto",
"creative-led pitch",
"magazine / editorial",
"founder vision deck",
"art / culture"
],
"tone": [
"dramatic",
"graphic",
"sharp",
"intentional"
],
"formality": "medium",
"density": "low",
"scheme": "light",
"best_for": "Anything that should land like a magazine cover: brand manifestos, founder vision decks, editorial / cultural pitches, creative reviews. Excellent any time you want a few words to feel like a poster — including unexpected fits like a tech keynote or a finance manifesto that wants to be quotable.",
"avoid_for": "Decks that need to communicate dense information per slide — the layout is built around a few large statements, not paragraphs of detail.",
"slide_count": 10
},
{
"slug": "broadside",
"name": "Broadside",
"tagline": "Dark editorial canvas with a single fire orange accent and bilingual Latin/Chinese type stack.",
"mood": [
"editorial",
"dramatic",
"loud",
"newspaper"
],
"occasion": [
"brand manifesto",
"founder vision deck",
"magazine / cultural pitch",
"design talk",
"bilingual EN/CN deck",
"campaign launch"
],
"tone": [
"graphic",
"punchy",
"literary",
"considered"
],
"formality": "medium-high",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should land like a broadside newspaper headline: brand manifestos, magazine and cultural pitches, design talks, bilingual EN/CN decks, founder vision statements. Also a striking pick for tech, research, or business decks that want a dramatic single-accent editorial feel.",
"avoid_for": "Decks that need to feel quiet, warm, or institutionally traditional — the dark canvas with fire-orange accent commits to drama.",
"slide_count": 20
},
{
"slug": "capsule",
"name": "Capsule",
"tagline": "Modular pill-shaped cards on warm bone with a full pastel-pop palette.",
"mood": [
"playful",
"modern",
"warm",
"fresh",
"fun"
],
"occasion": [
"lifestyle brand",
"creator portfolio",
"DTC product launch",
"wellness or beauty pitch",
"Y2K-tinged brand work"
],
"tone": [
"upbeat",
"graphic",
"approachable",
"cool"
],
"formality": "medium-low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel modular, modern, and a little Y2K: lifestyle brands, creator portfolios, DTC launches, beauty / wellness, agency credentials. Also fun for a playful tech demo or a research deck that wants pop-art clarity instead of gravitas.",
"avoid_for": "Contexts that require traditional institutional weight — the capsule shapes and pastel pops actively soften authority.",
"slide_count": 10
},
{
"slug": "cartesian",
"name": "Cartesian",
"tagline": "Quiet warm-neutral palette with classical Playfair serifs; tasteful and unhurried.",
"mood": [
"quiet",
"considered",
"elegant",
"warm-minimal"
],
"occasion": [
"investment thesis",
"white paper",
"advisory deliverable",
"research report",
"book / longform pitch",
"gallery / cultural"
],
"tone": [
"classical",
"literary",
"restrained",
"confident-quiet"
],
"formality": "high",
"density": "low",
"scheme": "light",
"best_for": "Anything that should feel quiet, considered, and grown-up: investment theses, white papers, advisory work, longform research, gallery / cultural decks. Also a strong choice for editorial features, founder reflections, or any deck where restraint is the message — including across tech and finance.",
"avoid_for": "Decks that need visual heat, multiple accents, or a sense of urgency — the warm-neutral palette is intentionally low-energy.",
"slide_count": 10
},
{
"slug": "cobalt-grid",
"name": "Cobalt Grid",
"tagline": "Electric cobalt italic serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.",
"mood": [
"editorial",
"design-research",
"studious",
"modernist",
"tech-print",
"monochrome"
],
"occasion": [
"design trend or research report",
"studio annual or seasonal bulletin",
"creative agency capabilities deck",
"art or architecture publication",
"academic / curatorial publication",
"newsletter or zine pitch"
],
"tone": [
"considered",
"literary",
"studious",
"quietly-modern",
"editorial"
],
"formality": "high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a quietly serious design / research bulletin, art publication, or curated trend report. Strong for studio annuals, agency capabilities decks, design-research publications, architecture / art / academic decks, and any deck wanting one strict accent colour and a printed-ledger calmness rather than corporate polish.",
"avoid_for": "Decks that need warmth, multi-colour energy, or a casual / playful voice — the strict cobalt + cream + grid palette is intentionally austere.",
"slide_count": 8
},
{
"slug": "coral",
"name": "Coral",
"tagline": "Cream and coral on near-black, set in oversized Bebas Neue.",
"mood": [
"bold",
"warm",
"modern",
"confident"
],
"occasion": [
"fashion / beauty pitch",
"fitness brand",
"F&B brand deck",
"lifestyle launch",
"creative agency"
],
"tone": [
"graphic",
"punchy",
"magazine"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel warm-graphic and editorial: fashion, beauty, fitness, F&B, lifestyle brands, agency credentials. Just as strong for a creator portfolio, a manifesto, or a tech / research deck that wants warmth and a single bold accent instead of corporate cool.",
"avoid_for": "Contexts that should feel quiet or institutional — the coral accent and oversized Bebas Neue commit hard to a confident magazine voice.",
"slide_count": 10
},
{
"slug": "creative-mode",
"name": "Creative Mode",
"tagline": "Cream paper canvas with confident multi-color (green, pink, orange, yellow) accents and Archivo Black display.",
"mood": [
"creative",
"confident",
"playful",
"design-led"
],
"occasion": [
"creative agency pitch",
"design studio deck",
"ad shop credentials",
"brand creative review",
"concept presentation"
],
"tone": [
"graphic",
"expressive",
"modern"
],
"formality": "medium",
"density": "medium-high",
"scheme": "light",
"best_for": "Anything that should feel design-led and confident: creative agency pitches, design studio decks, ad shop credentials, brand creative reviews, art-direction reviews. Also a great unexpected pick for a tech talk, research findings, or finance review when the speaker wants to lead with taste rather than convention.",
"avoid_for": "Contexts that demand institutional restraint and a quiet authority — the saturated multi-accent palette will read as expressive, not formal.",
"slide_count": 8
},
{
"slug": "daisy-days",
"name": "Daisy Days",
"tagline": "Cheerful pastel deck with hand-drawn daisies, stars, and rainbows. Friendly, soft, and warm.",
"mood": [
"cheerful",
"playful",
"warm",
"sunny",
"wholesome"
],
"occasion": [
"education / classroom",
"kids product launch",
"wellness program",
"community workshop",
"creator portfolio (craft / illustration)",
"team kickoff",
"wedding / baby shower planning"
],
"tone": [
"friendly",
"soft",
"encouraging",
"approachable",
"lighthearted"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel friendly, soft, and joyful: educational content, kids and family, wellness programs, community workshops, creator portfolios for craft / illustration. Also lovely for an unexpected playful internal kickoff, a wedding planning deck, or any moment where warmth is the message — including across tech or business contexts.",
"avoid_for": "Contexts where the audience explicitly expects authority and precision — the hand-drawn pastel SVG decorations are the opposite of buttoned-up.",
"slide_count": 10
},
{
"slug": "editorial-forest",
"name": "Editorial Forest",
"tagline": "Forest green, dusty pink, and warm cream meet Source Serif 4 in a quiet, intentional quarterly-review deck.",
"mood": [
"editorial",
"quiet",
"considered",
"warm",
"intentional"
],
"occasion": [
"quarterly review",
"internal readout",
"studio update",
"creative agency deck",
"research recap"
],
"tone": [
"literary",
"thoughtful",
"warm",
"low-pressure"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like a considered editorial — quarterly reviews, internal readouts, studio updates, creative-agency presentations. Equally good for any deck that wants to feel warm and unhurried rather than corporate, including research recaps, book or program announcements, and team retrospectives.",
"avoid_for": "Contexts that need to feel urgent, punchy, or sales-driven — the palette and rhythm are intentionally quiet.",
"slide_count": 8
},
{
"slug": "editorial-tri-tone",
"name": "Editorial Tri-Tone",
"tagline": "Three-color editorial system: dusty pink, mustard cream, and deep burgundy, set in Bricolage + Instrument Serif.",
"mood": [
"editorial",
"warm",
"intentional",
"moody"
],
"occasion": [
"editorial / magazine pitch",
"fashion brand deck",
"lifestyle media",
"literary / cultural",
"art direction review"
],
"tone": [
"literary",
"warm",
"considered",
"stylish"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like a fashion-magazine spread: editorial pitches, fashion brand decks, lifestyle media, art direction reviews. Equally good for any deck — including tech, research, or business — that wants tri-tone discipline and serif/sans contrast instead of the usual neutrals.",
"avoid_for": "Decks that need to read as soft or comforting — the burgundy/pink/cream tri-tone is intentionally high-contrast and styled.",
"slide_count": 8
},
{
"slug": "emerald-editorial",
"name": "Emerald Editorial",
"tagline": "A magazine-cover business deck: emerald + navy + paper, double-rule masthead ornaments, and a bold Bodoni-style display serif.",
"mood": [
"editorial",
"considered",
"confident",
"magazine-cover"
],
"occasion": [
"leadership presentation",
"quarterly review",
"strategy readout",
"planning office deck",
"executive briefing"
],
"tone": [
"literary",
"authoritative",
"warm",
"designed"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel like the front of a serious magazine, including but not limited to leadership readouts, planning-office reviews, and strategy briefings. The double-rule masthead ornament gives it editorial gravitas without making it stiff — also a great unexpected pick for product launches or research recaps that want to feel considered rather than corporate.",
"avoid_for": "Contexts that need to read as quiet, neutral, or institutionally restrained — the emerald field is too saturated to disappear into the background.",
"slide_count": 8
},
{
"slug": "grove",
"name": "Grove",
"tagline": "Forest-green canvas with cream type, classical Playfair serifs, and a single rust accent.",
"mood": [
"organic",
"considered",
"warm",
"literary",
"natural"
],
"occasion": [
"sustainability brand",
"wellness brand",
"outdoor / nature product",
"winery or restaurant",
"literary or arts deck",
"advisory deliverable",
"bilingual EN/CN deck"
],
"tone": [
"classical",
"warm",
"considered",
"patient"
],
"formality": "medium-high",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel organic, considered, and grown-up: sustainability and wellness brands, outdoor / nature products, wineries and restaurants, literary or arts decks, advisory deliverables, bilingual EN/CN reports. Also a calm, distinctive choice for tech, research, or business decks that want patience over urgency.",
"avoid_for": "Decks that need neon energy or rapid-fire pop — the forest-green canvas and Playfair serif commit to a slow, classical voice.",
"slide_count": 12
},
{
"slug": "long-table",
"name": "Long Table",
"tagline": "Warm cream and rust-red supper-club aesthetic with bold uppercase grotesk headlines, italic Fraunces, and pill-shaped outlined buttons.",
"mood": [
"warm",
"intimate",
"modern",
"friendly",
"small-batch",
"social",
"hospitality"
],
"occasion": [
"supper club or dinner series",
"event or community gathering",
"small hospitality / restaurant brand",
"creative studio open house",
"membership or subscription pitch",
"wine or food brand catalogue",
"modern lifestyle brand"
],
"tone": [
"warm",
"playful",
"considered",
"social",
"magazine-friendly",
"modern-editorial"
],
"formality": "medium",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a warm, intimate, modern hospitality / community brand: supper clubs, dinner series, small restaurants, creative-studio events, membership pitches, lifestyle and wine brands. Equally good for any deck wanting a single warm accent colour, italic-meets-bold typography, and a social-media-aware modern-editorial voice.",
"avoid_for": "Decks that need corporate polish, technical density, or a cold / minimalist register — the rust-red palette and bold-italic mix are intentionally warm and people-facing.",
"slide_count": 8
},
{
"slug": "mat",
"name": "Mat",
"tagline": "Dark sage canvas with bone paper and burnt-orange accent; mid-century modern with wood undertones.",
"mood": [
"warm-modern",
"considered",
"tactile",
"mid-century"
],
"occasion": [
"design studio credentials",
"architecture / interior brand",
"ceramics or craft brand",
"furniture pitch",
"advisory deliverable",
"bilingual EN/CN deck"
],
"tone": [
"warm",
"design-led",
"intentional",
"considered"
],
"formality": "medium",
"density": "medium",
"scheme": "mixed",
"best_for": "Anything that should feel mid-century, tactile, and intentional: design studio credentials, architecture / interior brands, ceramics / craft / furniture, advisory decks. Also a warm, distinctive choice for tech, research, or business decks that want a considered analog feel instead of digital-cool.",
"avoid_for": "Contexts that need fast tech energy or institutional restraint — the muted sage and burnt-orange palette is intentionally warm and slow.",
"slide_count": 9
},
{
"slug": "monochrome",
"name": "Monochrome",
"tagline": "Ivory ledger paper with all-black type; Lora serif headlines, Jost body, no color at all.",
"mood": [
"restrained",
"literary",
"archival",
"ledger"
],
"occasion": [
"user research synthesis",
"white paper",
"longform report",
"academic deck",
"policy brief",
"advisory deliverable",
"bilingual EN/CN deck"
],
"tone": [
"literary",
"considered",
"neutral",
"honest"
],
"formality": "high",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel like a hand-typeset ledger: user research synthesis, white papers, longform reports, academic and policy briefs, advisory deliverables, bilingual EN/CN reports. Equally good for tech, design, or brand decks that want their words to be the only thing on the page.",
"avoid_for": "Decks that need visual personality or color-led storytelling — the all-ink palette is intentionally austere.",
"slide_count": 18
},
{
"slug": "neo-grid-bold",
"name": "Neo-Grid Bold",
"tagline": "Editorial neo-brutalism with a single neon yellow accent on off-white paper.",
"mood": [
"confident",
"punchy",
"editorial",
"modern"
],
"occasion": [
"product launch",
"design review",
"founder pitch",
"brand deck",
"consulting findings",
"conference talk"
],
"tone": [
"bold",
"minimal",
"design-led",
"graphic"
],
"formality": "medium",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel confident and editorial-graphic: design-led pitches, brand work, founder talks, conference keynotes. Excellent for stat-heavy slides, comparisons, and process flows. Just as strong for tech, research, or finance when the speaker wants to read as design-led rather than corporate.",
"avoid_for": "Contexts that need to feel quiet, traditional, or warm — the neon-yellow accent and uppercase display commit to a confident editorial voice.",
"slide_count": 13
},
{
"slug": "peoples-platform",
"name": "People's Platform (Block & Bold)",
"tagline": "Activist poster energy: blue, orange, red on cream, with Alfa Slab + Caveat Brush.",
"mood": [
"activist",
"loud",
"graphic",
"honest"
],
"occasion": [
"cultural commentary",
"manifesto",
"community / civic deck",
"design talk",
"campaign pitch",
"founder vision"
],
"tone": [
"punchy",
"direct",
"expressive",
"warm-bold"
],
"formality": "medium-low",
"density": "medium-high",
"scheme": "light",
"best_for": "Anything that should feel honest, loud, and graphic: cultural commentary, manifestos, civic and community decks, design talks, campaign pitches. Excellent for founder-vision moments, mission statements, or any deck — including across industries — that wants protest-poster energy instead of corporate polish.",
"avoid_for": "Contexts where institutional restraint is the actual goal — the saturated political-poster palette commits hard to expressive energy.",
"slide_count": 10
},
{
"slug": "pin-and-paper",
"name": "Pin & Paper",
"tagline": "Yellow paper with safety-pin illustrations, ink-blue handwritten Caveat, paper-grain texture.",
"mood": [
"crafted",
"handmade",
"warm",
"thoughtful",
"literary"
],
"occasion": [
"research findings with personality",
"qualitative report",
"founder reflection",
"creator essay deck",
"workshop debrief"
],
"tone": [
"literary",
"intimate",
"warm",
"grounded"
],
"formality": "medium",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel hand-crafted, warm, and literary: qualitative research findings, founder reflections, longform brand stories, workshop debriefs. The signature safety-pin illustrations and paper-grain texture make it especially good for any deck — including tech or business — that wants personality and warmth over polish.",
"avoid_for": "Decks that need to feel digital-native polished or rigorously data-driven — handwritten Caveat is intentionally informal.",
"slide_count": 11
},
{
"slug": "pink-script",
"name": "Pink Script — After Hours",
"tagline": "Black canvas, hot pink accent, pearl-cream paper, Instrument Serif headlines: late-night editorial luxury.",
"mood": [
"nocturnal",
"moody",
"intentional",
"luxe",
"expressive"
],
"occasion": [
"fashion brand deck",
"creator personal brand",
"after-hours product (nightlife / dating / spirits)",
"luxury launch",
"editorial feature"
],
"tone": [
"literary",
"sultry",
"considered",
"magazine"
],
"formality": "medium-high",
"density": "low",
"scheme": "dark",
"best_for": "Anything that should feel nocturnal, intentional, and a little luxe: fashion brand decks, creator personal brands, after-hours / nightlife / spirits launches, luxury product reveals, editorial features. Also a striking unexpected pick for a tech keynote, research synthesis, or business pitch that wants to land with magnetic confidence.",
"avoid_for": "Daytime corporate-professional and traditional B2B contexts where the dark canvas with hot-pink accent reads as too styled or too expressive.",
"slide_count": 9
},
{
"slug": "playful",
"name": "Playful",
"tagline": "Sun-warm peach background with Syne display: a friendly indie launch deck.",
"mood": [
"warm",
"approachable",
"indie",
"friendly"
],
"occasion": [
"creator portfolio",
"indie product launch",
"lifestyle brand",
"small-business pitch",
"newsletter / community"
],
"tone": [
"upbeat",
"informal",
"welcoming"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel warm, indie, and approachable: creator portfolios, indie product launches, lifestyle brands, small-business pitches, newsletter / community decks. Also welcoming for any deck — including tech or research — that wants to feel friendly and human rather than corporate.",
"avoid_for": "Contexts where institutional credibility matters more than warmth — the peach palette is intentionally informal.",
"slide_count": 10
},
{
"slug": "raw-grid",
"name": "Raw Grid",
"tagline": "Neo-brutalist deck with thick borders, offset shadows, and a pink/sage/ink palette.",
"mood": [
"raw",
"punchy",
"energetic",
"confident"
],
"occasion": [
"startup pitch",
"accelerator demo day",
"founder pitch",
"indie product launch",
"brand deck",
"creator portfolio"
],
"tone": [
"direct",
"modern",
"no-nonsense",
"graphic"
],
"formality": "medium-low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel direct and graphic-confident: founder pitches, accelerator demos, brand decks, indie launches, creator portfolios. Strong for stat slides, comparison tables, and process flows. Equally good for tech, research, or finance when the speaker wants the deck to feel scrappy-confident rather than buttoned-up.",
"avoid_for": "Contexts that need to feel soft, warm, or intentionally quiet — the brutalist borders and offset shadows commit to a graphic voice.",
"slide_count": 10
},
{
"slug": "retro-windows",
"name": "Retro Windows",
"tagline": "Windows 95 chrome: gray title bars, MS Sans Serif, pixel typography, full nostalgia.",
"mood": [
"nostalgic",
"retro",
"geeky",
"playful"
],
"occasion": [
"retro gaming pitch",
"Y2K brand",
"creator portfolio (90s aesthetic)",
"tech-history talk",
"shitpost-but-make-it-fancy deck"
],
"tone": [
"winking",
"nostalgic",
"geeky",
"fun"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel knowingly nostalgic: retro gaming, Y2K-aesthetic brands, creator portfolios with a 90s vibe, tech-history talks, deliberately tongue-in-cheek decks. A great choice anywhere a playful retro reference is the entire point.",
"avoid_for": "Decks that need to read as modern, elegant, or institutionally credible — the Win95 chrome will always read as a costume.",
"slide_count": 10
},
{
"slug": "retro-zine",
"name": "Retro Zine",
"tagline": "Beige paper with green accent and Bebas Neue + Caveat: a riso-printed zine in HTML form.",
"mood": [
"crafted",
"lo-fi",
"underground",
"warm-retro"
],
"occasion": [
"indie zine / publication",
"music or arts brand",
"creator portfolio",
"small-batch / craft launch",
"cultural / community deck"
],
"tone": [
"scrappy",
"warm",
"intentional",
"DIY"
],
"formality": "medium-low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel printed, lo-fi, and crafted: indie zines and publications, music / arts brands, creator portfolios, small-batch craft launches, community decks. Also a great underdog choice for tech, research, or business decks that want a riso-print warmth instead of digital polish.",
"avoid_for": "Contexts that demand digital-native polish or fast modern-tech energy — the layered zine aesthetic intentionally feels handmade.",
"slide_count": 10
},
{
"slug": "sakura-chroma",
"name": "Sakura Chroma",
"tagline": "Vintage Japanese cassette-package aesthetic: cream paper, diagonal rainbow ribbons, condensed bold type, JIS-style spec checkboxes.",
"mood": [
"retro",
"playful",
"kawaii-tech",
"warm",
"tactile",
"product-catalogue"
],
"occasion": [
"product launch or catalogue",
"indie hardware or analog studio brand",
"music label or release schedule",
"creative studio annual report",
"magazine or zine pitch",
"vintage-flavored brand campaign"
],
"tone": [
"playful",
"confident",
"warm",
"tactile",
"80s-Japanese-tech"
],
"formality": "low",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel like a vintage Japanese cassette package or a TDK / Sony / Sakura Color product catalogue: indie hardware brand decks, music-label release schedules, analog studio retrospectives, zine and magazine pitches, kawaii-tech product launches, creative-studio annual reports. Equally good for any deck wanting bold colour, condensed display type, and a tactile printed-product personality.",
"avoid_for": "Decks that need restrained, corporate, or quiet typography — the bold condensed lockups, ribbon stripes, and primary-colour palette are intentionally loud and product-page-y.",
"slide_count": 8
},
{
"slug": "scatterbrain",
"name": "Scatterbrain",
"tagline": "Post-it inspired: pastel sticky notes, Caveat handwriting, Shrikhand and Zilla Slab type stack.",
"mood": [
"playful",
"creative",
"warm",
"messy-on-purpose",
"workshop"
],
"occasion": [
"brainstorm / workshop",
"creative agency credentials",
"design-thinking session",
"ideation pitch",
"art-direction review"
],
"tone": [
"informal",
"warm",
"expressive",
"human"
],
"formality": "low",
"density": "high",
"scheme": "light",
"best_for": "Anything that should feel like a designer's whiteboard: brainstorms, workshops, creative-agency credentials, design-thinking sessions, ideation pitches, art-direction reviews. Equally fun for any deck — including tech, research, or business — that wants to read as in-progress thinking rather than polished conclusions.",
"avoid_for": "Contexts that demand precision and institutional weight — the post-it sticky-note aesthetic intentionally reads as warm and unfinished.",
"slide_count": 10
},
{
"slug": "signal",
"name": "Signal",
"tagline": "Deep navy canvas with bone paper and a single muted-gold accent; institutional with quiet weight.",
"mood": [
"institutional",
"trustworthy",
"considered",
"weighty"
],
"occasion": [
"investor deck",
"consulting deliverable",
"board presentation",
"legal / policy brief",
"academic deck",
"advisory pitch",
"bilingual EN/CN deck"
],
"tone": [
"sober",
"polished",
"established",
"literary"
],
"formality": "high",
"density": "high",
"scheme": "mixed",
"best_for": "Anything that should feel weighty, considered, and credibly institutional: investor decks, board presentations, consulting deliverables, legal / policy briefs, advisory pitches. Also a strong choice for tech, research, or brand work that wants to read as quietly authoritative rather than loud.",
"avoid_for": "Contexts that should feel hot, fast, or intentionally playful — the navy + gold restraint commits to a sober voice.",
"slide_count": 18
},
{
"slug": "soft-editorial",
"name": "Soft Editorial",
"tagline": "Cormorant Garamond serif on warm paper with sage, blush, and lemon accents.",
"mood": [
"literary",
"elegant",
"quiet",
"warm-classical"
],
"occasion": [
"editorial feature",
"longform brand story",
"gallery or museum",
"literary pitch",
"advisory deliverable",
"wedding / lifestyle media"
],
"tone": [
"literary",
"considered",
"warm",
"magazine"
],
"formality": "high",
"density": "low",
"scheme": "light",
"best_for": "Anything that should feel literary, elegant, and unhurried: editorial features, longform brand stories, gallery / museum decks, advisory deliverables, wedding / lifestyle media, founder essays. Equally good for tech, research, or business decks that want a Sunday-supplement warmth instead of corporate polish.",
"avoid_for": "Decks that need visual heat or punch — the warm-paper palette and Cormorant serif are intentionally quiet.",
"slide_count": 12
},
{
"slug": "stencil-tablet",
"name": "Stencil & Tablet",
"tagline": "Bone paper with stencil-cut headlines and a six-color earth palette: archaeology meets brand.",
"mood": [
"archival",
"earthy",
"tactile",
"considered",
"graphic"
],
"occasion": [
"museum / cultural institution",
"art / architecture brand",
"longform research",
"heritage / craft brand",
"manifesto"
],
"tone": [
"weighty",
"considered",
"tactile",
"literary"
],
"formality": "medium-high",
"density": "medium",
"scheme": "light",
"best_for": "Anything that should feel archival, tactile, and weighty-graphic: museum and cultural-institution decks, art / architecture brands, longform research, heritage and craft brands, manifestos. A great choice anytime — including across tech and business — when you want the deck to feel like a field manual rather than a slide deck.",
"avoid_for": "Contexts that demand digital-native polish or playful pop — the stencil-cut display and earth-tone palette commit to a deliberate analog feel.",
"slide_count": 11
},
{
"slug": "studio",
"name": "Studio",
"tagline": "Black canvas with electric-yellow type; high-voltage design studio aesthetic.",
"mood": [
"electric",
"bold",
"graphic",
"design-led",
"high-contrast"
],
"occasion": [
"design studio credentials",
"creative agency pitch",
"brand showcase",
"art-direction review",
"fashion / sneaker brand",
"bilingual EN/CN deck"
],
"tone": [
"graphic",
"loud",
"modern",
"intentional"
],
"formality": "medium",
"density": "medium",
"scheme": "dark",
"best_for": "Anything that should feel electric and design-led: studio credentials, creative agency pitches, brand showcases, art-direction reviews, fashion / sneaker brand work. Also a striking unexpected choice for tech, research, or business decks where the speaker wants the deck to *be* a brand statement.",
"avoid_for": "Contexts that should feel quiet or institutional — the black-and-electric-yellow palette is the loudest in the library.",
"slide_count": 12
},
{
"slug": "vellum",
"name": "Vellum",
"tagline": "Deep navy canvas with warm-yellow italic Cormorant serifs and a single dusty teal accent. A quiet, scholarly aesthetic.",
"mood": [
"scholarly",
"literary",
"considered",
"quiet",
"intellectual"
],
"occasion": [
"research findings",
"white paper or longform report",
"academic or university deck",
"advisory deliverable",
"literary or editorial pitch",
"founder reflection / vision deck",
"bilingual EN/CN deck"
],
"tone": [
"literary",
"considered",
"patient",
"intelligent"
],
"formality": "high",
"density": "low",
"scheme": "dark",
"best_for": "Anything that should feel scholarly, literary, and quietly intelligent: research synthesis, white papers, academic and policy briefs, advisory deliverables, longform editorial pieces, founder reflections. Equally strong for any deck — including tech, business, or creator work — that wants a calm, considered atmosphere instead of energetic visuals.",
"avoid_for": "Contexts that need visual heat or pop — the navy + warm-yellow italic-Cormorant aesthetic is intentionally low-tempo.",
"slide_count": 9
}
]
}
MIT License
Copyright (c) 2026 Zara Zhang
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>8-BIT ORBIT | Pixel Art Presentation Template</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Chakra+Petch:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&family=Space+Mono:wght@400;700&family=Tektur:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
:root {
--neon-pink: #F0A6CA;
--neon-cyan: #5EDCF4;
--neon-yellow: #F4D03F;
--deep-navy: #0F1B3D;
--dark-void: #0A0E27;
--soft-lavender: #E2D5F2;
--pixel-size: 4px;
--font-display: 'Tektur', cursive;
--font-body: 'Chakra Petch', sans-serif;
--font-mono: 'Space Mono', monospace;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
width: 100%;
height: 100%;
overflow: hidden;
font-family: var(--font-body);
color: var(--dark-void);
background: var(--dark-void);
}
/* Scroll behavior for slide navigation */
.deck {
width: 100%;
height: 100vh;
overflow: hidden;
position: relative;
}
.slides-container {
width: 100%;
height: 100%;
transition: transform 0.8s cubic-bezier(0.22, 1, 0.36, 1);
}
.slide {
width: 100%;
height: 100vh;
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 3vh 4vw;
}
/* === GLOBAL ATMOSPHERIC OVERLAYS === */
/* Scanlines */
.scanlines::after {
content: "";
position: absolute;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent 0px,
transparent 2px,
rgba(10, 14, 39, 0.04) 2px,
rgba(10, 14, 39, 0.04) 4px
);
pointer-events: none;
z-index: 50;
mix-blend-mode: multiply;
}
/* Grain / Noise */
.grain::before {
content: "";
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
opacity: 0.035;
pointer-events: none;
z-index: 49;
}
/* CRT vignette glow */
.crt-glow::after {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(ellipse at center, transparent 50%, rgba(10, 14, 39, 0.25) 100%);
pointer-events: none;
z-index: 51;
}
/* Pixel grid background pattern */
.bg-grid {
background-color: var(--dark-void);
background-image:
linear-gradient(rgba(94, 220, 244, 0.07) 1px, transparent 1px),
linear-gradient(90deg, rgba(94, 220, 244, 0.07) 1px, transparent 1px);
background-size: 40px 40px;
}
.bg-grid-pink {
background-color: var(--neon-pink);
background-image:
linear-gradient(rgba(15, 27, 61, 0.06) 1px, transparent 1px),
linear-gradient(90deg, rgba(15, 27, 61, 0.06) 1px, transparent 1px);
background-size: 40px 40px;
}
.bg-grid-cyan {
background-color: var(--neon-cyan);
background-image:
linear-gradient(rgba(15, 27, 61, 0.08) 1px, transparent 1px),
linear-gradient(90deg, rgba(15, 27, 61, 0.08) 1px, transparent 1px);
background-size: 40px 40px;
}
.bg-grid-lavender {
background-color: var(--soft-lavender);
background-image:
linear-gradient(rgba(15, 27, 61, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(15, 27, 61, 0.05) 1px, transparent 1px);
background-size: 40px 40px;
}
/* Moving starfield for dark slides */
.starfield {
position: absolute;
inset: 0;
overflow: hidden;
z-index: 1;
}
.starfield .star {
position: absolute;
width: 4px;
height: 4px;
background: var(--neon-cyan);
opacity: 0.6;
animation: twinkle 3s infinite ease-in-out;
}
.starfield .star:nth-child(2n) { background: var(--neon-yellow); }
.starfield .star:nth-child(3n) { background: var(--neon-pink); }
.starfield .star:nth-child(4n) { width: 6px; height: 6px; }
@keyframes twinkle {
0%, 100% { opacity: 0.3; transform: scale(1); }
50% { opacity: 0.9; transform: scale(1.3); }
}
/* Floating pixel particles */
.pixel-particles {
position: absolute;
inset: 0;
overflow: hidden;
z-index: 1;
pointer-events: none;
}
.pixel-particles .p {
position: absolute;
width: 8px;
height: 8px;
opacity: 0.4;
animation: float 8s infinite ease-in-out;
}
@keyframes float {
0%, 100% { transform: translateY(0) rotate(0deg); }
50% { transform: translateY(-30px) rotate(90deg); }
}
/* === PIXEL UI COMPONENTS === */
/* Pixel border effect */
.pixel-box {
position: relative;
background: var(--deep-navy);
color: white;
}
.pixel-box::before {
content: "";
position: absolute;
inset: -4px;
background: var(--neon-cyan);
z-index: -1;
clip-path: polygon(
0 4px, 4px 4px, 4px 0,
calc(100% - 4px) 0, calc(100% - 4px) 4px, 100% 4px,
100% calc(100% - 4px), calc(100% - 4px) calc(100% - 4px), calc(100% - 4px) 100%,
4px 100%, 4px calc(100% - 4px), 0 calc(100% - 4px)
);
}
.pixel-box.yellow::before { background: var(--neon-yellow); }
.pixel-box.pink::before { background: var(--neon-pink); }
/* Pixel button */
.pixel-btn {
display: inline-block;
font-family: var(--font-display);
font-weight: 700;
font-size: 1rem;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 16px 36px;
background: var(--neon-cyan);
color: var(--deep-navy);
border: none;
cursor: pointer;
position: relative;
box-shadow:
4px 0 0 0 var(--deep-navy),
0 4px 0 0 var(--deep-navy),
4px 4px 0 0 var(--deep-navy),
8px 4px 0 0 var(--neon-yellow),
4px 8px 0 0 var(--neon-yellow),
8px 8px 0 0 var(--neon-yellow);
transition: transform 0.1s, box-shadow 0.1s;
}
.pixel-btn:hover {
transform: translate(2px, 2px);
box-shadow:
2px 0 0 0 var(--deep-navy),
0 2px 0 0 var(--deep-navy),
2px 2px 0 0 var(--deep-navy),
4px 2px 0 0 var(--neon-yellow),
2px 4px 0 0 var(--neon-yellow),
4px 4px 0 0 var(--neon-yellow);
}
.pixel-btn.pink-btn {
background: var(--neon-pink);
box-shadow:
4px 0 0 0 var(--deep-navy),
0 4px 0 0 var(--deep-navy),
4px 4px 0 0 var(--deep-navy),
8px 4px 0 0 var(--neon-cyan),
4px 8px 0 0 var(--neon-cyan),
8px 8px 0 0 var(--neon-cyan);
}
/* Pixel text shadow like the reference image */
.pixel-hero-text {
font-family: var(--font-display);
font-weight: 900;
font-size: clamp(3rem, 10vw, 8rem);
line-height: 1.05;
color: var(--neon-cyan);
text-shadow:
4px 4px 0 var(--neon-yellow),
8px 8px 0 var(--deep-navy);
letter-spacing: 0.04em;
}
/* Decorative pixel corners */
.pixel-corners {
position: relative;
}
.pixel-corners::before,
.pixel-corners::after {
content: "";
position: absolute;
width: 24px;
height: 24px;
border: 4px solid var(--neon-cyan);
}
.pixel-corners::before {
top: -8px;
left: -8px;
border-right: none;
border-bottom: none;
}
.pixel-corners::after {
bottom: -8px;
right: -8px;
border-left: none;
border-top: none;
}
.pixel-corners.yellow-corners::before,
.pixel-corners.yellow-corners::after { border-color: var(--neon-yellow); }
.pixel-corners.pink-corners::before,
.pixel-corners.pink-corners::after { border-color: var(--neon-pink); }
/* Section labels */
.pixel-label {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--neon-yellow);
background: var(--deep-navy);
padding: 6px 14px;
display: inline-block;
margin-bottom: 1.5rem;
}
/* === SLIDE CONTENT LAYOUTS === */
.slide-content {
position: relative;
z-index: 10;
width: 100%;
max-width: 1200px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
h1, h2, h3, h4 {
font-family: var(--font-display);
font-weight: 700;
line-height: 1.15;
}
h1 { font-size: clamp(2rem, 5vw, 4rem); }
h2 { font-size: clamp(1.5rem, 3.5vw, 2.8rem); }
h3 { font-size: clamp(1.1rem, 2vw, 1.5rem); }
p, li {
font-family: var(--font-body);
font-size: clamp(0.9rem, 1.2vw, 1.15rem);
line-height: 1.7;
font-weight: 400;
}
/* === NAVIGATION === */
.nav-dots {
position: fixed;
right: 24px;
top: 50%;
transform: translateY(-50%);
display: flex;
flex-direction: column;
gap: 12px;
z-index: 100;
}
.nav-dot {
width: 12px;
height: 12px;
border: 2px solid var(--neon-cyan);
background: transparent;
cursor: pointer;
position: relative;
transition: all 0.3s;
}
.nav-dot::after {
content: "";
position: absolute;
inset: 2px;
background: var(--neon-cyan);
opacity: 0;
transition: opacity 0.3s;
}
.nav-dot.active::after { opacity: 1; }
.nav-dot:hover { border-color: var(--neon-yellow); }
.slide-counter {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--neon-cyan);
background: rgba(10, 14, 39, 0.8);
padding: 8px 20px;
z-index: 100;
letter-spacing: 0.15em;
}
/* === CUSTOM CURSOR AREA === */
.deck {
cursor: crosshair;
}
/* === SPECIFIC SLIDE STYLES === */
/* Slide 1: Hero */
.hero-subtitle {
font-family: var(--font-mono);
font-size: 0.85rem;
letter-spacing: 0.3em;
color: var(--neon-pink);
text-transform: uppercase;
margin-bottom: 1.5rem;
}
.hero-tagline {
font-family: var(--font-body);
font-size: clamp(0.9rem, 1.5vw, 1.2rem);
color: rgba(255,255,255,0.7);
max-width: 500px;
text-align: center;
margin-top: 2rem;
line-height: 1.8;
}
.hero-badges {
display: flex;
gap: 16px;
margin-top: 3rem;
flex-wrap: wrap;
justify-content: center;
}
.hero-badge {
font-family: var(--font-mono);
font-size: 0.7rem;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 8px 16px;
border: 2px solid var(--neon-yellow);
color: var(--neon-yellow);
}
/* Slide 2: Split Intro */
.split-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4vw;
align-items: center;
width: 100%;
height: 100%;
max-width: 1100px;
}
@media (max-width: 768px) {
.split-layout { grid-template-columns: 1fr; }
}
.pixel-avatar-zone {
width: 100%;
aspect-ratio: 1;
max-width: 380px;
margin: 0 auto;
background: var(--deep-navy);
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.pixel-avatar-zone::before {
content: "";
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
45deg,
transparent,
transparent 10px,
rgba(94, 220, 244, 0.1) 10px,
rgba(94, 220, 244, 0.1) 20px
);
}
.pixel-face {
width: 120px;
height: 120px;
position: relative;
}
.pixel-face .eye {
position: absolute;
width: 24px;
height: 24px;
background: var(--neon-cyan);
top: 30px;
}
.pixel-face .eye.left { left: 16px; }
.pixel-face .eye.right { right: 16px; }
.pixel-face .mouth {
position: absolute;
width: 60px;
height: 16px;
background: var(--neon-pink);
bottom: 24px;
left: 50%;
transform: translateX(-50%);
}
/* Slide 3: Feature Grid */
.feature-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
width: 100%;
max-width: 1000px;
}
@media (max-width: 900px) {
.feature-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 500px) {
.feature-grid { grid-template-columns: 1fr; }
}
.feature-card {
background: rgba(255,255,255,0.15);
backdrop-filter: blur(8px);
padding: 32px 24px;
text-align: center;
position: relative;
border: 2px solid rgba(15, 27, 61, 0.2);
}
.feature-card::before {
content: "";
position: absolute;
top: -2px;
left: -2px;
width: 16px;
height: 16px;
border-top: 4px solid var(--deep-navy);
border-left: 4px solid var(--deep-navy);
}
.feature-card::after {
content: "";
position: absolute;
bottom: -2px;
right: -2px;
width: 16px;
height: 16px;
border-bottom: 4px solid var(--deep-navy);
border-right: 4px solid var(--deep-navy);
}
.feature-icon {
width: 48px;
height: 48px;
margin: 0 auto 16px;
position: relative;
}
.feature-icon.cube {
background: var(--deep-navy);
box-shadow: 6px 6px 0 var(--neon-yellow);
}
.feature-icon.diamond {
background: var(--neon-cyan);
transform: rotate(45deg);
width: 36px;
height: 36px;
margin-bottom: 22px;
margin-top: 6px;
}
.feature-icon.cross {
background: var(--neon-pink);
position: relative;
}
.feature-icon.cross::before,
.feature-icon.cross::after {
content: "";
position: absolute;
background: var(--deep-navy);
}
.feature-icon.cross::before { inset: 10px 4px; }
.feature-icon.cross::after { inset: 4px 10px; }
.feature-icon.circle {
border: 6px solid var(--neon-yellow);
border-radius: 0; /* pixel circle = square with careful shading? actually keep square for pixel aesthetic */
background: transparent;
position: relative;
}
.feature-icon.circle::after {
content: "";
position: absolute;
inset: 8px;
background: var(--neon-yellow);
}
.feature-card h3 {
font-size: 1.1rem;
margin-bottom: 8px;
color: var(--deep-navy);
}
.feature-card p {
font-size: 0.85rem;
color: rgba(15, 27, 61, 0.75);
line-height: 1.6;
}
/* Slide 4 & 5: Charts */
.chart-slide-layout {
width: 100%;
max-width: 900px;
display: flex;
flex-direction: column;
align-items: center;
}
.pixel-chart-title {
text-align: center;
margin-bottom: 3rem;
}
.pixel-chart-title h2 {
color: var(--neon-cyan);
margin-bottom: 0.5rem;
}
.pixel-chart-title .subtitle {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--neon-pink);
letter-spacing: 0.15em;
}
/* Bar Chart */
.pixel-bar-chart {
width: 100%;
display: flex;
align-items: flex-end;
justify-content: center;
gap: 24px;
height: 320px;
padding: 0 20px;
position: relative;
}
.pixel-bar-chart::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: var(--neon-cyan);
opacity: 0.5;
}
.chart-bar-group {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
flex: 1;
max-width: 100px;
}
.chart-bar {
width: 100%;
background: var(--neon-cyan);
position: relative;
box-shadow: 4px 0 0 0 var(--deep-navy), 0 4px 0 0 var(--deep-navy), 4px 4px 0 0 var(--deep-navy);
transition: height 1s cubic-bezier(0.22, 1, 0.36, 1);
}
.chart-bar.alt { background: var(--neon-pink); }
.chart-bar.alt2 { background: var(--neon-yellow); }
.chart-bar-label {
font-family: var(--font-mono);
font-size: 0.7rem;
color: rgba(255,255,255,0.8);
text-align: center;
letter-spacing: 0.05em;
}
.chart-value {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
color: var(--neon-yellow);
margin-bottom: 4px;
}
/* Horizontal Bar Chart */
.pixel-hbar-chart {
width: 100%;
display: flex;
flex-direction: column;
gap: 20px;
}
.hbar-row {
display: grid;
grid-template-columns: 120px 1fr 50px;
align-items: center;
gap: 16px;
}
.hbar-label {
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--deep-navy);
text-align: right;
font-weight: 700;
}
.hbar-track {
height: 32px;
background: rgba(15, 27, 61, 0.1);
position: relative;
}
.hbar-fill {
height: 100%;
background: var(--deep-navy);
position: relative;
box-shadow: 4px 4px 0 var(--neon-yellow);
transition: width 1s cubic-bezier(0.22, 1, 0.36, 1);
}
.hbar-fill.alt { background: var(--neon-cyan); box-shadow: 4px 4px 0 var(--deep-navy); }
.hbar-fill.alt2 { background: var(--neon-pink); box-shadow: 4px 4px 0 var(--deep-navy); }
.hbar-value {
font-family: var(--font-mono);
font-size: 0.8rem;
font-weight: 700;
color: var(--deep-navy);
}
/* Slide 6: Timeline */
.timeline-container {
width: 100%;
max-width: 900px;
position: relative;
}
.timeline-line {
position: absolute;
left: 50%;
top: 0;
bottom: 0;
width: 4px;
background: repeating-linear-gradient(
to bottom,
var(--deep-navy) 0px,
var(--deep-navy) 16px,
transparent 16px,
transparent 24px
);
transform: translateX(-50%);
}
.timeline-events {
display: flex;
flex-direction: column;
gap: 32px;
position: relative;
}
.timeline-event {
display: grid;
grid-template-columns: 1fr 60px 1fr;
align-items: center;
gap: 24px;
}
.timeline-event:nth-child(even) .timeline-text { grid-column: 3; text-align: left; }
.timeline-event:nth-child(even) .timeline-spacer { grid-column: 2; }
.timeline-event:nth-child(even) .timeline-empty { grid-column: 1; }
.timeline-event:nth-child(odd) .timeline-text { grid-column: 1; text-align: right; }
.timeline-event:nth-child(odd) .timeline-spacer { grid-column: 2; }
.timeline-event:nth-child(odd) .timeline-empty { grid-column: 3; }
.timeline-node {
width: 24px;
height: 24px;
background: var(--neon-cyan);
border: 4px solid var(--deep-navy);
justify-self: center;
position: relative;
z-index: 2;
}
.timeline-node.active { background: var(--neon-yellow); }
.timeline-text h4 {
font-size: 1rem;
color: var(--deep-navy);
margin-bottom: 4px;
}
.timeline-text p {
font-size: 0.85rem;
color: rgba(15, 27, 61, 0.7);
line-height: 1.5;
}
.timeline-text .date {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--neon-cyan);
background: var(--deep-navy);
display: inline-block;
padding: 2px 10px;
margin-bottom: 8px;
}
@media (max-width: 700px) {
.timeline-event {
grid-template-columns: 40px 1fr !important;
}
.timeline-event .timeline-empty { display: none; }
.timeline-event .timeline-text { grid-column: 2 !important; text-align: left !important; }
.timeline-line { left: 20px; }
.timeline-node { justify-self: start; }
}
/* Slide 7: Stats */
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 32px;
width: 100%;
max-width: 900px;
}
@media (max-width: 800px) {
.stats-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 400px) {
.stats-grid { grid-template-columns: 1fr; }
}
.stat-block {
text-align: center;
padding: 32px 16px;
background: rgba(94, 220, 244, 0.08);
border: 2px solid rgba(94, 220, 244, 0.2);
position: relative;
}
.stat-block::before {
content: "";
position: absolute;
top: -2px;
left: -2px;
width: 20px;
height: 20px;
border-top: 4px solid var(--neon-cyan);
border-left: 4px solid var(--neon-cyan);
}
.stat-block::after {
content: "";
position: absolute;
bottom: -2px;
right: -2px;
width: 20px;
height: 20px;
border-bottom: 4px solid var(--neon-cyan);
border-right: 4px solid var(--neon-cyan);
}
.stat-number {
font-family: var(--font-display);
font-size: clamp(2rem, 4vw, 3.5rem);
font-weight: 900;
color: var(--neon-cyan);
line-height: 1;
margin-bottom: 8px;
text-shadow: 3px 3px 0 var(--deep-navy);
}
.stat-label {
font-family: var(--font-mono);
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--neon-pink);
}
/* Slide 8: Quote */
.quote-container {
max-width: 700px;
text-align: center;
position: relative;
padding: 48px;
}
.quote-mark {
font-family: var(--font-display);
font-size: 8rem;
line-height: 1;
color: var(--deep-navy);
opacity: 0.15;
position: absolute;
top: -20px;
left: 50%;
transform: translateX(-50%);
}
.quote-text {
font-family: var(--font-body);
font-size: clamp(1.1rem, 2.2vw, 1.6rem);
font-weight: 500;
font-style: italic;
color: var(--deep-navy);
line-height: 1.8;
position: relative;
z-index: 2;
}
.quote-author {
margin-top: 2rem;
font-family: var(--font-mono);
font-size: 0.8rem;
color: rgba(15, 27, 61, 0.7);
letter-spacing: 0.1em;
}
.quote-line {
width: 60px;
height: 4px;
background: var(--neon-yellow);
margin: 1.5rem auto 0;
box-shadow: 4px 4px 0 var(--deep-navy);
}
/* Slide 9: Comparison / Cards */
.tier-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
width: 100%;
max-width: 900px;
}
@media (max-width: 800px) {
.tier-grid { grid-template-columns: 1fr; max-width: 400px; }
}
.tier-card {
background: white;
padding: 36px 28px;
position: relative;
text-align: center;
}
.tier-card.featured {
background: var(--deep-navy);
color: white;
transform: translateY(-12px);
box-shadow: 8px 8px 0 var(--neon-yellow);
}
.tier-card:not(.featured) {
box-shadow: 6px 6px 0 rgba(15, 27, 61, 0.15);
}
.tier-name {
font-family: var(--font-display);
font-size: 1.2rem;
margin-bottom: 8px;
}
.tier-price {
font-family: var(--font-mono);
font-size: 2rem;
font-weight: 700;
color: var(--neon-cyan);
margin-bottom: 4px;
}
.tier-price span {
font-size: 0.8rem;
color: rgba(15, 27, 61, 0.5);
}
.tier-card.featured .tier-price span { color: rgba(255,255,255,0.5); }
.tier-desc {
font-size: 0.8rem;
color: rgba(15, 27, 61, 0.6);
margin-bottom: 20px;
line-height: 1.5;
}
.tier-card.featured .tier-desc { color: rgba(255,255,255,0.6); }
.tier-features {
list-style: none;
text-align: left;
margin-bottom: 24px;
}
.tier-features li {
font-size: 0.8rem;
padding: 6px 0;
border-bottom: 1px dashed rgba(15, 27, 61, 0.15);
position: relative;
padding-left: 20px;
}
.tier-features li::before {
content: "+";
position: absolute;
left: 0;
font-family: var(--font-mono);
color: var(--neon-cyan);
font-weight: 700;
}
.tier-card.featured .tier-features li { border-color: rgba(255,255,255,0.1); }
/* Slide 10: CTA */
.cta-content {
text-align: center;
max-width: 600px;
}
.cta-content h2 {
font-size: clamp(2rem, 5vw, 3.5rem);
color: var(--neon-cyan);
margin-bottom: 1rem;
text-shadow: 4px 4px 0 var(--deep-navy), 8px 8px 0 var(--neon-yellow);
}
.cta-content p {
color: rgba(255,255,255,0.7);
margin-bottom: 2.5rem;
font-size: 1.1rem;
}
.cta-buttons {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
}
/* Decorative pixel landscape at bottom of CTA */
.pixel-landscape {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 120px;
display: flex;
align-items: flex-end;
justify-content: center;
gap: 0;
z-index: 2;
opacity: 0.3;
pointer-events: none;
}
.mountain {
background: var(--deep-navy);
width: 80px;
position: relative;
}
/* Arrow hints */
.nav-hint {
position: fixed;
bottom: 24px;
right: 24px;
font-family: var(--font-mono);
font-size: 0.65rem;
color: var(--neon-cyan);
opacity: 0.5;
z-index: 100;
letter-spacing: 0.1em;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
.slides-container { transition: none; }
.starfield .star, .pixel-particles .p { animation: none; }
.chart-bar, .hbar-fill { transition: none; }
}
</style>
</head>
<body>
<div class="deck" id="deck">
<!-- Navigation Dots -->
<div class="nav-dots" id="navDots"></div>
<!-- Slide Counter -->
<div class="slide-counter" id="slideCounter">01 / 10</div>
<!-- Keyboard hint -->
<div class="nav-hint">USE KEYS ↑ ↓</div>
<div class="slides-container" id="slidesContainer">
<!-- ========== SLIDE 1: HERO ========== -->
<section class="slide bg-grid scanlines grain crt-glow" data-slide="1">
<div class="starfield" id="starfield1"></div>
<div class="pixel-particles" id="particles1"></div>
<div class="slide-content" style="z-index:10;">
<div class="hero-subtitle">Pixel Perfect Presentation System</div>
<h1 class="pixel-hero-text" style="text-align:center;">8-BIT<br>ORBIT</h1>
<p class="hero-tagline">A retro-futuristic deck engine for bold storytellers. Built for arcades, engineered for boardrooms.</p>
<div class="hero-badges">
<span class="hero-badge">10 Slides</span>
<span class="hero-badge">CSS Native</span>
<span class="hero-badge">Zero Dependencies</span>
</div>
</div>
</section>
<!-- ========== SLIDE 2: SPLIT INTRO ========== -->
<section class="slide bg-grid-pink scanlines grain" data-slide="2">
<div class="slide-content">
<div class="split-layout">
<div class="pixel-avatar-zone pixel-corners yellow-corners">
<div class="pixel-face">
<div class="eye left"></div>
<div class="eye right"></div>
<div class="mouth"></div>
</div>
</div>
<div style="max-width: 460px;">
<span class="pixel-label">Mission Brief</span>
<h2 style="color: var(--deep-navy); margin-bottom: 1.2rem; font-size: clamp(1.6rem, 3vw, 2.4rem);">Rewiring How We Share Ideas</h2>
<p style="color: rgba(15,27,61,0.75); margin-bottom: 1rem;">
Every presentation is an opportunity to transport your audience. This template fuses the tactile nostalgia of 16-bit aesthetics with modern typographic discipline.
</p>
<p style="color: rgba(15,27,61,0.75);">
No canvas limits. No cookie-cutter layouts. Just pure CSS architecture delivering cinematic slide transitions and atmospheric depth through scanlines, grain, and glowing grids.
</p>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 3: FEATURE GRID ========== -->
<section class="slide bg-grid-cyan scanlines grain" data-slide="3">
<div class="slide-content">
<div style="text-align: center; margin-bottom: 2.5rem;">
<span class="pixel-label" style="background: var(--deep-navy); color: var(--neon-cyan);">Core Systems</span>
<h2 style="color: var(--deep-navy);">Four Engines Running</h2>
</div>
<div class="feature-grid">
<div class="feature-card">
<div class="feature-icon cube"></div>
<h3>Modular Blocks</h3>
<p>Swap components without breaking the grid. Every element is containerized and responsive by default.</p>
</div>
<div class="feature-card">
<div class="feature-icon diamond"></div>
<h3>Crisp Vectors</h3>
<p>All visual effects are native CSS. No image assets required for borders, shadows, or patterns.</p>
</div>
<div class="feature-card">
<div class="feature-icon cross"></div>
<h3>Live Data</h3>
<p>Chart slides accept dynamic values. Bars grow with CSS transitions triggered on navigation.</p>
</div>
<div class="feature-card">
<div class="feature-icon circle"></div>
<h3>Retro Atmosphere</h3>
<p>Scanlines, CRT vignettes, starfields, and noise layers create an immersive viewing environment.</p>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 4: VERTICAL BAR CHART ========== -->
<section class="slide bg-grid scanlines grain crt-glow" data-slide="4">
<div class="starfield" id="starfield4"></div>
<div class="slide-content">
<div class="chart-slide-layout">
<div class="pixel-chart-title">
<span class="pixel-label">Analytics Core</span>
<h2>Quarterly Growth Metrics</h2>
<p class="subtitle">Fiscal performance across four sectors — normalized index</p>
</div>
<div class="pixel-bar-chart" id="barChart">
<div class="chart-bar-group">
<div class="chart-value" data-value="78">0</div>
<div class="chart-bar" data-height="78" style="height: 0%;"></div>
<div class="chart-bar-label">Alpha</div>
</div>
<div class="chart-bar-group">
<div class="chart-value" data-value="92">0</div>
<div class="chart-bar alt" data-height="92" style="height: 0%;"></div>
<div class="chart-bar-label">Beta</div>
</div>
<div class="chart-bar-group">
<div class="chart-value" data-value="64">0</div>
<div class="chart-bar alt2" data-height="64" style="height: 0%;"></div>
<div class="chart-bar-label">Gamma</div>
</div>
<div class="chart-bar-group">
<div class="chart-value" data-value="85">0</div>
<div class="chart-bar" data-height="85" style="height: 0%;"></div>
<div class="chart-bar-label">Delta</div>
</div>
<div class="chart-bar-group">
<div class="chart-value" data-value="56">0</div>
<div class="chart-bar alt" data-height="56" style="height: 0%;"></div>
<div class="chart-bar-label">Epsilon</div>
</div>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 5: HORIZONTAL BAR CHART ========== -->
<section class="slide bg-grid-lavender scanlines grain" data-slide="5">
<div class="slide-content">
<div class="chart-slide-layout">
<div class="pixel-chart-title" style="margin-bottom: 2.5rem;">
<span class="pixel-label" style="background: var(--deep-navy); color: var(--neon-yellow);">System Load</span>
<h2 style="color: var(--deep-navy);">Resource Allocation</h2>
<p class="subtitle" style="color: rgba(15,27,61,0.6);">Percentage distribution across operational units</p>
</div>
<div class="pixel-hbar-chart" id="hbarChart">
<div class="hbar-row">
<div class="hbar-label">Compute</div>
<div class="hbar-track">
<div class="hbar-fill" data-width="88" style="width: 0%;"></div>
</div>
<div class="hbar-value">88%</div>
</div>
<div class="hbar-row">
<div class="hbar-label">Storage</div>
<div class="hbar-track">
<div class="hbar-fill alt" data-width="72" style="width: 0%;"></div>
</div>
<div class="hbar-value">72%</div>
</div>
<div class="hbar-row">
<div class="hbar-label">Network</div>
<div class="hbar-track">
<div class="hbar-fill alt2" data-width="95" style="width: 0%;"></div>
</div>
<div class="hbar-value">95%</div>
</div>
<div class="hbar-row">
<div class="hbar-label">Memory</div>
<div class="hbar-track">
<div class="hbar-fill" data-width="61" style="width: 0%;"></div>
</div>
<div class="hbar-value">61%</div>
</div>
<div class="hbar-row">
<div class="hbar-label">Graphics</div>
<div class="hbar-track">
<div class="hbar-fill alt" data-width="44" style="width: 0%;"></div>
</div>
<div class="hbar-value">44%</div>
</div>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 6: TIMELINE ========== -->
<section class="slide bg-grid-pink scanlines grain" data-slide="6">
<div class="slide-content">
<div style="text-align: center; margin-bottom: 2.5rem;">
<span class="pixel-label">Chronology</span>
<h2 style="color: var(--deep-navy);">Development Roadmap</h2>
</div>
<div class="timeline-container">
<div class="timeline-line"></div>
<div class="timeline-events">
<div class="timeline-event">
<div class="timeline-text">
<span class="date">Q1 2026</span>
<h4>Concept & Architecture</h4>
<p>Wireframes, palette selection, and core grid system established.</p>
</div>
<div class="timeline-spacer">
<div class="timeline-node active"></div>
</div>
<div class="timeline-empty"></div>
</div>
<div class="timeline-event">
<div class="timeline-empty"></div>
<div class="timeline-spacer">
<div class="timeline-node active"></div>
</div>
<div class="timeline-text">
<span class="date">Q2 2026</span>
<h4>Asset Generation</h4>
<p>Pixel components, iconography, and atmospheric effects coded.</p>
</div>
</div>
<div class="timeline-event">
<div class="timeline-text">
<span class="date">Q3 2026</span>
<h4>Data Integration</h4>
<p>Charting engine, animated counters, and dynamic state binding.</p>
</div>
<div class="timeline-spacer">
<div class="timeline-node"></div>
</div>
<div class="timeline-empty"></div>
</div>
<div class="timeline-event">
<div class="timeline-empty"></div>
<div class="timeline-spacer">
<div class="timeline-node"></div>
</div>
<div class="timeline-text">
<span class="date">Q4 2026</span>
<h4>Global Launch</h4>
<p>Public release with full documentation and community support.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 7: STATS / COUNTERS ========== -->
<section class="slide bg-grid scanlines grain crt-glow" data-slide="7">
<div class="starfield" id="starfield7"></div>
<div class="slide-content">
<div style="text-align: center; margin-bottom: 2.5rem;">
<span class="pixel-label">Live Telemetry</span>
<h2 style="color: var(--neon-cyan);">Platform Vitals</h2>
<p style="color: rgba(255,255,255,0.5); font-size: 0.9rem; margin-top: 0.5rem;">Real-time aggregate figures from active deployments</p>
</div>
<div class="stats-grid" id="statsGrid">
<div class="stat-block">
<div class="stat-number" data-target="847">0</div>
<div class="stat-label">Active Worlds</div>
</div>
<div class="stat-block">
<div class="stat-number" data-target="12.4" data-suffix="M">0</div>
<div class="stat-label">Pixels Rendered</div>
</div>
<div class="stat-block">
<div class="stat-number" data-target="99.9" data-suffix="%">0</div>
<div class="stat-label">Uptime Score</div>
</div>
<div class="stat-block">
<div class="stat-number" data-target="2048">0</div>
<div class="stat-label">Max Resolution</div>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 8: QUOTE ========== -->
<section class="slide bg-grid-cyan scanlines grain" data-slide="8">
<div class="slide-content">
<div class="quote-container pixel-corners">
<div class="quote-mark">"</div>
<p class="quote-text">
The best presentations do not merely inform. They immerse. They transform the conference room into an arcade cabinet where every slide is a new level waiting to be unlocked.
</p>
<div class="quote-line"></div>
<div class="quote-author">— Lead Creative Technologist, Studio Orbital</div>
</div>
</div>
</section>
<!-- ========== SLIDE 9: PRICING TIERS ========== -->
<section class="slide bg-grid-lavender scanlines grain" data-slide="9">
<div class="slide-content">
<div style="text-align: center; margin-bottom: 2.5rem;">
<span class="pixel-label" style="background: var(--deep-navy); color: var(--neon-pink);">Access Tiers</span>
<h2 style="color: var(--deep-navy);">Choose Your Loadout</h2>
</div>
<div class="tier-grid">
<div class="tier-card">
<div class="tier-name">Rookie</div>
<div class="tier-price">$0<span>/mo</span></div>
<div class="tier-desc">For solo explorers testing the waters.</div>
<ul class="tier-features">
<li>5 slide maximum</li>
<li>Standard grid themes</li>
<li>Community support</li>
<li>Static export only</li>
</ul>
<button class="pixel-btn" style="font-size: 0.8rem; padding: 12px 24px;">Select</button>
</div>
<div class="tier-card featured">
<div class="tier-name" style="color: var(--neon-yellow);">Arcade</div>
<div class="tier-price" style="color: var(--neon-pink);">$29<span>/mo</span></div>
<div class="tier-desc">Serious builders need serious tooling.</div>
<ul class="tier-features">
<li>Unlimited slides</li>
<li>All atmospheric packs</li>
<li>Live data binding</li>
<li>Priority rendering</li>
<li>Custom cursor sets</li>
</ul>
<button class="pixel-btn pink-btn" style="font-size: 0.8rem; padding: 12px 24px;">Select</button>
</div>
<div class="tier-card">
<div class="tier-name">Boss</div>
<div class="tier-price">$79<span>/mo</span></div>
<div class="tier-desc">Enterprise-grade control and compliance.</div>
<ul class="tier-features">
<li>Everything in Arcade</li>
<li>White-label export</li>
<li>SSO & audit logs</li>
<li>Dedicated pipeline</li>
</ul>
<button class="pixel-btn" style="font-size: 0.8rem; padding: 12px 24px;">Select</button>
</div>
</div>
</div>
</section>
<!-- ========== SLIDE 10: CLOSING CTA ========== -->
<section class="slide bg-grid scanlines grain crt-glow" data-slide="10">
<div class="starfield" id="starfield10"></div>
<div class="pixel-particles" id="particles10"></div>
<div class="pixel-landscape" id="landscape10"></div>
<div class="slide-content" style="z-index:10;">
<div class="cta-content">
<h2>Ready Player<br>One?</h2>
<p>Deploy your first 8-BIT ORBIT deck in under sixty seconds. No dependencies. No friction. Just pure presentation power.</p>
<div class="cta-buttons">
<button class="pixel-btn">Initialize Deck</button>
<button class="pixel-btn pink-btn">View Documentation</button>
</div>
</div>
</div>
</section>
</div>
</div>
<script>
(function() {
const totalSlides = 10;
let currentSlide = 0;
const container = document.getElementById('slidesContainer');
const counter = document.getElementById('slideCounter');
const dotsContainer = document.getElementById('navDots');
// Generate nav dots
for (let i = 0; i < totalSlides; i++) {
const dot = document.createElement('div');
dot.className = 'nav-dot' + (i === 0 ? ' active' : '');
dot.addEventListener('click', () => goToSlide(i));
dotsContainer.appendChild(dot);
}
const dots = document.querySelectorAll('.nav-dot');
function updateUI() {
container.style.transform = `translateY(-${currentSlide * 100}vh)`;
counter.textContent = String(currentSlide + 1).padStart(2, '0') + ' / ' + totalSlides;
dots.forEach((d, i) => d.classList.toggle('active', i === currentSlide));
triggerAnimations(currentSlide);
}
function goToSlide(index) {
if (index < 0 || index >= totalSlides) return;
currentSlide = index;
updateUI();
}
function nextSlide() { goToSlide(currentSlide + 1); }
function prevSlide() { goToSlide(currentSlide - 1); }
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowDown' || e.key === 'ArrowRight' || e.key === ' ') {
e.preventDefault();
nextSlide();
} else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {
e.preventDefault();
prevSlide();
} else if (e.key === 'Home') {
e.preventDefault();
goToSlide(0);
} else if (e.key === 'End') {
e.preventDefault();
goToSlide(totalSlides - 1);
}
});
// Touch / swipe support
let touchStartY = 0;
document.addEventListener('touchstart', (e) => { touchStartY = e.touches[0].clientY; });
document.addEventListener('touchend', (e) => {
const diff = touchStartY - e.changedTouches[0].clientY;
if (Math.abs(diff) > 50) {
diff > 0 ? nextSlide() : prevSlide();
}
});
// Wheel support with debounce
let wheelLock = false;
document.addEventListener('wheel', (e) => {
if (wheelLock) return;
wheelLock = true;
e.deltaY > 0 ? nextSlide() : prevSlide();
setTimeout(() => wheelLock = false, 800);
}, { passive: true });
// ===== ANIMATION TRIGGERS =====
function triggerAnimations(slideIndex) {
// Slide 4: Vertical bar chart
if (slideIndex === 3) {
document.querySelectorAll('#barChart .chart-bar').forEach((bar, i) => {
const h = bar.dataset.height;
setTimeout(() => {
bar.style.height = h + '%';
}, i * 120);
});
document.querySelectorAll('#barChart .chart-value').forEach((val, i) => {
const target = parseInt(val.dataset.value);
setTimeout(() => animateNumber(val, target, '', 800), i * 120);
});
} else {
document.querySelectorAll('#barChart .chart-bar').forEach(bar => bar.style.height = '0%');
}
// Slide 5: Horizontal bar chart
if (slideIndex === 4) {
document.querySelectorAll('#hbarChart .hbar-fill').forEach((fill, i) => {
const w = fill.dataset.width;
setTimeout(() => { fill.style.width = w + '%'; }, i * 100);
});
} else {
document.querySelectorAll('#hbarChart .hbar-fill').forEach(fill => fill.style.width = '0%');
}
// Slide 7: Stats counters
if (slideIndex === 6) {
document.querySelectorAll('#statsGrid .stat-number').forEach((el, i) => {
const target = parseFloat(el.dataset.target);
const suffix = el.dataset.suffix || '';
const isFloat = target % 1 !== 0;
setTimeout(() => animateNumber(el, target, suffix, 1200, isFloat), i * 150);
});
} else {
document.querySelectorAll('#statsGrid .stat-number').forEach(el => el.textContent = '0');
}
}
function animateNumber(el, target, suffix, duration, isFloat = false) {
const start = performance.now();
function tick(now) {
const progress = Math.min((now - start) / duration, 1);
const eased = 1 - Math.pow(1 - progress, 3);
const current = eased * target;
el.textContent = (isFloat ? current.toFixed(1) : Math.floor(current)) + suffix;
if (progress < 1) requestAnimationFrame(tick);
else el.textContent = (isFloat ? target.toFixed(1) : target) + suffix;
}
requestAnimationFrame(tick);
}
// ===== GENERATE STARFIELD =====
function generateStars(containerId, count = 40) {
const container = document.getElementById(containerId);
if (!container) return;
container.innerHTML = '';
for (let i = 0; i < count; i++) {
const star = document.createElement('div');
star.className = 'star';
star.style.left = Math.random() * 100 + '%';
star.style.top = Math.random() * 100 + '%';
star.style.animationDelay = Math.random() * 3 + 's';
container.appendChild(star);
}
}
generateStars('starfield1', 50);
generateStars('starfield4', 30);
generateStars('starfield7', 35);
generateStars('starfield10', 45);
// ===== GENERATE FLOATING PARTICLES =====
function generateParticles(containerId, colors, count = 12) {
const container = document.getElementById(containerId);
if (!container) return;
container.innerHTML = '';
for (let i = 0; i < count; i++) {
const p = document.createElement('div');
p.className = 'p';
const color = colors[i % colors.length];
p.style.background = color;
p.style.left = Math.random() * 100 + '%';
p.style.top = Math.random() * 100 + '%';
p.style.animationDelay = Math.random() * 5 + 's';
p.style.animationDuration = (6 + Math.random() * 6) + 's';
container.appendChild(p);
}
}
generateParticles('particles1', ['var(--neon-cyan)', 'var(--neon-pink)', 'var(--neon-yellow)'], 16);
generateParticles('particles10', ['var(--neon-cyan)', 'var(--neon-pink)', 'var(--neon-yellow)'], 20);
// ===== GENERATE PIXEL LANDSCAPE FOR CTA =====
function generateLandscape() {
const container = document.getElementById('landscape10');
if (!container) return;
const heights = [30, 50, 70, 40, 60, 35, 55, 45, 80, 25, 50, 40];
heights.forEach((h, i) => {
const mtn = document.createElement('div');
mtn.className = 'mountain';
mtn.style.height = h + 'px';
mtn.style.width = (60 + (i % 3) * 20) + 'px';
container.appendChild(mtn);
});
}
generateLandscape();
// Initialize
updateUI();
})();
</script>
</body>
</html>
MIT License
Copyright (c) 2026 LI ZHENG
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Related skills
FAQ
Does the deck stay editable after generation?
Yes, it produces HTML presentations that run in the browser with a built-in editor supporting object moving, slide reordering, Ctrl+S persistence, and export HTML.
When should I use the read-only version instead?
For read-only decks without editor weight, the docs recommend the original frontend-slides skill instead.