light · sans · bright · structured · infrastructure

DESIGN.md inspired by Cloudflare

Infrastructure-grade calm — white canvas, dark hero band, FT Kunst Grotesk, signature Cloudflare orange, full-pill CTAs.

By webdesignhot · www.cloudflare.com
$ npx @webdesignhot/design-md add cloudflare
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #ffffff
  • bg-canvas #fbfbfb
  • bg-elevated #f8f8f8
  • bg-recessed #f3f3f3
  • bg-hero #262626
  • bg-contrast #0f0f0f
  • surface #ffffff
  • text AAA · 15.1 #262626
  • text-on-dark #ffffff
  • text-strong #333333
  • text-secondary #525252
  • text-subtle #737373
  • text-placeholder #9ca3af
  • brand AA·LG · 3.1 #ff5e1f
  • brand-hover #f54900
  • brand-soft rgba(255, 94, 31, 0.10)
  • badge-orange #ffac00
  • on-brand #ffffff
  • link #193cb8
  • border — · 1.3 #e5e5e5
  • border-soft #f0f0f0
  • border-strong — · 1.5 #d4d4d4
  • success #058378
  • warning #ffac00
  • danger #c10007
Typography
Ship faster than ever.
display-hero "FT Kunst Grotesk" 72px w600 -0.03em
Ship faster than ever.
display-lg "FT Kunst Grotesk" 56px w500 -0.02em
Ship faster than ever.
h1 "FT Kunst Grotesk" 48px w500 -0.018em
Built for teams that ship.
h2 "FT Kunst Grotesk" 40px w500 -0.015em
A complete kit
h3 "FT Kunst Grotesk" 32px w500 -0.01em
The quick brown fox jumps over the lazy dog.
h4 "FT Kunst Grotesk" 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h5 "FT Kunst Grotesk" 20px w600 0
The quick brown fox jumps over the lazy dog.
body-lg "FT Kunst Grotesk" 18px w400 0
The quick brown fox jumps over the lazy dog.
body "FT Kunst Grotesk" 16px w400 0
The quick brown fox jumps over the lazy dog.
body-sm "FT Kunst Grotesk" 14px w400 0
npx @webdesignhot/design-md add stripe
code ui-monospace 14px w400 0
OUR DESIGN SYSTEM
label "FT Kunst Grotesk" 13px w500 0
OUR DESIGN SYSTEM
caption "FT Kunst Grotesk" 12px w500 0.01em
The quick brown fox jumps over the lazy dog.
eyebrow "FT Kunst Grotesk" 12px w600 0.06em
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
  • 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 7/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
  • muted text-secondary
  • border border
  • ring brand
Lineage & influences

Cloudflare's identity is anchored by one of the most recognisable single colours in infrastructure software — Cloudflare orange `#ff5e1f` — paired with the company's custom grotesque, **FT Kunst Grotesk**, on a calm white canvas. The marketing system is the internal **Kumo** design-token set: an oklch-based neutral ramp (`--color-kumo-neutral-*`) themed with CSS `light-dark()`, semantic role tokens (`canvas / elevated / recessed / contrast`), and a deliberate chromatic discipline where orange is the action colour, blue is the link colour, and the rest of the page is near-black-on-white neutrals. The hero inverts to a dark `#262626` band with a white 56px / 500 headline; the body returns to white. Full-pill CTAs (radius 9999) are the brand's most-copied gesture — an orange primary pill with white text, a white secondary pill with near-black text. The lineage draws from the Swiss-grotesque tradition (clarity over ornament), the developer-product-as-infrastructure register that Stripe and Vercel share, and Cloudflare's own "agent era" repositioning — trustworthy, technical, calm, with the orange doing all the brand-recognition work a logo usually does.

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: Cloudflare
tagline: Infrastructure-grade calm — white canvas, dark hero band, FT Kunst Grotesk, signature Cloudflare orange, full-pill CTAs.
updated_at: 2026-05-29T21:44:07.841Z
published_at: 2026-05-29T21:44:07.841Z
author: webdesignhot
source_url: https://www.cloudflare.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [dev-tools, saas]
tags: [light, sans, bright, structured, infrastructure]
preview_swatch: ['#ffffff', '#ff5e1f', '#262626']
related: [vercel, stripe]
description: 'Cloudflare runs the edge — DNS, CDN, security, and an expanding developer platform (Workers, R2, D1, AI) pitched squarely at the agent era. The marketing site carries that register: a calm white `#ffffff` canvas, near-black `#262626` body type, and the one chromatic signature everyone recognises — Cloudflare orange `#ff5e1f` (rgb 255, 94, 31). The type is FT Kunst Grotesk throughout, a grotesque with engineered confidence that sets headlines at a restrained weight 500 rather than the SaaS-default 700. The hero inverts to a dark band — white headline at 56px on near-black ground — while the rest of the page returns to white. CTAs are full-pill (radius 9999): the primary is orange-filled with white text, the secondary a white pill with near-black text. The design system is the internal **Kumo** token set, built on oklch color scales with `light-dark()` theming — `--color-kumo-*` resolves the neutral ramp, the orange is reserved for the primary action and brand moments, and blue is the link colour. Where Vercel withholds its brand hue from buttons, Cloudflare commits the orange to the dominant CTA: orange *is* the action. The overall feeling is trustworthy infrastructure — the company that sits between every request and its origin, drawn calmly enough that you forget how much is happening underneath.'


# 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
  muted: text-secondary
  border: border
  ring: brand
themes:
  default: light
  available: [light, dark]
  switch-via: 'CSS light-dark() on the Kumo --color-kumo-* token set; respects prefers-color-scheme; dark hero band is always-dark regardless of theme'

colors:
  bg: '#ffffff'                  # page canvas — pure white, the base Kumo surface
  bg-canvas: '#fbfbfb'           # --color-kumo-canvas — neutral-50, faintest off-white band
  bg-elevated: '#f8f8f8'         # --color-kumo-elevated — neutral-75, raised surface
  bg-recessed: '#f3f3f3'         # --color-kumo-recessed — neutral-125, inset / code fill
  bg-hero: '#262626'             # dark hero band — near-black ground for the inverted hero
  bg-contrast: '#0f0f0f'         # --color-kumo-contrast region — deepest inversion
  surface: '#ffffff'             # default card surface
  text: '#262626'                # primary body + headline — near-black (rgb 38,38,38)
  text-on-dark: '#ffffff'        # white type on the dark hero band
  text-strong: '#333333'         # --text-color-kumo-strong — neutral-600/750 emphasis
  text-secondary: '#525252'      # supporting copy, dense rows
  text-subtle: '#737373'         # captions, meta, --text-color-kumo-subtle
  text-placeholder: '#9ca3af'    # placeholder, disabled, inactive
  brand: '#ff5e1f'               # CLOUDFLARE ORANGE (rgb 255,94,31) — primary CTA + brand
  brand-hover: '#f54900'         # orange-600, pressed/hover deepen
  brand-soft: 'rgba(255, 94, 31, 0.10)'  # soft orange wash — badge bg, focus aura
  badge-orange: '#ffac00'        # --color-kumo-badge-orange — amber accent chip
  on-brand: '#ffffff'            # white text on the orange pill
  link: '#193cb8'                # blue-800 — inline link colour (Kumo link token)
  border: '#e5e5e5'              # default hairline — neutral-200 territory
  border-soft: '#f0f0f0'         # quietest separation
  border-strong: '#d4d4d4'       # outlined controls, focused inputs
  success: '#058378'            # teal-650 — success register (Kumo leans teal/green)
  warning: '#ffac00'            # orange-650 / yellow — advisory amber
  danger: '#c10007'             # red-700 — errors, destructive actions

typography:
  display:
    family: '"FT Kunst Grotesk", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif'
    weights: [500, 600, 700]
  body:
    family: '"FT Kunst Grotesk", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif'
    weights: [400, 500, 600]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 72, weight: 600, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 56, weight: 500, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h1:              { size: 48, weight: 500, lineHeight: 1.1,  tracking: '-0.018em', family: display }
    h2:              { size: 40, weight: 500, lineHeight: 1.12, tracking: '-0.015em', family: display }
    h3:              { size: 32, weight: 500, lineHeight: 1.2,  tracking: '-0.01em',  family: display }
    h4:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
    h5:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '0',        family: body }
    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.01em',   family: body }
    eyebrow:         { size: 12, weight: 600, lineHeight: 1.4,  tracking: '0.06em',   family: body, transform: uppercase }
    code:            { size: 14, weight: 400, lineHeight: 1.6,  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, 128]

layout:
  page-width: 1280
  prose-width: 720
  header-height: 64

components:
  button-primary: { bg: brand, text: on-brand, padding: '12px 24px', radius: 9999 }
  button-secondary: { bg: bg, text: text, border: border-strong, padding: '12px 24px', radius: 9999 }
  button-ghost:   { bg: transparent, text: text, padding: '10px 16px', radius: 9999 }
  card:           { bg: surface, border: border, radius: 12, padding: 24 }
  input:          { bg: bg, border: border, text: text, radius: 8, padding: '10px 14px' }

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-out-soft: 'cubic-bezier(0.0, 0, 0.2, 1)'
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  reduced-motion: 'respects prefers-reduced-motion: reduce'

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

shadows:
  none: 'none'
  hairline: '0 0 0 1px #e5e5e5'
  edge: '0 1px 2px rgba(0, 0, 0, 0.12)'
  card: '0 1px 2px rgba(0, 0, 0, 0.08), 0 8px 24px -8px rgba(0, 0, 0, 0.08)'
  popover: '0 12px 32px -8px rgba(0, 0, 0, 0.12)'

accessibility:
  contrast-text-on-bg: 15.13            # #262626 on #ffffff — AAA at all sizes
  contrast-text-on-hero: 15.13          # #ffffff on #262626 dark hero — AAA at all sizes
  contrast-on-brand: 3.06               # #ffffff on #ff5e1f orange — AA Large only; large/bold CTA text
  contrast-text-secondary-on-bg: 7.81   # #525252 on #ffffff — AAA at body sizes
  contrast-subtle-on-bg: 4.74           # #737373 on #ffffff — AA at body sizes
  focus-ring: '2px solid #ff5e1f + 2px outline-offset — orange focus ring on white'
  reduced-motion-honored: true
  touch-target-min: 44

lineage:
  summary: 'Cloudflare''s identity is anchored by one of the most recognisable single colours in infrastructure software — Cloudflare orange `#ff5e1f` — paired with the company''s custom grotesque, **FT Kunst Grotesk**, on a calm white canvas. The marketing system is the internal **Kumo** design-token set: an oklch-based neutral ramp (`--color-kumo-neutral-*`) themed with CSS `light-dark()`, semantic role tokens (`canvas / elevated / recessed / contrast`), and a deliberate chromatic discipline where orange is the action colour, blue is the link colour, and the rest of the page is near-black-on-white neutrals. The hero inverts to a dark `#262626` band with a white 56px / 500 headline; the body returns to white. Full-pill CTAs (radius 9999) are the brand''s most-copied gesture — an orange primary pill with white text, a white secondary pill with near-black text. The lineage draws from the Swiss-grotesque tradition (clarity over ornament), the developer-product-as-infrastructure register that Stripe and Vercel share, and Cloudflare''s own "agent era" repositioning — trustworthy, technical, calm, with the orange doing all the brand-recognition work a logo usually does.'
  influences:
    - name: 'Cloudflare Design (cloudflare.design)'
      role: 'Owner of the orange `#ff5e1f` brand colour, FT Kunst Grotesk, and the public design language the marketing site renders.'
      url: 'https://www.cloudflare.design'
    - name: 'Cloudflare Workers / developer platform'
      role: 'The product surface the marketing register is built around — edge compute, the "agent era" positioning, technical-but-calm voice.'
      url: 'https://workers.cloudflare.com'
    - name: 'Stripe'
      role: 'Developer-product-as-infrastructure register; technical marketing with restraint and a single confident accent.'
      url: 'https://stripe.com'
    - name: 'Vercel'
      role: 'Adjacent dev-tool peer — near-black-on-near-white neutral discipline and full-pill hero CTAs at light-mode contrast.'
      url: 'https://vercel.com'
    - name: 'oklch color space (LCH for the web)'
      role: 'The Kumo token ramps are authored in oklch for perceptually-even neutral and accent scales with light-dark() theming.'
      url: 'https://oklch.com'
    - name: 'Swiss / International Typographic Style'
      role: 'Grotesque type, grid clarity, ornament-free hierarchy — FT Kunst Grotesk sits in this tradition.'
      url: 'https://en.wikipedia.org/wiki/International_Typographic_Style'
