A live page in this style is not built yet — the CSS variables and the prompt below are enough to reproduce it.
At a glance
Airbnb, in one page
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.
The shape language is soft. Buttons are 8px radius ({rounded.sm}), property cards are ~14px ({rounded.md}), the search bar is fully pill-shaped ({rounded.full}), wishlist hearts and search orbs are circles ({rounded.full}), and category strip rounded corners run at 32px ({rounded.xl}). There is essentially no hard corner anywhere except the body grid itself — every interactive element is rounded.
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. - Custom variable type:
Airbnb Cereal VF. Display weights sit at 500–700, body at 400. Modest weight is intentional — the system trusts photography for visual heft. - Three-product top nav: Homes, Experiences, Services — each with a hand-illustrated 32px icon and "NEW" badges (
{component.new-tag}) on the two newer products. Active tab uses an underline rule ({component.product-tab-active}). - Pill-shaped global search bar: white surface, fully rounded (
{rounded.full}), divided by 1px hairlines into Where / When / Who segments, terminated by a circular Rausch search orb ({component.search-orb}). - Property cards are photo-first: aspect-ratio rectangles with
{rounded.md}corner clipping, swipeable image carousel, "Guest favorite" floating badge top-left, heart icon top-right, then 4–5 lines of meta beneath. - Editorial dropdowns (footer, language picker) are clean text columns over the white canvas — no card surface, no shadow.
- The design system caps elevation at one shadow tier (
box-shadow: rgba(0,0,0,0.02) 0 0 0 1px, rgba(0,0,0,0.04) 0 2px 6px, rgba(0,0,0,0.1) 0 4px 8px) — used on hover-floated cards and search/account dropdowns. - 8px base spacing system, with major sections at
{spacing.section}(64px) — generous but not airy enough to feel editorial-magazine; the marketplace density wants more cards per scroll.
Do's and don'ts
Copy this into your AI builder
Paste it as-is. Every value below was measured from the original site, not guessed.
Assembled from the measured tokens — the source document has no prompt block.
Build a page in the Airbnb design language. Follow the measured tokens below — do not substitute your own palette.
Colors:
- 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
Type:
- families: Airbnb Cereal VF, Circular, -apple-system, Roboto
- scale: 8, 11, 12, 13, 14, 16, 20, 21, 22
- weights: 400, 500, 600, 700
Shape:
- radius: 0, 4, 8, 14, 20, 32
- elevation: The system has essentially one shadow tier plus the flat baseline. | Flat (no shadow): Body, hero, footer, all editorial bands — 95% of surfaces.
Spacing: 2, 4, 8, 12, 16, 24, 32, 48, 64
Keep every value literal. If a token is given, use that exact value.
The specification
Colour paletteRead the full spec
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}. - Rausch Disabled (
{colors.primary-disabled}— #ffd1da): A pale tint used on disabled CTAs. - Luxe Purple (
{colors.luxe}— #460479): Sub-brand accent for Airbnb Luxe. Only appears inside Luxe-branded surfaces — never in mainline marketing. - Plus Magenta (
{colors.plus}— #92174d): Sub-brand accent for Airbnb Plus. Same scoping as Luxe — sub-product only.
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. - Surface Strong (
{colors.surface-strong}— #f2f2f2): Slightly heavier fill — circular icon-button surface (e.g., the breadcrumb back-arrow and listing toolbar buttons).
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. - Border Strong (
{colors.border-strong}— #c1c1c1): A heavier stroke used on disabled outline buttons and form input outlines after focus.
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. - Muted (
{colors.muted}— #6a6a6a): Sub-titles inside city link blocks ("Cottage rentals", "Villa rentals"), inactive product-tab labels, footer category sub-labels, "View all" links. - Muted Soft (
{colors.muted-soft}— #929292): Disabled link text. Used very sparingly. - Star Rating (
{colors.star-rating}— #222222): The same ink token — Airbnb's star icon and "4.81" rating numbers all render in ink rather than a yellow/gold color, which is a deliberate brand choice (yellow stars feel cheap in travel context). - On Primary (
{colors.on-primary}— #ffffff): White text on Rausch CTAs.
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. - Legal Link Blue (
{colors.legal-link}— #428bff): Inline links inside legal copy (Privacy, Terms). Only used inside the legal sub-band.
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.
Type scaleRead the full spec
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
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|---|---|---|---|---|---|
{typography.rating-display} | 64px | 700 | 1.1 | -1px | Listing detail rating display ("4.81") |
{typography.display-xl} | 28px | 700 | 1.43 | 0 | Homepage h1 ("Inspiration for future getaways") |
{typography.display-lg} | 22px | 500 | 1.18 | -0.44px | Listing detail h1 ("Close to Fethiye Aliyah Bali Beach…") |
{typography.display-md} | 21px | 700 | 1.43 | 0 | Section heads inside listing detail ("What this place offers") |
{typography.display-sm} | 20px | 600 | 1.20 | -0.18px | Sub-section titles ("Things to know") |
{typography.title-md} | 16px | 600 | 1.25 | 0 | City link block titles ("Wilmington", "Athens") |
{typography.title-sm} | 16px | 500 | 1.25 | 0 | Footer column heads ("Support", "Hosting", "Airbnb") |
{typography.body-md} | 16px | 400 | 1.5 | 0 | Default running-text inside listing copy |
{typography.body-sm} | 14px | 400 | 1.43 | 0 | Card meta lines, dates, prices, distance text |
{typography.caption} | 14px | 500 | 1.29 | 0 | Search field segment labels ("Where", "When", "Who") |
{typography.caption-sm} | 13px | 400 | 1.23 | 0 | Footer legal line ("© 2026 Airbnb, Inc.") |
{typography.badge} | 11px | 600 | 1.18 | 0 | "Guest favorite" floating badge text |
{typography.micro-label} | 12px | 700 | 1.33 | 0 | Card amenity micro-labels ("Inline 6") |
{typography.uppercase-tag} | 8px | 700 | 1.25 | 0.32px (uppercase) | "NEW" badge on product nav tabs |
{typography.button-md} | 16px | 500 | 1.25 | 0 | Primary CTA button labels |
{typography.button-sm} | 14px | 500 | 1.29 | 0 | Pill button labels (category strip) |
{typography.link} | 14px | 400 | 1.43 | 0 | Inline body links |
{typography.nav-link} | 16px | 600 | 1.25 | 0 | Top product-nav labels (Homes, Experiences, Services) |
Principles
Display weights stay modest. The homepage h1 at 28px / 700 is deliberately small — it tucks under the search bar so photography and the city-link grid carry visual hierarchy. The listing-detail h1 at 22px / 500 is even quieter; the listing photo banner does the work above it.
The single typographically loud moment in the entire system is the rating display ({typography.rating-display} — 64px / 700) on listing pages. That is the only place the system trusts type alone to carry hierarchy — rating numbers are a peak trust signal, so they get the loudest treatment.
Note on Font Substitutes
If Airbnb Cereal VF and Circular are unavailable, Inter is the closest open-source substitute. Adjust display headlines down by ~2% in line-height to match Cereal's slightly tighter cap height; otherwise the proportions transfer cleanly.
Components and layoutRead the full spec
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.
Responsive behaviourRead the full spec
| Name | Width | Key Changes |
|---|---|---|
| Mobile | < 744px | Top nav collapses to logo + hamburger; product tabs hide behind a sheet; search bar collapses to a single tappable pill; property cards stack 1-up; city grid 1-column; listing detail collapses reservation card to a sticky bottom bar. |
| Tablet | 744–1128px | Top nav keeps product tabs but search bar narrows; property cards 2-up; city grid 2–3 column; reservation card stays sticky right-rail at narrower width. |
| Desktop | 1128–1440px | Full top nav with three product tabs centered; search bar at full pill width with all 3 segments visible; property cards 4-up; city grid 6-column; listing detail 2-column with reservation rail. |
| Wide | > 1440px | Content width caps at 1440px on listing/search pages and ~1280px on editorial; gutters absorb the rest. |
Touch Targets
- Primary CTAs at minimum 48×48px (above WCAG AAA).
- Search orb is 48×48px circular — the most-tapped element on the page.
- Heart save button is 32×32px circular — borderline for AAA but compensated by a generous 12px padding inside the photo card.
- Date-picker day cells are 40×40px circular.
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.
- Property and city-link grids drop column counts cleanly at each breakpoint — never reflow rows; always reduce columns.
- Reservation card on listing detail switches from sticky right-rail to a sticky bottom bar on mobile, carrying just the "Reserve" CTA + nightly price summary.
Drop-in CSS variables
The same values as a theme block. Add the class to <body> and the site repaints.
body.theme-airbnb {--page-bg: #ffffff;
--page-bg-gradient: none;
--text-color: #222222;
--heading-color: #222222;
--link-color: #e70028;
--link-hover-color: #b4001f;
--border-color: #d7d7d7;
--card-bg: #ffffff;
--card-shadow: 0 1px 2px rgba(34,34,34,0.06);
--card-hover-shadow: 0 6px 18px rgba(34,34,34,0.12);
--header-bg: #222222;
--header-text-color: #ffffff;
--header-shadow: none;
--footer-bg: #ffffff;
--footer-text-color: #6f6f6f;
--button-bg: #ec0028;
--button-text-color: #ffffff;
--button-hover-bg: #b9001f;
--button-border: none;
--button-border-radius: 14px;
--button-secondary-bg: #f2f2f2;
--button-secondary-text-color: #222222;
--button-secondary-hover-bg: #e4e4e4;
--button-secondary-border: 1px solid #d7d7d7;
--prompt-bg: #f4f4f4;
--prompt-text-color: #222222;
--base-font: var(--font-helvetica);
--heading-font: var(--font-roboto);
--card-border-radius: 14px;
}
Visually close to
Measured with a deterministic colour + geometry comparison across 958 styles. Not a hand-picked list.
- minimax 73.3%
- spiral 71.8%
- pinterest 70.9%
- francfranc 70.8%
- cohere 70.5%
Where this came from
- Source document
volt/design-md/airbnb/DESIGN.md· 29.6 KB- Repository
- VoltAgent/awesome-design-md
- Licence
- MIT
Source text is reproduced under its original licence. Tokens, similarity scores and page structure are ours.