light · sans · bold · playful · creator

DESIGN.md inspired by Captions

Near-white studio canvas, an Exposure display, and a violet brand keyed off a full crayon-box of CSS color vars.

By webdesignhot · www.captions.ai
$ npx @webdesignhot/design-md add captions
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #ffffff
  • bg-cool #f5f9fa
  • surface #eef4f6
  • surface-100 #e8eff2
  • surface-150 #dfe5e7
  • text AAA · 16.5 #1d1f20
  • text-h1 #2a2c2d
  • text-strong #141515
  • text-muted #595e5e
  • text-soft #7e8486
  • text-faint — · 2.5 #9fa5a7
  • text-disabled #bec3c6
  • brand AA · 5.2 #6c4df7
  • brand-purple #ab88fb
  • brand-dark #160f31
  • on-brand #ffffff
  • accent-sea #00d0ff
  • accent-sky #a6ecff
  • accent-air #effbff
  • accent-sunset #f99f3f
  • accent-peach #ffca9f
  • accent-cloud #ffcfcf
  • accent-barbie-pink #ff1476
  • accent-pink #ff9bb2
  • accent-meadow #5bf6bb
  • accent-green #46e7b4
  • accent-lime #aaff4e
  • accent-yellow #fcff41
  • accent-mustard #ffdd33
  • link #6c4df7
  • link-hover #160f31
  • cta-chrome-bg #eef4f6
  • cta-tile-bg #f5f9fa
  • border — · 1.3 #dfe5e7
  • border-strong — · 1.5 #d0d6d7
  • border-subtle #e8eff2
  • border-brand rgba(108, 77, 247, 0.32)
  • success-bg #ebfdf2
  • success-text #0e663b
  • info-bg #eff7ff
  • info-text #00b7e4
  • warning-bg #fffcef
  • warning-text #e07300
  • danger-bg #fff0f0
  • danger-text #d00000
Typography
Ship faster than ever.
display-hero Exposure 80px w700 -0.03em
Ship faster than ever.
display-lg Exposure 56px w700 -0.02em
Ship faster than ever.
h1 Exposure 48px w700 -0.018em
Built for teams that ship.
h2 Exposure 32px w600 -0.012em
A complete kit
h3 Exposure 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h4 DenimINK 20px w600 0
The quick brown fox jumps over the lazy dog.
body-lg DenimINK 18px w400 0
The quick brown fox jumps over the lazy dog.
h5 DenimINK 17px w600 0
The quick brown fox jumps over the lazy dog.
body DenimINK 16px w400 0
The quick brown fox jumps over the lazy dog.
button DenimINK 15px w600 0
The quick brown fox jumps over the lazy dog.
body-sm DenimINK 14px w400 0
The quick brown fox jumps over the lazy dog.
eyebrow DenimINK 13px w600 0.08em
OUR DESIGN SYSTEM
label DenimINK 13px w500 0
OUR DESIGN SYSTEM
mono ui-monospace 13px w400 0
OUR DESIGN SYSTEM
caption DenimINK 12px w500 0.02em
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
Radius
  • micro 2px
  • sm 4px
  • md 8px
  • lg 12px
  • xl 16px
  • 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 0/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
  • foreground
  • primary
  • primary-foreground
  • accent
  • muted
  • border
  • ring
Lineage & influences

Captions is a New York AI video studio (founded 2021 by Gaurav Misra and Dwight Churchill) whose product turns raw selfie footage into captioned, edited short-form video. Its marketing identity rejects the dark-slab, chrome-on-black register that dominates AI-video competitors (Runway, Pika, Kapwing) and instead ships a bright near-white studio canvas with charcoal text — closer to a creator's desktop than a developer tool. The defining move is chromatic: rather than one or two brand colors, Captions declares a full crayon box of `--color-*` CSS variables (sea, sky, sunset, cloud, meadow, barbie-pink, yellow, peach, lime, violet, and more) and treats them as a reusable sticker pack scattered across illustrations, category tags, and accent washes. Violet `#6c4df7` is the primary accent that anchors the system, but no single hue owns the page. Crucially, the hero's functional chrome — the grey upload tile and grey "Add style" pill — is deliberately desaturated so the multi-hue accent system reads as the brand, not the buttons. The display face Exposure is a tall, confident grotesque used at large sizes; DenimINK keeps body copy humanist and friendly. The register is bold, playful, and creator-native: built for people who post for a living, not for an enterprise procurement deck.

  • product and brand direction toward a creator-native, color-forward identity
  • multi-hue named-color system + bright near-white canvas as a creative-tool register
  • AI-video peer that also rejects dark-slab chrome for a warm, editorial light canvas
  • tight type + restrained grey chrome that lets accent color do the talking
  • playful gradient/accent washes over a clean near-white marketing surface
  • chrome-on-black AI-video contemporaries Captions deliberately differentiates against
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: Captions
tagline: 'Near-white studio canvas, an Exposure display, and a violet brand keyed off a full crayon-box of CSS color vars.'
updated_at: 2026-05-29T21:43:24.653Z
published_at: 2026-05-29T21:43:24.653Z
author: webdesignhot
source_url: https://www.captions.ai
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [ai, media, saas]
tags: [light, sans, bold, playful, creator]
preview_swatch: ['#ffffff', '#6c4df7', '#ff1476']
related: [descript, framer, linear]
description: 'Captions is an AI video editor that throws out the dark-slab playbook of its category and ships on a near-white studio canvas (`#ffffff`, cooled to `#f5f9fa` / `#eef4f6` on raised surfaces) with charcoal `#1d1f20` text. The display face is a tall, confident sans called **Exposure** (h1 at 48px on the live site, scaling to 80px on the hero); body copy runs in **DenimINK**, a humanist working sans. What makes the brand is not the chrome — the hero CTAs are deliberately quiet grey pills (`#eef4f6`, 9999px) and grey upload tiles (`#f5f9fa`, 12px) — but a sprawling, joyful palette declared as `--color-*` CSS variables: violet `#6c4df7` as the primary accent, then sea `#00d0ff`, sunset `#f99f3f`, barbie-pink `#ff1476`, meadow `#5bf6bb`, yellow `#fcff41`, peach, cloud, lime and a dozen more. It reads like a creator''s sticker pack: the neutral canvas is the wall, and the color vars are what you tack onto it. Where Runway and Pika reach for chrome-on-black and Descript reaches for cream-pink editorial, Captions reaches for a bright, near-white studio with a multi-hue accent system — bold, creator-native, playful, and unmistakably built for people who make short-form video for a living.'

colors:
  # Canvas
  bg: '#ffffff'                          # near-white studio canvas (audit body bg transparent → page white)
  bg-cool: '#f5f9fa'                     # --color-bone / gray-10 — coolest near-white, upload tiles & insets
  surface: '#eef4f6'                     # --color-gray-50 — raised pill / chip surface (the grey CTA chrome)
  surface-100: '#e8eff2'                 # --color-gray-100 / light-gray — nested panel
  surface-150: '#dfe5e7'                 # --color-gray-150 — divider band
  # Text
  text: '#1d1f20'                        # --color-charcoal / gray-900 — primary body + headings
  text-h1: '#2a2c2d'                     # --color-gray-800 — display headings (live h1 color)
  text-strong: '#141515'                 # --color-gray-950 — heaviest text
  text-muted: '#595e5e'                  # --color-gray-600 — secondary copy
  text-soft: '#7e8486'                   # --color-gray / gray-500 — captions, metadata
  text-faint: '#9fa5a7'                  # --color-gray-400 — placeholder, helper
  text-disabled: '#bec3c6'               # --color-gray-300 — disabled microcopy
  # Brand
  brand: '#6c4df7'                       # --color-violet — primary accent (NOTES: audit missed it on grey chrome)
  brand-purple: '#ab88fb'                # --color-purple — soft violet tint, washes & illustration
  brand-dark: '#160f31'                  # --color-dark-purple — deep violet ground for dark blocks
  on-brand: '#ffffff'                    # white label on violet
  # Accent system (the --color-* crayon box — the real brand identity)
  accent-sea: '#00d0ff'                  # --color-sea — cyan, primary cool accent
  accent-sky: '#a6ecff'                  # --color-sky — pale cyan wash
  accent-air: '#effbff'                  # --color-air — faintest cyan tint
  accent-sunset: '#f99f3f'               # --color-sunset — warm orange
  accent-peach: '#ffca9f'                # --color-peach — soft orange wash
  accent-cloud: '#ffcfcf'                # --color-cloud — pale pink wash
  accent-barbie-pink: '#ff1476'          # --color-barbie-pink — hot magenta, loudest accent
  accent-pink: '#ff9bb2'                 # --color-pink — soft rose
  accent-meadow: '#5bf6bb'               # --color-meadow — mint green
  accent-green: '#46e7b4'                # --color-green — teal-green
  accent-lime: '#aaff4e'                 # --color-lime-green — electric lime
  accent-yellow: '#fcff41'               # --color-yellow — highlighter yellow
  accent-mustard: '#ffdd33'              # --color-mustard — warm yellow
  # Interactive
  link: '#6c4df7'                        # violet links in body
  link-hover: '#160f31'                  # deep-violet on hover
  cta-chrome-bg: '#eef4f6'               # grey pill CTA bg — intentionally quiet chrome
  cta-tile-bg: '#f5f9fa'                 # grey upload-tile bg
  # Borders
  border: '#dfe5e7'                      # --color-gray-150 — default hairline
  border-strong: '#d0d6d7'              # --color-gray-200 — stronger separation
  border-subtle: '#e8eff2'              # --color-gray-100 — quietest rule
  border-brand: 'rgba(108, 77, 247, 0.32)' # violet-tinted focus hairline
  # Semantic (declared as HSL bg vars in production)
  success-bg: '#ebfdf2'                  # hsl(143,85%,96%) — soft mint wash
  success-text: '#0e663b'                # --color-dark-green
  info-bg: '#eff7ff'                     # hsl(208,100%,97%) — soft sky wash
  info-text: '#00b7e4'                   # --color-medium-blue
  warning-bg: '#fffcef'                  # hsl(49,100%,97%) — soft cream wash
  warning-text: '#e07300'                # --color-orange
  danger-bg: '#fff0f0'                   # hsl(359,100%,97%) — soft red wash
  danger-text: '#d00000'                 # --color-red

typography:
  display:
    family: 'Exposure, system-ui, -apple-system, sans-serif'
    weights: [500, 600, 700]
    opentype-features: ['liga', 'kern']
  body:
    family: 'DenimINK, system-ui, -apple-system, sans-serif'
    weights: [400, 500, 600]
    opentype-features: ['liga', 'kern']
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
    weights: [400, 500]
    opentype-features: ['tnum', 'zero']
  scale:
    display-hero:    { size: 80, weight: 700, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h1:              { size: 48, weight: 700, lineHeight: 1.1,  tracking: '-0.018em', family: display }
    h2:              { size: 32, weight: 600, lineHeight: 1.2,  tracking: '-0.012em', family: display }
    h3:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
    h4:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '0',        family: body }
    h5:              { size: 17, weight: 600, lineHeight: 1.35, tracking: '0',        family: body }
    eyebrow:         { size: 13, weight: 600, lineHeight: 1.4,  tracking: '0.08em',   family: body, transform: uppercase }
    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 }
    button:          { size: 15, weight: 600, lineHeight: 1.0,  tracking: '0',        family: body }
    mono:            { size: 13, weight: 400, lineHeight: 1.5,  tracking: '0',        family: mono }

