Airbnb Design System

Consumer vacation marketplace · Coral Rausch accent and generous spacing...
Back to Home
01

Visual Theme & Atmosphere

Airbnb is the canonical example of a generous, photography-led consumer marketplace. The base canvas is pure white ({colors.canvas} — #ffffff) with deep near-black ink ({colors.ink} — #222222) for headlines and body, and a single voltage of Rausch ({colors.primary} — #ff385c) carrying every primary CTA, the search-button orb, the heart save state, and inline brand links. There is no secondary brand color in mainline marketing — the Luxe purple ({colors.luxe} — #460479) and Plus magenta ({colors.plus} — #92174d) tokens are sub-brand accents that only appear inside Airbnb Luxe / Plus contexts.

Type runs Airbnb Cereal VF (a custom variable font Airbnb licenses), with Circular as the historic in-house fallback and a system stack underneath. Cereal sits at modest weights — display headlines render at 22–28px in weight 500–600, not the heavy 700+ weights that financial or enterprise systems lean on. The hero h1 ("Inspiration for future getaways") on the homepage is just 28px / 700, which would feel small on a typical SaaS page; here it works because the layout leans on photography (city collage, property cards) for visual weight rather than typographic muscle.

...

Key Characteristics:

  • Single accent color: {colors.primary} (#ff385c — "Rausch") carries every primary CTA, the search orb, the heart save state, and the brand wordmark. Used scarcely — most pages are 90% white + ink with one or two Rausch moments.
  • ...

Live Visual Theme Representation:

Belong Anywhere - Human & Warm Marketplace
02

Color Palette & Roles

Brand & Accent

  • Rausch ({colors.primary} — #ff385c): The single brand color. Used for primary CTA backgrounds (Reserve, Continue), the search orb, the heart save state on property cards, and inline brand links. The most recognizable color in consumer travel.
  • Rausch Active ({colors.primary-active} — #e00b41): The press / pointer-down variant — slightly more saturated. Used on {component.button-primary-active}.
  • ...

Surface

  • Canvas ({colors.canvas} — #ffffff): The default page floor for every public page. Airbnb does not have a dark mode on the public web.
  • Surface Soft ({colors.surface-soft} — #f7f7f7): The lightest fill — used on disabled fields, sub-nav hover backgrounds, and the inline search filter band.
  • ...

Hairlines & Borders

  • Hairline ({colors.hairline} — #dddddd): The default 1px border tone — search bar dividers, table separators, footer column splitters, card 1px borders.
  • Hairline Soft ({colors.hairline-soft} — #ebebeb): A lighter divider used on long-scrolling editorial body separators.
  • ...

Text

  • Ink ({colors.ink} — #222222): The dominant text color on light surfaces. Display headlines, body paragraphs, primary nav links, and most inline link text. Never pure black.
  • Body ({colors.body} — #3f3f3f): A secondary running-text color used inside long-form review and amenity copy where ink would feel too heavy.
  • ...

Semantic

  • Error ({colors.primary-error-text} — #c13515): Inline error text for form validation. Distinct from Rausch — slightly darker, more saturated red.
  • Error Hover ({colors.primary-error-text-hover} — #b32505): Darkens on link hover.
  • ...

Scrim

  • Scrim ({colors.scrim} — #000000 at 50% opacity): The global modal backdrop tone — date picker, login dialog, language picker. Stored as the base hex; opacity is applied at render time.
primary
#ff385c
primary-active
#e00b41
primary-disabled
#ffd1da
primary-error-text
#c13515
primary-error-text-hover
#b32505
luxe
#460479
plus
#92174d
ink
#222222
body
#3f3f3f
muted
#6a6a6a
muted-soft
#929292
hairline
#dddddd
hairline-soft
#ebebeb
border-strong
#c1c1c1
canvas
#ffffff
surface-soft
#f7f7f7
surface-card
#ffffff
surface-strong
#f2f2f2
on-primary
#ffffff
on-dark
#ffffff
legal-link
#428bff
star-rating
#222222
scrim
#000000
03

Typography Rules

Font Family

The system runs Airbnb Cereal VF for everything — display, body, navigation, captions, microcopy. Fallbacks walk Circular, -apple-system, system-ui, Roboto, "Helvetica Neue", sans-serif. Circular is the historic in-house typeface still kept as the first non-variable fallback; system stacks back it up.

There is no separate display family. The variable font carries the entire scale.

Hierarchy

TokenSizeWeightLine HeightLetter SpacingUse
..................

Principles

...

Note on Font Substitutes

Dynamic Preview:
display-xl size: 28px | weight: 700 | height: 1.43 | spacing: 0
The quick brown fox jumps over the lazy dog
display-lg size: 22px | weight: 500 | height: 1.18 | spacing: -0.44px
The quick brown fox jumps over the lazy dog
display-md size: 21px | weight: 700 | height: 1.43 | spacing: 0
The quick brown fox jumps over the lazy dog
display-sm size: 20px | weight: 600 | height: 1.20 | spacing: -0.18px
The quick brown fox jumps over the lazy dog
title-md size: 16px | weight: 600 | height: 1.25 | spacing: 0
The quick brown fox jumps over the lazy dog
title-sm size: 16px | weight: 500 | height: 1.25 | spacing: 0
The quick brown fox jumps over the lazy dog
rating-display size: 64px | weight: 700 | height: 1.1 | spacing: -1px
The quick brown fox jumps over the lazy dog
body-md size: 16px | weight: 400 | height: 1.5 | spacing: 0
The quick brown fox jumps over the lazy dog
body-sm size: 14px | weight: 400 | height: 1.43 | spacing: 0
The quick brown fox jumps over the lazy dog
caption size: 14px | weight: 500 | height: 1.29 | spacing: 0
The quick brown fox jumps over the lazy dog
caption-sm size: 13px | weight: 400 | height: 1.23 | spacing: 0
The quick brown fox jumps over the lazy dog
badge size: 11px | weight: 600 | height: 1.18 | spacing: 0
The quick brown fox jumps over the lazy dog
micro-label size: 12px | weight: 700 | height: 1.33 | spacing: 0
The quick brown fox jumps over the lazy dog
uppercase-tag size: 8px | weight: 700 | height: 1.25 | spacing: 0.32px
The quick brown fox jumps over the lazy dog
button-md size: 16px | weight: 500 | height: 1.25 | spacing: 0
The quick brown fox jumps over the lazy dog
button-sm size: 14px | weight: 500 | height: 1.29 | spacing: 0
The quick brown fox jumps over the lazy dog
link size: 14px | weight: 400 | height: 1.43 | spacing: 0
The quick brown fox jumps over the lazy dog
nav-link size: 16px | weight: 600 | height: 1.25 | spacing: 0
The quick brown fox jumps over the lazy dog
04

Layout Principles

Spacing System

  • Base unit: 4px (with 2px micro-step).
  • Tokens: {spacing.xxs} 2px · {spacing.xs} 4px · {spacing.sm} 8px · {spacing.md} 12px · {spacing.base} 16px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.xxl} 48px · {spacing.section} 64px.
  • ...

Grid & Container

  • Max content width: ~1280px centered on the homepage and editorial pages. Listing detail pages cap closer to 1080px to keep the photo banner and reservation rail readable.
  • City link grid (homepage footer): 6-column grid at desktop with each cell housing a city name in {typography.title-md} and a category sub-label in {typography.body-sm} muted.
  • ...

Whitespace Philosophy

The system gives editorial bands 64px of vertical breathing room but compresses card grids — property and city-link cards sit just 16px apart. The contrast is intentional: the page reads as "open hero, dense marketplace below," reinforcing the marketplace nature without overwhelming the visitor at the fold.

Grid Layout Wireframe Mockup:

Property Grid Item 1
Property Grid Item 2
Layout Wireframe blueprint
1
2
3
4
5
6
7
8
9
10
11
12
Gutter spacing: 16px / 24px
Side Margins: 24px (Mobile) / 48px (Desktop)
Max Container Width: 1200px
05

Depth & Elevation

The system has essentially one shadow tier plus the flat baseline.

  • Flat (no shadow): Body, hero, footer, all editorial bands — 95% of surfaces.
  • Card hover float: box-shadow: rgba(0, 0, 0, 0.02) 0 0 0 1px, rgba(0, 0, 0, 0.04) 0 2px 6px 0, rgba(0, 0, 0, 0.1) 0 4px 8px 0 — applied to property cards on pointer hover, the search bar at rest, and the dropdown menus (account menu, language picker, date picker). This is the single shadow definition in the entire system.
  • ...
There are no progressive elevation tiers — the system either has the one shadow or none. Depth comes from photography, the white-on-white surface separation, and rounded-corner clipping rather than from layered shadows.

Elevation Level Showcase:

Soft Shadow Depth
Airbnb property cards use soft 16px blur shadows (`rgba(0,0,0,0.04)`) to stand out from canvas white.
Flat Surface (Level 0)

Used for background layers, sidebar headers, or baseline borders.

Low Elevation (Level 1 / Card)

Used for floating product elements, cards, and hover states.

High Elevation (Level 2 / Popover & Dropdown)

Used for modals, select menus, code editor tooltips, and overlay headers.

Border Radius & Shape Scale:

radius-sm 4px
radius-md 8px
radius-lg 12px
radius-pill Pill / Tag
06

Component Stylings

Buttons

button-primary — Rausch fill, white text, 8px radius, 14×24px padding, 48px height, weight 500. The most common CTA across the system: "Reserve", "Continue", "Search", account-flow primaries.

button-primary-active — The press state. Background flips to {colors.primary-active}. No transform, no shadow change.

button-primary-disabled — Pale Rausch tint at #ffd1da with white text. Cursor not-allowed.

button-secondary — White fill with ink text and a 1px ink outline. 8px radius. Used for "Save", "Cancel", and inverse CTAs over Rausch surfaces.

button-tertiary-text — Plain ink text, no surface, no border. Underlined on hover. Used for "Show more" type links and modal close labels.

button-pill-rausch — A pill-shaped Rausch CTA used on featured cells (e.g., "Become a host" sub-CTA) — 9999px radius, 10×20px padding, 14px label.

Search Surface

search-bar-pill — The signature global search bar. White fill, 9999px radius, 64px height, 1px hairline 1px-shadow border. Internally divided by vertical hairline rules into {component.search-field-segment} cells (Where / When / Who). Each segment holds an uppercase caption label above a placeholder line in {typography.caption}.

search-orb — The circular Rausch orb terminating the right edge of the search bar. 48×48px, fully rounded, white magnifying-glass icon centered. The hottest single color moment on the homepage.

Top Navigation

top-nav — White surface, 80px height, 1px bottom hairline. The Airbnb wordmark sits flush left, the three product tabs (Homes / Experiences / Services) sit in the dead center, and account utilities (host link, language globe, account menu) sit flush right.

product-tab-active — Ink label in {typography.nav-link}, 32px hand-illustrated icon, 2px ink underline rule beneath the icon-label pair.

product-tab-inactive — Muted label, illustrated icon, no underline. Becomes active on click.

new-tag — A tiny rounded-pill badge ({rounded.full}) anchored top-right of an icon, carrying the uppercase "NEW" label in {typography.uppercase-tag} (8px / 700 with 0.32px tracking, uppercase). Used on Experiences and Services to signal recency.

Listing Cards

property-card — A photo-first card. 1:1 aspect-ratio image with {rounded.md} corner clipping, image carousel dots overlay, "Guest favorite" floating badge top-left ({component.guest-favorite-badge}), and a heart icon top-right ({component.icon-button-circle} in default outlined state, Rausch-filled when saved). Beneath the image: 4–5 lines of meta — title ({typography.title-md}), distance / dates ({typography.body-sm} muted), and price ("$X night") right-aligned.

property-card-photo — The photo plate itself, separated as a token because some surfaces (wishlist, search results) reuse just the photo without the meta block.

experience-card — A taller-aspect card (4:5) for experience listings. Same {rounded.md} clipping, floating "NEW" badge top-left, heart top-right, and a single-line title beneath.

guest-favorite-badge — White rounded pill ({rounded.full}) at 11px / 600 weight. Sits over the photo with the system's only shadow tier applied for elevation.

Listing Detail

rating-display-card — The signature listing-detail moment. A 64px / 700 rating number ("4.81") flanked left and right by tiny laurel-wreath SVG ornaments. Beneath the rating: "Guest favorite" tagline and a row of ink stat columns. The largest typographic weight in the whole system.

amenity-row — A 1-column list of amenity icons + ink labels in {typography.body-md}. 12px row padding, no border between rows; section is closed by a 1px hairline divider above and below.

reviews-card — A 2-column grid of review excerpts. Each column holds an author row (avatar, name, date) above a 3-line excerpt with "Show more" tertiary link.

host-card — A white card with {rounded.md} rounding and 24px padding holding a host avatar, name, "Superhost" badge, response-rate stat, and a "Contact host" {component.button-secondary}.

reservation-card — The sticky right-rail card on listing detail pages. White surface, {rounded.md} rounding, 1px hairline border, 1px shadow tier elevation, 24px padding. Contains: nightly price ({typography.display-md} ink), date-range selector, guest-count stepper, "Reserve" primary CTA full-width, and a fee breakdown stack beneath in {typography.body-sm}.

Date Picker

date-picker-day — A 40×40px circular cell carrying the day number in {typography.body-sm}. Default state is transparent fill, ink text.

date-picker-day-selected — Ink fill, white text, full circle ({rounded.full}). Range states between two selected days carry a {colors.surface-soft} lozenge background that connects them.

Forms

text-input — White surface, 1px hairline outline, {rounded.sm} 8px radius, 56px height, 14×12px padding. Stacked label above (in {typography.caption} muted), placeholder text in {typography.body-md} muted. On focus, the border thickens to 2px ink and the border color flips to {colors.ink} — no glow, no ring.

Footer

footer-light — White surface (matches the page canvas — Airbnb has no contrast footer), 48×80px padding. Three columns of link blocks (Support / Hosting / Airbnb), separated by generous 24px gutters. Each column heads with a {typography.title-sm} ink label and stacks {component.footer-link} rows in {typography.body-sm} ink.

legal-band — A bottom strip beneath the footer columns carrying the copyright line, language picker (globe icon + "English (US)" link), currency picker, and social icons (Facebook, X, Instagram). All text in muted {colors.muted} at {typography.caption-sm}.

Interactive Component Demonstrations:

🔍 Search property...
07

Do's and Don'ts

Do

  • Use Coral Rausch (#ff385c) exclusively for primary CTA buttons.
  • Keep property cards with {rounded.lg} (12px or 14px) rounded corners.
  • Set card text layouts to have generous vertical gaps for high legibility.

Don't

  • Don't use sharp, non-rounded corners on property images or primary action cards.
  • Don't apply dark or high-contrast grey backgrounds on core consumer search screens.
  • Don't add deep, harsh shadows on static elements.
✅ Recommended / Do
  • Use Coral Rausch (#ff385c) exclusively for primary CTA buttons.
  • Keep property cards with {rounded.lg} (12px or 14px) rounded corners.
  • Set card text layouts to have generous vertical gaps for high legibility.
❌ Discouraged / Don't
  • Don't use sharp, non-rounded corners on property images or primary action cards.
  • Don't apply dark or high-contrast grey backgrounds on core consumer search screens.
  • Don't add deep, harsh shadows on static elements.
08

Responsive Behavior

NameWidthKey Changes
.........

Touch Targets

  • Primary CTAs at minimum 48×48px (above WCAG AAA).
  • Search orb is 48×48px circular — the most-tapped element on the page.
  • ...

Collapsing Strategy

  • Top product tabs collapse into a hamburger sheet below 744px.
  • Search bar's 3 segments collapse into a single-tap entry that opens a full-screen search overlay on mobile.
  • ...

Responsive Adaptation Note:

📱 Wide grids wrap into a single-column scrollable stream of photo cards on mobile screens.
Interactive Viewport Simulator
Width: 800px (Desktop Mode) Grid Container
Primary Column

Adjusts layout width

Secondary Column

Folds on viewport change

Sidebar Column

Stacks to bottom on mobile

09

Agent Prompt Guide

Copyable Agent Integration Prompt:

"Build a booking card: white backdrop, rounded borders (14px), coral CTA (#ff385c), and clean sans typography."
10

Full System Design Tokens

The parsed design tokens extracted from the core stylesheet of this design system:

Design TokenHex ValueSystem Palette Role
--primary#ff385cSystem color representation for primary
--primary-active#e00b41System color representation for primary-active
--primary-disabled#ffd1daSystem color representation for primary-disabled
--primary-error-text#c13515System color representation for primary-error-text
--primary-error-text-hover#b32505System color representation for primary-error-text-hover
--luxe#460479System color representation for luxe
--plus#92174dSystem color representation for plus
--ink#222222System color representation for ink
--body#3f3f3fSystem color representation for body
--muted#6a6a6aSystem color representation for muted
--muted-soft#929292System color representation for muted-soft
--hairline#ddddddSystem color representation for hairline
--hairline-soft#ebebebSystem color representation for hairline-soft
--border-strong#c1c1c1System color representation for border-strong
--canvas#ffffffSystem color representation for canvas
--surface-soft#f7f7f7System color representation for surface-soft
--surface-card#ffffffSystem color representation for surface-card
--surface-strong#f2f2f2System color representation for surface-strong
--on-primary#ffffffSystem color representation for on-primary
--on-dark#ffffffSystem color representation for on-dark
--legal-link#428bffSystem color representation for legal-link
--star-rating#222222System color representation for star-rating
--scrim#000000System color representation for scrim