Files
2026-02-27 05:39:31 -08:00

8.9 KiB

Style Presets Reference

Curated visual styles for frontend-slides.

Use this file for:

  • the mandatory viewport-fitting CSS base
  • preset selection and mood mapping
  • CSS gotchas and validation rules

Abstract shapes only. Avoid illustrations unless the user explicitly asks for them.

Viewport Fit Is Non-Negotiable

Every slide must fully fit in one viewport.

Golden Rule

Each slide = exactly one viewport height.
Too much content = split into more slides.
Never scroll inside a slide.

Density Limits

Slide Type Maximum Content
Title slide 1 heading + 1 subtitle + optional tagline
Content slide 1 heading + 4-6 bullets or 2 paragraphs
Feature grid 6 cards maximum
Code slide 8-10 lines maximum
Quote slide 1 quote + attribution
Image slide 1 image, ideally under 60vh

Mandatory Base CSS

Copy this block into every generated presentation and then theme on top of it.

/* ===========================================
   VIEWPORT FITTING: MANDATORY BASE STYLES
   =========================================== */

html, body {
    height: 100%;
    overflow-x: hidden;
}

html {
    scroll-snap-type: y mandatory;
    scroll-behavior: smooth;
}

.slide {
    width: 100vw;
    height: 100vh;
    height: 100dvh;
    overflow: hidden;
    scroll-snap-align: start;
    display: flex;
    flex-direction: column;
    position: relative;
}

.slide-content {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    max-height: 100%;
    overflow: hidden;
    padding: var(--slide-padding);
}

:root {
    --title-size: clamp(1.5rem, 5vw, 4rem);
    --h2-size: clamp(1.25rem, 3.5vw, 2.5rem);
    --h3-size: clamp(1rem, 2.5vw, 1.75rem);
    --body-size: clamp(0.75rem, 1.5vw, 1.125rem);
    --small-size: clamp(0.65rem, 1vw, 0.875rem);

    --slide-padding: clamp(1rem, 4vw, 4rem);
    --content-gap: clamp(0.5rem, 2vw, 2rem);
    --element-gap: clamp(0.25rem, 1vw, 1rem);
}

.card, .container, .content-box {
    max-width: min(90vw, 1000px);
    max-height: min(80vh, 700px);
}

.feature-list, .bullet-list {
    gap: clamp(0.4rem, 1vh, 1rem);
}

.feature-list li, .bullet-list li {
    font-size: var(--body-size);
    line-height: 1.4;
}

.grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
    gap: clamp(0.5rem, 1.5vw, 1rem);
}

img, .image-container {
    max-width: 100%;
    max-height: min(50vh, 400px);
    object-fit: contain;
}

@media (max-height: 700px) {
    :root {
        --slide-padding: clamp(0.75rem, 3vw, 2rem);
        --content-gap: clamp(0.4rem, 1.5vw, 1rem);
        --title-size: clamp(1.25rem, 4.5vw, 2.5rem);
        --h2-size: clamp(1rem, 3vw, 1.75rem);
    }
}

@media (max-height: 600px) {
    :root {
        --slide-padding: clamp(0.5rem, 2.5vw, 1.5rem);
        --content-gap: clamp(0.3rem, 1vw, 0.75rem);
        --title-size: clamp(1.1rem, 4vw, 2rem);
        --body-size: clamp(0.7rem, 1.2vw, 0.95rem);
    }

    .nav-dots, .keyboard-hint, .decorative {
        display: none;
    }
}

@media (max-height: 500px) {
    :root {
        --slide-padding: clamp(0.4rem, 2vw, 1rem);
        --title-size: clamp(1rem, 3.5vw, 1.5rem);
        --h2-size: clamp(0.9rem, 2.5vw, 1.25rem);
        --body-size: clamp(0.65rem, 1vw, 0.85rem);
    }
}

@media (max-width: 600px) {
    :root {
        --title-size: clamp(1.25rem, 7vw, 2.5rem);
    }

    .grid {
        grid-template-columns: 1fr;
    }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        transition-duration: 0.2s !important;
    }

    html {
        scroll-behavior: auto;
    }
}

Viewport Checklist

  • every .slide has height: 100vh, height: 100dvh, and overflow: hidden
  • all typography uses clamp()
  • all spacing uses clamp() or viewport units
  • images have max-height constraints
  • grids adapt with auto-fit + minmax()
  • short-height breakpoints exist at 700px, 600px, and 500px
  • if anything feels cramped, split the slide

Mood to Preset Mapping

Mood Good 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

Preset Catalog

1. Bold Signal

  • Vibe: confident, high-impact, keynote-ready
  • Best for: pitch decks, launches, statements
  • Fonts: Archivo Black + Space Grotesk
  • Palette: charcoal base, hot orange focal card, crisp white text
  • Signature: oversized section numbers, high-contrast card on dark field