radius:
  micro: 2
  sm: 4
  md: 8
  lg: 12
  xl: 16
  pill: 9999

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

layout:
  page-width: 1280
  prose-width: 720
  site-gutter: 'clamp(20px, 5vw, 56px)'
  header-height: 64
  grid-columns: 12
  section-rhythm: '80-120px'

components:
  button-primary:
    background: '#6c4df7'
    text: '#ffffff'
    padding: '12px 22px'
    radius: 9999
    border: 'none'
    font: 'DenimINK 600 / 15px'
    hover-bg: '#160f31'
    use: 'Primary action — violet pill, the brand accent applied to the strongest CTA'
  button-chrome:
    background: '#eef4f6'
    text: '#2a2c2d'
    padding: '12px 22px'
    radius: 9999
    border: 'none'
    font: 'DenimINK 600 / 15px'
    hover-bg: '#e8eff2'
    use: 'The quiet grey hero pill (Add style) — chrome, not brand; lets the color system carry identity'
  button-tile:
    background: '#f5f9fa'
    text: '#1d1f20'
    padding: '16px 20px'
    radius: 12
    border: '1px dashed #d0d6d7'
    font: 'DenimINK 500 / 16px'
    hover-bg: '#eef4f6'
    use: 'Upload / drag-drop tile (Import or drag your video) — grey, dashed, inviting'
  button-ghost:
    background: 'transparent'
    text: '#1d1f20'
    padding: '10px 16px'
    border: 'none'
    font: 'DenimINK 500 / 15px'
    hover-text: '#6c4df7'
    use: 'Quiet third action — nav links, footer'
  card:
    background: '#f5f9fa'
    border: '1px solid #dfe5e7'
    radius: 12
    padding: '24px'
    use: 'Default feature card — coolest near-white, hairline border, barely lifted'
  card-accent:
    background: '#effbff'
    border: 'none'
    radius: 16
    padding: '24px'
    use: 'Color-washed feature card — one accent tint per card (air/sky/peach/cloud/meadow)'
  input:
    background: '#ffffff'
    border: '1px solid #dfe5e7'
    radius: 8
    padding: '10px 14px'
    font: 'DenimINK 400 / 16px'
    placeholder-color: '#9fa5a7'
    focus-ring: '0 0 0 2px rgba(108, 77, 247, 0.32)'
    use: 'Form fields, search, email capture'
  badge-eyebrow:
    background: 'transparent'
    text: '#7e8486'
    padding: '0'
    font: 'DenimINK 600 / 13px / uppercase / 0.08em'
    use: 'Section eyebrow — no chrome, just type'
  pill-accent:
    background: '#6c4df7'
    text: '#ffffff'
    padding: '5px 12px'
    radius: 9999
    font: 'DenimINK 600 / 12px'
    use: 'NEW / status chip — violet fill, or any single accent var for category tags'
  nav-link:
    background: 'transparent'
    text: '#1d1f20'
    padding: '8px 12px'
    font: 'DenimINK 500 / 15px'
    hover-text: '#6c4df7'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  reduced-motion: 'respects prefers-reduced-motion: reduce — transitions become opacity-only, durations halved'

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

shadows:
  none: 'none'
  ambient: 'rgba(29, 31, 32, 0.04) 0 1px 2px'
  standard: 'rgba(29, 31, 32, 0.06) 0 4px 12px'
  lift: 'rgba(29, 31, 32, 0.08) 0 12px 28px -10px'
  elevated: 'rgba(29, 31, 32, 0.12) 0 24px 48px -16px'
  ring: '0 0 0 2px rgba(108, 77, 247, 0.32)'

accessibility:
  contrast-text-on-bg: 15.6                # #1d1f20 on #ffffff — AAA at all sizes
  contrast-h1-on-bg: 13.1                  # #2a2c2d on #ffffff — AAA at all sizes
  contrast-text-on-brand: 5.0              # #ffffff on #6c4df7 — AA at body sizes / AAA at large
  contrast-muted-on-bg: 6.9                # #595e5e on #ffffff — AA at all sizes
  contrast-soft-on-bg: 4.0                 # #7e8486 on #ffffff — AA at large / metadata only
  focus-ring: '2px violet ring rgba(108, 77, 247, 0.32) with 2px offset'
  reduced-motion-honored: true
  keyboard-nav: 'visible focus on every interactive surface; tab order matches visual'
  prose-line-length: 'capped at 720px for readability'

dark-mode: 'partial — marketing surface is light-only on the near-white canvas; the in-product editor and select hero blocks invert to a deep-violet/charcoal ground (--color-dark-purple #160f31 / gray-950 #141515). The color-var system is engineered to read on both.'

lineage:
  summary: 'Captions is a New York AI video studio (founded 2021 by Gaurav Misra and Dwight Churchill) whose product turns raw selfie footage into captioned, edited short-form video. Its marketing identity rejects the dark-slab, chrome-on-black register that dominates AI-video competitors (Runway, Pika, Kapwing) and instead ships a bright near-white studio canvas with charcoal text — closer to a creator''s desktop than a developer tool. The defining move is chromatic: rather than one or two brand colors, Captions declares a full crayon box of `--color-*` CSS variables (sea, sky, sunset, cloud, meadow, barbie-pink, yellow, peach, lime, violet, and more) and treats them as a reusable sticker pack scattered across illustrations, category tags, and accent washes. Violet `#6c4df7` is the primary accent that anchors the system, but no single hue owns the page. Crucially, the hero''s functional chrome — the grey upload tile and grey "Add style" pill — is deliberately desaturated so the multi-hue accent system reads as the brand, not the buttons. The display face Exposure is a tall, confident grotesque used at large sizes; DenimINK keeps body copy humanist and friendly. The register is bold, playful, and creator-native: built for people who post for a living, not for an enterprise procurement deck.'
  influences:
    - { name: 'Gaurav Misra (co-founder & CEO, Captions)', role: 'product and brand direction toward a creator-native, color-forward identity', url: 'https://www.captions.ai/about' }
    - { name: 'Figma', role: 'multi-hue named-color system + bright near-white canvas as a creative-tool register', url: 'https://www.figma.com' }
    - { name: 'Descript', role: 'AI-video peer that also rejects dark-slab chrome for a warm, editorial light canvas', url: 'https://www.descript.com' }
    - { name: 'Linear', role: 'tight type + restrained grey chrome that lets accent color do the talking', url: 'https://linear.app' }
    - { name: 'Framer', role: 'playful gradient/accent washes over a clean near-white marketing surface', url: 'https://www.framer.com' }
    - { name: 'Runway / Pika', role: 'chrome-on-black AI-video contemporaries Captions deliberately differentiates against', url: 'https://runwayml.com' }
---

## 1. Visual Theme & Atmosphere

Captions opens on a near-white studio canvas. The page background is white `#ffffff`, cooled to `#f5f9fa` and `#eef4f6` on raised surfaces, and the text is a charcoal `#1d1f20` that reads warm-neutral rather than terminal-cold. Headlines are set in **Exposure** — a tall, confident grotesque sans rendered at 48px on the live hero and scaling up to 80px in the largest display variant — while body copy runs in **DenimINK**, a humanist working sans at 16px on a 1.55 line-height. The first impression is light, roomy, and bright: a creator's desktop with the lights on, not a developer console at midnight.

What makes Captions visually distinctive is its *chromatic strategy*. Most of its category — Runway, Pika, Kapwing, the whole AI-video cohort — reaches for chrome-on-black, neon-on-slate, or moody gradient darkness. Captions does the opposite. It keeps the canvas near-white and then unloads a full crayon box of color as CSS variables: `--color-sea` cyan `#00d0ff`, `--color-sunset` orange `#f99f3f`, `--color-barbie-pink` magenta `#ff1476`, `--color-meadow` mint `#5bf6bb`, `--color-yellow` highlighter `#fcff41`, plus sky, cloud, peach, lime, purple and a dozen more. These hues aren't blended into one gradient identity; they're treated as a reusable sticker pack, dabbed across illustrations, category tags, accent washes, and emoji-adjacent UI flourishes. The violet `#6c4df7` (`--color-violet`) is the primary accent that anchors the system and carries the strongest CTA, but no single color owns the page. The brand *is* the variety.

The most important compositional decision is what is *not* colored. The hero's functional chrome — the "Import or drag your video" upload tile (grey `#f5f9fa`, 12px radius) and the "Add style" pill (grey `#eef4f6`, fully rounded) — is deliberately desaturated. On a lesser site these would be the violet buttons screaming for attention. Here they're quiet grey, because the accent system is doing the identity work. This is a subtle, expert move: the page reads as colorful and energetic even though its load-bearing UI is neutral, because color lives in the decoration layer while chrome stays calm. Read the grey CTAs as plumbing, not personality.

The register is **bold, playful, and creator-native**. Exposure at display sizes feels like a poster headline; the accent palette feels like the stickers and gradients a short-form creator would layer onto their own video. Atmospheric vocabulary that captures the feeling: *near-white studio, crayon-box accents, sticker-pack palette, violet-anchor, grey-chrome-quiet, Exposure-poster-display, DenimINK-humanist-body, creator-desktop, short-form-native, multi-hue-energy, light-and-bright, color-as-decoration.* Captions looks like the tool that the people who live on the For You page would actually want open on their screen.

**Key Characteristics**
- Near-white canvas `#ffffff` cooled to `#f5f9fa` / `#eef4f6` on surfaces — never dark, never pure-grey
- Charcoal text `#1d1f20` — warm-neutral, AAA on white at 15.6:1
- **Exposure** display grotesque at 48px (hero) up to 80px — tall, confident, poster-scale
- **DenimINK** body sans at 16px / 1.55 — humanist, friendly, calm reading texture
- A full `--color-*` crayon box (sea, sunset, barbie-pink, meadow, yellow, sky, cloud, peach, lime, purple) as the real brand identity
- Violet `#6c4df7` as the primary accent that anchors the system without monopolizing it
- Deliberately grey hero chrome (upload tile + "Add style" pill) — chrome is desaturated so color carries the brand
- Color lives in the decoration layer (illustrations, tags, washes); UI chrome stays neutral
- Pill (9999px) and 12px radii dominate — friendly, rounded, never sharp
- Cool grey-blue neutral scale (`#7e8486`, `#9fa5a7`) rather than warm grey
- Bold creator register — short-form-video-native, not enterprise-procurement

## 2. Color Palette & Roles

### Canvas

- **bg** `#ffffff` — the near-white studio canvas, the page's ground. The audit's body bg is transparent, resolving to page white. Never dark.
- **bg-cool** `#f5f9fa` (`--color-bone` / `--color-gray-10`) — coolest near-white; upload tiles, insets, hero work surfaces.
- **surface** `#eef4f6` (`--color-gray-50`) — raised pill / chip surface; this is the grey "Add style" CTA chrome.
- **surface-100** `#e8eff2` (`--color-gray-100` / `--color-light-gray`) — nested panel ground.
- **surface-150** `#dfe5e7` (`--color-gray-150`) — divider band and quiet section separation.

### Text