---

## 1. Visual Theme & Atmosphere

Cloudflare's marketing site reads like the calm surface of something enormous. The company sits between a large fraction of the internet and its origins — DNS, CDN, DDoS mitigation, edge compute, an entire developer platform — and the design's whole job is to make that scale feel approachable rather than intimidating. The result is a near-pure white `#ffffff` canvas, near-black `#262626` body type, generous breathing room, and exactly one colour that does the brand-recognition work a logo usually does: Cloudflare orange `#ff5e1f`.

The single most distinctive move is the **dark hero band**. While the rest of the page lives on white, the hero inverts to a near-black `#262626` ground with a white 56px / 500 headline ("Build for the agent era"). This is not a full dark mode — it's a deliberate inversion at the top of the page, a stage-lit moment that frames the headline before the page returns to its calm white register. The contrast between the dark hero and the white body is the brand's primary rhythmic gesture, and it repeats: dark bands appear sparingly to punctuate, never to dominate.

The type carries the brand as much as the colour. **FT Kunst Grotesk** — Cloudflare's custom grotesque — sets every headline and every paragraph. The most telling detail is the *weight discipline*: where most SaaS sites push hero copy to weight 700 or 800, Cloudflare sets its hero at weight 500. The grotesque silhouette is confident enough at 500 that pushing heavier would read as shouting. Headlines feel engineered and self-assured rather than loud — appropriate for a company whose pitch is "we handle the hard part so you don't have to."

The chromatic discipline is where Cloudflare diverges from a peer like Vercel. Vercel withholds its brand blue from buttons entirely — blue is a link, never an action. Cloudflare does the opposite: **the orange *is* the action.** The primary CTA is an orange-filled full-pill with white text ("Start building"); the secondary is a white pill with near-black text. Orange appears on the dominant action, on brand moments, and as the focus ring — but it's still rationed. You won't find orange section backgrounds or orange body text. The colour is loud precisely because it's rare; one orange pill on a white page is impossible to miss.

The underlying system is **Kumo**, Cloudflare's internal design-token set. The colour tokens are authored in the oklch color space (`--color-kumo-neutral-50` through `-1000`, semantic roles like `--color-kumo-canvas / elevated / recessed / contrast`) and themed with the CSS `light-dark()` function. The neutral ramp is perceptually even, the orange is the brand token, and blue (`--text-color-kumo-link`, blue-800) is the link colour. The vocabulary that captures the feeling: *infrastructure-calm, white-canvas, dark-hero-band, FT-Kunst-grotesque, orange-action, full-pill, near-black-neutral, oklch-tokened, agent-era, trustworthy-technical, ornament-free, Swiss-grid-clarity.*

**Key Characteristics**

- Pure white `#ffffff` canvas — the calm base; off-white `#fbfbfb` bands for subtle elevation, never cream
- Near-black `#262626` (rgb 38, 38, 38) body and headline type — never true black, slightly softened
- Custom **FT Kunst Grotesk** throughout — display *and* body, the brand's typographic identity
- Hero **weight 500**, not 700/800 — the grotesque reads confident without shouting
- Signature **Cloudflare orange `#ff5e1f`** (rgb 255, 94, 31) — the one chromatic identity colour
- Orange *is* the primary action — orange-filled full-pill CTA with white text (the opposite of Vercel)
- **Dark hero band**: white 56px / 500 headline on near-black `#262626` ground, then page returns to white
- **Full-pill CTAs** (radius 9999) — orange primary pill + white secondary pill, both fully rounded
- Blue (`#193cb8`) reserved for inline links; orange reserved for actions and brand
- **Kumo** design-token system — oklch neutral ramp, semantic role tokens, `light-dark()` theming
- Ornament-free Swiss-grotesque clarity — grid discipline, no decorative noise, generous whitespace
- Trustworthy-technical "agent era" register — infrastructure scale drawn calmly

## 2. Color Palette & Roles

### Canvas & Surface

- **Canvas** (`#ffffff`): the page background — pure white, the base Kumo surface (`--color-kumo-base`). The calm ground the entire brand rests on.
- **Canvas Off-White** (`#fbfbfb`) [→ `--color-kumo-canvas`, neutral-50]: the faintest off-white band for subtle section elevation. Distinguishable from pure white only in adjacency.
- **Elevated** (`#f8f8f8`) [→ `--color-kumo-elevated`, neutral-75]: raised surface — feature cards on white, inset panels.
- **Recessed** (`#f3f3f3`) [→ `--color-kumo-recessed`, neutral-125]: inset fill — code blocks, quiet wells, recessed regions.

### Text

- **Body Text** (`#262626`): primary body and headline colour (rgb 38, 38, 38) — near-black, slightly softened off true `#000`. 15.1:1 against white, AAA everywhere.
- **Text Strong** (`#333333`) [→ `--text-color-kumo-strong`]: emphasis text, sub-headings on white.
- **Text Secondary** (`#525252`): supporting copy, dense rows — 7.8:1, AAA at body sizes.
- **Text Subtle** (`#737373`) [→ `--text-color-kumo-subtle`]: captions, meta — 4.7:1, AA at body sizes.
- **Text Placeholder** (`#9ca3af`) [→ `--text-color-kumo-placeholder`]: placeholder, inactive, disabled controls.
- **Text on Dark** (`#ffffff`) [→ `--text-color-kumo-inverse`]: white type on the dark hero band — 15.1:1 against `#262626`.

### Brand

- **Cloudflare Orange** (`#ff5e1f`) (rgb 255, 94, 31): THE brand colour. Primary CTA fill, focus ring, brand moments. The single most recognisable token in the system. Orange *is* the action.
- **Brand Hover** (`#f54900`) [→ orange-600]: deepened orange for hover / pressed states on the primary pill.
- **Brand Soft** (`rgba(255, 94, 31, 0.10)`): soft orange wash — badge backgrounds, focus aura, subtle brand emphasis.
- **Badge Orange / Amber** (`#ffac00`) [→ `--color-kumo-badge-orange`, orange-650]: warmer amber accent for status chips, distinct from the action orange.

### Interactive

- **Link** (`#193cb8`) [→ `--text-color-kumo-link`, blue-800]: inline links in body copy. Blue is the link colour; orange is the action colour — the two never overlap.
- **Focus** (`#ff5e1f` 2px ring + 2px offset): keyboard focus indicator — the brand orange does double duty as the focus colour.
- **On-Brand** (`#ffffff`): white text on the orange pill — at 3.06:1 this passes AA Large only, so CTA text is always large/medium-weight.

### Neutral Ramp (Kumo, oklch-authored)

- **neutral-50** (`#fbfbfb`) — canvas off-white
- **neutral-75** (`#f8f8f8`) — elevated
- **neutral-125** (`#f3f3f3`) — recessed
- **border-soft** (`#f0f0f0`) — quietest separation
- **border** (`#e5e5e5`) — default hairline
- **border-strong** (`#d4d4d4`) — outlined controls, focused inputs
- **text-subtle** (`#737373`) — captions, meta
- **text-secondary** (`#525252`) — supporting copy
- **text-strong** (`#333333`) — emphasis
- **text** (`#262626`) — primary body / headline
- **bg-hero / bg-contrast** (`#262626` / `#0f0f0f`) — dark inversion grounds

### Borders

- **Border Default** (`#e5e5e5`): the default hairline — card edges, dividers. Carries most of the elevation work on white.
- **Border Soft** (`#f0f0f0`): quietest separation — inside-card dividers.
- **Border Strong** (`#d4d4d4`): outlined buttons, focused-input border, high-emphasis dividers.

### Semantic

- **Success** (`#058378` on `rgba(5, 131, 120, 0.10)`) [→ teal-650]: Cloudflare's success register leans teal/green rather than a saturated green — calmer, infrastructure-appropriate.
- **Warning** (`#ffac00` on `rgba(255, 172, 0, 0.10)`) [→ orange-650 / yellow]: advisory amber — rate limits, advisories. Distinct from the action orange.
- **Danger** (`#c10007` on `rgba(193, 0, 7, 0.10)`) [→ red-700]: errors, destructive actions, outage states.
- **Info** (`#193cb8` on `rgba(25, 60, 184, 0.10)`) [→ blue-800]: info reads as the link blue.

## 3. Typography Rules

### Font Family

**Primary**: `"FT Kunst Grotesk", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif`. **FT Kunst Grotesk** is Cloudflare's custom grotesque, used for *both* display and body — a single-family discipline that makes the brand instantly recognisable. The silhouette sits in the Swiss / International-Typographic-Style grotesque tradition: even strokes, generous apertures, ornament-free, engineered confidence. The defining brand decision is the weight register — headlines hold at **weight 500**, not the SaaS-default 700/800. The grotesque is confident enough at 500 that heavier weights would read as shouting.

**Mono companion**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace`. Cloudflare uses a system monospace stack for code blocks, CLI commands (`wrangler`, `npx`), environment variables, and route paths — pragmatic rather than proprietary. The mono is a utility face, not part of the brand identity the way FT Kunst Grotesk is.

**Weights in use**: 400 (body), 500 (headlines, labels, the signature display weight), 600 (sub-card headings, eyebrows, emphasis), 700 (rare peak display). The single-family discipline (FT Kunst Grotesk for display, body, captions, labels) means the brand identity is carried by the type itself — even with the orange removed, you'd recognise the page by the grotesque.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| display-hero | FT Kunst Grotesk | 72px | 600 | 1.0 | -0.03em | Largest landing display |
| display-lg | FT Kunst Grotesk | 56px | 500 | 1.05 | -0.02em | **The live hero H1 — white on dark band** |
| h1 | FT Kunst Grotesk | 48px | 500 | 1.1 | -0.018em | Page title / H2 on white (live: 48px / 500) |
| h2 | FT Kunst Grotesk | 40px | 500 | 1.12 | -0.015em | Marketing section opener |
| h3 | FT Kunst Grotesk | 32px | 500 | 1.2 | -0.01em | Sub-section heading |
| h4 | FT Kunst Grotesk | 24px | 600 | 1.25 | -0.005em | Card heading |
| h5 | FT Kunst Grotesk | 20px | 600 | 1.3 | 0 | Sub-card heading, inline emphasis |
| body-lg | FT Kunst Grotesk | 18px | 400 | 1.55 | 0 | Hero deck, lede paragraph |
| body | FT Kunst Grotesk | 16px | 400 | 1.55 | 0 | Default body (live: 16px / 400) |
| body-sm | FT Kunst Grotesk | 14px | 400 | 1.5 | 0 | Card body, dense-row body |
| label | FT Kunst Grotesk | 13px | 500 | 1.4 | 0 | Form field label, button copy |
| caption | FT Kunst Grotesk | 12px | 500 | 1.4 | 0.01em | Image caption, footer micro |
| eyebrow | FT Kunst Grotesk | 12px | 600 | 1.4 | 0.06em | Uppercase section pre-label |
| code | system mono | 14px | 400 | 1.6 | 0 | Code block, CLI command content |
| code-inline | system mono | 14px | 500 | 1.5 | 0 | Inline `code` references |

### Principles

- **Single-family discipline.** FT Kunst Grotesk for display, body, captions, labels. The system mono is a utility face for code only. There is no third sans anywhere.
- **Weight 500 is the headline weight.** The live hero is 56px / 500, not 700. The grotesque's engineered silhouette already reads as confident; heavier weights would feel shouty. This is the single most-copied typographic detail of the brand.
- **Body holds at weight 400.** Calm, even body type — the brand reads as precise-and-unhurried rather than dense-and-loud.
- **Negative tracking compresses with size.** `-0.03em` at the 72px display, `-0.02em` at 56px, `-0.018em` at 48px, easing to near-zero at body sizes.
- **16px body, 1.55 line-height.** Comfortable marketing-page readability; reading column caps near 720px for ~70-character lines.
- **Uppercase eyebrows at 0.06em.** Section pre-labels use FT Kunst Grotesk weight 600 uppercase with wide tracking — the brand's secondary-hierarchy tell.
- **White headlines on dark, near-black on white.** Hero headlines are `#ffffff` on the `#262626` band; all other headlines are `#262626` on white. The colour swap follows the band, not the hierarchy level.
- **No serif, no italic display.** FT Kunst Grotesk is set roman across all hierarchy; italics carry quoted titles only.