2. Electric Studio

  • Vibe: clean, bold, agency-polished
  • Best for: client presentations, strategic reviews
  • Fonts: Manrope only
  • Palette: black, white, saturated cobalt accent
  • Signature: two-panel split and sharp editorial alignment

3. Creative Voltage

  • Vibe: energetic, retro-modern, playful confidence
  • Best for: creative studios, brand work, product storytelling
  • Fonts: Syne + Space Mono
  • Palette: electric blue, neon yellow, deep navy
  • Signature: halftone textures, badges, punchy contrast

4. Dark Botanical

  • Vibe: elegant, premium, atmospheric
  • Best for: luxury brands, thoughtful narratives, premium product decks
  • Fonts: Cormorant + IBM Plex Sans
  • Palette: near-black, warm ivory, blush, gold, terracotta
  • Signature: blurred abstract circles, fine rules, restrained motion

5. Notebook Tabs

  • Vibe: editorial, organized, tactile
  • Best for: reports, reviews, structured storytelling
  • Fonts: Bodoni Moda + DM Sans
  • Palette: cream paper on charcoal with pastel tabs
  • Signature: paper sheet, colored side tabs, binder details

6. Pastel Geometry

  • Vibe: approachable, modern, friendly
  • Best for: product overviews, onboarding, lighter brand decks
  • Fonts: Plus Jakarta Sans only
  • Palette: pale blue field, cream card, soft pink/mint/lavender accents
  • Signature: vertical pills, rounded cards, soft shadows

7. Split Pastel

  • Vibe: playful, modern, creative
  • Best for: agency intros, workshops, portfolios
  • Fonts: Outfit only
  • Palette: peach + lavender split with mint badges
  • Signature: split backdrop, rounded tags, light grid overlays

8. Vintage Editorial

  • Vibe: witty, personality-driven, magazine-inspired
  • Best for: personal brands, opinionated talks, storytelling
  • Fonts: Fraunces + Work Sans
  • Palette: cream, charcoal, dusty warm accents
  • Signature: geometric accents, bordered callouts, punchy serif headlines

9. Neon Cyber

  • Vibe: futuristic, techy, kinetic
  • Best for: AI, infra, dev tools, future-of-X talks
  • Fonts: Clash Display + Satoshi
  • Palette: midnight navy, cyan, magenta
  • Signature: glow, particles, grids, data-radar energy

10. Terminal Green

  • Vibe: developer-focused, hacker-clean
  • Best for: APIs, CLI tools, engineering demos
  • Fonts: JetBrains Mono only
  • Palette: GitHub dark + terminal green
  • Signature: scan lines, command-line framing, precise monospace rhythm

11. Swiss Modern

  • Vibe: minimal, precise, data-forward
  • Best for: corporate, product strategy, analytics
  • Fonts: Archivo + Nunito
  • Palette: white, black, signal red
  • Signature: visible grids, asymmetry, geometric discipline

12. Paper & Ink

  • Vibe: literary, thoughtful, story-driven
  • Best for: essays, keynote narratives, manifesto decks
  • Fonts: Cormorant Garamond + Source Serif 4
  • Palette: warm cream, charcoal, crimson accent
  • Signature: pull quotes, drop caps, elegant rules

Direct Selection Prompts

If the user already knows the style they want, let them pick directly from the preset names above instead of forcing preview generation.

Animation Feel Mapping

Feeling Motion Direction
Dramatic / Cinematic slow fades, parallax, large scale-ins
Techy / Futuristic glow, particles, grid motion, scramble text
Playful / Friendly springy easing, rounded shapes, floating motion
Professional / Corporate subtle 200-300ms transitions, clean slides
Calm / Minimal very restrained movement, whitespace-first
Editorial / Magazine strong hierarchy, staggered text and image interplay

CSS Gotcha: Negating Functions

Never write these:

right: -clamp(28px, 3.5vw, 44px);
margin-left: -min(10vw, 100px);

Browsers ignore them silently.

Always write this instead:

right: calc(-1 * clamp(28px, 3.5vw, 44px));
margin-left: calc(-1 * min(10vw, 100px));

Validation Sizes

Test at minimum:

  • Desktop: 1920x1080, 1440x900, 1280x720
  • Tablet: 1024x768, 768x1024
  • Mobile: 375x667, 414x896
  • Landscape phone: 667x375, 896x414

Anti-Patterns

Do not use:

  • purple-on-white startup templates
  • Inter / Roboto / Arial as the visual voice unless the user explicitly wants utilitarian neutrality
  • bullet walls, tiny type, or code blocks that require scrolling
  • decorative illustrations when abstract geometry would do the job better