- **text** `#1d1f20` (`--color-charcoal` / `--color-gray-900`) — primary body and most headings. Warm-neutral near-black.
- **text-h1** `#2a2c2d` (`--color-gray-800`) — the display-heading color sampled live on the hero h1/h2.
- **text-strong** `#141515` (`--color-gray-950`) — the heaviest text, for maximum emphasis.
- **text-muted** `#595e5e` (`--color-gray-600`) — secondary copy, sub-labels.
- **text-soft** `#7e8486` (`--color-gray` / `--color-gray-500`) — captions, metadata, eyebrows.
- **text-faint** `#9fa5a7` (`--color-gray-400`) — placeholder, helper text.
- **text-disabled** `#bec3c6` (`--color-gray-300`) — disabled microcopy.

### Brand

- **brand** `#6c4df7` (`--color-violet`) — the primary accent. Anchors the color system and carries the strongest CTA / link. The audit missed it because the hero chrome is intentionally grey; the brand color lives in the accent layer.
- **brand-purple** `#ab88fb` (`--color-purple`) — soft violet tint for washes and illustration.
- **brand-dark** `#160f31` (`--color-dark-purple`) — deep-violet ground for inverted hero blocks and the violet-hover state.
- **on-brand** `#ffffff` — white label on the violet pill. The high-contrast action pair.

### Accent (the `--color-*` Crayon Box — the real identity)

This is where Captions lives. The accents are deployed one-per-element as a sticker pack, not blended into a single gradient.

- **accent-sea** `#00d0ff` (`--color-sea`) — primary cool accent, electric cyan.
- **accent-sky** `#a6ecff` (`--color-sky`) — pale cyan wash.
- **accent-air** `#effbff` (`--color-air`) — faintest cyan tint for card grounds.
- **accent-sunset** `#f99f3f` (`--color-sunset`) — warm orange, primary warm accent.
- **accent-peach** `#ffca9f` (`--color-peach`) — soft orange wash.
- **accent-cloud** `#ffcfcf` (`--color-cloud`) — pale pink wash.
- **accent-barbie-pink** `#ff1476` (`--color-barbie-pink`) — hot magenta, the loudest accent.
- **accent-pink** `#ff9bb2` (`--color-pink`) — soft rose.
- **accent-meadow** `#5bf6bb` (`--color-meadow`) — mint green.
- **accent-green** `#46e7b4` (`--color-green`) — teal-green.
- **accent-lime** `#aaff4e` (`--color-lime-green`) — electric lime.
- **accent-yellow** `#fcff41` (`--color-yellow`) — highlighter yellow.
- **accent-mustard** `#ffdd33` (`--color-mustard`) — warm yellow.

The discipline: **one accent per element, neutral chrome around it.** A category tag is barbie-pink; the card next to it is air-cyan; the illustration uses sunset and meadow — but the buttons, inputs, and surfaces between them stay grey or white. The variety reads as energy because the canvas absorbs it.

### Interactive

- **link** `#6c4df7` — violet body links.
- **link-hover** `#160f31` — deep-violet on hover.
- **cta-chrome-bg** `#eef4f6` — the grey "Add style" pill. Chrome, not brand — intentionally quiet.
- **cta-tile-bg** `#f5f9fa` — the grey "Import or drag your video" upload tile.

### Neutral Scale

A cool grey-blue ramp (not warm grey): `#f5f9fa` → `#eef4f6` → `#e8eff2` → `#dfe5e7` → `#d0d6d7` → `#bec3c6` → `#9fa5a7` → `#7e8486` → `#595e5e` → `#434647` → `#2a2c2d` → `#1d1f20` → `#141515`. The faint blue lean (B slightly above R/G) keeps the neutrals from feeling like a print document and ties them to the cyan/sky accents.

### Surface & Borders

- **surface-0 (page)** `#ffffff` white.
- **surface-1 (inset)** `#f5f9fa` coolest near-white.
- **surface-2 (chip/card)** `#eef4f6` grey chrome surface.
- **border** `#dfe5e7` (`--color-gray-150`) — default hairline.
- **border-strong** `#d0d6d7` (`--color-gray-200`) — stronger separation, dashed upload-tile edge.
- **border-subtle** `#e8eff2` (`--color-gray-100`) — quietest rule.
- **border-brand** `rgba(108, 77, 247, 0.32)` — violet-tinted focus hairline.

### Shadow Colors

Depth is **near-flat**. Captions leans on tonal layering (white → `#f5f9fa` → `#eef4f6`) and hairlines far more than drop shadows. When a shadow appears it's a soft charcoal-tinted diffuse lift — `rgba(29, 31, 32, 0.04)` to `0.12` — never colored, never hard. The brand never uses neon-glow shadows; color stays in fills and washes, depth stays neutral.

### Semantic

- **success** — bg `#ebfdf2` (soft mint, `hsl(143,85%,96%)`), text `#0e663b` (`--color-dark-green`).
- **info** — bg `#eff7ff` (soft sky, `hsl(208,100%,97%)`), text `#00b7e4` (`--color-medium-blue`).
- **warning** — bg `#fffcef` (soft cream, `hsl(49,100%,97%)`), text `#e07300` (`--color-orange`).
- **danger** — bg `#fff0f0` (soft red, `hsl(359,100%,97%)`), text `#d00000` (`--color-red`).

Each semantic state pulls its text color from a named `--color-*` var and pairs it with a 96–97% lightness wash of the same hue — consistent with the system's habit of treating every color as a named token rather than an ad-hoc value.

## 3. Typography Rules

### Font Family

- **Display**: `Exposure, system-ui, -apple-system, sans-serif` — a tall, confident grotesque used for every heading. Weights 500 / 600 / 700. Poster-scale presence at 48–80px.
- **Body**: `DenimINK, system-ui, -apple-system, sans-serif` — a humanist working sans for body copy and UI. Weights 400 / 500 / 600. Friendly and calm.
- **Mono**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace` — system mono for code, timecodes, and tabular data.
- **OpenType features**: `liga`, `kern` on Exposure and DenimINK; `tnum`, `zero` on mono for timecodes and stats.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | Exposure | 80px | 700 | 1.0 | -0.03em | Largest hero variant |
| Display Large | Exposure | 56px | 700 | 1.05 | -0.02em | Section intro at scale |
| H1 | Exposure | 48px | 700 | 1.1 | -0.018em | The canonical live hero size |
| H2 | Exposure | 32px | 600 | 1.2 | -0.012em | Major section heading |
| H3 | Exposure | 24px | 600 | 1.25 | -0.005em | Sub-section heading |
| H4 | DenimINK | 20px | 600 | 1.3 | 0 | Card heading (switches to body face) |
| H5 | DenimINK | 17px | 600 | 1.35 | 0 | Inline emphasis heading |
| Eyebrow | DenimINK | 13px | 600 | 1.4 | 0.08em | Uppercase section pre-label |
| Body Large | DenimINK | 18px | 400 | 1.55 | 0 | Lede paragraph |
| Body | DenimINK | 16px | 400 | 1.55 | 0 | Default body copy |
| Body Small | DenimINK | 14px | 400 | 1.5 | 0 | Captions, sidebars |
| Label | DenimINK | 13px | 500 | 1.4 | 0 | UI labels, form labels |
| Caption | DenimINK | 12px | 500 | 1.4 | 0.02em | Image captions, metadata |
| Button | DenimINK | 15px | 600 | 1.0 | 0 | CTA copy |
| Mono / Timecode | Mono | 13px | 400 | 1.5 | 0 | Timecodes, stats, code |

### Principles

- **Two faces, clean split.** Exposure owns display (h1–h3, 24px and up); DenimINK owns body, UI, and smaller headings (h4 and down). The handoff at h4 keeps headings legible at small sizes where a poster grotesque would feel stiff.
- **Exposure is poster-scale or nothing.** The display face earns its tall, confident proportions at 48–80px. Don't deploy it under 24px — that's DenimINK's job.
- **Negative tracking tightens with size.** -0.03em at 80px, -0.018em at 48px, easing to 0 by h3. Large headlines pull together; body copy sits at normal tracking.
- **Heading weight tops out at 700, mostly 600.** H1/display hit 700; h2/h3 sit at 600. Captions doesn't go heavier — the height of Exposure carries presence without extra weight.
- **Body at 16px / 1.55.** Standard, comfortable, web-app-native. Lede paragraphs bump to 18px. Captions stays at the SaaS-standard body size rather than the editorial 17–18px.
- **Eyebrows are uppercase DenimINK at 0.08em tracking.** Section pre-labels are the one place body type gets wide tracking; everything else stays at 0.
- **Tabular data and timecodes go mono.** Stats, durations, and code use the system mono stack with `tnum` so columns align — important for a video tool full of timecodes.

## 4. Component Stylings

### Buttons

**Primary (Violet Pill)**
- Background: `#6c4df7` violet. Text: `#ffffff`, DenimINK 600 / 15px.
- Padding: `12px 22px`. Radius: `9999px` (full pill). No border.
- Hover: bg → `#160f31` deep-violet; transition `240ms ease-standard`.
- Use: The strongest CTA — *Get started, Try Captions free, Sign up.* This is the brand accent applied to action.

**Chrome (Grey Pill)**
- Background: `#eef4f6` grey. Text: `#2a2c2d`, DenimINK 600 / 15px.
- Padding: `12px 22px`. Radius: `9999px`. No border.
- Hover: bg → `#e8eff2`.
- Use: The quiet hero pill (the live "Add style" button). Chrome, not brand — desaturated on purpose so the accent system carries identity.

**Upload Tile (Grey Dashed)**
- Background: `#f5f9fa` coolest near-white. Text: `#1d1f20`, DenimINK 500 / 16px. Border: `1px dashed #d0d6d7`. Radius: `12px`.
- Padding: `16px 20px`.
- Hover: bg → `#eef4f6`; dashed border deepens.
- Use: Drag-drop / file-pick (the live "Import or drag your video" tile). Inviting, neutral, friendly.

**Ghost (Quiet)**
- Background: transparent. Text: `#1d1f20`. No border.
- Padding: `10px 16px`. DenimINK 500 / 15px.
- Hover: text → `#6c4df7` violet.
- Use: Nav links, footer secondary actions.

### Cards

**Default Card**
- Background: `#f5f9fa` coolest near-white. Border: `1px solid #dfe5e7` hairline. Radius: `12px`. Padding: `24px`.
- Shadow: none (tonal lift only).
- Hover: border → `#d0d6d7`; gentle 4px charcoal-tinted shadow.
- Use: Default feature card, barely lifted from the white canvas.

**Accent-Washed Card**
- Background: one accent tint — `#effbff` air, `#a6ecff` sky, `#ffca9f` peach, `#ffcfcf` cloud, or a meadow/sky wash. Border: none. Radius: `16px`. Padding: `24px`.
- Use: Color-forward feature blocks. One tint per card; never mix two accent washes in a single card.

### Inputs / Forms

- Background: `#ffffff`. Border: `1px solid #dfe5e7`. Radius: `8px`. Padding: `10px 14px`.
- Font: DenimINK 400 / 16px. Placeholder: `#9fa5a7`.
- Focus: `0 0 0 2px rgba(108, 77, 247, 0.32)` violet ring, border → `#6c4df7`.
- Error: border → `#d00000`, helper text `#d00000` on `#fff0f0`.
- Helper: caption 12px `#7e8486` below the field.

### Badges, Tags, Pills

**Eyebrow Label** — no chrome, just type. DenimINK 600 / 13px / uppercase / 0.08em, color `#7e8486`. Above section headings.

**Accent Tag** — bg `#6c4df7` violet (or any single `--color-*` accent), text `#ffffff`, radius `9999px`, padding `5px 12px`, DenimINK 600 / 12px. Category and status chips — each can take a different accent hue.

