DESIGN.md inspired by Paddle
Merchant-of-record calm — condensed serif headlines on a near-black canvas with warm cream and sand CTAs.
Compare to…
- bg
#0e1414 - bg-canvas
#0e1414 - surface
#fcfcfc - surface-warm
#f9f8f7 - surface-sand
#ebe7df - surface-sand-deep
#e8e6e2 - surface-cream
#e4e1d1 - surface-clay
#d6cbb6 - surface-ink
#1c1a15 - text — · 1.0
#0e1414 - text-ink
#1c1a15 - text-slate
#2b3033 - text-on-dark
#fcfcfc - text-on-dark-soft
rgba(252,252,252,0.8) - text-on-dark-muted
rgba(252,252,252,0.6) - brand AAA · 14.2
#e4e1d1 - brand-cream
#e4e1d1 - on-brand
#1c1a15 - brand-ink
#1c1a15 - on-brand-ink
#fcfcfc - accent
#ffd400 - accent-yellow
#ffd400 - border AAA · 12.5
#d9d3c9 - border-sand
#ebe7df - border-ink
#0e1414 - border-on-dark
rgba(252,252,252,0.1) - border-faint
rgba(252,252,252,0.02) - link-on-dark
rgba(252,252,252,0.6) - link-on-light
#1c1a15 - success
#108c3d - warning
#9b6829 - danger
#b42318
- 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
- micro
2px - sm
6px - md
10px - lg
12px - xl
16px - pill
9999px
Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.
- background → bg
- foreground → text
- primary → brand
- primary-foreground → on-brand
- accent → accent
- muted → —
- border → border
- ring → —
Paddle is a merchant-of-record payments and tax-compliance platform for SaaS and mobile apps. Its current marketing identity rejects fintech's default cold blue entirely in favour of a warm, premium-B2B calm: a near-black canvas (#0e1414) framing light cream and sand panels (#f9f8f7, #ebe7df), a condensed serif display face (serrifCondensed) at weight 400 for broadsheet-style headlines, and Inter for all body copy. CTAs are warm-neutral — a cream fill (#e4e1d1) for the primary action and a near-black fill (#1c1a15) for the secondary — both at a soft 10px radius. A single vivid yellow (#ffd400) is the only saturated accent. The lineage runs through editorial broadsheet typography and the warm-minimal, materials-led aesthetic of contemporary premium-B2B brands, away from the saturated-purple/indigo convention that Paddle itself once used and that Stripe still owns.
- Body typeface — neutral, screen-optimised grotesque carrying all running copy
- Editorial-fintech contemporary it diverges from — broadsheet typography kept, cold purple swapped for warm neutrals
- Broadsheet lineage — condensed serif headlines on warm paper-toned panels
- Editorial type tradition that established serif-display-over-sans-body as a premium signal
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
name: Paddle
tagline: 'Merchant-of-record calm — condensed serif headlines on a near-black canvas with warm cream and sand CTAs.'
updated_at: 2026-05-28T23:12:37.718Z
published_at: 2026-05-28T23:12:37.718Z
author: webdesignhot
source_url: https://www.paddle.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [saas, fintech]
tags: [dark, warm, serif, condensed, payments, premium, structured]
preview_swatch: ['#0e1414', '#e4e1d1', '#ffd400']
related: [stripe]
description: 'Paddle''s marketing site trades fintech''s usual cold blue for a warm, premium-B2B calm. A near-black canvas (`#0e1414`) frames light cream and sand panels (`#f9f8f7`, `#ebe7df`), with a condensed serif display face (serrifCondensed) running at 72px weight 400 for editorial-broadsheet headlines and Inter carrying every line of body copy. CTAs are warm-neutral rather than branded-loud: a cream fill (`#e4e1d1`) for the primary "Get started" and a near-black fill (`#1c1a15`) for "Book a demo", both at a soft 10px radius. A single vivid yellow (`#ffd400`) supplies the only saturated accent. The historic Paddle indigo has been fully retired — this warm-neutral, condensed-serif identity is the current one.'
# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
background: bg
foreground: text
primary: brand
primary-foreground: on-brand
accent: accent
border: border
colors:
bg: '#0e1414'
bg-canvas: '#0e1414'
surface: '#fcfcfc'
surface-warm: '#f9f8f7'
surface-sand: '#ebe7df'
surface-sand-deep: '#e8e6e2'
surface-cream: '#e4e1d1'
surface-clay: '#d6cbb6'
surface-ink: '#1c1a15'
text: '#0e1414'
text-ink: '#1c1a15'
text-slate: '#2b3033'
text-on-dark: '#fcfcfc'
text-on-dark-soft: 'rgba(252,252,252,0.8)'
text-on-dark-muted: 'rgba(252,252,252,0.6)'
brand: '#e4e1d1'
brand-cream: '#e4e1d1'
on-brand: '#1c1a15'
brand-ink: '#1c1a15'
on-brand-ink: '#fcfcfc'
accent: '#ffd400'
accent-yellow: '#ffd400'
border: '#d9d3c9'
border-sand: '#ebe7df'
border-ink: '#0e1414'
border-on-dark: 'rgba(252,252,252,0.1)'
border-faint: 'rgba(252,252,252,0.02)'
link-on-dark: 'rgba(252,252,252,0.6)'
link-on-light: '#1c1a15'
success: '#108c3d'
warning: '#9b6829'
danger: '#b42318'
typography:
display:
family: 'serrifCondensed, "serrifCondensed Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif'
weights: [400, 500, 600]
body:
family: 'Inter, "Inter Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif'
weights: [400, 500, 600]
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
weights: [400, 500]
scale:
display-hero: { size: 72, weight: 400, lineHeight: 1.0, tracking: '-0.72px', family: display }
display-lg: { size: 56, weight: 400, lineHeight: 1.04, tracking: '-0.56px', family: display }
h1: { size: 48, weight: 400, lineHeight: 1.05, tracking: '-0.48px', family: display }
h2: { size: 40, weight: 400, lineHeight: 1.1, tracking: '-0.4px', family: display }
h3: { size: 32, weight: 400, lineHeight: 1.15, tracking: '-0.32px', family: display }
h4: { size: 24, weight: 500, lineHeight: 1.25, tracking: '-0.012em', family: display }
h5: { size: 20, weight: 600, lineHeight: 1.3, tracking: '0', family: body }
body-lg: { size: 20, weight: 400, lineHeight: 1.5, 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 }
button: { size: 16, weight: 500, lineHeight: 1.0, tracking: '0', family: body }
label: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
radius:
micro: 2
sm: 6
md: 10
lg: 12
xl: 16
pill: 9999
spacing:
base: 4
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96]
layout:
page-width: 1280
prose-width: 720
header-height: 64
motion:
ease-standard: 'cubic-bezier(0.4, 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
components:
button-primary: { bg: brand, text: on-brand, padding: '16px 20px', radius: 10 }
button-dark: { bg: brand-ink, text: on-brand-ink, padding: '16px 20px', radius: 10 }
button-ghost: { bg: transparent, text: text-on-dark, border: border-on-dark, padding: '16px 20px', radius: 10 }
button-light: { bg: surface, text: text-ink, border: border-ink, padding: '12px 20px', radius: 6.4 }
card: { bg: surface-warm, border: border, radius: 12, padding: 24 }
card-dark: { bg: surface-ink, border: border-on-dark, radius: 12, padding: 24 }
input: { bg: surface, border: border, text: text-ink, radius: 10, padding: '12px 16px' }
badge: { bg: surface-sand, text: text-ink, radius: 6, padding: '4px 10px' }
accessibility:
contrast-text-on-bg: 18.13 # #fcfcfc on #0e1414 — AAA
contrast-ink-on-panel: 17.54 # #0e1414 on #f9f8f7 — AAA
contrast-text-on-brand: 13.24 # #1c1a15 on #e4e1d1 cream — AAA
contrast-muted-on-bg: 6.43 # rgba(252,252,252,0.6) on #0e1414 — AA
focus-ring: '2px solid #ffd400, 2px offset'
reduced-motion-honored: true
keyboard-nav: 'tab order follows DOM; visible focus ring on all interactive elements; skip-to-content link in header'
lineage:
summary: |
Paddle is a merchant-of-record payments and tax-compliance platform for SaaS
and mobile apps. Its current marketing identity rejects fintech's default cold
blue entirely in favour of a warm, premium-B2B calm: a near-black canvas
(#0e1414) framing light cream and sand panels (#f9f8f7, #ebe7df), a condensed
serif display face (serrifCondensed) at weight 400 for broadsheet-style
headlines, and Inter for all body copy. CTAs are warm-neutral — a cream fill
(#e4e1d1) for the primary action and a near-black fill (#1c1a15) for the
secondary — both at a soft 10px radius. A single vivid yellow (#ffd400) is the
only saturated accent. The lineage runs through editorial broadsheet
typography and the warm-minimal, materials-led aesthetic of contemporary
premium-B2B brands, away from the saturated-purple/indigo convention that
Paddle itself once used and that Stripe still owns.
influences:
- name: Inter (Rasmus Andersson)
role: Body typeface — neutral, screen-optimised grotesque carrying all running copy
url: https://rsms.me/inter/
- name: Stripe
role: Editorial-fintech contemporary it diverges from — broadsheet typography kept, cold purple swapped for warm neutrals
url: https://stripe.com
- name: Financial Times
role: Broadsheet lineage — condensed serif headlines on warm paper-toned panels
url: https://www.ft.com
- name: Klim Type Foundry
role: Editorial type tradition that established serif-display-over-sans-body as a premium signal
url: https://klim.co.nz
dark-mode: dark-first # Paddle's canvas is near-black (#0e1414); light cream/sand panels are inset against it
---
## 1. Visual Theme & Atmosphere
Paddle's marketing site is what happens when a payments company decides it would rather feel like a quiet, expensive trade magazine than a fintech dashboard. The page root is a near-black canvas — `#0e1414`, a desaturated blue-green ink so dark it reads as warm charcoal rather than true black. Against that canvas, Paddle insets light panels in cream and sand (`#f9f8f7`, `#ebe7df`, `#fcfcfc`), so the page reads as paper laid on slate. The effect is calm, premium, and unmistakably B2B: a system designed to make enterprise buyers feel that the company handling their global tax compliance has taste and restraint to spare.
The defining typographic move is the display face. Where almost every payments competitor reaches for a clean geometric sans, Paddle runs a **condensed serif** (`serrifCondensed`) at weight `400` for headlines — 72px on the hero, 48px on section heads, with tight negative tracking (`-0.72px`, `-0.48px`). A condensed serif at a regular weight is a broadsheet gesture: it evokes the standfirst of a financial newspaper rather than the bold hero of a SaaS landing page. The headlines are large and confident but never shouty, because the weight stays at 400 and the letterforms do the work. Body copy is set entirely in **Inter** — neutral, screen-optimised, invisible by design — so the serif headline always gets to be the voice in the room.
Paddle's CTAs are the clearest expression of the warm-neutral philosophy. The primary "Get started" button is filled with **cream `#e4e1d1`** and labelled in near-black ink — an action surface that whispers rather than glows. The secondary "Book a demo" inverts to a **near-black `#1c1a15`** fill with near-white text. Neither is a saturated brand colour; both are drawn from the same warm-neutral family as the panels around them. This is deliberate restraint — the buttons feel like part of the material, not coloured stickers placed on top of it. The only saturated colour anywhere on the page is a single vivid **yellow `#ffd400`**, used sparingly as a graphic accent on illustrations and highlight chips.
Radius is soft but conservative: `10px` on the warm-neutral CTAs, `12px` on cards, `6.4px` on small chrome like the skip-link. Nothing is pill-shaped, nothing is sharp-cornered. The geometry matches the palette — rounded enough to feel approachable, tight enough to feel serious.
It is worth stating plainly what Paddle is *not* doing, because it informs everything. Historically Paddle leaned on a blue/indigo brand accent, the fintech default that Stripe still owns. That colour is now entirely absent from the live site. The current identity is warm-neutral first, condensed-serif second, and dark-canvas throughout — a complete repositioning away from "another payments startup" toward "the calm, premium infrastructure layer you trust with money and tax."
**Key Characteristics:**
- Near-black canvas (`#0e1414`) with light cream/sand panels inset against it — paper-on-slate
- Condensed serif display (`serrifCondensed`) at weight `400`, 72px hero, tight negative tracking — broadsheet, not bold-SaaS
- Inter for all body copy — neutral screen sans, the serif always wins the spotlight
- Warm-neutral CTAs: cream `#e4e1d1` primary and near-black `#1c1a15` secondary, no saturated brand fill
- A single vivid yellow (`#ffd400`) as the only saturated accent, used sparingly
- Soft conservative radii — `10px` CTAs, `12px` cards, nothing pill-shaped
- Primary ink `#1c1a15` / `#0e1414` on light; near-white `#fcfcfc` and translucent whites on dark
- Warm sand borders (`#d9d3c9`, `#ebe7df`) rather than cool grays
- Calm, premium-B2B atmosphere — restraint signals trustworthiness
- The historic Paddle indigo is fully retired — warm-neutral + condensed-serif is the current identity
## 2. Color Palette & Roles
### Canvas & Surface
- **Canvas** (`#0e1414`): the page root — a near-black, faintly blue-green ink. Frames every light panel; the dominant background.
- **Surface White** (`#fcfcfc`): brightest light panel and small-button fill. Near-white, never pure `#ffffff`.
- **Surface Warm** (`#f9f8f7`): the default light content panel — warm off-white that headlines sit on.
- **Surface Sand** (`#ebe7df`): sand-toned panel and card background for warm sections; doubles as a soft border.
- **Surface Sand Deep** (`#e8e6e2`): slightly deeper sand for nested panels and alternating bands.
- **Surface Clay** (`#d6cbb6`): the deepest warm-neutral panel; used for emphasis blocks.
- **Surface Ink** (`#1c1a15`): warm near-black panel — the dark-card and dark-CTA fill, a touch warmer than the canvas.
### Text
- **Ink** (`#0e1414`): primary heading colour on light panels — near-black with the canvas's blue-green undertone.
- **Ink Warm** (`#1c1a15`): the most common body/heading ink (warm near-black); also the on-cream button text.
- **Slate** (`#2b3033`): muted secondary text on light surfaces.
- **On-Dark** (`#fcfcfc`): primary text on the near-black canvas — near-white, high contrast.
- **On-Dark Soft** (`rgba(252,252,252,0.8)`): standard body copy on the canvas at 80% opacity.
- **On-Dark Muted** (`rgba(252,252,252,0.6)`): secondary text, links, and captions on the canvas at 60% opacity.
### Brand & Action
- **Brand Cream** (`#e4e1d1`): the primary brand/action surface — fills "Get started". Warm-neutral, low-glow, on-brand text is near-black.
- **On-Brand Ink** (`#1c1a15`): text colour on the cream button.
- **Brand Ink** (`#1c1a15`): the secondary action fill — near-black "Book a demo" with near-white text.
- **On-Brand-Ink** (`#fcfcfc`): text colour on the dark button.
### Accent
- **Yellow** (`#ffd400`): the only saturated colour in the system. Decorative/graphic only — highlight chips, illustration pops, focus ring. Never a primary button fill.
### Borders
- **Border** (`#d9d3c9`): the standard warm sand border for cards and dividers on light panels.
- **Border Sand** (`#ebe7df`): softer warm border for low-emphasis separation.
- **Border Ink** (`#0e1414`): dark border matching the canvas — used on dark CTAs and on-dark cards.
- **Border On-Dark** (`rgba(252,252,252,0.1)`): hairline border for cards and dividers on the dark canvas.
- **Border Faint** (`rgba(252,252,252,0.02)`): near-invisible edge on the cream button against dark.
### Semantic
- **Success** (`#108c3d`): positive confirmation text — a muted forest green that sits with the warm palette.
- **Warning** (`#9b6829`): caution text — a warm ochre rather than a bright amber.
- **Danger** (`#b42318`): error text — a deep brick red, desaturated to fit the calm tone.
## 3. Typography Rules
### Font Family
- **Display**: `serrifCondensed` — a condensed serif used for all headlines at weight `400`. The signature of the brand.
- **Display fallback chain**: `serrifCondensed, "serrifCondensed Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif`.
- **Body**: `Inter` — neutral screen-optimised grotesque for all running copy, buttons, labels, and UI.
- **Body fallback chain**: `Inter, "Inter Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif`.
- **Mono companion**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace` — for code samples and API references.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| Display Hero | serrifCondensed | 72 | 400 | 1.0 | -0.72px | The hero headline — condensed serif at regular weight |
| Display Large | serrifCondensed | 56 | 400 | 1.04 | -0.56px | Secondary hero / oversized section heads |
| H1 | serrifCondensed | 48 | 400 | 1.05 | -0.48px | Page titles, major section heads |
| H2 | serrifCondensed | 40 | 400 | 1.1 | -0.4px | Feature section titles |
| H3 | serrifCondensed | 32 | 400 | 1.15 | -0.32px | Sub-sections, card headings |
| H4 | serrifCondensed | 24 | 500 | 1.25 | -0.012em | Smaller heads; weight steps up at smaller sizes |
| H5 / Eyebrow | Inter | 20 | 600 | 1.3 | normal | Inter takes over below display sizes for small heads |
| Body Large | Inter | 20 | 400 | 1.5 | normal | Hero subtitles, intro paragraphs |
| Body | Inter | 16 | 400 | 1.55 | normal | Standard reading text |
| Body Small | Inter | 14 | 400 | 1.5 | normal | Dense copy, secondary descriptions |
| Button | Inter | 16 | 500 | 1.0 | normal | All button labels |
| Label | Inter | 13 | 500 | 1.4 | normal | Form labels, metadata |
| Caption | Inter | 12 | 500 | 1.4 | 0.02em | Fine print, eyebrow tags |
| Link (on dark) | Inter | 16 | 400 | 1.5 | normal | `rgba(252,252,252,0.6)` nav/footer links |
| Code | mono | 14 | 400 | 1.6 | normal | API snippets, inline code |
### Principles
- **Condensed serif IS the brand** — `serrifCondensed` at weight `400` for every headline is the single most distinctive choice. A condensed serif at regular weight reads broadsheet, not bold-SaaS.
- **Serif heads, sans body** — the serif appears only at display/heading sizes; Inter carries every line of body copy, every button, every label. The contrast between the two is the rhythm.
- **Weight stays low at large sizes** — display and heading sizes hold at `400`; weight steps up to `500`/`600` only as type shrinks (H4, H5), so the big headlines never feel heavy.
- **Tight negative tracking on display** — letter-spacing tightens with size (`-0.72px` at 72px, `-0.48px` at 48px, `-0.4px` at 40px), packing the condensed serif into dense editorial blocks.
- **Body copy on dark uses opacity, not new colours** — running text on the canvas is `rgba(252,252,252,0.8)`, secondary text `rgba(252,252,252,0.6)`. The single near-white is dialled with alpha rather than swapped for grays.
- **Inter at 500 for buttons** — button labels are weight `500` Inter, never the serif. The serif never appears in interactive chrome.
- **Reading column ~720px** — running copy is capped near 720px so the neutral Inter body stays comfortable.
## 4. Component Stylings
### Buttons
**Primary — Cream**
- Background: `#e4e1d1` (brand cream)
- Text: `#1c1a15` (near-black ink)
- Padding: `16px 20px`
- Radius: `10px`
- Font: 16px Inter weight 500
- Border: `rgba(252,252,252,0.02)` (near-invisible edge on dark)
- Hover: background darkens toward `#d6cbb6` (clay)
- Use: primary CTA — "Get started"
**Secondary — Dark**
- Background: `#1c1a15` (warm near-black)
- Text: `#fcfcfc` (near-white)
- Padding: `16px 20px`
- Radius: `10px`
- Border: `1px solid #fcfcfc` at low opacity on dark sections
- Font: 16px Inter weight 500
- Hover: background lightens slightly / subtle border brighten
- Use: secondary CTA — "Book a demo", product "Discover" buttons (`#0e1414` variant on dark)
**Ghost — On Dark**
- Background: transparent
- Text: `#fcfcfc` (or `rgba(252,252,252,0.8)`)
- Padding: `16px 20px`
- Radius: `10px`
- Border: `1px solid rgba(252,252,252,0.1)`
- Hover: border → `rgba(252,252,252,0.2)`, faint fill
- Use: tertiary action on the dark canvas
**Light Utility**
- Background: `#fcfcfc`
- Text: `#0e1414`
- Padding: `12px 20px`
- Radius: `6.4px`
- Border: `1px solid #0e1414`
- Use: utility/chrome buttons (skip-to-content, in-app prompts) on light panels
### Cards & Containers
- **Light card**: background `#f9f8f7` (or `#ebe7df` sand), `1px solid #d9d3c9` border, `12px` radius, `24px` padding.
- **Dark card**: background `#1c1a15`, `1px solid rgba(252,252,252,0.1)` border, `12px` radius — used on the canvas for product modules.
- **Cream emphasis card**: background `#e4e1d1` or `#d6cbb6` for highlighted plans/quotes.
- Shadows are minimal — warm-neutral panels rely on the canvas contrast and hairline borders for separation, not drop shadows.
### Badges, Tags, Pills
**Sand Tag**
- Background: `#ebe7df`
- Text: `#1c1a15`
- Padding: `4px 10px`
- Radius: `6px`
- Font: 12px Inter weight 500
- Use: category labels, "New" eyebrow tags
**Yellow Accent Chip**
- Background: `#ffd400`
- Text: `#0e1414`
- Radius: `6px`
- Use: the rare highlight chip — illustrations, "limited" callouts. The only saturated badge.
**On-Dark Outline Pill**
- Background: transparent
- Text: `rgba(252,252,252,0.8)`
- Border: `1px solid rgba(252,252,252,0.1)`
- Radius: `pill` for metadata chips on the canvas
### Inputs & Forms
- Background: `#fcfcfc`
- Border: `1px solid #d9d3c9` (warm sand)
- Radius: `10px`
- Padding: `12px 16px`
- Label: `#1c1a15`, 13px Inter weight 500
- Text: `#1c1a15`, 16px Inter weight 400
- Placeholder: `#2b3033` at reduced opacity
- Focus: border → `#0e1414` plus a `2px` yellow `#ffd400` ring
- Error: border `#b42318`, helper text `#b42318` 13px
### Navigation
- Sticky header over the near-black canvas (`#0e1414`); header height ~64px
- Logo and primary nav links in `#fcfcfc` / `rgba(252,252,252,0.8)`
- Secondary/footer links in `rgba(252,252,252,0.6)`
- Primary CTA right-aligned: cream `#e4e1d1` "Get started" at `10px` radius
- Secondary CTA: near-black `#1c1a15` "Book a demo"
- Dropdown menus open onto light cream/sand panels (`#f9f8f7`) for contrast against the dark bar
- Mobile: hamburger toggle, full-screen dark overlay with light panel menu
## 5. Layout Principles
### Spacing System
- Base unit: `4px`
- Scale: `0, 4, 8, 12, 16, 24, 32, 48, 64, 96`
- Rhythm is comfortable but not vast — warm-neutral panels are generously padded (`24px`+ interior), section gutters land at `64–96px`.
### Grid & Container
- Max content width: `~1280px`
- Hero: large condensed-serif headline left or centred, with a product visual or illustration adjacent
- Feature sections: 2–3 column grids of light cards inset on the dark canvas
- Full-bleed dark canvas with floating light panels is the defining layout pattern — panels feel like sheets of paper on slate
- Product modules ("Billing", "Retain", "ProfitWell Metrics") presented as dark cards with their own "Discover" CTA
### Whitespace Philosophy
- **Panels do the framing** — instead of huge empty margins, Paddle uses the contrast between near-black canvas and light panels to define structure.
- **Generous interior padding** — content inside panels breathes; the panels themselves are densely placed.
- **Warmth over emptiness** — the sand/cream surfaces keep large areas from feeling cold or sterile.
### Section Cadence
- Dark canvas runs continuously; light panels alternate in warmth (`#fcfcfc` → `#f9f8f7` → `#ebe7df` → `#d6cbb6`) to create rhythm without leaving the dark-first system
- Occasional full light-panel sections invert the page for emphasis (pricing, testimonials)
## 6. Shapes & Radius Scale
| Tier | Value | Use |
|------|-------|-----|
| Micro | 2px | Fine chrome, subtle rounding on tiny elements |
| Small | 6px | Badges, tags, small utility buttons (≈6.4px observed) |
| Standard | 10px | The workhorse — all primary/secondary CTAs |
| Comfortable | 12px | Cards, content panels, product modules |
| Large | 16px | Featured panels, modal containers |
| Pill | 9999px | Metadata chips and avatars only — never CTAs |
The system centres on `10px` for action surfaces and `12px` for containers — soft enough to feel approachable, conservative enough to feel premium. Nothing on an action surface is pill-shaped; the pill radius is reserved for metadata chips and avatars. The slightly-rounded geometry matches the warm-neutral palette: friendly, not playful.
## 7. Depth & Elevation
| Level | Treatment | Use |
|-------|-----------|-----|
| 0 — Flat | No shadow | Canvas, inline text |
| 1 — Panel | Contrast against canvas + `1px` warm/hairline border | Light cards, dark cards on the canvas |
| 2 — Raised | Soft neutral shadow `rgba(14,20,20,0.08) 0 4px 16px` | Hover lift on cards, dropdowns |
| 3 — Floating | `rgba(14,20,20,0.12) 0 12px 32px` | Popovers, sticky CTAs, menus |
| 4 — Modal | `rgba(0,0,0,0.4) 0 24px 64px` + scrim | Dialogs, full overlays |
| 5 — Ring | `2px solid #ffd400` outline | Keyboard focus ring |
**Shadow Philosophy** — Paddle's depth is primarily *contrast-driven*, not shadow-driven. The near-black canvas and light panels create separation on their own, so most cards rely on a warm hairline border (`#d9d3c9` on light, `rgba(252,252,252,0.1)` on dark) rather than a drop shadow. When shadows do appear, they are warm and soft — tinted with the canvas ink (`rgba(14,20,20,...)`) rather than pure black — so elevation stays in the warm-neutral family. This restraint reinforces the premium-B2B calm: the page feels flat and composed, like printed material, rather than glossy and layered.
## 8. Interaction & Motion
### Easing Curves
- **Standard** `cubic-bezier(0.4, 0, 0.2, 1)` — default for state transitions, hovers, panel reveals
- **Emphasized** `cubic-bezier(0.2, 0, 0, 1)` — for hero entrances and larger panel animations
- **Out** `cubic-bezier(0, 0, 0.2, 1)` — exits and dismissals
### Duration Buckets
- Fast: `150ms` — colour swaps, border brighten, focus ring
- Standard: `240ms` — button hover, card lift, dropdown open
- Slow: `320ms` — section reveals, hero entrance, modal open
### Per-Component Micro-States
- **Cream button hover** — background darkens toward `#d6cbb6` (clay) over `240ms`; no glow, no scale.
- **Dark button hover** — background lightens slightly / border brightens over `240ms`.
- **Card hover** — subtle lift via soft warm shadow (Level 1 → Level 2) over `240ms`; no translate on dense grids.
- **Link hover** (on dark) — opacity steps from `0.6` → `1.0` over `150ms`; underline optional, colour does not change.
- **Input focus** — border → `#0e1414`, plus `2px` yellow `#ffd400` ring over `150ms`.
- **Dropdown open** — opacity 0→1 + `translate-Y(-4px)` over `240ms` emphasized ease.
### Page Transitions
- Marketing pages use standard browser navigation. Heavy product modules and illustrations fade/slide in over `320ms` once in viewport via Intersection Observer.
### Reduced Motion Strategy
- `@media (prefers-reduced-motion: reduce)` — all transitions degrade to opacity-only at `120ms` linear. Translate, scale, and rotate are removed; auto-playing hero animation is paused.
## 9. Accessibility & A11y
### Contrast Pairs
- `#fcfcfc` text on `#0e1414` canvas — **18.13:1** (AAA)
- `#0e1414` ink on `#f9f8f7` light panel — **17.54:1** (AAA)
- `#1c1a15` ink on `#fcfcfc` surface — **16.94:1** (AAA)
- `#1c1a15` ink on `#ebe7df` sand — **14.1:1** (AAA)
- `#1c1a15` on-brand ink on `#e4e1d1` cream CTA — **13.24:1** (AAA)
- `#fcfcfc` text on `#1c1a15` dark CTA — **16.94:1** (AAA)
- `rgba(252,252,252,0.6)` muted text on `#0e1414` canvas — **6.43:1** (AA)
- `#0e1414` on `#ffd400` yellow accent — **13.0:1** (AAA)
- `#2b3033` slate on `#fcfcfc` surface — **13.01:1** (AAA)
Contrast is exceptionally strong throughout — the dark-canvas / light-panel structure pushes nearly every pair into AAA territory. The one pair to watch is the `0.6`-opacity muted text on the canvas (6.43:1) — strong enough for AA but reserve it for secondary content, not primary reading copy.
### Focus Indicators
- Default focus ring: `2px solid #ffd400` (yellow accent) with `2px` offset — the one place the saturated accent earns its keep, since it pops against both the dark canvas and the warm panels.
- On light panels the ring may pair with a `#0e1414` inner border for definition.
### ARIA Patterns
- **Disclosure / Dropdown** — `aria-expanded` + `aria-controls` on nav triggers
- **Dialog** — `role="dialog"` `aria-modal="true"` with focus trap and `aria-labelledby` on the title
- **Tablist** — `role="tablist"` / `role="tab"` / `role="tabpanel"` with arrow-key navigation for product switchers
- **Region landmarks** — product modules wrapped in labelled `<section>` regions
### Keyboard Navigation
- Tab order follows DOM source order; skip-to-content link is the first focusable element (the `6.4px` light utility button observed in the header)
- `Esc` closes menus, dialogs, and overlays
- Arrow keys navigate within tablists and product switchers
- All CTAs and links reachable via Tab with the yellow focus ring
### Screen Reader Hints
- Decorative illustrations and the yellow accent graphics get `aria-hidden="true"`
- Icon-only buttons get `aria-label`
- Live regions (`aria-live="polite"`) for inline form validation
- `aria-describedby` for helper text under inputs
### Reduced Motion
- Honoured via `prefers-reduced-motion: reduce` — all non-essential animation removed; opacity-only fades retained for state legibility.
## 10. Responsive Behavior
### Breakpoints
| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | <640px | Single column, panels stack full-width, reduced heading sizes |
| Tablet | 640–1024px | 2-column panel grids, moderate padding |
| Desktop | 1024–1280px | Full layout, 2–3 column product-module grids |
| Wide | ≥1280px | Centred `1280px` content with generous dark margins |
### Touch Targets
- CTAs use `16px 20px` padding for a comfortable `≥44×44px` hit area
- Nav links get generous horizontal spacing for tap forgiveness
- Badges keep a minimum `4px 10px` padding
### Collapsing Strategy
- Hero: `72px` condensed-serif display → `~40px` on mobile, weight 400 maintained
- Navigation: horizontal links + CTA → hamburger with full-screen dark overlay
- Product modules: 3-column → 2-column → single-column stacked panels
- Light panels go full-bleed-width on mobile, retaining their warm fill against the canvas
- Section spacing: `96px` → `48px` on mobile
### Image Behavior
- Product screenshots and illustrations sit inside light/dark panels and keep their `12px` radius at all sizes
- Yellow-accent graphics simplify on mobile
- Code/API samples may scroll horizontally rather than wrap
### Container Queries
- Product-module cards within a feature grid use container queries to switch from horizontal to stacked layout when their container drops below ~360px, independent of viewport.
## 11. Content & Voice
### Tone
Calm, premium, and operator-to-operator. Paddle speaks to SaaS and mobile founders who are tired of stitching together payments, tax, and compliance — so the copy is reassuring and competent rather than hype-driven. Condensed-serif headlines read like trade-press standfirsts: short, declarative, confident. Body copy in Inter is plain and direct, never marketing-thick.
### Microcopy Patterns
- **Button verbs** — `Get started`, `Book a demo`, `Discover Billing`. Action-first, product-named. Never "Click here", never "Sign up free today!!".
- **Error message recipe** — *what went wrong + what to do next*. Example: "We couldn't process that card. Try another method or contact support."
- **Success confirmations** — terse, past-tense: `Payment received`, `Subscription updated`.
- **Inline validation** — appears under the field in `#b42318`, 13px Inter weight 500.
### Empty States
- Direct and quiet: `No transactions yet`, followed by a single primary CTA and a docs link.
- No mascots, no apologetic copy. Explanatory text at 16px Inter weight 400 in slate `#2b3033`.
### CTA Verb Conventions
- Primary: `Get started`, `Start now`
- Secondary: `Book a demo`, `Talk to sales`
- Tertiary / product: `Discover Billing`, `Explore pricing`, `Read the docs →`
## 12. Dark Mode & Theming
Paddle is **dark-first** — the canvas is near-black (`#0e1414`) by default, with light cream and sand panels inset against it. This is the inverse of most fintech marketing sites and is the defining structural choice of the brand. There is no separate "dark mode toggle"; the dark canvas *is* the design.
Implementations targeting Paddle-flavour should treat the near-black canvas as the base layer and compose content on light warm-neutral panels:
- `bg` (canvas) `#0e1414` — never lighten this; it is the frame
- Light panels: `#fcfcfc` (brightest) → `#f9f8f7` (warm) → `#ebe7df` (sand) → `#d6cbb6` (clay)
- Text on canvas: `#fcfcfc` headings, `rgba(252,252,252,0.8)` body, `rgba(252,252,252,0.6)` muted
- Text on panels: `#0e1414` / `#1c1a15` ink, `#2b3033` slate for secondary
- CTAs: cream `#e4e1d1` primary, near-black `#1c1a15` secondary — these do not flip; they are warm-neutral by design
A *light-first* inversion (light page, dark panels) is possible for embedded contexts (dashboards inside a customer's app), mapping canvas → `#f9f8f7` and panels → `#1c1a15`, but the marketing identity is dark-first and should be preserved wherever brand recognition matters.
## 13. Lineage & Influences
Paddle's current identity is a deliberate repositioning. It is a merchant-of-record payments and tax-compliance platform — the kind of infrastructure a founder hands the entire money-and-compliance problem to — and its design says exactly that: calm, premium, trustworthy, and uninterested in looking like another startup. The two moves that carry the whole system are the **near-black warm canvas** and the **condensed serif display face**. Together they read editorial and material — paper laid on slate — rather than glossy-SaaS. Inter does the invisible work of body copy so the serif headline always gets to be the voice.
The most instructive comparison is Stripe, Paddle's editorial-fintech contemporary. Stripe kept broadsheet typography but committed to a cold saturated purple (`#533afd`) on a pure-white canvas; Paddle keeps the broadsheet typography but throws out the saturated brand colour entirely, inverts to a dark warm canvas, and makes its CTAs warm-neutral cream and near-black. Where Stripe says "financial newspaper in purple ink on white," Paddle says "trade journal in serif on warm slate." Crucially, Paddle *itself* used a blue/indigo accent historically — that colour is now completely absent from the live site. The lineage therefore runs through editorial broadsheet typography (condensed serif heads), the warm-minimal materials aesthetic of contemporary premium-B2B brands, and Inter's neutral screen sans — and it pointedly rejects the saturated-blue/indigo fintech default it once shared.
**Named influences:**
- Inter (Rasmus Andersson) — neutral screen-optimised body sans carrying all running copy
- Stripe — editorial-fintech contemporary it diverges from (broadsheet typography kept, cold purple swapped for warm neutrals)
- Financial Times — broadsheet lineage: condensed serif headlines on warm paper-toned panels
- Klim Type Foundry — the editorial type tradition that made serif-display-over-sans-body a premium signal
## 14. Do's and Don'ts
### Do
- Use a near-black warm canvas (`#0e1414`) as the page base — dark-first is the identity
- Inset light cream/sand panels (`#f9f8f7`, `#ebe7df`, `#fcfcfc`) against the canvas — paper-on-slate
- Use the condensed serif (`serrifCondensed`) at weight `400` for all headlines
- Set every line of body copy, button, and label in Inter
- Make CTAs warm-neutral: cream `#e4e1d1` primary, near-black `#1c1a15` secondary
- Keep radii at `10px` for CTAs and `12px` for cards
- Use warm sand borders (`#d9d3c9`, `#ebe7df`) and hairline `rgba(252,252,252,0.1)` on dark
- Reserve the yellow `#ffd400` for sparse graphic accents and the focus ring only
- Dial on-dark text with opacity (`0.8`, `0.6`) rather than introducing new gray tones
- Lean on canvas/panel contrast for depth before reaching for shadows
- Tighten letter-spacing on display headlines (`-0.72px` at 72px and proportionally down)
### Don't
- Don't introduce a saturated blue or indigo brand colour — the historic Paddle indigo is retired
- Don't use a cold pure-white (`#ffffff`) canvas — Paddle is dark-first and warm
- Don't set headlines in a sans — the condensed serif is the brand signal
- Don't make the serif heavy (`600`+) at display sizes — weight stays at `400`
- Don't put the serif into buttons, labels, or body copy — Inter only there
- Don't use saturated or glowing CTA colours — cream and near-black are intentional restraint
- Don't make the yellow accent a primary button fill — it is decorative only
- Don't use pill-shaped action surfaces — `10px` radius, never `9999px` on CTAs
- Don't use cool neutral grays for borders — warm sand only
- Don't pile on drop shadows — contrast and hairlines carry separation
- Don't pair two saturated colours — the palette is warm-neutral with a single yellow pop
- Don't drop body copy onto the canvas at full muted opacity (`0.6`) — reserve that for secondary text
## 15. Agent Prompt Guide
### Quick Color Reference
- Canvas (background): Near-Black `#0e1414`
- Primary CTA: Cream `#e4e1d1` (text `#1c1a15`)
- Secondary CTA: Near-Black `#1c1a15` (text `#fcfcfc`)
- Heading ink (on light): `#0e1414`
- Body ink (on light): `#1c1a15`
- Text on canvas: Near-White `#fcfcfc` / `rgba(252,252,252,0.8)`
- Muted text on canvas: `rgba(252,252,252,0.6)`
- Light panel: `#f9f8f7` / Sand `#ebe7df`
- Border (light): Warm Sand `#d9d3c9`
- Accent (decorative only): Yellow `#ffd400`
### Example Component Prompts
- "Create a hero section on a near-black canvas (`#0e1414`). Headline at 72px condensed serif (serrifCondensed), weight 400, line-height 1.0, letter-spacing -0.72px, color `#fcfcfc`. Subtitle at 20px Inter weight 400, line-height 1.5, color `rgba(252,252,252,0.8)`. Cream CTA button (`#e4e1d1` bg, `#1c1a15` text, 10px radius, 16px 20px padding) plus near-black secondary button (`#1c1a15` bg, `#fcfcfc` text, 10px radius)."
- "Design a light content card inset on a dark canvas: background `#f9f8f7`, 1px solid `#d9d3c9` border, 12px radius, 24px padding, no drop shadow. Title at 32px serrifCondensed weight 400, color `#0e1414`. Body at 16px Inter weight 400, color `#1c1a15`."
- "Build a sand tag/badge: `#ebe7df` background, `#1c1a15` text, 6px radius, 4px 10px padding, 12px Inter weight 500. For a rare highlight use a yellow chip: `#ffd400` background, `#0e1414` text."
- "Create a sticky navigation over a near-black canvas: links in `rgba(252,252,252,0.8)`, secondary links in `rgba(252,252,252,0.6)`. Right-aligned cream CTA 'Get started' (`#e4e1d1` bg, `#1c1a15` text, 10px radius) and near-black 'Book a demo' (`#1c1a15` bg, `#fcfcfc` text)."
- "Design a product-module dark card: background `#1c1a15`, 1px solid `rgba(252,252,252,0.1)` border, 12px radius. Heading 24px serrifCondensed weight 500, `#fcfcfc`. Body 16px Inter weight 400, `rgba(252,252,252,0.8)`. 'Discover' button at `#0e1414` fill, `#fcfcfc` text, 10px radius."
- "Build an input field on a light panel: `#fcfcfc` background, 1px solid `#d9d3c9` border, 10px radius, 12px 16px padding. Label `#1c1a15` 13px Inter weight 500. On focus, border → `#0e1414` plus a 2px yellow `#ffd400` ring."
### Iteration Guide
1. Start dark — the canvas is `#0e1414`, and content lives on light cream/sand panels inset against it. This dark-first structure is the brand.
2. Headlines must be the condensed serif (serrifCondensed) at weight `400`; everything else — body, buttons, labels — is Inter.
3. Keep CTAs warm-neutral: cream `#e4e1d1` for primary, near-black `#1c1a15` for secondary. Resist the urge to add a saturated brand colour.
4. If you reach for blue or indigo, stop — that is the retired Paddle identity and the Stripe default. The current brand is warm-neutral.
5. Use the yellow `#ffd400` sparingly: graphic accents and the focus ring only, never a button fill.
6. Radii are `10px` on CTAs and `12px` on cards — never pill-shaped action surfaces.
7. On the dark canvas, vary text emphasis with opacity (`0.8` body, `0.6` muted) rather than new gray values.
8. Favour contrast and warm hairline borders (`#d9d3c9` on light, `rgba(252,252,252,0.1)` on dark) over drop shadows for depth.
---
*Theme-toggle audit: score=5, signals=[data-theme-attr, theme-context-selector]*
1. Visual Theme & Atmosphere
Paddle’s marketing site is what happens when a payments company decides it would rather feel like a quiet, expensive trade magazine than a fintech dashboard. The page root is a near-black canvas — #0e1414, a desaturated blue-green ink so dark it reads as warm charcoal rather than true black. Against that canvas, Paddle insets light panels in cream and sand (#f9f8f7, #ebe7df, #fcfcfc), so the page reads as paper laid on slate. The effect is calm, premium, and unmistakably B2B: a system designed to make enterprise buyers feel that the company handling their global tax compliance has taste and restraint to spare.
The defining typographic move is the display face. Where almost every payments competitor reaches for a clean geometric sans, Paddle runs a condensed serif (serrifCondensed) at weight 400 for headlines — 72px on the hero, 48px on section heads, with tight negative tracking (-0.72px, -0.48px). A condensed serif at a regular weight is a broadsheet gesture: it evokes the standfirst of a financial newspaper rather than the bold hero of a SaaS landing page. The headlines are large and confident but never shouty, because the weight stays at 400 and the letterforms do the work. Body copy is set entirely in Inter — neutral, screen-optimised, invisible by design — so the serif headline always gets to be the voice in the room.
Paddle’s CTAs are the clearest expression of the warm-neutral philosophy. The primary “Get started” button is filled with cream #e4e1d1 and labelled in near-black ink — an action surface that whispers rather than glows. The secondary “Book a demo” inverts to a near-black #1c1a15 fill with near-white text. Neither is a saturated brand colour; both are drawn from the same warm-neutral family as the panels around them. This is deliberate restraint — the buttons feel like part of the material, not coloured stickers placed on top of it. The only saturated colour anywhere on the page is a single vivid yellow #ffd400, used sparingly as a graphic accent on illustrations and highlight chips.
Radius is soft but conservative: 10px on the warm-neutral CTAs, 12px on cards, 6.4px on small chrome like the skip-link. Nothing is pill-shaped, nothing is sharp-cornered. The geometry matches the palette — rounded enough to feel approachable, tight enough to feel serious.
It is worth stating plainly what Paddle is not doing, because it informs everything. Historically Paddle leaned on a blue/indigo brand accent, the fintech default that Stripe still owns. That colour is now entirely absent from the live site. The current identity is warm-neutral first, condensed-serif second, and dark-canvas throughout — a complete repositioning away from “another payments startup” toward “the calm, premium infrastructure layer you trust with money and tax.”
Key Characteristics:
- Near-black canvas (
#0e1414) with light cream/sand panels inset against it — paper-on-slate - Condensed serif display (
serrifCondensed) at weight400, 72px hero, tight negative tracking — broadsheet, not bold-SaaS - Inter for all body copy — neutral screen sans, the serif always wins the spotlight
- Warm-neutral CTAs: cream
#e4e1d1primary and near-black#1c1a15secondary, no saturated brand fill - A single vivid yellow (
#ffd400) as the only saturated accent, used sparingly - Soft conservative radii —
10pxCTAs,12pxcards, nothing pill-shaped - Primary ink
#1c1a15/#0e1414on light; near-white#fcfcfcand translucent whites on dark - Warm sand borders (
#d9d3c9,#ebe7df) rather than cool grays - Calm, premium-B2B atmosphere — restraint signals trustworthiness
- The historic Paddle indigo is fully retired — warm-neutral + condensed-serif is the current identity
2. Color Palette & Roles
Canvas & Surface
- Canvas (
#0e1414): the page root — a near-black, faintly blue-green ink. Frames every light panel; the dominant background. - Surface White (
#fcfcfc): brightest light panel and small-button fill. Near-white, never pure#ffffff. - Surface Warm (
#f9f8f7): the default light content panel — warm off-white that headlines sit on. - Surface Sand (
#ebe7df): sand-toned panel and card background for warm sections; doubles as a soft border. - Surface Sand Deep (
#e8e6e2): slightly deeper sand for nested panels and alternating bands. - Surface Clay (
#d6cbb6): the deepest warm-neutral panel; used for emphasis blocks. - Surface Ink (
#1c1a15): warm near-black panel — the dark-card and dark-CTA fill, a touch warmer than the canvas.
Text
- Ink (
#0e1414): primary heading colour on light panels — near-black with the canvas’s blue-green undertone. - Ink Warm (
#1c1a15): the most common body/heading ink (warm near-black); also the on-cream button text. - Slate (
#2b3033): muted secondary text on light surfaces. - On-Dark (
#fcfcfc): primary text on the near-black canvas — near-white, high contrast. - On-Dark Soft (
rgba(252,252,252,0.8)): standard body copy on the canvas at 80% opacity. - On-Dark Muted (
rgba(252,252,252,0.6)): secondary text, links, and captions on the canvas at 60% opacity.
Brand & Action
- Brand Cream (
#e4e1d1): the primary brand/action surface — fills “Get started”. Warm-neutral, low-glow, on-brand text is near-black. - On-Brand Ink (
#1c1a15): text colour on the cream button. - Brand Ink (
#1c1a15): the secondary action fill — near-black “Book a demo” with near-white text. - On-Brand-Ink (
#fcfcfc): text colour on the dark button.
Accent
- Yellow (
#ffd400): the only saturated colour in the system. Decorative/graphic only — highlight chips, illustration pops, focus ring. Never a primary button fill.
Borders
- Border (
#d9d3c9): the standard warm sand border for cards and dividers on light panels. - Border Sand (
#ebe7df): softer warm border for low-emphasis separation. - Border Ink (
#0e1414): dark border matching the canvas — used on dark CTAs and on-dark cards. - Border On-Dark (
rgba(252,252,252,0.1)): hairline border for cards and dividers on the dark canvas. - Border Faint (
rgba(252,252,252,0.02)): near-invisible edge on the cream button against dark.
Semantic
- Success (
#108c3d): positive confirmation text — a muted forest green that sits with the warm palette. - Warning (
#9b6829): caution text — a warm ochre rather than a bright amber. - Danger (
#b42318): error text — a deep brick red, desaturated to fit the calm tone.
3. Typography Rules
Font Family
- Display:
serrifCondensed— a condensed serif used for all headlines at weight400. The signature of the brand. - Display fallback chain:
serrifCondensed, "serrifCondensed Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif. - Body:
Inter— neutral screen-optimised grotesque for all running copy, buttons, labels, and UI. - Body fallback chain:
Inter, "Inter Fallback", "Helvetica Neue", Helvetica, Arial, sans-serif. - Mono companion:
ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace— for code samples and API references.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | serrifCondensed | 72 | 400 | 1.0 | -0.72px | The hero headline — condensed serif at regular weight |
| Display Large | serrifCondensed | 56 | 400 | 1.04 | -0.56px | Secondary hero / oversized section heads |
| H1 | serrifCondensed | 48 | 400 | 1.05 | -0.48px | Page titles, major section heads |
| H2 | serrifCondensed | 40 | 400 | 1.1 | -0.4px | Feature section titles |
| H3 | serrifCondensed | 32 | 400 | 1.15 | -0.32px | Sub-sections, card headings |
| H4 | serrifCondensed | 24 | 500 | 1.25 | -0.012em | Smaller heads; weight steps up at smaller sizes |
| H5 / Eyebrow | Inter | 20 | 600 | 1.3 | normal | Inter takes over below display sizes for small heads |
| Body Large | Inter | 20 | 400 | 1.5 | normal | Hero subtitles, intro paragraphs |
| Body | Inter | 16 | 400 | 1.55 | normal | Standard reading text |
| Body Small | Inter | 14 | 400 | 1.5 | normal | Dense copy, secondary descriptions |
| Button | Inter | 16 | 500 | 1.0 | normal | All button labels |
| Label | Inter | 13 | 500 | 1.4 | normal | Form labels, metadata |
| Caption | Inter | 12 | 500 | 1.4 | 0.02em | Fine print, eyebrow tags |
| Link (on dark) | Inter | 16 | 400 | 1.5 | normal | rgba(252,252,252,0.6) nav/footer links |
| Code | mono | 14 | 400 | 1.6 | normal | API snippets, inline code |
Principles
- Condensed serif IS the brand —
serrifCondensedat weight400for every headline is the single most distinctive choice. A condensed serif at regular weight reads broadsheet, not bold-SaaS. - Serif heads, sans body — the serif appears only at display/heading sizes; Inter carries every line of body copy, every button, every label. The contrast between the two is the rhythm.
- Weight stays low at large sizes — display and heading sizes hold at
400; weight steps up to500/600only as type shrinks (H4, H5), so the big headlines never feel heavy. - Tight negative tracking on display — letter-spacing tightens with size (
-0.72pxat 72px,-0.48pxat 48px,-0.4pxat 40px), packing the condensed serif into dense editorial blocks. - Body copy on dark uses opacity, not new colours — running text on the canvas is
rgba(252,252,252,0.8), secondary textrgba(252,252,252,0.6). The single near-white is dialled with alpha rather than swapped for grays. - Inter at 500 for buttons — button labels are weight
500Inter, never the serif. The serif never appears in interactive chrome. - Reading column ~720px — running copy is capped near 720px so the neutral Inter body stays comfortable.
4. Component Stylings
Buttons
Primary — Cream
- Background:
#e4e1d1(brand cream) - Text:
#1c1a15(near-black ink) - Padding:
16px 20px - Radius:
10px - Font: 16px Inter weight 500
- Border:
rgba(252,252,252,0.02)(near-invisible edge on dark) - Hover: background darkens toward
#d6cbb6(clay) - Use: primary CTA — “Get started”
Secondary — Dark
- Background:
#1c1a15(warm near-black) - Text:
#fcfcfc(near-white) - Padding:
16px 20px - Radius:
10px - Border:
1px solid #fcfcfcat low opacity on dark sections - Font: 16px Inter weight 500
- Hover: background lightens slightly / subtle border brighten
- Use: secondary CTA — “Book a demo”, product “Discover” buttons (
#0e1414variant on dark)
Ghost — On Dark
- Background: transparent
- Text:
#fcfcfc(orrgba(252,252,252,0.8)) - Padding:
16px 20px - Radius:
10px - Border:
1px solid rgba(252,252,252,0.1) - Hover: border →
rgba(252,252,252,0.2), faint fill - Use: tertiary action on the dark canvas
Light Utility
- Background:
#fcfcfc - Text:
#0e1414 - Padding:
12px 20px - Radius:
6.4px - Border:
1px solid #0e1414 - Use: utility/chrome buttons (skip-to-content, in-app prompts) on light panels
Cards & Containers
- Light card: background
#f9f8f7(or#ebe7dfsand),1px solid #d9d3c9border,12pxradius,24pxpadding. - Dark card: background
#1c1a15,1px solid rgba(252,252,252,0.1)border,12pxradius — used on the canvas for product modules. - Cream emphasis card: background
#e4e1d1or#d6cbb6for highlighted plans/quotes. - Shadows are minimal — warm-neutral panels rely on the canvas contrast and hairline borders for separation, not drop shadows.
Badges, Tags, Pills
Sand Tag
- Background:
#ebe7df - Text:
#1c1a15 - Padding:
4px 10px - Radius:
6px - Font: 12px Inter weight 500
- Use: category labels, “New” eyebrow tags
Yellow Accent Chip
- Background:
#ffd400 - Text:
#0e1414 - Radius:
6px - Use: the rare highlight chip — illustrations, “limited” callouts. The only saturated badge.
On-Dark Outline Pill
- Background: transparent
- Text:
rgba(252,252,252,0.8) - Border:
1px solid rgba(252,252,252,0.1) - Radius:
pillfor metadata chips on the canvas
Inputs & Forms
- Background:
#fcfcfc - Border:
1px solid #d9d3c9(warm sand) - Radius:
10px - Padding:
12px 16px - Label:
#1c1a15, 13px Inter weight 500 - Text:
#1c1a15, 16px Inter weight 400 - Placeholder:
#2b3033at reduced opacity - Focus: border →
#0e1414plus a2pxyellow#ffd400ring - Error: border
#b42318, helper text#b4231813px
Navigation
- Sticky header over the near-black canvas (
#0e1414); header height ~64px - Logo and primary nav links in
#fcfcfc/rgba(252,252,252,0.8) - Secondary/footer links in
rgba(252,252,252,0.6) - Primary CTA right-aligned: cream
#e4e1d1“Get started” at10pxradius - Secondary CTA: near-black
#1c1a15“Book a demo” - Dropdown menus open onto light cream/sand panels (
#f9f8f7) for contrast against the dark bar - Mobile: hamburger toggle, full-screen dark overlay with light panel menu
5. Layout Principles
Spacing System
- Base unit:
4px - Scale:
0, 4, 8, 12, 16, 24, 32, 48, 64, 96 - Rhythm is comfortable but not vast — warm-neutral panels are generously padded (
24px+ interior), section gutters land at64–96px.
Grid & Container
- Max content width:
~1280px - Hero: large condensed-serif headline left or centred, with a product visual or illustration adjacent
- Feature sections: 2–3 column grids of light cards inset on the dark canvas
- Full-bleed dark canvas with floating light panels is the defining layout pattern — panels feel like sheets of paper on slate
- Product modules (“Billing”, “Retain”, “ProfitWell Metrics”) presented as dark cards with their own “Discover” CTA
Whitespace Philosophy
- Panels do the framing — instead of huge empty margins, Paddle uses the contrast between near-black canvas and light panels to define structure.
- Generous interior padding — content inside panels breathes; the panels themselves are densely placed.
- Warmth over emptiness — the sand/cream surfaces keep large areas from feeling cold or sterile.
Section Cadence
- Dark canvas runs continuously; light panels alternate in warmth (
#fcfcfc→#f9f8f7→#ebe7df→#d6cbb6) to create rhythm without leaving the dark-first system - Occasional full light-panel sections invert the page for emphasis (pricing, testimonials)
6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Fine chrome, subtle rounding on tiny elements |
| Small | 6px | Badges, tags, small utility buttons (≈6.4px observed) |
| Standard | 10px | The workhorse — all primary/secondary CTAs |
| Comfortable | 12px | Cards, content panels, product modules |
| Large | 16px | Featured panels, modal containers |
| Pill | 9999px | Metadata chips and avatars only — never CTAs |
The system centres on 10px for action surfaces and 12px for containers — soft enough to feel approachable, conservative enough to feel premium. Nothing on an action surface is pill-shaped; the pill radius is reserved for metadata chips and avatars. The slightly-rounded geometry matches the warm-neutral palette: friendly, not playful.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 — Flat | No shadow | Canvas, inline text |
| 1 — Panel | Contrast against canvas + 1px warm/hairline border | Light cards, dark cards on the canvas |
| 2 — Raised | Soft neutral shadow rgba(14,20,20,0.08) 0 4px 16px | Hover lift on cards, dropdowns |
| 3 — Floating | rgba(14,20,20,0.12) 0 12px 32px | Popovers, sticky CTAs, menus |
| 4 — Modal | rgba(0,0,0,0.4) 0 24px 64px + scrim | Dialogs, full overlays |
| 5 — Ring | 2px solid #ffd400 outline | Keyboard focus ring |
Shadow Philosophy — Paddle’s depth is primarily contrast-driven, not shadow-driven. The near-black canvas and light panels create separation on their own, so most cards rely on a warm hairline border (#d9d3c9 on light, rgba(252,252,252,0.1) on dark) rather than a drop shadow. When shadows do appear, they are warm and soft — tinted with the canvas ink (rgba(14,20,20,...)) rather than pure black — so elevation stays in the warm-neutral family. This restraint reinforces the premium-B2B calm: the page feels flat and composed, like printed material, rather than glossy and layered.
8. Interaction & Motion
Easing Curves
- Standard
cubic-bezier(0.4, 0, 0.2, 1)— default for state transitions, hovers, panel reveals - Emphasized
cubic-bezier(0.2, 0, 0, 1)— for hero entrances and larger panel animations - Out
cubic-bezier(0, 0, 0.2, 1)— exits and dismissals
Duration Buckets
- Fast:
150ms— colour swaps, border brighten, focus ring - Standard:
240ms— button hover, card lift, dropdown open - Slow:
320ms— section reveals, hero entrance, modal open
Per-Component Micro-States
- Cream button hover — background darkens toward
#d6cbb6(clay) over240ms; no glow, no scale. - Dark button hover — background lightens slightly / border brightens over
240ms. - Card hover — subtle lift via soft warm shadow (Level 1 → Level 2) over
240ms; no translate on dense grids. - Link hover (on dark) — opacity steps from
0.6→1.0over150ms; underline optional, colour does not change. - Input focus — border →
#0e1414, plus2pxyellow#ffd400ring over150ms. - Dropdown open — opacity 0→1 +
translate-Y(-4px)over240msemphasized ease.
Page Transitions
- Marketing pages use standard browser navigation. Heavy product modules and illustrations fade/slide in over
320msonce in viewport via Intersection Observer.
Reduced Motion Strategy
@media (prefers-reduced-motion: reduce)— all transitions degrade to opacity-only at120mslinear. Translate, scale, and rotate are removed; auto-playing hero animation is paused.
9. Accessibility & A11y
Contrast Pairs
#fcfcfctext on#0e1414canvas — 18.13:1 (AAA)#0e1414ink on#f9f8f7light panel — 17.54:1 (AAA)#1c1a15ink on#fcfcfcsurface — 16.94:1 (AAA)#1c1a15ink on#ebe7dfsand — 14.1:1 (AAA)#1c1a15on-brand ink on#e4e1d1cream CTA — 13.24:1 (AAA)#fcfcfctext on#1c1a15dark CTA — 16.94:1 (AAA)rgba(252,252,252,0.6)muted text on#0e1414canvas — 6.43:1 (AA)#0e1414on#ffd400yellow accent — 13.0:1 (AAA)#2b3033slate on#fcfcfcsurface — 13.01:1 (AAA)
Contrast is exceptionally strong throughout — the dark-canvas / light-panel structure pushes nearly every pair into AAA territory. The one pair to watch is the 0.6-opacity muted text on the canvas (6.43:1) — strong enough for AA but reserve it for secondary content, not primary reading copy.
Focus Indicators
- Default focus ring:
2px solid #ffd400(yellow accent) with2pxoffset — the one place the saturated accent earns its keep, since it pops against both the dark canvas and the warm panels. - On light panels the ring may pair with a
#0e1414inner border for definition.
ARIA Patterns
- Disclosure / Dropdown —
aria-expanded+aria-controlson nav triggers - Dialog —
role="dialog"aria-modal="true"with focus trap andaria-labelledbyon the title - Tablist —
role="tablist"/role="tab"/role="tabpanel"with arrow-key navigation for product switchers - Region landmarks — product modules wrapped in labelled
<section>regions
Keyboard Navigation
- Tab order follows DOM source order; skip-to-content link is the first focusable element (the
6.4pxlight utility button observed in the header) Esccloses menus, dialogs, and overlays- Arrow keys navigate within tablists and product switchers
- All CTAs and links reachable via Tab with the yellow focus ring
Screen Reader Hints
- Decorative illustrations and the yellow accent graphics get
aria-hidden="true" - Icon-only buttons get
aria-label - Live regions (
aria-live="polite") for inline form validation aria-describedbyfor helper text under inputs
Reduced Motion
- Honoured via
prefers-reduced-motion: reduce— all non-essential animation removed; opacity-only fades retained for state legibility.
10. Responsive Behavior
Breakpoints
| Name | Width | Key Changes |
|---|---|---|
| Mobile | <640px | Single column, panels stack full-width, reduced heading sizes |
| Tablet | 640–1024px | 2-column panel grids, moderate padding |
| Desktop | 1024–1280px | Full layout, 2–3 column product-module grids |
| Wide | ≥1280px | Centred 1280px content with generous dark margins |
Touch Targets
- CTAs use
16px 20pxpadding for a comfortable≥44×44pxhit area - Nav links get generous horizontal spacing for tap forgiveness
- Badges keep a minimum
4px 10pxpadding
Collapsing Strategy
- Hero:
72pxcondensed-serif display →~40pxon mobile, weight 400 maintained - Navigation: horizontal links + CTA → hamburger with full-screen dark overlay
- Product modules: 3-column → 2-column → single-column stacked panels
- Light panels go full-bleed-width on mobile, retaining their warm fill against the canvas
- Section spacing:
96px→48pxon mobile
Image Behavior
- Product screenshots and illustrations sit inside light/dark panels and keep their
12pxradius at all sizes - Yellow-accent graphics simplify on mobile
- Code/API samples may scroll horizontally rather than wrap
Container Queries
- Product-module cards within a feature grid use container queries to switch from horizontal to stacked layout when their container drops below ~360px, independent of viewport.
11. Content & Voice
Tone
Calm, premium, and operator-to-operator. Paddle speaks to SaaS and mobile founders who are tired of stitching together payments, tax, and compliance — so the copy is reassuring and competent rather than hype-driven. Condensed-serif headlines read like trade-press standfirsts: short, declarative, confident. Body copy in Inter is plain and direct, never marketing-thick.
Microcopy Patterns
- Button verbs —
Get started,Book a demo,Discover Billing. Action-first, product-named. Never “Click here”, never “Sign up free today!!”. - Error message recipe — what went wrong + what to do next. Example: “We couldn’t process that card. Try another method or contact support.”
- Success confirmations — terse, past-tense:
Payment received,Subscription updated. - Inline validation — appears under the field in
#b42318, 13px Inter weight 500.
Empty States
- Direct and quiet:
No transactions yet, followed by a single primary CTA and a docs link. - No mascots, no apologetic copy. Explanatory text at 16px Inter weight 400 in slate
#2b3033.
CTA Verb Conventions
- Primary:
Get started,Start now - Secondary:
Book a demo,Talk to sales - Tertiary / product:
Discover Billing,Explore pricing,Read the docs →
12. Dark Mode & Theming
Paddle is dark-first — the canvas is near-black (#0e1414) by default, with light cream and sand panels inset against it. This is the inverse of most fintech marketing sites and is the defining structural choice of the brand. There is no separate “dark mode toggle”; the dark canvas is the design.
Implementations targeting Paddle-flavour should treat the near-black canvas as the base layer and compose content on light warm-neutral panels:
bg(canvas)#0e1414— never lighten this; it is the frame- Light panels:
#fcfcfc(brightest) →#f9f8f7(warm) →#ebe7df(sand) →#d6cbb6(clay) - Text on canvas:
#fcfcfcheadings,rgba(252,252,252,0.8)body,rgba(252,252,252,0.6)muted - Text on panels:
#0e1414/#1c1a15ink,#2b3033slate for secondary - CTAs: cream
#e4e1d1primary, near-black#1c1a15secondary — these do not flip; they are warm-neutral by design
A light-first inversion (light page, dark panels) is possible for embedded contexts (dashboards inside a customer’s app), mapping canvas → #f9f8f7 and panels → #1c1a15, but the marketing identity is dark-first and should be preserved wherever brand recognition matters.
13. Lineage & Influences
Paddle’s current identity is a deliberate repositioning. It is a merchant-of-record payments and tax-compliance platform — the kind of infrastructure a founder hands the entire money-and-compliance problem to — and its design says exactly that: calm, premium, trustworthy, and uninterested in looking like another startup. The two moves that carry the whole system are the near-black warm canvas and the condensed serif display face. Together they read editorial and material — paper laid on slate — rather than glossy-SaaS. Inter does the invisible work of body copy so the serif headline always gets to be the voice.
The most instructive comparison is Stripe, Paddle’s editorial-fintech contemporary. Stripe kept broadsheet typography but committed to a cold saturated purple (#533afd) on a pure-white canvas; Paddle keeps the broadsheet typography but throws out the saturated brand colour entirely, inverts to a dark warm canvas, and makes its CTAs warm-neutral cream and near-black. Where Stripe says “financial newspaper in purple ink on white,” Paddle says “trade journal in serif on warm slate.” Crucially, Paddle itself used a blue/indigo accent historically — that colour is now completely absent from the live site. The lineage therefore runs through editorial broadsheet typography (condensed serif heads), the warm-minimal materials aesthetic of contemporary premium-B2B brands, and Inter’s neutral screen sans — and it pointedly rejects the saturated-blue/indigo fintech default it once shared.
Named influences:
- Inter (Rasmus Andersson) — neutral screen-optimised body sans carrying all running copy
- Stripe — editorial-fintech contemporary it diverges from (broadsheet typography kept, cold purple swapped for warm neutrals)
- Financial Times — broadsheet lineage: condensed serif headlines on warm paper-toned panels
- Klim Type Foundry — the editorial type tradition that made serif-display-over-sans-body a premium signal
14. Do’s and Don’ts
Do
- Use a near-black warm canvas (
#0e1414) as the page base — dark-first is the identity - Inset light cream/sand panels (
#f9f8f7,#ebe7df,#fcfcfc) against the canvas — paper-on-slate - Use the condensed serif (
serrifCondensed) at weight400for all headlines - Set every line of body copy, button, and label in Inter
- Make CTAs warm-neutral: cream
#e4e1d1primary, near-black#1c1a15secondary - Keep radii at
10pxfor CTAs and12pxfor cards - Use warm sand borders (
#d9d3c9,#ebe7df) and hairlinergba(252,252,252,0.1)on dark - Reserve the yellow
#ffd400for sparse graphic accents and the focus ring only - Dial on-dark text with opacity (
0.8,0.6) rather than introducing new gray tones - Lean on canvas/panel contrast for depth before reaching for shadows
- Tighten letter-spacing on display headlines (
-0.72pxat 72px and proportionally down)
Don’t
- Don’t introduce a saturated blue or indigo brand colour — the historic Paddle indigo is retired
- Don’t use a cold pure-white (
#ffffff) canvas — Paddle is dark-first and warm - Don’t set headlines in a sans — the condensed serif is the brand signal
- Don’t make the serif heavy (
600+) at display sizes — weight stays at400 - Don’t put the serif into buttons, labels, or body copy — Inter only there
- Don’t use saturated or glowing CTA colours — cream and near-black are intentional restraint
- Don’t make the yellow accent a primary button fill — it is decorative only
- Don’t use pill-shaped action surfaces —
10pxradius, never9999pxon CTAs - Don’t use cool neutral grays for borders — warm sand only
- Don’t pile on drop shadows — contrast and hairlines carry separation
- Don’t pair two saturated colours — the palette is warm-neutral with a single yellow pop
- Don’t drop body copy onto the canvas at full muted opacity (
0.6) — reserve that for secondary text
15. Agent Prompt Guide
Quick Color Reference
- Canvas (background): Near-Black
#0e1414 - Primary CTA: Cream
#e4e1d1(text#1c1a15) - Secondary CTA: Near-Black
#1c1a15(text#fcfcfc) - Heading ink (on light):
#0e1414 - Body ink (on light):
#1c1a15 - Text on canvas: Near-White
#fcfcfc/rgba(252,252,252,0.8) - Muted text on canvas:
rgba(252,252,252,0.6) - Light panel:
#f9f8f7/ Sand#ebe7df - Border (light): Warm Sand
#d9d3c9 - Accent (decorative only): Yellow
#ffd400
Example Component Prompts
- “Create a hero section on a near-black canvas (
#0e1414). Headline at 72px condensed serif (serrifCondensed), weight 400, line-height 1.0, letter-spacing -0.72px, color#fcfcfc. Subtitle at 20px Inter weight 400, line-height 1.5, colorrgba(252,252,252,0.8). Cream CTA button (#e4e1d1bg,#1c1a15text, 10px radius, 16px 20px padding) plus near-black secondary button (#1c1a15bg,#fcfcfctext, 10px radius).” - “Design a light content card inset on a dark canvas: background
#f9f8f7, 1px solid#d9d3c9border, 12px radius, 24px padding, no drop shadow. Title at 32px serrifCondensed weight 400, color#0e1414. Body at 16px Inter weight 400, color#1c1a15.” - “Build a sand tag/badge:
#ebe7dfbackground,#1c1a15text, 6px radius, 4px 10px padding, 12px Inter weight 500. For a rare highlight use a yellow chip:#ffd400background,#0e1414text.” - “Create a sticky navigation over a near-black canvas: links in
rgba(252,252,252,0.8), secondary links inrgba(252,252,252,0.6). Right-aligned cream CTA ‘Get started’ (#e4e1d1bg,#1c1a15text, 10px radius) and near-black ‘Book a demo’ (#1c1a15bg,#fcfcfctext).” - “Design a product-module dark card: background
#1c1a15, 1px solidrgba(252,252,252,0.1)border, 12px radius. Heading 24px serrifCondensed weight 500,#fcfcfc. Body 16px Inter weight 400,rgba(252,252,252,0.8). ‘Discover’ button at#0e1414fill,#fcfcfctext, 10px radius.” - “Build an input field on a light panel:
#fcfcfcbackground, 1px solid#d9d3c9border, 10px radius, 12px 16px padding. Label#1c1a1513px Inter weight 500. On focus, border →#0e1414plus a 2px yellow#ffd400ring.”
Iteration Guide
- Start dark — the canvas is
#0e1414, and content lives on light cream/sand panels inset against it. This dark-first structure is the brand. - Headlines must be the condensed serif (serrifCondensed) at weight
400; everything else — body, buttons, labels — is Inter. - Keep CTAs warm-neutral: cream
#e4e1d1for primary, near-black#1c1a15for secondary. Resist the urge to add a saturated brand colour. - If you reach for blue or indigo, stop — that is the retired Paddle identity and the Stripe default. The current brand is warm-neutral.
- Use the yellow
#ffd400sparingly: graphic accents and the focus ring only, never a button fill. - Radii are
10pxon CTAs and12pxon cards — never pill-shaped action surfaces. - On the dark canvas, vary text emphasis with opacity (
0.8body,0.6muted) rather than new gray values. - Favour contrast and warm hairline borders (
#d9d3c9on light,rgba(252,252,252,0.1)on dark) over drop shadows for depth.
Theme-toggle audit: score=5, signals=[data-theme-attr, theme-context-selector]
Drop paddle into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add paddle npx agentkit init --design paddle