Skip to content

Design System for Landing Pages ​

A lightweight design system lets you ship new landing pages in hours instead of weeks β€” consistency without rigidity.

Why This Matters ​

  • πŸ’» Dev: A design system gives you reusable components, consistent spacing, and predictable markup. You stop rebuilding hero sections from scratch for every campaign and start composing pages from tested, accessible building blocks.
  • πŸ“‹ PM: Design systems directly reduce time-to-ship. When your team can assemble a new landing page from existing components, you can run more experiments, test more messages, and iterate faster than competitors who design from zero every time.
  • 🎨 Designer: A design system is not a cage β€” it is a scaffold. It handles the repetitive decisions (spacing, type sizes, button styles) so you can focus your energy on the creative work that actually differentiates each page.

The Concept (Simple) ​

Think of LEGO bricks.

You do not sculpt each creation from clay. You build from standardized, interchangeable components that snap together in new combinations. Every brick has consistent dimensions, consistent connectors, and consistent colors. A 2x4 red brick from 1965 still snaps onto a 2x4 red brick from 2025.

But LEGO does not limit creativity β€” it enables it. Because you do not have to think about how pieces connect, you think about what to build.

A landing page design system works the same way. Your "bricks" are components: hero sections, feature grids, testimonial cards, pricing tables, CTA blocks, FAQ accordions. Each component has defined spacing, typography, and color usage. When you need a new landing page, you select components, arrange them, and customize the content. The structural decisions are already made.

The result: your team ships a new landing page in an afternoon instead of a sprint. Every page looks like it belongs to the same brand. And when you update a button style, it updates everywhere.


How It Works (Detailed) ​

The Anatomy of a Landing Page Design System ​