**Soft-Wash Chip** — bg an accent tint (`#effbff` / `#a6ecff` / `#ffca9f`), text the matching darker hue, radius `9999px`. Quieter category labels.

### Navigation

- Header height `64px`. Background `#ffffff` (subtle blur + hairline on scroll).
- Logo: Captions wordmark in charcoal `#1d1f20`.
- Nav links: DenimINK 500 / 15px, color `#1d1f20`, padding `8px 12px`. Hover → `#6c4df7` violet.
- Right-side CTA pair: ghost "Log in" + violet pill "Get started".
- Mobile: hamburger sheet (right-aligned trigger), links stack at 20px DenimINK 600.

### Optional Components

**Tooltip** — bg `#1d1f20` charcoal, text `#ffffff`, radius `8px`, padding `8px 12px`, DenimINK 500 / 13px.

**Modal** — bg `#ffffff`, radius `16px`, shadow `rgba(29, 31, 32, 0.12) 0 24px 48px -16px`, max-width `560px`. White backdrop overlay at ~60% with blur.

**Code / Timecode Block** — Mono 13px, bg `#f5f9fa`, radius `8px`, padding `12px 16px`, border `#e8eff2`. Inline code: same font, bg `#eef4f6`, padding `2px 6px`, radius `4px`.

## 5. Layout Principles

### Spacing System

- **Base unit**: 4px.
- **Scale**: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96 — a compact, web-app-native ramp.
- **Density observation**: Captions runs moderately tight for a marketing site — closer to a product UI than a magazine. Headlines sit on 48–64px margins; intra-section spacing uses 16–24px.

### Grid & Container

- **Page max width**: `1280px`.
- **Site gutter**: `clamp(20px, 5vw, 56px)`.
- **Grid**: 12 columns. Hero blocks span full width; feature rails span 4–6 columns; the product preview / upload surface anchors the hero right.
- **Hero treatment**: near-white ground, Exposure h1 at 48px, grey upload tile + grey "Add style" pill, accent-colored illustration or in-product preview alongside.

### Whitespace Philosophy

The near-white canvas runs continuously; sections are separated by tonal shifts (white → `#f5f9fa`) and hairline rules rather than dark bands. Section gutters run **80–120px** between major blocks; minor blocks sit on 48–64px gaps. Color enters as accent washes and illustrations inside the rhythm, never as full-bleed dark interruptions on the marketing surface.

### Section Cadence

- Hero (near-white + Exposure h1 + grey upload chrome + accent illustration) → Feature Grid (3-up default cards on `#f5f9fa`) → Color-Washed Feature Spread (accent-tint cards, one hue each) → Social Proof / Creator Testimonials → Product Walkthrough (in-product previews) → Pricing → FAQ → Footer.
- The canvas stays light throughout; the deep-violet `#160f31` ground appears only in select hero or CTA-band blocks as a contrast moment.
- Accent color is the punctuation; the grey chrome is the structure.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Inline chip corners, hairline detail |
| Small (sm) | 4px | Inline code, small inputs, tight chips |
| Medium (md) | 8px | Inputs, secondary buttons, dropdowns |
| Relaxed (lg) | 12px | Upload tiles, default cards |
| Large (xl) | 16px | Accent-washed cards, modals |
| Pill | 9999px | Primary CTA, chrome pills, tags |

Captions' signature radii: **9999px pills for CTAs and tags / 12px for tiles and cards / 8px for inputs.** The page is decisively rounded and friendly — there are no sharp 0px corners on interactive surfaces. The full-pill CTA is a creator-friendly choice that reads softer than a squared button. Mixed radii within a single primitive are avoided.

## 7. Depth & Elevation

| Level | Treatment | Use |
|---|---|---|
| 0 | Flat — no shadow | Default page surface, hero, body sections |
| 1 | Tonal layering (`#f5f9fa` on `#ffffff`) | Default cards, insets, upload tiles |
| 2 | Hairline + tonal (`1px #dfe5e7`) | Bordered cards, panels |
| 3 | `rgba(29, 31, 32, 0.06) 0 4px 12px` | Sticky nav, dropdowns, hover-lifted cards |
| 4 | `rgba(29, 31, 32, 0.08) 0 12px 28px -10px` | Popovers, floating menus |
| 5 | `rgba(29, 31, 32, 0.12) 0 24px 48px -16px` | Modals, dialogs |

### Shadow Philosophy

Captions' depth comes from **tonal layering and hairlines first, shadows second.** White → `#f5f9fa` → `#eef4f6` gives a three-tier surface ladder that separates elements without any shadow at all. When shadows appear they're soft, diffuse, and charcoal-tinted (`rgba(29, 31, 32, …)`) — never colored, never hard, never glowing. This matters: the accent palette is loud, so the depth language stays quiet and neutral to keep the page from feeling chaotic. Color goes in fills and washes; elevation stays grey.

## 8. Interaction & Motion

### Easing Curves

- `ease-standard`: `cubic-bezier(0.4, 0, 0.2, 1)` — Material-style; default for hover, focus, and color transitions.
- `ease-emphasized`: `cubic-bezier(0.2, 0, 0, 1)` — punchier exit; modal enter, hero reveal.

### Duration Buckets

- **Fast (150ms)** — color transitions, focus rings, link hovers.
- **Standard (240ms)** — button hover, card hover, dropdown reveal.
- **Slow (320ms)** — modal enter/exit, section fade-in.

### Per-Component Micro-States

- **Button hover (violet pill)**: bg `#6c4df7` → `#160f31` over 240ms ease-standard. No scale.
- **Button hover (grey chrome)**: bg `#eef4f6` → `#e8eff2`.
- **Upload-tile hover**: bg `#f5f9fa` → `#eef4f6`; dashed border darkens.
- **Card hover**: border `#dfe5e7` → `#d0d6d7`; 4px charcoal shadow fades in.
- **Link hover**: color → `#6c4df7` over 150ms.
- **Input focus**: 2px violet ring `rgba(108, 77, 247, 0.32)` fades in over 150ms; border darkens to violet.

### Page Transitions

Sections fade in on scroll via `IntersectionObserver` at ~80% viewport, 320ms, with a small 16px translate-up. Hero text reveals on load over 320ms. Accent illustrations may animate subtly (a sticker pops, a wash drifts) but the chrome stays still — motion follows the same rule as color, living in the decoration layer.

### Reduced Motion

`@media (prefers-reduced-motion: reduce)` — all transitions become opacity-only, durations halved. Translate-ins, scroll reveals, and any sticker/wash animation are disabled; sections snap to final state.

## 9. Accessibility & A11y

### Contrast Pairs

- **`#1d1f20` text on `#ffffff` bg**: 15.6:1 — AAA at all sizes. The primary reading pair.
- **`#2a2c2d` h1 on `#ffffff` bg**: 13.1:1 — AAA at all sizes. The live display-heading color.
- **`#595e5e` muted on `#ffffff` bg**: 6.9:1 — AA at all sizes (AAA at large). Secondary copy.
- **`#7e8486` soft on `#ffffff` bg**: 4.0:1 — AA at large sizes / metadata only; keep at 14px+ or use sparingly for captions.
- **`#ffffff` on `#6c4df7` violet button**: 5.0:1 — AA at body sizes, AAA at large. The primary CTA pair is safe; the 15px / 600 button copy clears AA.
- **`#1d1f20` on `#eef4f6` grey chrome pill**: 14.2:1 — AAA. The quiet grey CTAs are highly legible.

Note on accents: the brighter `--color-*` hues (sea `#00d0ff`, yellow `#fcff41`, lime `#aaff4e`) are decorative and **must not** carry small body text on white — they fail contrast badly. Use them as fills, washes, and large illustration color only; pair text with charcoal or the darker semantic-text hues.

### Focus Indicators

- Default focus ring: `0 0 0 2px rgba(108, 77, 247, 0.32)` violet with 2px offset on the near-white canvas.
- On the deep-violet `#160f31` ground: switch to a `#ffffff` or `#a6ecff` ring for visibility.
- Every interactive surface has a visible focus state — no `outline: none` without a replacement.

### ARIA Patterns

- **Navigation**: `<nav aria-label="Main">` with a skip-link to main content.
- **Disclosure**: `<button aria-expanded aria-controls>` for collapsible FAQ and feature sections.
- **Dialog**: `role="dialog" aria-modal="true" aria-labelledby` with focus trap and Esc-to-close.
- **File upload**: the drag-drop tile is a real `<button>` / labeled `<input type="file">` with `aria-label`; drag state announced via `aria-live="polite"`.
- **Live regions**: `aria-live="polite"` for upload progress and form validation.

### Keyboard Navigation

- Tab order matches visual flow: skip-link → nav → hero CTA / upload tile → main content → footer.
- All buttons, links, inputs, and the upload tile reachable via Tab; modals trap focus until dismissed.
- `Esc` closes modals and the mobile menu sheet.
- The upload tile accepts both click/Enter and a standard file picker — never drag-only.

### Screen Reader Hints

- Decorative accent stickers and washes are `aria-hidden`; the color is ornamental, the text is functional.
- In-product preview images have descriptive `alt` or `<figcaption>`.
- Icon-only buttons have `aria-label`.
- The Captions wordmark uses `aria-label="Captions"`.

### Reduced Motion

Honoured via the global media query — translate/scale animations become opacity-only, durations halve, and decorative sticker/wash motion is disabled entirely.

## 10. Responsive Behavior

### Breakpoints

| Name | Width | Use |
|---|---|---|
| Mobile | < 640px | Single column, full-bleed sections, 32px H1 |
| Tablet | 640–1024px | 2-column rails, 40px H1 |
| Desktop | 1024–1280px | Full 12-col grid, 48px hero, 720px prose |
| Wide | 1280–1536px | Site max width hits |
| Ultra | > 1536px | Page locks to 1280, gutters expand |

### Touch Targets

- Minimum tap target: 44×44px (WCAG AAA).
- Buttons: 44px minimum height on mobile.
- The upload tile gets a generous tap area on mobile (full-width, 56px+ tall) since it's the primary action.

### Collapsing Strategy

- **Header**: full nav at ≥1024px; hamburger sheet below (right-aligned trigger).
- **Hero**: 80px display → 56px → 48px → 40px → 32px H1 across breakpoints. Exposure scales down but never switches face.
- **Feature grid**: 3-up at desktop, 2-up at tablet, 1-up at mobile.
- **Body width**: 720px → fluid 90vw at mobile.
- **Accent-washed cards**: full-width on mobile; preserve 16px radius and interior padding.
- **Section spacing**: 120px → 80px → 48px across sizes.

### Image Behavior

- In-product previews use `srcset` 1x/2x/3x; aspect-ratio enforced to prevent layout shift.
- Below-fold imagery is lazy-loaded; hero is eager.
- Accent washes are CSS color (no images) so they render instantly.

### Container Queries

Used inside feature cards to switch icon position (icon-left vs. icon-top) when card width crosses ~320px, and inside FAQ rows to stack meta below the question on narrow containers.

## 11. Content & Voice

### Tone

**Bold, direct, creator-native.** Captions writes to people who make short-form video for a living — confident, energetic, no enterprise hedging. Headlines are punchy and benefit-first ("AI that edits like a professional editor"); the voice assumes the reader is a creator who wants to post more and edit less. It's the opposite of dev-tool dryness or enterprise gravity.