## 4. Component Stylings

### Buttons

**Primary Pill (Orange)** — `#ff5e1f` Cloudflare-orange background, white text at 14–15px / 500, **9999px full-pill radius**, 12×24px padding. Hover deepens to `#f54900` over 240ms standard. The dominant CTA: *Start building*, *Sign up*, *Talk to an expert*. **Orange is the action** — this is the brand's defining button and the inverse of Vercel's withhold-the-brand-colour discipline. CTA text is medium/large weight because white-on-orange sits at AA-Large contrast.

**Secondary Pill (White)** — `#ffffff` fill, near-black `#1f1f1f`–`#262626` text at 14px / 500, 1px border at `#d4d4d4` border-strong, **9999px full-pill radius**, 12×24px padding. Hover deepens the border and shifts fill toward `#fbfbfb`. Paired adjacently with the orange primary: *Start building for free*, *Contact sales*, *Learn more*.

**Ghost (Quiet)** — Transparent background, near-black text at 14px / 500, 9999px pill radius, 10×16px padding. Hover fills with `#f3f3f3` recessed tone. Use case: nav links, footer secondaries, in-card tertiary actions.

**On-Dark Pill** — On the dark hero band, the secondary becomes a white-bordered or translucent-white pill with white text, while the primary orange pill stays orange (it reads strongly on both white and the dark band). The orange is theme-agnostic.

### Cards

**Default Card** — `#ffffff` (or `#f8f8f8` elevated) fill, 1px hairline border at `#e5e5e5`, **12px radius**, 24px padding, soft dual-layer shadow (`0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08)`). The signature card — feature grids, product tiles, solution cards. The border + faint shadow lift the card above the white canvas.

**Flat Card** — Same as default but shadow: none; border carries the elevation. Used for dense product grids and pricing layouts where many cards stack tightly.

**Dark Card** — `#262626` near-black fill (matching the hero band), white text, 12px radius, 32px padding. Used for highlight blocks and stat callouts on otherwise white pages — a fragment of the hero band repeated as a card.

### Code Blocks

**Code Block** — `#f3f3f3` recessed fill (or `#262626` dark-themed), near-black text, **8px radius**, 16×20px padding, 1px hairline border. System monospace 14px / 400 / 1.6 line-height. Used for `wrangler` CLI commands, Workers snippets, config examples. Quick-deploy commands (`npm create cloudflare`) are the brand's signature inline-code moment.

**Inline Code** — `#f3f3f3` recessed fill, near-black text at 14px / 500 in system mono, 4px radius, 2×6px padding. Plain grey tint — no brand-orange tinting on inline code; the neutral discipline holds.

### Badges, Tags, Pills

**Status Badge (Orange)** — `rgba(255, 94, 31, 0.10)` brand-soft fill, orange text, 12px / 600, 9999px or 4px radius, 2×8px padding. Use case: `NEW`, `BETA`, brand-flagged features.

**Badge (Amber)** — `rgba(255, 172, 0, 0.12)` fill with amber `#ffac00` text — the warmer accent chip distinct from the action orange.

**Badge (Neutral)** — `#f3f3f3` fill, secondary-text colour, 12px / 500, 4px radius. Use case: category labels, region tags, version chips.

**Status Badge (Teal/Success)** — `rgba(5, 131, 120, 0.10)` fill with teal `#058378` text — operational / available status.

### Inputs / Forms

**Text Input** — `#ffffff` fill, near-black text at 16px / 400, 1px border at `#e5e5e5`, **8px radius**, 10×14px padding, ~44px height. Placeholder at `#9ca3af`. On focus: border shifts to `#ff5e1f` and a 2px orange focus ring appears with 2px offset. The orange focus ring is consistent across every interactive control.

**Select / Combobox** — Same shape as text-input with a chevron icon at right (12px) in subtle-text colour.

### Navigation

**Top Nav** — `#ffffff` (or translucent white with backdrop blur on scroll), **64px height**, 1px bottom hairline at `#e5e5e5`. Cloudflare wordmark + cloud mark left. Center: product / solution mega-menu links at 14px / 500 ghost style. Right: ghost `Log in` + orange primary `Sign up` / `Start building` full-pill. On the dark hero, the nav can render translucent over the dark band before the page transitions to white.

**Footer** — White (no band separation) or faint `#fbfbfb`, 96–128px top padding, multi-column link grid (Products, Solutions, Resources, Company) at 14px / 400 secondary-text, with the wordmark, region/language selector, and social links at the bottom.

## 5. Layout Principles

### Spacing System

- Base unit: **4px**
- Scale: `0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 · 128`
- Section padding (vertical): 96–128px for major marketing bands; 48–64px between secondary sections; 24–32px between content blocks
- Card internal padding: 24px on default cards; 32px on dark feature cards; 16×20px on code blocks
- Inter-card gutters: 24px in 2-up / 3-up grids; 16px in dense 4-up product grids

### Grid & Container

- Page max width: **1280px** for marketing sections, with a 720px reading column inside prose
- 12-column grid with 24px gutters; product/solution grids run 3-up at desktop, 4-up for dense logo or product tiles
- Hero treatment: full-bleed **dark `#262626` band**, headline left-aligned or centered, white type, orange + white pill CTAs beneath; the dark band has its own internal padding before the page steps back to white

### Whitespace Philosophy

Cloudflare uses generous, infrastructure-calm whitespace. The brand never crowds — section gutters run 96px+, hero padding 128px+, and the white canvas dominates so the rare orange and the single dark hero band land with maximum impact. The discipline is "let the white breathe; the orange does the talking." Density appears only where it serves comprehension — comparison tables, product matrices — never as a default.

### Section Cadence

A typical Cloudflare page runs:

1. **Dark Hero** — `#262626` band, white 56px / 500 headline, 18px / 400 white deck, orange primary pill + white secondary pill, then a step down to white
2. **Product / Capability Grid** — white or `#f8f8f8` cards in 3-up, hairline borders, soft shadow, 24px / 500–600 titles + 16px / 400 body
3. **Code / Quick-Deploy Band** — white background with a centered code block (`npm create cloudflare`) and prose introducing the example
4. **Stat / Trust Band** — large numbers (requests/sec, network reach) in FT Kunst Grotesk display weight, often on a dark `#262626` band repeating the hero ground
5. **Solutions / Use-Case Grid** — white cards, category badges, 3-up
6. **Customer Logos** — monochrome logo grid on white or faint off-white
7. **Closing CTA** — centered orange primary pill on white (or one more dark band), single dominant action
8. **Footer** — multi-column links on white / faint off-white

The "alternation" is *brightness-based* (white → dark band → white) rather than colour-based — the dark hero/stat bands punctuate an otherwise white page.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|------|-------|-----|
| Micro | 2px | Decorative dividers, inner chip detail |
| Small | 4px | Status badges, tag chips, inline code |
| Standard | 8px | Inputs, code blocks, small surfaces |
| Comfortable | 12px | Cards (default), product tiles, modals |
| Large | 16px | Large surfaces, hero panels, feature illustrations |
| Pill | 9999px | **All CTAs** — the brand's signature button shape |

Cloudflare's signature shape is the **full-pill CTA** (radius 9999, probed as `3.35e7px` = the max-pill convention). Every button — primary orange, secondary white, ghost — is fully rounded. This is the brand's most-copied gesture: the soft, friendly pill softens the otherwise technical register and makes the orange action feel approachable. Cards and surfaces use a gentler **12px radius**, inputs and code blocks **8px**. The contrast between fully-round pills and modestly-rounded cards is intentional: actions are soft and inviting, content surfaces are crisp and structured.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 — Flat | no shadow, white canvas | Page canvas, body sections |
| 1 — Hairline | 1px `#e5e5e5` border | Flat cards, dense tiles, table rows |
| 2 — Edge | `0 1px 2px rgba(0, 0, 0, 0.12)` | Quiet lift — chips, small surfaces (Kumo shadow-edge) |
| 3 — Card | `0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08)` | Default feature cards (Kumo shadow-drop) |
| 4 — Popover | `0 12px 32px -8px rgba(0, 0, 0, 0.12)` | Dropdowns, mega-menu panels, tooltips |
| 5 — Modal | scrim `rgba(0, 0, 0, 0.40)` + deep popover shadow | Dialogs, sign-up modals |

### Shadow Philosophy

Cloudflare's shadows are **soft and low-opacity** — the Kumo tokens `--color-kumo-shadow-edge` (12% black) and `--color-kumo-shadow-drop` (8% black) define a restrained two-tier stack. On the white canvas, the **hairline border does most of the elevation work**; the shadow is a faint diffusion that lifts cards a few millimetres off the page rather than dramatically floating them. The discipline matches the brand's calm register: nothing should look like it's hovering urgently. Heavy shadows appear only on true overlay UI (popovers, modals) where the element genuinely needs to read as floating above the page. The dark hero band uses no shadow at all — the brightness inversion is the entire elevation signal.

## 8. Interaction & Motion

### Easing Curves

- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — Material-style; default for hover, focus, colour transitions
- **Out-Soft**: `cubic-bezier(0.0, 0, 0.2, 1)` — gentle settle; dropdown reveal, scroll-reveal, mega-menu open

### Duration Buckets

| Bucket | Value | Use |
|--------|-------|-----|
| Fast | 150ms | Focus ring fade-in, link colour shift |
| Standard | 240ms | Button hover (orange deepen), card border deepen |
| Slow | 320ms | Scroll-reveal fade, mega-menu reveal |

### Per-Component Recipes

- **Primary CTA hover**: orange fill deepens `#ff5e1f` → `#f54900` over 240ms standard. Subtle — no aggressive scale, the colour shift carries the affordance.
- **Secondary CTA hover**: border deepens `#d4d4d4` and fill shifts toward `#fbfbfb` over 240ms.
- **Ghost button hover**: fill `transparent` → `#f3f3f3` recessed over 240ms.
- **Link hover**: blue `#193cb8` holds; an underline appears over 150ms.
- **Card hover**: border deepens + the soft shadow intensifies slightly over 240ms — minimal lift, calm and restrained.
- **Mega-menu**: panel reveals over 320ms ease-out-soft with a soft popover shadow.
- **Scroll-reveal**: marketing sections fade in over 320ms ease-out-soft when entering the viewport. One-shot per section.
- **Focus ring**: 2px orange ring fades in over 150ms on keyboard focus.

### Page Transitions

Page navigation uses a soft cross-fade with the sticky header staying static; anchor links smooth-scroll. The brand favours calm, low-drama transitions consistent with its infrastructure-trust register — nothing flashy, nothing that draws attention to the motion itself.

### Reduced Motion

