dark · sans · developer

DESIGN.md inspired by Vapi

Near-black developer canvas lit by a signature lime and a playful multi-color set — Avantt display at 80px over Season Sans body, cream text, r12 CTAs.

By webdesignhot · vapi.ai
$ npx @webdesignhot/design-md add vapi
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #0e0e13
  • bg-soft #16161c
  • bg-band #1f1f23
  • surface #16161c
  • surface-soft #1f1f23
  • surface-hover #28282f
  • text AAA · 18.4 #fffaea
  • text-strong #ffffff
  • text-muted #b7b3a9
  • text-soft #86847e
  • text-faint — · 2.5 #56544f
  • brand AAA · 9.9 #7ccf00
  • brand-hover #8ee10f
  • brand-active #6bb500
  • brand-soft rgba(124, 207, 0, 0.16)
  • brand-faint rgba(124, 207, 0, 0.08)
  • on-brand #0e0e13
  • accent-red #fb2c36
  • accent-amber #fdc700
  • accent-orange #ff6900
  • accent #7ccf00
  • link #7ccf00
  • border — · 1.2 rgba(255, 255, 255, 0.08)
  • border-soft rgba(255, 255, 255, 0.04)
  • border-strong — · 1.6 rgba(255, 255, 255, 0.16)
  • cta-dark-bg #000000
  • cta-dark-text #fafafa
  • cta-light-bg #ffffff
  • cta-light-text #000000
  • success #7ccf00
  • success-bg rgba(124, 207, 0, 0.16)
  • warning #fdc700
  • warning-bg rgba(253, 199, 0, 0.16)
  • danger #fb2c36
  • danger-bg rgba(251, 44, 54, 0.16)
  • info #fffaea
  • info-bg #1f1f23
Typography
Ship faster than ever.
display-hero avantt 96px w600 -0.03em
Ship faster than ever.
display-lg avantt 80px w600 -0.028em
Ship faster than ever.
h1 avantt 80px w600 -0.028em
Built for teams that ship.
h2 avantt 58px w500 -0.02em
A complete kit
h3 avantt 40px w600 -0.015em
The quick brown fox jumps over the lazy dog.
h4 avantt 28px w600 -0.01em
The quick brown fox jumps over the lazy dog.
h5 avantt 20px w600 -0.005em
The quick brown fox jumps over the lazy dog.
body-lg seasonSans 18px w400 0
The quick brown fox jumps over the lazy dog.
h6 avantt 16px w600 0
The quick brown fox jumps over the lazy dog.
body seasonSans 16px w400 0
The quick brown fox jumps over the lazy dog.
body-sm seasonSans 14px w400 0
npx @webdesignhot/design-md add stripe
code-inline ui-monospace 14px w400 0
npx @webdesignhot/design-md add stripe
code ui-monospace 14px w400 0
OUR DESIGN SYSTEM
label seasonSans 13px w500 0
OUR DESIGN SYSTEM
caption seasonSans 12px w500 0.02em
The quick brown fox jumps over the lazy dog.
micro ui-monospace 11px w500 0.04em
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 24px
  • step-6 32px
  • step-7 48px
  • step-8 64px
  • step-9 96px
  • step-10 128px
Radius
  • none 0px
  • micro 2px
  • sm 4px
  • md 8px
  • lg 12px
  • xl 16px
  • xxl 24px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 8/8 mapped · webdesignhot/0.1

Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.

  • background bg
  • foreground text
  • primary brand
  • primary-foreground on-brand
  • accent accent
  • muted text-muted
  • border border
  • ring border-strong
Lineage & influences

Vapi's surface is a developer console that learned to have fun. The ground is a near-black `#0e0e13` — a hair warmer and bluer than pure black — and the body text is a warm cream `#fffaea` rather than the usual clinical white, which gives the dark canvas an unexpected softness that reads less like a terminal and more like a well-lit studio at night. The structural type is Avantt, a contemporary grotesk with a confident display cut, run at studio scale (h1 at 80px / 600 weight with hard negative tracking) over a Season Sans body that keeps paragraph reading warm and humanist. The signature chromatic event is an electric lime `#7ccf00` that does the brand's primary lifting — but unlike the single-accent discipline of ElevenLabs or Linear, Vapi deliberately keeps a whole playful set in rotation: red `#fb2c36`, amber `#fdc700`, and orange `#ff6900` punctuate the canvas like confetti, mapping to feature categories, code-sample highlights, and moments of energy. The CTA primitive is a crisp 12px-radius button (not a pill), and the primary action is frequently a pure-black or pure-white block against the near-black ground — maximum contrast rather than maximum saturation. The result is a register that is unmistakably developer-first — technical, fast, console-like — while refusing the joyless monochrome that usually comes with that territory. Vapi watches the same single-accent, studio-dark lineage that ElevenLabs and Vercel established, then breaks ranks on the one rule those brands hold sacred: it lets the palette play.

  • Adjacent voice-AI brand and the closest reference — studio-dark ground with a signature lime; Vapi keeps the dark register but trades single-accent restraint for a playful multi-color set.
  • Near-black canvas as the serious-developer-tool register; the black-block CTA against the dark ground inherits from this playbook.
  • Tight negative-tracked display type and the discipline of a confident dark canvas, loosened here by the multi-color accents.
  • Developer-first documentation aesthetic — code samples treated as first-class surface, colored syntax tokens echoed in the brand's multi-hue accents.
  • Open-source developer brand that pairs a dark canvas with a single saturated green; Vapi runs the same lime energy at a higher chroma and adds the playful set.
Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Vapi
tagline: Near-black developer canvas lit by a signature lime and a playful multi-color set — Avantt display at 80px over Season Sans body, cream text, r12 CTAs.
updated_at: 2026-05-29T21:43:56.803Z
published_at: 2026-05-29T21:43:56.803Z
author: webdesignhot
source_url: https://vapi.ai
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [ai, dev-tools]
tags: [dark, sans, developer]
preview_swatch: ['#0e0e13', '#7ccf00', '#fb2c36']
related: [elevenlabs]
description: 'Vapi is a voice-AI agent platform whose surface reads like a developer console that learned to have fun — a near-black `#0e0e13` canvas warmed by cream `#fffaea` text, with a signature electric lime `#7ccf00` as the primary brand event and a playful multi-color set (red `#fb2c36`, amber `#fdc700`, orange `#ff6900`) for energy and wayfinding. Display type is Avantt at studio scale (h1 at 80px / 600 weight) over a Season Sans body, and the CTA primitive is a crisp 12px-radius button rather than a pill. Where ElevenLabs holds to a single lime over studio-dark restraint, Vapi keeps the dark, energetic register but lets a whole confetti of saturated hues play across the canvas — the developer-voice tone stays technical, but the palette stays loud.'

# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  accent: accent
  muted: text-muted
  border: border
  ring: border-strong

colors:
  bg: '#0e0e13'                 # near-black developer canvas
  bg-soft: '#16161c'            # softest raised surface
  bg-band: '#1f1f23'            # second-level band tint
  surface: '#16161c'            # default card surface
  surface-soft: '#1f1f23'       # secondary panel tint
  surface-hover: '#28282f'      # hover / third-level surface
  text: '#fffaea'               # warm cream body on near-black
  text-strong: '#ffffff'        # crisp white for display punch
  text-muted: '#b7b3a9'         # ~70% cream — captions, meta
  text-soft: '#86847e'          # ~50% cream — tertiary
  text-faint: '#56544f'         # disabled / decorative
  brand: '#7ccf00'              # signature electric lime — primary brand event
  brand-hover: '#8ee10f'        # lifted lime on hover
  brand-active: '#6bb500'       # deepest pressed lime
  brand-soft: 'rgba(124, 207, 0, 0.16)'   # lime tint for selection / fills
  brand-faint: 'rgba(124, 207, 0, 0.08)'  # faintest lime wash
  on-brand: '#0e0e13'           # near-black sits on lime
  accent-red: '#fb2c36'         # playful red — energy / alerts-as-accent
  accent-amber: '#fdc700'       # playful amber — highlight / warning
  accent-orange: '#ff6900'      # playful orange — secondary energy
  accent: '#7ccf00'             # canonical accent = the lime
  link: '#7ccf00'               # links use brand lime on dark
  border: 'rgba(255, 255, 255, 0.08)'    # 8% white hairline
  border-soft: 'rgba(255, 255, 255, 0.04)'   # 4% white subtle divider
  border-strong: 'rgba(255, 255, 255, 0.16)' # 16% white for emphasis / focus
  cta-dark-bg: '#000000'        # pure-black "Get Started" CTA fill
  cta-dark-text: '#fafafa'      # near-white on the black CTA
  cta-light-bg: '#ffffff'       # white "Contact Sales" CTA fill
  cta-light-text: '#000000'     # black on the white CTA
  success: '#7ccf00'            # success reuses the lime
  success-bg: 'rgba(124, 207, 0, 0.16)'
  warning: '#fdc700'            # amber warning
  warning-bg: 'rgba(253, 199, 0, 0.16)'
  danger: '#fb2c36'             # red danger
  danger-bg: 'rgba(251, 44, 54, 0.16)'
  info: '#fffaea'               # info reuses cream; no info-blue
  info-bg: '#1f1f23'