### Microcopy Patterns

- **Button verbs**: "Get started," "Try Captions free," "Import or drag your video," "Add style." Action-first, sentence case, never all-caps-urgent.
- **Error messages**: "That file didn't upload — try a shorter clip or a different format." Plain, helpful, low-stakes.
- **Success confirmations**: "Done." "Your video's ready." Brief and energetic.
- **Loading states**: "Editing your video…" "Adding captions…" — context-specific, AI-aware.

### Empty States

What they say: name the state, point to the action. *"No projects yet. Import or drag a video to get started."*
What they don't say: apologetic "Oops!" / "Whoops!" exclamations. Empty is the normal starting point, not a failure.

### CTA Verb Conventions

- Primary on hero: "Get started," "Try Captions free"
- Secondary: "Add style," "See examples," "Watch the demo"
- Footer: "Read the blog," "Help center," "Log in"

The brand favors creator-energy verbs over scarcity ("Sign up now!" / "Limited time!"). The pitch is capability and speed, not pressure.

## 12. Dark Mode & Theming

**Partial — the marketing surface is light-only on the near-white canvas.** The brand identity is the bright `#ffffff` → `#f5f9fa` studio canvas with charcoal text; the marketing site does not ship a full inverted dark theme. The cool near-white ground and the charcoal text are the defining choices.

That said, Captions' color system is engineered for inversion. The `--color-dark-purple` `#160f31` and `--color-gray-950` `#141515` exist precisely so select hero and CTA-band blocks can drop to a deep-violet/charcoal ground for contrast moments, and so the in-product video editor can run a dark workspace. On those dark grounds, the `--color-*` accent palette is calibrated to stay vivid (sea, sunset, barbie-pink, meadow all read well on `#160f31`), text flips to `#ffffff`, and focus rings switch from violet to white or sky.

The rule for a downstream dark companion: keep the accent vars at full saturation, swap the near-white canvas for `#160f31` deep-violet (or `#141515` charcoal), lift surfaces to `#1d1f20` → `#2a2c2d`, flip text to white, and re-key the grey chrome pills to a translucent white. The page-level marketing surface, however, stays light.

## 13. Lineage & Influences

Captions' design DNA is **creator-tool color maximalism on a calm canvas**. The strategic move is to reject the dark-slab, chrome-on-black register that dominates AI video (Runway, Pika, Kapwing) and instead present a bright near-white studio — closer to Figma or a modern design tool than to a "generative AI" product. The signature is the `--color-*` crayon box: rather than one or two brand colors, Captions declares a full named palette (sea, sky, sunset, cloud, meadow, barbie-pink, yellow, peach, lime, violet, and more) and treats it as a reusable sticker pack scattered across illustration, tags, and washes. Violet `#6c4df7` anchors the system, but the variety itself is the brand.

What it inherits and borrows: Figma's named multi-hue color system and bright creative-tool canvas; Descript's category-defiant choice of a warm light canvas over dark AI-tool chrome; Linear's restraint in keeping functional chrome quiet (grey) so accent color does the talking; Framer's playful accent washes over a clean near-white marketing surface. What it rejects, deliberately: chrome-on-black slabs, neon-on-slate gradients, moody darkness, and the whole "generative AI = dark and futuristic" visual cliché. Where its competitors signal "powerful technology," Captions signals "fun, fast, made-for-creators."

**Named influences:**

- **Gaurav Misra (co-founder & CEO, Captions)** — Product and brand direction toward a creator-native, color-forward identity. *https://www.captions.ai/about*
- **Figma** — Multi-hue named-color system and bright near-white canvas as a creative-tool register. *https://www.figma.com*
- **Descript** — AI-video peer that also rejects dark-slab chrome for a warm, editorial light canvas. *https://www.descript.com*
- **Linear** — Tight type and restrained grey chrome that lets accent color do the talking. *https://linear.app*
- **Framer** — Playful gradient/accent washes over a clean near-white marketing surface. *https://www.framer.com*
- **Runway / Pika** — Chrome-on-black AI-video contemporaries Captions deliberately differentiates against. *https://runwayml.com*

## 14. Do's and Don'ts

### Do

- **Do** keep the canvas near-white — `#ffffff` cooled to `#f5f9fa` / `#eef4f6`. The bright studio ground is the brand differentiator versus dark AI-video tools.
- **Do** treat the `--color-*` palette as a sticker pack — one accent per element, scattered across illustration, tags, and washes.
- **Do** anchor the system with violet `#6c4df7` on the strongest CTA and links, but let the whole crayon box carry the energy.
- **Do** keep functional chrome (upload tile, "Add style" pill, inputs) grey and quiet so the accent system reads as the identity.
- **Do** set headlines in Exposure at 48px and up — poster-scale, weight 600–700, tight negative tracking.
- **Do** keep body in DenimINK at 16px / 1.55 — humanist and calm.
- **Do** use full-pill (9999px) CTAs and 12px tiles/cards — the page is decisively rounded and friendly.
- **Do** pair bright accents only with charcoal or matching dark semantic text; keep accents in fills and washes.
- **Do** prefer tonal layering and hairlines over shadows; when shadows appear, keep them soft and charcoal-tinted.
- **Do** keep the cool grey-blue neutral ramp (`#7e8486`, `#9fa5a7`) rather than warm grey.

### Don't

- **Don't** ship a dark slab on the marketing surface. The near-white canvas is the category-defying choice; dark blocks are only for select contrast moments.
- **Don't** color the hero chrome. The upload tile and "Add style" pill are grey on purpose — making them violet would collapse the color strategy.
- **Don't** blend the accents into one gradient identity. They're a sticker pack, not a palette gradient — keep them one-per-element.
- **Don't** put small body text on bright accent fills (sea, yellow, lime) on white — they fail contrast. Use them as decoration only.
- **Don't** use Exposure below 24px. Drop to DenimINK for h4 and smaller.
- **Don't** go heavier than 700 on headings or use warm grey neutrals; the system is cool-grey + Exposure presence.
- **Don't** use hard or colored/neon-glow shadows. Depth stays neutral and soft so the loud color doesn't read as chaos.
- **Don't** square the corners. Sharp 0px edges fight the friendly, rounded, creator register.
- **Don't** let a single hue monopolize the page. The variety is the brand — over-using violet alone makes it generic SaaS.
- **Don't** adopt scarcity/urgency voice ("Sign up now!"). The tone is creator-energy and capability, not pressure.

## 15. Agent Prompt Guide

### Quick Color Reference

```
bg: #ffffff
bg-cool: #f5f9fa
surface (grey chrome): #eef4f6
text: #1d1f20
text-h1: #2a2c2d
brand-violet: #6c4df7
brand-violet-hover: #160f31
accent-sea: #00d0ff
accent-sunset: #f99f3f
accent-barbie-pink: #ff1476
accent-meadow: #5bf6bb
accent-yellow: #fcff41
border: #dfe5e7
```

### Example Component Prompts

1. **"Create a hero in Captions style — near-white `#ffffff` canvas, 48px H1 in Exposure at weight 700 with `-0.018em` tracking in charcoal `#2a2c2d`, 16px DenimINK body in `#1d1f20` at 1.55 line-height. Lay out a grey upload tile (`#f5f9fa`, 12px radius, 1px dashed `#d0d6d7` border, label 'Import or drag your video') next to a grey 'Add style' pill (`#eef4f6`, 9999px). Add one bright accent illustration using sea `#00d0ff` and sunset `#f99f3f`. The buttons stay grey — color lives in the illustration."**

2. **"Design the primary CTA in Captions style — violet `#6c4df7` full pill (9999px radius), white DenimINK 600 / 15px label, 12×22px padding, hover to deep-violet `#160f31`. This is the only place the brand accent touches a button; everything else is grey chrome."**

3. **"Build an accent-washed feature card — soft cyan `#effbff` (or sky `#a6ecff` / peach `#ffca9f`) background, no border, 16px radius, 24px padding, 20px DenimINK 600 charcoal heading, 16px DenimINK 400 body. One accent tint per card; never mix two washes in one card."**

4. **"Make a category tag row — each tag a full pill (9999px) in a different `--color-*` accent (violet, barbie-pink, meadow, sunset), white 12px DenimINK 600 text, 5×12px padding. Treat them as a sticker pack — variety is the point."**

5. **"Create the primary nav — 64px header, white `#ffffff` background with hairline `#dfe5e7` on scroll, Captions wordmark in charcoal `#1d1f20`, links 15px DenimINK 500 with violet-on-hover, right-aligned ghost 'Log in' + violet pill 'Get started'."**

6. **"Render a default feature card — `#f5f9fa` background, 1px `#dfe5e7` hairline, 12px radius, 24px padding, no shadow, hover deepens border to `#d0d6d7` and adds a soft 4px charcoal-tinted shadow. Keep it neutral — let any accent color come from the icon or illustration inside."**

### Iteration Guide

1. **Start near-white, not dark.** If the canvas is `#000` or chrome-on-black, you've drifted into Runway/Pika territory. The bright `#ffffff` → `#f5f9fa` studio ground is the entry ticket.
2. **Keep the load-bearing chrome grey.** Upload tiles, "Add style" pills, inputs — desaturate them to `#f5f9fa` / `#eef4f6`. If your buttons are violet everywhere, the color strategy has collapsed.
3. **Deploy the crayon box as a sticker pack.** Add the `--color-*` accents one-per-element across illustration, tags, and washes — sea, sunset, barbie-pink, meadow, yellow. Variety, not a single brand color, is the look.
4. **Anchor with violet, don't monopolize with it.** `#6c4df7` carries the strongest CTA and links; the rest of the energy is spread across the palette.
5. **Headlines in Exposure at 48px+, body in DenimINK at 16px.** Sans display under 24px or warm-grey neutrals both pull the brand toward generic SaaS.
6. **Round everything.** Full-pill CTAs (9999px), 12px tiles and cards, 8px inputs. Sharp corners break the friendly creator register.
7. **Keep depth neutral.** Tonal layering and hairlines first; soft charcoal-tinted shadows only when needed. The color is loud, so the elevation stays quiet.
8. **Calm the voice, keep the energy.** Creator-direct verbs ("Get started," "Import or drag your video") over scarcity ("Sign up now!"). Confident, fast, made-for-creators.

---

*Theme-toggle audit: score=0, signals=[none]*
Prose

1. Visual Theme & Atmosphere

Captions opens on a near-white studio canvas. The page background is white #ffffff, cooled to #f5f9fa and #eef4f6 on raised surfaces, and the text is a charcoal #1d1f20 that reads warm-neutral rather than terminal-cold. Headlines are set in Exposure — a tall, confident grotesque sans rendered at 48px on the live hero and scaling up to 80px in the largest display variant — while body copy runs in DenimINK, a humanist working sans at 16px on a 1.55 line-height. The first impression is light, roomy, and bright: a creator’s desktop with the lights on, not a developer console at midnight.

What makes Captions visually distinctive is its chromatic strategy. Most of its category — Runway, Pika, Kapwing, the whole AI-video cohort — reaches for chrome-on-black, neon-on-slate, or moody gradient darkness. Captions does the opposite. It keeps the canvas near-white and then unloads a full crayon box of color as CSS variables: --color-sea cyan #00d0ff, --color-sunset orange #f99f3f, --color-barbie-pink magenta #ff1476, --color-meadow mint #5bf6bb, --color-yellow highlighter #fcff41, plus sky, cloud, peach, lime, purple and a dozen more. These hues aren’t blended into one gradient identity; they’re treated as a reusable sticker pack, dabbed across illustrations, category tags, accent washes, and emoji-adjacent UI flourishes. The violet #6c4df7 (--color-violet) is the primary accent that anchors the system and carries the strongest CTA, but no single color owns the page. The brand is the variety.

