Wanderstay Rentals.
Travel magazine that happens to be an app. Single-family typography, coral-pink accent reserved for primary CTAs, generous photography and 14–20px image radius.
The kitchen sink.
Build with Wanderstay Rentals.
A complete design system, ready for your AI coding agent. Every primitive, token, and pattern below is generated straight from DESIGN.md — drop the file in your project and ship matching UI in minutes.
Palette
Type scale
Buttons
Form controls
Select & toggle
Labeling
Cards
Prose-first token file — decisions live next to their reasoning.
Tabs & breadcrumb
Spacing scale
Fine micro-scale (1–5px) for pills, editorial scale (12–21px) for the grid.
Border radius scale
The system's own radius tokens — sm for chips and inputs, md for buttons, lg for cards, pill for fully-rounded CTAs.
Depth & elevation
Charts
The states behind the resting style.
Tokens describe the resting state. A real product needs every interaction state. Hover, focus, active, disabled, loading — all derived from the system's resting tokens.
Button
Input
Card
Tab
DESIGN.md
1---2name: "Wanderstay Rentals"3description: "Travel magazine that happens to be an app. Single-family typography, coral-pink accent reserved for primary CTAs, generous photography and 14–20px image radius."4tags: [consumer, editorial, warm, marketplace]5colors:6 primary: "#222222"7 secondary: "#6a6a6a"8 tertiary: "#ff385c"9 neutral: "#f7f7f7"10 surface: "#ffffff"11typography:12 display: "Plus Jakarta Sans"13 body: "Plus Jakarta Sans"14 mono: "JetBrains Mono"15 scale:16 hero: "3.5rem / 1.18 / 700 / -0.7px"17 h1: "2.75rem / 1.18 / 700 / -0.55px"18 h2: "1.75rem / 1.43 / 700 / 0"19 body: "1rem / 1.25 / 500 / 0"20radius:21 sm: 8px22 md: 14px23 lg: 20px24 pill: 9999px25shadows:26 card: "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"27 button: "rgba(255,56,92,0.22) 0 6px 16px -6px"28borders:29 card: "1px solid #dddddd"30 divider: "#dddddd"31buttons:32 primary:33 background: #ff385c34 color: #ffffff35 border: none36 shape: rounded37 padding: 14px 24px38 font: 60039 shadow: rgba(255,56,92,0.22) 0 6px 16px -6px40 hover: scale41 secondary:42 background: #ffffff43 color: #22222244 border: 1px solid #dddddd45 shape: pill46 padding: 12px 22px47 font: 60048 hover: scale49 outline:50 background: transparent51 color: #22222252 border: 1px solid #22222253 shape: rounded54 padding: 12px 22px55 font: 60056 ghost:57 background: transparent58 color: #22222259 border: none60 shape: rounded61 padding: 10px 12px62 font: 60063 hover: underline64charts:65 variant: "rounded-bars"66 stroke_width: 2.567 fill_opacity: 0.1868 gridlines: false69 bar_gap: 10px70 highlight: all71 dot_marker: true72 palette: ["#ffd1d8", "#ffadbd", "#ff7f95", "#ff5878", "#ff385c", "#e00b41", "#92174d"]73fonts_url: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400&display=swap"74dependencies: ["lucide-react"]75---76 77# Wanderstay Rentals78 79## AI Build Instructions80 81> **Read this section before writing any code.** The rules below82> are non-negotiable. Every value used in the UI must come from this83> file's frontmatter — never substitute, approximate, or invent new84> colors, fonts, radii, or shadows. If a value is missing, ask the85> user before adding one.86 87### 1 · Your role88 89You are building UI for a project that has adopted **Wanderstay Rentals** as its90design system. Treat `DESIGN.md` as the single source of truth.91Your job is to translate the user's product requirements into92components and pages that look like they were designed by the same93person who authored this file.94 95### 2 · Token compliance96 97- Pull every color, font family, radius, shadow, and spacing value98 from the frontmatter at the top of this file.99- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never100 hard-code hex values that bypass the system.101- When a token can be expressed as a CSS variable, declare it once102 in your global stylesheet and reference it everywhere downstream.103- The Google Fonts `<link>` is provided in the Typography section.104 Add it to `<head>` before any component renders.105 106### 3 · Component recipes107 108Use these recipes verbatim when building the corresponding component.109 110#### Buttons111 112Four variants are defined. Pick one — never blend variants or invent a fifth.113 114- **Primary** — rounded shape, bg `#ff385c`, text `#ffffff`, padding `14px 24px`, weight `600`, shadow `rgba(255,56,92,0.22) 0 6px 16px -6px`.115- **Secondary** — pill shape, bg `#ffffff`, text `#222222`, border `1px solid #dddddd`, padding `12px 22px`, weight `600`.116- **Outline** — rounded shape, text `#222222`, border `1px solid #222222`, padding `12px 22px`, weight `600`.117- **Ghost** — rounded shape, text `#222222`, padding `10px 12px`, weight `600`.118 119Reach for **primary** as the single dominant CTA per screen.120**Secondary** for the supporting action. **Outline** for tertiary121actions in toolbars. **Ghost** for inline links and table actions.122 123#### Cards124 125- Background: `#ffffff`126- Border: `1px solid #dddddd`127- 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`128- Radius: `radius.lg` (`20px`)129- Internal padding: `20px` for compact cards, `24–28px` for content cards.130 131#### Charts132 133- Bar/line variant: `rounded-bars`134- No gridlines — let the bars/lines carry the data.135- Highlight strategy: `all` — emphasize a single bar/point per chart.136- Use the declared palette in order: `#ffd1d8`, `#ffadbd`, `#ff7f95`, `#ff5878`, `#ff385c`, `#e00b41`, `#92174d`.137 138#### Typography pairings139 140- **Display (`Plus Jakarta Sans`)** — h1, h2, hero headlines, brand wordmarks.141- **Body (`Plus Jakarta Sans`)** — paragraphs, labels, button text, form inputs.142- **Mono (`JetBrains Mono`)** — code, eyebrows, metadata, numerals in tables.143 144### 4 · Hard constraints145 146Never do any of the following without explicit instruction from the user:147 148- Introduce a new color, font, radius, or shadow that isn't declared above.149- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).150- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.151- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.152- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.153 154### 5 · Before you finish — verify155 156Run through this checklist for every screen you produce:157 158- [ ] Every color used appears in the Colors table above.159- [ ] Headlines use the display font; body copy uses the body font.160- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).161- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.162- [ ] Cards and dividers use the declared border + shadow tokens.163- [ ] No values were invented; if you needed something missing, you stopped and asked.164 165---166 167## 1. Atmosphere168 169Wanderstay feels like a travel magazine that happens to be an app — pristine white canvases give way to full-bleed photography, and the interface itself disappears so the listings can breathe. The signature **coral-pink** (`#ff385c`) is used sparingly but unmistakably: search CTA, active tab indicator, primary action button, the occasional price or wishlist heart. Everything else is a disciplined grayscale, with `#222222` carrying almost every line of text.170 171What makes the system unmistakably Wanderstay is how much *faith* it places in content. Property photos are displayed at hero scale, 4:3 with edge-to-edge 14–20px radius. The category-tab pattern uses 3D rendered illustrated icons paired with crisp typographic labels — physical, tactile, almost toy-like, the rare consumer product where 3D renders and purely typographic UI coexist without tension.172 173A **single-family typography system** carries every label, from 8px legal footnote to 28px section heading. The "regular" weight is 500, giving every paragraph a slightly more confident texture than the web default. Negative tracking only kicks in at display sizes (>20px); body stays at 0 tracking for readability.174 175**Signature moves**176- Coral-pink (`#ff385c`) as a *single*-accent brand color — primary CTAs only177- Full-bleed photography at 4:3 / 16:9 with gentle 14–20px corner rounding178- 3D rendered category icons paired with typographic tabs179- Circular 50% icon buttons (back arrow, share, favorite) scattered throughout180- Single-family typography — one variable sans carries 8px to 28px181- 500 is the body weight (not 400) — subtle confidence in every paragraph182- Three-layer subtle booking-panel shadow stack183- No all-caps except at 8px superscript184 185## 2. Palette186 187### Primary188- **Coral** `#ff385c` — primary CTA, search, active state, wishlist heart189- **Deep Coral** `#e00b41` — pressed/active CTA states190- **Plus Magenta** `#92174d` — premium tier accent191- **Luxe Purple** `#460479` — luxury tier accent192- **Info Blue** `#428bff` — legal links only193 194### Surface195- **Canvas White** `#ffffff` — page, cards, containers196- **Soft Cloud** `#f7f7f7` — footer, map wrapper, subsurface197- **Hairline Gray** `#dddddd` — universal 1px border198 199### Neutrals200- **Ink Black** `#222222` — ~90% of all text201- Charcoal `#3f3f3f` · Ash Gray `#6a6a6a` · Mute `#929292` · Stone `#c1c1c1`202 203### Semantic204- Error `#c13515` · Deep Error `#b32505`205 206## 3. Typography207 208Single-family system. Weights observed: 500, 600, 700 — no 400 regular.209 210| Role | Size | Weight | Leading | Tracking |211|------|------|--------|---------|----------|212| Section | 28px | 700 | 1.43 | 0 |213| Subsection | 22px | 500 | 1.18 | -0.44px |214| Card title | 21px | 700 | 1.43 | 0 |215| Listing title | 20px | 600 | 1.20 | -0.18px |216| Subtitle Bold | 16px | 600 | 1.25 | 0 |217| Body Medium | 16px | 500 | 1.25 | 0 |218| Button Large | 16px | 500 | 1.25 | 0 |219| Button Default | 14px | 500 | 1.29 | 0 |220| Link | 14px | 500 | 1.43 | 0 |221| Caption Bold | 14px | 600 | 1.43 | 0 |222| Micro | 12px | 400 | 1.33 | 0 |223| Badge | 11px | 600 | 1.18 | 0 |224| Superscript | 8px | 700 | 1.25 | +0.32px (uppercase) |225 226**500 is the new 400.** Tight line-heights for headlines (1.18–1.25), generous for body (1.43). No all-caps except at 8px.227 228## 4. Buttons229 230### Primary CTA (Coral)231```css232background: #ff385c;233color: #ffffff;234padding: 14px 24px;235border-radius: 8px;236```237Active: `scale(0.92)` + 2px `#222222` focus ring.238 239### Secondary240- Background `#ffffff`, text `#222222`241- 1px `#dddddd` border, 20px (pill) or 8px radius242 243### Icon-Only Circular244- 32–44px diameter, 50% radius245- Background `#f2f2f2`, icon `#222222` outline 16–20px246- Active `scale(0.92)` + 4px white ring on photo backgrounds247 248### Pill Tab (Category Selector)249- Transparent, 8px 14px padding250- Active: 2px Ink Black underline beneath the label251 252## 5. Cards253 254### Listing Card255- Background `#ffffff`, **no shadow**256- Image: 4:3, 14px radius, full-bleed257- Metadata stacks below: city (16/600) → distance (14/500 ash) → date → price258 259### Booking Panel (the signature)260- Background `#ffffff`261- 14–20px radius, 1px `#dddddd` border262- Three-layer 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`263- 24px padding, ~370px wide, sticky at 120–140px from top264 265## 6. Charts266 267**Coral gradient bars** — each bar a step in the coral-magenta sweep (light coral → deep coral → magenta). The chart reads like a vacation density heatmap: warmer = more activity. Line charts use a 2.5px coral stroke with subtle fill, end-dot marker.268 269## 7. Spacing270 271- Base: 8px272- Scale: `2, 3, 4, 5.5, 6, 8, 10, 11, 12, 15, 16, 18.5, 22, 24, 32`273- Section padding: 48–64px desktop, 24–32px mobile274- Listing card gutter: 24px desktop, 16px mobile275- Stacked text rows: 4–8px (very tight, dense info)276 277## 8. Depth & elevation278 279| Level | Treatment | Use |280|-------|-----------|-----|281| 0 | Flat | Listing cards |282| 1 | `1px #dddddd` border | Amenity rows, footer |283| 2 | Subtle 3-layer stack | Booking panels |284| 3 | Coral glow | Search button |285 286## 9. Do's & don'ts287 288✅ **Do**289- Reserve coral (`#ff385c`) for primary CTAs and search only290- Use 14–20px radius on all photography291- Use 500 as the body weight — never 400292- Apply scale(0.92) on button press293- Stick to single-family typography across all sizes294 295❌ **Don't**296- Use coral decoratively — it loses its signal297- Use sharp corners on photography298- Use weight 400 for body299- Apply all-caps except at 8px superscript300- Use cool blue-grays — neutrals are warm-tinted301 302---303 304## Tokens305 306> Generated from the same source the live preview renders from.307> Treat the values below as the contract — never substitute approximations.308 309### Colors310 311| Role | Value |312|-----------|-------|313| primary | `#222222` |314| secondary | `#6a6a6a` |315| tertiary | `#ff385c` |316| neutral | `#f7f7f7` |317| surface | `#ffffff` |318 319### Typography320 321- **Display:** Plus Jakarta Sans322- **Body:** Plus Jakarta Sans323- **Mono:** JetBrains Mono324 325| Role | size / leading / weight / tracking |326|------|------------------------------------|327| Hero | 3.5rem / 1.18 / 700 / -0.7px |328| H1 | 2.75rem / 1.18 / 700 / -0.55px |329| H2 | 1.75rem / 1.43 / 700 / 0 |330| Body | 1rem / 1.25 / 500 / 0 |331 332### Radius333 334- sm: `8px`335- md: `14px`336- lg: `20px`337- pill: `9999px`338 339### Shadows340 341- **card:** `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`342- **button:** `rgba(255,56,92,0.22) 0 6px 16px -6px`343 344### Borders345 346- **card:** `1px solid #dddddd`347- **divider:** `#dddddd`348 349### Buttons350 351Four variants, each fully tokenized. The preview renders from these exact values.352 353#### Primary354 355| Property | Value |356|----------|-------|357| shape | `rounded` |358| background | `#ff385c` |359| color | `#ffffff` |360| border | `none` |361| padding | `14px 24px` |362| fontWeight | `600` |363| shadow | `rgba(255,56,92,0.22) 0 6px 16px -6px` |364| hoverHint | `scale` |365 366#### Secondary367 368| Property | Value |369|----------|-------|370| shape | `pill` |371| background | `#ffffff` |372| color | `#222222` |373| border | `1px solid #dddddd` |374| padding | `12px 22px` |375| fontWeight | `600` |376| hoverHint | `scale` |377 378#### Outline379 380| Property | Value |381|----------|-------|382| shape | `rounded` |383| background | `transparent` |384| color | `#222222` |385| border | `1px solid #222222` |386| padding | `12px 22px` |387| fontWeight | `600` |388 389#### Ghost390 391| Property | Value |392|----------|-------|393| shape | `rounded` |394| background | `transparent` |395| color | `#222222` |396| border | `none` |397| padding | `10px 12px` |398| fontWeight | `600` |399| hoverHint | `underline` |400 401### Charts402 403| Property | Value |404|----------|-------|405| variant | `rounded-bars` |406| strokeWidth | `2.5` |407| fillOpacity | `0.18` |408| gridlines | `false` |409| barGap | `10px` |410| highlight | `all` |411| dotMarker | `true` |412| palette | `#ffd1d8`, `#ffadbd`, `#ff7f95`, `#ff5878`, `#ff385c`, `#e00b41`, `#92174d` |413 414---415 416## Pro tokens417 418> Production-fidelity tokens. States, density, motion, elevation,419> content rules and a measured WCAG contract — derived from the420> resting tokens unless explicitly authored.421 422### States423 424#### Button425 426- **hover** — bg: `rgba(255, 56, 92, 0.92)`, shadow: `0 4px 20px -8px rgba(255, 56, 92, 0.4)`427- **focus** — outline: `1.5px solid #ff385c`, outline-offset: `4px`428- **active** — transform: `translateY(1px)`, filter: `brightness(0.95)`429- **disabled** — opacity: `0.45`430- **loading** — opacity: `0.7`431- **selected** — bg: `#222222`, color: `#ffffff`432 433#### Input434 435- **hover** — border: `1px solid #222222`436- **focus** — border: `1px solid #ff385c`, shadow: `0 1px 0 0 #ff385c`437- **disabled** — opacity: `0.45`438- **error** — border: `1px solid #991B1B`, shadow: `0 1px 0 0 #991B1B`439 440#### Card441 442- **hover** — shadow: `0 8px 24px -12px rgba(15,23,42,0.14)`, transform: `translateY(-1px)`443- **selected** — border: `1px solid #222222`444 445#### Tab446 447- **hover** — color: `#222222`448- **focus** — outline: `1.5px solid #ff385c`, outline-offset: `3px`449- **selected** — color: `#ff385c`, border: `0 0 2px 0 solid #ff385c`450 451### Density452 453| Mode | padding × | row × | body | radius × | Use for |454|------|-----------|-------|------|----------|---------|455| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |456| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |457| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |458 459### Motion460 461**Signature — Page turn.** Deliberate, measured motion — like turning a magazine page. Never jerky, never overdone.462 463```css464transition: all 320ms cubic-bezier(0.25, 0.46, 0.45, 0.94);465```466 467| Token | Value |468|-------|-------|469| duration.instant | `80ms` |470| duration.fast | `180ms` |471| duration.base | `320ms` |472| duration.slow | `500ms` |473| easing.standard | `cubic-bezier(0.25, 0.46, 0.45, 0.94)` |474| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |475| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |476| easing.spring | `cubic-bezier(0.5, 1.2, 0.6, 1)` |477 478### Elevation479 480Five-level scale, system-specific recipe.481 482| Level | Shadow | Recipe |483|-------|--------|--------|484| level0 | `none` | Hairline only — typical editorial resting state. |485| level1 | `0 1px 2px rgba(15,23,42,0.04)` | Barely visible — list rows, dividers. |486| level2 | `0 8px 24px -12px rgba(15,23,42,0.12)` | Pull-quote, sidebar — soft lift. |487| level3 | `0 16px 40px -16px rgba(15,23,42,0.18)` | Cover story card — clear lift. |488| level4 | `0 32px 80px -24px rgba(15,23,42,0.28)` | Modal — overlays the layout, with scrim. |489 490### Content491 492- **measure:** `60ch` (max line length for body prose)493- **paragraph spacing:** `1.5em`494- **list indent:** `1.75em`495- **list gap:** `0.55em`496- **link:** color `#ff385c`, underline `always`497- **blockquote:** border `4px solid #ff385c`, padding `0.4em 0 0.4em 1.5em`498- **code:** background `rgba(34, 34, 34, 0.06)`, color `#222222`499 500### Accessibility (WCAG 2.1)501 502**Overall:** AA-Large503 504| Pair | Ratio | Required | Grade | Suggested fix |505|------|-------|----------|-------|---------------|506| Body text on surface | 15.91:1 | AA | AAA | — |507| Body text on canvas | 14.85:1 | AA | AAA | — |508| Muted text on surface | 5.41:1 | AA | AA | — |509| Accent on surface | 3.52:1 | AA-Large | AA-Large | — |510| Accent on canvas | 3.28:1 | AA-Large | AA-Large | — |511 Wire it into your agent.
# CLAUDE.md Reference @DESIGN.md for all styling decisions. Apply tokens strictly — do not introduce colors, fonts, or radii outside the system. When in doubt, prefer the values declared in DESIGN.md frontmatter.Three snippets.
Google Fonts link
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400&display=swap" />Install dependencies
npm install lucide-reactTailwind config
// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Plus Jakarta Sans"', 'serif'], sans: ['"Plus Jakarta Sans"', 'sans-serif'], mono: ['"JetBrains Mono"', 'monospace'], }, colors: { primary: '#222222', secondary: '#6a6a6a', accent: '#ff385c', neutral: '#f7f7f7', surface: '#ffffff', }, borderRadius: { sm: '8px', md: '14px', lg: '20px', }, }, },};Try another system.
Atrium Folio
An architecture studio's monograph rendered in HTML. Cormorant Garamond at oversized scale for project titles, Inter for body, concrete-grey surfaces with one warm terracotta accent reserved for the project number. Built for architecture firms, design studios, and portfolio sites where each project deserves its own page.
Frostlite
Light glass. Pale daylight canvas with a soft mesh aurora behind it; cards float as frosted panes with a 28px backdrop-blur and faint inset highlight. Depth without the weight of dark mode.