A full design system (like Shopify Polaris or Atlassian's system) has hundreds of components and thousands of tokens. You do not need that for landing pages. Here is the minimum viable design system:

╔══════════════════════════════════════════════════════════════╗
β•‘                   DESIGN SYSTEM LAYERS                       β•‘
╠══════════════════════════════════════════════════════════════╣
β•‘                                                              β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚  TOKENS (foundation layer)                          β”‚    β•‘
β•‘   β”‚  Colors, typography, spacing, shadows, radii        β”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                          β”‚ consumed by                       β•‘
β•‘                          β–Ό                                   β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚  PRIMITIVES (building blocks)                       β”‚    β•‘
β•‘   β”‚  Buttons, inputs, badges, icons, links              β”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                          β”‚ composed into                     β•‘
β•‘                          β–Ό                                   β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚  COMPONENTS (reusable sections)                     β”‚    β•‘
β•‘   β”‚  Hero, features grid, testimonials, pricing,        β”‚    β•‘
β•‘   β”‚  FAQ, CTA block, footer                             β”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                          β”‚ assembled into                    β•‘
β•‘                          β–Ό                                   β•‘
β•‘   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β•‘
β•‘   β”‚  PAGES (final output)                               β”‚    β•‘
β•‘   β”‚  Homepage, product page, campaign page, signup      β”‚    β•‘
β•‘   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β•‘
β•‘                                                              β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Design Tokens ​

Tokens are named values that store your design decisions. Instead of using raw values (colors: #6C5CE7, spacing: 24px), you give them semantic names. This makes the system maintainable and themeable.

Token Naming Convention:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Category         β”‚ Token Name         β”‚ Value (example)              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Color - Primary  β”‚ --color-primary    β”‚ #6C5CE7 (brand purple)       β”‚
β”‚                  β”‚ --color-primary-   β”‚ #5A4BD1 (hover state)        β”‚
β”‚                  β”‚   hover            β”‚                              β”‚
β”‚                  β”‚ --color-primary-   β”‚ #8B7EF0 (light variant)      β”‚
β”‚                  β”‚   light            β”‚                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Color - Neutral  β”‚ --color-text       β”‚ #1A1A2E (primary text)       β”‚
β”‚                  β”‚ --color-text-muted β”‚ #6B7280 (secondary text)     β”‚
β”‚                  β”‚ --color-bg         β”‚ #FFFFFF (background)         β”‚
β”‚                  β”‚ --color-bg-alt     β”‚ #F9FAFB (alternating bg)     β”‚
β”‚                  β”‚ --color-border     β”‚ #E5E7EB (dividers)           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Color - Semantic β”‚ --color-success    β”‚ #10B981 (green)              β”‚
β”‚                  β”‚ --color-error      β”‚ #EF4444 (red)                β”‚
β”‚                  β”‚ --color-warning    β”‚ #F59E0B (amber)              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Typography       β”‚ --font-family      β”‚ 'Inter', sans-serif          β”‚
β”‚                  β”‚ --text-hero        β”‚ 3.5rem / 1.1 line-height     β”‚
β”‚                  β”‚ --text-h2          β”‚ 2.25rem / 1.2                β”‚
β”‚                  β”‚ --text-h3          β”‚ 1.5rem / 1.3                 β”‚
β”‚                  β”‚ --text-body        β”‚ 1.125rem / 1.6               β”‚
β”‚                  β”‚ --text-small       β”‚ 0.875rem / 1.5               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Spacing          β”‚ --space-xs         β”‚ 4px                          β”‚
β”‚                  β”‚ --space-sm         β”‚ 8px                          β”‚
β”‚                  β”‚ --space-md         β”‚ 16px                         β”‚
β”‚                  β”‚ --space-lg         β”‚ 24px                         β”‚
β”‚                  β”‚ --space-xl         β”‚ 48px                         β”‚
β”‚                  β”‚ --space-2xl        β”‚ 80px                         β”‚
β”‚                  β”‚ --space-section    β”‚ 120px                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Borders          β”‚ --radius-sm        β”‚ 4px                          β”‚
β”‚                  β”‚ --radius-md        β”‚ 8px                          β”‚
β”‚                  β”‚ --radius-lg        β”‚ 16px                         β”‚
β”‚                  β”‚ --radius-full      β”‚ 9999px (pill shape)          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Shadows          β”‚ --shadow-sm        β”‚ 0 1px 2px rgba(0,0,0,0.05)  β”‚
β”‚                  β”‚ --shadow-md        β”‚ 0 4px 6px rgba(0,0,0,0.07)  β”‚
β”‚                  β”‚ --shadow-lg        β”‚ 0 10px 15px rgba(0,0,0,0.1) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Core Typography Scale ​

Keep it simple. Three to four sizes handle 95% of landing page needs:

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                                             β”‚
    β”‚  Hero Headline (3.5rem / 56px)              β”‚
    β”‚  ═══════════════════════════                 β”‚
    β”‚                                             β”‚
    β”‚  Section Heading (2.25rem / 36px)           β”‚
    β”‚  ───────────────────────                    β”‚
    β”‚                                             β”‚
    β”‚  Sub-heading (1.5rem / 24px)                β”‚
    β”‚  ─────────────────                          β”‚
    β”‚                                             β”‚
    β”‚  Body Text (1.125rem / 18px)                β”‚
    β”‚  Regular paragraph copy for readability.    β”‚
    β”‚                                             β”‚
    β”‚  Small / Caption (0.875rem / 14px)          β”‚
    β”‚  Fine print and labels.                     β”‚
    β”‚                                             β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Button Styles ​

Three button variants cover every landing page scenario:

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                                                     β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
    β”‚  β”‚ β–ˆβ–ˆ Primary Action β–ˆβ–ˆβ–ˆ β”‚  ◀── Filled, brand      β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      color background,   β”‚
    β”‚                                  white text          β”‚
    β”‚                                                     β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
    β”‚  β”‚   Secondary Action    β”‚  ◀── Outlined, brand     β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      color border + text, β”‚
    β”‚                                  transparent bg      β”‚
    β”‚                                                     β”‚
    β”‚     Ghost Action ─▢          ◀── Text only, no      β”‚
    β”‚                                  border or bg,       β”‚
    β”‚                                  underline on hover  β”‚
    β”‚                                                     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Inventory ​

Here is the minimum set of section components you need to build any landing page:

╔══════════════════════════════════════════════════════════════╗
β•‘                    COMPONENT INVENTORY                        β•‘
╠══════════════════════════════════════════════════════════════╣
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  HERO SECTION                                        β”‚   β•‘
β•‘  β”‚  Variants: centered, split (text + image), video bg  β”‚   β•‘
β•‘  β”‚  Contains: headline, sub-headline, CTA, hero visual  β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  LOGO BAR / TRUST STRIP                              β”‚   β•‘
β•‘  β”‚  Variants: static row, scrolling marquee             β”‚   β•‘
β•‘  β”‚  Contains: 4-8 company logos, optional label          β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  FEATURE GRID                                        β”‚   β•‘
β•‘  β”‚  Variants: 2-col, 3-col, alternating rows            β”‚   β•‘
β•‘  β”‚  Contains: icon, title, description per feature      β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  TESTIMONIAL SECTION                                 β”‚   β•‘
β•‘  β”‚  Variants: single quote, carousel, grid              β”‚   β•‘
β•‘  β”‚  Contains: quote, name, role, company, avatar        β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  PRICING TABLE                                       β”‚   β•‘
β•‘  β”‚  Variants: 2-tier, 3-tier, comparison matrix         β”‚   β•‘
β•‘  β”‚  Contains: plan name, price, features, CTA           β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  CTA BLOCK                                           β”‚   β•‘
β•‘  β”‚  Variants: inline, full-width banner, floating bar   β”‚   β•‘
β•‘  β”‚  Contains: headline, sub-text, button                β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  FAQ ACCORDION                                       β”‚   β•‘
β•‘  β”‚  Variants: single column, two column                 β”‚   β•‘
β•‘  β”‚  Contains: question, expandable answer               β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•‘  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β•‘
β•‘  β”‚  FOOTER                                              β”‚   β•‘
β•‘  β”‚  Variants: minimal, multi-column with links          β”‚   β•‘
β•‘  β”‚  Contains: links, legal, social icons                β”‚   β•‘
β•‘  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β•‘
β•‘                                                              β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

The Spacing Grid ​

Use a base unit and multiply consistently. An 8px base is the industry standard (used by Material Design, Ant Design, and most modern systems). Every spacing decision should be a multiple of 8:

    8px  ── element padding (inside buttons, inputs)
    16px ── gap between related elements (icon + label)
    24px ── gap between groups (form field to form field)
    48px ── section internal padding
    80px ── between major sections
    120px── between page-level sections (hero to features)

This creates visual rhythm. The eye detects consistent spacing subconsciously, and it reads as "professional." Inconsistent spacing reads as "amateur."

Documenting Components for Handoff ​

Each component in your system should have a one-page spec that includes:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  COMPONENT SPEC: Hero Section (Split Variant)               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                             β”‚
β”‚  PURPOSE: Primary above-the-fold section. Communicates      β”‚
β”‚  the core value proposition and drives primary CTA.         β”‚
β”‚                                                             β”‚
β”‚  VARIANTS: Centered, Split (text + image), Video BG        β”‚
β”‚                                                             β”‚
β”‚  TOKENS USED:                                               β”‚
β”‚  - Headline: --text-hero, --color-text, font-weight 700    β”‚
β”‚  - Sub-headline: --text-body, --color-text-muted           β”‚
β”‚  - CTA: Primary button variant                             β”‚
β”‚  - Background: --color-bg or --color-bg-alt                β”‚
β”‚  - Section padding: --space-section (120px) top/bottom     β”‚
β”‚                                                             β”‚
β”‚  RESPONSIVE BEHAVIOR:                                       β”‚
β”‚  - Desktop: two columns (text left, image right)            β”‚
β”‚  - Tablet: text above, image below                          β”‚
β”‚  - Mobile: text above, image below, full-width CTA          β”‚
β”‚                                                             β”‚
β”‚  CONTENT GUIDELINES:                                        β”‚
β”‚  - Headline: max 8 words                                    β”‚
β”‚  - Sub-headline: max 25 words                               β”‚
β”‚  - CTA: max 4 words, action-oriented verb                   β”‚
β”‚                                                             β”‚
β”‚  ACCESSIBILITY:                                              β”‚
β”‚  - Hero image must have alt text                             β”‚
β”‚  - CTA must have minimum 4.5:1 contrast ratio               β”‚
β”‚  - Heading must be an <h1>                                  β”‚
β”‚                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

In Practice ​

Stripe β€” Visual Consistency Across Dozens of Pages ​

Stripe operates dozens of landing pages β€” for Payments, Billing, Connect, Atlas, Terminal, Radar, and more. Despite this volume, every page is unmistakably Stripe. How?

Stripe maintains a rigorous internal design system with:

  • A fixed typography scale (one display font, one body font, consistent sizes)
  • A constrained color palette with gradients as a signature element
  • Consistent section patterns: hero with gradient background, feature grid with icons, code example block, CTA with dark background
  • Standardized spacing: generous whitespace (often 120px+ between sections) that never varies

The key lesson: Stripe does not redesign each page. They reconfigure the same components with different content. The hero component on the Payments page is structurally identical to the hero on the Billing page β€” different headline, different illustration, same layout, same spacing, same button style.

Linear β€” Design System Enables Rapid Page Creation ​

Linear's landing pages are clean, dark-themed, and strikingly consistent. Their system is minimal but effective:

  • Two colors: near-white text on a near-black background, with a single accent color (purple-blue) for CTAs and highlights
  • One font family at three sizes
  • Consistent section structure: headline, short description, visual, repeat
  • Animations are subtle and consistent β€” the same fade-up entrance used everywhere

Linear ships new feature announcement pages rapidly because the decisions are already made. A new page is just: write the headline, create the visual, slot it into the existing component structure. The design system makes speed possible without sacrificing quality.


Key Takeaways ​

  • A landing page design system has four layers: tokens, primitives, components, and pages. Start with tokens and work up.
  • You need fewer tokens than you think. Five type sizes, six spacing values, and five colors handle 95% of cases.
  • Use an 8px spacing grid for visual rhythm. Every spacing value should be a multiple of 8.
  • Three button variants (primary, secondary, ghost) cover every CTA scenario on a landing page.
  • Eight section components (hero, logo bar, features, testimonials, pricing, CTA block, FAQ, footer) can build any landing page.
  • Document each component with purpose, variants, tokens used, responsive behavior, and content guidelines.
  • The goal is not to eliminate creativity β€” it is to eliminate repetitive decisions so your team can focus on the work that differentiates each page.

Action Items ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ πŸ’» Dev   β”‚ ☐ Define design tokens as CSS custom properties in a single β”‚
β”‚          β”‚   file (tokens.css) β€” colors, type sizes, spacing, radii    β”‚
β”‚          β”‚ ☐ Build the 8 core section components as reusable            β”‚
β”‚          β”‚   HTML/CSS blocks (or React/Vue components)                  β”‚
β”‚          β”‚ ☐ Create a simple page template that imports tokens and     β”‚
β”‚          β”‚   lets you compose sections in any order                     β”‚
β”‚          β”‚ ☐ Set up a component playground (Storybook or a simple      β”‚
β”‚          β”‚   HTML page) where the team can preview all components       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ πŸ“‹ PM    β”‚ ☐ Audit your last 5 landing pages β€” how many sections were β”‚
β”‚          β”‚   built from scratch vs reused? Identify reuse opportunities β”‚
β”‚          β”‚ ☐ Track time-to-ship for the next landing page built with   β”‚
β”‚          β”‚   the system vs without β€” quantify the speed gain           β”‚
β”‚          β”‚ ☐ Maintain a living inventory of components and their       β”‚
β”‚          β”‚   variants so the team knows what is available               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 🎨 Designβ”‚ ☐ Create a Figma component library with the 8 core         β”‚
β”‚          β”‚   sections and their variants                                β”‚
β”‚          β”‚ ☐ Define and document the token system (colors, type,       β”‚
β”‚          β”‚   spacing) in a single source of truth                      β”‚
β”‚          β”‚ ☐ Write content guidelines for each component (max word     β”‚
β”‚          β”‚   counts, tone, formatting rules)                           β”‚
β”‚          β”‚ ☐ Build one new landing page using only existing components β”‚
β”‚          β”‚   to validate the system covers real needs                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Next: Chapter 12: Form Design and Interaction Patterns

The Product Builder's Playbook