The most important compositional decision is what is not colored. The hero’s functional chrome — the “Import or drag your video” upload tile (grey #f5f9fa, 12px radius) and the “Add style” pill (grey #eef4f6, fully rounded) — is deliberately desaturated. On a lesser site these would be the violet buttons screaming for attention. Here they’re quiet grey, because the accent system is doing the identity work. This is a subtle, expert move: the page reads as colorful and energetic even though its load-bearing UI is neutral, because color lives in the decoration layer while chrome stays calm. Read the grey CTAs as plumbing, not personality.

The register is bold, playful, and creator-native. Exposure at display sizes feels like a poster headline; the accent palette feels like the stickers and gradients a short-form creator would layer onto their own video. Atmospheric vocabulary that captures the feeling: near-white studio, crayon-box accents, sticker-pack palette, violet-anchor, grey-chrome-quiet, Exposure-poster-display, DenimINK-humanist-body, creator-desktop, short-form-native, multi-hue-energy, light-and-bright, color-as-decoration. Captions looks like the tool that the people who live on the For You page would actually want open on their screen.

Key Characteristics

  • Near-white canvas #ffffff cooled to #f5f9fa / #eef4f6 on surfaces — never dark, never pure-grey
  • Charcoal text #1d1f20 — warm-neutral, AAA on white at 15.6:1
  • Exposure display grotesque at 48px (hero) up to 80px — tall, confident, poster-scale
  • DenimINK body sans at 16px / 1.55 — humanist, friendly, calm reading texture
  • A full --color-* crayon box (sea, sunset, barbie-pink, meadow, yellow, sky, cloud, peach, lime, purple) as the real brand identity
  • Violet #6c4df7 as the primary accent that anchors the system without monopolizing it
  • Deliberately grey hero chrome (upload tile + “Add style” pill) — chrome is desaturated so color carries the brand
  • Color lives in the decoration layer (illustrations, tags, washes); UI chrome stays neutral
  • Pill (9999px) and 12px radii dominate — friendly, rounded, never sharp
  • Cool grey-blue neutral scale (#7e8486, #9fa5a7) rather than warm grey
  • Bold creator register — short-form-video-native, not enterprise-procurement

2. Color Palette & Roles

Canvas

  • bg #ffffff — the near-white studio canvas, the page’s ground. The audit’s body bg is transparent, resolving to page white. Never dark.
  • bg-cool #f5f9fa (--color-bone / --color-gray-10) — coolest near-white; upload tiles, insets, hero work surfaces.
  • surface #eef4f6 (--color-gray-50) — raised pill / chip surface; this is the grey “Add style” CTA chrome.
  • surface-100 #e8eff2 (--color-gray-100 / --color-light-gray) — nested panel ground.
  • surface-150 #dfe5e7 (--color-gray-150) — divider band and quiet section separation.

Text

  • text #1d1f20 (--color-charcoal / --color-gray-900) — primary body and most headings. Warm-neutral near-black.
  • text-h1 #2a2c2d (--color-gray-800) — the display-heading color sampled live on the hero h1/h2.
  • text-strong #141515 (--color-gray-950) — the heaviest text, for maximum emphasis.
  • text-muted #595e5e (--color-gray-600) — secondary copy, sub-labels.
  • text-soft #7e8486 (--color-gray / --color-gray-500) — captions, metadata, eyebrows.
  • text-faint #9fa5a7 (--color-gray-400) — placeholder, helper text.
  • text-disabled #bec3c6 (--color-gray-300) — disabled microcopy.

Brand

  • brand #6c4df7 (--color-violet) — the primary accent. Anchors the color system and carries the strongest CTA / link. The audit missed it because the hero chrome is intentionally grey; the brand color lives in the accent layer.
  • brand-purple #ab88fb (--color-purple) — soft violet tint for washes and illustration.
  • brand-dark #160f31 (--color-dark-purple) — deep-violet ground for inverted hero blocks and the violet-hover state.
  • on-brand #ffffff — white label on the violet pill. The high-contrast action pair.

Accent (the --color-* Crayon Box — the real identity)

This is where Captions lives. The accents are deployed one-per-element as a sticker pack, not blended into a single gradient.

  • accent-sea #00d0ff (--color-sea) — primary cool accent, electric cyan.
  • accent-sky #a6ecff (--color-sky) — pale cyan wash.
  • accent-air #effbff (--color-air) — faintest cyan tint for card grounds.
  • accent-sunset #f99f3f (--color-sunset) — warm orange, primary warm accent.
  • accent-peach #ffca9f (--color-peach) — soft orange wash.
  • accent-cloud #ffcfcf (--color-cloud) — pale pink wash.
  • accent-barbie-pink #ff1476 (--color-barbie-pink) — hot magenta, the loudest accent.
  • accent-pink #ff9bb2 (--color-pink) — soft rose.
  • accent-meadow #5bf6bb (--color-meadow) — mint green.
  • accent-green #46e7b4 (--color-green) — teal-green.
  • accent-lime #aaff4e (--color-lime-green) — electric lime.
  • accent-yellow #fcff41 (--color-yellow) — highlighter yellow.
  • accent-mustard #ffdd33 (--color-mustard) — warm yellow.

The discipline: one accent per element, neutral chrome around it. A category tag is barbie-pink; the card next to it is air-cyan; the illustration uses sunset and meadow — but the buttons, inputs, and surfaces between them stay grey or white. The variety reads as energy because the canvas absorbs it.

Interactive

  • link #6c4df7 — violet body links.
  • link-hover #160f31 — deep-violet on hover.
  • cta-chrome-bg #eef4f6 — the grey “Add style” pill. Chrome, not brand — intentionally quiet.
  • cta-tile-bg #f5f9fa — the grey “Import or drag your video” upload tile.

Neutral Scale

A cool grey-blue ramp (not warm grey): #f5f9fa#eef4f6#e8eff2#dfe5e7#d0d6d7#bec3c6#9fa5a7#7e8486#595e5e#434647#2a2c2d#1d1f20#141515. The faint blue lean (B slightly above R/G) keeps the neutrals from feeling like a print document and ties them to the cyan/sky accents.

Surface & Borders

  • surface-0 (page) #ffffff white.
  • surface-1 (inset) #f5f9fa coolest near-white.
  • surface-2 (chip/card) #eef4f6 grey chrome surface.
  • border #dfe5e7 (--color-gray-150) — default hairline.
  • border-strong #d0d6d7 (--color-gray-200) — stronger separation, dashed upload-tile edge.
  • border-subtle #e8eff2 (--color-gray-100) — quietest rule.
  • border-brand rgba(108, 77, 247, 0.32) — violet-tinted focus hairline.

Shadow Colors

Depth is near-flat. Captions leans on tonal layering (white → #f5f9fa#eef4f6) and hairlines far more than drop shadows. When a shadow appears it’s a soft charcoal-tinted diffuse lift — rgba(29, 31, 32, 0.04) to 0.12 — never colored, never hard. The brand never uses neon-glow shadows; color stays in fills and washes, depth stays neutral.

Semantic

  • success — bg #ebfdf2 (soft mint, hsl(143,85%,96%)), text #0e663b (--color-dark-green).
  • info — bg #eff7ff (soft sky, hsl(208,100%,97%)), text #00b7e4 (--color-medium-blue).
  • warning — bg #fffcef (soft cream, hsl(49,100%,97%)), text #e07300 (--color-orange).
  • danger — bg #fff0f0 (soft red, hsl(359,100%,97%)), text #d00000 (--color-red).

Each semantic state pulls its text color from a named --color-* var and pairs it with a 96–97% lightness wash of the same hue — consistent with the system’s habit of treating every color as a named token rather than an ad-hoc value.

3. Typography Rules

Font Family

  • Display: Exposure, system-ui, -apple-system, sans-serif — a tall, confident grotesque used for every heading. Weights 500 / 600 / 700. Poster-scale presence at 48–80px.
  • Body: DenimINK, system-ui, -apple-system, sans-serif — a humanist working sans for body copy and UI. Weights 400 / 500 / 600. Friendly and calm.
  • Mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace — system mono for code, timecodes, and tabular data.
  • OpenType features: liga, kern on Exposure and DenimINK; tnum, zero on mono for timecodes and stats.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Display HeroExposure80px7001.0-0.03emLargest hero variant
Display LargeExposure56px7001.05-0.02emSection intro at scale
H1Exposure48px7001.1-0.018emThe canonical live hero size
H2Exposure32px6001.2-0.012emMajor section heading
H3Exposure24px6001.25-0.005emSub-section heading
H4DenimINK20px6001.30Card heading (switches to body face)
H5DenimINK17px6001.350Inline emphasis heading
EyebrowDenimINK13px6001.40.08emUppercase section pre-label
Body LargeDenimINK18px4001.550Lede paragraph
BodyDenimINK16px4001.550Default body copy
Body SmallDenimINK14px4001.50Captions, sidebars
LabelDenimINK13px5001.40UI labels, form labels
CaptionDenimINK12px5001.40.02emImage captions, metadata
ButtonDenimINK15px6001.00CTA copy
Mono / TimecodeMono13px4001.50Timecodes, stats, code

Principles

  • Two faces, clean split. Exposure owns display (h1–h3, 24px and up); DenimINK owns body, UI, and smaller headings (h4 and down). The handoff at h4 keeps headings legible at small sizes where a poster grotesque would feel stiff.
  • Exposure is poster-scale or nothing. The display face earns its tall, confident proportions at 48–80px. Don’t deploy it under 24px — that’s DenimINK’s job.
  • Negative tracking tightens with size. -0.03em at 80px, -0.018em at 48px, easing to 0 by h3. Large headlines pull together; body copy sits at normal tracking.
  • Heading weight tops out at 700, mostly 600. H1/display hit 700; h2/h3 sit at 600. Captions doesn’t go heavier — the height of Exposure carries presence without extra weight.
  • Body at 16px / 1.55. Standard, comfortable, web-app-native. Lede paragraphs bump to 18px. Captions stays at the SaaS-standard body size rather than the editorial 17–18px.
  • Eyebrows are uppercase DenimINK at 0.08em tracking. Section pre-labels are the one place body type gets wide tracking; everything else stays at 0.
  • Tabular data and timecodes go mono. Stats, durations, and code use the system mono stack with tnum so columns align — important for a video tool full of timecodes.

4. Component Stylings

Buttons

Primary (Violet Pill)

  • Background: #6c4df7 violet. Text: #ffffff, DenimINK 600 / 15px.
  • Padding: 12px 22px. Radius: 9999px (full pill). No border.
  • Hover: bg → #160f31 deep-violet; transition 240ms ease-standard.
  • Use: The strongest CTA — Get started, Try Captions free, Sign up. This is the brand accent applied to action.

Chrome (Grey Pill)

  • Background: #eef4f6 grey. Text: #2a2c2d, DenimINK 600 / 15px.
  • Padding: 12px 22px. Radius: 9999px. No border.
  • Hover: bg → #e8eff2.
  • Use: The quiet hero pill (the live “Add style” button). Chrome, not brand — desaturated on purpose so the accent system carries identity.

Upload Tile (Grey Dashed)

  • Background: #f5f9fa coolest near-white. Text: #1d1f20, DenimINK 500 / 16px. Border: 1px dashed #d0d6d7. Radius: 12px.
  • Padding: 16px 20px.
  • Hover: bg → #eef4f6; dashed border deepens.
  • Use: Drag-drop / file-pick (the live “Import or drag your video” tile). Inviting, neutral, friendly.

Ghost (Quiet)

  • Background: transparent. Text: #1d1f20. No border.
  • Padding: 10px 16px. DenimINK 500 / 15px.
  • Hover: text → #6c4df7 violet.
  • Use: Nav links, footer secondary actions.

Cards

Default Card

  • Background: #f5f9fa coolest near-white. Border: 1px solid #dfe5e7 hairline. Radius: 12px. Padding: 24px.
  • Shadow: none (tonal lift only).
  • Hover: border → #d0d6d7; gentle 4px charcoal-tinted shadow.
  • Use: Default feature card, barely lifted from the white canvas.

Accent-Washed Card

  • Background: one accent tint — #effbff air, #a6ecff sky, #ffca9f peach, #ffcfcf cloud, or a meadow/sky wash. Border: none. Radius: 16px. Padding: 24px.
  • Use: Color-forward feature blocks. One tint per card; never mix two accent washes in a single card.

Inputs / Forms

  • Background: #ffffff. Border: 1px solid #dfe5e7. Radius: 8px. Padding: 10px 14px.
  • Font: DenimINK 400 / 16px. Placeholder: #9fa5a7.
  • Focus: 0 0 0 2px rgba(108, 77, 247, 0.32) violet ring, border → #6c4df7.
  • Error: border → #d00000, helper text #d00000 on #fff0f0.
  • Helper: caption 12px #7e8486 below the field.

Badges, Tags, Pills

Eyebrow Label — no chrome, just type. DenimINK 600 / 13px / uppercase / 0.08em, color #7e8486. Above section headings.

Accent Tag — bg #6c4df7 violet (or any single --color-* accent), text #ffffff, radius 9999px, padding 5px 12px, DenimINK 600 / 12px. Category and status chips — each can take a different accent hue.

Soft-Wash Chip — bg an accent tint (#effbff / #a6ecff / #ffca9f), text the matching darker hue, radius 9999px. Quieter category labels.

  • Header height 64px. Background #ffffff (subtle blur + hairline on scroll).
  • Logo: Captions wordmark in charcoal #1d1f20.
  • Nav links: DenimINK 500 / 15px, color #1d1f20, padding 8px 12px. Hover → #6c4df7 violet.
  • Right-side CTA pair: ghost “Log in” + violet pill “Get started”.
  • Mobile: hamburger sheet (right-aligned trigger), links stack at 20px DenimINK 600.

Optional Components

Tooltip — bg #1d1f20 charcoal, text #ffffff, radius 8px, padding 8px 12px, DenimINK 500 / 13px.

Modal — bg #ffffff, radius 16px, shadow rgba(29, 31, 32, 0.12) 0 24px 48px -16px, max-width 560px. White backdrop overlay at ~60% with blur.

Code / Timecode Block — Mono 13px, bg #f5f9fa, radius 8px, padding 12px 16px, border #e8eff2. Inline code: same font, bg #eef4f6, padding 2px 6px, radius 4px.

5. Layout Principles

Spacing System

  • Base unit: 4px.
  • Scale: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96 — a compact, web-app-native ramp.
  • Density observation: Captions runs moderately tight for a marketing site — closer to a product UI than a magazine. Headlines sit on 48–64px margins; intra-section spacing uses 16–24px.

Grid & Container

  • Page max width: 1280px.
  • Site gutter: clamp(20px, 5vw, 56px).
  • Grid: 12 columns. Hero blocks span full width; feature rails span 4–6 columns; the product preview / upload surface anchors the hero right.
  • Hero treatment: near-white ground, Exposure h1 at 48px, grey upload tile + grey “Add style” pill, accent-colored illustration or in-product preview alongside.

Whitespace Philosophy

The near-white canvas runs continuously; sections are separated by tonal shifts (white → #f5f9fa) and hairline rules rather than dark bands. Section gutters run 80–120px between major blocks; minor blocks sit on 48–64px gaps. Color enters as accent washes and illustrations inside the rhythm, never as full-bleed dark interruptions on the marketing surface.

Section Cadence

  • Hero (near-white + Exposure h1 + grey upload chrome + accent illustration) → Feature Grid (3-up default cards on #f5f9fa) → Color-Washed Feature Spread (accent-tint cards, one hue each) → Social Proof / Creator Testimonials → Product Walkthrough (in-product previews) → Pricing → FAQ → Footer.
  • The canvas stays light throughout; the deep-violet #160f31 ground appears only in select hero or CTA-band blocks as a contrast moment.
  • Accent color is the punctuation; the grey chrome is the structure.

6. Shapes & Radius Scale

TierValueUse
Micro2pxInline chip corners, hairline detail
Small (sm)4pxInline code, small inputs, tight chips
Medium (md)8pxInputs, secondary buttons, dropdowns
Relaxed (lg)12pxUpload tiles, default cards
Large (xl)16pxAccent-washed cards, modals
Pill9999pxPrimary CTA, chrome pills, tags

Captions’ signature radii: 9999px pills for CTAs and tags / 12px for tiles and cards / 8px for inputs. The page is decisively rounded and friendly — there are no sharp 0px corners on interactive surfaces. The full-pill CTA is a creator-friendly choice that reads softer than a squared button. Mixed radii within a single primitive are avoided.

7. Depth & Elevation

LevelTreatmentUse
0Flat — no shadowDefault page surface, hero, body sections
1Tonal layering (#f5f9fa on #ffffff)Default cards, insets, upload tiles
2Hairline + tonal (1px #dfe5e7)Bordered cards, panels
3rgba(29, 31, 32, 0.06) 0 4px 12pxSticky nav, dropdowns, hover-lifted cards
4rgba(29, 31, 32, 0.08) 0 12px 28px -10pxPopovers, floating menus
5rgba(29, 31, 32, 0.12) 0 24px 48px -16pxModals, dialogs

Shadow Philosophy

Captions’ depth comes from tonal layering and hairlines first, shadows second. White → #f5f9fa#eef4f6 gives a three-tier surface ladder that separates elements without any shadow at all. When shadows appear they’re soft, diffuse, and charcoal-tinted (rgba(29, 31, 32, …)) — never colored, never hard, never glowing. This matters: the accent palette is loud, so the depth language stays quiet and neutral to keep the page from feeling chaotic. Color goes in fills and washes; elevation stays grey.

8. Interaction & Motion

Easing Curves

  • ease-standard: cubic-bezier(0.4, 0, 0.2, 1) — Material-style; default for hover, focus, and color transitions.
  • ease-emphasized: cubic-bezier(0.2, 0, 0, 1) — punchier exit; modal enter, hero reveal.

Duration Buckets

  • Fast (150ms) — color transitions, focus rings, link hovers.
  • Standard (240ms) — button hover, card hover, dropdown reveal.
  • Slow (320ms) — modal enter/exit, section fade-in.

Per-Component Micro-States

  • Button hover (violet pill): bg #6c4df7#160f31 over 240ms ease-standard. No scale.
  • Button hover (grey chrome): bg #eef4f6#e8eff2.
  • Upload-tile hover: bg #f5f9fa#eef4f6; dashed border darkens.
  • Card hover: border #dfe5e7#d0d6d7; 4px charcoal shadow fades in.
  • Link hover: color → #6c4df7 over 150ms.
  • Input focus: 2px violet ring rgba(108, 77, 247, 0.32) fades in over 150ms; border darkens to violet.

Page Transitions

Sections fade in on scroll via IntersectionObserver at ~80% viewport, 320ms, with a small 16px translate-up. Hero text reveals on load over 320ms. Accent illustrations may animate subtly (a sticker pops, a wash drifts) but the chrome stays still — motion follows the same rule as color, living in the decoration layer.

Reduced Motion

@media (prefers-reduced-motion: reduce) — all transitions become opacity-only, durations halved. Translate-ins, scroll reveals, and any sticker/wash animation are disabled; sections snap to final state.

9. Accessibility & A11y

Contrast Pairs

  • #1d1f20 text on #ffffff bg: 15.6:1 — AAA at all sizes. The primary reading pair.
  • #2a2c2d h1 on #ffffff bg: 13.1:1 — AAA at all sizes. The live display-heading color.
  • #595e5e muted on #ffffff bg: 6.9:1 — AA at all sizes (AAA at large). Secondary copy.
  • #7e8486 soft on #ffffff bg: 4.0:1 — AA at large sizes / metadata only; keep at 14px+ or use sparingly for captions.
  • #ffffff on #6c4df7 violet button: 5.0:1 — AA at body sizes, AAA at large. The primary CTA pair is safe; the 15px / 600 button copy clears AA.
  • #1d1f20 on #eef4f6 grey chrome pill: 14.2:1 — AAA. The quiet grey CTAs are highly legible.

Note on accents: the brighter --color-* hues (sea #00d0ff, yellow #fcff41, lime #aaff4e) are decorative and must not carry small body text on white — they fail contrast badly. Use them as fills, washes, and large illustration color only; pair text with charcoal or the darker semantic-text hues.

Focus Indicators

  • Default focus ring: 0 0 0 2px rgba(108, 77, 247, 0.32) violet with 2px offset on the near-white canvas.
  • On the deep-violet #160f31 ground: switch to a #ffffff or #a6ecff ring for visibility.
  • Every interactive surface has a visible focus state — no outline: none without a replacement.

ARIA Patterns

  • Navigation: <nav aria-label="Main"> with a skip-link to main content.
  • Disclosure: <button aria-expanded aria-controls> for collapsible FAQ and feature sections.
  • Dialog: role="dialog" aria-modal="true" aria-labelledby with focus trap and Esc-to-close.
  • File upload: the drag-drop tile is a real <button> / labeled <input type="file"> with aria-label; drag state announced via aria-live="polite".
  • Live regions: aria-live="polite" for upload progress and form validation.

Keyboard Navigation

  • Tab order matches visual flow: skip-link → nav → hero CTA / upload tile → main content → footer.
  • All buttons, links, inputs, and the upload tile reachable via Tab; modals trap focus until dismissed.
  • Esc closes modals and the mobile menu sheet.
  • The upload tile accepts both click/Enter and a standard file picker — never drag-only.

Screen Reader Hints

  • Decorative accent stickers and washes are aria-hidden; the color is ornamental, the text is functional.
  • In-product preview images have descriptive alt or <figcaption>.
  • Icon-only buttons have aria-label.
  • The Captions wordmark uses aria-label="Captions".

Reduced Motion

Honoured via the global media query — translate/scale animations become opacity-only, durations halve, and decorative sticker/wash motion is disabled entirely.

10. Responsive Behavior

Breakpoints

NameWidthUse
Mobile< 640pxSingle column, full-bleed sections, 32px H1
Tablet640–1024px2-column rails, 40px H1
Desktop1024–1280pxFull 12-col grid, 48px hero, 720px prose
Wide1280–1536pxSite max width hits
Ultra> 1536pxPage locks to 1280, gutters expand

Touch Targets

  • Minimum tap target: 44×44px (WCAG AAA).
  • Buttons: 44px minimum height on mobile.
  • The upload tile gets a generous tap area on mobile (full-width, 56px+ tall) since it’s the primary action.

Collapsing Strategy

  • Header: full nav at ≥1024px; hamburger sheet below (right-aligned trigger).
  • Hero: 80px display → 56px → 48px → 40px → 32px H1 across breakpoints. Exposure scales down but never switches face.
  • Feature grid: 3-up at desktop, 2-up at tablet, 1-up at mobile.
  • Body width: 720px → fluid 90vw at mobile.
  • Accent-washed cards: full-width on mobile; preserve 16px radius and interior padding.
  • Section spacing: 120px → 80px → 48px across sizes.

Image Behavior

  • In-product previews use srcset 1x/2x/3x; aspect-ratio enforced to prevent layout shift.
  • Below-fold imagery is lazy-loaded; hero is eager.
  • Accent washes are CSS color (no images) so they render instantly.

Container Queries

Used inside feature cards to switch icon position (icon-left vs. icon-top) when card width crosses ~320px, and inside FAQ rows to stack meta below the question on narrow containers.

11. Content & Voice

Tone

Bold, direct, creator-native. Captions writes to people who make short-form video for a living — confident, energetic, no enterprise hedging. Headlines are punchy and benefit-first (“AI that edits like a professional editor”); the voice assumes the reader is a creator who wants to post more and edit less. It’s the opposite of dev-tool dryness or enterprise gravity.

Microcopy Patterns

  • Button verbs: “Get started,” “Try Captions free,” “Import or drag your video,” “Add style.” Action-first, sentence case, never all-caps-urgent.
  • Error messages: “That file didn’t upload — try a shorter clip or a different format.” Plain, helpful, low-stakes.
  • Success confirmations: “Done.” “Your video’s ready.” Brief and energetic.
  • Loading states: “Editing your video…” “Adding captions…” — context-specific, AI-aware.

Empty States

What they say: name the state, point to the action. “No projects yet. Import or drag a video to get started.” What they don’t say: apologetic “Oops!” / “Whoops!” exclamations. Empty is the normal starting point, not a failure.

CTA Verb Conventions

  • Primary on hero: “Get started,” “Try Captions free”
  • Secondary: “Add style,” “See examples,” “Watch the demo”
  • Footer: “Read the blog,” “Help center,” “Log in”

The brand favors creator-energy verbs over scarcity (“Sign up now!” / “Limited time!”). The pitch is capability and speed, not pressure.

12. Dark Mode & Theming

Partial — the marketing surface is light-only on the near-white canvas. The brand identity is the bright #ffffff#f5f9fa studio canvas with charcoal text; the marketing site does not ship a full inverted dark theme. The cool near-white ground and the charcoal text are the defining choices.

That said, Captions’ color system is engineered for inversion. The --color-dark-purple #160f31 and --color-gray-950 #141515 exist precisely so select hero and CTA-band blocks can drop to a deep-violet/charcoal ground for contrast moments, and so the in-product video editor can run a dark workspace. On those dark grounds, the --color-* accent palette is calibrated to stay vivid (sea, sunset, barbie-pink, meadow all read well on #160f31), text flips to #ffffff, and focus rings switch from violet to white or sky.

The rule for a downstream dark companion: keep the accent vars at full saturation, swap the near-white canvas for #160f31 deep-violet (or #141515 charcoal), lift surfaces to #1d1f20#2a2c2d, flip text to white, and re-key the grey chrome pills to a translucent white. The page-level marketing surface, however, stays light.

13. Lineage & Influences

Captions’ design DNA is creator-tool color maximalism on a calm canvas. The strategic move is to reject the dark-slab, chrome-on-black register that dominates AI video (Runway, Pika, Kapwing) and instead present a bright near-white studio — closer to Figma or a modern design tool than to a “generative AI” product. The signature is the --color-* crayon box: rather than one or two brand colors, Captions declares a full named palette (sea, sky, sunset, cloud, meadow, barbie-pink, yellow, peach, lime, violet, and more) and treats it as a reusable sticker pack scattered across illustration, tags, and washes. Violet #6c4df7 anchors the system, but the variety itself is the brand.

What it inherits and borrows: Figma’s named multi-hue color system and bright creative-tool canvas; Descript’s category-defiant choice of a warm light canvas over dark AI-tool chrome; Linear’s restraint in keeping functional chrome quiet (grey) so accent color does the talking; Framer’s playful accent washes over a clean near-white marketing surface. What it rejects, deliberately: chrome-on-black slabs, neon-on-slate gradients, moody darkness, and the whole “generative AI = dark and futuristic” visual cliché. Where its competitors signal “powerful technology,” Captions signals “fun, fast, made-for-creators.”

Named influences:

  • Gaurav Misra (co-founder & CEO, Captions) — Product and brand direction toward a creator-native, color-forward identity. https://www.captions.ai/about
  • Figma — Multi-hue named-color system and bright near-white canvas as a creative-tool register. https://www.figma.com
  • Descript — AI-video peer that also rejects dark-slab chrome for a warm, editorial light canvas. https://www.descript.com
  • Linear — Tight type and restrained grey chrome that lets accent color do the talking. https://linear.app
  • Framer — Playful gradient/accent washes over a clean near-white marketing surface. https://www.framer.com
  • Runway / Pika — Chrome-on-black AI-video contemporaries Captions deliberately differentiates against. https://runwayml.com

14. Do’s and Don’ts

Do

  • Do keep the canvas near-white — #ffffff cooled to #f5f9fa / #eef4f6. The bright studio ground is the brand differentiator versus dark AI-video tools.
  • Do treat the --color-* palette as a sticker pack — one accent per element, scattered across illustration, tags, and washes.
  • Do anchor the system with violet #6c4df7 on the strongest CTA and links, but let the whole crayon box carry the energy.
  • Do keep functional chrome (upload tile, “Add style” pill, inputs) grey and quiet so the accent system reads as the identity.
  • Do set headlines in Exposure at 48px and up — poster-scale, weight 600–700, tight negative tracking.
  • Do keep body in DenimINK at 16px / 1.55 — humanist and calm.
  • Do use full-pill (9999px) CTAs and 12px tiles/cards — the page is decisively rounded and friendly.
  • Do pair bright accents only with charcoal or matching dark semantic text; keep accents in fills and washes.
  • Do prefer tonal layering and hairlines over shadows; when shadows appear, keep them soft and charcoal-tinted.
  • Do keep the cool grey-blue neutral ramp (#7e8486, #9fa5a7) rather than warm grey.

Don’t

  • Don’t ship a dark slab on the marketing surface. The near-white canvas is the category-defying choice; dark blocks are only for select contrast moments.
  • Don’t color the hero chrome. The upload tile and “Add style” pill are grey on purpose — making them violet would collapse the color strategy.
  • Don’t blend the accents into one gradient identity. They’re a sticker pack, not a palette gradient — keep them one-per-element.
  • Don’t put small body text on bright accent fills (sea, yellow, lime) on white — they fail contrast. Use them as decoration only.
  • Don’t use Exposure below 24px. Drop to DenimINK for h4 and smaller.
  • Don’t go heavier than 700 on headings or use warm grey neutrals; the system is cool-grey + Exposure presence.
  • Don’t use hard or colored/neon-glow shadows. Depth stays neutral and soft so the loud color doesn’t read as chaos.
  • Don’t square the corners. Sharp 0px edges fight the friendly, rounded, creator register.
  • Don’t let a single hue monopolize the page. The variety is the brand — over-using violet alone makes it generic SaaS.
  • Don’t adopt scarcity/urgency voice (“Sign up now!”). The tone is creator-energy and capability, not pressure.

15. Agent Prompt Guide

Quick Color Reference

bg: #ffffff
bg-cool: #f5f9fa
surface (grey chrome): #eef4f6
text: #1d1f20
text-h1: #2a2c2d
brand-violet: #6c4df7
brand-violet-hover: #160f31
accent-sea: #00d0ff
accent-sunset: #f99f3f
accent-barbie-pink: #ff1476
accent-meadow: #5bf6bb
accent-yellow: #fcff41
border: #dfe5e7

Example Component Prompts

  1. “Create a hero in Captions style — near-white #ffffff canvas, 48px H1 in Exposure at weight 700 with -0.018em tracking in charcoal #2a2c2d, 16px DenimINK body in #1d1f20 at 1.55 line-height. Lay out a grey upload tile (#f5f9fa, 12px radius, 1px dashed #d0d6d7 border, label ‘Import or drag your video’) next to a grey ‘Add style’ pill (#eef4f6, 9999px). Add one bright accent illustration using sea #00d0ff and sunset #f99f3f. The buttons stay grey — color lives in the illustration.”

  2. “Design the primary CTA in Captions style — violet #6c4df7 full pill (9999px radius), white DenimINK 600 / 15px label, 12×22px padding, hover to deep-violet #160f31. This is the only place the brand accent touches a button; everything else is grey chrome.”

  3. “Build an accent-washed feature card — soft cyan #effbff (or sky #a6ecff / peach #ffca9f) background, no border, 16px radius, 24px padding, 20px DenimINK 600 charcoal heading, 16px DenimINK 400 body. One accent tint per card; never mix two washes in one card.”

  4. “Make a category tag row — each tag a full pill (9999px) in a different --color-* accent (violet, barbie-pink, meadow, sunset), white 12px DenimINK 600 text, 5×12px padding. Treat them as a sticker pack — variety is the point.”

  5. “Create the primary nav — 64px header, white #ffffff background with hairline #dfe5e7 on scroll, Captions wordmark in charcoal #1d1f20, links 15px DenimINK 500 with violet-on-hover, right-aligned ghost ‘Log in’ + violet pill ‘Get started’.”

  6. “Render a default feature card — #f5f9fa background, 1px #dfe5e7 hairline, 12px radius, 24px padding, no shadow, hover deepens border to #d0d6d7 and adds a soft 4px charcoal-tinted shadow. Keep it neutral — let any accent color come from the icon or illustration inside.”

Iteration Guide

  1. Start near-white, not dark. If the canvas is #000 or chrome-on-black, you’ve drifted into Runway/Pika territory. The bright #ffffff#f5f9fa studio ground is the entry ticket.
  2. Keep the load-bearing chrome grey. Upload tiles, “Add style” pills, inputs — desaturate them to #f5f9fa / #eef4f6. If your buttons are violet everywhere, the color strategy has collapsed.
  3. Deploy the crayon box as a sticker pack. Add the --color-* accents one-per-element across illustration, tags, and washes — sea, sunset, barbie-pink, meadow, yellow. Variety, not a single brand color, is the look.
  4. Anchor with violet, don’t monopolize with it. #6c4df7 carries the strongest CTA and links; the rest of the energy is spread across the palette.
  5. Headlines in Exposure at 48px+, body in DenimINK at 16px. Sans display under 24px or warm-grey neutrals both pull the brand toward generic SaaS.
  6. Round everything. Full-pill CTAs (9999px), 12px tiles and cards, 8px inputs. Sharp corners break the friendly creator register.
  7. Keep depth neutral. Tonal layering and hairlines first; soft charcoal-tinted shadows only when needed. The color is loud, so the elevation stays quiet.
  8. Calm the voice, keep the energy. Creator-direct verbs (“Get started,” “Import or drag your video”) over scarcity (“Sign up now!”). Confident, fast, made-for-creators.

Theme-toggle audit: score=0, signals=[none]

Ship with this

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

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