Respects `prefers-reduced-motion: reduce`. Scroll-reveals become static on-mount, transforms suppress, transitions degrade to opacity-only or instant. Durations halve. The brand experience preserves full visual consistency under reduced-motion — nothing breaks, nothing disappears.

## 9. Accessibility & A11y

### Contrast Pairs

| Pair | Ratio | Level |
|------|-------|-------|
| `#262626` text on `#ffffff` canvas | 15.13 | AAA at all sizes |
| `#ffffff` text on `#262626` dark hero | 15.13 | AAA at all sizes |
| `#525252` secondary on `#ffffff` | 7.81 | AAA at body sizes |
| `#737373` subtle on `#ffffff` | 4.74 | AA at body sizes |
| `#333333` strong on `#ffffff` | ~12.6 | AAA at all sizes |
| `#ffffff` text on `#ff5e1f` orange CTA | 3.06 | AA Large only — CTA text is large/medium weight |
| `#262626` text on `#ff5e1f` orange | 4.95 | AA Large / near-AA body — usable for dark-on-orange |
| `#ff5e1f` orange on `#ffffff` | 3.06 | AA Large / UI components — used as fill, not body text |
| `#193cb8` link on `#ffffff` canvas | ~8.6 | AAA at body sizes |

The one pair that needs care is **white on the orange pill at 3.06:1** — it passes WCAG AA only for large or bold text. Cloudflare keeps CTA text at 14–15px medium-to-bold, which clears the AA-Large threshold (3:1 for large/bold). Where a stronger contrast is needed on orange, near-black `#262626` text on orange reaches 4.95:1. Orange is used as a *fill and UI-component* colour (which only needs 3:1 against adjacent surfaces), never as body text on white.

### Focus Indicators

Focus is a **2px solid orange `#ff5e1f` ring with 2px outline-offset** — the brand colour doing double duty as the focus indicator. It reads clearly on both the white canvas and the dark hero band (orange has strong contrast against both grounds), which is why the brand can use a single focus colour everywhere without theme-specific overrides.

### ARIA Patterns

- **Top nav**: `<nav aria-label="Primary">` with a skip-link to `<main>`; mega-menus use `aria-haspopup="true" aria-expanded` and `role="menu"`.
- **Product grids**: `<section>` with `<article>` cards; each card labelled via `aria-labelledby` pointing to its heading.
- **Code blocks**: `<pre><code role="region" aria-label="Wrangler command" tabindex="0">` — focusable and labelled.
- **Modal / dialog**: `role="dialog" aria-modal="true" aria-labelledby` with focus trap and Esc-to-close.
- **Stat callouts**: large display numbers carry an `aria-label` with the full spoken value and unit.
- **Status / system indicators**: `aria-live="polite"` ("All systems operational").

### Keyboard Navigation

- Tab order: skip-link → wordmark → primary nav → auth CTAs → main content (document order) → footer
- Arrow keys navigate inside mega-menu panels; `Esc` closes menus, modals, dropdowns
- Code blocks are focusable (`tabindex="0"`) so keyboard users can scroll/copy
- All interactive controls show the 2px orange focus ring

### Screen Reader Hints

- Uppercase eyebrows use CSS `text-transform: uppercase` so screen readers announce natural case
- Decorative hero artwork / cloud marks carry `aria-hidden="true"`
- Brand wordmark uses `aria-label="Cloudflare"`
- Stat numbers announce their full value and unit despite condensed display formatting

### Reduced Motion

All transitions degrade to opacity-only or instant; scroll-reveals render static on-mount. Visual consistency is preserved under `prefers-reduced-motion: reduce`.

## 10. Responsive Behavior

### Breakpoints

| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | <640px | Nav collapses to wordmark + hamburger; hero H1 drops 56→32px; cards 1-up; dark hero band shortens; CTA pills stack vertically full-width |
| Tablet | 640–1024px | Nav keeps inline links (no mega-menu); hero H1 ~40px; cards 2-up |
| Desktop | 1024–1280px | Full nav with mega-menus; hero H1 at 48–56px; cards 3-up; full grid layouts |
| Wide | >1280px | Content caps at 1280px; gutters absorb the extra width |

### Touch Targets

- Pill buttons: ~44px height on mobile (full-width stacked), ~40–44px on desktop
- Nav links: 44×44px minimum tap area even at 14px text
- Tag chips: 24px visual height with padding for a 44px effective tap area
- Inputs: ~44px height for comfortable touch

### Collapsing Strategy

- **Top nav** at <1024px: links collapse into a hamburger sheet; mega-menus become accordion sections inside the sheet
- **Hero CTA pair** at <640px: stacks vertically (orange primary above, white secondary below), full-width pills
- **Card grids**: 4 → 3 → 2 → 1 columns
- **Dark hero band**: shortens vertically; headline and CTAs stack; the dark ground persists
- **Customer logo grid**: 6 → 4 → 3 → 2 columns; logos hold aspect ratio
- **Comparison tables**: collapse to stacked cards or horizontal scroll with snap points on mobile

### Image Behavior

Customer and partner logos render monochrome (often via `currentColor`) so they inherit the secondary-text colour on white. Product screenshots use `aspect-ratio` to prevent layout shift. Hero artwork is eager-loaded; below-fold imagery is lazy-loaded. Marketing illustrations use `srcset` 1x/2x for retina.

## 11. Content & Voice

### Tone

**Technical, trustworthy, calm, agent-era confident.** Cloudflare writes like an infrastructure engineer who's seen scale — direct, precise, willing to use product names (Workers, R2, D1, Hyperdrive) without over-explaining, but never condescending. Headlines are forward-looking statements ("Build for the agent era"); subheads explain capability; product copy uses accurate technical vocabulary (edge, region, origin, latency) without translating it into consumer-speak. The register is the inverse of consumer enthusiasm and the inverse of enterprise legalese — peer-to-peer engineering with a steadying, "we handle the hard part" reassurance.

### Microcopy Patterns

- **Button verbs**: *Start building*, *Start building for free*, *Sign up*, *Talk to an expert*, *Contact sales*, *Log in*. Outcome-focused, building-oriented.
- **Error messages**: specific and accountable — *"Couldn't reach the origin server. Check your DNS configuration and retry."* — names the exact technical detail and the next step.
- **Success confirmations**: brief and declarative — *"Deployed."* / *"DNS records updated."* — no exclamation.
- **Empty states**: instruction-led with the exact command — *"No Workers yet. Run `npm create cloudflare@latest` to deploy your first."*
- **Field labels**: single-word where possible — *Domain*, *Email*, *Zone*, *Route*. No friendly framing.
- **Loading states**: context-specific — *"Provisioning…"*, *"Propagating DNS…"*, *"Deploying to the edge…"* — never just "Loading…"

### Empty States

Empty states explain the state, offer the next step, and include the exact action. The developer-platform tone anchors them: "No projects yet — connect a repository or run `wrangler deploy` to start." Marketing-surface empty states (rare) follow the same convention: explain, then provide a single clear action.

### CTA Verb Conventions

- Primary on hero: *Start building*, *Start building for free*, *Sign up*, *Talk to an expert*
- Secondary: *Contact sales*, *Learn more*, *Read the docs*, *Log in*
- Tertiary text: *See how it works*, *Explore the platform*, *View pricing*, *Read the changelog*
- Avoided: *Click here*, *Submit*, *Buy now*, exclamation-heavy enthusiasm. Cloudflare uses building-oriented verbs and product names directly.

## 12. Dark Mode & Theming

**Dual-theme via Kumo `light-dark()`.** Cloudflare's design system ships both light and dark themes through the CSS `light-dark()` function applied to the `--color-kumo-*` token set. The neutral ramp (`--color-kumo-neutral-50` through `-1000`), semantic roles (`canvas / elevated / recessed / contrast`), and text tokens all resolve per theme. The default register on the marketing site is **light** (white canvas), but the system is theme-aware and respects `prefers-color-scheme`.

The defining nuance: the **dark hero band is always dark, regardless of theme.** It is not a dark-mode artifact — it's a deliberate inversion at the top of the (otherwise light) page, a `#262626` ground that frames the hero headline in white. So the page has *two kinds of dark*: the always-dark hero/stat bands (a brand gesture) and the optional system dark theme (a full token swap).

Representative dark-theme token swaps (Kumo `light-dark(light, dark)`):

- **canvas**: `#ffffff` → near-black (`--color-kumo-neutral-950`, `#0b0b0b`)
- **elevated**: `#f8f8f8` → `#0f0f0f` (neutral-925)
- **text**: `#262626` → near-white (`--text-color-kumo-default` inverse)
- **text-subtle**: `#737373` → lifted neutral
- **brand**: `#ff5e1f` (unchanged — Cloudflare orange reads strongly on both grounds)
- **link**: `#193cb8` → a lifted blue (blue-400, `#51a2ff`) for legibility on dark
- **border**: `#e5e5e5` → translucent white hairline
- **focus ring**: `#ff5e1f` (unchanged — orange is theme-agnostic)

The orange is the one token that never changes across themes or bands — it is the constant brand anchor on white, on the dark hero, and in dark mode alike.

## 13. Lineage & Influences

Cloudflare's identity rests on two pillars that do almost all the recognition work: **the orange** (`#ff5e1f`, rgb 255, 94, 31) and **FT Kunst Grotesk**, the company's custom grotesque. The colour is so strongly associated with the brand that a single orange pill on a white page reads "Cloudflare" before the wordmark does — the same way Stripe owns its purple-blue and Vercel owns its triangle. The type sits squarely in the Swiss / International-Typographic-Style grotesque tradition: even strokes, generous apertures, grid clarity, ornament-free hierarchy. Setting headlines at weight 500 rather than 700 is the brand's signature restraint — confidence without volume.

The systemic backbone is **Kumo**, Cloudflare's internal design-token set, authored in the **oklch color space** and themed with CSS `light-dark()`. oklch gives the neutral ramp perceptual evenness — each step in `--color-kumo-neutral-*` is visually equidistant — and lets a single token map drive both themes. The semantic-role layer (`canvas / elevated / recessed / contrast`, plus text and border roles) is the modern design-system pattern shared by Radix, Tailwind, and the broader token-driven generation; Cloudflare's version is notable for how restrained the chromatic surface is — orange for action, blue for links, everything else neutral.

The register descends from the **developer-product-as-infrastructure** lineage that Stripe and Vercel share: technical marketing drawn with magazine-grade calm, a single confident accent, dense-where-it-helps and breathing-everywhere-else. Where Vercel withholds its brand colour from buttons (blue is a link only), Cloudflare makes the opposite, equally-disciplined choice: orange *is* the action, rationed so tightly that it never appears outside CTAs, brand moments, and the focus ring.

What Cloudflare rejects: cream or warm canvases (the brand is pure white), heavy ornamentation (Swiss-grotesque clarity wins), shouty 700/800 hero weights (the grotesque holds at 500), saturated rainbow palettes (one orange, one link blue, calm neutrals), and dramatic shadows (soft low-opacity lifts only). The "agent era" repositioning adds a forward-looking, build-oriented voice on top of an otherwise classically-restrained infrastructure aesthetic.

**Influences:**

- **Cloudflare Design (cloudflare.design)** — Owner of the orange `#ff5e1f`, FT Kunst Grotesk, and the Kumo design language the site renders. *https://www.cloudflare.design*
- **Cloudflare Workers / developer platform** — The product surface the register is built around; the "agent era" positioning and technical-calm voice. *https://workers.cloudflare.com*
- **Stripe** — Developer-product-as-infrastructure register; technical marketing with restraint and a single confident accent. *https://stripe.com*
- **Vercel** — Adjacent dev-tool peer; near-black-on-near-white neutral discipline and full-pill hero CTAs at light-mode contrast. *https://vercel.com*
- **oklch color space** — The Kumo ramps are authored in oklch for perceptually-even neutral and accent scales with `light-dark()` theming. *https://oklch.com*
- **Swiss / International Typographic Style** — Grotesque type, grid clarity, ornament-free hierarchy — FT Kunst Grotesk's tradition. *https://en.wikipedia.org/wiki/International_Typographic_Style*