typography:
  display:
    family: 'avantt, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [500, 600, 700]
  body:
    family: 'seasonSans, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [400, 500, 600]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 96, weight: 600, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 80, weight: 600, lineHeight: 1.0,  tracking: '-0.028em', family: display }
    h1:              { size: 80, weight: 600, lineHeight: 1.0,  tracking: '-0.028em', family: display }
    h2:              { size: 58, weight: 500, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h3:              { size: 40, weight: 600, lineHeight: 1.1,  tracking: '-0.015em', family: display }
    h4:              { size: 28, weight: 600, lineHeight: 1.2,  tracking: '-0.01em',  family: display }
    h5:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '-0.005em', family: display }
    h6:              { size: 16, weight: 600, lineHeight: 1.4,  tracking: '0',        family: display }
    body-lg:         { size: 18, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body:            { size: 16, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body-sm:         { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    label:           { size: 13, weight: 500, lineHeight: 1.4,  tracking: '0',        family: body }
    caption:         { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0.02em',   family: body }
    micro:           { size: 11, weight: 500, lineHeight: 1.3,  tracking: '0.04em',   family: mono }
    code-inline:     { size: 14, weight: 400, lineHeight: 1.4,  tracking: '0',        family: mono }
    code:            { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: mono }

radius:
  none: 0
  micro: 2
  sm: 4
  md: 8
  lg: 12
  xl: 16
  xxl: 24
  pill: 9999

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]

layout:
  page-width: 1280
  prose-width: 720
  header-height: 64
  hero-padding-y: 120
  section-padding-y: 96
  card-padding: 24

components:
  button-primary:
    backgroundColor: cta-dark-bg
    textColor: cta-dark-text
    radius: lg
    padding: '10px 16px'
    font: { family: body, weight: 600, size: 16 }
    hover: { backgroundColor: '#111118' }
    use: 'Black "Get Started" CTA — the primary action on the dark canvas'
  button-light:
    backgroundColor: cta-light-bg
    textColor: cta-light-text
    radius: lg
    padding: '10px 16px'
    font: { family: body, weight: 600, size: 16 }
    hover: { backgroundColor: '#f0f0f0' }
    use: 'White "Contact Sales" CTA — high-contrast secondary'
  button-brand:
    backgroundColor: brand
    textColor: on-brand
    radius: lg
    padding: '10px 16px'
    font: { family: body, weight: 600, size: 16 }
    hover: { backgroundColor: brand-hover }
    use: 'Lime accent CTA — when the brand event should carry the action'
  button-ghost:
    backgroundColor: 'rgba(255, 255, 255, 0.1)'
    textColor: text-strong
    radius: md
    padding: '10px 16px'
    font: { family: body, weight: 500, size: 16 }
    hover: { backgroundColor: 'rgba(255, 255, 255, 0.16)' }
    use: 'Translucent ghost — tertiary / chrome action'
  card:
    backgroundColor: surface
    border: border
    radius: lg
    padding: 24
    shadow: 'none'
    use: 'Default card; depth via tonal contrast and hairline'
  badge:
    backgroundColor: brand-soft
    textColor: brand
    radius: pill
    padding: '4px 12px'
    font: { family: body, weight: 500, size: 12 }
    use: '"New" / "Beta" status pill in lime'
  input:
    backgroundColor: bg
    border: border-strong
    radius: md
    padding: '8px 12px'
    font: { family: body, weight: 400, size: 16 }
    focus: { border: brand, ring: '0 0 0 3px rgba(124,207,0,0.4)' }

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  ease-decelerate: 'cubic-bezier(0, 0, 0.2, 1)'
  ease-spring: 'cubic-bezier(0.34, 1.4, 0.64, 1)'
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  hover-lift: 'translateY(-1px)'
  page-transition: 'opacity + slide 12px, 320ms emphasized'
  reduced-motion: 'respects prefers-reduced-motion: reduce — collapses transforms to opacity-only at 100ms'

breakpoints:
  mobile: 640
  tablet: 1024
  desktop: 1280
  wide: 1536

shadows:
  none: 'none'
  ambient: 'rgba(0,0,0,0.40) 0 1px 2px, rgba(0,0,0,0.30) 0 1px 4px'
  raised: 'rgba(0,0,0,0.50) 0 8px 24px, rgba(0,0,0,0.30) 0 2px 6px'
  popover: 'rgba(0,0,0,0.60) 0 16px 40px, rgba(0,0,0,0.40) 0 4px 10px'
  glow-lime: '0 0 48px rgba(124,207,0,0.25)'
  ring: '0 0 0 3px rgba(124,207,0,0.4)'

accessibility:
  contrast-text-on-bg: 18.44              # AAA — cream on near-black
  contrast-white-on-bg: 19.25             # AAA — white display on near-black
  contrast-brand-on-bg: 9.88              # AAA — lime on near-black
  contrast-on-brand-on-brand: 10.78       # AAA — near-black on lime
  contrast-muted-on-bg: 9.20              # AAA — 70% cream on near-black
  contrast-amber-on-bg: 12.23             # AAA — amber on near-black
  contrast-orange-on-bg: 6.67             # AA at body, AAA at large
  contrast-red-on-bg: 5.06                # AA at body
  focus-ring: '3px solid rgba(124,207,0,0.4) with 1px offset'
  reduced-motion-honored: true
  keyboard-trap-free: true
  min-touch-target: 44

dark-mode: native

lineage:
  summary: |
    Vapi's surface is a developer console that learned to have fun. The ground is a
    near-black `#0e0e13` — a hair warmer and bluer than pure black — and the body
    text is a warm cream `#fffaea` rather than the usual clinical white, which gives
    the dark canvas an unexpected softness that reads less like a terminal and more
    like a well-lit studio at night. The structural type is Avantt, a contemporary
    grotesk with a confident display cut, run at studio scale (h1 at 80px / 600
    weight with hard negative tracking) over a Season Sans body that keeps paragraph
    reading warm and humanist. The signature chromatic event is an electric lime
    `#7ccf00` that does the brand's primary lifting — but unlike the single-accent
    discipline of ElevenLabs or Linear, Vapi deliberately keeps a whole playful set
    in rotation: red `#fb2c36`, amber `#fdc700`, and orange `#ff6900` punctuate the
    canvas like confetti, mapping to feature categories, code-sample highlights, and
    moments of energy. The CTA primitive is a crisp 12px-radius button (not a pill),
    and the primary action is frequently a pure-black or pure-white block against the
    near-black ground — maximum contrast rather than maximum saturation. The result
    is a register that is unmistakably developer-first — technical, fast, console-like
    — while refusing the joyless monochrome that usually comes with that territory.
    Vapi watches the same single-accent, studio-dark lineage that ElevenLabs and
    Vercel established, then breaks ranks on the one rule those brands hold sacred:
    it lets the palette play.
  influences:
    - name: ElevenLabs
      role: Adjacent voice-AI brand and the closest reference — studio-dark ground with a signature lime; Vapi keeps the dark register but trades single-accent restraint for a playful multi-color set.
      url: https://elevenlabs.io
    - name: Vercel
      role: Near-black canvas as the serious-developer-tool register; the black-block CTA against the dark ground inherits from this playbook.
      url: https://vercel.com
    - name: Linear
      role: Tight negative-tracked display type and the discipline of a confident dark canvas, loosened here by the multi-color accents.
      url: https://linear.app
    - name: Stripe
      role: Developer-first documentation aesthetic — code samples treated as first-class surface, colored syntax tokens echoed in the brand's multi-hue accents.
      url: https://stripe.com
    - name: Supabase
      role: Open-source developer brand that pairs a dark canvas with a single saturated green; Vapi runs the same lime energy at a higher chroma and adds the playful set.
      url: https://supabase.com
---

## 1. Visual Theme & Atmosphere

Vapi's marketing surface is a developer console that decided to have a personality. The ground is a near-black `#0e0e13` — not the flat `#000` of a terminal but a slightly warmer, faintly blue-shifted near-black that holds a little more atmosphere. On top of it, the body text is warm cream `#fffaea` rather than clinical white, and that single decision is what gives the whole surface its character: the canvas reads less like a code editor and more like a studio lit at night. The atmosphere is dark, fast, and technical, but the cream + lime warmth keeps it from feeling cold or joyless.

The structural type is Avantt, a contemporary grotesk run at studio scale. The hero h1 lands at 80px / 600 weight with hard negative tracking, which compresses the headline into a confident broadcast register — the same trick ElevenLabs uses with InterDisplay, tuned here to Avantt's wider apertures. Beneath the display layer, Season Sans carries the body at 16–18px / 400 weight, a humanist sans that keeps paragraph reading warm and legible against the dark ground. The display/body split is deliberate: Avantt does the structural shouting, Season Sans does the quiet talking.

The chromatic signature is an electric lime `#7ccf00` — a high-chroma yellow-green that reads like a green LED on a dev board. It is the primary brand event, appearing on links, active states, syntax highlights, and the accent CTA. But Vapi makes a choice that sets it apart from the single-accent orthodoxy of the era: it keeps a whole playful set in rotation alongside the lime. Red `#fb2c36`, amber `#fdc700`, and orange `#ff6900` punctuate the canvas like confetti — mapping to feature categories, code-token colors, and moments that want energy. Where ElevenLabs treats a second saturated hue as a sin, Vapi treats the multi-color set as the point.

The CTA primitive is a crisp 12px-radius button, not a pill — a small but telling departure from the rounded-everything voice-AI house style. And the primary action is frequently a pure-black `#000` or pure-white `#fff` block sitting on the near-black ground, chasing maximum contrast rather than maximum saturation. "Get Started" is a black block; "Contact Sales" is a white block; the lime CTA appears when the brand event itself should carry the action. Depth on the canvas comes from tonal contrast (`#0e0e13` → `#16161c` → `#1f1f23`) and hairline borders rather than heavy shadows, with the occasional lime glow around a live-demo widget standing in for elevation.

Where ElevenLabs alternates studio-dark and editorial-light bands for contextual pacing, Vapi stays dark the whole way down and uses color, not surface inversion, to set the rhythm. A lime callout here, an amber code highlight there, a red status badge — the page paces itself through chromatic punctuation on a constant near-black field. The register that emerges is unmistakably developer-first: technical, fast, console-like, and energetic, but with enough warmth (cream text) and play (the multi-color set) to feel like a product made by people who enjoy building it.

**Key Characteristics**

- Near-black `#0e0e13` developer canvas — warmer and bluer than pure black, all the way down
- Warm cream `#fffaea` body text instead of clinical white — the signature softness move
- Avantt display at studio scale (h1 80px / 600) over a humanist Season Sans body
- Signature electric lime `#7ccf00` as the primary brand event — links, active states, accent CTA
- Playful multi-color set — red `#fb2c36`, amber `#fdc700`, orange `#ff6900` — used as confetti / wayfinding
- 12px-radius CTA button (not a pill) — a deliberate departure from voice-AI's rounded house style
- Max-contrast primary CTAs: pure-black and pure-white blocks on the near-black ground
- Tonal-contrast depth + hairline borders; the rare lime glow stands in for heavy shadow
- Dark-only system paced by color, not by surface inversion
- Developer-voice register: technical and fast, but warm and playful rather than joyless

## 2. Color Palette & Roles

### Canvas

- **bg** (`#0e0e13`): the near-black developer canvas; the constant ground on every page and band.
- **bg-soft** (`#16161c`): softest raised surface, one tonal step up for nested panels.
- **bg-band** (`#1f1f23`): second-level band tint for emphasis blocks and code surrounds.
- **surface** (`#16161c`): default card surface, one step lighter than the ground.
- **surface-soft** (`#1f1f23`): secondary panel tint for nested or emphasized cards.
- **surface-hover** (`#28282f`): hover / third-level surface; the lift on interactive cards.

### Text

- **text** (`#fffaea`): warm cream body — the signature softness against the near-black ground.
- **text-strong** (`#ffffff`): crisp white for display headlines that want extra punch.
- **text-muted** (`#b7b3a9`): ~70% cream for captions, meta, and secondary copy.
- **text-soft** (`#86847e`): ~50% cream for tertiary text — timestamps, micro-labels.
- **text-faint** (`#56544f`): disabled labels and decorative text.

### Brand

- **brand** (`#7ccf00`): the signature electric lime — links, active states, accent CTA, brand identity.
- **brand-hover** (`#8ee10f`): a lifted lime for hover on the dark ground.
- **brand-active** (`#6bb500`): the deepest pressed lime.
- **brand-soft** (`rgba(124,207,0,0.16)`): lime tint for selection backgrounds and badge fills.
- **brand-faint** (`rgba(124,207,0,0.08)`): the faintest lime wash for hover surfaces.
- **on-brand** (`#0e0e13`): near-black sits on the lime; the lime is too bright for white text.

### Playful Accents

- **accent-red** (`#fb2c36`): playful red for energy, category mapping, and alerts-as-accent.
- **accent-amber** (`#fdc700`): playful amber for highlights, code tokens, and warnings.
- **accent-orange** (`#ff6900`): playful orange for secondary energy and category mapping.
- **accent** (`#7ccf00`): the canonical accent role resolves to the lime.

### CTA Fills

- **cta-dark-bg** (`#000000`) / **cta-dark-text** (`#fafafa`): the black "Get Started" block — primary action, max contrast.
- **cta-light-bg** (`#ffffff`) / **cta-light-text** (`#000000`): the white "Contact Sales" block — high-contrast secondary.

### Borders

- **border** (`rgba(255,255,255,0.08)`): 8% white hairline — the default card / divider edge.
- **border-soft** (`rgba(255,255,255,0.04)`): 4% white for the subtlest dividers.
- **border-strong** (`rgba(255,255,255,0.16)`): 16% white for emphasis edges and input borders.

### Interactive

- **link** (`#7ccf00`): links use the brand lime on the dark ground; no underline by default.
- **selected**: `brand-soft` (`rgba(124,207,0,0.16)`) fill behind selected rows / chips.
- **disabled**: `text-faint` (`#56544f`) on `surface-soft`.

### Semantic

- **success** (`#7ccf00`) on **success-bg** (`rgba(124,207,0,0.16)`): success reuses the brand lime.
- **warning** (`#fdc700`) on **warning-bg** (`rgba(253,199,0,0.16)`): amber from the playful set.
- **danger** (`#fb2c36`) on **danger-bg** (`rgba(251,44,54,0.16)`): red from the playful set.
- **info** (`#fffaea`) on **info-bg** (`#1f1f23`): info reuses cream; there is no info-blue in the system.

## 3. Typography Rules

### Font Family

- **Display**: avantt → system-ui → -apple-system → Segoe UI → Helvetica → Arial → sans-serif.
- **Body**: seasonSans → system-ui → -apple-system → Segoe UI → Helvetica → Arial → sans-serif.
- **Mono companion**: ui-monospace → SFMono-Regular → SF Mono → Menlo → Consolas → monospace.
- Avantt is a contemporary grotesk with a confident display cut; Season Sans is a warm humanist sans for paragraph reading. The split is structural display vs. comfortable body.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | Avantt | 96 | 600 | 1.0 | -0.03em | reserved for the boldest marketing moment |
| display-lg | Avantt | 80 | 600 | 1.0 | -0.028em | secondary hero scale |
| h1 | Avantt | 80 | 600 | 1.0 | -0.028em | the canonical hero — probed at 80px / 600 |
| h2 | Avantt | 58 | 500 | 1.05 | -0.02em | feature-band heads — probed at 58px / 500 |
| h3 | Avantt | 40 | 600 | 1.1 | -0.015em | sub-feature heads |
| h4 | Avantt | 28 | 600 | 1.2 | -0.01em | card heads |
| h5 | Avantt | 20 | 600 | 1.3 | -0.005em | inline emphasis heads |
| h6 | Avantt | 16 | 600 | 1.4 | 0 | label-grade heads |
| body-lg | Season Sans | 18 | 400 | 1.55 | 0 | hero subheads |
| body | Season Sans | 16 | 400 | 1.55 | 0 | default reading — probed at 16px / 400 |
| body-sm | Season Sans | 14 | 400 | 1.5 | 0 | secondary copy |
| label | Season Sans | 13 | 500 | 1.4 | 0 | category cues, form labels |
| caption | Season Sans | 12 | 500 | 1.4 | 0.02em | image / chart caption |
| micro | mono | 11 | 500 | 1.3 | 0.04em | smallest type, technical metadata |
| code-inline | mono | 14 | 400 | 1.4 | 0 | inline code references |
| code | mono | 14 | 400 | 1.5 | 0 | code block |

### Principles

- **Negative tracking is the broadcast voice**: at hero scale the track tightens to `-0.028em`/`-0.03em`. That compression turns Avantt at 80px from competent SaaS into studio-grade display. Loosen the track and the headline loses its confidence.
- **Display vs. body is a hard split**: Avantt handles everything h6 and above; Season Sans handles everything body-class and below. Never run paragraph copy in Avantt or a headline in Season Sans — the two faces have distinct jobs.
- **Cream, not white, for reading**: body copy is `#fffaea`, not `#ffffff`. The warm cast is what keeps the dark canvas from feeling like a terminal. White (`#ffffff`) is reserved for display headlines that want extra punch.
- **Weight discipline**: display tops out at 600 (the probed hero weight); body stays at 400 with 500 for labels. Vapi resists bolding the body — 600 is a display affordance, not a body one.
- **Mono is for metadata, not body**: the monospace family appears only in code samples, inline API references, and 11px micro-labels with positive tracking — a typographic cue that says "this is technical, not prose".
- **h2 drops to 500**: the live probe shows h2 at 58px / 500, a half-step lighter than the 600 hero — a deliberate de-escalation so section heads read as quieter than the hero.

## 4. Component Stylings

### Buttons

**Primary — black block ("Get Started")**
- Background: `#000000`. Text: `#fafafa` at Season Sans 600 / 16px. Padding: `10px 16px`. Radius: 12px. Border: none.
- Hover: background lifts to `#111118`. Active: subtle `translateY(1px)`.
- Use: the primary CTA on the near-black canvas — max contrast, not max saturation.

**Secondary — white block ("Contact Sales")**
- Background: `#ffffff`. Text: `#000000` at Season Sans 600 / 16px. Padding: `10px 16px`. Radius: 12px.
- Hover: background → `#f0f0f0`. Use: high-contrast secondary paired with the black primary.

**Brand — lime accent**
- Background: `#7ccf00`. Text: `#0e0e13` at Season Sans 600 / 16px. Padding: `10px 16px`. Radius: 12px.
- Hover: background → `#8ee10f`. Active: → `#6bb500`. Use: when the brand event itself should carry the action — newsletter, "Start building", demo triggers.

**Ghost — translucent**
- Background: `rgba(255,255,255,0.1)`. Text: `#ffffff` at Season Sans 500 / 16px. Padding: `10px 16px`. Radius: 8px.
- Hover: background → `rgba(255,255,255,0.16)`. Use: tertiary / chrome actions like "Manage Preferences", nav-adjacent buttons.

### Cards

**Default card**
- Background: `#16161c`. Border: `1px solid rgba(255,255,255,0.08)`. Radius: 12px. Padding: 24px. Shadow: none.
- Hover: surface lifts to `#28282f`; border brightens to `rgba(255,255,255,0.16)`; optional `translateY(-1px)`.
- Use: feature cards, doc cards, pricing cards — depth comes from tonal contrast and the hairline, not from drop shadow.

**Live-demo card**
- Background: `#16161c`. Border: `1px solid rgba(255,255,255,0.08)`. Radius: 12px. Padding: 24px.
- Shadow: `glow-lime` (`0 0 48px rgba(124,207,0,0.25)`) when a voice agent is live.
- Use: the call / agent demo widget — the lime glow reads as the agent literally going live.

### Badges, Tags, Pills

**Status badge (lime)**
- Background: `rgba(124,207,0,0.16)`. Text: `#7ccf00` at Season Sans 500 / 12px. Padding: `4px 12px`. Radius: 9999px.
- Use: "New", "Beta", "Live" — the default status pill.

**Category chip (multi-color)**
- Background: `rgba(255,255,255,0.08)`. Text: cream `#fffaea`, with a leading dot in the category's accent (red / amber / orange). Padding: `4px 12px`. Radius: 9999px.
- Use: feature-category tags; the colored dot is where the playful set does wayfinding.

**Mono micro tag**
- Background: `rgba(255,255,255,0.08)`. Text: `#b7b3a9` at mono 500 / 11px tracked `+0.04em`, uppercase. Padding: `2px 8px`. Radius: 4px.
- Use: API version tags, model identifiers, SDK names.

### Inputs / Forms

**Text input**
- Background: `#0e0e13`. Border: `1px solid rgba(255,255,255,0.16)`. Radius: 8px. Padding: `8px 12px`. Font: Season Sans 400 / 16px in cream `#fffaea`.
- Placeholder: `#86847e`. Focus: border → `#7ccf00`, ring `0 0 0 3px rgba(124,207,0,0.4)`.

**Code / API-key input**
- Background: `#16161c`. Border: `1px solid rgba(255,255,255,0.08)`. Radius: 8px. Padding: `8px 12px`. Font: mono 400 / 14px in cream.
- Use: API-key fields, snippet inputs; the mono face signals "this is a technical value".

### Navigation

**Top bar**
- Background: `#0e0e13` (transparent on hero, solidifies to `rgba(14,14,19,0.85)` with backdrop-blur on scroll). Height: 64px. Bottom edge: `1px solid rgba(255,255,255,0.08)` once scrolled.
- Logo: Vapi wordmark in cream `#fffaea` / Avantt 600.
- Nav items: Season Sans 500 / 14px in `#b7b3a9`, hover → `#fffaea`. Active item carries a lime underline.
- Right side: a ghost "Sign in" + the black "Get Started" CTA, always visible.

### Tooltips, Toasts, Modals

- **Tooltip**: background `#1f1f23`, text `#fffaea` at Season Sans 500 / 12px, radius 8px, padding `6px 12px`, shadow `popover`.
- **Toast**: background `#16161c`, border `1px solid rgba(255,255,255,0.08)`, radius 12px, shadow `popover`; a leading accent bar in lime / amber / red maps to success / warning / danger.
- **Modal**: background `#16161c`, radius 16px, shadow `popover`, backdrop `rgba(0,0,0,0.6)`, padding 32px.

## 5. Layout Principles

### Spacing System

Base unit: 4px. Scale: `[0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]`. The system uses tight-to-generous intervals — 12–16px inside components, 24px card padding and gutters, 48–64px between feature blocks, 96–128px between major bands. The breath is developer-tool efficient: airy enough to read, dense enough to feel like a product with a lot to show.

### Grid & Container

- **Page width**: 1280px max, centered.
- **Prose width**: 720px for documentation and editorial reading.
- **Header height**: 64px.
- **Hero treatment**: hero copy claims roughly 800–900px of horizontal real estate, with a live call/agent demo widget frequently anchored to the side or below the headline.
- **Feature grid**: 3-column at 1280px+, 2-column at 1024–1280px, 1-column below 1024px. Card gap: 24px.

### Whitespace Philosophy

The grid is centered and the negative space is purposeful. Because the canvas is a constant near-black, whitespace reads as deep space rather than as empty paper, which lets sections feel roomy without large gaps. The lime and the playful accents are the punctuation in that space — a single saturated element per region against a quiet dark field reads louder than it would on white.

### Section Cadence

Vapi stays dark the whole way down and paces with color rather than surface inversion. A typical cadence: `hero (lime accent CTA + live demo) → feature grid (multi-color category chips) → code-sample band (amber/lime syntax highlights) → integrations → pricing → CTA band → footer`. Bands are separated by `bg-band` tonal shifts and hairline rules rather than hard light/dark flips. Each colored moment is rationed so the energy stays legible.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|---|---|---|
| none | 0px | full-bleed images, code blocks flush to band edges |
| micro | 2px | inline indicators, tiny markers |
| sm | 4px | mono micro tags, tight UI primitives |
| md | 8px | inputs, tooltips, ghost buttons |
| lg | 12px | the canonical CTA radius and default card radius |
| xl | 16px | modals, larger feature shells |
| xxl | 24px | hero shells, oversized panels |
| pill | 9999px | status badges and category chips only |

The defining radius is **lg (12px)** — the probed CTA radius. CTAs and cards share the 12px corner, inputs and ghost buttons step down to 8px, and the full pill is reserved for badges and chips rather than buttons. That 12-CTA / 8-input / pill-badge ladder is the brand's signature ratio, and the choice of a 12px button corner over a full pill is a deliberate developer-tool tell — crisp rather than soft.

## 7. Depth & Elevation

| Level | Treatment | Use |
|---|---|---|
| 0 | flat, on `#0e0e13` | body content, default surfaces |
| 1 | `1px hairline rgba(255,255,255,0.08)`, no shadow | default card; tonal contrast carries depth |
| 2 | lift to `#1f1f23` + brighter hairline | hovered / floating card |
| 3 | `glow-lime` (`0 0 48px rgba(124,207,0,0.25)`) | live-demo / agent widget |
| 4 | `popover` shadow on `#1f1f23` | tooltip, dropdown, menu |
| 5 | `popover` + backdrop, 16px radius | modal, lightbox |

**Shadow Philosophy**: On a near-black canvas, neutral-grey ambient shadows mostly disappear, so Vapi leans on tonal contrast (`#0e0e13` → `#16161c` → `#1f1f23` → `#28282f`) and hairline borders to express depth. Drop shadows exist for true overlays (tooltips, menus, modals) where the element floats above content, and they run dark-and-deep (`rgba(0,0,0,0.4–0.6)`) to register against the dark ground. The one chromatic elevation is the lime glow around the live-demo widget — the accent literally lighting up when a voice agent goes live. Shadows are never the primary depth strategy on the page body; tonal contrast is.

## 8. Interaction & Motion

### Easing

- **standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — the workhorse ease for hovers and color shifts.
- **emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — slower in, faster out; hero entrance, modal open, band transitions.
- **decelerate**: `cubic-bezier(0, 0, 0.2, 1)` — elements entering from off-canvas.
- **spring**: `cubic-bezier(0.34, 1.4, 0.64, 1)` — slight overshoot, used sparingly on the live-agent / waveform pulse.

### Durations

- **fast** (150ms): button hover, link color, ghost-button background shift.
- **standard** (240ms): primary CTA press, dropdown open, card hover lift.
- **slow** (320ms): modal open, band transition, hero entrance choreography.

### Per-component micro-states

- **Black/white CTA hover**: background shifts one tonal step over 150ms `standard`; press adds `translateY(1px)`.
- **Lime CTA hover**: background → `#8ee10f` over 150ms; no transform.
- **Card hover**: surface lifts `#16161c` → `#28282f` and hairline brightens over 240ms; optional `translateY(-1px)`.
- **Live-demo widget**: lime glow fades in over 320ms when an agent connects; waveform pulses on a `spring` cycle.
- **Input focus**: lime ring fades in over 150ms as the border shifts to `#7ccf00` simultaneously.
- **Link hover**: cream → lime color shift over 150ms, with a lime underline growing in from the left.

### Page transitions

Route transitions use opacity + a 12px vertical slide at 320ms with `emphasized` ease — slightly more deliberate than a plain fade, signaling a crafted product rather than a generic template.

### Reduced-motion strategy

`prefers-reduced-motion: reduce` is fully respected: all transform-based animations collapse to opacity-only at 100ms. Hover lifts disappear, the waveform pulse becomes static at its connected state, and page slides become opacity-only fades. The lime glow persists (it is not motion).

## 9. Accessibility & A11y

### Contrast pairs (computed)

- **text on bg**: `#fffaea` on `#0e0e13` → 18.44:1 (AAA at all sizes).
- **text-strong on bg**: `#ffffff` on `#0e0e13` → 19.25:1 (AAA at all sizes).
- **brand on bg**: `#7ccf00` on `#0e0e13` → 9.88:1 (AAA at all sizes).
- **on-brand on brand**: `#0e0e13` on `#7ccf00` → 10.78:1 (AAA at all sizes).
- **text-muted on bg**: `#b7b3a9` on `#0e0e13` → 9.20:1 (AAA at body sizes).
- **amber on bg**: `#fdc700` on `#0e0e13` → 12.23:1 (AAA at all sizes).
- **orange on bg**: `#ff6900` on `#0e0e13` → 6.67:1 (AA at body, AAA at large).
- **red on bg**: `#fb2c36` on `#0e0e13` → 5.06:1 (AA at body; prefer large or pair with a glyph for danger states).

### Focus indicators

- **Default focus ring**: `3px solid rgba(124,207,0,0.4)` with 1px offset; the lime ring is visible on every dark surface.
- **On the lime CTA**: ring shifts to `3px solid rgba(14,14,19,0.5)` (near-black ring on lime) for contrast.
- **On light CTAs** (white block): ring uses `3px solid rgba(124,207,0,0.6)` for sufficient visibility against white.

Focus rings are never removed.

### ARIA patterns

- The live-agent / call widget uses `role="region"` with `aria-label="Voice agent demo"` and standard audio-element semantics.
- Modals use `role="dialog"`, `aria-modal="true"`, a focus trap, and `Esc` to close.
- Category chip groups use `role="group"`; selectable chips use `role="checkbox"`/`aria-pressed`.
- The docs combobox uses `role="combobox"` with `aria-expanded`, `aria-controls`, `aria-activedescendant`.

### Keyboard nav order

Top bar → hero CTA pair → live-demo widget (full keyboard semantics) → feature grid → code-sample band → pricing → footer. `Tab` order matches visual order; a skip-to-content link is visible on focus.

### Screen reader hints

- Decorative waveform / confetti glyphs carry `aria-hidden="true"`.
- Icon-only buttons carry an `aria-label`.
- The live-agent widget carries `aria-live="polite"` for connection-state updates.
- Color-coded category dots are paired with a text label so color is never the only signal.

### Reduced motion

Honored throughout — see §8. Critically, danger (`#fb2c36`) at 5.06:1 sits below AAA at body size, so danger states pair the red with an icon and text rather than relying on color alone.

## 10. Responsive Behavior

### Breakpoints

| Tier | Width | Behavior |
|---|---|---|
| mobile | < 640px | single column, 16px gutter, 64px section padding, hero at 40–48px |
| tablet | 640–1024px | single column, 24px gutter, 80px section padding, hero at 56–64px |
| desktop | 1024–1280px | 2-column feature grids, 24px gutter, 96px section padding, hero at 72px |
| wide | 1280–1536px | 3-column feature grids, 24px gutter, 120px section padding, hero at full 80px |
| ultra | 1536px+ | container caps at 1280px; extra space goes to gutters |

### Touch Targets

Minimum 44×44px on touch devices. The `10px 16px` button padding is bumped to `12px 20px` on touch to clear the threshold comfortably. Category chips expand to `8px 16px` on mobile for thumb-friendly tap area.

### Collapsing strategy

- **Top nav**: hamburger menu < 1024px; the black "Get Started" CTA stays visible at top right.
- **Hero**: the live-demo widget moves below the copy < 1024px; copy claims full width.
- **Feature grid**: 3 → 2 → 1 columns at 1280 / 1024 / 640.
- **Code-sample band**: blocks scroll horizontally rather than wrapping, preserving line integrity.
- **Pricing**: tiers stack vertically < 1024px with the recommended tier highlighted via order shift.
- **Footer**: 4-column → 2-column → 1-column at 1280 / 1024 / 640.

### Image behavior

Live-demo waveform displays use an `aspect-ratio` lock with full responsive width. Hero illustrations and integration logos preserve their original aspect ratio.

### Container queries

Used inside the live-agent widget — the player switches between expanded (waveform + transcript + controls) and condensed (controls + status only) modes based on its container width rather than the viewport.

## 11. Content & Voice

### Tone

Vapi's voice is **developer-first and energetic**: technical, fast, and confident, but warm rather than dry. It writes like an engineer who is genuinely excited about what you can build — present-tense, imperative, code-forward, with the occasional playful flourish that matches the multi-color palette. Headlines are direct and capability-led ("Build advanced voice AI agents", "Ship in minutes, not months"); secondary copy explains the mechanism plainly and gets to a code sample fast. The register positions Vapi as infrastructure for builders, not a no-code toy.

### Microcopy patterns

- **Button verbs**: "Get Started", "Start building", "Contact Sales", "Read the docs", "View on GitHub". Action-forward, with the noun named.
- **Error messages**: pattern is "Couldn't [action] — [reason]. [recovery]." e.g. "Couldn't connect the agent — your API key is missing. Add a key in Settings to continue."
- **Success confirmations**: short and product-forward. "Agent live." rather than "Your agent has been deployed successfully!"

### Empty states

Empty states are direct and builder-oriented. "No agents yet — create your first in under a minute" with a lime "Start building" CTA. The copy never reaches for "Oops!" or cheerful mascots — the developer register stays even when the canvas is empty.

### CTA verb conventions

- **Primary marketing CTA**: "Get Started" — the canonical black-block phrase across the site.
- **Brand CTA**: "Start building" — the lime accent action.
- **Developer CTA**: "Read the docs", "View on GitHub", "Get your API key".
- **Sales**: "Contact Sales" or "Talk to us".

## 12. Dark Mode & Theming

Vapi is **dark-native** — the near-black `#0e0e13` canvas is the only mode the marketing surface ships, and there is no light variant. The entire system is engineered for the dark ground:

- **bg**: `#0e0e13` is the constant canvas; surfaces step up tonally (`#16161c` → `#1f1f23` → `#28282f`).
- **text**: warm cream `#fffaea` (not white) is the deliberate softness move; `#ffffff` is reserved for display punch.
- **brand**: lime `#7ccf00` holds at full chroma — contrast against `#0e0e13` is 9.88:1 (AAA), so it never needs to shift for legibility.
- **borders**: white-at-low-opacity hairlines (8% / 4% / 16%) rather than solid grey, so edges sit naturally on the dark field.
- **playful accents**: red / amber / orange are all tuned to be legible on the dark ground (amber and orange clear AA/AAA at large; red is reserved for large or icon-paired states).

When implementing:
- Depth is tonal contrast + hairlines, not drop shadows on the page body. Reserve real shadows for floating overlays.
- The lime glow persists at the same intensity as the canvas's single chromatic elevation.
- Do not introduce a light theme — the brand identity is the dark canvas, and the cream-on-near-black contrast is the signature. A naive light inversion would lose the lime's read and the cream's warmth.
- If a light surface is unavoidable (e.g. an embedded white-block CTA), keep it as a contained block on the dark ground rather than flipping the whole band.

## 13. Lineage & Influences

Vapi sits in the studio-dark, developer-tool lineage that Vercel, Linear, and ElevenLabs established — a near-black canvas, tight negative-tracked display type, and a single saturated accent that reads as both brand and wayfinding. Vapi adopts all of that scaffolding: the `#0e0e13` ground reads like Vercel's serious-tool register, the Avantt headline at 80px / 600 with hard negative tracking echoes Linear's broadcast-display discipline, and the electric lime `#7ccf00` plays the exact role ElevenLabs' lime plays — the LED-green chromatic event on a dark deck. The closest adjacent reference is ElevenLabs: both are voice-AI brands on studio-dark grounds with a signature lime, which makes the comparison almost a controlled experiment.

Where Vapi breaks ranks is the one rule that lineage holds sacred: chromatic restraint. ElevenLabs treats a second saturated accent as a sin; Vapi treats the playful multi-color set — red, amber, orange alongside the lime — as the point. The result is a developer brand that keeps the dark, fast, technical register but refuses the joyless monochrome that usually comes with it. The cream text instead of white, and the 12px-radius button instead of a pill, are the other two small rebellions — warmth where the genre expects clinical, crispness where the genre expects soft. What Vapi rejects is the light-mode editorial band (it stays dark all the way down), the single-accent orthodoxy (it keeps a set), and the pill CTA (it keeps the crisp corner). The discipline is the dark canvas and the cream warmth; the play is the multi-color set.

**Named influences**

- **ElevenLabs** ([elevenlabs.io](https://elevenlabs.io)) — the closest adjacent voice-AI reference; studio-dark ground with a signature lime, which Vapi keeps while trading single-accent restraint for a playful set.
- **Vercel** ([vercel.com](https://vercel.com)) — near-black canvas as the serious-developer-tool register; the black-block CTA inherits from this playbook.
- **Linear** ([linear.app](https://linear.app)) — tight negative-tracked display type and the discipline of a confident dark canvas.
- **Stripe** ([stripe.com](https://stripe.com)) — developer-first docs aesthetic; code as first-class surface, colored syntax tokens echoed in the multi-hue accents.
- **Supabase** ([supabase.com](https://supabase.com)) — open-source developer brand pairing a dark canvas with a single saturated green; Vapi runs the lime hotter and adds the playful set.

## 14. Do's and Don'ts

**Do**

- Keep the canvas a constant near-black `#0e0e13` — warmer and bluer than pure black — all the way down the page.
- Use warm cream `#fffaea` for body text, not white; the warmth is the signature and what keeps the surface from reading as a terminal.
- Run hero headlines in Avantt at 80px / 600 with `-0.028em` to `-0.03em` tracking; the compression is the broadcast voice.
- Make the lime `#7ccf00` the primary brand event — links, active states, the accent CTA, syntax highlights.
- Use the playful set (red / amber / orange) for category mapping, code-token color, and energy — rationed, one saturated moment per region.
- Use a 12px-radius button for CTAs; pure-black and pure-white blocks are the high-contrast primary/secondary pair.
- Express depth with tonal contrast (`#0e0e13` → `#16161c` → `#1f1f23`) and hairline borders, not heavy shadows on the page body.
- Reserve the lime glow for the live-agent / demo widget — the accent lighting up when an agent connects.
- Pair red danger states with an icon and text label, since `#fb2c36` clears AA but not AAA at body size.
- Keep mono type for code, API references, and 11px metadata only; let Season Sans carry all prose.

**Don't**

- Don't ship a light theme — the brand identity is the dark canvas, and a naive inversion loses the lime's read and the cream's warmth.
- Don't use white `#ffffff` for body copy — reserve it for display punch; cream is the reading color.
- Don't collapse to single-accent discipline — the playful multi-color set is the deliberate point of difference from ElevenLabs.
- Don't let more than one or two saturated moments fire in a single region; the energy stays legible only when rationed.
- Don't swap the 12px-radius CTA for a full pill — the crisp corner is the developer-tool tell.
- Don't run paragraph copy in Avantt or a headline in Season Sans; the display/body split is a hard rule.
- Don't loosen the hero negative tracking below `-0.02em`; the headline loses its confidence.
- Don't lean on neutral drop shadows for page-body depth — they vanish on near-black; use tonal contrast and hairlines.
- Don't put white text on the lime; the lime is bright, so near-black `#0e0e13` is the on-brand color.
- Don't use the playful accents as body-text colors — they are for accents, wayfinding, and energy, never reading.

## 15. Agent Prompt Guide

### Quick Color Reference

```
bg: #0e0e13
surface: #16161c
surface-soft: #1f1f23
text: #fffaea
text-strong: #ffffff
text-muted: #b7b3a9
brand (lime): #7ccf00
accent-red: #fb2c36
accent-amber: #fdc700
accent-orange: #ff6900
border: rgba(255,255,255,0.08)
cta-dark: #000000 / #fafafa
cta-light: #ffffff / #000000
```

### Example Component Prompts

1. "Create a marketing hero in the Vapi style: near-black `#0e0e13` canvas, Avantt 600 / 80px headline in cream `#fffaea` with `-0.028em` tracking, 18px subhead in Season Sans 400 in `#b7b3a9`, a primary black-block CTA (`#000000` bg, `#fafafa` text, `10px 16px` padding, 12px radius) labeled 'Get Started', and a white-block secondary CTA (`#ffffff` bg, `#000000` text) labeled 'Contact Sales'."

2. "Design a live-agent demo card in the Vapi style: `#16161c` background, `1px solid rgba(255,255,255,0.08)` hairline, 12px radius, 24px padding, a waveform visualization in lime `#7ccf00`, and a lime glow shadow (`0 0 48px rgba(124,207,0,0.25)`) when the agent is connected. Status pill in lime-tint (`rgba(124,207,0,0.16)` bg, `#7ccf00` text)."

3. "Render a feature card grid in the Vapi style: 3 columns on `#0e0e13`, each card `#16161c` with a `1px solid rgba(255,255,255,0.08)` hairline, 12px radius, 24px padding, Avantt 600 / 28px title in cream, Season Sans 400 / 16px body in `#b7b3a9`, and a leading category dot in one of the playful accents (red `#fb2c36` / amber `#fdc700` / orange `#ff6900`). Hover: surface lifts to `#28282f`, `translateY(-1px)`."

4. "Create a code-sample band in the Vapi style: `#1f1f23` band on the `#0e0e13` page, monospace code at 14px in cream with syntax tokens colored from the playful set (keywords lime `#7ccf00`, strings amber `#fdc700`, numbers orange `#ff6900`), an Avantt 600 / 40px section head above, and a 'Read the docs' lime CTA below."

5. "Design a pricing tier card in the Vapi style: `#16161c` background, `1px solid rgba(255,255,255,0.08)` hairline, 12px radius, 24px padding, tier name in Avantt 600 / 20px cream, price in Avantt 600 / 56px cream, feature list in Season Sans 400 / 16px with lime `#7ccf00` checkmarks, and a black-block 'Get Started' CTA at the bottom. The recommended tier gets a lime hairline (`#7ccf00`) instead of white."

6. "Render a top navigation bar in the Vapi style: transparent over a `#0e0e13` hero, solidifying to `rgba(14,14,19,0.85)` with backdrop-blur and a `1px solid rgba(255,255,255,0.08)` bottom edge on scroll, 64px height, cream Avantt 600 wordmark, Season Sans 500 / 14px nav links in `#b7b3a9` (hover → cream, active → lime underline), a ghost 'Sign in', and the black 'Get Started' CTA at top right."

### Iteration Guide

1. **Lock the canvas first**: the ground is always near-black `#0e0e13` and the body text is always cream `#fffaea`. If you see white body text or a light band, you've drifted out of the brand.
2. **Verify the type voice**: hero headlines should hit 80px in Avantt at 600 weight with `-0.028em` to `-0.03em` tracking. If the headline reads competent rather than broadcast-grade, tighten the track and scale up; if prose is in Avantt, move it to Season Sans.
3. **Audit the lime**: there should be exactly one lime `#7ccf00` brand event per region — usually a link, an active state, or the accent CTA. Lime is action and brand, never body text.
4. **Ration the playful set**: red / amber / orange are confetti, not wallpaper. One or two saturated accents per region keep the energy legible; more turns it into noise.
5. **Check the CTA corner**: primary CTAs are 12px-radius blocks (black or white), not pills. If you've drawn a pill button, you've borrowed the wrong house style — pills are for badges and chips only.
6. **Confirm the depth strategy**: page-body cards use tonal contrast (`#16161c` on `#0e0e13`) and hairlines, no drop shadow. If a body card has a grey drop shadow, it'll vanish on the dark ground — switch to tonal + hairline.
7. **Place the glow correctly**: the lime glow belongs only on the live-agent / demo widget when an agent connects. If you see it elsewhere, remove it.
8. **Check the reduced-motion path**: hover lifts, waveform pulses, and page slides should all collapse to opacity-only at 100ms when `prefers-reduced-motion: reduce` is set; the lime glow persists since it is not motion.
Prose

1. Visual Theme & Atmosphere

Vapi’s marketing surface is a developer console that decided to have a personality. The ground is a near-black #0e0e13 — not the flat #000 of a terminal but a slightly warmer, faintly blue-shifted near-black that holds a little more atmosphere. On top of it, the body text is warm cream #fffaea rather than clinical white, and that single decision is what gives the whole surface its character: the canvas reads less like a code editor and more like a studio lit at night. The atmosphere is dark, fast, and technical, but the cream + lime warmth keeps it from feeling cold or joyless.

The structural type is Avantt, a contemporary grotesk run at studio scale. The hero h1 lands at 80px / 600 weight with hard negative tracking, which compresses the headline into a confident broadcast register — the same trick ElevenLabs uses with InterDisplay, tuned here to Avantt’s wider apertures. Beneath the display layer, Season Sans carries the body at 16–18px / 400 weight, a humanist sans that keeps paragraph reading warm and legible against the dark ground. The display/body split is deliberate: Avantt does the structural shouting, Season Sans does the quiet talking.

The chromatic signature is an electric lime #7ccf00 — a high-chroma yellow-green that reads like a green LED on a dev board. It is the primary brand event, appearing on links, active states, syntax highlights, and the accent CTA. But Vapi makes a choice that sets it apart from the single-accent orthodoxy of the era: it keeps a whole playful set in rotation alongside the lime. Red #fb2c36, amber #fdc700, and orange #ff6900 punctuate the canvas like confetti — mapping to feature categories, code-token colors, and moments that want energy. Where ElevenLabs treats a second saturated hue as a sin, Vapi treats the multi-color set as the point.

The CTA primitive is a crisp 12px-radius button, not a pill — a small but telling departure from the rounded-everything voice-AI house style. And the primary action is frequently a pure-black #000 or pure-white #fff block sitting on the near-black ground, chasing maximum contrast rather than maximum saturation. “Get Started” is a black block; “Contact Sales” is a white block; the lime CTA appears when the brand event itself should carry the action. Depth on the canvas comes from tonal contrast (#0e0e13#16161c#1f1f23) and hairline borders rather than heavy shadows, with the occasional lime glow around a live-demo widget standing in for elevation.

Where ElevenLabs alternates studio-dark and editorial-light bands for contextual pacing, Vapi stays dark the whole way down and uses color, not surface inversion, to set the rhythm. A lime callout here, an amber code highlight there, a red status badge — the page paces itself through chromatic punctuation on a constant near-black field. The register that emerges is unmistakably developer-first: technical, fast, console-like, and energetic, but with enough warmth (cream text) and play (the multi-color set) to feel like a product made by people who enjoy building it.

Key Characteristics

  • Near-black #0e0e13 developer canvas — warmer and bluer than pure black, all the way down
  • Warm cream #fffaea body text instead of clinical white — the signature softness move
  • Avantt display at studio scale (h1 80px / 600) over a humanist Season Sans body
  • Signature electric lime #7ccf00 as the primary brand event — links, active states, accent CTA
  • Playful multi-color set — red #fb2c36, amber #fdc700, orange #ff6900 — used as confetti / wayfinding
  • 12px-radius CTA button (not a pill) — a deliberate departure from voice-AI’s rounded house style
  • Max-contrast primary CTAs: pure-black and pure-white blocks on the near-black ground
  • Tonal-contrast depth + hairline borders; the rare lime glow stands in for heavy shadow
  • Dark-only system paced by color, not by surface inversion
  • Developer-voice register: technical and fast, but warm and playful rather than joyless

2. Color Palette & Roles

Canvas

  • bg (#0e0e13): the near-black developer canvas; the constant ground on every page and band.
  • bg-soft (#16161c): softest raised surface, one tonal step up for nested panels.
  • bg-band (#1f1f23): second-level band tint for emphasis blocks and code surrounds.
  • surface (#16161c): default card surface, one step lighter than the ground.
  • surface-soft (#1f1f23): secondary panel tint for nested or emphasized cards.
  • surface-hover (#28282f): hover / third-level surface; the lift on interactive cards.

Text

  • text (#fffaea): warm cream body — the signature softness against the near-black ground.
  • text-strong (#ffffff): crisp white for display headlines that want extra punch.
  • text-muted (#b7b3a9): ~70% cream for captions, meta, and secondary copy.
  • text-soft (#86847e): ~50% cream for tertiary text — timestamps, micro-labels.
  • text-faint (#56544f): disabled labels and decorative text.

Brand

  • brand (#7ccf00): the signature electric lime — links, active states, accent CTA, brand identity.
  • brand-hover (#8ee10f): a lifted lime for hover on the dark ground.
  • brand-active (#6bb500): the deepest pressed lime.
  • brand-soft (rgba(124,207,0,0.16)): lime tint for selection backgrounds and badge fills.
  • brand-faint (rgba(124,207,0,0.08)): the faintest lime wash for hover surfaces.
  • on-brand (#0e0e13): near-black sits on the lime; the lime is too bright for white text.

Playful Accents

  • accent-red (#fb2c36): playful red for energy, category mapping, and alerts-as-accent.
  • accent-amber (#fdc700): playful amber for highlights, code tokens, and warnings.
  • accent-orange (#ff6900): playful orange for secondary energy and category mapping.
  • accent (#7ccf00): the canonical accent role resolves to the lime.

CTA Fills

  • cta-dark-bg (#000000) / cta-dark-text (#fafafa): the black “Get Started” block — primary action, max contrast.
  • cta-light-bg (#ffffff) / cta-light-text (#000000): the white “Contact Sales” block — high-contrast secondary.

Borders

  • border (rgba(255,255,255,0.08)): 8% white hairline — the default card / divider edge.
  • border-soft (rgba(255,255,255,0.04)): 4% white for the subtlest dividers.
  • border-strong (rgba(255,255,255,0.16)): 16% white for emphasis edges and input borders.

Interactive

  • link (#7ccf00): links use the brand lime on the dark ground; no underline by default.
  • selected: brand-soft (rgba(124,207,0,0.16)) fill behind selected rows / chips.
  • disabled: text-faint (#56544f) on surface-soft.

Semantic

  • success (#7ccf00) on success-bg (rgba(124,207,0,0.16)): success reuses the brand lime.
  • warning (#fdc700) on warning-bg (rgba(253,199,0,0.16)): amber from the playful set.
  • danger (#fb2c36) on danger-bg (rgba(251,44,54,0.16)): red from the playful set.
  • info (#fffaea) on info-bg (#1f1f23): info reuses cream; there is no info-blue in the system.

3. Typography Rules

Font Family

  • Display: avantt → system-ui → -apple-system → Segoe UI → Helvetica → Arial → sans-serif.
  • Body: seasonSans → system-ui → -apple-system → Segoe UI → Helvetica → Arial → sans-serif.
  • Mono companion: ui-monospace → SFMono-Regular → SF Mono → Menlo → Consolas → monospace.
  • Avantt is a contemporary grotesk with a confident display cut; Season Sans is a warm humanist sans for paragraph reading. The split is structural display vs. comfortable body.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
display-heroAvantt966001.0-0.03emreserved for the boldest marketing moment
display-lgAvantt806001.0-0.028emsecondary hero scale
h1Avantt806001.0-0.028emthe canonical hero — probed at 80px / 600
h2Avantt585001.05-0.02emfeature-band heads — probed at 58px / 500
h3Avantt406001.1-0.015emsub-feature heads
h4Avantt286001.2-0.01emcard heads
h5Avantt206001.3-0.005eminline emphasis heads
h6Avantt166001.40label-grade heads
body-lgSeason Sans184001.550hero subheads
bodySeason Sans164001.550default reading — probed at 16px / 400
body-smSeason Sans144001.50secondary copy
labelSeason Sans135001.40category cues, form labels
captionSeason Sans125001.40.02emimage / chart caption
micromono115001.30.04emsmallest type, technical metadata
code-inlinemono144001.40inline code references
codemono144001.50code block

Principles

  • Negative tracking is the broadcast voice: at hero scale the track tightens to -0.028em/-0.03em. That compression turns Avantt at 80px from competent SaaS into studio-grade display. Loosen the track and the headline loses its confidence.
  • Display vs. body is a hard split: Avantt handles everything h6 and above; Season Sans handles everything body-class and below. Never run paragraph copy in Avantt or a headline in Season Sans — the two faces have distinct jobs.
  • Cream, not white, for reading: body copy is #fffaea, not #ffffff. The warm cast is what keeps the dark canvas from feeling like a terminal. White (#ffffff) is reserved for display headlines that want extra punch.
  • Weight discipline: display tops out at 600 (the probed hero weight); body stays at 400 with 500 for labels. Vapi resists bolding the body — 600 is a display affordance, not a body one.
  • Mono is for metadata, not body: the monospace family appears only in code samples, inline API references, and 11px micro-labels with positive tracking — a typographic cue that says “this is technical, not prose”.
  • h2 drops to 500: the live probe shows h2 at 58px / 500, a half-step lighter than the 600 hero — a deliberate de-escalation so section heads read as quieter than the hero.

4. Component Stylings

Buttons

Primary — black block (“Get Started”)

  • Background: #000000. Text: #fafafa at Season Sans 600 / 16px. Padding: 10px 16px. Radius: 12px. Border: none.
  • Hover: background lifts to #111118. Active: subtle translateY(1px).
  • Use: the primary CTA on the near-black canvas — max contrast, not max saturation.

Secondary — white block (“Contact Sales”)

  • Background: #ffffff. Text: #000000 at Season Sans 600 / 16px. Padding: 10px 16px. Radius: 12px.
  • Hover: background → #f0f0f0. Use: high-contrast secondary paired with the black primary.

Brand — lime accent

  • Background: #7ccf00. Text: #0e0e13 at Season Sans 600 / 16px. Padding: 10px 16px. Radius: 12px.
  • Hover: background → #8ee10f. Active: → #6bb500. Use: when the brand event itself should carry the action — newsletter, “Start building”, demo triggers.

Ghost — translucent

  • Background: rgba(255,255,255,0.1). Text: #ffffff at Season Sans 500 / 16px. Padding: 10px 16px. Radius: 8px.
  • Hover: background → rgba(255,255,255,0.16). Use: tertiary / chrome actions like “Manage Preferences”, nav-adjacent buttons.

Cards

Default card

  • Background: #16161c. Border: 1px solid rgba(255,255,255,0.08). Radius: 12px. Padding: 24px. Shadow: none.
  • Hover: surface lifts to #28282f; border brightens to rgba(255,255,255,0.16); optional translateY(-1px).
  • Use: feature cards, doc cards, pricing cards — depth comes from tonal contrast and the hairline, not from drop shadow.

Live-demo card

  • Background: #16161c. Border: 1px solid rgba(255,255,255,0.08). Radius: 12px. Padding: 24px.
  • Shadow: glow-lime (0 0 48px rgba(124,207,0,0.25)) when a voice agent is live.
  • Use: the call / agent demo widget — the lime glow reads as the agent literally going live.

Badges, Tags, Pills

Status badge (lime)

  • Background: rgba(124,207,0,0.16). Text: #7ccf00 at Season Sans 500 / 12px. Padding: 4px 12px. Radius: 9999px.
  • Use: “New”, “Beta”, “Live” — the default status pill.

Category chip (multi-color)

  • Background: rgba(255,255,255,0.08). Text: cream #fffaea, with a leading dot in the category’s accent (red / amber / orange). Padding: 4px 12px. Radius: 9999px.
  • Use: feature-category tags; the colored dot is where the playful set does wayfinding.

Mono micro tag

  • Background: rgba(255,255,255,0.08). Text: #b7b3a9 at mono 500 / 11px tracked +0.04em, uppercase. Padding: 2px 8px. Radius: 4px.
  • Use: API version tags, model identifiers, SDK names.

Inputs / Forms

Text input

  • Background: #0e0e13. Border: 1px solid rgba(255,255,255,0.16). Radius: 8px. Padding: 8px 12px. Font: Season Sans 400 / 16px in cream #fffaea.
  • Placeholder: #86847e. Focus: border → #7ccf00, ring 0 0 0 3px rgba(124,207,0,0.4).

Code / API-key input

  • Background: #16161c. Border: 1px solid rgba(255,255,255,0.08). Radius: 8px. Padding: 8px 12px. Font: mono 400 / 14px in cream.
  • Use: API-key fields, snippet inputs; the mono face signals “this is a technical value”.

Top bar

  • Background: #0e0e13 (transparent on hero, solidifies to rgba(14,14,19,0.85) with backdrop-blur on scroll). Height: 64px. Bottom edge: 1px solid rgba(255,255,255,0.08) once scrolled.
  • Logo: Vapi wordmark in cream #fffaea / Avantt 600.
  • Nav items: Season Sans 500 / 14px in #b7b3a9, hover → #fffaea. Active item carries a lime underline.
  • Right side: a ghost “Sign in” + the black “Get Started” CTA, always visible.

Tooltips, Toasts, Modals

  • Tooltip: background #1f1f23, text #fffaea at Season Sans 500 / 12px, radius 8px, padding 6px 12px, shadow popover.
  • Toast: background #16161c, border 1px solid rgba(255,255,255,0.08), radius 12px, shadow popover; a leading accent bar in lime / amber / red maps to success / warning / danger.
  • Modal: background #16161c, radius 16px, shadow popover, backdrop rgba(0,0,0,0.6), padding 32px.

5. Layout Principles

Spacing System

Base unit: 4px. Scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]. The system uses tight-to-generous intervals — 12–16px inside components, 24px card padding and gutters, 48–64px between feature blocks, 96–128px between major bands. The breath is developer-tool efficient: airy enough to read, dense enough to feel like a product with a lot to show.

Grid & Container

  • Page width: 1280px max, centered.
  • Prose width: 720px for documentation and editorial reading.
  • Header height: 64px.
  • Hero treatment: hero copy claims roughly 800–900px of horizontal real estate, with a live call/agent demo widget frequently anchored to the side or below the headline.
  • Feature grid: 3-column at 1280px+, 2-column at 1024–1280px, 1-column below 1024px. Card gap: 24px.

Whitespace Philosophy

The grid is centered and the negative space is purposeful. Because the canvas is a constant near-black, whitespace reads as deep space rather than as empty paper, which lets sections feel roomy without large gaps. The lime and the playful accents are the punctuation in that space — a single saturated element per region against a quiet dark field reads louder than it would on white.

Section Cadence

Vapi stays dark the whole way down and paces with color rather than surface inversion. A typical cadence: hero (lime accent CTA + live demo) → feature grid (multi-color category chips) → code-sample band (amber/lime syntax highlights) → integrations → pricing → CTA band → footer. Bands are separated by bg-band tonal shifts and hairline rules rather than hard light/dark flips. Each colored moment is rationed so the energy stays legible.

6. Shapes & Radius Scale

TierValueUse
none0pxfull-bleed images, code blocks flush to band edges
micro2pxinline indicators, tiny markers
sm4pxmono micro tags, tight UI primitives
md8pxinputs, tooltips, ghost buttons
lg12pxthe canonical CTA radius and default card radius
xl16pxmodals, larger feature shells
xxl24pxhero shells, oversized panels
pill9999pxstatus badges and category chips only

The defining radius is lg (12px) — the probed CTA radius. CTAs and cards share the 12px corner, inputs and ghost buttons step down to 8px, and the full pill is reserved for badges and chips rather than buttons. That 12-CTA / 8-input / pill-badge ladder is the brand’s signature ratio, and the choice of a 12px button corner over a full pill is a deliberate developer-tool tell — crisp rather than soft.

7. Depth & Elevation

LevelTreatmentUse
0flat, on #0e0e13body content, default surfaces
11px hairline rgba(255,255,255,0.08), no shadowdefault card; tonal contrast carries depth
2lift to #1f1f23 + brighter hairlinehovered / floating card
3glow-lime (0 0 48px rgba(124,207,0,0.25))live-demo / agent widget
4popover shadow on #1f1f23tooltip, dropdown, menu
5popover + backdrop, 16px radiusmodal, lightbox

Shadow Philosophy: On a near-black canvas, neutral-grey ambient shadows mostly disappear, so Vapi leans on tonal contrast (#0e0e13#16161c#1f1f23#28282f) and hairline borders to express depth. Drop shadows exist for true overlays (tooltips, menus, modals) where the element floats above content, and they run dark-and-deep (rgba(0,0,0,0.4–0.6)) to register against the dark ground. The one chromatic elevation is the lime glow around the live-demo widget — the accent literally lighting up when a voice agent goes live. Shadows are never the primary depth strategy on the page body; tonal contrast is.

8. Interaction & Motion

Easing

  • standard: cubic-bezier(0.4, 0, 0.2, 1) — the workhorse ease for hovers and color shifts.
  • emphasized: cubic-bezier(0.2, 0, 0, 1) — slower in, faster out; hero entrance, modal open, band transitions.
  • decelerate: cubic-bezier(0, 0, 0.2, 1) — elements entering from off-canvas.
  • spring: cubic-bezier(0.34, 1.4, 0.64, 1) — slight overshoot, used sparingly on the live-agent / waveform pulse.

Durations

  • fast (150ms): button hover, link color, ghost-button background shift.
  • standard (240ms): primary CTA press, dropdown open, card hover lift.
  • slow (320ms): modal open, band transition, hero entrance choreography.

Per-component micro-states

  • Black/white CTA hover: background shifts one tonal step over 150ms standard; press adds translateY(1px).
  • Lime CTA hover: background → #8ee10f over 150ms; no transform.
  • Card hover: surface lifts #16161c#28282f and hairline brightens over 240ms; optional translateY(-1px).
  • Live-demo widget: lime glow fades in over 320ms when an agent connects; waveform pulses on a spring cycle.
  • Input focus: lime ring fades in over 150ms as the border shifts to #7ccf00 simultaneously.
  • Link hover: cream → lime color shift over 150ms, with a lime underline growing in from the left.

Page transitions

Route transitions use opacity + a 12px vertical slide at 320ms with emphasized ease — slightly more deliberate than a plain fade, signaling a crafted product rather than a generic template.

Reduced-motion strategy

prefers-reduced-motion: reduce is fully respected: all transform-based animations collapse to opacity-only at 100ms. Hover lifts disappear, the waveform pulse becomes static at its connected state, and page slides become opacity-only fades. The lime glow persists (it is not motion).

9. Accessibility & A11y

Contrast pairs (computed)

  • text on bg: #fffaea on #0e0e13 → 18.44:1 (AAA at all sizes).
  • text-strong on bg: #ffffff on #0e0e13 → 19.25:1 (AAA at all sizes).
  • brand on bg: #7ccf00 on #0e0e13 → 9.88:1 (AAA at all sizes).
  • on-brand on brand: #0e0e13 on #7ccf00 → 10.78:1 (AAA at all sizes).
  • text-muted on bg: #b7b3a9 on #0e0e13 → 9.20:1 (AAA at body sizes).
  • amber on bg: #fdc700 on #0e0e13 → 12.23:1 (AAA at all sizes).
  • orange on bg: #ff6900 on #0e0e13 → 6.67:1 (AA at body, AAA at large).
  • red on bg: #fb2c36 on #0e0e13 → 5.06:1 (AA at body; prefer large or pair with a glyph for danger states).

Focus indicators

  • Default focus ring: 3px solid rgba(124,207,0,0.4) with 1px offset; the lime ring is visible on every dark surface.
  • On the lime CTA: ring shifts to 3px solid rgba(14,14,19,0.5) (near-black ring on lime) for contrast.
  • On light CTAs (white block): ring uses 3px solid rgba(124,207,0,0.6) for sufficient visibility against white.

Focus rings are never removed.

ARIA patterns

  • The live-agent / call widget uses role="region" with aria-label="Voice agent demo" and standard audio-element semantics.
  • Modals use role="dialog", aria-modal="true", a focus trap, and Esc to close.
  • Category chip groups use role="group"; selectable chips use role="checkbox"/aria-pressed.
  • The docs combobox uses role="combobox" with aria-expanded, aria-controls, aria-activedescendant.

Keyboard nav order

Top bar → hero CTA pair → live-demo widget (full keyboard semantics) → feature grid → code-sample band → pricing → footer. Tab order matches visual order; a skip-to-content link is visible on focus.

Screen reader hints

  • Decorative waveform / confetti glyphs carry aria-hidden="true".
  • Icon-only buttons carry an aria-label.
  • The live-agent widget carries aria-live="polite" for connection-state updates.
  • Color-coded category dots are paired with a text label so color is never the only signal.

Reduced motion

Honored throughout — see §8. Critically, danger (#fb2c36) at 5.06:1 sits below AAA at body size, so danger states pair the red with an icon and text rather than relying on color alone.

10. Responsive Behavior

Breakpoints

TierWidthBehavior
mobile< 640pxsingle column, 16px gutter, 64px section padding, hero at 40–48px
tablet640–1024pxsingle column, 24px gutter, 80px section padding, hero at 56–64px
desktop1024–1280px2-column feature grids, 24px gutter, 96px section padding, hero at 72px
wide1280–1536px3-column feature grids, 24px gutter, 120px section padding, hero at full 80px
ultra1536px+container caps at 1280px; extra space goes to gutters

Touch Targets

Minimum 44×44px on touch devices. The 10px 16px button padding is bumped to 12px 20px on touch to clear the threshold comfortably. Category chips expand to 8px 16px on mobile for thumb-friendly tap area.

Collapsing strategy

  • Top nav: hamburger menu < 1024px; the black “Get Started” CTA stays visible at top right.
  • Hero: the live-demo widget moves below the copy < 1024px; copy claims full width.
  • Feature grid: 3 → 2 → 1 columns at 1280 / 1024 / 640.
  • Code-sample band: blocks scroll horizontally rather than wrapping, preserving line integrity.
  • Pricing: tiers stack vertically < 1024px with the recommended tier highlighted via order shift.
  • Footer: 4-column → 2-column → 1-column at 1280 / 1024 / 640.

Image behavior

Live-demo waveform displays use an aspect-ratio lock with full responsive width. Hero illustrations and integration logos preserve their original aspect ratio.

Container queries

Used inside the live-agent widget — the player switches between expanded (waveform + transcript + controls) and condensed (controls + status only) modes based on its container width rather than the viewport.

11. Content & Voice

Tone

Vapi’s voice is developer-first and energetic: technical, fast, and confident, but warm rather than dry. It writes like an engineer who is genuinely excited about what you can build — present-tense, imperative, code-forward, with the occasional playful flourish that matches the multi-color palette. Headlines are direct and capability-led (“Build advanced voice AI agents”, “Ship in minutes, not months”); secondary copy explains the mechanism plainly and gets to a code sample fast. The register positions Vapi as infrastructure for builders, not a no-code toy.

Microcopy patterns

  • Button verbs: “Get Started”, “Start building”, “Contact Sales”, “Read the docs”, “View on GitHub”. Action-forward, with the noun named.
  • Error messages: pattern is “Couldn’t [action] — [reason]. [recovery].” e.g. “Couldn’t connect the agent — your API key is missing. Add a key in Settings to continue.”
  • Success confirmations: short and product-forward. “Agent live.” rather than “Your agent has been deployed successfully!”

Empty states

Empty states are direct and builder-oriented. “No agents yet — create your first in under a minute” with a lime “Start building” CTA. The copy never reaches for “Oops!” or cheerful mascots — the developer register stays even when the canvas is empty.

CTA verb conventions

  • Primary marketing CTA: “Get Started” — the canonical black-block phrase across the site.
  • Brand CTA: “Start building” — the lime accent action.
  • Developer CTA: “Read the docs”, “View on GitHub”, “Get your API key”.
  • Sales: “Contact Sales” or “Talk to us”.

12. Dark Mode & Theming

Vapi is dark-native — the near-black #0e0e13 canvas is the only mode the marketing surface ships, and there is no light variant. The entire system is engineered for the dark ground:

  • bg: #0e0e13 is the constant canvas; surfaces step up tonally (#16161c#1f1f23#28282f).
  • text: warm cream #fffaea (not white) is the deliberate softness move; #ffffff is reserved for display punch.
  • brand: lime #7ccf00 holds at full chroma — contrast against #0e0e13 is 9.88:1 (AAA), so it never needs to shift for legibility.
  • borders: white-at-low-opacity hairlines (8% / 4% / 16%) rather than solid grey, so edges sit naturally on the dark field.
  • playful accents: red / amber / orange are all tuned to be legible on the dark ground (amber and orange clear AA/AAA at large; red is reserved for large or icon-paired states).

When implementing:

  • Depth is tonal contrast + hairlines, not drop shadows on the page body. Reserve real shadows for floating overlays.
  • The lime glow persists at the same intensity as the canvas’s single chromatic elevation.
  • Do not introduce a light theme — the brand identity is the dark canvas, and the cream-on-near-black contrast is the signature. A naive light inversion would lose the lime’s read and the cream’s warmth.
  • If a light surface is unavoidable (e.g. an embedded white-block CTA), keep it as a contained block on the dark ground rather than flipping the whole band.

13. Lineage & Influences

Vapi sits in the studio-dark, developer-tool lineage that Vercel, Linear, and ElevenLabs established — a near-black canvas, tight negative-tracked display type, and a single saturated accent that reads as both brand and wayfinding. Vapi adopts all of that scaffolding: the #0e0e13 ground reads like Vercel’s serious-tool register, the Avantt headline at 80px / 600 with hard negative tracking echoes Linear’s broadcast-display discipline, and the electric lime #7ccf00 plays the exact role ElevenLabs’ lime plays — the LED-green chromatic event on a dark deck. The closest adjacent reference is ElevenLabs: both are voice-AI brands on studio-dark grounds with a signature lime, which makes the comparison almost a controlled experiment.

Where Vapi breaks ranks is the one rule that lineage holds sacred: chromatic restraint. ElevenLabs treats a second saturated accent as a sin; Vapi treats the playful multi-color set — red, amber, orange alongside the lime — as the point. The result is a developer brand that keeps the dark, fast, technical register but refuses the joyless monochrome that usually comes with it. The cream text instead of white, and the 12px-radius button instead of a pill, are the other two small rebellions — warmth where the genre expects clinical, crispness where the genre expects soft. What Vapi rejects is the light-mode editorial band (it stays dark all the way down), the single-accent orthodoxy (it keeps a set), and the pill CTA (it keeps the crisp corner). The discipline is the dark canvas and the cream warmth; the play is the multi-color set.

Named influences

  • ElevenLabs (elevenlabs.io) — the closest adjacent voice-AI reference; studio-dark ground with a signature lime, which Vapi keeps while trading single-accent restraint for a playful set.
  • Vercel (vercel.com) — near-black canvas as the serious-developer-tool register; the black-block CTA inherits from this playbook.
  • Linear (linear.app) — tight negative-tracked display type and the discipline of a confident dark canvas.
  • Stripe (stripe.com) — developer-first docs aesthetic; code as first-class surface, colored syntax tokens echoed in the multi-hue accents.
  • Supabase (supabase.com) — open-source developer brand pairing a dark canvas with a single saturated green; Vapi runs the lime hotter and adds the playful set.

14. Do’s and Don’ts

Do

  • Keep the canvas a constant near-black #0e0e13 — warmer and bluer than pure black — all the way down the page.
  • Use warm cream #fffaea for body text, not white; the warmth is the signature and what keeps the surface from reading as a terminal.
  • Run hero headlines in Avantt at 80px / 600 with -0.028em to -0.03em tracking; the compression is the broadcast voice.
  • Make the lime #7ccf00 the primary brand event — links, active states, the accent CTA, syntax highlights.
  • Use the playful set (red / amber / orange) for category mapping, code-token color, and energy — rationed, one saturated moment per region.
  • Use a 12px-radius button for CTAs; pure-black and pure-white blocks are the high-contrast primary/secondary pair.
  • Express depth with tonal contrast (#0e0e13#16161c#1f1f23) and hairline borders, not heavy shadows on the page body.
  • Reserve the lime glow for the live-agent / demo widget — the accent lighting up when an agent connects.
  • Pair red danger states with an icon and text label, since #fb2c36 clears AA but not AAA at body size.
  • Keep mono type for code, API references, and 11px metadata only; let Season Sans carry all prose.

Don’t

  • Don’t ship a light theme — the brand identity is the dark canvas, and a naive inversion loses the lime’s read and the cream’s warmth.
  • Don’t use white #ffffff for body copy — reserve it for display punch; cream is the reading color.
  • Don’t collapse to single-accent discipline — the playful multi-color set is the deliberate point of difference from ElevenLabs.
  • Don’t let more than one or two saturated moments fire in a single region; the energy stays legible only when rationed.
  • Don’t swap the 12px-radius CTA for a full pill — the crisp corner is the developer-tool tell.
  • Don’t run paragraph copy in Avantt or a headline in Season Sans; the display/body split is a hard rule.
  • Don’t loosen the hero negative tracking below -0.02em; the headline loses its confidence.
  • Don’t lean on neutral drop shadows for page-body depth — they vanish on near-black; use tonal contrast and hairlines.
  • Don’t put white text on the lime; the lime is bright, so near-black #0e0e13 is the on-brand color.
  • Don’t use the playful accents as body-text colors — they are for accents, wayfinding, and energy, never reading.

15. Agent Prompt Guide

Quick Color Reference

bg: #0e0e13
surface: #16161c
surface-soft: #1f1f23
text: #fffaea
text-strong: #ffffff
text-muted: #b7b3a9
brand (lime): #7ccf00
accent-red: #fb2c36
accent-amber: #fdc700
accent-orange: #ff6900
border: rgba(255,255,255,0.08)
cta-dark: #000000 / #fafafa
cta-light: #ffffff / #000000

Example Component Prompts

  1. “Create a marketing hero in the Vapi style: near-black #0e0e13 canvas, Avantt 600 / 80px headline in cream #fffaea with -0.028em tracking, 18px subhead in Season Sans 400 in #b7b3a9, a primary black-block CTA (#000000 bg, #fafafa text, 10px 16px padding, 12px radius) labeled ‘Get Started’, and a white-block secondary CTA (#ffffff bg, #000000 text) labeled ‘Contact Sales’.”

  2. “Design a live-agent demo card in the Vapi style: #16161c background, 1px solid rgba(255,255,255,0.08) hairline, 12px radius, 24px padding, a waveform visualization in lime #7ccf00, and a lime glow shadow (0 0 48px rgba(124,207,0,0.25)) when the agent is connected. Status pill in lime-tint (rgba(124,207,0,0.16) bg, #7ccf00 text).”

  3. “Render a feature card grid in the Vapi style: 3 columns on #0e0e13, each card #16161c with a 1px solid rgba(255,255,255,0.08) hairline, 12px radius, 24px padding, Avantt 600 / 28px title in cream, Season Sans 400 / 16px body in #b7b3a9, and a leading category dot in one of the playful accents (red #fb2c36 / amber #fdc700 / orange #ff6900). Hover: surface lifts to #28282f, translateY(-1px).”

  4. “Create a code-sample band in the Vapi style: #1f1f23 band on the #0e0e13 page, monospace code at 14px in cream with syntax tokens colored from the playful set (keywords lime #7ccf00, strings amber #fdc700, numbers orange #ff6900), an Avantt 600 / 40px section head above, and a ‘Read the docs’ lime CTA below.”

  5. “Design a pricing tier card in the Vapi style: #16161c background, 1px solid rgba(255,255,255,0.08) hairline, 12px radius, 24px padding, tier name in Avantt 600 / 20px cream, price in Avantt 600 / 56px cream, feature list in Season Sans 400 / 16px with lime #7ccf00 checkmarks, and a black-block ‘Get Started’ CTA at the bottom. The recommended tier gets a lime hairline (#7ccf00) instead of white.”

  6. “Render a top navigation bar in the Vapi style: transparent over a #0e0e13 hero, solidifying to rgba(14,14,19,0.85) with backdrop-blur and a 1px solid rgba(255,255,255,0.08) bottom edge on scroll, 64px height, cream Avantt 600 wordmark, Season Sans 500 / 14px nav links in #b7b3a9 (hover → cream, active → lime underline), a ghost ‘Sign in’, and the black ‘Get Started’ CTA at top right.”

Iteration Guide

  1. Lock the canvas first: the ground is always near-black #0e0e13 and the body text is always cream #fffaea. If you see white body text or a light band, you’ve drifted out of the brand.
  2. Verify the type voice: hero headlines should hit 80px in Avantt at 600 weight with -0.028em to -0.03em tracking. If the headline reads competent rather than broadcast-grade, tighten the track and scale up; if prose is in Avantt, move it to Season Sans.
  3. Audit the lime: there should be exactly one lime #7ccf00 brand event per region — usually a link, an active state, or the accent CTA. Lime is action and brand, never body text.
  4. Ration the playful set: red / amber / orange are confetti, not wallpaper. One or two saturated accents per region keep the energy legible; more turns it into noise.
  5. Check the CTA corner: primary CTAs are 12px-radius blocks (black or white), not pills. If you’ve drawn a pill button, you’ve borrowed the wrong house style — pills are for badges and chips only.
  6. Confirm the depth strategy: page-body cards use tonal contrast (#16161c on #0e0e13) and hairlines, no drop shadow. If a body card has a grey drop shadow, it’ll vanish on the dark ground — switch to tonal + hairline.
  7. Place the glow correctly: the lime glow belongs only on the live-agent / demo widget when an agent connects. If you see it elsewhere, remove it.
  8. Check the reduced-motion path: hover lifts, waveform pulses, and page slides should all collapse to opacity-only at 100ms when prefers-reduced-motion: reduce is set; the lime glow persists since it is not motion.
Ship with this

Drop vapi into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add vapi
2 · ship landing page
npx agentkit init --design vapi
How AgentKit reads DESIGN.md