## 14. Do's and Don'ts

### Do

- **Do** use pure white `#ffffff` for the canvas — calm and bright. Off-white `#fbfbfb` for subtle bands, never cream.
- **Do** use **FT Kunst Grotesk** for both display and body. The single-family grotesque is the brand's typographic identity.
- **Do** set headlines at **weight 500**, not 700/800. The grotesque reads confident at 500; heavier is shouting.
- **Do** make the primary CTA an **orange-filled full-pill** (`#ff5e1f`, radius 9999, white text). Orange *is* the action.
- **Do** invert the hero to a **dark `#262626` band** with white headline type, then return to white.
- **Do** ration the orange — CTAs, brand moments, focus ring. One orange pill per view, never orange body text or section backgrounds.
- **Do** use full-pill (9999) for *all* buttons; 12px for cards; 8px for inputs and code blocks.
- **Do** use blue `#193cb8` for inline links — links are blue, actions are orange, and they never overlap.
- **Do** ship soft low-opacity shadows (8–12% black); let the hairline border do the elevation work on white.
- **Do** keep CTA text medium/large weight so white-on-orange clears AA-Large contrast.
- **Do** use the orange as the focus ring on both white and dark grounds — it's theme-agnostic.
- **Do** write in a technical, calm, build-oriented "agent era" voice with accurate product names.

### Don't

- **Don't** use cream or warm off-white for the canvas. Cloudflare is pure white.
- **Don't** withhold orange from the primary button — that's Vercel's logic. Here, the orange *is* the primary action.
- **Don't** set hero headlines at 700/800. The signature is weight 500.
- **Don't** use orange for body text on white — at 3.06:1 it fails body contrast. Orange is a fill/UI colour only.
- **Don't** flood the page with orange. Section backgrounds, large orange fields, or orange paragraphs break the discipline.
- **Don't** square off the CTAs. Full-pill (9999) is the brand button shape; sharp or 8px corners read as a different brand.
- **Don't** confuse the link blue with the action orange — links are `#193cb8`, actions are `#ff5e1f`.
- **Don't** apply heavy drop shadows. Soft 8–12% lifts only; the hairline border carries elevation.
- **Don't** introduce a serif or a second sans. FT Kunst Grotesk is the whole system; the mono is for code only.
- **Don't** crowd the layout. Infrastructure-calm whitespace is part of the brand; let the white breathe.
- **Don't** make the dark hero band a full dark mode — it's a deliberate inversion at the top, not a theme.
- **Don't** use exclamation-heavy consumer enthusiasm. The voice is calm, technical, trustworthy.

## 15. Agent Prompt Guide

### Quick Color Reference

```
Canvas:           #ffffff
Off-White Band:   #fbfbfb
Elevated:         #f8f8f8
Recessed/Code:    #f3f3f3
Dark Hero Band:   #262626
Text:             #262626   (near-black, rgb 38,38,38)
Text Secondary:   #525252
Text Subtle:      #737373
Brand Orange:     #ff5e1f   (THE action color — rgb 255,94,31)
Brand Hover:      #f54900
On-Brand Text:    #ffffff
Link Blue:        #193cb8
Border:           #e5e5e5
Focus Ring:       2px solid #ff5e1f, 2px offset
```

### Example Component Prompts

1. **"Create a Cloudflare-style hero: a full-bleed dark `#262626` band, white 56px / 500 FT Kunst Grotesk headline with `-0.02em` tracking ('Build for the agent era'), 18px / 400 white deck below at 1.55 line-height. Two full-pill CTAs beneath: primary orange pill (`#ff5e1f` fill, white text 15px / 500, radius 9999, 12×24 padding) and secondary white pill (`#ffffff` fill, near-black `#262626` text, 1px `#d4d4d4` border, radius 9999). Below the band, the page steps down to a pure-white `#ffffff` canvas."**

2. **"Design a Cloudflare product card: `#ffffff` (or `#f8f8f8`) background, 12px radius, 1px `#e5e5e5` hairline border, 24px padding, soft shadow `0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08)`. Inside: 24×24 icon in `#262626`, 20px / 600 FT Kunst Grotesk heading, 16px / 400 body in `#525252`, and a `Learn more` link in blue `#193cb8`. Hover: border deepens, shadow intensifies slightly — minimal lift."**

3. **"Build a Cloudflare CTA pair: primary full-pill button — `#ff5e1f` Cloudflare-orange fill, white text 'Start building' at 15px / 500, radius 9999, 12×24 padding, hover deepens to `#f54900`. Secondary full-pill — `#ffffff` fill, `#262626` text 'Contact sales', 1px `#d4d4d4` border, radius 9999. Both fully rounded; orange is the dominant action."**

4. **"Compose a Cloudflare quick-deploy code band: pure-white `#ffffff` section, centered code block with `#f3f3f3` recessed fill, 8px radius, 1px `#e5e5e5` border, 16×20 padding, system monospace 14px / 400 / 1.6 line-height showing `npm create cloudflare@latest`. Above it, an uppercase eyebrow 'GET STARTED' in FT Kunst Grotesk 12px / 600 / 0.06em in `#737373`, and a 40px / 500 headline in `#262626`."**

5. **"Render a Cloudflare top nav: `#ffffff` background, 64px height, 1px bottom hairline `#e5e5e5`. Cloudflare wordmark left. Center: mega-menu links (Products, Solutions, Resources, Pricing, Docs) at 14px / 500 ghost style in `#262626`. Right: ghost `Log in` + primary orange full-pill `Sign up` (`#ff5e1f` fill, white text, radius 9999, 10×20 padding). On scroll over a dark hero, the nav renders translucent white."**

6. **"Build a Cloudflare stat band: full-width dark `#262626` band, three large stat callouts in white FT Kunst Grotesk display weight (e.g. '20% of the web', '330+ cities', 'millions of requests/sec'), each with a 16px / 400 caption in lifted grey beneath. The orange `#ff5e1f` highlights one key number. Calm spacing, 96px+ vertical padding."**

### Iteration Guide

1. **Check the canvas and the hero.** White `#ffffff` body, and a *dark* `#262626` hero band — if your hero is on white, you've missed the brand's defining inversion. The dark band frames the headline, then the page returns to white.
2. **Switch to FT Kunst Grotesk.** Inter or a generic grotesque at the same sizes loses the brand. FT Kunst Grotesk for display *and* body is the typographic identity.
3. **Drop the headline weight to 500.** If your hero is 700/800, it's too loud. Cloudflare's 56px / 500 is the canonical hero — confident, not shouting.
4. **Make the orange the action.** Unlike Vercel, the primary CTA here is *orange-filled*. If your primary button is near-black or white, you've ported the wrong dev-tool logic. The orange pill is the dominant action.
5. **Ration the orange.** It belongs on CTAs, brand moments, and the focus ring — nowhere else. No orange body text, no orange section backgrounds. The colour is loud because it's rare.
6. **Full-pill every button.** Radius 9999 on primary, secondary, and ghost. Square or 8px-cornered buttons read as a different brand. Cards stay at 12px.
7. **Separate link blue from action orange.** Inline links are blue `#193cb8`; actions are orange. Keep them distinct — never an orange link, never a blue button.
8. **Keep shadows soft and the whitespace generous.** 8–12% low-opacity lifts, hairline borders, 96px+ section gutters. The infrastructure-calm breathing room is part of the brand.

---

*Theme-toggle audit: score=2, signals=[kumo-light-dark, dark-hero-band]*
Prose

1. Visual Theme & Atmosphere

Cloudflare’s marketing site reads like the calm surface of something enormous. The company sits between a large fraction of the internet and its origins — DNS, CDN, DDoS mitigation, edge compute, an entire developer platform — and the design’s whole job is to make that scale feel approachable rather than intimidating. The result is a near-pure white #ffffff canvas, near-black #262626 body type, generous breathing room, and exactly one colour that does the brand-recognition work a logo usually does: Cloudflare orange #ff5e1f.

The single most distinctive move is the dark hero band. While the rest of the page lives on white, the hero inverts to a near-black #262626 ground with a white 56px / 500 headline (“Build for the agent era”). This is not a full dark mode — it’s a deliberate inversion at the top of the page, a stage-lit moment that frames the headline before the page returns to its calm white register. The contrast between the dark hero and the white body is the brand’s primary rhythmic gesture, and it repeats: dark bands appear sparingly to punctuate, never to dominate.

The type carries the brand as much as the colour. FT Kunst Grotesk — Cloudflare’s custom grotesque — sets every headline and every paragraph. The most telling detail is the weight discipline: where most SaaS sites push hero copy to weight 700 or 800, Cloudflare sets its hero at weight 500. The grotesque silhouette is confident enough at 500 that pushing heavier would read as shouting. Headlines feel engineered and self-assured rather than loud — appropriate for a company whose pitch is “we handle the hard part so you don’t have to.”

The chromatic discipline is where Cloudflare diverges from a peer like Vercel. Vercel withholds its brand blue from buttons entirely — blue is a link, never an action. Cloudflare does the opposite: the orange is the action. The primary CTA is an orange-filled full-pill with white text (“Start building”); the secondary is a white pill with near-black text. Orange appears on the dominant action, on brand moments, and as the focus ring — but it’s still rationed. You won’t find orange section backgrounds or orange body text. The colour is loud precisely because it’s rare; one orange pill on a white page is impossible to miss.

The underlying system is Kumo, Cloudflare’s internal design-token set. The colour tokens are authored in the oklch color space (--color-kumo-neutral-50 through -1000, semantic roles like --color-kumo-canvas / elevated / recessed / contrast) and themed with the CSS light-dark() function. The neutral ramp is perceptually even, the orange is the brand token, and blue (--text-color-kumo-link, blue-800) is the link colour. The vocabulary that captures the feeling: infrastructure-calm, white-canvas, dark-hero-band, FT-Kunst-grotesque, orange-action, full-pill, near-black-neutral, oklch-tokened, agent-era, trustworthy-technical, ornament-free, Swiss-grid-clarity.

Key Characteristics

  • Pure white #ffffff canvas — the calm base; off-white #fbfbfb bands for subtle elevation, never cream
  • Near-black #262626 (rgb 38, 38, 38) body and headline type — never true black, slightly softened
  • Custom FT Kunst Grotesk throughout — display and body, the brand’s typographic identity
  • Hero weight 500, not 700/800 — the grotesque reads confident without shouting
  • Signature Cloudflare orange #ff5e1f (rgb 255, 94, 31) — the one chromatic identity colour
  • Orange is the primary action — orange-filled full-pill CTA with white text (the opposite of Vercel)
  • Dark hero band: white 56px / 500 headline on near-black #262626 ground, then page returns to white
  • Full-pill CTAs (radius 9999) — orange primary pill + white secondary pill, both fully rounded
  • Blue (#193cb8) reserved for inline links; orange reserved for actions and brand
  • Kumo design-token system — oklch neutral ramp, semantic role tokens, light-dark() theming
  • Ornament-free Swiss-grotesque clarity — grid discipline, no decorative noise, generous whitespace
  • Trustworthy-technical “agent era” register — infrastructure scale drawn calmly

2. Color Palette & Roles

Canvas & Surface

  • Canvas (#ffffff): the page background — pure white, the base Kumo surface (--color-kumo-base). The calm ground the entire brand rests on.
  • Canvas Off-White (#fbfbfb) [→ --color-kumo-canvas, neutral-50]: the faintest off-white band for subtle section elevation. Distinguishable from pure white only in adjacency.
  • Elevated (#f8f8f8) [→ --color-kumo-elevated, neutral-75]: raised surface — feature cards on white, inset panels.
  • Recessed (#f3f3f3) [→ --color-kumo-recessed, neutral-125]: inset fill — code blocks, quiet wells, recessed regions.

Text

  • Body Text (#262626): primary body and headline colour (rgb 38, 38, 38) — near-black, slightly softened off true #000. 15.1:1 against white, AAA everywhere.
  • Text Strong (#333333) [→ --text-color-kumo-strong]: emphasis text, sub-headings on white.
  • Text Secondary (#525252): supporting copy, dense rows — 7.8:1, AAA at body sizes.
  • Text Subtle (#737373) [→ --text-color-kumo-subtle]: captions, meta — 4.7:1, AA at body sizes.
  • Text Placeholder (#9ca3af) [→ --text-color-kumo-placeholder]: placeholder, inactive, disabled controls.
  • Text on Dark (#ffffff) [→ --text-color-kumo-inverse]: white type on the dark hero band — 15.1:1 against #262626.

Brand

  • Cloudflare Orange (#ff5e1f) (rgb 255, 94, 31): THE brand colour. Primary CTA fill, focus ring, brand moments. The single most recognisable token in the system. Orange is the action.
  • Brand Hover (#f54900) [→ orange-600]: deepened orange for hover / pressed states on the primary pill.
  • Brand Soft (rgba(255, 94, 31, 0.10)): soft orange wash — badge backgrounds, focus aura, subtle brand emphasis.
  • Badge Orange / Amber (#ffac00) [→ --color-kumo-badge-orange, orange-650]: warmer amber accent for status chips, distinct from the action orange.

Interactive

  • Link (#193cb8) [→ --text-color-kumo-link, blue-800]: inline links in body copy. Blue is the link colour; orange is the action colour — the two never overlap.
  • Focus (#ff5e1f 2px ring + 2px offset): keyboard focus indicator — the brand orange does double duty as the focus colour.
  • On-Brand (#ffffff): white text on the orange pill — at 3.06:1 this passes AA Large only, so CTA text is always large/medium-weight.

Neutral Ramp (Kumo, oklch-authored)

  • neutral-50 (#fbfbfb) — canvas off-white
  • neutral-75 (#f8f8f8) — elevated
  • neutral-125 (#f3f3f3) — recessed
  • border-soft (#f0f0f0) — quietest separation
  • border (#e5e5e5) — default hairline
  • border-strong (#d4d4d4) — outlined controls, focused inputs
  • text-subtle (#737373) — captions, meta
  • text-secondary (#525252) — supporting copy
  • text-strong (#333333) — emphasis
  • text (#262626) — primary body / headline
  • bg-hero / bg-contrast (#262626 / #0f0f0f) — dark inversion grounds

Borders

  • Border Default (#e5e5e5): the default hairline — card edges, dividers. Carries most of the elevation work on white.
  • Border Soft (#f0f0f0): quietest separation — inside-card dividers.
  • Border Strong (#d4d4d4): outlined buttons, focused-input border, high-emphasis dividers.

Semantic

  • Success (#058378 on rgba(5, 131, 120, 0.10)) [→ teal-650]: Cloudflare’s success register leans teal/green rather than a saturated green — calmer, infrastructure-appropriate.
  • Warning (#ffac00 on rgba(255, 172, 0, 0.10)) [→ orange-650 / yellow]: advisory amber — rate limits, advisories. Distinct from the action orange.
  • Danger (#c10007 on rgba(193, 0, 7, 0.10)) [→ red-700]: errors, destructive actions, outage states.
  • Info (#193cb8 on rgba(25, 60, 184, 0.10)) [→ blue-800]: info reads as the link blue.

3. Typography Rules

Font Family

Primary: "FT Kunst Grotesk", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif. FT Kunst Grotesk is Cloudflare’s custom grotesque, used for both display and body — a single-family discipline that makes the brand instantly recognisable. The silhouette sits in the Swiss / International-Typographic-Style grotesque tradition: even strokes, generous apertures, ornament-free, engineered confidence. The defining brand decision is the weight register — headlines hold at weight 500, not the SaaS-default 700/800. The grotesque is confident enough at 500 that heavier weights would read as shouting.

Mono companion: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace. Cloudflare uses a system monospace stack for code blocks, CLI commands (wrangler, npx), environment variables, and route paths — pragmatic rather than proprietary. The mono is a utility face, not part of the brand identity the way FT Kunst Grotesk is.

Weights in use: 400 (body), 500 (headlines, labels, the signature display weight), 600 (sub-card headings, eyebrows, emphasis), 700 (rare peak display). The single-family discipline (FT Kunst Grotesk for display, body, captions, labels) means the brand identity is carried by the type itself — even with the orange removed, you’d recognise the page by the grotesque.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
display-heroFT Kunst Grotesk72px6001.0-0.03emLargest landing display
display-lgFT Kunst Grotesk56px5001.05-0.02emThe live hero H1 — white on dark band
h1FT Kunst Grotesk48px5001.1-0.018emPage title / H2 on white (live: 48px / 500)
h2FT Kunst Grotesk40px5001.12-0.015emMarketing section opener
h3FT Kunst Grotesk32px5001.2-0.01emSub-section heading
h4FT Kunst Grotesk24px6001.25-0.005emCard heading
h5FT Kunst Grotesk20px6001.30Sub-card heading, inline emphasis
body-lgFT Kunst Grotesk18px4001.550Hero deck, lede paragraph
bodyFT Kunst Grotesk16px4001.550Default body (live: 16px / 400)
body-smFT Kunst Grotesk14px4001.50Card body, dense-row body
labelFT Kunst Grotesk13px5001.40Form field label, button copy
captionFT Kunst Grotesk12px5001.40.01emImage caption, footer micro
eyebrowFT Kunst Grotesk12px6001.40.06emUppercase section pre-label
codesystem mono14px4001.60Code block, CLI command content
code-inlinesystem mono14px5001.50Inline code references

Principles

  • Single-family discipline. FT Kunst Grotesk for display, body, captions, labels. The system mono is a utility face for code only. There is no third sans anywhere.
  • Weight 500 is the headline weight. The live hero is 56px / 500, not 700. The grotesque’s engineered silhouette already reads as confident; heavier weights would feel shouty. This is the single most-copied typographic detail of the brand.
  • Body holds at weight 400. Calm, even body type — the brand reads as precise-and-unhurried rather than dense-and-loud.
  • Negative tracking compresses with size. -0.03em at the 72px display, -0.02em at 56px, -0.018em at 48px, easing to near-zero at body sizes.
  • 16px body, 1.55 line-height. Comfortable marketing-page readability; reading column caps near 720px for ~70-character lines.
  • Uppercase eyebrows at 0.06em. Section pre-labels use FT Kunst Grotesk weight 600 uppercase with wide tracking — the brand’s secondary-hierarchy tell.
  • White headlines on dark, near-black on white. Hero headlines are #ffffff on the #262626 band; all other headlines are #262626 on white. The colour swap follows the band, not the hierarchy level.
  • No serif, no italic display. FT Kunst Grotesk is set roman across all hierarchy; italics carry quoted titles only.

4. Component Stylings

Buttons

Primary Pill (Orange)#ff5e1f Cloudflare-orange background, white text at 14–15px / 500, 9999px full-pill radius, 12×24px padding. Hover deepens to #f54900 over 240ms standard. The dominant CTA: Start building, Sign up, Talk to an expert. Orange is the action — this is the brand’s defining button and the inverse of Vercel’s withhold-the-brand-colour discipline. CTA text is medium/large weight because white-on-orange sits at AA-Large contrast.

Secondary Pill (White)#ffffff fill, near-black #1f1f1f#262626 text at 14px / 500, 1px border at #d4d4d4 border-strong, 9999px full-pill radius, 12×24px padding. Hover deepens the border and shifts fill toward #fbfbfb. Paired adjacently with the orange primary: Start building for free, Contact sales, Learn more.

Ghost (Quiet) — Transparent background, near-black text at 14px / 500, 9999px pill radius, 10×16px padding. Hover fills with #f3f3f3 recessed tone. Use case: nav links, footer secondaries, in-card tertiary actions.

On-Dark Pill — On the dark hero band, the secondary becomes a white-bordered or translucent-white pill with white text, while the primary orange pill stays orange (it reads strongly on both white and the dark band). The orange is theme-agnostic.

Cards

Default Card#ffffff (or #f8f8f8 elevated) fill, 1px hairline border at #e5e5e5, 12px radius, 24px padding, soft dual-layer shadow (0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08)). The signature card — feature grids, product tiles, solution cards. The border + faint shadow lift the card above the white canvas.

Flat Card — Same as default but shadow: none; border carries the elevation. Used for dense product grids and pricing layouts where many cards stack tightly.

Dark Card#262626 near-black fill (matching the hero band), white text, 12px radius, 32px padding. Used for highlight blocks and stat callouts on otherwise white pages — a fragment of the hero band repeated as a card.

Code Blocks

Code Block#f3f3f3 recessed fill (or #262626 dark-themed), near-black text, 8px radius, 16×20px padding, 1px hairline border. System monospace 14px / 400 / 1.6 line-height. Used for wrangler CLI commands, Workers snippets, config examples. Quick-deploy commands (npm create cloudflare) are the brand’s signature inline-code moment.

Inline Code#f3f3f3 recessed fill, near-black text at 14px / 500 in system mono, 4px radius, 2×6px padding. Plain grey tint — no brand-orange tinting on inline code; the neutral discipline holds.

Badges, Tags, Pills

Status Badge (Orange)rgba(255, 94, 31, 0.10) brand-soft fill, orange text, 12px / 600, 9999px or 4px radius, 2×8px padding. Use case: NEW, BETA, brand-flagged features.

Badge (Amber)rgba(255, 172, 0, 0.12) fill with amber #ffac00 text — the warmer accent chip distinct from the action orange.

Badge (Neutral)#f3f3f3 fill, secondary-text colour, 12px / 500, 4px radius. Use case: category labels, region tags, version chips.

Status Badge (Teal/Success)rgba(5, 131, 120, 0.10) fill with teal #058378 text — operational / available status.

Inputs / Forms

Text Input#ffffff fill, near-black text at 16px / 400, 1px border at #e5e5e5, 8px radius, 10×14px padding, ~44px height. Placeholder at #9ca3af. On focus: border shifts to #ff5e1f and a 2px orange focus ring appears with 2px offset. The orange focus ring is consistent across every interactive control.

Select / Combobox — Same shape as text-input with a chevron icon at right (12px) in subtle-text colour.

Top Nav#ffffff (or translucent white with backdrop blur on scroll), 64px height, 1px bottom hairline at #e5e5e5. Cloudflare wordmark + cloud mark left. Center: product / solution mega-menu links at 14px / 500 ghost style. Right: ghost Log in + orange primary Sign up / Start building full-pill. On the dark hero, the nav can render translucent over the dark band before the page transitions to white.

Footer — White (no band separation) or faint #fbfbfb, 96–128px top padding, multi-column link grid (Products, Solutions, Resources, Company) at 14px / 400 secondary-text, with the wordmark, region/language selector, and social links at the bottom.

5. Layout Principles

Spacing System

  • Base unit: 4px
  • Scale: 0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 · 128
  • Section padding (vertical): 96–128px for major marketing bands; 48–64px between secondary sections; 24–32px between content blocks
  • Card internal padding: 24px on default cards; 32px on dark feature cards; 16×20px on code blocks
  • Inter-card gutters: 24px in 2-up / 3-up grids; 16px in dense 4-up product grids

Grid & Container

  • Page max width: 1280px for marketing sections, with a 720px reading column inside prose
  • 12-column grid with 24px gutters; product/solution grids run 3-up at desktop, 4-up for dense logo or product tiles
  • Hero treatment: full-bleed dark #262626 band, headline left-aligned or centered, white type, orange + white pill CTAs beneath; the dark band has its own internal padding before the page steps back to white

Whitespace Philosophy

Cloudflare uses generous, infrastructure-calm whitespace. The brand never crowds — section gutters run 96px+, hero padding 128px+, and the white canvas dominates so the rare orange and the single dark hero band land with maximum impact. The discipline is “let the white breathe; the orange does the talking.” Density appears only where it serves comprehension — comparison tables, product matrices — never as a default.

Section Cadence

A typical Cloudflare page runs:

  1. Dark Hero#262626 band, white 56px / 500 headline, 18px / 400 white deck, orange primary pill + white secondary pill, then a step down to white
  2. Product / Capability Grid — white or #f8f8f8 cards in 3-up, hairline borders, soft shadow, 24px / 500–600 titles + 16px / 400 body
  3. Code / Quick-Deploy Band — white background with a centered code block (npm create cloudflare) and prose introducing the example
  4. Stat / Trust Band — large numbers (requests/sec, network reach) in FT Kunst Grotesk display weight, often on a dark #262626 band repeating the hero ground
  5. Solutions / Use-Case Grid — white cards, category badges, 3-up
  6. Customer Logos — monochrome logo grid on white or faint off-white
  7. Closing CTA — centered orange primary pill on white (or one more dark band), single dominant action
  8. Footer — multi-column links on white / faint off-white

The “alternation” is brightness-based (white → dark band → white) rather than colour-based — the dark hero/stat bands punctuate an otherwise white page.

6. Shapes & Radius Scale

TierValueUse
Micro2pxDecorative dividers, inner chip detail
Small4pxStatus badges, tag chips, inline code
Standard8pxInputs, code blocks, small surfaces
Comfortable12pxCards (default), product tiles, modals
Large16pxLarge surfaces, hero panels, feature illustrations
Pill9999pxAll CTAs — the brand’s signature button shape

Cloudflare’s signature shape is the full-pill CTA (radius 9999, probed as 3.35e7px = the max-pill convention). Every button — primary orange, secondary white, ghost — is fully rounded. This is the brand’s most-copied gesture: the soft, friendly pill softens the otherwise technical register and makes the orange action feel approachable. Cards and surfaces use a gentler 12px radius, inputs and code blocks 8px. The contrast between fully-round pills and modestly-rounded cards is intentional: actions are soft and inviting, content surfaces are crisp and structured.

7. Depth & Elevation

LevelTreatmentUse
0 — Flatno shadow, white canvasPage canvas, body sections
1 — Hairline1px #e5e5e5 borderFlat cards, dense tiles, table rows
2 — Edge0 1px 2px rgba(0, 0, 0, 0.12)Quiet lift — chips, small surfaces (Kumo shadow-edge)
3 — Card0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08)Default feature cards (Kumo shadow-drop)
4 — Popover0 12px 32px -8px rgba(0, 0, 0, 0.12)Dropdowns, mega-menu panels, tooltips
5 — Modalscrim rgba(0, 0, 0, 0.40) + deep popover shadowDialogs, sign-up modals

Shadow Philosophy

Cloudflare’s shadows are soft and low-opacity — the Kumo tokens --color-kumo-shadow-edge (12% black) and --color-kumo-shadow-drop (8% black) define a restrained two-tier stack. On the white canvas, the hairline border does most of the elevation work; the shadow is a faint diffusion that lifts cards a few millimetres off the page rather than dramatically floating them. The discipline matches the brand’s calm register: nothing should look like it’s hovering urgently. Heavy shadows appear only on true overlay UI (popovers, modals) where the element genuinely needs to read as floating above the page. The dark hero band uses no shadow at all — the brightness inversion is the entire elevation signal.

8. Interaction & Motion

Easing Curves

  • Standard: cubic-bezier(0.4, 0, 0.2, 1) — Material-style; default for hover, focus, colour transitions
  • Out-Soft: cubic-bezier(0.0, 0, 0.2, 1) — gentle settle; dropdown reveal, scroll-reveal, mega-menu open

Duration Buckets

BucketValueUse
Fast150msFocus ring fade-in, link colour shift
Standard240msButton hover (orange deepen), card border deepen
Slow320msScroll-reveal fade, mega-menu reveal

Per-Component Recipes

  • Primary CTA hover: orange fill deepens #ff5e1f#f54900 over 240ms standard. Subtle — no aggressive scale, the colour shift carries the affordance.
  • Secondary CTA hover: border deepens #d4d4d4 and fill shifts toward #fbfbfb over 240ms.
  • Ghost button hover: fill transparent#f3f3f3 recessed over 240ms.
  • Link hover: blue #193cb8 holds; an underline appears over 150ms.
  • Card hover: border deepens + the soft shadow intensifies slightly over 240ms — minimal lift, calm and restrained.
  • Mega-menu: panel reveals over 320ms ease-out-soft with a soft popover shadow.
  • Scroll-reveal: marketing sections fade in over 320ms ease-out-soft when entering the viewport. One-shot per section.
  • Focus ring: 2px orange ring fades in over 150ms on keyboard focus.

Page Transitions

Page navigation uses a soft cross-fade with the sticky header staying static; anchor links smooth-scroll. The brand favours calm, low-drama transitions consistent with its infrastructure-trust register — nothing flashy, nothing that draws attention to the motion itself.

Reduced Motion

Respects prefers-reduced-motion: reduce. Scroll-reveals become static on-mount, transforms suppress, transitions degrade to opacity-only or instant. Durations halve. The brand experience preserves full visual consistency under reduced-motion — nothing breaks, nothing disappears.

9. Accessibility & A11y

Contrast Pairs

PairRatioLevel
#262626 text on #ffffff canvas15.13AAA at all sizes
#ffffff text on #262626 dark hero15.13AAA at all sizes
#525252 secondary on #ffffff7.81AAA at body sizes
#737373 subtle on #ffffff4.74AA at body sizes
#333333 strong on #ffffff~12.6AAA at all sizes
#ffffff text on #ff5e1f orange CTA3.06AA Large only — CTA text is large/medium weight
#262626 text on #ff5e1f orange4.95AA Large / near-AA body — usable for dark-on-orange
#ff5e1f orange on #ffffff3.06AA Large / UI components — used as fill, not body text
#193cb8 link on #ffffff canvas~8.6AAA at body sizes

The one pair that needs care is white on the orange pill at 3.06:1 — it passes WCAG AA only for large or bold text. Cloudflare keeps CTA text at 14–15px medium-to-bold, which clears the AA-Large threshold (3:1 for large/bold). Where a stronger contrast is needed on orange, near-black #262626 text on orange reaches 4.95:1. Orange is used as a fill and UI-component colour (which only needs 3:1 against adjacent surfaces), never as body text on white.

Focus Indicators

Focus is a 2px solid orange #ff5e1f ring with 2px outline-offset — the brand colour doing double duty as the focus indicator. It reads clearly on both the white canvas and the dark hero band (orange has strong contrast against both grounds), which is why the brand can use a single focus colour everywhere without theme-specific overrides.

ARIA Patterns

  • Top nav: <nav aria-label="Primary"> with a skip-link to <main>; mega-menus use aria-haspopup="true" aria-expanded and role="menu".
  • Product grids: <section> with <article> cards; each card labelled via aria-labelledby pointing to its heading.
  • Code blocks: <pre><code role="region" aria-label="Wrangler command" tabindex="0"> — focusable and labelled.
  • Modal / dialog: role="dialog" aria-modal="true" aria-labelledby with focus trap and Esc-to-close.
  • Stat callouts: large display numbers carry an aria-label with the full spoken value and unit.
  • Status / system indicators: aria-live="polite" (“All systems operational”).

Keyboard Navigation

  • Tab order: skip-link → wordmark → primary nav → auth CTAs → main content (document order) → footer
  • Arrow keys navigate inside mega-menu panels; Esc closes menus, modals, dropdowns
  • Code blocks are focusable (tabindex="0") so keyboard users can scroll/copy
  • All interactive controls show the 2px orange focus ring

Screen Reader Hints

  • Uppercase eyebrows use CSS text-transform: uppercase so screen readers announce natural case
  • Decorative hero artwork / cloud marks carry aria-hidden="true"
  • Brand wordmark uses aria-label="Cloudflare"
  • Stat numbers announce their full value and unit despite condensed display formatting

Reduced Motion

All transitions degrade to opacity-only or instant; scroll-reveals render static on-mount. Visual consistency is preserved under prefers-reduced-motion: reduce.

10. Responsive Behavior

Breakpoints

NameWidthKey Changes
Mobile<640pxNav collapses to wordmark + hamburger; hero H1 drops 56→32px; cards 1-up; dark hero band shortens; CTA pills stack vertically full-width
Tablet640–1024pxNav keeps inline links (no mega-menu); hero H1 ~40px; cards 2-up
Desktop1024–1280pxFull nav with mega-menus; hero H1 at 48–56px; cards 3-up; full grid layouts
Wide>1280pxContent caps at 1280px; gutters absorb the extra width

Touch Targets

  • Pill buttons: ~44px height on mobile (full-width stacked), ~40–44px on desktop
  • Nav links: 44×44px minimum tap area even at 14px text
  • Tag chips: 24px visual height with padding for a 44px effective tap area
  • Inputs: ~44px height for comfortable touch

Collapsing Strategy

  • Top nav at <1024px: links collapse into a hamburger sheet; mega-menus become accordion sections inside the sheet
  • Hero CTA pair at <640px: stacks vertically (orange primary above, white secondary below), full-width pills
  • Card grids: 4 → 3 → 2 → 1 columns
  • Dark hero band: shortens vertically; headline and CTAs stack; the dark ground persists
  • Customer logo grid: 6 → 4 → 3 → 2 columns; logos hold aspect ratio
  • Comparison tables: collapse to stacked cards or horizontal scroll with snap points on mobile

Image Behavior

Customer and partner logos render monochrome (often via currentColor) so they inherit the secondary-text colour on white. Product screenshots use aspect-ratio to prevent layout shift. Hero artwork is eager-loaded; below-fold imagery is lazy-loaded. Marketing illustrations use srcset 1x/2x for retina.

11. Content & Voice

Tone

Technical, trustworthy, calm, agent-era confident. Cloudflare writes like an infrastructure engineer who’s seen scale — direct, precise, willing to use product names (Workers, R2, D1, Hyperdrive) without over-explaining, but never condescending. Headlines are forward-looking statements (“Build for the agent era”); subheads explain capability; product copy uses accurate technical vocabulary (edge, region, origin, latency) without translating it into consumer-speak. The register is the inverse of consumer enthusiasm and the inverse of enterprise legalese — peer-to-peer engineering with a steadying, “we handle the hard part” reassurance.

Microcopy Patterns

  • Button verbs: Start building, Start building for free, Sign up, Talk to an expert, Contact sales, Log in. Outcome-focused, building-oriented.
  • Error messages: specific and accountable — “Couldn’t reach the origin server. Check your DNS configuration and retry.” — names the exact technical detail and the next step.
  • Success confirmations: brief and declarative — “Deployed.” / “DNS records updated.” — no exclamation.
  • Empty states: instruction-led with the exact command — “No Workers yet. Run npm create cloudflare@latest to deploy your first.”
  • Field labels: single-word where possible — Domain, Email, Zone, Route. No friendly framing.
  • Loading states: context-specific — “Provisioning…”, “Propagating DNS…”, “Deploying to the edge…” — never just “Loading…”

Empty States

Empty states explain the state, offer the next step, and include the exact action. The developer-platform tone anchors them: “No projects yet — connect a repository or run wrangler deploy to start.” Marketing-surface empty states (rare) follow the same convention: explain, then provide a single clear action.

CTA Verb Conventions

  • Primary on hero: Start building, Start building for free, Sign up, Talk to an expert
  • Secondary: Contact sales, Learn more, Read the docs, Log in
  • Tertiary text: See how it works, Explore the platform, View pricing, Read the changelog
  • Avoided: Click here, Submit, Buy now, exclamation-heavy enthusiasm. Cloudflare uses building-oriented verbs and product names directly.

12. Dark Mode & Theming

Dual-theme via Kumo light-dark(). Cloudflare’s design system ships both light and dark themes through the CSS light-dark() function applied to the --color-kumo-* token set. The neutral ramp (--color-kumo-neutral-50 through -1000), semantic roles (canvas / elevated / recessed / contrast), and text tokens all resolve per theme. The default register on the marketing site is light (white canvas), but the system is theme-aware and respects prefers-color-scheme.

The defining nuance: the dark hero band is always dark, regardless of theme. It is not a dark-mode artifact — it’s a deliberate inversion at the top of the (otherwise light) page, a #262626 ground that frames the hero headline in white. So the page has two kinds of dark: the always-dark hero/stat bands (a brand gesture) and the optional system dark theme (a full token swap).

Representative dark-theme token swaps (Kumo light-dark(light, dark)):

  • canvas: #ffffff → near-black (--color-kumo-neutral-950, #0b0b0b)
  • elevated: #f8f8f8#0f0f0f (neutral-925)
  • text: #262626 → near-white (--text-color-kumo-default inverse)
  • text-subtle: #737373 → lifted neutral
  • brand: #ff5e1f (unchanged — Cloudflare orange reads strongly on both grounds)
  • link: #193cb8 → a lifted blue (blue-400, #51a2ff) for legibility on dark
  • border: #e5e5e5 → translucent white hairline
  • focus ring: #ff5e1f (unchanged — orange is theme-agnostic)

The orange is the one token that never changes across themes or bands — it is the constant brand anchor on white, on the dark hero, and in dark mode alike.

13. Lineage & Influences

Cloudflare’s identity rests on two pillars that do almost all the recognition work: the orange (#ff5e1f, rgb 255, 94, 31) and FT Kunst Grotesk, the company’s custom grotesque. The colour is so strongly associated with the brand that a single orange pill on a white page reads “Cloudflare” before the wordmark does — the same way Stripe owns its purple-blue and Vercel owns its triangle. The type sits squarely in the Swiss / International-Typographic-Style grotesque tradition: even strokes, generous apertures, grid clarity, ornament-free hierarchy. Setting headlines at weight 500 rather than 700 is the brand’s signature restraint — confidence without volume.

The systemic backbone is Kumo, Cloudflare’s internal design-token set, authored in the oklch color space and themed with CSS light-dark(). oklch gives the neutral ramp perceptual evenness — each step in --color-kumo-neutral-* is visually equidistant — and lets a single token map drive both themes. The semantic-role layer (canvas / elevated / recessed / contrast, plus text and border roles) is the modern design-system pattern shared by Radix, Tailwind, and the broader token-driven generation; Cloudflare’s version is notable for how restrained the chromatic surface is — orange for action, blue for links, everything else neutral.

The register descends from the developer-product-as-infrastructure lineage that Stripe and Vercel share: technical marketing drawn with magazine-grade calm, a single confident accent, dense-where-it-helps and breathing-everywhere-else. Where Vercel withholds its brand colour from buttons (blue is a link only), Cloudflare makes the opposite, equally-disciplined choice: orange is the action, rationed so tightly that it never appears outside CTAs, brand moments, and the focus ring.

What Cloudflare rejects: cream or warm canvases (the brand is pure white), heavy ornamentation (Swiss-grotesque clarity wins), shouty 700/800 hero weights (the grotesque holds at 500), saturated rainbow palettes (one orange, one link blue, calm neutrals), and dramatic shadows (soft low-opacity lifts only). The “agent era” repositioning adds a forward-looking, build-oriented voice on top of an otherwise classically-restrained infrastructure aesthetic.

Influences:

  • Cloudflare Design (cloudflare.design) — Owner of the orange #ff5e1f, FT Kunst Grotesk, and the Kumo design language the site renders. https://www.cloudflare.design
  • Cloudflare Workers / developer platform — The product surface the register is built around; the “agent era” positioning and technical-calm voice. https://workers.cloudflare.com
  • Stripe — Developer-product-as-infrastructure register; technical marketing with restraint and a single confident accent. https://stripe.com
  • Vercel — Adjacent dev-tool peer; near-black-on-near-white neutral discipline and full-pill hero CTAs at light-mode contrast. https://vercel.com
  • oklch color space — The Kumo ramps are authored in oklch for perceptually-even neutral and accent scales with light-dark() theming. https://oklch.com
  • Swiss / International Typographic Style — Grotesque type, grid clarity, ornament-free hierarchy — FT Kunst Grotesk’s tradition. https://en.wikipedia.org/wiki/International_Typographic_Style

14. Do’s and Don’ts

Do

  • Do use pure white #ffffff for the canvas — calm and bright. Off-white #fbfbfb for subtle bands, never cream.
  • Do use FT Kunst Grotesk for both display and body. The single-family grotesque is the brand’s typographic identity.
  • Do set headlines at weight 500, not 700/800. The grotesque reads confident at 500; heavier is shouting.
  • Do make the primary CTA an orange-filled full-pill (#ff5e1f, radius 9999, white text). Orange is the action.
  • Do invert the hero to a dark #262626 band with white headline type, then return to white.
  • Do ration the orange — CTAs, brand moments, focus ring. One orange pill per view, never orange body text or section backgrounds.
  • Do use full-pill (9999) for all buttons; 12px for cards; 8px for inputs and code blocks.
  • Do use blue #193cb8 for inline links — links are blue, actions are orange, and they never overlap.
  • Do ship soft low-opacity shadows (8–12% black); let the hairline border do the elevation work on white.
  • Do keep CTA text medium/large weight so white-on-orange clears AA-Large contrast.
  • Do use the orange as the focus ring on both white and dark grounds — it’s theme-agnostic.
  • Do write in a technical, calm, build-oriented “agent era” voice with accurate product names.

Don’t

  • Don’t use cream or warm off-white for the canvas. Cloudflare is pure white.
  • Don’t withhold orange from the primary button — that’s Vercel’s logic. Here, the orange is the primary action.
  • Don’t set hero headlines at 700/800. The signature is weight 500.
  • Don’t use orange for body text on white — at 3.06:1 it fails body contrast. Orange is a fill/UI colour only.
  • Don’t flood the page with orange. Section backgrounds, large orange fields, or orange paragraphs break the discipline.
  • Don’t square off the CTAs. Full-pill (9999) is the brand button shape; sharp or 8px corners read as a different brand.
  • Don’t confuse the link blue with the action orange — links are #193cb8, actions are #ff5e1f.
  • Don’t apply heavy drop shadows. Soft 8–12% lifts only; the hairline border carries elevation.
  • Don’t introduce a serif or a second sans. FT Kunst Grotesk is the whole system; the mono is for code only.
  • Don’t crowd the layout. Infrastructure-calm whitespace is part of the brand; let the white breathe.
  • Don’t make the dark hero band a full dark mode — it’s a deliberate inversion at the top, not a theme.
  • Don’t use exclamation-heavy consumer enthusiasm. The voice is calm, technical, trustworthy.

15. Agent Prompt Guide

Quick Color Reference

Canvas:           #ffffff
Off-White Band:   #fbfbfb
Elevated:         #f8f8f8
Recessed/Code:    #f3f3f3
Dark Hero Band:   #262626
Text:             #262626   (near-black, rgb 38,38,38)
Text Secondary:   #525252
Text Subtle:      #737373
Brand Orange:     #ff5e1f   (THE action color — rgb 255,94,31)
Brand Hover:      #f54900
On-Brand Text:    #ffffff
Link Blue:        #193cb8
Border:           #e5e5e5
Focus Ring:       2px solid #ff5e1f, 2px offset

Example Component Prompts

  1. “Create a Cloudflare-style hero: a full-bleed dark #262626 band, white 56px / 500 FT Kunst Grotesk headline with -0.02em tracking (‘Build for the agent era’), 18px / 400 white deck below at 1.55 line-height. Two full-pill CTAs beneath: primary orange pill (#ff5e1f fill, white text 15px / 500, radius 9999, 12×24 padding) and secondary white pill (#ffffff fill, near-black #262626 text, 1px #d4d4d4 border, radius 9999). Below the band, the page steps down to a pure-white #ffffff canvas.”

  2. “Design a Cloudflare product card: #ffffff (or #f8f8f8) background, 12px radius, 1px #e5e5e5 hairline border, 24px padding, soft shadow 0 1px 2px rgba(0,0,0,0.08), 0 8px 24px -8px rgba(0,0,0,0.08). Inside: 24×24 icon in #262626, 20px / 600 FT Kunst Grotesk heading, 16px / 400 body in #525252, and a Learn more link in blue #193cb8. Hover: border deepens, shadow intensifies slightly — minimal lift.”

  3. “Build a Cloudflare CTA pair: primary full-pill button — #ff5e1f Cloudflare-orange fill, white text ‘Start building’ at 15px / 500, radius 9999, 12×24 padding, hover deepens to #f54900. Secondary full-pill — #ffffff fill, #262626 text ‘Contact sales’, 1px #d4d4d4 border, radius 9999. Both fully rounded; orange is the dominant action.”

  4. “Compose a Cloudflare quick-deploy code band: pure-white #ffffff section, centered code block with #f3f3f3 recessed fill, 8px radius, 1px #e5e5e5 border, 16×20 padding, system monospace 14px / 400 / 1.6 line-height showing npm create cloudflare@latest. Above it, an uppercase eyebrow ‘GET STARTED’ in FT Kunst Grotesk 12px / 600 / 0.06em in #737373, and a 40px / 500 headline in #262626.”

  5. “Render a Cloudflare top nav: #ffffff background, 64px height, 1px bottom hairline #e5e5e5. Cloudflare wordmark left. Center: mega-menu links (Products, Solutions, Resources, Pricing, Docs) at 14px / 500 ghost style in #262626. Right: ghost Log in + primary orange full-pill Sign up (#ff5e1f fill, white text, radius 9999, 10×20 padding). On scroll over a dark hero, the nav renders translucent white.”

  6. “Build a Cloudflare stat band: full-width dark #262626 band, three large stat callouts in white FT Kunst Grotesk display weight (e.g. ‘20% of the web’, ‘330+ cities’, ‘millions of requests/sec’), each with a 16px / 400 caption in lifted grey beneath. The orange #ff5e1f highlights one key number. Calm spacing, 96px+ vertical padding.”

Iteration Guide

  1. Check the canvas and the hero. White #ffffff body, and a dark #262626 hero band — if your hero is on white, you’ve missed the brand’s defining inversion. The dark band frames the headline, then the page returns to white.
  2. Switch to FT Kunst Grotesk. Inter or a generic grotesque at the same sizes loses the brand. FT Kunst Grotesk for display and body is the typographic identity.
  3. Drop the headline weight to 500. If your hero is 700/800, it’s too loud. Cloudflare’s 56px / 500 is the canonical hero — confident, not shouting.
  4. Make the orange the action. Unlike Vercel, the primary CTA here is orange-filled. If your primary button is near-black or white, you’ve ported the wrong dev-tool logic. The orange pill is the dominant action.
  5. Ration the orange. It belongs on CTAs, brand moments, and the focus ring — nowhere else. No orange body text, no orange section backgrounds. The colour is loud because it’s rare.
  6. Full-pill every button. Radius 9999 on primary, secondary, and ghost. Square or 8px-cornered buttons read as a different brand. Cards stay at 12px.
  7. Separate link blue from action orange. Inline links are blue #193cb8; actions are orange. Keep them distinct — never an orange link, never a blue button.
  8. Keep shadows soft and the whitespace generous. 8–12% low-opacity lifts, hairline borders, 96px+ section gutters. The infrastructure-calm breathing room is part of the brand.

Theme-toggle audit: score=2, signals=[kumo-light-dark, dark-hero-band]

Ship with this

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

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