mirror of
https://github.com/VoltAgent/awesome-design-md.git
synced 2026-05-14 13:06:57 +08:00
update design.md v2
This commit is contained in:
parent
beec066d6a
commit
f2d6b17d0d
@ -1,263 +1,633 @@
|
||||
# Design System Inspired by Together AI
|
||||
---
|
||||
version: alpha
|
||||
name: Together AI Inspired
|
||||
description: An inspired interpretation of Together AI's design language — an AI infrastructure platform whose surface alternates between near-black hero bands (with a three-color orange-magenta-periwinkle gradient as the single piece of brand chrome) and bright white research / pricing / docs bands, knit together by a custom display sans and an uppercase mono eyebrow face.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#000000"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#000000"
|
||||
body: "#959494"
|
||||
hairline: "#959494"
|
||||
canvas: "#ffffff"
|
||||
canvas-dark: "#010120"
|
||||
surface-dark-soft: "#313641"
|
||||
on-dark: "#ffffff"
|
||||
accent-orange: "#fc4c02"
|
||||
accent-magenta: "#ef2cc1"
|
||||
accent-periwinkle: "#bdbbff"
|
||||
accent-mint: "#c8f6f9"
|
||||
|
||||
Together AI's interface is a pastel-gradient dreamscape built for enterprise AI infrastructure — a design that somehow makes GPU clusters and model inference feel light, airy, and optimistic. The hero section blooms with soft pink-blue-lavender gradients and abstract, painterly illustrations that evoke clouds and flight, establishing a visual metaphor for the "AI-Native Cloud" proposition. Against this softness, the typography cuts through with precision: "The Future" display font at 64px with aggressive negative tracking (-1.92px) creates dense, authoritative headline blocks.
|
||||
typography:
|
||||
display-xxl:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 64px
|
||||
fontWeight: 500
|
||||
lineHeight: 70.4px
|
||||
letterSpacing: -1.92px
|
||||
display-xl:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 40px
|
||||
fontWeight: 500
|
||||
lineHeight: 48px
|
||||
letterSpacing: -0.8px
|
||||
display-lg:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 28px
|
||||
fontWeight: 500
|
||||
lineHeight: 32.2px
|
||||
letterSpacing: -0.42px
|
||||
display-md:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 22px
|
||||
fontWeight: 500
|
||||
lineHeight: 25.3px
|
||||
letterSpacing: -0.22px
|
||||
body-lg:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 23.4px
|
||||
letterSpacing: -0.18px
|
||||
body-lg-strong:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 500
|
||||
lineHeight: 23.4px
|
||||
letterSpacing: -0.18px
|
||||
body-md:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 20.8px
|
||||
letterSpacing: -0.16px
|
||||
body-md-strong:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 20.8px
|
||||
letterSpacing: -0.16px
|
||||
caption:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 19.6px
|
||||
caption-strong:
|
||||
fontFamily: The Future, Inter, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 19.6px
|
||||
mono-caps-button:
|
||||
fontFamily: PP Neue Montreal Mono, ui-monospace, SF Mono, Menlo, monospace
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 16px
|
||||
letterSpacing: 0.08px
|
||||
mono-caps-eyebrow:
|
||||
fontFamily: PP Neue Montreal Mono, ui-monospace, SF Mono, Menlo, monospace
|
||||
fontSize: 11px
|
||||
fontWeight: 500
|
||||
lineHeight: 11px
|
||||
letterSpacing: 0.55px
|
||||
mono-caps-label:
|
||||
fontFamily: PP Neue Montreal Mono, ui-monospace, SF Mono, Menlo, monospace
|
||||
fontSize: 11px
|
||||
fontWeight: 500
|
||||
lineHeight: 15.4px
|
||||
letterSpacing: 0.055px
|
||||
mono-caption:
|
||||
fontFamily: PP Neue Montreal Mono, ui-monospace, SF Mono, Menlo, monospace
|
||||
fontSize: 10px
|
||||
fontWeight: 400
|
||||
lineHeight: 14px
|
||||
letterSpacing: 0.05px
|
||||
|
||||
The design straddles two worlds: a bright, white-canvas light side where pastel gradients and stats cards create an approachable platform overview, and a dark navy universe (`#010120` — not gray-black but a deep midnight blue) where research papers and technical content live. This dual-world approach elegantly separates the "business" messaging (light, friendly, stat-driven) from the "research" messaging (dark, serious, academic).
|
||||
rounded:
|
||||
none: 0px
|
||||
xs: 3.25px
|
||||
sm: 4px
|
||||
md: 8px
|
||||
full: 9999px
|
||||
|
||||
What makes Together AI distinctive is its type system. "The Future" handles all display and body text with a geometric modernist aesthetic, while "PP Neue Montreal Mono" provides uppercase labels with meticulous letter-spacing — creating a "technical infrastructure company with taste" personality. The brand accents — magenta (`#ef2cc1`) and orange (`#fc4c02`) — appear sparingly in the gradient and illustrations, never polluting the clean UI.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
4xl: 44px
|
||||
5xl: 48px
|
||||
6xl: 55.2px
|
||||
section: 80px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas-dark}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-md}"
|
||||
padding: "{spacing.lg} {spacing.3xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-md}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.2xl}"
|
||||
button-secondary-mint:
|
||||
backgroundColor: "{colors.accent-mint}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.2xl}"
|
||||
button-secondary-white:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.2xl}"
|
||||
button-ghost-on-dark:
|
||||
backgroundColor: "{colors.surface-dark-soft}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.sm}"
|
||||
button-outline:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "rgba(0, 0, 0, 0.08)"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.xs}"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.full}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "rgba(0, 0, 0, 0.08)"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
badge-neutral:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "rgba(0, 0, 0, 0.08)"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xxs} {spacing.sm}"
|
||||
badge-subtle-on-dark:
|
||||
backgroundColor: "{colors.surface-dark-soft}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xxs} {spacing.sm}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.canvas-dark}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-xxl}"
|
||||
padding: "{spacing.section} {spacing.3xl}"
|
||||
research-band-dark:
|
||||
backgroundColor: "{colors.canvas-dark}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.section} {spacing.3xl}"
|
||||
feature-tab-pill:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.2xl}"
|
||||
pricing-sub-tab:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xs}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
stats-card-tinted:
|
||||
backgroundColor: "{colors.accent-mint}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
research-card:
|
||||
backgroundColor: "{colors.canvas-dark}"
|
||||
textColor: "{colors.on-dark}"
|
||||
borderColor: "rgba(255, 255, 255, 0.12)"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
testimonial-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
article-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
code-editor-mockup:
|
||||
backgroundColor: "{colors.canvas-dark}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.mono-caption}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
data-table-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "rgba(0, 0, 0, 0.08)"
|
||||
typography: "{typography.body-md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
data-table-header:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.mono-caps-eyebrow}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
toggle-pill-group:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.mono-caps-button}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
padding: "{spacing.section} {spacing.3xl}"
|
||||
footer-wordmark-banner:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.display-xxl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Mirrors article-card chrome on canvas-soft surface with a hairline border."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "rgba(0, 0, 0, 0.08)"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured tier — polarity-flipped to canvas-dark with white text."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — repurposed for the brand's GPU / inference packaging tiers."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — line items per add-on (NOT a literal e-commerce cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.2xl}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Mirrors the brand's pricing-page table. Header uses mono-caps-eyebrow uppercase; body uses body-md."
|
||||
headerBackground: "{colors.hairline}"
|
||||
headerTypography: "{typography.mono-caps-eyebrow}"
|
||||
bodyTypography: "{typography.body-md}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Mirrors article-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as article-card; relies on tinted scrim instead of card shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame. Generous padding on canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.5xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — flat-cornered article-card chrome with a soft brand-tinted drop shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-md}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Together AI is an AI cloud-infrastructure platform — model inference, GPU clusters, fine-tuning, all the plumbing that makes "the AI native cloud" deliverable to a developer team — and the brand's web surface signals exactly that posture: a near-black hero on top, a long ribbon of white technical content in the middle, and a single recurring piece of brand chrome — a three-color orange-magenta-periwinkle gradient ribbon — that does the entire job of "we are not just another grey enterprise SaaS." There is no other illustration system. The gradient is the brand.
|
||||
|
||||
Type is the second decisive voice. Two faces carry every page: a custom geometric display sans (extracted as `The Future`) for headlines and body, set at weight 500 with tight, slightly-negative letter-spacing so 64-pixel hero type feels poured rather than typed; and an uppercase monospace eyebrow (`PP Neue Montreal Mono`) that labels every section, every button, and every cell header. Headlines are sentence-case; everything technical is uppercase mono. That contrast is the brand's tonal joke — the platform is serious enough to use a monospace label, modern enough to not put the headline in it.
|
||||
|
||||
Surfaces alternate aggressively: a `{colors.canvas-dark}` (`#010120`) band for hero / research / "Grounded in cutting-edge research" — followed by `{colors.canvas}` (white) for product, pricing, and testimonials, with `{colors.hairline}` reserved for table-header rows and toggle backgrounds. Pastel `{colors.accent-mint}` tinted stat tiles break up the white middle. Cards are universally lightly rounded (`{rounded.sm}` 4 px) with hairline borders — never floating with shadows.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Soft pastel gradients (pink, blue, lavender) against pure white canvas
|
||||
- Deep midnight blue (`#010120`) for dark/research sections — not gray-black
|
||||
- Custom "The Future" font with aggressive negative letter-spacing throughout
|
||||
- PP Neue Montreal Mono for uppercase technical labels
|
||||
- Sharp geometry (4px, 8px radius) — not rounded, not pill
|
||||
- Magenta (#ef2cc1) + orange (#fc4c02) brand accents in illustrations only
|
||||
- Lavender (#bdbbff) as a soft secondary accent
|
||||
- Enterprise stats prominently displayed (2x, 60%, 90%)
|
||||
- Dark-blue-tinted shadows (rgba(1, 1, 32, 0.1))
|
||||
- A single black `{colors.primary}` CTA pill carries every conversion target across pricing, footer, sign-in. The mint `{colors.accent-mint}` and white pill variants are reserved for hero contexts only.
|
||||
- A three-color brand gradient (`{colors.accent-orange}` → `{colors.accent-magenta}` → `{colors.accent-periwinkle}`) is the entire decorative system — used as the hero ribbon graphic and never reduced to a swatch elsewhere.
|
||||
- All-caps mono eyebrows and button labels in `{typography.mono-caps-eyebrow}` / `{typography.mono-caps-button}` everywhere — section titles, model row headers, "ON-DEMAND" labels in pricing tables.
|
||||
- Lightly rounded card chrome at `{rounded.sm}` 4 px; one off `{rounded.xs}` 3.25 px appears inside pricing-tab pills as a tighter system; `{rounded.full}` only for the floating chat-launcher orb.
|
||||
- Dual surface mode — alternating `{colors.canvas-dark}` and `{colors.canvas}` bands; no in-between greys. The single soft surface `{colors.hairline}` exists only to mark table-header rows.
|
||||
- A massive `together.ai` wordmark banner at the very bottom of every page, set in `{typography.display-xxl}` and tinted nearly-into-the-canvas (`{colors.hairline}`), as a "we are here" sign-off that doubles as a footer separator.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Brand Magenta** (`#ef2cc1`): The primary brand accent — a vivid pink-magenta used in gradient illustrations and the highest-signal brand moments. Never used as UI chrome.
|
||||
- **Brand Orange** (`#fc4c02`): The secondary brand accent — a vivid orange for gradient endpoints and warm accent moments.
|
||||
- **Dark Blue** (`#010120`): The primary dark surface — a deep midnight blue-black used for research sections, footer, and dark containers. Not gray, not black — distinctly blue.
|
||||
### Brand & Accent
|
||||
- **Ink Black** (`{colors.primary}` — `#000000`): The single primary CTA color. Black pill carries "Sign in", "Contact sales", "Get started now", every footer CTA.
|
||||
- **Brand Orange** (`{colors.accent-orange}` — `#fc4c02`): One leg of the three-color brand gradient. Appears in the hero ribbon graphic; never used as a UI fill on its own.
|
||||
- **Brand Magenta** (`{colors.accent-magenta}` — `#ef2cc1`): The second leg of the gradient.
|
||||
- **Brand Periwinkle** (`{colors.accent-periwinkle}` — `#bdbbff`): The third leg of the gradient; also used as a soft fill for some stat tiles.
|
||||
- **Brand Mint** (`{colors.accent-mint}` — `#c8f6f9`): A pastel cyan that lives outside the gradient — used for hero secondary-CTA pills and `stats-card-tinted` tiles.
|
||||
|
||||
### Secondary & Accent
|
||||
- **Soft Lavender** (`#bdbbff`): A gentle blue-violet used for subtle accents, secondary indicators, and soft UI highlights.
|
||||
- **Black 40** (`#00000066`): Semi-transparent black for de-emphasized overlays and secondary text.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The default product / pricing / docs background.
|
||||
- **Hairline / Canvas Soft** (`{colors.hairline}` — `#ebebeb`): The brand's single soft surface tone — used for data-table header rows, toggle-pill rails, and 1 px dividers between table rows.
|
||||
- **Canvas Dark** (`{colors.canvas-dark}` — `#010120`): The brand's dark hero surface; appears on `hero-band-dark` and `research-band-dark`.
|
||||
- **Hairline** (`{colors.hairline}` — `#ebebeb`): 1 px dividers on light surfaces — table rows, card chrome, badge borders.
|
||||
- **Hairline on Dark** (`{colors.surface-dark-soft}` — `#26263a`): 1 px dividers and badge backgrounds on `{colors.canvas-dark}` surfaces; pre-blended from the brand's translucent-white-on-dark hairline.
|
||||
- **Surface Dark Soft** (`{colors.surface-dark-soft}` — `#313641`): A slightly lighter dark fill used inside dark-band cards.
|
||||
|
||||
### Surface & Background
|
||||
- **Pure White** (`#ffffff`): The primary light-section page background.
|
||||
- **Dark Blue** (`#010120`): Dark-section backgrounds — research, footer, technical content.
|
||||
- **Glass Light** (`rgba(255, 255, 255, 0.12)`): Frosted glass button backgrounds on dark sections.
|
||||
- **Glass Dark** (`rgba(0, 0, 0, 0.08)`): Subtle tinted surfaces on light sections.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#000000`): Every heading and body paragraph on light surfaces.
|
||||
- **Body** (`{colors.body}` — `#999999`): Secondary text — captions, table cell secondary values, footer link text. Pre-blended from the brand's translucent-black 40 % body color.
|
||||
- **Body Muted** (`{colors.body}` — `#999999`): The all-caps mono-eyebrow text color on light surfaces also rides on this token — there is no separate "mute" tone, the brand keeps secondary text consistent with caption text.
|
||||
- **On Dark** (`{colors.on-dark}` — `#ffffff`): All text on `{colors.canvas-dark}` surfaces.
|
||||
|
||||
### Neutrals & Text
|
||||
- **Pure Black** (`#000000`): Primary text on light surfaces.
|
||||
- **Pure White** (`#ffffff`): Primary text on dark surfaces.
|
||||
- **Black 8%** (`rgba(0, 0, 0, 0.08)`): Borders and subtle containment on light surfaces.
|
||||
- **White 12%** (`rgba(255, 255, 255, 0.12)`): Borders and containment on dark surfaces.
|
||||
### Semantic
|
||||
The brand does not maintain a separate error / success palette in its public surface; validation cues use the primary black or the brand gradient depending on context. No explicit error red, success green, or warning yellow is documented here — adopting framework defaults is appropriate.
|
||||
|
||||
### Gradient System
|
||||
- **Pastel Cloud Gradient**: Soft pink → lavender → soft blue gradients in hero illustrations. These appear in abstract, painterly forms — clouds, feathers, flowing shapes — that create visual warmth without literal meaning.
|
||||
- **Hero Gradient**: The hero background uses soft pastel tints layered over white, creating a dawn-like atmospheric effect.
|
||||
### Brand Gradient
|
||||
The brand's signature decoration is a three-stop gradient drawn from `{colors.accent-orange}` → `{colors.accent-magenta}` → `{colors.accent-periwinkle}`, applied as the only piece of decorative chrome (the hero ribbon graphic). Treat the gradient as one unified object — do not crop it down to a single colour, do not reorder the stops, and do not add a fourth stop. Used at large scale; never miniaturised to icon size.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Primary**: `The Future`, with fallback: `Arial`
|
||||
- **Monospace / Labels**: `PP Neue Montreal Mono`, with fallback: `Georgia`
|
||||
Two families carry the entire system:
|
||||
|
||||
1. **A custom geometric display sans** (extracted as `The Future`) for every headline, lead paragraph, body, button label that is not uppercase, and inline link. Weights 400 and 500 are the working pair; the face never appears in bold (700) or heavier. Tight negative letter-spacing (`-1.92 px` at 64 px display, `-0.16 px` at 16 px body) gives the face its slightly-condensed, poured-on-the-page feel.
|
||||
2. **An uppercase mono caption face** (extracted as `PP Neue Montreal Mono`) for every eyebrow, button label, table-header cell, and pricing-table tab. Weight 500 at 11–16 px; always uppercase; positive letter-spacing (`0.05 – 0.55 px`). The mono carries the brand's technical voice — every label that says "PRICING", "INFERENCE", "MODEL", "GPU", "GA-DEC '25" is set in this face.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display / Hero | The Future | 64px (4rem) | 400–500 | 1.00–1.10 (tight) | -1.92px | Maximum impact, dense blocks |
|
||||
| Section Heading | The Future | 40px (2.5rem) | 500 | 1.20 (tight) | -0.8px | Feature section titles |
|
||||
| Sub-heading | The Future | 28px (1.75rem) | 500 | 1.15 (tight) | -0.42px | Card headings |
|
||||
| Feature Title | The Future | 22px (1.38rem) | 500 | 1.15 (tight) | -0.22px | Small feature headings |
|
||||
| Body Large | The Future | 18px (1.13rem) | 400–500 | 1.30 (tight) | -0.18px | Descriptions, sections |
|
||||
| Body / Button | The Future | 16px (1rem) | 400–500 | 1.25–1.30 | -0.16px | Standard body, nav, buttons |
|
||||
| Caption | The Future | 14px (0.88rem) | 400–500 | 1.40 | normal | Metadata, descriptions |
|
||||
| Mono Label | PP Neue Montreal Mono | 16px (1rem) | 500 | 1.00 (tight) | 0.08px | Uppercase section labels |
|
||||
| Mono Small | PP Neue Montreal Mono | 11px (0.69rem) | 500 | 1.00–1.40 | 0.055–0.08px | Small uppercase tags |
|
||||
| Mono Micro | PP Neue Montreal Mono | 10px (0.63rem) | 400 | 1.40 | 0.05px | Smallest uppercase labels |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xxl}` | 64px | 500 | 70.4px | -1.92px | Hero headline ("Build what's next on the AI Native Cloud"). |
|
||||
| `{typography.display-xl}` | 40px | 500 | 48px | -0.8px | Section headlines ("The Together AI Platform", "Start building on Together AI"). |
|
||||
| `{typography.display-lg}` | 28px | 500 | 32.2px | -0.42px | Sub-section headlines and stat-tile big numbers. |
|
||||
| `{typography.display-md}` | 22px | 500 | 25.3px | -0.22px | Card titles, research-card headings. |
|
||||
| `{typography.body-lg}` | 18px | 400 | 23.4px | -0.18px | Lead paragraphs under section headlines. |
|
||||
| `{typography.body-lg-strong}` | 18px | 500 | 23.4px | -0.18px | Emphasis runs inside lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 20.8px | -0.16px | Default body paragraph. |
|
||||
| `{typography.body-md-strong}` | 16px | 500 | 20.8px | -0.16px | Bolded inline body. |
|
||||
| `{typography.caption}` | 14px | 400 | 19.6px | 0 | Fine print, footer secondary text. |
|
||||
| `{typography.caption-strong}` | 14px | 500 | 19.6px | 0 | Bolded captions. |
|
||||
| `{typography.mono-caps-button}` | 16px | 500 | 16px | 0.08px | Primary button labels — uppercase, mono. |
|
||||
| `{typography.mono-caps-eyebrow}` | 11px | 500 | 11px | 0.55px | Section eyebrows, table-header cell labels. |
|
||||
| `{typography.mono-caps-label}` | 11px | 500 | 15.4px | 0.055px | Inline tag labels inside text contexts. |
|
||||
| `{typography.mono-caption}` | 10px | 400 | 14px | 0.05px | Mono fine print (inside code editor mockup). |
|
||||
|
||||
### Principles
|
||||
- **Negative tracking everywhere**: Every size of "The Future" uses negative letter-spacing (-0.16px to -1.92px), creating consistently tight, modern text.
|
||||
- **Mono for structure**: PP Neue Montreal Mono in uppercase with positive letter-spacing creates technical "label" moments that structure the page without competing with display text.
|
||||
- **Weight 500 as emphasis**: The system uses 400 (regular) and 500 (medium) — no bold. Medium weight marks headings and emphasis.
|
||||
- **Tight line-heights throughout**: Even body text uses 1.25–1.30 line-height — tighter than typical, creating a dense, information-rich feel.
|
||||
- **Two-face contrast is the voice.** Display sans for narrative; uppercase mono for technical labels. Never let the mono carry a paragraph; never let the display sans carry a button label.
|
||||
- **Negative letter-spacing only on the display sans.** The mono face uses small positive tracking; reversing this is wrong.
|
||||
- **Headlines stay sentence-case.** Every uppercase moment belongs to the mono face. Mixing all-caps display would muddy the contrast.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
The two primary faces are proprietary. Open-source substitutes:
|
||||
- **Display sans** — *Inter* (400 / 500) with `font-feature-settings: "ss01"` enabled comes closest; tighten letter-spacing by ~0.6 % at display sizes to land on the brand's compressed feel. *Geist* is the second-best option but reads slightly wider.
|
||||
- **Uppercase mono eyebrow** — *JetBrains Mono* or *Geist Mono* (weight 500) at 11 px with `text-transform: uppercase` matches the brand's voice once tracking is bumped to `0.04em`.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px. Almost every captured value is a multiple of 4, with two exceptions (7.2 px, 55.2 px) that are gap-multiplier derivatives, not layout decisions.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px · `{spacing.4xl}` 44 px · `{spacing.5xl}` 48 px · `{spacing.6xl}` 55.2 px · `{spacing.section}` 80 px.
|
||||
- **Section padding**: marketing bands use `{spacing.section}` 80 px top/bottom on desktop. The hero and the "research" dark band keep the 80 px rhythm; pricing tables tighten to `{spacing.5xl}` to keep dense data legible.
|
||||
- **Card interior padding**: research cards and testimonial cards sit at `{spacing.2xl}` 24 px interior; the stat-card tiles use `{spacing.3xl}` 32 px to give the big number breathing room.
|
||||
- **Inline gap**: button + nav rows use `{spacing.md}` 12 px between siblings; chip groups use `{spacing.sm}` 8 px.
|
||||
|
||||
### Grid & Container
|
||||
- **Max width**: ~1280 px desktop container; nothing rendered above that. Content centres with horizontal gutters of `{spacing.3xl}` 32 px on desktop, `{spacing.lg}` 16 px on mobile.
|
||||
- **Column patterns**:
|
||||
- Research / testimonial grids: 3-up at desktop, 1-up at mobile.
|
||||
- Stats tile grid: 3-up at desktop, 1-up at mobile.
|
||||
- Article-card grid: 2-up at desktop, 1-up at mobile.
|
||||
- Pricing data table: full-width, model rows stack on mobile.
|
||||
- Hero: 50 / 50 split (headline left, ribbon graphic right) at desktop; stacked at mobile with graphic above.
|
||||
|
||||
### Whitespace Philosophy
|
||||
Surface contrast does most of the separation. A dark band ends → 80 px of breathing room → next light band begins. Inside a band, headline and lead paragraph hug close (`{spacing.lg}` 16 px between them), then a wider gap before the supporting visual or CTA cluster. Inside pricing data tables, the brand keeps rows tight (`{spacing.md}` 12 px vertical) — the table reads more like a sheet than a marketing component.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 479px | Hero stacks; nav collapses to hamburger; all multi-col grids drop to 1-up. |
|
||||
| Mobile-Large | 479–767px | Same as Mobile; some tables enable horizontal scroll. |
|
||||
| Tablet | 768–991px | Article grid moves to 2-up; testimonial grid stays 3-up only if container > 900 px, otherwise 1-up. |
|
||||
| Desktop | 992–1279px | Full 3-up research grid, 2-up article grid, hero 50/50 split. |
|
||||
| Desktop-Large | ≥ 1280px | Container caps at 1280 px; bands stay edge-to-edge in colour while content centres. |
|
||||
|
||||
#### Touch Targets
|
||||
The mono-cap button label is set at 16 px; combined with `{spacing.xs}` 4 px top / bottom and a 24 px horizontal padding, the primary pill renders at roughly 32 px tall. On mobile viewports, button height is inflated to ≥ 44 px through extra vertical padding inside the touch row — meeting WCAG AAA. The circular icon button (`button-icon-circular`) renders at 44 × 44 px minimum at all viewports.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- **Nav**: full link row + black "Sign in" pill + "Get started" pill at desktop. Collapses to logo + hamburger at mobile; the menu opens as a full-overlay drawer with the same link list stacked vertically.
|
||||
- **Hero**: at desktop, headline left + gradient ribbon right (50 / 50). At mobile, headline stacks above a smaller-scale ribbon — never below.
|
||||
- **Research band**: 4-up grid at desktop drops to 2-up at tablet, 1-up at mobile. Card chrome stays identical.
|
||||
- **Pricing data table**: at desktop, full-width with all columns visible. At tablet, sub-tab row enables horizontal scroll. At mobile, cell rows stack model-name above price block.
|
||||
- **Footer wordmark banner**: scales fluidly — the giant `together.ai` wordmark stays edge-to-edge regardless of viewport.
|
||||
|
||||
#### Image Behavior
|
||||
- **Hero ribbon graphic**: rendered as an SVG, scales fluidly with the hero container; never crops, never repositions.
|
||||
- **Testimonial portraits**: square or 4:5 portrait, hard-cropped at top; consistent square framing across the grid.
|
||||
- **Article thumbnails**: 16:9 landscape, fills card top with `{rounded.sm}` corners on the image only.
|
||||
- **Logo bar**: customer logos rendered as grayscale SVGs in a wrapping flex row.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Most cards on light surfaces lean on hairline borders, not shadow. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` on `{colors.canvas}` cards. | Testimonial cards, article cards, data-table rows. |
|
||||
| Level 2 — Hairline on Dark | 1 px solid `{colors.surface-dark-soft}` on `{colors.canvas-dark}` cards. | Research-band cards, on-dark badges. |
|
||||
| Level 3 — Soft Drop | `rgba(1, 1, 32, 0.1) 0px 4px 10px 0px` — a barely-perceptible shadow tinted with the brand's dark-navy. | Floating elements (the chat-launcher orb, sticky-bottom nav row when one appears). |
|
||||
|
||||
### Decorative Depth
|
||||
- **Gradient ribbon as depth**: the hero's three-stop gradient ribbon is the page's only true atmospheric effect. It loops through layered translucent shapes that imply depth without leaving the brand palette.
|
||||
- **Code editor mockup as section-depth break**: a dark code-editor surface inside the otherwise-white product band acts as a one-step lift, mirroring the hero's polarity flip.
|
||||
- **Wordmark banner as terminal depth**: the giant `together.ai` letters at the bottom are technically inside `{colors.canvas}` but tinted toward `{colors.hairline}` so they read as a faint stencil, giving the page a final "you have arrived" sign-off.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Hero / research full-bleed bands; the footer wordmark banner. |
|
||||
| `{rounded.xs}` | 3.25px | The pricing page's slightly tighter sub-tab and outline button. |
|
||||
| `{rounded.sm}` | 4px | The brand's canonical radius — buttons, badges, cards, data-table rows, stat tiles. |
|
||||
| `{rounded.md}` | 8px | Feature-tab pills inside the "Full-stack cloud" section, larger pricing-tab containers. |
|
||||
| `{rounded.full}` | 9999px | The floating chat-launcher orb (`button-icon-circular`). The only fully-pill shape in the system. |
|
||||
|
||||
### Photography Geometry
|
||||
- **Hero ribbon**: SVG gradient, free-form; no aspect-ratio constraint.
|
||||
- **Customer logos**: vector, rendered grayscale at consistent height (~24 px) in a wrapping flex row.
|
||||
- **Testimonial portraits**: 1:1 square crop with hard-edge corners — no avatar pill.
|
||||
- **Article thumbnails**: 16:9 with `{rounded.sm}` 4 px top-corner radius on the image only; card chrome stays square.
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Glass on Dark**
|
||||
- Background: `rgba(255, 255, 255, 0.12)` (frosted glass)
|
||||
- Text: Pure White (`#ffffff`)
|
||||
- Radius: sharp (4px)
|
||||
- Opacity: 0.5
|
||||
- Hover: transparent dark overlay
|
||||
- Used on dark sections — subtle, glass-like
|
||||
**`button-primary`** — the black pill that carries every primary CTA.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.mono-caps-button}` (uppercase mono, 16 px / 500 / 0.08 px tracking), shape `{rounded.sm}` 4 px, padding `{spacing.xs} {spacing.2xl}`. No shadow.
|
||||
|
||||
**Dark Solid**
|
||||
- Background: Dark Blue (`#010120`) or Pure Black
|
||||
- Text: Pure White
|
||||
- Radius: sharp (4px)
|
||||
- The primary CTA on light surfaces
|
||||
**`button-secondary-mint`** — the hero secondary CTA pill.
|
||||
- Background `{colors.accent-mint}`, text `{colors.ink}`, same typography and shape as `button-primary`. Only appears in hero contexts.
|
||||
|
||||
**Outlined Light**
|
||||
- Border: `1px solid rgba(0, 0, 0, 0.08)`
|
||||
- Background: transparent or subtle glass
|
||||
- Text: Pure Black
|
||||
- Radius: sharp (4px)
|
||||
- Secondary actions on light surfaces
|
||||
**`button-secondary-white`** — the white pill paired with `button-secondary-mint` inside the hero.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same typography and shape. Always sits adjacent to the mint or primary button.
|
||||
|
||||
**`button-ghost-on-dark`** — the translucent button used on dark hero / research surfaces.
|
||||
- Background `{colors.surface-dark-soft}`, text `{colors.on-dark}`, shape `{rounded.sm}` 4 px. Used for "Read more" / "Watch the announcement" affordances on dark bands.
|
||||
|
||||
**`button-outline`** — the white-on-white outline button used inside pricing pages and feature toggles.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, shape `{rounded.xs}` 3.25 px.
|
||||
|
||||
**`button-icon-circular`** — the floating chat-launcher orb in the bottom-right of every page.
|
||||
- Background `{colors.primary}`, white icon, shape `{rounded.full}`. The only fully-pill shape in the system.
|
||||
|
||||
### Cards & Containers
|
||||
- Background: Pure White or subtle glass tint
|
||||
- Border: `1px solid rgba(0, 0, 0, 0.08)` on light; `1px solid rgba(255, 255, 255, 0.12)` on dark
|
||||
- Radius: sharp (4px) for badges and small elements; comfortable (8px) for larger containers
|
||||
- Shadow: dark-blue-tinted (`rgba(1, 1, 32, 0.1) 0px 4px 10px`) — warm and subtle
|
||||
- Stats cards with large numbers prominently displayed
|
||||
|
||||
### Badges / Tags
|
||||
- Background: `rgba(0, 0, 0, 0.04)` (light) or `rgba(255, 255, 255, 0.12)` (dark)
|
||||
- Text: Black (light) or White (dark)
|
||||
- Padding: 2px 8px (compact)
|
||||
- Radius: sharp (4px)
|
||||
- Border: `1px solid rgba(0, 0, 0, 0.08)`
|
||||
- PP Neue Montreal Mono, uppercase, 16px
|
||||
**`research-card`** — the 4-up grid card on the dark "Grounded in cutting-edge research" band.
|
||||
- Background `{colors.canvas-dark}`, text `{colors.on-dark}`, 1 px solid `{colors.surface-dark-soft}` border, padding `{spacing.2xl}`, shape `{rounded.sm}` 4 px. Inside: mono eyebrow tag + display headline + body paragraph.
|
||||
|
||||
**`testimonial-card`** — the 3-up "AI natives build on Together AI" card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.2xl}`, shape `{rounded.sm}` 4 px. Inside: 1:1 portrait crop + display-md name + body quote + mono caption stat row.
|
||||
|
||||
**`article-card`** — the 2-up "What's new at Together AI" article card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.2xl}`, shape `{rounded.sm}` 4 px. Inside: 16:9 image at top + mono eyebrow tag + display-md title + body summary + mono caption byline.
|
||||
|
||||
**`code-editor-mockup`** — the dark code-preview surface inside the product band.
|
||||
- Background `{colors.canvas-dark}`, text `{colors.on-dark}`, body in `{typography.mono-caption}`, padding `{spacing.2xl}`, shape `{rounded.sm}` 4 px. Window chrome stays minimal — no traffic-light dots, no title bar.
|
||||
|
||||
**`stats-card-tinted`** — the pastel-tinted stat tile (mint, peach, periwinkle) on the white middle band.
|
||||
- Background `{colors.accent-mint}` (or sibling accent tints), text `{colors.ink}`, big number in `{typography.display-xl}` + label in `{typography.mono-caps-eyebrow}`, padding `{spacing.3xl}`, shape `{rounded.sm}` 4 px.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the form input on the startup-accelerator application form.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, body set in `{typography.body-md}`, shape `{rounded.sm}` 4 px.
|
||||
|
||||
### Navigation
|
||||
- Clean horizontal nav on white/transparent
|
||||
- Logo: Together AI wordmark
|
||||
- Links: The Future at 16px, weight 400
|
||||
- CTA: Dark solid button
|
||||
- Hover: no text-decoration
|
||||
|
||||
### Image Treatment
|
||||
- Abstract pastel gradient illustrations (cloud/feather forms)
|
||||
- Product UI screenshots on dark/light surfaces
|
||||
- Team photos in editorial style
|
||||
- Research paper cards with dark backgrounds
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas-dark}` on the hero band, switches to `{colors.canvas}` once the user scrolls past the hero. Text `{colors.on-dark}` on dark, `{colors.ink}` on white. Layout: logo left, link row centre, "Contact sales" + "Sign in" right.
|
||||
|
||||
### Distinctive Components
|
||||
**`nav-link`** — the centred link row inside `nav-bar`.
|
||||
- Text `{colors.on-dark}` (or `{colors.ink}` after scroll), set in `{typography.body-md}` 400 weight. Links separate with `{spacing.2xl}` 24 px between siblings.
|
||||
|
||||
**Stats Bar**
|
||||
- Large performance metrics (2x, 60%, 90%)
|
||||
- Bold display numbers
|
||||
- Short descriptive captions beneath
|
||||
- Clean horizontal layout
|
||||
**`footer`** — the bottom 4-column nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.section} {spacing.3xl}`. Eyebrow labels in `{typography.mono-caps-eyebrow}`; link rows in `{typography.body-md}`.
|
||||
|
||||
**Mono Section Labels**
|
||||
- PP Neue Montreal Mono, uppercase, 11px, letter-spacing 0.055px
|
||||
- Used as navigational signposts throughout the page
|
||||
- Technical, structured feel
|
||||
### Signature Components
|
||||
|
||||
**Research Section**
|
||||
- Dark Blue (#010120) background
|
||||
- White text, research paper thumbnails
|
||||
- Creates a distinct "academic" zone
|
||||
**`hero-band-dark`** — the dark navy hero that opens every product / marketing page.
|
||||
- Background `{colors.canvas-dark}`, text `{colors.on-dark}`, padding `{spacing.section} {spacing.3xl}`. Headline in `{typography.display-xxl}` (sentence case, never all-caps). Eyebrow in `{typography.mono-caps-eyebrow}`. Two-column layout: headline + CTA cluster on left, gradient ribbon SVG on right.
|
||||
|
||||
**Large Footer Logo**
|
||||
- "together" wordmark rendered at massive scale in the dark footer
|
||||
- Creates a brand-statement closing moment
|
||||
**`research-band-dark`** — the dark navy band that hosts the "Grounded in cutting-edge research" 4-up card grid.
|
||||
- Background `{colors.canvas-dark}`, text `{colors.on-dark}`, padding `{spacing.section} {spacing.3xl}`. Section headline in `{typography.display-xl}` followed by the `research-card` grid.
|
||||
|
||||
## 5. Layout Principles
|
||||
**`feature-tab-pill`** — the tab pill row inside the "Full-stack cloud" section.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, label in `{typography.body-md-strong}`, padding `{spacing.md} {spacing.2xl}`, shape `{rounded.md}` 8 px. Tab group sits on `{colors.hairline}` rail.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 1px, 2px, 4px, 8px, 10px, 12px, 16px, 20px, 24px, 32px, 44px, 48px, 80px, 100px, 120px
|
||||
- Button/badge padding: 2px 8px (compact)
|
||||
- Card internal padding: approximately 24–32px
|
||||
- Section vertical spacing: generous (80–120px)
|
||||
**`pricing-sub-tab`** — the secondary tab row inside the pricing-page model table (TEXT / VISION / IMAGE / AUDIO / VIDEO).
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, label in `{typography.body-md}`, padding `{spacing.sm} {spacing.lg}`, shape `{rounded.xs}` 3.25 px.
|
||||
|
||||
### Grid & Container
|
||||
- Max container width: approximately 1200px, centered
|
||||
- Hero: centered with pastel gradient background
|
||||
- Feature sections: multi-column card grids
|
||||
- Stats: horizontal row of metric cards
|
||||
- Research: dark full-width section
|
||||
**`data-table-row`** — the model row inside the pricing serverless-inference table.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` bottom border, padding `{spacing.md} {spacing.lg}`. Inside: model icon + model name (display sans) + input cost cell + output cost cell.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Optimistic breathing room**: Generous spacing between sections creates an open, inviting feel that makes enterprise AI infrastructure feel accessible.
|
||||
- **Dual atmosphere**: Light sections breathe with whitespace; dark sections are denser with content.
|
||||
- **Stats as visual anchors**: Large numbers with small captions create natural focal points.
|
||||
**`data-table-header`** — the table header row.
|
||||
- Background `{colors.hairline}`, text `{colors.body}`, set in `{typography.mono-caps-eyebrow}` (uppercase mono), padding `{spacing.md} {spacing.lg}`.
|
||||
|
||||
### Border Radius Scale
|
||||
- Sharp (4px): Buttons, badges, tags, small interactive elements — the primary radius
|
||||
- Comfortable (8px): Larger containers, feature cards
|
||||
**`toggle-pill-group`** — the "Standard Pricing / Wholesale Pricing" segmented control above the fine-tuning table.
|
||||
- Background `{colors.hairline}` rail, individual pills `{colors.canvas}` (inactive) or `{colors.primary}` (active), label in `{typography.mono-caps-button}`, shape `{rounded.sm}` 4 px, rail padding `{spacing.xs}`.
|
||||
|
||||
*This is a deliberately restrained radius system — no pills, no generous rounding. The sharp geometry contrasts with the soft pastel gradients.*
|
||||
**`badge-neutral`** — the inline tag pill on light surfaces.
|
||||
- Background `{colors.hairline}`, text `{colors.ink}`, body in `{typography.body-md}`, 1 px solid `{colors.hairline}` border, padding `{spacing.xxs} {spacing.sm}`, shape `{rounded.sm}` 4 px.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
**`badge-subtle-on-dark`** — the inline tag pill on dark hero / research surfaces.
|
||||
- Background `{colors.surface-dark-soft}`, text `{colors.on-dark}`, body in `{typography.body-md}`, padding `{spacing.xxs} {spacing.sm}`, shape `{rounded.sm}` 4 px.
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow, no border | Page background, text blocks |
|
||||
| Contained (Level 1) | `1px solid rgba(0,0,0,0.08)` (light) or `rgba(255,255,255,0.12)` (dark) | Cards, badges, containers |
|
||||
| Elevated (Level 2) | `rgba(1, 1, 32, 0.1) 0px 4px 10px` | Feature cards, hover states |
|
||||
| Dark Zone (Level 3) | Dark Blue (#010120) full-width background | Research, footer, technical sections |
|
||||
**`footer-wordmark-banner`** — the massive `together.ai` wordmark at the bottom of every page.
|
||||
- Background `{colors.canvas}`, wordmark colour `{colors.hairline}` (faint stencil tint), set in `{typography.display-xxl}` scaled fluidly to the viewport width. Edge-to-edge, square corners. Acts as the final page sign-off.
|
||||
|
||||
**Shadow Philosophy**: Together AI uses a single, distinctive shadow — tinted with Dark Blue (`rgba(1, 1, 32, 0.1)`) rather than generic black. This gives elevated elements a subtle blue-ish cast that ties them to the brand's midnight-blue dark mode. The shadow is soft (10px blur, 4px offset) and always downward — creating gentle paper-hover elevation.
|
||||
### Examples (illustrative)
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use pastel gradients (pink/blue/lavender) for hero illustrations and decorative backgrounds
|
||||
- Use Dark Blue (#010120) for dark sections — never generic gray-black
|
||||
- Apply negative letter-spacing on all "The Future" text (scaled by size)
|
||||
- Use PP Neue Montreal Mono in uppercase for section labels and technical markers
|
||||
- Keep border-radius sharp (4px) for badges and interactive elements
|
||||
- Use the dark-blue-tinted shadow for elevation
|
||||
- Maintain the light/dark section duality — business (light) vs research (dark)
|
||||
- Show enterprise stats prominently with large display numbers
|
||||
- Reserve `{colors.primary}` (`#000000`) for every primary CTA. One black pill per visible viewport — that consistency is the brand's whole conversion story.
|
||||
- Set every section eyebrow and button label in `{typography.mono-caps-button}` / `{typography.mono-caps-eyebrow}` — uppercase mono, positive tracking.
|
||||
- Pair the brand gradient (`{colors.accent-orange}` → `{colors.accent-magenta}` → `{colors.accent-periwinkle}`) at hero scale only. The gradient is the brand chrome; never shrink to icon size.
|
||||
- Cycle page surfaces in the `{colors.canvas-dark}` → `{colors.canvas}` → `{colors.canvas-dark}` rhythm; the dark-light contrast carries elevation more than any shadow.
|
||||
- Use `{rounded.sm}` 4 px as the canonical card / button radius across the system; reserve `{rounded.full}` for the single floating chat-launcher orb.
|
||||
- Render the giant `together.ai` wordmark banner at the bottom of every long page in `{typography.display-xxl}`, tinted toward `{colors.hairline}` so it reads as a stencil — not as a heavy footer title.
|
||||
|
||||
### Don't
|
||||
- Don't use Brand Magenta (#ef2cc1) or Brand Orange (#fc4c02) as UI colors — they're for illustrations only
|
||||
- Don't use pill-shaped or generously rounded corners — the geometry is sharp
|
||||
- Don't use generic gray-black for dark sections — always Dark Blue (#010120)
|
||||
- Don't use positive letter-spacing on "The Future" — it's always negative
|
||||
- Don't use bold (700+) weight — 400–500 is the full range
|
||||
- Don't use warm-toned shadows — always dark-blue-tinted
|
||||
- Don't reduce section spacing below 48px — the open feeling is core
|
||||
- Don't mix in additional typefaces — "The Future" + PP Neue Montreal Mono is the pair
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | <479px | Compact layout, stacked everything |
|
||||
| Large Mobile | 479–767px | Single column, hamburger nav |
|
||||
| Tablet | 768–991px | 2-column grids begin |
|
||||
| Desktop | 992px+ | Full multi-column layout |
|
||||
|
||||
### Touch Targets
|
||||
- Buttons with adequate padding
|
||||
- Card surfaces as touch targets
|
||||
- Navigation links at comfortable 16px
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Collapses to hamburger on mobile
|
||||
- **Hero text**: 64px → 40px → 28px progressive scaling
|
||||
- **Stats bar**: Horizontal → stacked vertical
|
||||
- **Feature grids**: Multi-column → single column
|
||||
- **Research section**: Cards stack vertically
|
||||
|
||||
### Image Behavior
|
||||
- Pastel illustrations scale proportionally
|
||||
- Product screenshots maintain aspect ratio
|
||||
- Team photos scale within containers
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary Text (light): "Pure Black (#000000)"
|
||||
- Primary Text (dark): "Pure White (#ffffff)"
|
||||
- Page Background: "Pure White (#ffffff)"
|
||||
- Dark Surface: "Dark Blue (#010120)"
|
||||
- Brand Accent 1: "Brand Magenta (#ef2cc1)"
|
||||
- Brand Accent 2: "Brand Orange (#fc4c02)"
|
||||
- Soft Accent: "Soft Lavender (#bdbbff)"
|
||||
- Border (light): "rgba(0, 0, 0, 0.08)"
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on white with soft pastel gradients (pink → lavender → blue) as background. Headline at 64px 'The Future' weight 500, line-height 1.10, letter-spacing -1.92px. Pure Black text. Include a dark blue CTA button (#010120, 4px radius)."
|
||||
- "Design a stats card: large display number (64px, weight 500) with a small caption below (14px). White background, 8px radius, dark-blue-tinted shadow (rgba(1, 1, 32, 0.1) 0px 4px 10px)."
|
||||
- "Build a section label: PP Neue Montreal Mono, 11px, weight 500, uppercase, letter-spacing 0.055px. Black text on light, white on dark."
|
||||
- "Create a dark research section: Dark Blue (#010120) background. White text, section heading at 40px 'The Future' weight 500, letter-spacing -0.8px. Cards with rgba(255, 255, 255, 0.12) border."
|
||||
- "Design a badge: 4px radius, rgba(0, 0, 0, 0.04) background, 1px solid rgba(0, 0, 0, 0.08) border, 'The Future' 16px text. Padding: 2px 8px."
|
||||
|
||||
### Iteration Guide
|
||||
1. Always specify negative letter-spacing for "The Future" — it's scaled by size
|
||||
2. Dark sections use #010120 (midnight blue), never generic black
|
||||
3. Shadows are always dark-blue-tinted: rgba(1, 1, 32, 0.1)
|
||||
4. Mono labels are always uppercase with positive letter-spacing
|
||||
5. Keep radius sharp (4px or 8px) — no pills, no generous rounding
|
||||
6. Pastel gradients are for decoration, not UI chrome
|
||||
- Don't introduce a fifth accent colour. The three-stop gradient + mint pill is the entire decorative palette; new accents flatten the brand.
|
||||
- Don't set body paragraphs in the mono face. The mono is for labels only; long-form mono reads as a console log, not as marketing copy.
|
||||
- Don't centre-align body paragraphs under a left-aligned display headline. The brand keeps text-block alignment consistent within a copy stack.
|
||||
- Don't drop a soft drop-shadow on light-surface cards. The brand uses hairlines and surface contrast for elevation; soft shadows belong only on the floating chat-launcher orb.
|
||||
- Don't reduce the brand gradient to a single-colour fill, reorder its stops, or add a fourth stop. The gradient is a fixed object.
|
||||
- Don't switch the primary button shape to a full pill `{rounded.full}`. The brand's CTA shape is a slightly-rounded rectangle, never a full pill.
|
||||
- Don't set headlines in the all-caps mono. Every all-caps moment belongs to the mono face; every headline belongs to the display sans in sentence case.
|
||||
|
||||
@ -1,295 +1,636 @@
|
||||
# Design System Inspired by Uber
|
||||
---
|
||||
version: alpha
|
||||
name: Uber Inspired
|
||||
description: An inspired interpretation of Uber's design language — a transportation-and-delivery super-app brand whose web surface is a black-and-white duet, framed by a custom geometric display sans, accented by a single signature pill shape (radius 999px) on every interactive element, and decorated only by editorial 4:3 illustrations of riders, drivers, and city objects.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#000000"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#000000"
|
||||
body: "#5e5e5e"
|
||||
mute: "#afafaf"
|
||||
hairline-mid: "#4b4b4b"
|
||||
canvas: "#ffffff"
|
||||
canvas-soft: "#efefef"
|
||||
canvas-softer: "#f3f3f3"
|
||||
surface-pressed: "#e2e2e2"
|
||||
link: "#0000ee"
|
||||
on-dark: "#ffffff"
|
||||
black-elevated: "#282828"
|
||||
|
||||
Uber's design language is a masterclass in confident minimalism -- a black-and-white universe where every pixel serves a purpose and nothing decorates without earning its place. The entire experience is built on a stark duality: jet black (`#000000`) and pure white (`#ffffff`), with virtually no mid-tone grays diluting the message. This isn't the sterile minimalism of a startup that hasn't finished designing -- it's the deliberate restraint of a brand so established it can afford to whisper.
|
||||
typography:
|
||||
display-xxl:
|
||||
fontFamily: UberMove, UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 52px
|
||||
fontWeight: 700
|
||||
lineHeight: 64px
|
||||
display-xl:
|
||||
fontFamily: UberMove, UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 36px
|
||||
fontWeight: 700
|
||||
lineHeight: 44px
|
||||
display-lg:
|
||||
fontFamily: UberMove, UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 700
|
||||
lineHeight: 40px
|
||||
display-md:
|
||||
fontFamily: UberMove, UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 700
|
||||
lineHeight: 32px
|
||||
display-sm:
|
||||
fontFamily: UberMove, UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 700
|
||||
lineHeight: 28px
|
||||
body-lg:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 500
|
||||
lineHeight: 24px
|
||||
body-md:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-md-strong:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
body-sm:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-sm-strong:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 16px
|
||||
caption:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
button-large:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 500
|
||||
lineHeight: 24px
|
||||
button-md:
|
||||
fontFamily: UberMoveText, system-ui, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
|
||||
The signature typeface, UberMove, is a proprietary geometric sans-serif with a distinctly square, engineered quality. Headlines in UberMove Bold at 52px carry the weight of a billboard -- authoritative, direct, unapologetic. The companion face UberMoveText handles body copy and buttons with a slightly softer, more readable character at medium weight (500). Together, they create a typographic system that feels like a transit map: clear, efficient, built for scanning at speed.
|
||||
rounded:
|
||||
none: 0px
|
||||
md: 8px
|
||||
lg: 12px
|
||||
xl: 16px
|
||||
pill: 999px
|
||||
pill-tab: 36px
|
||||
full: 9999px
|
||||
|
||||
What makes Uber's design truly distinctive is its use of full-bleed photography and illustration paired with pill-shaped interactive elements (999px border-radius). Navigation chips, CTA buttons, and category selectors all share this capsule shape, creating a tactile, thumb-friendly interface language that's unmistakably Uber. The illustrations -- warm, slightly stylized scenes of drivers, riders, and cityscapes -- inject humanity into what could otherwise be a cold, monochrome system. The site alternates between white content sections and a full-black footer, with card-based layouts using the gentlest possible shadows (rgba(0,0,0,0.12-0.16)) to create subtle lift without breaking the flat aesthetic.
|
||||
spacing:
|
||||
xxs: 4px
|
||||
xs: 6px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
padding: "{spacing.lg} {spacing.3xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.md} {spacing.md}"
|
||||
button-secondary:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.md} {spacing.md}"
|
||||
button-subtle:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
button-floating:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.md}"
|
||||
button-large-rounded:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-large}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.lg} {spacing.xl}"
|
||||
button-tab-translucent:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
rounded: "{rounded.pill-tab}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
text-input-on-soft:
|
||||
backgroundColor: "{colors.canvas-softer}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
card-elevated:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
card-soft-tinted:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
promo-card-illustrated:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
promo-card-on-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
request-form-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.lg}"
|
||||
request-form-input-row:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
category-button:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
faq-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
padding: "{spacing.lg} 0"
|
||||
app-download-pill:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
hero-band-light:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xxl}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-xxl}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
showcase-image-card:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-xxl}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.3xl}"
|
||||
link-blue:
|
||||
textColor: "{colors.link}"
|
||||
typography: "{typography.body-md}"
|
||||
link-on-dark:
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-md}"
|
||||
link-mute:
|
||||
textColor: "{colors.hairline-mid}"
|
||||
typography: "{typography.body-md}"
|
||||
link-mute-soft:
|
||||
textColor: "{colors.mute}"
|
||||
typography: "{typography.body-md}"
|
||||
icon-button-circular:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
rounded: "{rounded.full}"
|
||||
footer:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default tier card. Mirrors card-content chrome with canvas-soft surface and a faint border."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.surface-pressed}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured tier — polarity-flipped to ink with white text."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-product-selector:
|
||||
description: "Plan picker — re-purposed for the brand's Ride / Eats / Reserve tier picker. Uses category-button pills inside the frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — line items per add-on (NOT a literal e-commerce cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
item-divider: "{colors.surface-pressed}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses body-sm-strong 500 weight; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.body-sm-strong}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.surface-pressed}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Mirrors card-content chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as card-content with Level 2 drop shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame. Generous padding on canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — flat-cornered card-content chrome with Level 2 drop shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Uber is a transportation-and-delivery super-app — ride, eats, freight, the whole urban logistics layer — and the brand's web surface signals that scale through restraint: no third colour, no accent palette, no illustration that fights the headline. The page is structurally a black-and-white duet, where black `{colors.primary}` is the conversion anchor (every CTA pill, every nav login button, the footer fill) and `{colors.canvas}` white carries everything else. The only consistent decoration is a body of editorial 4:3 illustrations — riders, drivers, parking lots, cars-on-highway — that ground the marketing without leaking accent colour into the system.
|
||||
|
||||
Type is the second decisive voice. Two custom faces carry every page: `UberMove` at weight 700 for headlines (32 – 52 px display sizes with tight 1.22 – 1.25 line-height, never letter-spaced), and `UberMoveText` at weights 400 / 500 for body, button, and link. The pairing reads as engineering-grade — no italic, no decorative weight, no tracking flourish. Headlines are sentence-case; eyebrows are uppercase only when used as the section eyebrow ("WHY BECOME"); buttons are sentence-case.
|
||||
|
||||
The single shape signature is the pill. Every interactive element rounds to `{rounded.pill}` 999 px — primary CTA, secondary CTA, subtle gray pill, white floating pill, category chip, app-download badge. Cards and surfaces round to `{rounded.xl}` 16 px; the larger "Go Get 2026" annual-showcase card uses the same 16 px shape, just at scale. The tab-toggle on the hero ride-request form uses an off-shape `{rounded.pill-tab}` 36 px — barely-pill, deliberately tighter than the canonical 999 px pill.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Pure black-and-white foundation with virtually no mid-tone grays in the UI chrome
|
||||
- UberMove (headlines) + UberMoveText (body/UI) -- proprietary geometric sans-serif family
|
||||
- Pill-shaped everything: buttons, chips, nav items all use 999px border-radius
|
||||
- Warm, human illustrations contrasting the stark monochrome interface
|
||||
- Card-based layout with whisper-soft shadows (0.12-0.16 opacity)
|
||||
- 8px spacing grid with compact, information-dense layouts
|
||||
- Bold photography integrated as full-bleed hero backgrounds
|
||||
- Black footer anchoring the page with a dark, high-contrast environment
|
||||
- A two-colour CTA hierarchy: black `{colors.primary}` pill for primary conversion targets; white `{colors.canvas}` pill (sometimes with a soft drop shadow) for secondary; subtle gray `{colors.canvas-soft}` pill for tertiary or chip variants.
|
||||
- The pill is the single signature shape — `{rounded.pill}` 999 px on every interactive element except the tab-toggle (`{rounded.pill-tab}` 36 px) and the larger product cards (`{rounded.xl}` 16 px).
|
||||
- Every headline is sentence-case in `{typography.display-xl}` / `{typography.display-xxl}` weight 700; no all-caps display.
|
||||
- Editorial 4:3 illustrations of riders / drivers / cars are the only consistent decorative system; no gradients, no atmospheric backdrops, no shadows that aren't card-elevation hints.
|
||||
- A signature alternating-band rhythm: white feature card → black promo card (with white text and white CTA) → white feature card → black footer. The black bands are NOT hero-only; they appear mid-page as promo callouts.
|
||||
- A signature ride-request form card on the hero: pickup pin input + destination input + date/time chip + black "See prices" pill, all stacked inside a `{rounded.xl}` shadowed card.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Uber Black** (`#000000`): The defining brand color -- used for primary buttons, headlines, navigation text, and the footer. Not "near-black" or "off-black," but true, uncompromising black.
|
||||
- **Pure White** (`#ffffff`): The primary surface color and inverse text. Used for page backgrounds, card surfaces, and text on black elements.
|
||||
### Brand & Accent
|
||||
- **Ink Black** (`{colors.primary}` — `#000000`): The brand's only conversion colour. Every primary CTA pill, the footer fill, every dark promo band, every nav login button. The system has no secondary accent.
|
||||
- **Surface Pressed** (`{colors.surface-pressed}` — `#e2e2e2`): The pressed-state fill for white pills — a soft grey that's used only in active / pressed states.
|
||||
- **Black Elevated** (`{colors.black-elevated}` — `#282828`): A near-black used on hover for the translucent white tab-toggle pill. Documented as a system colour because it appears on a recurring brand control.
|
||||
|
||||
### Interactive & Button States
|
||||
- **Hover Gray** (`#e2e2e2`): White button hover state -- a clean, cool light gray that provides clear feedback without warmth.
|
||||
- **Hover Light** (`#f3f3f3`): Subtle hover for elevated white buttons -- barely-there gray for gentle interaction feedback.
|
||||
- **Chip Gray** (`#efefef`): Background for secondary/filter buttons and navigation chips -- a neutral, ultra-light gray.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The default page background.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#efefef`): The soft gray fill for category chips, form-input rows inside the ride-request card, and subtle pill buttons.
|
||||
- **Canvas Softer** (`{colors.canvas-softer}` — `#f3f3f3`): A slightly lighter gray used as a nested-input fill on white surfaces.
|
||||
|
||||
### Text & Content
|
||||
- **Body Gray** (`#4b4b4b`): Secondary text and footer links -- a true mid-gray with no warm or cool bias.
|
||||
- **Muted Gray** (`#afafaf`): Tertiary text, de-emphasized footer links, and placeholder content.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#000000`): Every heading and body paragraph on light surfaces.
|
||||
- **Body** (`{colors.body}` — `#5e5e5e`): Secondary text — captions, sub-headings, supporting copy.
|
||||
- **Hairline Mid** (`{colors.hairline-mid}` — `#4b4b4b`): A mid-gray used for muted link text inside footer columns and breadcrumb-style nav.
|
||||
- **Mute** (`{colors.mute}` — `#afafaf`): The lightest text role — placeholder text, fine print, low-priority metadata.
|
||||
- **On Dark** (`{colors.on-dark}` — `#ffffff`): All text on `{colors.ink}` surfaces (footer, dark promo bands).
|
||||
|
||||
### Borders & Separation
|
||||
- **Border Black** (`#000000`): Thin 1px borders for structural containment -- used sparingly on dividers and form containers.
|
||||
### Semantic
|
||||
The brand does not maintain a separate error / success / warning palette in its public marketing surface. Validation cues come from the primary black or from the brand's editorial illustrations. The `#0000ee` link colour is the system's only chromatic — it's the browser-default link blue, appearing in body-copy inline links inside legal / footer text.
|
||||
|
||||
### Shadows & Depth
|
||||
- **Shadow Light** (`rgba(0, 0, 0, 0.12)`): Standard card elevation -- a featherweight lift for content cards.
|
||||
- **Shadow Medium** (`rgba(0, 0, 0, 0.16)`): Slightly stronger elevation for floating action buttons and overlays.
|
||||
- **Button Press** (`rgba(0, 0, 0, 0.08)`): Inset shadow for active/pressed states on secondary buttons.
|
||||
|
||||
### Link States
|
||||
- **Default Link Blue** (`#0000ee`): Standard browser blue for text links with underline -- used in body content.
|
||||
- **Link White** (`#ffffff`): Links on dark surfaces -- used in footer and dark sections.
|
||||
- **Link Black** (`#000000`): Links on light surfaces with underline decoration.
|
||||
|
||||
### Gradient System
|
||||
- Uber's design is **entirely gradient-free**. The black/white duality and flat color blocks create all visual hierarchy. No gradients appear anywhere in the system -- every surface is a solid color, every transition is a hard edge or a shadow.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Headline / Display**: `UberMove`, with fallbacks: `UberMoveText, system-ui, Helvetica Neue, Helvetica, Arial, sans-serif`
|
||||
- **Body / UI**: `UberMoveText`, with fallbacks: `system-ui, Helvetica Neue, Helvetica, Arial, sans-serif`
|
||||
Two custom faces carry the entire system:
|
||||
|
||||
*Note: UberMove and UberMoveText are proprietary typefaces. For external implementations, use `system-ui` or Inter as the closest available substitute. The geometric, square-proportioned character of UberMove can be approximated with Inter or DM Sans.*
|
||||
1. **A custom geometric display sans** (extracted as `UberMove`) for every headline. Weight 700 only; no italic; no tracking variation. Sizes range from `display-sm` 20 px up to `display-xxl` 52 px on the hero. Line-heights tighten to 1.22 – 1.25 at display sizes for a poured-on-the-page look.
|
||||
2. **A custom text sans** (extracted as `UberMoveText`) for body, button, link, and small headings. Weights 400 and 500 are the working pair. Used at 12 – 18 px; 24 px maximum for ride-request form labels. Tracking is always neutral.
|
||||
|
||||
The two faces share a family DNA but never overlap roles — the display face never carries a body paragraph; the text face never carries a hero headline.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Notes |
|
||||
|------|------|------|--------|-------------|-------|
|
||||
| Display / Hero | UberMove | 52px (3.25rem) | 700 | 1.23 (tight) | Maximum impact, billboard presence |
|
||||
| Section Heading | UberMove | 36px (2.25rem) | 700 | 1.22 (tight) | Major section anchors |
|
||||
| Card Title | UberMove | 32px (2rem) | 700 | 1.25 (tight) | Card and feature headings |
|
||||
| Sub-heading | UberMove | 24px (1.5rem) | 700 | 1.33 | Secondary section headers |
|
||||
| Small Heading | UberMove | 20px (1.25rem) | 700 | 1.40 | Compact headings, list titles |
|
||||
| Nav / UI Large | UberMoveText | 18px (1.13rem) | 500 | 1.33 | Navigation links, prominent UI text |
|
||||
| Body / Button | UberMoveText | 16px (1rem) | 400-500 | 1.25-1.50 | Standard body text, button labels |
|
||||
| Caption | UberMoveText | 14px (0.88rem) | 400-500 | 1.14-1.43 | Metadata, descriptions, small links |
|
||||
| Micro | UberMoveText | 12px (0.75rem) | 400 | 1.67 (relaxed) | Fine print, legal text |
|
||||
| Token | Size | Weight | Line Height | Use |
|
||||
|---|---|---|---|---|
|
||||
| `{typography.display-xxl}` | 52px | 700 | 64px | Hero headline ("Go anywhere with Uber", "Drive when you want"). |
|
||||
| `{typography.display-xl}` | 36px | 700 | 44px | Page section headlines ("Plan for later", "Safety, simplified"). |
|
||||
| `{typography.display-lg}` | 32px | 700 | 40px | Promo-card headlines. |
|
||||
| `{typography.display-md}` | 24px | 700 | 32px | Card titles, illustrated-promo headlines. |
|
||||
| `{typography.display-sm}` | 20px | 700 | 28px | Sub-card headings. |
|
||||
| `{typography.body-lg}` | 18px | 500 | 24px | Lead paragraphs and larger body. |
|
||||
| `{typography.body-md}` | 16px | 400 | 24px | Default paragraph body. |
|
||||
| `{typography.body-md-strong}` | 16px | 500 | 20px | Bolded inline body and most button labels. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | Captions, secondary metadata. |
|
||||
| `{typography.body-sm-strong}` | 14px | 500 | 16px | Bold caption / chip labels. |
|
||||
| `{typography.caption}` | 12px | 400 | 20px | Fine print, footer secondary lines. |
|
||||
| `{typography.button-large}` | 18px | 500 | 24px | Large rounded buttons inside the ride-request form. |
|
||||
| `{typography.button-md}` | 16px | 500 | 20px | Default button label. |
|
||||
|
||||
### Principles
|
||||
- **Bold headlines, medium body**: UberMove headings are exclusively weight 700 (bold) -- every headline hits with billboard force. UberMoveText body and UI text uses 400-500, creating a clear visual hierarchy through weight contrast.
|
||||
- **Tight heading line-heights**: All headlines use line-heights between 1.22-1.40 -- compact and punchy, designed for scanning rather than reading.
|
||||
- **Functional typography**: There is no decorative type treatment anywhere. No letter-spacing, no text-transform, no ornamental sizing. Every text element serves a direct communication purpose.
|
||||
- **Two fonts, strict roles**: UberMove is exclusively for headings. UberMoveText is exclusively for body, buttons, links, and UI. The boundary is never crossed.
|
||||
- **Sentence-case is the voice.** No all-caps headlines. Eyebrow tags ("WHY BECOME") are the rare exception.
|
||||
- **Weight 700 is for headlines; weight 500 is for buttons and emphasis.** Don't promote button labels to 700.
|
||||
- **No tracking flourish.** The display face is never letter-spaced, positive or negative.
|
||||
- **Two faces, two roles.** UberMove for display; UberMoveText for everything else. Never cross the streams.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
The two faces are proprietary. Open-source substitutes:
|
||||
- **Display sans** — *Inter* weight 700 with `font-feature-settings: "ss01"` enabled comes closest. *Geist* weight 700 is the second-best option.
|
||||
- **Text sans** — *Inter* weights 400 / 500 match the geometric width and x-height. *Plus Jakarta Sans* is a softer alternative if the brand wants a less neutral feel.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px. Most captured values are multiples of 4 with a few 6-px sub-multiples (10, 14) inside button padding.
|
||||
- **Tokens**: `{spacing.xxs}` 4 px · `{spacing.xs}` 6 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px.
|
||||
- **Section padding**: marketing bands sit at `{spacing.3xl}` 32 px top/bottom on tighter pages and `{spacing.3xl} {spacing.3xl}` for hero bands; promo cards inset at `{spacing.2xl}` 24 px.
|
||||
- **Card interior padding**: content cards sit at `{spacing.2xl}` 24 px; the ride-request form uses `{spacing.lg}` 16 px to keep the form compact.
|
||||
- **Inline gap**: button rows, category chip rows, app-store pill rows use `{spacing.md}` 12 px between siblings.
|
||||
|
||||
### Grid & Container
|
||||
- **Max width**: ~1200 px container; centred with horizontal gutters of `{spacing.3xl}` 32 px on desktop, `{spacing.lg}` 16 px on mobile.
|
||||
- **Column patterns**:
|
||||
- Promo-card rows: 2-up at desktop (image left + content right, alternating sides), 1-up at mobile.
|
||||
- Category chips: horizontal flex with wrap.
|
||||
- FAQ rows: full-width single-column.
|
||||
- App-download pills: 2-up at desktop (Rider + Driver), 1-up at mobile.
|
||||
|
||||
### Whitespace Philosophy
|
||||
Card-to-card spacing carries the rhythm — between two stacked promo cards there's roughly a full `{spacing.3xl}` 32 px gutter; inside a card the headline / paragraph / CTA stack is tight (`{spacing.sm}` 8 px between siblings). The black promo bands and the footer have no internal hairlines — content sits on flat ink with white text.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 600px | Nav collapses to hamburger; promo cards stack; ride-request form becomes full-width. |
|
||||
| Mobile-Large | 600–767px | Same as Mobile; chip rows enable horizontal scroll. |
|
||||
| Tablet | 768–1119px | 2-up promo grid at upper widths; nav stays horizontal until ≥ 1120 px. |
|
||||
| Desktop | 1120–1135px | Full nav row visible; promo cards 2-up. |
|
||||
| Desktop-Large | ≥ 1136px | Container caps at ~1200 px; bands stay edge-to-edge while content centres. |
|
||||
|
||||
#### Touch Targets
|
||||
The pill `button-primary` renders at ~44 px tall (10 px vertical padding + 24 px label line-height); the larger `button-large-rounded` at ~56 px. Both meet WCAG AAA at all breakpoints. Category chips inflate to ≥ 44 px tall through extra padding on touch viewports.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- **Nav**: full link row + Help / Log in / Sign up pills at desktop. Collapses to logo + hamburger at mobile; menu overlays full-screen with the same link list stacked.
|
||||
- **Ride-request form card**: at desktop, the form sits inside a max-490-px `{rounded.xl}` card with shadow. At mobile, full-width with edge-to-edge.
|
||||
- **Promo cards**: at desktop, image-left + content-right (or alternating). At mobile, image always above content.
|
||||
- **Annual showcase card**: scales from a 2:3 desktop frame to a 4:3 mobile frame; date text resizes proportionally.
|
||||
|
||||
#### Image Behavior
|
||||
- **Editorial illustrations**: 4:3 or 16:9 hard-edge rectangles; never cropped to a circle, never tilted. Aspect preserved.
|
||||
- **Photography**: same — square or landscape; framed inside `{rounded.xl}` card chrome.
|
||||
- **Maps in ride-request flow**: full-bleed inside a card; rounded corners follow the parent card.
|
||||
- **Logo bar**: SVG vector, monochrome, consistent height.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default — most cards and surfaces lean on hairline-of-canvas contrast. |
|
||||
| Level 1 — Subtle Drop | `rgba(0, 0, 0, 0.12) 0px 4px 16px 0px` | Card-elevated frames around promo cards on light bands. |
|
||||
| Level 2 — Card Drop | `rgba(0, 0, 0, 0.16) 0px 4px 16px 0px` | The ride-request form card on the hero; large content cards with embedded forms. |
|
||||
| Level 3 — Pill Float | `rgba(0, 0, 0, 0.16) 0px 2px 8px 0px` | The floating white pill button (the one that floats over hero photography). |
|
||||
|
||||
### Decorative Depth
|
||||
- **Black bands as polarity-flip depth**: the brand uses pure black `{colors.primary}` mid-page bands to break the white-on-white rhythm. The polarity shift IS the depth cue.
|
||||
- **Editorial illustrations as in-card depth**: every promo card has a single 4:3 illustration as its left or right column. The illustration's visual weight is part of the card's elevation read.
|
||||
- **Pill geometry as micro-depth**: `{rounded.pill}` 999 px applied at varying button heights creates a stack of nested pills that reads as visual hierarchy.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed hero bands, footer fill, raw image edges. |
|
||||
| `{rounded.md}` | 8px | Form-input fields inside the ride-request card. |
|
||||
| `{rounded.lg}` | 12px | Smaller secondary card chrome. |
|
||||
| `{rounded.xl}` | 16px | Canonical card radius — promo cards, content cards, ride-request form card, annual-showcase card, large rounded buttons. |
|
||||
| `{rounded.pill}` | 999px | The brand's signature interactive shape — every pill button, category chip, app-download pill, icon button. |
|
||||
| `{rounded.pill-tab}` | 36px | The translucent-white tab-toggle pill on the hero (Ride / Drive). |
|
||||
| `{rounded.full}` | 9999px | Identical effect to `{rounded.pill}` for circular icon containers. |
|
||||
|
||||
### Photography Geometry
|
||||
- **Editorial illustrations**: 4:3 landscape inside promo cards; 16:9 for full-width showcase frames.
|
||||
- **Driver / rider portraits**: 4:5 portrait crop; framed by `{rounded.xl}` 16 px card chrome.
|
||||
- **Annual showcase image**: 2:3 portrait at desktop, scaling to 4:3 at mobile. The image fills the card; the headline overlays the bottom.
|
||||
- **Logo bar**: monochrome SVG vectors at consistent ~24 px height.
|
||||
- **Avatars** (where used): square or `{rounded.full}` circle, never `{rounded.lg}` rounded-square.
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary Black (CTA)**
|
||||
- Background: Uber Black (`#000000`)
|
||||
- Text: Pure White (`#ffffff`)
|
||||
- Padding: 10px 12px
|
||||
- Radius: 999px (full pill)
|
||||
- Outline: none
|
||||
- Focus: inset ring `rgb(255,255,255) 0px 0px 0px 2px`
|
||||
- The primary action button -- bold, high-contrast, unmissable
|
||||
**`button-primary`** — the canonical black pill, the brand's conversion target.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.button-md}`, padding `{spacing.md} {spacing.md}`, shape `{rounded.pill}` 999 px.
|
||||
|
||||
**Secondary White**
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Uber Black (`#000000`)
|
||||
- Padding: 10px 12px
|
||||
- Radius: 999px (full pill)
|
||||
- Hover: background shifts to Hover Gray (`#e2e2e2`)
|
||||
- Focus: background shifts to Hover Gray, inset ring appears
|
||||
- Used on dark surfaces or as a secondary action alongside Primary Black
|
||||
**`button-secondary`** — the white pill paired with the black primary.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same label and padding as `button-primary`, shape `{rounded.pill}`.
|
||||
|
||||
**Chip / Filter**
|
||||
- Background: Chip Gray (`#efefef`)
|
||||
- Text: Uber Black (`#000000`)
|
||||
- Padding: 14px 16px
|
||||
- Radius: 999px (full pill)
|
||||
- Active: inset shadow `rgba(0,0,0,0.08)`
|
||||
- Navigation chips, category selectors, filter toggles
|
||||
**`button-subtle`** — the gray secondary pill used for tertiary actions inside cards (e.g., "Learn more" / "Use Reserve").
|
||||
- Background `{colors.canvas-soft}` (`#efefef`), text `{colors.ink}`, label in `{typography.button-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.pill}`.
|
||||
|
||||
**Floating Action**
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Uber Black (`#000000`)
|
||||
- Padding: 14px
|
||||
- Radius: 999px (full pill)
|
||||
- Shadow: `rgba(0,0,0,0.16) 0px 2px 8px 0px`
|
||||
- Transform: `translateY(2px)` slight offset
|
||||
- Hover: background shifts to `#f3f3f3`
|
||||
- Map controls, scroll-to-top, floating CTAs
|
||||
**`button-floating`** — the white pill with a subtle drop-shadow that floats over a dark or photographic surface.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md}`, shape `{rounded.pill}`. Carries a Level 3 pill-float shadow.
|
||||
|
||||
**`button-large-rounded`** — the bigger black call-to-action used inside the ride-request flow ("Yes, help me").
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label in `{typography.button-large}`, padding `{spacing.lg} {spacing.xl}`, shape `{rounded.xl}` 16 px (not pill — the only black CTA that breaks the pill rule, used in the larger form context).
|
||||
|
||||
**`button-tab-translucent`** — the tab-toggle on the hero ride-request form (Ride / Drive).
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, label in `{typography.body-md-strong}`, shape `{rounded.pill-tab}` 36 px (off-shape, deliberately tighter than the canonical 999 px pill).
|
||||
|
||||
### Cards & Containers
|
||||
- Background: Pure White (`#ffffff`) on white pages; no distinct card background differentiation
|
||||
- Border: none by default -- cards are defined by shadow, not stroke
|
||||
- Radius: 8px for standard content cards; 12px for featured/promoted cards
|
||||
- Shadow: `rgba(0,0,0,0.12) 0px 4px 16px 0px` for standard lift
|
||||
- Cards are content-dense with minimal internal padding
|
||||
- Image-led cards use full-bleed imagery with text overlay or below
|
||||
|
||||
**`card-content`** — the canonical content card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.2xl}`, shape `{rounded.xl}` 16 px. No shadow on the default state.
|
||||
|
||||
**`card-elevated`** — the content card with Level 1 subtle drop.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same padding + shape as `card-content`. Shadow at Level 1.
|
||||
|
||||
**`card-soft-tinted`** — the gray-tinted card used as a sub-region inside the page (e.g., "Plan for later" callout).
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.2xl}`, shape `{rounded.xl}`.
|
||||
|
||||
**`promo-card-illustrated`** — the 2-column promo card with illustration on one side and copy on the other.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.2xl}`, shape `{rounded.xl}`. Headline in `{typography.display-md}` or larger.
|
||||
|
||||
**`promo-card-on-dark`** — the polarity-flipped promo card in black.
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.2xl}`, shape `{rounded.xl}`. Used for the "Drive with Uber" mid-page band.
|
||||
|
||||
**`request-form-card`** — the hero ride-request form chrome.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.xl}`. Carries Level 2 card drop shadow.
|
||||
|
||||
**`request-form-input-row`** — the per-field row inside the request-form card.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.md}` 8 px. Hosts an icon + label + value.
|
||||
|
||||
**`showcase-image-card`** — the giant "GO•GET 2026" annual showcase card.
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}` overlay, padding `{spacing.3xl}`, shape `{rounded.xl}`. Display-xxl headline overlays the bottom of the image.
|
||||
|
||||
### Inputs & Forms
|
||||
- Text: Uber Black (`#000000`)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Border: 1px solid Black (`#000000`) -- the only place visible borders appear prominently
|
||||
- Radius: 8px
|
||||
- Padding: standard comfortable spacing
|
||||
- Focus: no extracted custom focus state -- relies on standard browser focus ring
|
||||
|
||||
**`text-input`** — the canonical text input.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, body in `{typography.body-md}`, padding `{spacing.lg}`, shape `{rounded.md}` 8 px.
|
||||
|
||||
**`text-input-on-soft`** — the nested input on a white card (slightly lighter fill).
|
||||
- Background `{colors.canvas-softer}`, otherwise identical to `text-input`.
|
||||
|
||||
### Navigation
|
||||
- Sticky top navigation with white background
|
||||
- Logo: Uber wordmark/icon at 24x24px in black
|
||||
- Links: UberMoveText at 14-18px, weight 500, in Uber Black
|
||||
- Pill-shaped nav chips with Chip Gray (`#efefef`) background for category navigation ("Ride", "Drive", "Business", "Uber Eats")
|
||||
- Menu toggle: circular button with 50% border-radius
|
||||
- Mobile: hamburger menu pattern
|
||||
|
||||
### Image Treatment
|
||||
- Warm, hand-illustrated scenes (not photographs for feature sections)
|
||||
- Illustration style: slightly stylized people, warm color palette within illustrations, contemporary vibe
|
||||
- Hero sections use bold photography or illustration as full-width backgrounds
|
||||
- QR codes for app download CTAs
|
||||
- All imagery uses standard 8px or 12px border-radius when contained in cards
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}` on light pages, switches to `{colors.ink}` on the rare dark page (e.g., Uber Eats hero). Padding `{spacing.lg} {spacing.3xl}`.
|
||||
|
||||
### Distinctive Components
|
||||
**`nav-link`** — the link row inside `nav-bar`.
|
||||
- Text `{colors.ink}`, set in `{typography.body-md-strong}` 500 weight.
|
||||
|
||||
**Category Pill Navigation**
|
||||
- Horizontal row of pill-shaped buttons for top-level navigation ("Ride", "Drive", "Business", "Uber Eats", "About")
|
||||
- Each pill: Chip Gray background, black text, 999px radius
|
||||
- Active state indicated by black background with white text (inversion)
|
||||
**`footer`** — the deep-black footer band.
|
||||
- Background `{colors.primary}` (the brand's only true black surface), text `{colors.on-dark}`, padding `{spacing.3xl} {spacing.3xl}`. Body in `{typography.body-sm}`; column eyebrows in `{typography.body-md-strong}`.
|
||||
|
||||
**Hero with Dual Action**
|
||||
- Split hero: text/CTA on left, map/illustration on right
|
||||
- Two input fields side by side for pickup/destination
|
||||
- "See prices" CTA button in black pill
|
||||
### Signature Components
|
||||
|
||||
**Plan-Ahead Cards**
|
||||
- Cards promoting features like "Uber Reserve" and trip planning
|
||||
- Illustration-heavy with warm, human-centric imagery
|
||||
- Black CTA buttons with white text at bottom
|
||||
**`hero-band-light`** — the white hero with the ride-request card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-xxl}` (52 px / 700) on the left; `request-form-card` on the right.
|
||||
|
||||
## 5. Layout Principles
|
||||
**`hero-band-dark`** — the rare black hero (used on Uber Eats and Drive landing).
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.3xl} {spacing.3xl}`. Same display-xxl headline scale; CTA inverts to `button-secondary` white pill.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 4px, 6px, 8px, 10px, 12px, 14px, 16px, 18px, 20px, 24px, 32px
|
||||
- Button padding: 10px 12px (compact) or 14px 16px (comfortable)
|
||||
- Card internal padding: approximately 24-32px
|
||||
- Section vertical spacing: generous but efficient -- approximately 64-96px between major sections
|
||||
**`category-button`** — the horizontal-scroll category row ("Reserve / Rentals / Teens / Group rides").
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, label in `{typography.body-sm-strong}`, padding `{spacing.sm} {spacing.lg}`, shape `{rounded.pill}`. An icon precedes the label.
|
||||
|
||||
### Grid & Container
|
||||
- Max container width: approximately 1136px, centered
|
||||
- Hero: split layout with text left, visual right
|
||||
- Feature sections: 2-column card grids or full-width single-column
|
||||
- Footer: multi-column link grid on black background
|
||||
- Full-width sections extending to viewport edges
|
||||
**`faq-row`** — the FAQ accordion item.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, question in `{typography.body-md-strong}`, padding `{spacing.lg}` 0. No card chrome — hairline dividers between rows.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Efficient, not airy**: Uber's whitespace is functional -- enough to separate, never enough to feel empty. This is transit-system spacing: compact, clear, purpose-driven.
|
||||
- **Content-dense cards**: Cards pack information tightly with minimal internal spacing, relying on shadow and radius to define boundaries.
|
||||
- **Section breathing room**: Major sections get generous vertical spacing, but within sections, elements are closely grouped.
|
||||
**`app-download-pill`** — the "Download the Rider app" / "Download the Driver app" pill.
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}`, label in `{typography.body-md-strong}`, padding `{spacing.md} {spacing.xl}`, shape `{rounded.pill}`.
|
||||
|
||||
### Border Radius Scale
|
||||
- Sharp (0px): No square corners used in interactive elements
|
||||
- Standard (8px): Content cards, input fields, listboxes
|
||||
- Comfortable (12px): Featured cards, larger containers, link cards
|
||||
- Full Pill (999px): All buttons, chips, navigation items, pills
|
||||
- Circle (50%): Avatar images, icon containers, circular controls
|
||||
**`icon-button-circular`** — the round icon container used in the nav and inside the ride-request card.
|
||||
- Background `{colors.canvas-soft}`, dark icon, shape `{rounded.full}`. No label.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
### Links
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow, solid background | Page background, inline content, text sections |
|
||||
| Subtle (Level 1) | `rgba(0,0,0,0.12) 0px 4px 16px` | Standard content cards, feature blocks |
|
||||
| Medium (Level 2) | `rgba(0,0,0,0.16) 0px 4px 16px` | Elevated cards, overlay elements |
|
||||
| Floating (Level 3) | `rgba(0,0,0,0.16) 0px 2px 8px` + translateY(2px) | Floating action buttons, map controls |
|
||||
| Pressed (Level 4) | `rgba(0,0,0,0.08) inset` (999px spread) | Active/pressed button states |
|
||||
| Focus Ring | `rgb(255,255,255) 0px 0px 0px 2px inset` | Keyboard focus indicators |
|
||||
**`link-blue`** — the system-default browser-blue link inside legal / footer fine print.
|
||||
- Text `{colors.link}` (`#0000ee`), body in `{typography.body-md}`.
|
||||
|
||||
**Shadow Philosophy**: Uber uses shadow purely as a structural tool, never decoratively. Shadows are always black at very low opacity (0.08-0.16), creating the bare minimum lift needed to separate content layers. The blur radii are moderate (8-16px) -- enough to feel natural but never dramatic. There are no colored shadows, no layered shadow stacks, and no ambient glow effects. Depth is communicated more through the black/white section contrast than through shadow elevation.
|
||||
**`link-on-dark`** — the white link inside dark bands.
|
||||
- Text `{colors.on-dark}`, body in `{typography.body-md}`.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`link-mute`** — the muted gray link inside footer columns.
|
||||
- Text `{colors.hairline-mid}`, body in `{typography.body-md}`.
|
||||
|
||||
**`link-mute-soft`** — the lightest gray link, used for low-priority secondary text on dark surfaces.
|
||||
- Text `{colors.mute}`, body in `{typography.body-md}`.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use true black (`#000000`) and pure white (`#ffffff`) as the primary palette -- the stark contrast IS Uber
|
||||
- Use 999px border-radius for all buttons, chips, and pill-shaped navigation elements
|
||||
- Keep all headings in UberMove Bold (700) for billboard-level impact
|
||||
- Use whisper-soft shadows (0.12-0.16 opacity) for card elevation -- barely visible
|
||||
- Maintain the compact, information-dense layout style -- Uber prioritizes efficiency over airiness
|
||||
- Use warm, human-centric illustrations to soften the monochrome interface
|
||||
- Apply 8px radius for content cards and 12px for featured containers
|
||||
- Use UberMoveText at weight 500 for navigation and prominent UI text
|
||||
- Pair black primary buttons with white secondary buttons for dual-action layouts
|
||||
- Reserve `{colors.primary}` (`#000000`) for every primary CTA pill. One black pill per visible viewport is the brand's whole conversion story.
|
||||
- Use `{rounded.pill}` 999 px on every interactive element (buttons, chips, app pills). The pill IS the brand's geometric signature.
|
||||
- Render cards in `{rounded.xl}` 16 px — promo cards, content cards, the ride-request form card, the annual-showcase card all share this radius.
|
||||
- Set every headline in `{typography.display-*}` weight 700 in sentence-case. The display face never carries body copy.
|
||||
- Use polarity-flipped black promo bands mid-page to break up white-on-white rhythm. The polarity shift IS the depth cue.
|
||||
- Anchor every promo card with a 4:3 editorial illustration; never use generic stock imagery.
|
||||
|
||||
### Don't
|
||||
- Don't introduce color into the UI chrome -- Uber's interface is strictly black, white, and gray
|
||||
- Don't use rounded corners less than 999px on buttons -- the full-pill shape is a core identity element
|
||||
- Don't apply heavy shadows or drop shadows with high opacity -- depth is whisper-subtle
|
||||
- Don't use serif fonts anywhere -- Uber's typography is exclusively geometric sans-serif
|
||||
- Don't create airy, spacious layouts with excessive whitespace -- Uber's density is intentional
|
||||
- Don't use gradients or color overlays -- every surface is a flat, solid color
|
||||
- Don't mix UberMove into body text or UberMoveText into headlines -- the hierarchy is strict
|
||||
- Don't use decorative borders -- borders are functional (inputs, dividers) or absent entirely
|
||||
- Don't soften the black/white contrast with off-whites or near-blacks -- the duality is deliberate
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile Small | 320px | Minimum layout, single column, stacked inputs, compact typography |
|
||||
| Mobile | 600px | Standard mobile, stacked layout, hamburger nav |
|
||||
| Tablet Small | 768px | Two-column grids begin, expanded card layouts |
|
||||
| Tablet | 1119px | Full tablet layout, side-by-side hero content |
|
||||
| Desktop Small | 1120px | Desktop grid activates, horizontal nav pills |
|
||||
| Desktop | 1136px | Full desktop layout, maximum container width, split hero |
|
||||
|
||||
### Touch Targets
|
||||
- All pill buttons: minimum 44px height (10-14px vertical padding + line-height)
|
||||
- Navigation chips: generous 14px 16px padding for comfortable thumb tapping
|
||||
- Circular controls (menu, close): 50% radius ensures large, easy-to-hit targets
|
||||
- Card surfaces serve as full-area touch targets on mobile
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Horizontal pill nav collapses to hamburger menu with circular toggle
|
||||
- **Hero**: Split layout (text + map/visual) stacks to single column -- text above, visual below
|
||||
- **Input fields**: Side-by-side pickup/destination inputs stack vertically
|
||||
- **Feature cards**: 2-column grid collapses to full-width stacked cards
|
||||
- **Headings**: 52px display scales down through 36px, 32px, 24px, 20px
|
||||
- **Footer**: Multi-column link grid collapses to accordion or stacked single column
|
||||
- **Category pills**: Horizontal scroll with overflow on smaller screens
|
||||
|
||||
### Image Behavior
|
||||
- Illustrations scale proportionally within their containers
|
||||
- Hero imagery maintains aspect ratio, may crop on smaller screens
|
||||
- QR code sections hide on mobile (app download shifts to direct store links)
|
||||
- Card imagery maintains 8-12px border radius at all sizes
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary Button: "Uber Black (#000000)"
|
||||
- Page Background: "Pure White (#ffffff)"
|
||||
- Button Text (on black): "Pure White (#ffffff)"
|
||||
- Button Text (on white): "Uber Black (#000000)"
|
||||
- Secondary Text: "Body Gray (#4b4b4b)"
|
||||
- Tertiary Text: "Muted Gray (#afafaf)"
|
||||
- Chip Background: "Chip Gray (#efefef)"
|
||||
- Hover State: "Hover Gray (#e2e2e2)"
|
||||
- Card Shadow: "rgba(0,0,0,0.12) 0px 4px 16px"
|
||||
- Footer Background: "Uber Black (#000000)"
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on Pure White (#ffffff) with a headline at 52px UberMove Bold (700), line-height 1.23. Use Uber Black (#000000) text. Add a subtitle in Body Gray (#4b4b4b) at 16px UberMoveText weight 400 with 1.50 line-height. Place an Uber Black (#000000) pill CTA button with Pure White text, 999px radius, padding 10px 12px."
|
||||
- "Design a category navigation bar with horizontal pill buttons. Each pill: Chip Gray (#efefef) background, Uber Black (#000000) text, 14px 16px padding, 999px border-radius. Active pill inverts to Uber Black background with Pure White text. Use UberMoveText at 14px weight 500."
|
||||
- "Build a feature card on Pure White (#ffffff) with 8px border-radius and shadow rgba(0,0,0,0.12) 0px 4px 16px. Title in UberMove at 24px weight 700, description in Body Gray (#4b4b4b) at 16px UberMoveText. Add a black pill CTA button at the bottom."
|
||||
- "Create a dark footer on Uber Black (#000000) with Pure White (#ffffff) heading text in UberMove at 20px weight 700. Footer links in Muted Gray (#afafaf) at 14px UberMoveText. Links hover to Pure White. Multi-column grid layout."
|
||||
- "Design a floating action button with Pure White (#ffffff) background, 999px radius, 14px padding, and shadow rgba(0,0,0,0.16) 0px 2px 8px. Hover shifts background to #f3f3f3. Use for scroll-to-top or map controls."
|
||||
|
||||
### Iteration Guide
|
||||
1. Focus on ONE component at a time
|
||||
2. Reference the strict black/white palette -- "use Uber Black (#000000)" not "make it dark"
|
||||
3. Always specify 999px radius for buttons and pills -- this is non-negotiable for the Uber identity
|
||||
4. Describe the font family explicitly -- "UberMove Bold for the heading, UberMoveText Medium for the label"
|
||||
5. For shadows, use "whisper shadow (rgba(0,0,0,0.12) 0px 4px 16px)" -- never heavy drop shadows
|
||||
6. Keep layouts compact and information-dense -- Uber is efficient, not airy
|
||||
7. Illustrations should be warm and human -- describe "stylized people in warm tones" not abstract shapes
|
||||
8. Pair black CTAs with white secondaries for balanced dual-action layouts
|
||||
- Don't introduce a second brand accent colour (orange, blue, green). The brand's entire UI is black-and-white plus grayscale; new accents flatten the system.
|
||||
- Don't render the primary CTA as a `{rounded.xl}` rectangle except inside the larger ride-request flow (where `button-large-rounded` is the documented exception).
|
||||
- Don't use all-caps display headlines. Sentence-case is the voice; uppercase is restricted to rare eyebrow tags.
|
||||
- Don't drop a soft drop-shadow on every card. The brand uses Level 0 flat as the default; shadow is reserved for the floating pill and the ride-request form.
|
||||
- Don't reduce the brand to its illustration system alone. The pill geometry + black/white duet carries the brand even without illustrations.
|
||||
- Don't tighten or loosen letter-spacing on the display face. The brand never letter-spaces; default tracking is part of the voice.
|
||||
- Don't use `{rounded.full}` 9999 px for square cards — the pill 999 px and full 9999 px effects are identical for interactive elements, but cards stay at `{rounded.xl}` 16 px.
|
||||
|
||||
@ -1,310 +1,736 @@
|
||||
# Design System Inspired by Vercel
|
||||
---
|
||||
version: alpha
|
||||
name: Vercel Inspired
|
||||
description: An inspired interpretation of Vercel's design language — a developer-platform brand whose surface is a stark black-and-ink duet on near-white canvas, broken at hero scale by a multi-color mesh gradient (cyan / blue / magenta / amber) that acts as the entire decorative system, paired with a custom geometric sans for headlines and a monospaced caption face for technical labels.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#171717"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#171717"
|
||||
body: "#4d4d4d"
|
||||
mute: "#888888"
|
||||
hairline: "#ebebeb"
|
||||
hairline-strong: "#a1a1a1"
|
||||
canvas: "#ffffff"
|
||||
canvas-soft: "#fafafa"
|
||||
canvas-soft-2: "#f5f5f5"
|
||||
link: "#0070f3"
|
||||
link-deep: "#0761d1"
|
||||
link-bg-soft: "#d3e5ff"
|
||||
success: "#0070f3"
|
||||
error: "#ee0000"
|
||||
error-soft: "#f7d4d6"
|
||||
error-deep: "#c50000"
|
||||
warning: "#f5a623"
|
||||
warning-soft: "#ffefcf"
|
||||
warning-deep: "#ab570a"
|
||||
violet: "#7928ca"
|
||||
violet-soft: "#d8ccf1"
|
||||
violet-deep: "#4c2889"
|
||||
cyan: "#50e3c2"
|
||||
cyan-soft: "#aaffec"
|
||||
cyan-deep: "#29bc9b"
|
||||
highlight-pink: "#ff0080"
|
||||
highlight-magenta: "#eb367f"
|
||||
gradient-develop-start: "#007cf0"
|
||||
gradient-develop-end: "#00dfd8"
|
||||
gradient-preview-start: "#7928ca"
|
||||
gradient-preview-end: "#ff0080"
|
||||
gradient-ship-start: "#ff4d4d"
|
||||
gradient-ship-end: "#f9cb28"
|
||||
selection-bg: "#171717"
|
||||
selection-fg: "#f2f2f2"
|
||||
|
||||
Vercel's website is the visual thesis of developer infrastructure made invisible — a design system so restrained it borders on philosophical. The page is overwhelmingly white (`#ffffff`) with near-black (`#171717`) text, creating a gallery-like emptiness where every element earns its pixel. This isn't minimalism as decoration; it's minimalism as engineering principle. The Geist design system treats the interface like a compiler treats code — every unnecessary token is stripped away until only structure remains.
|
||||
typography:
|
||||
display-xl:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 600
|
||||
lineHeight: 48px
|
||||
letterSpacing: -2.4px
|
||||
display-lg:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 600
|
||||
lineHeight: 40px
|
||||
letterSpacing: -1.28px
|
||||
display-md:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 600
|
||||
lineHeight: 32px
|
||||
letterSpacing: -0.96px
|
||||
display-sm:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 600
|
||||
lineHeight: 28px
|
||||
letterSpacing: -0.6px
|
||||
body-lg:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
letterSpacing: 0px
|
||||
body-md:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-md-strong:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 24px
|
||||
body-sm:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
letterSpacing: -0.28px
|
||||
body-sm-strong:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
letterSpacing: -0.28px
|
||||
caption:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
caption-mono:
|
||||
fontFamily: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
code:
|
||||
fontFamily: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace
|
||||
fontSize: 13px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
button-md:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
button-lg:
|
||||
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 24px
|
||||
|
||||
The custom Geist font family is the crown jewel. Geist Sans uses aggressive negative letter-spacing (-2.4px to -2.88px at display sizes), creating headlines that feel compressed, urgent, and engineered — like code that's been minified for production. At body sizes, the tracking relaxes but the geometric precision persists. Geist Mono completes the system as the monospace companion for code, terminal output, and technical labels. Both fonts enable OpenType `"liga"` (ligatures) globally, adding a layer of typographic sophistication that rewards close reading.
|
||||
rounded:
|
||||
none: 0px
|
||||
xs: 4px
|
||||
sm: 6px
|
||||
md: 8px
|
||||
lg: 12px
|
||||
xl: 16px
|
||||
pill-sm: 64px
|
||||
pill: 100px
|
||||
full: 9999px
|
||||
|
||||
What distinguishes Vercel from other monochrome design systems is its shadow-as-border philosophy. Instead of traditional CSS borders, Vercel uses `box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.08)` — a zero-offset, zero-blur, 1px-spread shadow that creates a border-like line without the box model implications. This technique allows borders to exist in the shadow layer, enabling smoother transitions, rounded corners without clipping, and a subtler visual weight than traditional borders. The entire depth system is built on layered, multi-value shadow stacks where each layer serves a specific purpose: one for the border, one for soft elevation, one for ambient depth.
|
||||
spacing:
|
||||
xxs: 4px
|
||||
xs: 8px
|
||||
sm: 12px
|
||||
md: 16px
|
||||
lg: 24px
|
||||
xl: 32px
|
||||
2xl: 40px
|
||||
3xl: 48px
|
||||
4xl: 64px
|
||||
5xl: 96px
|
||||
6xl: 128px
|
||||
section: 192px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
height: 64px
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
nav-link:
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.xs} {spacing.sm}"
|
||||
nav-cta-signup:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.xs}"
|
||||
height: 28px
|
||||
nav-cta-login:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.xs}"
|
||||
height: 28px
|
||||
nav-cta-ask-ai:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.xs}"
|
||||
height: 28px
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-lg}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "0px {spacing.sm}"
|
||||
button-secondary:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-lg}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "0px {spacing.sm}"
|
||||
button-primary-sm:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "0px {spacing.xs}"
|
||||
button-secondary-sm:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "0px {spacing.xs}"
|
||||
tab-ghost:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.pill-sm}"
|
||||
padding: "0px {spacing.md}"
|
||||
icon-button-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.full}"
|
||||
card-marketing:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
card-marketing-large:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
card-soft:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
template-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md}"
|
||||
code-editor-mockup:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.code}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
form-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.sm}"
|
||||
height: 40px
|
||||
form-input-sm:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.sm}"
|
||||
height: 32px
|
||||
form-input-lg:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "0px {spacing.sm}"
|
||||
height: 48px
|
||||
badge-secondary:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.caption}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "0px {spacing.xs}"
|
||||
pricing-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
pricing-card-featured:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
logo-strip:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.lg} {spacing.xl}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.4xl} {spacing.lg}"
|
||||
feature-mesh-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.5xl} {spacing.lg}"
|
||||
showcase-band-light:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.5xl} {spacing.lg}"
|
||||
showcase-band-dark:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.5xl} {spacing.lg}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.4xl} {spacing.lg}"
|
||||
link-inline:
|
||||
textColor: "{colors.link}"
|
||||
typography: "{typography.body-md}"
|
||||
banner-marketing:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.xs} {spacing.sm}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default tier card. Mirrors pricing-card chrome on canvas-soft surface with a hairline border."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured tier — polarity-flipped to ink primary with white text and white CTA."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — repurposed for the brand's GPU / inference / Pro feature tiers."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — line items per add-on (NOT a literal e-commerce cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.sm}"
|
||||
ex-data-table-cell:
|
||||
description: "Mirrors the brand's table chrome. Header uses caption-mono uppercase mono; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption-mono}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.xs} {spacing.sm}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Mirrors card-marketing-large chrome with form-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as card-marketing-large with Level 5 modal shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame. Generous padding on canvas-soft."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — flat-cornered card-marketing chrome with Level 4 shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.sm} {spacing.md}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Vercel is a developer-platform brand — the page is a deployment dashboard's marketing surface, written for engineers who already know the syntax. It earns that posture with one of the cleanest stark systems on the web: near-white `{colors.canvas-soft}` body background, ink-near-black `{colors.ink}` text, a 200-step gray scale that gives every divider, border, and disabled state its own deliberate step. The only place the brand introduces colour at marketing scale is the multi-stop mesh gradient (`{colors.gradient-develop-start}` → `{colors.gradient-preview-end}` → `{colors.gradient-ship-start}` → cyan / magenta / amber) that floats in atmospheric backdrops, never miniaturised to a swatch. That gradient is the entire decoration system.
|
||||
|
||||
Type is the second decisive voice. The brand's own custom geometric sans (Geist) carries display, body, button — everything narrative — at weight 600 for display, 500 for buttons, 400 for body. A matching monospaced face (Geist Mono) carries technical labels: terminal mockups, code blocks, sometimes filename captions. Headlines are sentence-case with aggressive negative letter-spacing (`-2.4px` at 48 px hero) — the brand never letter-spaces positively, never goes uppercase outside of mono labels.
|
||||
|
||||
Surfaces use a four-step ladder: `{colors.canvas}` (pure white for cards), `{colors.canvas-soft}` 98% (the page body), `{colors.canvas-soft-2}` 95% (occasional inset region), `{colors.primary}` (the deep ink-near-black used as the polarity-flipped band when a section needs the dark mode treatment). Shadows are exceptionally subtle — every elevated card carries a stacked shadow built from `0px 1px 1px #00000005` + `0px 2px 2px #0000000a` + an inset border. Cards never float on heavy drop-shadow; they sit on the page held by hairline + soft glow.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Geist Sans with extreme negative letter-spacing (-2.4px to -2.88px at display) — text as compressed infrastructure
|
||||
- Geist Mono for code and technical labels with OpenType `"liga"` globally
|
||||
- Shadow-as-border technique: `box-shadow 0px 0px 0px 1px` replaces traditional borders throughout
|
||||
- Multi-layer shadow stacks for nuanced depth (border + elevation + ambient in single declarations)
|
||||
- Near-pure white canvas with `#171717` text — not quite black, creating micro-contrast softness
|
||||
- Workflow-specific accent colors: Ship Red (`#ff5b4f`), Preview Pink (`#de1d8d`), Develop Blue (`#0a72ef`)
|
||||
- Focus ring system using `hsla(212, 100%, 48%, 1)` — a saturated blue for accessibility
|
||||
- Pill badges (9999px) with tinted backgrounds for status indicators
|
||||
- A single black-ink primary CTA `{colors.primary}` carries every conversion target, paired with white-on-white `button-secondary` for the secondary action. The brand uses 100 px pill shape for marketing CTAs and a tight 6 px square shape for in-app nav buttons.
|
||||
- A multi-stop mesh gradient (cyan-blue-magenta-amber) is the only decorative chrome — used at hero scale and inside feature-band atmospheric backdrops. It is the brand.
|
||||
- Every section eyebrow and small label uses the monospace face `{typography.caption-mono}` or `{typography.code}`; everything else is in the geometric sans.
|
||||
- Subtle stacked-shadow elevation — three offsets layered with 4-12 % black opacity — never a single heavy drop-shadow.
|
||||
- A complete 100–1000 gray + blue + red + amber + green + teal + purple + pink colour scale exists as a system token set, but the marketing surface uses only the `100`, `1000`, and `700`-level tones; the rest stay in the design-system tokens for in-product surfaces.
|
||||
- An "Active CPU" pricing rhythm: `pricing-card` lays out 3-up on the pricing page with `pricing-card-featured` (Pro tier) polarity-flipped to `{colors.primary}` against white-card siblings.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Vercel Black** (`#171717`): Primary text, headings, dark surface backgrounds. Not pure black — the slight warmth prevents harshness.
|
||||
- **Pure White** (`#ffffff`): Page background, card surfaces, button text on dark.
|
||||
- **True Black** (`#000000`): Secondary use, `--geist-console-text-color-default`, used in specific console/code contexts.
|
||||
### Brand & Accent
|
||||
- **Ink** (`{colors.primary}` — `#171717`): The single primary CTA color. Black-near-pure ink that carries every Sign Up pill, every footer CTA, the dark-band polarity-flip. Used as text color throughout the page on light surfaces. (Resolved from `--ds-gray-1000`.)
|
||||
- **Cyan** (`{colors.cyan}` — `#50e3c2`): A signature mint-cyan used in the brand gradient and inside Geist-system spotlight tokens. Visible inside the hero gradient stops.
|
||||
- **Highlight Pink** (`{colors.highlight-pink}` — `#ff0080`): The brand's highlight magenta, used as the high-saturation stop in the preview-gradient pair.
|
||||
- **Violet** (`{colors.violet}` — `#7928ca`): The deep purple used as the start of the preview-gradient and inside developer-console highlights.
|
||||
- **Link Blue** (`{colors.link}` — `#0070f3`): The brand's primary link color and the legacy `--geist-success` semantic.
|
||||
|
||||
### Workflow Accent Colors
|
||||
- **Ship Red** (`#ff5b4f`): `--ship-text`, the "ship to production" workflow step — warm, urgent coral-red.
|
||||
- **Preview Pink** (`#de1d8d`): `--preview-text`, the preview deployment workflow — vivid magenta-pink.
|
||||
- **Develop Blue** (`#0a72ef`): `--develop-text`, the development workflow — bright, focused blue.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The pure-white card / dialog / modal surface.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#fafafa`): The default page background — 98 % white. Almost every section sits on this tone.
|
||||
- **Canvas Soft 2** (`{colors.canvas-soft-2}` — `#f5f5f5`): A slightly deeper inset surface for "code editor inner background", template-card hover states, and dropdown menus.
|
||||
- **Hairline** (`{colors.hairline}` — `#ebebeb`): 1 px dividers — table rows, card borders, input borders.
|
||||
- **Hairline Strong** (`{colors.hairline-strong}` — `#a1a1a1`): The 500-level gray, used as the slightly-stronger divider on light bands and as the deemphasised text color.
|
||||
|
||||
### Console / Code Colors
|
||||
- **Console Blue** (`#0070f3`): `--geist-console-text-color-blue`, syntax highlighting blue.
|
||||
- **Console Purple** (`#7928ca`): `--geist-console-text-color-purple`, syntax highlighting purple.
|
||||
- **Console Pink** (`#eb367f`): `--geist-console-text-color-pink`, syntax highlighting pink.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#171717`): Every heading and body paragraph on light surfaces.
|
||||
- **Body** (`{colors.body}` — `#4d4d4d`): Secondary text — sub-headings, body captions, nav-link inactive text, footer column body.
|
||||
- **Mute** (`{colors.mute}` — `#888888`): Lowest-priority text — placeholder text, fine print, low-key labels.
|
||||
- **On Primary** (`{colors.on-primary}` — `#ffffff`): All text on `{colors.primary}` surfaces.
|
||||
|
||||
### Interactive
|
||||
- **Link Blue** (`#0072f5`): Primary link color with underline decoration.
|
||||
- **Focus Blue** (`hsla(212, 100%, 48%, 1)`): `--ds-focus-color`, focus ring on interactive elements.
|
||||
- **Ring Blue** (`rgba(147, 197, 253, 0.5)`): `--tw-ring-color`, Tailwind ring utility.
|
||||
### Semantic
|
||||
- **Success / Link** (`{colors.success}` — `#0070f3`): The brand's legacy success indicator doubles as the primary link color. Visible underline-on-hover for inline body links.
|
||||
- **Link Deep** (`{colors.link-deep}` — `#0761d1`): The pressed / visited tone for inline links.
|
||||
- **Link Bg Soft** (`{colors.link-bg-soft}` — `#d3e5ff`): Soft pastel blue fill for "what's new" pill banners and informational badges.
|
||||
- **Error** (`{colors.error}` — `#ee0000`): Validation red for destructive actions and form errors.
|
||||
- **Error Soft** (`{colors.error-soft}` — `#f7d4d6`): Soft pastel red for destructive-state backgrounds.
|
||||
- **Error Deep** (`{colors.error-deep}` — `#c50000`): Pressed / deep destructive state.
|
||||
- **Warning** (`{colors.warning}` — `#f5a623`): Caution / pending status indicator.
|
||||
- **Warning Soft** (`{colors.warning-soft}` — `#ffefcf`) / **Warning Deep** (`{colors.warning-deep}` — `#ab570a`): Background + pressed variants.
|
||||
|
||||
### Neutral Scale
|
||||
- **Gray 900** (`#171717`): Primary text, headings, nav text.
|
||||
- **Gray 600** (`#4d4d4d`): Secondary text, description copy.
|
||||
- **Gray 500** (`#666666`): Tertiary text, muted links.
|
||||
- **Gray 400** (`#808080`): Placeholder text, disabled states.
|
||||
- **Gray 100** (`#ebebeb`): Borders, card outlines, dividers.
|
||||
- **Gray 50** (`#fafafa`): Subtle surface tint, inner shadow highlight.
|
||||
### Brand Gradient
|
||||
The brand's signature decoration is a three-pair gradient stack:
|
||||
- **Develop** (`{colors.gradient-develop-start}` `#007cf0` → `{colors.gradient-develop-end}` `#00dfd8`) — the blue-to-teal pair used to mark the "deploy" / "develop" rhythm.
|
||||
- **Preview** (`{colors.gradient-preview-start}` `#7928ca` → `{colors.gradient-preview-end}` `#ff0080`) — the violet-to-pink pair used for "preview" surfaces.
|
||||
- **Ship** (`{colors.gradient-ship-start}` `#ff4d4d` → `{colors.gradient-ship-end}` `#f9cb28`) — the coral-to-amber pair used for "ship" surfaces.
|
||||
|
||||
### Surface & Overlay
|
||||
- **Overlay Backdrop** (`hsla(0, 0%, 98%, 1)`): `--ds-overlay-backdrop-color`, modal/dialog backdrop.
|
||||
- **Selection Text** (`hsla(0, 0%, 95%, 1)`): `--geist-selection-text-color`, text selection highlight.
|
||||
- **Badge Blue Bg** (`#ebf5ff`): Pill badge background, tinted blue surface.
|
||||
- **Badge Blue Text** (`#0068d6`): Pill badge text, darker blue for readability.
|
||||
The three pairs collapse into a single multi-color mesh gradient when used as the hero atmospheric backdrop. Treat the gradient as one unified object — do not crop down to a single colour, do not reorder the stops, and do not miniaturise. Used at hero scale only.
|
||||
|
||||
### Shadows & Depth
|
||||
- **Border Shadow** (`rgba(0, 0, 0, 0.08) 0px 0px 0px 1px`): The signature — replaces traditional borders.
|
||||
- **Subtle Elevation** (`rgba(0, 0, 0, 0.04) 0px 2px 2px`): Minimal lift for cards.
|
||||
- **Card Stack** (`rgba(0,0,0,0.08) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 2px, rgba(0,0,0,0.04) 0px 8px 8px -8px, #fafafa 0px 0px 0px 1px`): Full multi-layer card shadow.
|
||||
- **Ring Border** (`rgb(235, 235, 235) 0px 0px 0px 1px`): Light gray ring-border for tabs and images.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Primary**: `Geist`, with fallbacks: `Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol`
|
||||
- **Monospace**: `Geist Mono`, with fallbacks: `ui-monospace, SFMono-Regular, Roboto Mono, Menlo, Monaco, Liberation Mono, DejaVu Sans Mono, Courier New`
|
||||
- **OpenType Features**: `"liga"` enabled globally on all Geist text; `"tnum"` for tabular numbers on specific captions.
|
||||
Two custom faces carry the entire system:
|
||||
|
||||
1. **A custom geometric sans** (extracted as `Geist`) for every display, body, button, link, and label. Weights 400 / 500 / 600 are the working set; the face never appears in 700 or heavier. Display sizes are tracked aggressively negative (`-2.4 px` at 48 px hero, `-1.28 px` at 32 px section); body stays at neutral or slightly-negative tracking.
|
||||
2. **A custom monospaced face** (extracted as `Geist Mono`) for terminal mockups, code blocks, and small mono-caption labels — anything that wants to signal "technical." Weight 400 only at 12 – 13 px. Tracking neutral.
|
||||
|
||||
A condensed display sans (`Space Grotesk`) is loaded as a third face for occasional editorial moments but does not render as the primary face anywhere in the captured surfaces.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display Hero | Geist | 48px (3.00rem) | 600 | 1.00–1.17 (tight) | -2.4px to -2.88px | Maximum compression, billboard impact |
|
||||
| Section Heading | Geist | 40px (2.50rem) | 600 | 1.20 (tight) | -2.4px | Feature section titles |
|
||||
| Sub-heading Large | Geist | 32px (2.00rem) | 600 | 1.25 (tight) | -1.28px | Card headings, sub-sections |
|
||||
| Sub-heading | Geist | 32px (2.00rem) | 400 | 1.50 | -1.28px | Lighter sub-headings |
|
||||
| Card Title | Geist | 24px (1.50rem) | 600 | 1.33 | -0.96px | Feature cards |
|
||||
| Card Title Light | Geist | 24px (1.50rem) | 500 | 1.33 | -0.96px | Secondary card headings |
|
||||
| Body Large | Geist | 20px (1.25rem) | 400 | 1.80 (relaxed) | normal | Introductions, feature descriptions |
|
||||
| Body | Geist | 18px (1.13rem) | 400 | 1.56 | normal | Standard reading text |
|
||||
| Body Small | Geist | 16px (1.00rem) | 400 | 1.50 | normal | Standard UI text |
|
||||
| Body Medium | Geist | 16px (1.00rem) | 500 | 1.50 | normal | Navigation, emphasized text |
|
||||
| Body Semibold | Geist | 16px (1.00rem) | 600 | 1.50 | -0.32px | Strong labels, active states |
|
||||
| Button / Link | Geist | 14px (0.88rem) | 500 | 1.43 | normal | Buttons, links, captions |
|
||||
| Button Small | Geist | 14px (0.88rem) | 400 | 1.00 (tight) | normal | Compact buttons |
|
||||
| Caption | Geist | 12px (0.75rem) | 400–500 | 1.33 | normal | Metadata, tags |
|
||||
| Mono Body | Geist Mono | 16px (1.00rem) | 400 | 1.50 | normal | Code blocks |
|
||||
| Mono Caption | Geist Mono | 13px (0.81rem) | 500 | 1.54 | normal | Code labels |
|
||||
| Mono Small | Geist Mono | 12px (0.75rem) | 500 | 1.00 (tight) | normal | `text-transform: uppercase`, technical labels |
|
||||
| Micro Badge | Geist | 7px (0.44rem) | 700 | 1.00 (tight) | normal | `text-transform: uppercase`, tiny badges |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xl}` | 48px | 600 | 48px | -2.4px | Hero headline ("Build and deploy on the AI Cloud."). |
|
||||
| `{typography.display-lg}` | 32px | 600 | 40px | -1.28px | Section headlines ("Your frontend, delivered.", "A compute model for all workloads."). |
|
||||
| `{typography.display-md}` | 24px | 600 | 32px | -0.96px | Card-cluster headlines, pricing-tier names. |
|
||||
| `{typography.display-sm}` | 20px | 600 | 28px | -0.6px | Inline display micro-headings. |
|
||||
| `{typography.body-lg}` | 18px | 400 | 28px | 0 | Lead paragraphs under section headlines. |
|
||||
| `{typography.body-md}` | 16px | 400 | 24px | 0 | Default body paragraph. |
|
||||
| `{typography.body-md-strong}` | 16px | 500 | 24px | 0 | Bolded inline body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | -0.28px | Secondary body, nav-link text, button-md labels. |
|
||||
| `{typography.body-sm-strong}` | 14px | 500 | 20px | -0.28px | Nav CTA labels, table-row emphasis. |
|
||||
| `{typography.caption}` | 12px | 400 | 16px | 0 | Footer secondary lines, badge labels. |
|
||||
| `{typography.caption-mono}` | 12px | 400 | 16px | 0 | Section eyebrows and label captions that want a technical voice. |
|
||||
| `{typography.code}` | 13px | 400 | 20px | 0 | Inline code, terminal mockups, command snippets. |
|
||||
| `{typography.button-md}` | 14px | 500 | 20px | 0 | Small / nav-scale button labels. |
|
||||
| `{typography.button-lg}` | 16px | 500 | 24px | 0 | Marketing-scale pill button labels. |
|
||||
|
||||
### Principles
|
||||
- **Compression as identity**: Geist Sans at display sizes uses -2.4px to -2.88px letter-spacing — the most aggressive negative tracking of any major design system. This creates text that feels _minified_, like code optimized for production. The tracking progressively relaxes as size decreases: -1.28px at 32px, -0.96px at 24px, -0.32px at 16px, and normal at 14px.
|
||||
- **Ligatures everywhere**: Every Geist text element enables OpenType `"liga"`. Ligatures aren't decorative — they're structural, creating tighter, more efficient glyph combinations.
|
||||
- **Three weights, strict roles**: 400 (body/reading), 500 (UI/interactive), 600 (headings/emphasis). No bold (700) except for tiny micro-badges. This narrow weight range creates hierarchy through size and tracking, not weight.
|
||||
- **Mono for identity**: Geist Mono in uppercase with `"tnum"` or `"liga"` serves as the "developer console" voice — compact technical labels that connect the marketing site to the product.
|
||||
- **Negative tracking is part of the voice.** Display sizes use aggressive `-2.4` to `-0.6` px tracking. Reverting to default tracking breaks the brand.
|
||||
- **Sentence-case headlines, period-terminated.** Headlines like "Build and deploy on the AI Cloud." end with a deliberate period — that punctuation is part of the brand's voice.
|
||||
- **Mono for the technical layer only.** Section eyebrows, code blocks, terminal mockups. Body paragraphs never set in mono.
|
||||
- **Weight 600 is the display ceiling.** The geometric sans never appears at 700 / 800. The brand reads as a calmer system because of this.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
The two primary faces are proprietary (custom-cut for the brand). Open-source substitutes:
|
||||
- **Geometric sans** — *Inter* (400 / 500 / 600) is the closest stylistic match; `font-feature-settings: "ss01", "ss02"` enables the geometric alternates. *Satoshi* is a passable second choice.
|
||||
- **Monospace** — *JetBrains Mono* (400) at 12 – 13 px matches the technical voice. *IBM Plex Mono* is the second-best option.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px. The brand's `--geist-space` token is exactly 4 px and every captured value is a multiple of 4.
|
||||
- **Tokens**: `{spacing.xxs}` 4 px · `{spacing.xs}` 8 px · `{spacing.sm}` 12 px · `{spacing.md}` 16 px · `{spacing.lg}` 24 px · `{spacing.xl}` 32 px · `{spacing.2xl}` 40 px · `{spacing.3xl}` 48 px · `{spacing.4xl}` 64 px · `{spacing.5xl}` 96 px · `{spacing.6xl}` 128 px · `{spacing.section}` 192 px.
|
||||
- **Section padding**: marketing bands use `{spacing.4xl}` to `{spacing.5xl}` top/bottom. Hero bands stretch to `{spacing.section}` to give the mesh gradient room to breathe.
|
||||
- **Card interior padding**: marketing cards sit at `{spacing.lg}` to `{spacing.xl}`; template-grid cards stay tighter at `{spacing.md}` because they sit in a denser grid.
|
||||
- **Inline gap**: button rows, nav rows, and chip rows use `{spacing.sm}` to `{spacing.md}` between siblings. The brand's `--geist-gap` is exactly 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- **Max width**: ~1400 px (`--ds-page-width`); the legacy `--geist-page-width` is 1200 px and still appears on some marketing surfaces. Content centres with horizontal gutters of `{spacing.lg}` 24 px on desktop, `{spacing.md}` 16 px on mobile.
|
||||
- **Column patterns**:
|
||||
- Three-feature row: 3-up at desktop, 1-up at mobile (rows like "Web Apps / Composable Commerce / Multi-tenant Platforms").
|
||||
- Tab pill row: 5-up centred row of `tab-ghost` pills.
|
||||
- Template-grid cluster: 5-up at desktop, scaling to 1-up at mobile.
|
||||
- Pricing tier grid: 3-up at desktop with the middle tier polarity-flipped.
|
||||
- Logo strip: ~5 logos wide, single row.
|
||||
|
||||
### Whitespace Philosophy
|
||||
The mesh gradient does most of the heavy decorative lifting; whitespace separates the bands. Section spacing is generous — `{spacing.4xl}` to `{spacing.5xl}` between bands lets the gradient breathe. Inside a card, the headline/paragraph stack is tight (`{spacing.xs}` 8 px gap), then a wider gap before the CTA cluster. The page reads as engineered — large gaps + tight interior, never the other way around.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 600px | Hero stacks; nav collapses to hamburger; 3-up feature grids drop to 1-up; tab pill row enables horizontal scroll. |
|
||||
| Tablet | 600–959px | 3-up grids drop to 2-up; nav still horizontal. |
|
||||
| Desktop | 960–1199px | Full 3-up grids; pricing 3-up. |
|
||||
| Wide | 1200–1399px | Container caps at 1400 px content width. |
|
||||
| Ultra-wide | ≥ 1400px | Content stays centred at 1400 px; bands stretch edge-to-edge in colour but content holds the max-width. |
|
||||
|
||||
#### Touch Targets
|
||||
The `button-primary` pill renders at ~32 px tall in nav and ~48 px tall in marketing contexts. Marketing CTAs comfortably meet WCAG AAA at all breakpoints; nav buttons inflate touch area through `{spacing.xs}` padding on mobile to meet the 44 × 44 px floor.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- **Nav**: full link row + Ask AI / Log In / Sign Up pills at desktop. Collapses to logo + hamburger at mobile with the menu opening as a full-overlay.
|
||||
- **Hero**: mesh gradient stays centred; headline + body stack vertically at all breakpoints (the brand doesn't use a split-hero pattern).
|
||||
- **Three-feature row**: 3-up → 2-up → 1-up at the breakpoints above; cards keep their `{rounded.md}` 8 px shape across all viewports.
|
||||
- **Pricing card grid**: 3-up at desktop, vertical stack at mobile with `pricing-card-featured` always sitting in the middle.
|
||||
- **Template grid**: 5-up → 3-up → 2-up → 1-up. Each `template-card` keeps its 16:9 aspect on the image.
|
||||
|
||||
#### Image Behavior
|
||||
- **Mesh gradient**: rendered as inline SVG or canvas-painted gradient; scales fluidly with the hero container; never crops, never tiles.
|
||||
- **Customer logos**: rendered as monochrome SVGs in the logo strip; consistent 24 px height.
|
||||
- **Code editor mockup**: dark `{colors.primary}` rectangle with mono text rendered inside; treated as an image at the layout level.
|
||||
- **Template thumbnails**: 16:9 landscape inside `{rounded.md}` card chrome; lazy-loaded; consistent grayscale palette in the placeholder state.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Full-bleed hero bands and the polarity-flipped dark sections. |
|
||||
| Level 1 — Inset Hairline | `0 0 0 1px #00000014` inset 1 px border. | Default card chrome — the brand's universal "you can see this card" cue. |
|
||||
| Level 2 — Subtle Drop | `0px 1px 1px #00000005, 0px 2px 2px #0000000a` plus inset hairline. | Slightly elevated cards (template-grid, marketing-card). |
|
||||
| Level 3 — Soft Stack | `0px 2px 2px #0000000a, 0px 8px 8px -8px #0000000a` plus inset hairline. | The "medium" elevation — feature-grid cards. |
|
||||
| Level 4 — Float Stack | `0px 2px 2px #0000000a, 0px 8px 16px -4px #0000000a` plus inset hairline. | "Large" elevation — pricing cards, callout panels. |
|
||||
| Level 5 — Modal | `0px 1px 1px #00000005, 0px 8px 16px -4px #0000000a, 0px 24px 32px -8px #0000000f` plus inset hairline. | Modal / dialog surfaces and dropdown menus. |
|
||||
|
||||
The brand uses STACKED shadows — multiple small offsets layered to fake natural light — never a single 8-px-blur generic drop. Inset hairline rings are always added so the card edge stays crisp.
|
||||
|
||||
### Decorative Depth
|
||||
- **Mesh gradient as atmospheric depth**: the hero's multi-stop gradient is the brand's only "atmospheric" effect — applied as a flat 2-D backdrop rather than a 3-D illustration.
|
||||
- **Polarity-flipped dark band as section-depth**: switching the surface from `{colors.canvas-soft}` to `{colors.primary}` (the deep ink) is the brand's chief depth cue between bands.
|
||||
- **Inset-shadow + drop-shadow combo**: the cards' combination of an inset 1 px ring and a multi-stop drop produces a "card sits on the page" effect without ever feeling material-heavy.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed hero / footer bands. |
|
||||
| `{rounded.xs}` | 4px | Tightest inline pill — the `nav-cta-signup` 6-px-radius button (mapped to `xs/sm`). |
|
||||
| `{rounded.sm}` | 6px | The brand's `--geist-radius` token — base UI radius for in-app buttons, form inputs, dropdown menus. |
|
||||
| `{rounded.md}` | 8px | The brand's `--geist-marketing-radius` token — feature cards, template cards. |
|
||||
| `{rounded.lg}` | 12px | Slightly larger card chrome (pricing-card variants). |
|
||||
| `{rounded.xl}` | 16px | Largest card chrome — when a card hosts a hero image cap. |
|
||||
| `{rounded.pill-sm}` | 64px | Tab-ghost pills inside the "AI Apps / Web Apps / Ecommerce / Marketing / Platforms" row. |
|
||||
| `{rounded.pill}` | 100px | The marketing CTA pill — `button-primary`, `button-secondary`, "Start Deploying" pill. |
|
||||
| `{rounded.full}` | 9999px | Icon-button circular containers, nav-link ghost pills. |
|
||||
|
||||
### Photography Geometry
|
||||
- **Mesh gradient**: full-bleed 2-D atmospheric backdrop, never cropped to a frame; treated as the page's wallpaper.
|
||||
- **Customer logos**: monochrome SVG, consistent 24 px height in a flex row.
|
||||
- **Code editor mockup**: 16:10 dark rectangle, `{rounded.md}` corners.
|
||||
- **Template thumbnails**: 16:9 landscape inside `{rounded.md}` chrome.
|
||||
- **Showcase imagery**: 2:1 or 16:9 inside `{rounded.lg}` to `{rounded.xl}` chrome with a stacked shadow.
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary White (Shadow-bordered)**
|
||||
- Background: `#ffffff`
|
||||
- Text: `#171717`
|
||||
- Padding: 0px 6px (minimal — content-driven width)
|
||||
- Radius: 6px (subtly rounded)
|
||||
- Shadow: `rgb(235, 235, 235) 0px 0px 0px 1px` (ring-border)
|
||||
- Hover: background shifts to `var(--ds-gray-1000)` (dark)
|
||||
- Focus: `2px solid var(--ds-focus-color)` outline + `var(--ds-focus-ring)` shadow
|
||||
- Use: Standard secondary button
|
||||
**`button-primary`** — the canonical 100-px-radius black pill, marketing scale.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.button-lg}`, padding `0px {spacing.sm}` 12 px, shape `{rounded.pill}` 100 px. Renders ~48 px tall when paired with the marketing flex layout.
|
||||
|
||||
**Primary Dark (Inferred from Geist system)**
|
||||
- Background: `#171717`
|
||||
- Text: `#ffffff`
|
||||
- Padding: 8px 16px
|
||||
- Radius: 6px
|
||||
- Use: Primary CTA ("Start Deploying", "Get Started")
|
||||
**`button-secondary`** — the white pill paired with the black primary inside marketing bands.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same typography + padding as `button-primary`, shape `{rounded.pill}`.
|
||||
|
||||
**Pill Button / Badge**
|
||||
- Background: `#ebf5ff` (tinted blue)
|
||||
- Text: `#0068d6`
|
||||
- Padding: 0px 10px
|
||||
- Radius: 9999px (full pill)
|
||||
- Font: 12px weight 500
|
||||
- Use: Status badges, tags, feature labels
|
||||
**`button-primary-sm`** — the smaller-scale primary pill used inside nav and pricing-card CTAs.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label set in `{typography.button-md}` (14 px / 500), shape `{rounded.pill}`.
|
||||
|
||||
**Large Pill (Navigation)**
|
||||
- Background: transparent or `#171717`
|
||||
- Radius: 64px–100px
|
||||
- Use: Tab navigation, section selectors
|
||||
**`button-secondary-sm`** — the smaller-scale white pill paired with `button-primary-sm`.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same typography + shape as `button-primary-sm`.
|
||||
|
||||
**`tab-ghost`** — the centred-row tab pill ("AI Apps / Web Apps / Ecommerce / Marketing / Platforms").
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, label set in `{typography.body-sm}`, padding `0px {spacing.md}`, shape `{rounded.pill-sm}` 64 px.
|
||||
|
||||
**`icon-button-circular`** — the circular icon container (often a "?" or arrow inside).
|
||||
- Background `{colors.canvas}`, dark icon, 1 px solid hairline border, shape `{rounded.full}`.
|
||||
|
||||
**Nav CTAs:**
|
||||
|
||||
**`nav-cta-signup`** — the small black "Sign Up" button in the nav row.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label `{typography.body-sm-strong}`, padding `0px {spacing.xs}`, height 28 px, shape `{rounded.sm}` 6 px (the brand's `--geist-radius`).
|
||||
|
||||
**`nav-cta-login`** — the white "Log In" button in the nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same typography / height / shape as `nav-cta-signup`.
|
||||
|
||||
**`nav-cta-ask-ai`** — the small "Ask AI" button with a faint border.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border (extracted as `0px solid rgb(235, 235, 235)`), same typography / height / shape.
|
||||
|
||||
### Cards & Containers
|
||||
- Background: `#ffffff`
|
||||
- Border: via shadow — `rgba(0, 0, 0, 0.08) 0px 0px 0px 1px`
|
||||
- Radius: 8px (standard), 12px (featured/image cards)
|
||||
- Shadow stack: `rgba(0,0,0,0.08) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 2px, #fafafa 0px 0px 0px 1px`
|
||||
- Image cards: `1px solid #ebebeb` with 12px top radius
|
||||
- Hover: subtle shadow intensification
|
||||
|
||||
**`card-marketing`** — the canonical marketing feature card (3-up section cards).
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}` 24 px, shape `{rounded.md}` 8 px (the `--geist-marketing-radius`). Carries Level 3 soft-stack shadow.
|
||||
|
||||
**`card-marketing-large`** — the larger marketing card used for "compute model" / "AI Gateway" callouts.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.lg}` 12 px. Carries Level 4 float-stack shadow.
|
||||
|
||||
**`card-soft`** — the soft-tinted card used inside cluster groups (lighter than canvas-soft).
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.md}`.
|
||||
|
||||
**`template-card`** — the deploy-template card in the "Deploy your first app" grid.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md}` 16 px, shape `{rounded.md}` 8 px. Hosts a 16:9 thumbnail at the top.
|
||||
|
||||
**`code-editor-mockup`** — the dark code-preview surface inside marketing bands.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, body in `{typography.code}` (13 px / Geist Mono), padding `{spacing.lg}` 24 px, shape `{rounded.md}` 8 px.
|
||||
|
||||
**`pricing-card`** — the default pricing-tier card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.xl}` 32 px, shape `{rounded.lg}` 12 px. Inside: tier name in `{typography.display-md}`, price in `{typography.display-xl}`, feature list in `{typography.body-md}` rows, CTA at the bottom.
|
||||
|
||||
**`pricing-card-featured`** — the polarity-flipped "Pro" tier card.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, same shape + padding as `pricing-card`. CTA inverts to `button-secondary-sm` (white pill on black card).
|
||||
|
||||
### Inputs & Forms
|
||||
- Radio: standard styling with focus `var(--ds-gray-200)` background
|
||||
- Focus shadow: `1px 0 0 0 var(--ds-gray-alpha-600)`
|
||||
- Focus outline: `2px solid var(--ds-focus-color)` — consistent blue focus ring
|
||||
- Border: via shadow technique, not traditional border
|
||||
|
||||
**`form-input`** — the canonical text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, body in `{typography.body-sm}` (14 px), padding `0px {spacing.sm}`, height 40 px (the brand's `--geist-form-height`), shape `{rounded.sm}` 6 px.
|
||||
|
||||
**`form-input-sm`** — small-height variant (32 px tall) for tight forms.
|
||||
- Same as `form-input` but height 32 px (the `--geist-form-small-height`).
|
||||
|
||||
**`form-input-lg`** — large-height variant (48 px tall) for hero CTAs.
|
||||
- Same as `form-input` but height 48 px (the `--geist-form-large-height`); body in `{typography.body-md}` 16 px.
|
||||
|
||||
### Navigation
|
||||
- Clean horizontal nav on white, sticky
|
||||
- Vercel logotype left-aligned, 262x52px
|
||||
- Links: Geist 14px weight 500, `#171717` text
|
||||
- Active: weight 600 or underline
|
||||
- CTA: dark pill buttons ("Start Deploying", "Contact Sales")
|
||||
- Mobile: hamburger menu collapse
|
||||
- Product dropdowns with multi-level menus
|
||||
|
||||
### Image Treatment
|
||||
- Product screenshots with `1px solid #ebebeb` border
|
||||
- Top-rounded images: `12px 12px 0px 0px` radius
|
||||
- Dashboard/code preview screenshots dominate feature sections
|
||||
- Soft gradient backgrounds behind hero images (pastel multi-color)
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, height 64 px (the brand's `--header-height`), padding `{spacing.sm} {spacing.lg}`. Layout: logo left, link row centre, "Ask AI / Log In / Sign Up" cluster right.
|
||||
|
||||
### Distinctive Components
|
||||
**`nav-link`** — the centred link row inside `nav-bar`.
|
||||
- Text `{colors.body}`, set in `{typography.body-sm}`, padding `{spacing.xs} {spacing.sm}`, shape `{rounded.full}` (ghost pill — visible only on hover or active, but the radius is documented).
|
||||
|
||||
**Workflow Pipeline**
|
||||
- Three-step horizontal pipeline: Develop → Preview → Ship
|
||||
- Each step has its own accent color: Blue → Pink → Red
|
||||
- Connected with lines/arrows
|
||||
- The visual metaphor for Vercel's core value proposition
|
||||
**`footer`** — the bottom 4-column nav.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.4xl} {spacing.lg}`. Eyebrow column labels in `{typography.caption-mono}` (uppercase mono effect); link rows in `{typography.body-sm}`.
|
||||
|
||||
**Trust Bar / Logo Grid**
|
||||
- Company logos (Perplexity, ChatGPT, Cursor, etc.) in grayscale
|
||||
- Horizontal scroll or grid layout
|
||||
- Subtle `#ebebeb` border separation
|
||||
### Signature Components
|
||||
|
||||
**Metric Cards**
|
||||
- Large number display (e.g., "10x faster")
|
||||
- Geist 48px weight 600 for the metric
|
||||
- Description below in gray body text
|
||||
- Shadow-bordered card container
|
||||
**`hero-band`** — the white hero with the mesh gradient backdrop.
|
||||
- Background `{colors.canvas}` (or `{colors.canvas-soft}` on some surfaces), text `{colors.ink}`, padding `{spacing.4xl} {spacing.lg}`. Inside: a small mono badge above the headline, the headline in `{typography.display-xl}` (sentence-case, period-terminated), a body lead in `{typography.body-lg}`, then a CTA row with `button-primary` + `button-secondary`. The mesh gradient sits behind, scaled to occupy roughly the top half of the band.
|
||||
|
||||
## 5. Layout Principles
|
||||
**`feature-mesh-band`** — the secondary section that hosts a mesh-gradient atmospheric backdrop with feature copy on top.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.lg}`. Section headline in `{typography.display-lg}`; supporting body in `{typography.body-md}`.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 1px, 2px, 3px, 4px, 5px, 6px, 8px, 10px, 12px, 14px, 16px, 32px, 36px, 40px
|
||||
- Notable gap: jumps from 16px to 32px — no 20px or 24px in primary scale
|
||||
**`showcase-band-light`** — a soft-canvas section ("Deploy your first app in seconds").
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.lg}`.
|
||||
|
||||
### Grid & Container
|
||||
- Max content width: approximately 1200px
|
||||
- Hero: centered single-column with generous top padding
|
||||
- Feature sections: 2–3 column grids for cards
|
||||
- Full-width dividers using `border-bottom: 1px solid #171717`
|
||||
- Code/dashboard screenshots as full-width or contained with border
|
||||
**`showcase-band-dark`** — the polarity-flipped dark band ("A compute model for all workloads").
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.5xl} {spacing.lg}`. Section headline in `{typography.display-lg}` (white on black). Often contains a `code-editor-mockup` flush with the band.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Gallery emptiness**: Massive vertical padding between sections (80px–120px+). The white space IS the design — it communicates that Vercel has nothing to prove and nothing to hide.
|
||||
- **Compressed text, expanded space**: The aggressive negative letter-spacing on headlines is counterbalanced by generous surrounding whitespace. The text is dense; the space around it is vast.
|
||||
- **Section rhythm**: White sections alternate with white sections — there's no color variation between sections. Separation comes from borders (shadow-borders) and spacing alone.
|
||||
**`logo-strip`** — the customer-logo wrapping row near the top of the page.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.lg} {spacing.xl}`. Logos rendered as monochrome SVGs at consistent height.
|
||||
|
||||
### Border Radius Scale
|
||||
- Micro (2px): Inline code snippets, small spans
|
||||
- Subtle (4px): Small containers
|
||||
- Standard (6px): Buttons, links, functional elements
|
||||
- Comfortable (8px): Cards, list items
|
||||
- Image (12px): Featured cards, image containers (top-rounded)
|
||||
- Large (64px): Tab navigation pills
|
||||
- XL (100px): Large navigation links
|
||||
- Full Pill (9999px): Badges, status pills, tags
|
||||
- Circle (50%): Menu toggle, avatar containers
|
||||
**`badge-secondary`** — the small inline metadata pill ("New", "Beta", "Live").
|
||||
- Background `{colors.canvas-soft}`, text `{colors.body}`, body in `{typography.caption}`, padding `0px {spacing.xs}`, shape `{rounded.full}`.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
**`banner-marketing`** — the "Introducing X" announcement pill at the top of pages.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.body}`, body in `{typography.body-sm}`, padding `{spacing.xs} {spacing.sm}`, shape `{rounded.full}`.
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow | Page background, text blocks |
|
||||
| Ring (Level 1) | `rgba(0,0,0,0.08) 0px 0px 0px 1px` | Shadow-as-border for most elements |
|
||||
| Light Ring (Level 1b) | `rgb(235,235,235) 0px 0px 0px 1px` | Lighter ring for tabs, images |
|
||||
| Subtle Card (Level 2) | Ring + `rgba(0,0,0,0.04) 0px 2px 2px` | Standard cards with minimal lift |
|
||||
| Full Card (Level 3) | Ring + Subtle + `rgba(0,0,0,0.04) 0px 8px 8px -8px` + inner `#fafafa` ring | Featured cards, highlighted panels |
|
||||
| Focus (Accessibility) | `2px solid hsla(212, 100%, 48%, 1)` outline | Keyboard focus on all interactive elements |
|
||||
**`link-inline`** — body-copy inline links.
|
||||
- Text `{colors.link}` (`#0070f3`), body in `{typography.body-md}`, underlined.
|
||||
|
||||
**Shadow Philosophy**: Vercel has arguably the most sophisticated shadow system in modern web design. Rather than using shadows for elevation in the traditional Material Design sense, Vercel uses multi-value shadow stacks where each layer has a distinct architectural purpose: one creates the "border" (0px spread, 1px), another adds ambient softness (2px blur), another handles depth at distance (8px blur with negative spread), and an inner ring (`#fafafa`) creates the subtle highlight that makes the card "glow" from within. This layered approach means cards feel built, not floating.
|
||||
### Examples (illustrative)
|
||||
|
||||
### Decorative Depth
|
||||
- Hero gradient: soft, pastel multi-color gradient wash behind hero content (barely visible, atmospheric)
|
||||
- Section borders: `1px solid #171717` (full dark line) between major sections
|
||||
- No background color variation — depth comes entirely from shadow layering and border contrast
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use Geist Sans with aggressive negative letter-spacing at display sizes (-2.4px to -2.88px at 48px)
|
||||
- Use shadow-as-border (`0px 0px 0px 1px rgba(0,0,0,0.08)`) instead of traditional CSS borders
|
||||
- Enable `"liga"` on all Geist text — ligatures are structural, not optional
|
||||
- Use the three-weight system: 400 (body), 500 (UI), 600 (headings)
|
||||
- Apply workflow accent colors (Red/Pink/Blue) only in their workflow context
|
||||
- Use multi-layer shadow stacks for cards (border + elevation + ambient + inner highlight)
|
||||
- Keep the color palette achromatic — grays from `#171717` to `#ffffff` are the system
|
||||
- Use `#171717` instead of `#000000` for primary text — the micro-warmth matters
|
||||
- Reserve `{colors.primary}` (`#171717`) for primary CTAs across the page. Black ink IS the conversion target.
|
||||
- Use `{rounded.pill}` 100 px for every marketing-scale CTA and `{rounded.sm}` 6 px for nav-scale buttons. The two pill scales coexist deliberately.
|
||||
- Set every headline in `{typography.display-*}` weight 600, sentence-case, often period-terminated. Aggressive negative tracking is part of the voice.
|
||||
- Use the brand mesh gradient as atmospheric decoration at hero scale only — never miniaturise it to an icon, never reduce to a single colour.
|
||||
- Layer stacked shadows (multiple small offsets with inset hairline) rather than single heavy drops. The brand's elevation is calmer than Material.
|
||||
- Cycle page surfaces in `{colors.canvas-soft}` → `{colors.canvas}` → `{colors.primary}` polarity-flipped bands; the dark band IS the depth cue.
|
||||
- Set every code block and technical eyebrow in `{typography.code}` / `{typography.caption-mono}`. Mono is the voice of the platform.
|
||||
|
||||
### Don't
|
||||
- Don't use positive letter-spacing on Geist Sans — it's always negative or zero
|
||||
- Don't use weight 700 (bold) on body text — 600 is the maximum, used only for headings
|
||||
- Don't use traditional CSS `border` on cards — use the shadow-border technique
|
||||
- Don't introduce warm colors (oranges, yellows, greens) into the UI chrome
|
||||
- Don't apply the workflow accent colors (Ship Red, Preview Pink, Develop Blue) decoratively
|
||||
- Don't use heavy shadows (> 0.1 opacity) — the shadow system is whisper-level
|
||||
- Don't increase body text letter-spacing — Geist is designed to run tight
|
||||
- Don't use pill radius (9999px) on primary action buttons — pills are for badges/tags only
|
||||
- Don't skip the inner `#fafafa` ring in card shadows — it's the glow that makes the system work
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile Small | <400px | Tight single column, minimal padding |
|
||||
| Mobile | 400–600px | Standard mobile, stacked layout |
|
||||
| Tablet Small | 600–768px | 2-column grids begin |
|
||||
| Tablet | 768–1024px | Full card grids, expanded padding |
|
||||
| Desktop Small | 1024–1200px | Standard desktop layout |
|
||||
| Desktop | 1200–1400px | Full layout, maximum content width |
|
||||
| Large Desktop | >1400px | Centered, generous margins |
|
||||
|
||||
### Touch Targets
|
||||
- Buttons use comfortable padding (8px–16px vertical)
|
||||
- Navigation links at 14px with adequate spacing
|
||||
- Pill badges have 10px horizontal padding for tap targets
|
||||
- Mobile menu toggle uses 50% radius circular button
|
||||
|
||||
### Collapsing Strategy
|
||||
- Hero: display 48px → scales down, maintains negative tracking proportionally
|
||||
- Navigation: horizontal links + CTAs → hamburger menu
|
||||
- Feature cards: 3-column → 2-column → single column stacked
|
||||
- Code screenshots: maintain aspect ratio, may horizontally scroll
|
||||
- Trust bar logos: grid → horizontal scroll
|
||||
- Footer: multi-column → stacked single column
|
||||
- Section spacing: 80px+ → 48px on mobile
|
||||
|
||||
### Image Behavior
|
||||
- Dashboard screenshots maintain border treatment at all sizes
|
||||
- Hero gradient softens/simplifies on mobile
|
||||
- Product screenshots use responsive images with consistent border radius
|
||||
- Full-width sections maintain edge-to-edge treatment
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary CTA: Vercel Black (`#171717`)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Heading text: Vercel Black (`#171717`)
|
||||
- Body text: Gray 600 (`#4d4d4d`)
|
||||
- Border (shadow): `rgba(0, 0, 0, 0.08) 0px 0px 0px 1px`
|
||||
- Link: Link Blue (`#0072f5`)
|
||||
- Focus ring: Focus Blue (`hsla(212, 100%, 48%, 1)`)
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on white background. Headline at 48px Geist weight 600, line-height 1.00, letter-spacing -2.4px, color #171717. Subtitle at 20px Geist weight 400, line-height 1.80, color #4d4d4d. Dark CTA button (#171717, 6px radius, 8px 16px padding) and ghost button (white, shadow-border rgba(0,0,0,0.08) 0px 0px 0px 1px, 6px radius)."
|
||||
- "Design a card: white background, no CSS border. Use shadow stack: rgba(0,0,0,0.08) 0px 0px 0px 1px, rgba(0,0,0,0.04) 0px 2px 2px, #fafafa 0px 0px 0px 1px. Radius 8px. Title at 24px Geist weight 600, letter-spacing -0.96px. Body at 16px weight 400, #4d4d4d."
|
||||
- "Build a pill badge: #ebf5ff background, #0068d6 text, 9999px radius, 0px 10px padding, 12px Geist weight 500."
|
||||
- "Create navigation: white sticky header. Geist 14px weight 500 for links, #171717 text. Dark pill CTA 'Start Deploying' right-aligned. Shadow-border on bottom: rgba(0,0,0,0.08) 0px 0px 0px 1px."
|
||||
- "Design a workflow section showing three steps: Develop (text color #0a72ef), Preview (#de1d8d), Ship (#ff5b4f). Each step: 14px Geist Mono uppercase label + 24px Geist weight 600 title + 16px weight 400 description in #4d4d4d."
|
||||
|
||||
### Iteration Guide
|
||||
1. Always use shadow-as-border instead of CSS border — `0px 0px 0px 1px rgba(0,0,0,0.08)` is the foundation
|
||||
2. Letter-spacing scales with font size: -2.4px at 48px, -1.28px at 32px, -0.96px at 24px, normal at 14px
|
||||
3. Three weights only: 400 (read), 500 (interact), 600 (announce)
|
||||
4. Color is functional, never decorative — workflow colors (Red/Pink/Blue) mark pipeline stages only
|
||||
5. The inner `#fafafa` ring in card shadows is what gives Vercel cards their subtle inner glow
|
||||
6. Geist Mono uppercase for technical labels, Geist Sans for everything else
|
||||
- Don't introduce a sixth accent colour. The brand operates with ink + gray + the four-pair gradient palette; new accents flatten the voice.
|
||||
- Don't render headlines in all-caps. Sentence-case + negative tracking is non-negotiable.
|
||||
- Don't drop a single heavy drop-shadow on cards. The brand's elevation is built from stacked small offsets + inset hairline rings.
|
||||
- Don't render the brand gradient at icon scale or in a single-colour reduced form. The gradient lives at hero scale only.
|
||||
- Don't promote the geometric sans to weight 700. The brand's display ceiling is 600.
|
||||
- Don't pair the marketing 100-px pill CTA shape with the 6-px nav radius on the same screen — pick a scale and stay there.
|
||||
- Don't set body paragraphs in the mono face. The mono is for code + technical labels only.
|
||||
|
||||
@ -1,423 +1,538 @@
|
||||
# Design System Inspired by Vodafone
|
||||
---
|
||||
version: alpha
|
||||
name: Vodafone Inspired
|
||||
description: An inspired interpretation of Vodafone's design language — a telecom super-brand whose web surface alternates between editorial photography hero bands with massive uppercase display headlines and clean white content bands, anchored by the company's signature scarlet red CTA and the proprietary Vodafone display sans set at impossibly heavy 800 weight.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#e60000"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#25282b"
|
||||
body: "#7e7e7e"
|
||||
mute: "#bebebe"
|
||||
canvas: "#ffffff"
|
||||
canvas-soft: "#f2f2f2"
|
||||
on-dark: "#ffffff"
|
||||
|
||||
Vodafone's corporate web system carries the confident, broadcast-scale presence of a global telecom brand — built around a single, fiercely-owned brand red and a restrained, editorial layout that lets imagery and type carry the emotional weight. Every page opens the same way: a cinematic dark hero image behind a towering, tight-tracked uppercase display headline ("EVERYONE. CONNECTED.", "INVESTORS", "OUR BUSINESS") followed by a deep red full-width band that acts as a chapter break, then a crisp white editorial grid or a near-black section reserved for institutional content (share ticker, global map, ESG data). The voice is institutional but human: warm documentary photography — cable-laying crews, coral reefs, pine forests, urban twilight — photographed with color-graded realism and set against clean neutral surfaces that never compete with the content.
|
||||
typography:
|
||||
display-hero:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 144px
|
||||
fontWeight: 800
|
||||
lineHeight: 114px
|
||||
letterSpacing: -1px
|
||||
display-xxl:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 126px
|
||||
fontWeight: 800
|
||||
lineHeight: 113px
|
||||
letterSpacing: -1px
|
||||
display-xl:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 90px
|
||||
fontWeight: 800
|
||||
lineHeight: 84px
|
||||
display-lg:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 300
|
||||
lineHeight: 52px
|
||||
display-md:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 40px
|
||||
fontWeight: 300
|
||||
lineHeight: 44px
|
||||
display-sm:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 700
|
||||
lineHeight: 40px
|
||||
display-xs:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 700
|
||||
lineHeight: 24px
|
||||
eyebrow-uppercase:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 800
|
||||
lineHeight: 24px
|
||||
body-lg:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 22px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-md:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
body-md-strong:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 600
|
||||
lineHeight: 28px
|
||||
body-sm:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-sm-strong:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 700
|
||||
lineHeight: 22px
|
||||
caption:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
caption-strong:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 700
|
||||
lineHeight: 21px
|
||||
caption-uppercase:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 600
|
||||
lineHeight: 16px
|
||||
letterSpacing: 0.5691px
|
||||
button-md:
|
||||
fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
|
||||
The typography system is the signature. A custom Vodafone display face runs all the way up to 144px in heavy 800-weight uppercase with negative tracking, and it holds that voice consistently across every page template. Body copy sits in a calm 16-18px mid-weight rhythm. This dual scale — monumental at the top, almost quiet at the bottom — creates the "corporate newsroom" feeling: every page reads like the front of a national paper whose masthead happens to be red.
|
||||
rounded:
|
||||
none: 0px
|
||||
xs: 1px
|
||||
sm: 6px
|
||||
card: 6px
|
||||
pill-md: 32px
|
||||
pill-lg: 60px
|
||||
full: 9999px
|
||||
|
||||
Surface treatment is disciplined and predictable: a three-surface pass of white (editorial canvas) → Vodafone red (band dividers, CTA buttons, the famous speech-mark logo) → near-black charcoal (footer, share-ticker panel, global-impact map). There is almost no decorative shadow, almost no gradient, and almost no rounded-corner softness. Edges are small and clinical (2px and 6px), buttons operate as a two-tier system — tight 2px rectangles for utility/form actions, and fully-rounded 60px pills for primary content CTAs. This is a design system that trusts the brand color to do the heavy lifting and gets out of its way everywhere else.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.lg} {spacing.3xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-sm}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
borderColor: "{colors.primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill-lg}"
|
||||
padding: "{spacing.md} {spacing.2xl}"
|
||||
button-outline-red:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.primary}"
|
||||
borderColor: "{colors.primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill-lg}"
|
||||
padding: "{spacing.md} {spacing.2xl}"
|
||||
button-outline-dark:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill-lg}"
|
||||
padding: "{spacing.md} {spacing.2xl}"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.canvas}"
|
||||
rounded: "{rounded.full}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
badge-chip:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.caption-strong}"
|
||||
rounded: "{rounded.pill-md}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
card-hero:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-sm}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.display-hero}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
hero-band-red:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
content-band-light:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
speechmark-logo-orb:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
divider-on-dark:
|
||||
borderColor: "{colors.on-dark}"
|
||||
footer:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-dark}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default tier card. Mirrors card-content chrome with canvas-soft surface and a hairline border."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.mute}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured tier — polarity-flipped to ink with white text and white pill CTA inside."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-product-selector:
|
||||
description: "Tariff-tier picker — repurposed as the brand's plan selector with badge-chip chips inside the frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — line items per tariff add-on, light hairline dividers."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
item-divider: "{colors.mute}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table cell chrome. Header uses caption-uppercase mono-style eyebrow; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption-uppercase}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.mute}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Mirrors card-content chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as card-content; brand uses scrim, not card shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame on canvas-soft with generous interior padding."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.card}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — card-content shape with caption-strong body."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Vodafone is a global telecom super-brand and its web surface delivers exactly that posture: heroic editorial photography, occasionally cropping a portrait so tight only an eye line and a phone hand are visible, with a single colossal uppercase headline floating on top in the brand's proprietary heavy display weight. The page reads like a campaign poster more than a corporate site, then breaks into a calmer content rhythm of light-canvas story cards and a single red marker (the iconic speechmark logo) drawing the eye to the brand's centre of gravity. There is no second accent colour competing — the entire decorative palette is `{colors.primary}` Vodafone red, near-black `{colors.ink}`, and the surrounding white and grayscale neutrals.
|
||||
|
||||
Type is the second decisive voice. Vodafone's custom display sans (extracted as `Vodafone`) carries every headline at impossibly heavy weight 800 in upper case for hero scale (`{typography.display-hero}` 144 px, `{typography.display-xxl}` 126 px) and at lighter weight 300 for the sub-displays that follow. Body text stays in the same family at weight 400 with neutral tracking. The contrast between display weight 800 and display weight 300 IS the brand's typographic story: a shout, then a calm sentence.
|
||||
|
||||
Every interactive CTA renders as a generously rounded pill (`{rounded.pill-lg}` 60 px) — Vodafone has never used a square button on its marketing surface in years, and the brand's pill scale ladder runs from 32 px (badge pills) through 60 px (CTA pills) up to 9999 px (icon circular containers). Cards stay gentler at `{rounded.card}` 6 px.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Vodafone Red (`#e60000`) is the single dominant accent — used for CTAs, dividers, band sections, the speech-mark logo, and the rotated "IMPACT" brand-mark type on the sustainability map
|
||||
- Monumental uppercase display type (up to 144px, weight 800, negative letter-spacing) paired with calm 16-18px body copy
|
||||
- A universal page rhythm: dark atmospheric hero → monumental uppercase headline → full-width red band → white editorial canvas → dark charcoal institutional panel → charcoal footer
|
||||
- Two-tier button system: tight 2px-radius rectangles for utility actions, fully-pill 60px buttons for primary content CTAs (both equally primary, selected by context)
|
||||
- Documentary photography (people, infrastructure, cities, nature) dominates over illustration; no stock-icon noise
|
||||
- Near-absence of shadows and gradients — hierarchy comes from type weight, color blocks, and spacing rather than elevation
|
||||
- Deep charcoal surface (`#25282b`) is reused as the footer AND the institutional data panel (share ticker, world map) — a single material for anything formal and numeric
|
||||
- A single primary CTA color `{colors.primary}` (`#e60000`) — Vodafone Red. Pill-filled for primary, pill-outline for secondary. No third button variant.
|
||||
- Massive uppercase display weight 800 (`{typography.display-hero}` and siblings) is the brand's signature. The 300-weight headline siblings (`{typography.display-lg}` / `{typography.display-md}`) handle calmer secondary moments.
|
||||
- The `speechmark-logo-orb` — a red square hosting Vodafone's quotation-mark icon — is the only piece of decorative chrome that's not a CTA. It anchors the brand's centre of every page.
|
||||
- Pill geometry on every interactive shape — `{rounded.pill-lg}` 60 px for buttons, `{rounded.pill-md}` 32 px for inline badges. Card chrome stays at `{rounded.card}` 6 px.
|
||||
- A two-band page rhythm — `{colors.ink}` dark hero / `{colors.canvas}` light content. No mid-band greys; the brand uses surface contrast, not soft neutrals, for elevation.
|
||||
- Editorial photography (real portraits, real cities, real cabling) is the only consistent decorative system — no illustration, no atmospheric gradients.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
### Brand & Accent
|
||||
- **Vodafone Red** (`{colors.primary}` — `#e60000`): The single brand accent. Every primary CTA pill, every speechmark logo, every conversion target. The most iconic red in telecom — never desaturated, never used at scale for body fills (reserved for high-attention surfaces).
|
||||
|
||||
- **Vodafone Red** (`#e60000`): The brand's single, non-negotiable signature — used for primary CTA backgrounds, the speech-mark logo, full-bleed band dividers between editorial sections, tag-pill outlines, and the rotated brand-mark type that labels the global-impact map. This red must never be substituted or tinted; it is the identity.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The default light content background.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#f2f2f2`): A near-white tint used as the badge-chip background.
|
||||
- **Ink** (`{colors.ink}` — `#25282b`): The brand's near-black surface — used as the dark hero band, the nav background, and the footer fill. Doubles as the primary text color on light surfaces.
|
||||
|
||||
### Secondary & Accent
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#25282b`): Every heading and body paragraph on light surfaces.
|
||||
- **Body** (`{colors.body}` — `#7e7e7e`): Secondary body text on light surfaces — captions, metadata, supporting copy.
|
||||
- **Mute** (`{colors.mute}` — `#bebebe`): The lowest-priority text color — placeholder text, low-key footer links.
|
||||
- **On Dark** (`{colors.on-dark}` — `#ffffff`): All text on `{colors.ink}` surfaces (hero, footer, nav).
|
||||
|
||||
- **Pure White** (`#ffffff`): The dominant editorial canvas — page background, card backgrounds, reversed text on dark or red surfaces, and circular icon-button fills.
|
||||
- **Signal Blue** (`#3860be`): Reserved for inline text links in their resting state (underlined), providing a calm accessible blue that reads clearly against both white and dark surfaces.
|
||||
- **Deep Brand Red Shade** (`#ac1811`): A darker red appears on quiet label chips (notably on the sustainability page) — used sparingly for low-prominence tag elements that need red identity without drawing primary attention.
|
||||
### Semantic
|
||||
The brand does not maintain a separate semantic palette. The primary red doubles as validation / destructive signal when needed; success / warning use are reserved for in-product contexts and are not part of the documented marketing system.
|
||||
|
||||
### Surface & Background
|
||||
|
||||
- **Canvas White** (`#ffffff`): The primary page and card surface. Every editorial module sits on this canvas.
|
||||
- **Light Neutral** (`#f2f2f2`): Used for filled neutral pill-badge backgrounds and quiet UI chrome where full white would disappear against the canvas.
|
||||
- **Charcoal Institutional Panel** (`#25282b`): The same color used for text is reused as a full-width dark surface for the footer, the share-ticker panel, and the global-impact map section. It transforms the page into a "data mode" environment.
|
||||
- **Translucent White Overlay** (`rgba(255,255,255,0.1)`): A soft glass tint used for pill buttons that sit on dark hero imagery — lets the photo breathe through the button.
|
||||
|
||||
### Neutrals & Text
|
||||
|
||||
- **Charcoal Headline** (`#25282b`): All heading text on light surfaces and the charcoal surface color itself — a near-black with a faint cool tint, never pure black.
|
||||
- **Secondary Body Grey** (`#7e7e7e`): Body copy, meta text, and secondary labels — a true mid-grey that reads as unemphatic but still legible.
|
||||
- **Form Text Grey** (`#333333`): Borders on input-style ghost buttons and the text color inside them.
|
||||
- **Disabled Grey** (`#bebebe`): Inactive chip text on subtle ghost-style controls.
|
||||
- **Translucent White Divider** (`rgba(255,255,255,0.25)`): Hairline column dividers on dark institutional panels (footer columns, map legend rows).
|
||||
|
||||
### Semantic & Accent
|
||||
|
||||
- **Surface Red Band** (`#e60000`): The same brand red deployed as a full-width band between editorial sections — functions as a chapter divider and a visual amplifier for the brand. Appears on every page template.
|
||||
- **Tag Pill Red Border** (`#e60000`): 1px outline on light tag pills, letting the brand color touch small UI without drowning card content.
|
||||
|
||||
### Gradient System
|
||||
|
||||
Vodafone's design is intentionally gradient-free. The only tonal variation is a subtle photographic vignette on hero imagery (dim coral reefs, pine forests, cable-laying crews, urban twilight), where the image itself — not a CSS gradient — provides the tonal ramp. No linear gradients are used on buttons, cards, or surfaces.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
A single custom face carries the entire system: **Vodafone**, the brand's proprietary display sans. The face spans weights 300 (light), 400 (regular), 600, 700, and 800 — every role in the system pulls from this one family. There is no mono companion; technical labels (rare on the marketing surface) borrow the same face at smaller sizes.
|
||||
|
||||
- **Primary**: `Vodafone` (custom corporate sans-serif)
|
||||
- **Fallback stack**: `Vodafone, "Helvetica Neue", Arial, sans-serif`
|
||||
- **Icon font**: `icomoon` — carries pictograph glyphs at 18px/24px/48px fixed sizes
|
||||
- **Rendering**: `font-smoothing: antialiased` across the board; OpenType features are not aggressively used — the design relies on weight and tracking, not stylistic alternates
|
||||
The icomoon icon-font is loaded for proprietary glyphs but does not render as a typographic role.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|--------|-------------|----------------|-------|
|
||||
| Display / Hero XL | 144px | 800 | 0.79 | -1px | Uppercase; the signature "EVERYONE. CONNECTED." treatment |
|
||||
| Display / Hero L | 126px | 800 | 0.90 | -1px | Uppercase; used when the hero headline is longer |
|
||||
| Display / Hero M | 90px | 800 | 0.93 | — | Uppercase; secondary hero or full-bleed section heads |
|
||||
| Display / Impact | 70px | 800 | 1.17 | -1px | Sustainability section numeric / callout scale |
|
||||
| H1 — Light | 48px | 300 | 1.08 | — | Section headlines set in light weight for editorial calm |
|
||||
| H1 — Bold | 48px | 800 | 1.00 | -1px | Institutional data headers (share price on charcoal panel) |
|
||||
| H2 — Light | 40px | 300 | 1.10 | — | Sub-section headers |
|
||||
| H2 — Bold | 40px | 700 | 1.10 | — | Denser sub-section headers |
|
||||
| H3 — Bold | 32px | 700 | 1.25 | — | Card cluster titles and feature intros |
|
||||
| H4 — Bold | 24px | 700 | 1.00 | — | Card titles (news, feature, article modules) |
|
||||
| H4 — Light | 24px | 300 | 1.42 | — | Intro paragraphs on investor / sustainability pages |
|
||||
| H5 — Bold | 20px | 700 | 1.30 | — | Compact module titles and side callouts |
|
||||
| Lead Body | 20px | 400 | 1.40 | — | Introductory paragraphs under large headlines |
|
||||
| Body Large | 18px | 400 | 1.56 | — | Long-form article body and prominent copy |
|
||||
| Body Bold | 18px | 600 | 1.56 | — | Emphasized inline phrases |
|
||||
| Body Base | 16px | 400 | 1.38 | — | Default paragraph size |
|
||||
| Label Uppercase | 16px | 800 | 1.50 | — | Uppercase navigational labels |
|
||||
| Eyebrow / Date | 14px | 400/700 | 1.43 | — | Article date stamps and meta (14 APR 2026) |
|
||||
| Tag Pill | 14px | 700 | 1.50 | — | Badge text inside red-outlined pills |
|
||||
| Caption Uppercase | 14px | 400 | 1.14 | — | Uppercase meta label |
|
||||
| Caption | 12px | 500 | 2.00 | — | Footer meta, legal lines |
|
||||
| Micro Label | 12px | 600 | 1.33 | — | Uppercase tiny labels on badges and counters |
|
||||
| Button Primary | 14.4px | 700 | 1.00 | 0.144px | Primary filled button label |
|
||||
| Button Compact | 12px | 700 | 1.00 | 0.12px | Compact button label |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-hero}` | 144px | 800 | 114px | -1px | The hero stencil (`"STAY CONNECTED"`) — uppercase, ultra-tight tracking, brand's signature size. |
|
||||
| `{typography.display-xxl}` | 126px | 800 | 113px | -1px | Slightly smaller hero variant. |
|
||||
| `{typography.display-xl}` | 90px | 800 | 84px | 0 | Mid-hero scale. |
|
||||
| `{typography.display-lg}` | 48px | 300 | 52px | 0 | Section-headline sub-display in the lighter weight. |
|
||||
| `{typography.display-md}` | 40px | 300 | 44px | 0 | Sub-section displays. |
|
||||
| `{typography.display-sm}` | 32px | 700 | 40px | 0 | Card headings, story-card titles. |
|
||||
| `{typography.display-xs}` | 24px | 700 | 24px | 0 | Inline display micro-headings. |
|
||||
| `{typography.eyebrow-uppercase}` | 16px | 800 | 24px | 0 | Uppercase eyebrow tags above section headlines. |
|
||||
| `{typography.body-lg}` | 22px | 400 | 24px | 0 | Lead body paragraphs. |
|
||||
| `{typography.body-md}` | 18px | 400 | 28px | 0 | Default paragraph body. |
|
||||
| `{typography.body-md-strong}` | 18px | 600 | 28px | 0 | Bolded inline body. |
|
||||
| `{typography.body-sm}` | 16px | 400 | 20px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 16px | 700 | 22px | 0 | Bolded short body. |
|
||||
| `{typography.caption}` | 14px | 400 | 16px | 0 | Captions, fine print. |
|
||||
| `{typography.caption-strong}` | 14px | 700 | 21px | 0 | Bold captions, badge labels. |
|
||||
| `{typography.caption-uppercase}` | 12px | 600 | 16px | 0.57px | Uppercase metadata, footer eyebrows. |
|
||||
| `{typography.button-md}` | 18px | 400 | 28px | 0 | Default button label. |
|
||||
|
||||
### Principles
|
||||
|
||||
- **Dual-scale drama**: the system deliberately stretches from 144px down to 8.5px without mid-range showing off. The result is a clear corporate hierarchy — monumental for brand moments, calm for reading.
|
||||
- **Uppercase display, mixed-case body**: all the largest display sizes are uppercase with negative tracking, while everything 48px and below is sentence case with normal tracking.
|
||||
- **Weight spread**: only three real weights do the work — 800 (display), 700 (bold bodies, buttons, tags), and 400 (reading body). A lighter 300-weight is used for editorial-style 40px/48px headlines when a calmer voice is wanted.
|
||||
- **No italics, no decorative letterspacing on body**: the body system is deliberately neutral so the display work can shout.
|
||||
- **Rotated brand-mark type**: on the sustainability section, the word "IMPACT" is set in brand red at a large display size and rotated 90° to run vertically along the edge of a dark world-map panel — a distinctive typographic flourish that the template uses to label its institutional data surfaces.
|
||||
- **Weight 800 + uppercase = hero voice.** This is the entire reason the brand reads as a billboard rather than a tech site.
|
||||
- **Weight 300 = the calmer secondary voice.** Used at 40 – 48 px for sub-displays; never below 24 px to keep legibility.
|
||||
- **Single family throughout.** The brand never mixes a serif or a mono into the typographic system. Consistency is the calm.
|
||||
- **Tracking stays tight at display sizes.** `-1px` at 144 px is the brand's calibration; reverting to neutral tracking softens the stencil look.
|
||||
|
||||
### Note on Font Substitutes
|
||||
The Vodafone display sans is proprietary. Open-source substitutes:
|
||||
- **Display sans** — *Inter* weight 800 at hero scale with `letter-spacing: -1px` is the closest free match. *Geist* weight 700–800 is the second-best.
|
||||
- **Lighter display weight (300)** — *Inter* weight 300 holds its line-height well at 48 px display sizes.
|
||||
|
||||
The Vodafone corporate typeface is proprietary. When recreating the look in open systems, substitute with **Inter** at weights 400/600/800, or **Neue Haas Grotesk** if available. Inter needs its letter-spacing reduced by roughly 1-2% at display sizes (80px+) to approximate the Vodafone face's tight tracking; its line-height should be set to 0.85-0.95 for the uppercase display tier.
|
||||
|
||||
## 4. Component Stylings
|
||||
|
||||
### Buttons
|
||||
|
||||
Vodafone operates a genuine two-tier primary button system. Both tiers are used as primary calls to action — the difference is context (form/chrome vs editorial/content), not hierarchy.
|
||||
|
||||
**Primary Red Rectangle** (utility / form CTA — "Accept All Cookies", "Subscribe")
|
||||
- Background: Vodafone Red (`#e60000`)
|
||||
- Text: Pure White (`#ffffff`), 14.4px, weight 700, letter-spacing 0.144px
|
||||
- Padding: 12px vertical, 10px horizontal
|
||||
- Border: 1px solid Vodafone Red (`#e60000`)
|
||||
- Border radius: 2px — deliberately sharp-cornered
|
||||
- Default state: solid red fill with crisp 2px corners
|
||||
- Active state: brief opacity drop to `0.9` on press
|
||||
|
||||
**Primary Red Pill** (editorial / content CTA — "Link to Our approach to ESG", "EXPLORE CONNECTING PEOPLE")
|
||||
- Background: Vodafone Red (`#e60000`)
|
||||
- Text: Pure White (`#ffffff`), 14.4px, weight 700, letter-spacing 0.144px
|
||||
- Padding: 16px uniform
|
||||
- Border radius: 60px — fully pill-shaped
|
||||
- Default state: solid red fill with rounded ends
|
||||
- Active state: brief opacity drop to `0.9` on press
|
||||
|
||||
**Ghost White Rectangle** (secondary form action)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Form Text Grey (`#333333`), 14.4px, weight 700
|
||||
- Padding: 12px vertical, 10px horizontal
|
||||
- Border: 1px solid Form Text Grey (`#333333`)
|
||||
- Border radius: 2px
|
||||
- Default state: white fill with charcoal outline
|
||||
- Active state: opacity `0.9` on press
|
||||
|
||||
**Glass Pill** (sits on dark hero imagery — secondary content CTA)
|
||||
- Background: Pure White at 10% opacity (`rgba(255,255,255,0.1)`)
|
||||
- Text: Pure White (`#ffffff`), weight 700
|
||||
- Padding: 8px vertical, 16px horizontal
|
||||
- Border radius: 24px — fully pill-shaped
|
||||
- Default state: soft translucent pill lets the photo breathe through
|
||||
|
||||
**Content Ghost Pill** (inline within editorial cards — low-emphasis content CTA)
|
||||
- Background: Black at 5% opacity (`rgba(0,0,0,0.05)`)
|
||||
- Text: Vodafone Red (`#e60000`), 14.4px, weight 700
|
||||
- Padding: 15px uniform
|
||||
- Border radius: 60px — fully pill-shaped
|
||||
- Default state: nearly transparent pill with red text
|
||||
|
||||
**Icon Control Button** (video play/pause, carousel arrows, close)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Icon color: Charcoal Headline (`#25282b`)
|
||||
- Border radius: 50% — perfect circle
|
||||
- Outline: 1px solid white, used for focus indication
|
||||
- Size: typically 32-40px diameter
|
||||
|
||||
### Cards & Containers
|
||||
|
||||
**News / Editorial Card** (homepage article tile)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Border radius: 6px (applied to image corners and card container)
|
||||
- Shadow: none — cards rely on spacing and the image aspect ratio for separation
|
||||
- Internal layout: 16:9 image on top → 12px gap → eyebrow row (date + tag pill) → 8px gap → H4 Bold title → 16px card padding on sides and bottom
|
||||
- The card image uses `object-fit: cover` and rounded top corners (6px top-left/top-right)
|
||||
|
||||
**Asymmetric Corner Card** (featured homepage cards)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Border radius: `0px 6px 0px 0px` — a deliberate single-corner-rounded shape that echoes the Vodafone speech-mark logo's curved geometry
|
||||
- No shadow, no border — the asymmetric radius itself is the visual signature
|
||||
|
||||
**Circular Portrait / Pictogram Container** (sustainability page)
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Border radius: 100% — perfect circle
|
||||
- Used for ESG pictograms and executive portraits inside the institutional content area
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
Vodafone's corporate site does not expose many inline form controls on the homepage, but button-style inputs follow these rules:
|
||||
|
||||
- Background: Pure White (`#ffffff`)
|
||||
- Text: Form Text Grey (`#333333`), 16px, weight 400
|
||||
- Border: 1px solid Form Text Grey (`#333333`)
|
||||
- Border radius: 2px
|
||||
- Padding: 12px 10px
|
||||
- Error state (when shown): the 1px border shifts to Vodafone Red (`#e60000`) and error message text inherits the same red at 12px weight 600
|
||||
|
||||
### Navigation
|
||||
|
||||
**Top bar**
|
||||
- Background: transparent over hero imagery; solid white (`#ffffff`) on scroll or interior pages
|
||||
- Height: approximately 64px desktop, 56px mobile
|
||||
- Logo: Vodafone speech-mark, 40×40px red circle with a white "speech-mark" cut-out, left-aligned
|
||||
- Nav links: 16px weight 400 Charcoal Headline (`#25282b`) on white; reversed to white when sitting on dark hero imagery
|
||||
- Right-side utility: small icon links (search, locale, menu) rendered as 24px icomoon glyphs
|
||||
- On interior pages (Investors, Sustainable Business), the top bar shows additional secondary-nav row: "Vodafone Business / Vodafone Foundation / Our site" labels, aligned right
|
||||
|
||||
**Mobile collapse**
|
||||
- At approximately 768px the horizontal nav collapses into a hamburger
|
||||
- Mobile menu opens as a full-width overlay with white surface, 18px weight 400 link rows, 16px vertical padding per row
|
||||
|
||||
### Image Treatment
|
||||
|
||||
- **Hero images**: full-bleed, dark atmospheric photography (coral reefs, pine forests, cable crews, urban twilight) with a natural vignette or cool-tone color grade — no CSS overlay is needed because the imagery itself is pre-graded
|
||||
- **Card thumbnails**: 16:9 aspect ratio, 6px top corner radius matching the card
|
||||
- **Square editorial images**: 1:1 ratio used in feature modules, always 6px corner radius
|
||||
- **Round portraits**: 100% (perfect circle) for executive headshots and ESG pictograms
|
||||
- **Loading**: lazy-loading triggers on scroll; images stabilize within ~200ms of entering the viewport
|
||||
- **No decorative borders on images** — the card radius does all the framing work
|
||||
|
||||
### Tag Pills / Badges
|
||||
|
||||
Two distinct pill styles appear:
|
||||
|
||||
**Outlined Red Pill** (used inline on article card metadata, e.g., "EMPOWERING PEOPLE")
|
||||
- Background: Pure White at 80% opacity (`rgba(255,255,255,0.8)`)
|
||||
- Text: Near-black at 80% opacity (`rgba(0,0,0,0.8)`), 12px, weight 600, uppercase
|
||||
- Border: 1px solid Vodafone Red (`#e60000`)
|
||||
- Padding: 6px
|
||||
- Border radius: small-rounded (roughly 2px)
|
||||
|
||||
**Filled Neutral Pill** (quieter tags)
|
||||
- Background: Light Neutral (`#f2f2f2`)
|
||||
- Text: Charcoal Headline (`#25282b`), 14px, weight 700
|
||||
- Padding: 4px 12px
|
||||
- Border radius: 32px — fully pill-shaped
|
||||
|
||||
### Red Divider Band
|
||||
|
||||
A signature reusable component that appears on every page template: a full-width band of Vodafone Red (`#e60000`) that runs horizontally across the page to separate the monumental hero from the editorial body beneath it. It carries no text and no controls — it simply is the brand's way of saying "new chapter." Typical height: 40-80px.
|
||||
|
||||
### Share Ticker Panel (Investor pages)
|
||||
|
||||
A distinctive institutional component that anchors the investor template:
|
||||
- Background: Charcoal Institutional Panel (`#25282b`)
|
||||
- Large numeric display: share price set in 48px weight 800 white type with negative letter-spacing (e.g., "116.05 GBX")
|
||||
- Metadata row: delay notice (e.g., "15-min delayed") and timestamp in 14px weight 400 secondary grey text
|
||||
- Layout: sits as a horizontal strip above the footer, spans the full content width
|
||||
- Hairline dividers (`rgba(255,255,255,0.25)`) separate the ticker from the footer columns
|
||||
|
||||
### Global Impact Map Panel (Sustainability pages)
|
||||
|
||||
A signature reusable component that anchors the sustainability template:
|
||||
- Background: Charcoal Institutional Panel (`#25282b`)
|
||||
- A dark minimal world-map illustration in slightly lighter grey
|
||||
- Red circular markers (`#e60000`) plotted on geographic locations where the brand operates
|
||||
- Vertically-rotated brand word "IMPACT" set in Vodafone Red at large display size (weight 800, uppercase, 90° rotated) running along one edge of the panel — this is the template's signature typographic move
|
||||
- Small legend with red markers and white uppercase labels at the top-left
|
||||
|
||||
### Footer
|
||||
|
||||
A universal component across all page templates:
|
||||
- Background: Charcoal Institutional Panel (`#25282b`)
|
||||
- Layout: 4-column link grid (Our company / Investors / Vodafone websites / Share price) followed by a "Connect with us" social row and legal/privacy line
|
||||
- Logo: red speech-mark repeats bottom-right at 32-40px
|
||||
- Column header type: 16px weight 800 uppercase white
|
||||
- Column link type: 14px weight 400 white, stacked vertically with 12px row spacing
|
||||
- Divider hairlines: `rgba(255,255,255,0.25)` between column group and legal row
|
||||
|
||||
## 5. Layout Principles
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
|
||||
Base unit: **8px**. The scale accommodates both tight UI (1px, 2px, 4px) and generous editorial rhythm (16px, 20px, 24px, 32px). Two values (`32px` and `38px`) appear across every page in the analysis, making them the template's universal rhythm constants.
|
||||
|
||||
| Token | Value | Typical Use |
|
||||
|-------|-------|-------------|
|
||||
| 2xs | 2px | Hairline separators |
|
||||
| xs | 4px | Icon-to-text gap in tight controls |
|
||||
| sm | 8px | Base rhythm unit |
|
||||
| md | 12px | Card internal padding, eyebrow-to-title gap |
|
||||
| base | 16px | Paragraph rhythm, card padding, pill button padding |
|
||||
| lg | 20px | Section-internal spacing |
|
||||
| xl | 24px | Card-to-card spacing, column gutters |
|
||||
| 2xl | 32px | Section intro-to-content breaks — universal constant |
|
||||
| 3xl | 38px | Band-to-next-section vertical push — universal constant |
|
||||
| section | 64-96px | Vertical rhythm between major editorial modules |
|
||||
- **Base unit**: 4 px (mostly multiples of 4; a few 5/7 px appear inside icon-padding compensation).
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px.
|
||||
- **Section padding**: hero bands and content bands use `{spacing.3xl}` 32 px gutters; vertical spacing inside hero is fluid (fill-the-band).
|
||||
- **Card interior padding**: story cards use `{spacing.lg}` 16 px around image + headline.
|
||||
- **Inline gap**: button rows and chip rows use `{spacing.md}` 12 px between siblings.
|
||||
|
||||
### Grid & Container
|
||||
|
||||
- **Max content width**: approximately 1440px on very large screens; articles and hero modules typically sit at 1200px
|
||||
- **Column pattern on cards**: 3-up or 4-up card grid at desktop (1200-1440px), 2-up at tablet (768-1024px), stacked 1-up at mobile (<768px)
|
||||
- **Horizontal padding**: 32px at desktop edge, 20px at tablet, 16px at mobile
|
||||
- **Gutters between cards**: 24px desktop, 16px mobile
|
||||
- **Institutional panel (share ticker, world map, footer)**: always full-bleed edge-to-edge at every breakpoint
|
||||
- Marketing content uses a wide container (effectively edge-to-edge with `{spacing.3xl}` gutters on desktop, shrinking on mobile).
|
||||
- Story-card grids: 2-up at desktop, 1-up at mobile.
|
||||
- Hero photography fills the viewport; the headline overlays at the top-left.
|
||||
|
||||
### Whitespace Philosophy
|
||||
The hero's massive display headline owns the whole top of the page; whitespace below is generous to let the second band breathe. Inside content cards, headline and copy hug close (`{spacing.sm}` 8 px gap), then a wider gap (`{spacing.3xl}`) before the next card. The footer band is dark and dense.
|
||||
|
||||
Vodafone's editorial canvas leans generous — whitespace is used as a visual palette cleanser between a monumental headline and the card grid or data panel that follows. Sections are separated by tall vertical rhythm (64-96px) plus the occasional red band that acts as both a separator and a brand signal. Within cards, spacing is tight and efficient (12-16px) so the photography can take the stage.
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 600px | Hero display scales down to ~64 px; story-card grid drops to 1-up; nav collapses to hamburger. |
|
||||
| Tablet | 600–1023px | Story-card grid 2-up; display headlines drop to 90 – 110 px. |
|
||||
| Desktop | 1024–1399px | Full display headline at 126 – 144 px; 2-up story grid. |
|
||||
| Ultra-wide | ≥ 1400px | Container caps at ~1400 px; bands stay edge-to-edge in colour. |
|
||||
|
||||
#### Touch Targets
|
||||
The `button-primary` pill renders at ~52 px tall (12 px vertical padding + 28 px line-height). All buttons comfortably meet WCAG AAA at every breakpoint.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- **Nav**: full link row at desktop. Collapses to a hamburger menu at mobile; the menu opens as a dark overlay with the same link list stacked.
|
||||
- **Hero**: the massive display headline scales fluidly. At mobile, the photography crop tightens to the figure's face only.
|
||||
- **Story-card grid**: 2-up → 1-up at the breakpoint above.
|
||||
- **Speechmark logo orb**: stays at consistent size relative to surrounding content; never shrinks below ~48 px.
|
||||
|
||||
#### Image Behavior
|
||||
- **Hero photography**: full-bleed 16:9 or 4:3 portraits at desktop; tighter crops at mobile.
|
||||
- **Story-card thumbnails**: 16:9 landscape inside `{rounded.card}` 6 px chrome.
|
||||
- **Speechmark orb**: always rendered as the red SVG quote-mark icon, never substituted.
|
||||
- **Logo bar (if present on partner pages)**: monochrome SVGs at consistent height.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default for most cards and panels — surface contrast does the elevation work. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.ink}` border. | Form inputs, the `divider-on-dark` between footer columns. |
|
||||
| Level 2 — Border on Dark | 1 px solid `{colors.on-dark}` border on `{colors.ink}` surfaces. | Outline buttons sitting on the dark hero band. |
|
||||
|
||||
The brand does not use soft drop shadows; depth comes from polarity-flip between `{colors.ink}` and `{colors.canvas}` bands.
|
||||
|
||||
### Decorative Depth
|
||||
- **Editorial photography**: the hero photo (real-person portrait or environment shot) is the brand's only true atmospheric effect.
|
||||
- **Speechmark logo orb as visual anchor**: the red orb hosting the quote-mark icon acts as a single point of focal-depth in the centre of the otherwise-flat content rhythm.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Typical Use |
|
||||
|-------|-------|-------------|
|
||||
| hairline | 1px | Inline text wraps, small badges |
|
||||
| button-tight | 2px | Primary and secondary rectangle button corners — the brand's utility-form look |
|
||||
| card | 6px | News cards, images, input fields |
|
||||
| asymmetric | `0px 6px 0px 0px` | Featured cards (top-right corner only) |
|
||||
| glass-pill | 24px | Translucent white pills sitting on dark hero imagery |
|
||||
| badge-pill | 32px | Filled neutral pill badges |
|
||||
| cta-pill | 60px | Primary red content CTAs — the brand's editorial button look |
|
||||
| circle | 50% | Icon buttons, carousel arrows, close controls |
|
||||
| portrait | 100% | Circular portraits and ESG pictograms |
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed hero bands, footer, banner strips. |
|
||||
| `{rounded.xs}` | 1px | Tightest inline indicator (rarely used). |
|
||||
| `{rounded.sm}` | 6px | The brand's canonical content radius — applied to images and inputs. |
|
||||
| `{rounded.card}` | 6px | Card chrome and image frames (alias for `sm`). |
|
||||
| `{rounded.pill-md}` | 32px | Badge / chip pills. |
|
||||
| `{rounded.pill-lg}` | 60px | The brand's signature CTA pill — every primary and secondary button. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers (e.g., video play/pause). |
|
||||
|
||||
## 6. Depth & Elevation
|
||||
### Photography Geometry
|
||||
- Hero portraits: edge-to-edge 16:9 or 4:3 with no internal frame.
|
||||
- Story-card thumbnails: 16:9 landscape inside `{rounded.card}` chrome.
|
||||
- Speechmark logo orb: square with `{rounded.sm}` corners (visually a tilted-square mark; the SVG mark itself fills the orb).
|
||||
|
||||
Vodafone's system is deliberately flat. There is almost no conventional box-shadow in the UI. Hierarchy is carried by color (red bands, charcoal institutional panels), typography weight (800 vs 400), and spacing.
|
||||
## Components
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| 0 — Surface | No shadow, no border | Default card, default section |
|
||||
| 1 — Outline | 1px solid border at low-opacity | Ghost buttons, outlined pills |
|
||||
| 2 — Inset Highlight | `inset 0 0 0 1px` on focus | Pressed / focused controls |
|
||||
| 3 — Photographic depth | The photography itself carries the depth | Hero imagery |
|
||||
| 4 — Surface shift | Charcoal institutional panel below a white editorial canvas | Share ticker / world map / footer |
|
||||
### Buttons
|
||||
|
||||
Shadow philosophy: Vodafone treats drop shadows as a distraction from brand clarity. The few extracted shadow tokens are reserved for inset focus rings. The dominant "elevation" in the system is a **color surface shift** — switching from the white editorial canvas to the charcoal institutional panel — rather than a lift-off drop shadow.
|
||||
**`button-primary`** — the red pill CTA, brand's primary conversion target.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, 1 px solid `{colors.primary}` border, label set in `{typography.button-md}`, padding `{spacing.md} {spacing.2xl}`, shape `{rounded.pill-lg}` 60 px.
|
||||
|
||||
### Decorative Depth
|
||||
**`button-outline-red`** — the secondary pill, red-text-on-white with red border.
|
||||
- Background `{colors.canvas}`, text `{colors.primary}`, 1 px solid `{colors.primary}` border, same label / padding / shape as `button-primary`.
|
||||
|
||||
The only decorative depth cues are:
|
||||
- Atmospheric dark hero photography that carries its own cinematic tonal depth (no CSS overlay needed)
|
||||
- The rotated vertical "IMPACT" wordmark on the sustainability map, which creates the illusion of a fourth wall alongside the map panel
|
||||
**`button-outline-dark`** — the tertiary pill, ink-text-on-white with ink border.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, same label / padding / shape.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`button-icon-circular`** — the round white icon button (video play / pause / chevron).
|
||||
- Background `{colors.canvas}`, ink icon, 1 px solid `{colors.canvas}` outline (effectively borderless), shape `{rounded.full}`.
|
||||
|
||||
### Cards & Containers
|
||||
|
||||
**`card-content`** — the default story-card chrome.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.card}` 6 px. Hosts a 16:9 thumbnail at the top + headline + caption.
|
||||
|
||||
**`card-hero`** — the slightly larger card variant used as the lead story.
|
||||
- Same chrome as `card-content` but headline scales to `{typography.display-sm}`.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the canonical text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, body in `{typography.body-sm}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 6 px.
|
||||
|
||||
### Navigation
|
||||
|
||||
**`nav-bar`** — the dark top nav, fixed to the page top.
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.lg} {spacing.3xl}`. Layout: logo left, link row right with login / search affordances.
|
||||
|
||||
**`nav-link`** — the link items inside `nav-bar`.
|
||||
- Text `{colors.on-dark}`, set in `{typography.body-sm}`.
|
||||
|
||||
**`footer`** — the dark footer band.
|
||||
- Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.3xl} {spacing.3xl}`. Body in `{typography.body-sm}`; column eyebrows in `{typography.caption-uppercase}`.
|
||||
|
||||
### Signature Components
|
||||
|
||||
**`hero-band-dark`** — the dark navy/ink hero band hosting the massive display headline.
|
||||
- Background `{colors.ink}` with full-bleed editorial photography overlay at reduced opacity; text `{colors.on-dark}`; padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-hero}` (uppercase, weight 800).
|
||||
|
||||
**`hero-band-red`** — the rare full-bleed red hero used on signature campaigns.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-xl}`.
|
||||
|
||||
**`content-band-light`** — the white content band that follows every hero.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.3xl}`. Section headline in `{typography.display-md}` or `{typography.display-lg}` (weight 300).
|
||||
|
||||
**`speechmark-logo-orb`** — the red square hosting Vodafone's quotation-mark icon. The brand's visual anchor.
|
||||
- Background `{colors.primary}`, white icon glyph, shape `{rounded.sm}`. Acts as a focal element between content bands, often near the centre of long pages.
|
||||
|
||||
**`badge-chip`** — the inline metadata pill used for category tags inside story cards.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, label in `{typography.caption-strong}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill-md}` 32 px.
|
||||
|
||||
**`divider-on-dark`** — the 1 px hairline used between sections / columns on dark surfaces.
|
||||
- 1 px solid `{colors.on-dark}` (often at 25 % opacity at the component level).
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
|
||||
- Use Vodafone Red (`#e60000`) as the single loudest element on any screen — one primary CTA per fold, one red band per editorial break
|
||||
- Set display headlines in uppercase 800-weight with tight negative tracking; let them run to 90-144px on desktop
|
||||
- Pair monumental display type with calm 16-18px body copy — the scale jump is the system
|
||||
- Switch the button radius based on context: 2px rectangles for form and utility actions, 60px pills for editorial content CTAs
|
||||
- Let documentary photography breathe at 16:9 or 1:1 on a 6px radius — no decorative borders, no heavy overlays
|
||||
- Use the red band as a full-width chapter divider between every hero and the content below it
|
||||
- Anchor every page with a charcoal institutional surface (`#25282b`) — the footer always, and on investor/sustainability pages extend the same color up to include the share ticker or the global-impact map
|
||||
- Respect the universal page rhythm: dark hero → red band → white editorial → charcoal institutional → charcoal footer
|
||||
- Reserve `{colors.primary}` Vodafone Red for primary CTAs and the `speechmark-logo-orb`. Every conversion target uses the red pill.
|
||||
- Set hero headlines in `{typography.display-hero}` weight 800 UPPERCASE with tight `-1px` tracking. That stencil look IS the brand voice.
|
||||
- Use `{rounded.pill-lg}` 60 px on every interactive pill. The brand never uses square corners on CTAs.
|
||||
- Cycle page surfaces in `{colors.ink}` dark hero → `{colors.canvas}` light content → `{colors.ink}` footer. Surface contrast is the depth cue.
|
||||
- Pair editorial portrait photography with the massive display headline overlay — that combination IS the brand's signature.
|
||||
- Render the speechmark logo orb at consistent size relative to surrounding content — it's the brand's centre of gravity on every page.
|
||||
|
||||
### Don't
|
||||
|
||||
- Don't introduce a second brand hue to rival Vodafone Red — no teals, no purples, no orange accents
|
||||
- Don't soften rectangle button corners beyond 2px, and don't shrink pill button corners below 60px — the two shapes are both load-bearing
|
||||
- Don't add drop shadows to cards or buttons — the system is intentionally flat and uses surface color to carry elevation
|
||||
- Don't use gradients on backgrounds, buttons, or text
|
||||
- Don't mix uppercase tracking on body text — uppercase is reserved for display, labels, and micro-labels
|
||||
- Don't use italics for emphasis — use weight 600/700 instead
|
||||
- Don't decorate headlines with colored underlines or highlights — the type does the work
|
||||
- Don't use pure black (`#000000`) for text or surfaces — always use Charcoal Headline (`#25282b`)
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
|
||||
The practical tiers observed across all three templates:
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | ≤ 600px | Nav collapses to hamburger; hero display drops to ~56-72px; cards stack 1-up |
|
||||
| Mobile Large | 601-767px | Hero display ~72-90px; cards still stack 1-up |
|
||||
| Tablet | 768-1023px | Nav re-expands; cards grid 2-up; hero display ~90-120px |
|
||||
| Laptop | 1024-1199px | Full nav; cards 3-up; hero display ~120-144px |
|
||||
| Desktop | 1200-1439px | Standard editorial layout; cards 3-up or 4-up |
|
||||
| Wide | ≥ 1440px | Content caps at 1440px; outer canvas padding grows |
|
||||
|
||||
### Touch Targets
|
||||
|
||||
All interactive controls meet a 44×44px minimum on mobile. Icon buttons use 40×40px circular hit areas which expand with 4px invisible padding on touch devices. Primary CTA buttons land at approximately 48×48px on mobile (16px top/bottom + text line for pills; 12px + text line for rectangles).
|
||||
|
||||
### Collapsing Strategy
|
||||
|
||||
- **Nav**: horizontal links collapse into a hamburger at 768px; the logo stays left-aligned at all widths
|
||||
- **Card grid**: 4-up → 3-up at 1200px → 2-up at 768px → 1-up at 600px, with gutters shrinking from 24px to 16px
|
||||
- **Hero display type**: step-reduces through 144 → 126 → 90 → 72 → 56px as viewports shrink
|
||||
- **Section padding**: 96px vertical at desktop, 64px at tablet, 48px at mobile
|
||||
- **Red divider bands**: remain full-width at every breakpoint; their vertical height compresses from ~80px at desktop to ~40px at mobile
|
||||
- **Institutional panels (share ticker / world map)**: on mobile, multi-column content restacks into a single vertical stream but the charcoal surface stays edge-to-edge
|
||||
- **Vertically-rotated "IMPACT" wordmark**: becomes a horizontal label or is dropped entirely on mobile where vertical space is limited
|
||||
|
||||
### Image Behavior
|
||||
|
||||
- Hero imagery: art-directed variant at mobile (tighter crop) versus desktop (wide atmospheric frame)
|
||||
- Card thumbnails: always 16:9 regardless of viewport; `loading="lazy"` is standard
|
||||
- Circular portraits: fixed at 80-120px diameter on desktop, shrinking to 64-80px on mobile
|
||||
- Logo: fixed at 40×40px across breakpoints (consistent brand mark size)
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
|
||||
- Primary CTA: "Vodafone Red (`#e60000`)"
|
||||
- Background: "Canvas White (`#ffffff`)"
|
||||
- Heading text: "Charcoal Headline (`#25282b`)"
|
||||
- Body text: "Secondary Body Grey (`#7e7e7e`)"
|
||||
- Institutional surface: "Charcoal Institutional Panel (`#25282b`)"
|
||||
- Inline link: "Signal Blue (`#3860be`)"
|
||||
- Quiet pill background: "Light Neutral (`#f2f2f2`)"
|
||||
|
||||
### Example Component Prompts
|
||||
|
||||
- "Create a primary red rectangle button: Vodafone Red (`#e60000`) background, pure white 14.4px weight 700 text, 2px border radius (sharp corners), 12px vertical × 10px horizontal padding. Use for form and utility actions. No shadow, no gradient."
|
||||
- "Create a primary red pill CTA: Vodafone Red (`#e60000`) background, pure white 14.4px weight 700 text, 60px border radius (fully pill-shaped), 16px uniform padding. Use for editorial content calls-to-action."
|
||||
- "Design an editorial news card: white background, 6px border radius, 16:9 image at the top, 12px eyebrow row containing a date and a red-outlined uppercase tag pill, then a 24px weight 700 Charcoal title. No shadow — spacing alone separates cards."
|
||||
- "Build a hero section: dark atmospheric photo as the full-bleed background, monumental uppercase headline at 144px weight 800 with -1px letter-spacing, single Vodafone Red pill CTA beneath it, no overlay gradient."
|
||||
- "Create a red divider band: full-width strip of Vodafone Red (`#e60000`), 64px tall on desktop and 40px on mobile, no text, no controls — it acts purely as a visual chapter break between editorial sections."
|
||||
- "Design an institutional data panel: full-bleed Charcoal Institutional Panel (`#25282b`) background, large numeric display at 48px weight 800 white with negative letter-spacing, 14px weight 400 grey meta row beneath. Use for share ticker or stats callout."
|
||||
- "Design a global impact map: Charcoal Institutional Panel (`#25282b`) background, minimal grey world-map illustration, red Vodafone-red circular markers on operational locations, the brand word 'IMPACT' set at large display size in brand red and rotated 90° to run vertically along one edge."
|
||||
|
||||
### Iteration Guide
|
||||
|
||||
When refining existing screens generated with this design system:
|
||||
|
||||
1. Focus on ONE component at a time — the system has few moving parts, so small refinements compound
|
||||
2. Reference specific color names and hex codes from this document when describing changes
|
||||
3. Use natural language ("sharper corners," "more generous vertical rhythm") alongside specific measurements
|
||||
4. When in doubt about radius, remember: 2px for form/utility buttons, 60px for editorial pills, 6px for cards, 50%/100% for icon and portrait circles
|
||||
5. Keep the brand rule absolute: only one Vodafone Red element should dominate any given fold
|
||||
|
||||
### Known Gaps
|
||||
|
||||
- Form input styles (text fields, dropdowns, toggles) are not exposed on these page templates; their specs are inferred from the ghost-button pattern and may need refinement when real forms are designed
|
||||
- The Vodafone corporate typeface is proprietary and cannot be reproduced exactly in open systems; Inter with tightened tracking at display sizes is the closest open substitute
|
||||
- Animation and transition timings are intentionally not documented — the site uses them sparingly and the values are not extractable from static analysis
|
||||
- The share ticker's exact number styling (separators, currency glyph) is documented from the investor-page screenshot; other regional variants may display differently
|
||||
- Don't introduce a second accent colour. The brand operates with red + ink + grayscale only.
|
||||
- Don't render headlines in sentence case at hero scale. Hero display IS uppercase weight 800.
|
||||
- Don't render the primary CTA as a square rectangle. The 60 px pill is non-negotiable.
|
||||
- Don't drop a soft drop-shadow on cards. The brand relies on surface-colour contrast, not shadow.
|
||||
- Don't substitute the speechmark logo orb with a wordmark or a different shape. The orb is the iconic mark.
|
||||
- Don't pair the weight 800 display face with letter-spacing 0 at 144 px — the `-1px` tracking is part of the brand's calibration.
|
||||
|
||||
@ -1,323 +1,521 @@
|
||||
# Design System Inspired by VoltAgent
|
||||
---
|
||||
version: alpha
|
||||
name: Voltagent Inspired
|
||||
description: An inspired interpretation of Voltagent's design language — a developer-focused AI agent engineering platform whose surface is an unrelenting near-black canvas broken only by a single electric-green brand accent, code-editor mockups inside the hero, and a precise grid of dark feature cards that read like a documentation site dressed as marketing.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#00d992"
|
||||
primary-soft: "#2fd6a1"
|
||||
primary-deep: "#10b981"
|
||||
on-primary: "#101010"
|
||||
ink: "#f2f2f2"
|
||||
ink-strong: "#ffffff"
|
||||
body: "#bdbdbd"
|
||||
mute: "#8b949e"
|
||||
hairline: "#3d3a39"
|
||||
hairline-soft: "#b8b3b0"
|
||||
canvas: "#101010"
|
||||
canvas-soft: "#1a1a1a"
|
||||
canvas-text-soft: "#f5f6f7"
|
||||
|
||||
VoltAgent's interface is a deep-space command terminal for the AI age — a developer-facing darkness built on near-pure-black surfaces (`#050507`) where the only interruption is the electric pulse of emerald green energy. The entire experience evokes the feeling of staring into a high-powered IDE at 2am: dark, focused, and alive with purpose. This is not a friendly SaaS landing page — it's an engineering platform that announces itself through code snippets, architectural diagrams, and raw technical confidence.
|
||||
typography:
|
||||
display-xl:
|
||||
fontFamily: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif
|
||||
fontSize: 60px
|
||||
fontWeight: 400
|
||||
lineHeight: 60px
|
||||
letterSpacing: -0.65px
|
||||
display-lg:
|
||||
fontFamily: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif
|
||||
fontSize: 36px
|
||||
fontWeight: 400
|
||||
lineHeight: 40px
|
||||
letterSpacing: -0.9px
|
||||
display-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 700
|
||||
lineHeight: 32px
|
||||
letterSpacing: -0.6px
|
||||
display-sm:
|
||||
fontFamily: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 600
|
||||
lineHeight: 28px
|
||||
eyebrow-mono:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 600
|
||||
lineHeight: 20px
|
||||
letterSpacing: 2.52px
|
||||
eyebrow-uppercase:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 600
|
||||
lineHeight: 28px
|
||||
letterSpacing: 0.45px
|
||||
body-lg:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
body-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 26px
|
||||
body-md-strong:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 600
|
||||
lineHeight: 24px
|
||||
body-sm:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-sm-strong:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 600
|
||||
lineHeight: 23px
|
||||
caption:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
caption-strong:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 500
|
||||
lineHeight: 16px
|
||||
code:
|
||||
fontFamily: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, monospace
|
||||
fontSize: 13px
|
||||
fontWeight: 400
|
||||
lineHeight: 18px
|
||||
code-strong:
|
||||
fontFamily: SFMono-Regular, Menlo, Monaco, Consolas, monospace
|
||||
fontSize: 13px
|
||||
fontWeight: 550
|
||||
lineHeight: 16px
|
||||
button-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 600
|
||||
lineHeight: 24px
|
||||
|
||||
The green accent (`#00d992`) is used with surgical precision — it glows from headlines, borders, and interactive elements like a circuit board carrying a signal. Against the carbon-black canvas, this green reads as "power on" — a deliberate visual metaphor for an AI agent engineering platform. The supporting palette is built entirely from warm-neutral grays (`#3d3a39`, `#8b949e`, `#b8b3b0`) that soften the darkness without introducing color noise, creating a cockpit-like warmth that pure blue-grays would lack.
|
||||
rounded:
|
||||
none: 0px
|
||||
xs: 4px
|
||||
sm: 6px
|
||||
md: 8px
|
||||
pill: 9999px
|
||||
full: 9999px
|
||||
|
||||
Typography leans on the system font stack for headings — achieving maximum rendering speed and native-feeling authority — while Inter carries the body and UI text with geometric precision. Code blocks use SFMono-Regular, the same font developers see in their terminals, reinforcing the tool's credibility at every scroll.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
4xl: 40px
|
||||
5xl: 48px
|
||||
6xl: 64px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.md} {spacing.3xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
button-outline-on-dark:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
button-ghost-green:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.primary-soft}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
button-pill-tag:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
card-feature:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
card-feature-emphasized:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
code-mockup:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.code}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
code-inline-chip:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.canvas-text-soft}"
|
||||
typography: "{typography.code}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xxs} {spacing.sm}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.5xl} {spacing.3xl}"
|
||||
content-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.5xl} {spacing.3xl}"
|
||||
green-divider-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
borderColor: "{colors.primary}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.4xl} {spacing.3xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Voltagent is an AI agent engineering platform built for developers, and the brand wears that audience proudly: a near-black `{colors.canvas}` (`#101010`) page background that runs edge-to-edge with no light-mode counterpart, a single electric-green accent (`{colors.primary}` `#00d992`) reserved for CTAs, status pills, and the brand lightning glyph, and a typography system that pairs sentence-case Inter with SF Mono for inline code and command snippets. The whole page reads like polished documentation that decided to also sell something.
|
||||
|
||||
The decorative system is restrained. There is no gradient mesh, no atmospheric backdrop, no illustration suite. Instead, the brand uses small typographic moments — a green code chip (`npx voltagent ...`), a 3-px outlined feature card sitting against the same near-black canvas, a green hairline divider between section bands — to mark its identity. The result is a page that feels engineered: every card has a hairline border, every snippet has a copy-to-clipboard button, every metric is rendered in a numeric monospace.
|
||||
|
||||
Type stays calm. Hero display sits at 60 px in regular weight with `-0.65 px` tracking — not a billboard headline, more like a documentation H1. Section headings step down to 36 px / 24 px in similar weights. Body copy is 16 px Inter at line-height 1.65 for the kind of legibility long-form devs expect. Uppercase eyebrows are common — `EVERYTHING YOU NEED` style mono-cap labels above section headlines — and they use Inter at weight 600 with wide positive tracking (`2.52 px` at 14 px).
|
||||
|
||||
**Key Characteristics:**
|
||||
- Carbon-black canvas (`#050507`) with warm-gray border containment (`#3d3a39`) — not cold or sterile
|
||||
- Single-accent identity: Emerald Signal Green (`#00d992`) as the sole chromatic energy source
|
||||
- Dual-typography system: system-ui for authoritative headings, Inter for precise UI/body text, SFMono for code credibility
|
||||
- Ultra-tight heading line-heights (1.0–1.11) creating dense, compressed power blocks
|
||||
- Warm neutral palette (`#3d3a39`, `#8b949e`, `#b8b3b0`) that prevents the dark theme from feeling clinical
|
||||
- Developer-terminal aesthetic where code snippets ARE the hero content
|
||||
- Green glow effects (`drop-shadow`, border accents) that make UI elements feel electrically alive
|
||||
- A single electric-green accent `{colors.primary}` (`#00d992`) carries every CTA, every status pill, and the brand's lightning logo. No second accent.
|
||||
- Dark canvas (`{colors.canvas}` `#101010`) is the only page surface — there is no light-mode rhythm; the entire site reads as one continuous dark surface broken by feature-card boundaries.
|
||||
- Hairline-bordered feature cards (`{colors.hairline}` `#3d3a39`, 1 px solid) are the brand's primary chrome — no shadows, no fills, just precise hairline rectangles.
|
||||
- A signature dashed-border accent (`1px dashed rgba(79, 93, 117, 0.4)`) appears between sections as a quiet rhythm cue — the brand's only ornamental line.
|
||||
- Inter + SF Mono pair carries every typographic role. SF Mono is reserved for code blocks, inline command snippets, and metric counters.
|
||||
- Buttons are tight 6 px rounded rectangles (not pills); only inline status tags use the 9999 px full pill.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Emerald Signal Green** (`#00d992`): The core brand energy — used for accent borders, glow effects, and the highest-signal interactive moments. This is the "power-on" indicator of the entire interface.
|
||||
- **VoltAgent Mint** (`#2fd6a1`): The button-text variant of the brand green — slightly warmer and more readable than pure Signal Green, used specifically for CTA text on dark surfaces.
|
||||
- **Tailwind Emerald** (`#10b981`): The ecosystem-standard green used at low opacity (30%) for subtle background tints and link defaults. Bridges VoltAgent's custom palette with Tailwind's utility classes.
|
||||
### Brand & Accent
|
||||
- **Electric Green** (`{colors.primary}` — `#00d992`): The single brand accent. Every primary CTA, every status pill, every "live" indicator, the brand's lightning glyph itself. Reserved.
|
||||
- **Primary Soft** (`{colors.primary-soft}` — `#2fd6a1`): A slightly more muted green used inside button-ghost variants and tooltip / focus indicators.
|
||||
- **Primary Deep** (`{colors.primary-deep}` — `#10b981`): The darker green used for inline link colour in body copy.
|
||||
|
||||
### Secondary & Accent
|
||||
- **Soft Purple** (`#818cf8`): A cool indigo-violet used sparingly for secondary categorization, code syntax highlights, and visual variety without competing with green.
|
||||
- **Cobalt Primary** (`#306cce`): Docusaurus primary dark — used in documentation contexts for links and interactive focus states.
|
||||
- **Deep Cobalt** (`#2554a0`): The darkest primary shade, reserved for pressed/active states in documentation UI.
|
||||
- **Ring Blue** (`#3b82f6`): Tailwind's ring color at 50% opacity — visible only during keyboard focus for accessibility compliance.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#101010`): The default near-black page background. The only surface mode in the brand's marketing system.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#1a1a1a`): A slightly lighter dark fill used inside code blocks and form inputs to mark them visually distinct against the canvas.
|
||||
- **Hairline** (`{colors.hairline}` — `#3d3a39`): 1 px solid borders — feature cards, buttons, dividers between rows. The brand's universal "edge" colour.
|
||||
- **Hairline Soft** (`{colors.hairline-soft}` — `#b8b3b0`): A lighter divider tint used in rare on-light secondary contexts.
|
||||
|
||||
### Surface & Background
|
||||
- **Abyss Black** (`#050507`): The landing page canvas — a near-pure black with the faintest warm undertone, darker than most "dark themes" for maximum contrast with green accents.
|
||||
- **Carbon Surface** (`#101010`): The primary card and button background — one shade lighter than Abyss, creating a barely perceptible elevation layer. Used across all contained surfaces.
|
||||
- **Warm Charcoal Border** (`#3d3a39`): The signature containment color — not a cold gray but a warm, almost brownish dark tone that prevents borders from feeling harsh against the black canvas.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#f2f2f2`): Default text colour on the dark canvas — slightly off-white to reduce contrast strain.
|
||||
- **Ink Strong** (`{colors.ink-strong}` — `#ffffff`): Pure-white text for hero headlines and high-emphasis copy.
|
||||
- **Body** (`{colors.body}` — `#bdbdbd`): Secondary text — supporting copy, body paragraphs in long-form sections.
|
||||
- **Mute** (`{colors.mute}` — `#8b949e`): Lowest-priority on-dark text — captions, fine print, footer secondary lines.
|
||||
- **Canvas Text Soft** (`{colors.canvas-text-soft}` — `#f5f6f7`): Used inside code mockups to keep code colour just slightly cooler than the surrounding body text.
|
||||
|
||||
### Neutrals & Text
|
||||
- **Snow White** (`#f2f2f2`): The primary text color on dark surfaces — not pure white (`#ffffff`) but a softened, eye-friendly off-white. The most-used color on the site (1008 instances).
|
||||
- **Pure White** (`#ffffff`): Reserved for the highest-emphasis moments — ghost button text and maximum-contrast headings. Used at low opacity (5%) for subtle overlay effects.
|
||||
- **Warm Parchment** (`#b8b3b0`): Secondary body text — a warm light gray with a slight pinkish undertone that reads as "paper" against the dark canvas.
|
||||
- **Steel Slate** (`#8b949e`): Tertiary text, metadata, timestamps, and de-emphasized content. A cool blue-gray that provides clear hierarchy below Warm Parchment.
|
||||
- **Fog Gray** (`#bdbdbd`): Footer links and supporting navigation text — brightens on hover to Pure White.
|
||||
- **Mist Gray** (`#dcdcdc`): Slightly brighter than Fog, used for secondary link text that transitions to bright green on hover.
|
||||
- **Near White** (`#eeeeee`): Highest-contrast secondary text, one step below Snow White.
|
||||
### Semantic
|
||||
The brand doesn't surface a separate error / warning palette in its public marketing pages — the underlying Docusaurus default semantic palette exists in the design system but is reserved for in-product / docs contexts. Validation cues on the marketing surface use the primary green for success and a muted body grey for missing states.
|
||||
|
||||
### Semantic & Accent
|
||||
- **Success Emerald** (`#008b00`): Deep green for success states and positive confirmations in documentation contexts.
|
||||
- **Success Light** (`#80d280`): Soft pastel green for success backgrounds and subtle positive indicators.
|
||||
- **Warning Amber** (`#ffba00`): Bright amber for warning alerts and caution states.
|
||||
- **Warning Pale** (`#ffdd80`): Softened amber for warning background fills.
|
||||
- **Danger Coral** (`#fb565b`): Vivid red for error states and destructive action warnings.
|
||||
- **Danger Rose** (`#fd9c9f`): Softened coral-pink for error backgrounds.
|
||||
- **Info Teal** (`#4cb3d4`): Cool teal-blue for informational callouts and tip admonitions.
|
||||
- **Dashed Border Slate** (`#4f5d75` at 40%): A muted blue-gray used exclusively for decorative dashed borders in workflow diagrams.
|
||||
|
||||
### Gradient System
|
||||
- **Green Signal Glow**: `drop-shadow(0 0 2px #00d992)` animating to `drop-shadow(0 0 8px #00d992)` — creates a pulsing "electric charge" effect on the VoltAgent bolt logo and interactive elements. The glow expands and contracts like a heartbeat.
|
||||
- **Warm Ambient Haze**: `rgba(92, 88, 85, 0.2) 0px 0px 15px` — a warm-toned diffused shadow that creates a soft atmospheric glow around elevated cards, visible at the edges without sharp boundaries.
|
||||
- **Deep Dramatic Elevation**: `rgba(0, 0, 0, 0.7) 0px 20px 60px` with `rgba(148, 163, 184, 0.1) 0px 0px 0px 1px inset` — a heavy, dramatic downward shadow paired with a faint inset slate ring for the most prominent floating elements.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Primary (Headings)**: `system-ui`, with fallbacks: `-apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol`
|
||||
- **Secondary (Body/UI)**: `Inter`, with fallbacks inheriting from system-ui stack. OpenType features: `"calt", "rlig"` (contextual alternates and required ligatures)
|
||||
- **Monospace (Code)**: `SFMono-Regular`, with fallbacks: `Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace`
|
||||
Two faces carry the system:
|
||||
1. **Inter** for every display, body, button, and link role. Weights 400 / 500 / 600 / 700 are the working set. Used with OpenType features `"calt"` and `"rlig"` enabled across the page so the geometric Inter ligatures and contextual alternates render correctly.
|
||||
2. **SF Mono** (`SFMono-Regular` with Menlo / Monaco / Consolas / Liberation Mono fallbacks) for inline code, command snippets, terminal mockups, and the brand's numeric counters. Weights 400 / 549 / 550 / 700 are present — the unusual 549 / 550 sub-bold weight gives the mono a "slightly heavier than regular" voice for emphasis.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display / Hero | system-ui | 60px (3.75rem) | 400 | 1.00 (tight) | -0.65px | Maximum impact, compressed blocks |
|
||||
| Section Heading | system-ui | 36px (2.25rem) | 400 | 1.11 (tight) | -0.9px | Tightest letter-spacing in the system |
|
||||
| Sub-heading | system-ui | 24px (1.50rem) | 700 | 1.33 | -0.6px | Bold weight for emphasis at this size |
|
||||
| Sub-heading Light | system-ui / Inter | 24px (1.50rem) | 300–400 | 1.33 | -0.6px | Light weight variant for softer hierarchy |
|
||||
| Overline | system-ui | 20px (1.25rem) | 600 | 1.40 | 0.5px | Uppercase transform, positive letter-spacing |
|
||||
| Feature Title | Inter | 20px (1.25rem) | 500–600 | 1.40 | normal | Card headings, feature names |
|
||||
| Overline Small | Inter | 18px (1.13rem) | 600 | 1.56 | 0.45px | Uppercase section labels |
|
||||
| Body / Button | Inter | 16px (1.00rem) | 400–600 | 1.50–1.65 | normal | Standard text, nav links, buttons |
|
||||
| Nav Link | Inter | 14.45px (0.90rem) | 500 | 1.65 | normal | Navigation-specific sizing |
|
||||
| Caption / Label | Inter | 14px (0.88rem) | 400–600 | 1.43–1.65 | normal | Descriptions, metadata, badge text |
|
||||
| Tag / Overline Tiny | system-ui | 14px (0.88rem) | 600 | 1.43 | 2.52px | Widest letter-spacing — reserved for uppercase tags |
|
||||
| Micro | Inter | 12px (0.75rem) | 400–500 | 1.33 | normal | Smallest sans-serif text |
|
||||
| Code Body | SFMono-Regular | 13–14px | 400–686 | 1.23–1.43 | normal | Inline code, terminal output, variable weight for syntax |
|
||||
| Code Small | SFMono-Regular | 11–12px | 400 | 1.33–1.45 | normal | Tiny code references, line numbers |
|
||||
| Code Button | monospace | 13px (0.81rem) | 700 | 1.65 | normal | Copy-to-clipboard button labels |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xl}` | 60px | 400 | 60px | -0.65px | Hero headline ("AI Agent Engineering Platform"). |
|
||||
| `{typography.display-lg}` | 36px | 400 | 40px | -0.9px | Section headlines. |
|
||||
| `{typography.display-md}` | 24px | 700 | 32px | -0.6px | Sub-section / card-title displays. |
|
||||
| `{typography.display-sm}` | 20px | 600 | 28px | 0 | Card titles in dense grids. |
|
||||
| `{typography.eyebrow-mono}` | 14px | 600 | 20px | 2.52px | UPPERCASE eyebrow tags ("EVERYTHING YOU NEED"). |
|
||||
| `{typography.eyebrow-uppercase}` | 18px | 600 | 28px | 0.45px | Larger uppercase eyebrows above hero subsections. |
|
||||
| `{typography.body-lg}` | 18px | 400 | 28px | 0 | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 26px | 0 | Default body paragraph. |
|
||||
| `{typography.body-md-strong}` | 16px | 600 | 24px | 0 | Bolded inline body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 14px | 600 | 23px | 0 | Bold caption / pill-tag labels. |
|
||||
| `{typography.caption}` | 12px | 400 | 16px | 0 | Fine print. |
|
||||
| `{typography.caption-strong}` | 12px | 500 | 16px | 0 | Bold caption. |
|
||||
| `{typography.code}` | 13px | 400 | 18px | 0 | Code blocks, inline command snippets. |
|
||||
| `{typography.code-strong}` | 13px | 550 | 16px | 0 | Emphasised inline code (the SF Mono "almost-bold" weight). |
|
||||
| `{typography.button-md}` | 16px | 600 | 24px | 0 | Button labels. |
|
||||
|
||||
### Principles
|
||||
- **System-native authority**: Display headings use system-ui rather than a custom web font — this means the largest text renders instantly (no FOIT/FOUT) and inherits the operating system's native personality. On macOS it's SF Pro, on Windows it's Segoe UI. The design accepts this variability as a feature, not a bug.
|
||||
- **Tight compression creates density**: Hero line-heights are extremely compressed (1.0) with negative letter-spacing (-0.65px to -0.9px), creating text blocks that feel like dense technical specifications rather than airy marketing copy.
|
||||
- **Weight gradient, not weight contrast**: The system uses a gentle 300→400→500→600→700 weight progression. Bold (700) is reserved for sub-headings and code-button emphasis. Most body text lives at 400–500, creating subtle rather than dramatic hierarchy.
|
||||
- **Uppercase is earned and wide**: When uppercase appears, it's always paired with generous letter-spacing (0.45px–2.52px), transforming dense words into spaced-out overline labels. This treatment is never applied to headings.
|
||||
- **OpenType by default**: Both system-ui and Inter enable `"calt"` and `"rlig"` features, ensuring contextual character adjustments and ligature rendering throughout.
|
||||
- **Inter regular at 60 px display** is the brand's calming counter to AI marketing's tendency to shout. The light tracking and modest weight read like documentation.
|
||||
- **Two-face contrast carries the technical voice.** Inter for narrative; SF Mono for anything that could be typed at a terminal.
|
||||
- **Uppercase eyebrow with tracking is the brand's signature label style.** `2.52 px` at 14 px is the documented value.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
- **Sans** — *Inter* is the brand's actual face; substitute is the brand itself when self-hosting is not available.
|
||||
- **Mono** — *SF Mono* is Apple-system; *JetBrains Mono* or *Geist Mono* are the best free substitutes.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px; small 5 / 6.4 px values appear inside code-mockup line-height compensation.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px · `{spacing.4xl}` 40 px · `{spacing.5xl}` 48 px · `{spacing.6xl}` 64 px.
|
||||
- **Section padding**: hero + content bands use `{spacing.5xl}` 48 px top/bottom.
|
||||
- **Card interior padding**: feature cards sit at `{spacing.2xl}` 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- Marketing container centres at roughly 1200 – 1400 px; content stays edge-to-edge in colour with horizontal gutters of `{spacing.3xl}` on desktop.
|
||||
- Feature-card grids: 2-up to 3-up at desktop, 1-up at mobile.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 768px | Hero 60→32 px; cards 1-up; nav hamburger. |
|
||||
| Tablet | 768–1023px | Cards 2-up; nav stays horizontal. |
|
||||
| Desktop | ≥ 1024px | Full 3-up card grids. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render at ~44 px tall (12 px vertical padding + 24 px line-height). Meet WCAG AAA at all breakpoints.
|
||||
|
||||
#### Collapsing Strategy
|
||||
Nav collapses to hamburger at mobile; the menu overlay keeps the same green CTA pinned at the bottom. Feature-card grids drop to 1-up; hero typography scales fluidly.
|
||||
|
||||
#### Image Behavior
|
||||
Code-editor mockups render as image-like cards with copy-to-clipboard affordances. No photography in the brand's marketing surface.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Full-bleed bands. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` border on `{colors.canvas}`. | Default for every feature card and button. |
|
||||
| Level 2 — Inset Glow | `0 0 15px rgba(92, 88, 85, 0.2)` subtle outer glow. | Hovering / featured cards. |
|
||||
| Level 3 — Modal Stack | `0 20px 60px rgba(0,0,0,0.7), 0 0 0 1px rgba(148,163,184,0.1) inset` heavy drop + inset ring. | Modal / dialog surfaces in-product. |
|
||||
|
||||
### Decorative Depth
|
||||
- Hairline cards on dark canvas — the brand's only true elevation mode.
|
||||
- A 2 px solid `{colors.primary}` green border occasionally marks "featured" or "active" status on a card.
|
||||
- A 1 px dashed `rgba(79, 93, 117, 0.4)` divider sits between section bands as a quiet rhythm cue.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.xs}` | 4px | Smallest inline pills, code inline chips. |
|
||||
| `{rounded.sm}` | 6px | Default button and input radius. |
|
||||
| `{rounded.md}` | 8px | Card chrome, code-block chrome. |
|
||||
| `{rounded.pill}` | 9999px | Inline status tags ("Live", "Beta"). |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers. |
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Ghost / Outline (Standard)**
|
||||
- Background: transparent
|
||||
- Text: Pure White (`#ffffff`)
|
||||
- Padding: comfortable (12px 16px)
|
||||
- Border: thin solid Warm Charcoal (`1px solid #3d3a39`)
|
||||
- Radius: comfortably rounded (6px)
|
||||
- Hover: background darkens to `rgba(0, 0, 0, 0.2)`, opacity drops to 0.4
|
||||
- Outline: subtle green tint (`rgba(33, 196, 93, 0.5)`)
|
||||
- The default interactive element — unassuming but clearly clickable
|
||||
**`button-primary`** — the electric-green CTA.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}` (near-black), label `{typography.button-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 6 px.
|
||||
|
||||
**Primary Green CTA**
|
||||
- Background: Carbon Surface (`#101010`)
|
||||
- Text: VoltAgent Mint (`#2fd6a1`)
|
||||
- Padding: comfortable (12px 16px)
|
||||
- Border: none visible (outline-based focus indicator)
|
||||
- Outline: VoltAgent Mint (`rgb(47, 214, 161)`)
|
||||
- Hover: same darkening behavior as Ghost
|
||||
- The "powered on" button — green text on dark surface reads as an active terminal command
|
||||
**`button-outline-on-dark`** — the hairline-on-dark secondary button.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, same typography / padding / shape.
|
||||
|
||||
**Tertiary / Emphasized Container Button**
|
||||
- Background: Carbon Surface (`#101010`)
|
||||
- Text: Snow White (`#f2f2f2`)
|
||||
- Padding: generous (20px all sides)
|
||||
- Border: thick solid Warm Charcoal (`3px solid #3d3a39`)
|
||||
- Radius: comfortably rounded (8px)
|
||||
- A card-like button treatment for larger interactive surfaces (code copy blocks, feature CTAs)
|
||||
**`button-ghost-green`** — text-only with green label, for tertiary actions.
|
||||
- Background `{colors.canvas}`, text `{colors.primary-soft}`, no border.
|
||||
|
||||
**`button-pill-tag`** — the inline pill for category tags / status labels.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, hairline border, body in `{typography.body-sm}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill}` 9999 px.
|
||||
|
||||
### Cards & Containers
|
||||
- Background: Carbon Surface (`#101010`) — one shade lighter than the page canvas
|
||||
- Border: `1px solid #3d3a39` (Warm Charcoal) for standard containment; `2px solid #00d992` for highlighted/active cards
|
||||
- Radius: comfortably rounded (8px) for content cards; subtly rounded (4–6px) for smaller inline containers
|
||||
- Shadow Level 1: Warm Ambient Haze (`rgba(92, 88, 85, 0.2) 0px 0px 15px`) for standard elevation
|
||||
- Shadow Level 2: Deep Dramatic (`rgba(0, 0, 0, 0.7) 0px 20px 60px` + `rgba(148, 163, 184, 0.1) 0px 0px 0px 1px inset`) for hero/feature showcase cards
|
||||
- Hover behavior: likely border color shift toward green accent or subtle opacity increase
|
||||
- Dashed variant: `1px dashed rgba(79, 93, 117, 0.4)` for workflow/diagram containers — visually distinct from solid-border content cards
|
||||
|
||||
**`card-feature`** — the default feature card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, padding `{spacing.2xl}`, shape `{rounded.md}` 8 px. The brand's most-repeated card chrome.
|
||||
|
||||
**`card-feature-emphasized`** — the same card with a 3 px hairline border for emphasis.
|
||||
- Same chrome as `card-feature` with 3 px solid `{colors.hairline}`.
|
||||
|
||||
**`code-mockup`** — the dark code-editor card with copy-to-clipboard affordance.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, body in `{typography.code}` (SF Mono 13 px), padding `{spacing.xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`code-inline-chip`** — the inline command snippet pill.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.canvas-text-soft}`, body in `{typography.code}`, padding `{spacing.xxs} {spacing.sm}`, shape `{rounded.sm}`.
|
||||
|
||||
### Inputs & Forms
|
||||
- No explicit input token data extracted — the site is landing-page focused with minimal form UI
|
||||
- The npm install command (`npm create voltagent-app@latest`) is presented as a code block rather than an input field
|
||||
- Inferred style: Carbon Surface background, Warm Charcoal border, VoltAgent Mint focus ring, Snow White text
|
||||
|
||||
**`text-input`** — the standard text input on dark.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, body in `{typography.body-sm}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 6 px.
|
||||
|
||||
### Navigation
|
||||
- Sticky top nav bar on Abyss Black canvas
|
||||
- Logo: VoltAgent bolt icon with animated green glow (`drop-shadow` cycling 2px–8px)
|
||||
- Nav structure: Logo → Product dropdown → Use Cases dropdown → Resources dropdown → GitHub stars badge → Docs CTA
|
||||
- Link text: Snow White (`#f2f2f2`) at 14–16px Inter, weight 500
|
||||
- Hover: links transition to green variants (`#00c182` or `#00ffaa`)
|
||||
- GitHub badge: social proof element integrated directly into nav
|
||||
- Mobile: collapses to hamburger menu, single-column vertical layout
|
||||
|
||||
### Image Treatment
|
||||
- Dark-themed product screenshots and architectural diagrams dominate
|
||||
- Code blocks are treated as primary visual content — syntax-highlighted with SFMono-Regular
|
||||
- Agent workflow visualizations appear as interactive node graphs with green connection lines
|
||||
- Decorative dot-pattern backgrounds appear behind hero sections
|
||||
- Full-bleed within card containers, respecting 8px radius rounding
|
||||
**`nav-bar`** — the sticky top nav on dark.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.3xl}`.
|
||||
|
||||
### Distinctive Components
|
||||
**`nav-link`** — link items in nav.
|
||||
- Text `{colors.body}`, set in `{typography.body-sm}`.
|
||||
|
||||
**npm Install Command Block**
|
||||
- A prominent code snippet (`npm create voltagent-app@latest`) styled as a copyable command
|
||||
- SFMono-Regular on Carbon Surface with a copy-to-clipboard button
|
||||
- Functions as the primary CTA — "install first, read later" developer psychology
|
||||
**`footer`** — the dark footer band.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.4xl} {spacing.3xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
**Company Logo Marquee**
|
||||
- Horizontal scrolling strip of developer/company logos
|
||||
- Infinite animation (`scrollLeft`/`scrollRight`, 25–80s durations)
|
||||
- Pauses on hover and for users with reduced-motion preferences
|
||||
- Demonstrates ecosystem adoption without cluttering the layout
|
||||
### Signature Components
|
||||
|
||||
**Feature Section Cards**
|
||||
- Large cards combining code examples with descriptive text
|
||||
- Left: code snippet with syntax highlighting; Right: feature description
|
||||
- Green accent border (`2px solid #00d992`) on highlighted/active features
|
||||
- Internal padding: generous (24–32px estimated)
|
||||
**`hero-band`** — the dark hero band with the 60-px Inter headline.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}` (with the headline at `{colors.ink-strong}` white), padding `{spacing.5xl} {spacing.3xl}`. Headline in `{typography.display-xl}` (60 px / weight 400 / `-0.65 px` tracking). Eyebrow above headline in `{typography.eyebrow-mono}` (uppercase, tracked).
|
||||
|
||||
**Agent Flow Diagrams**
|
||||
- Interactive node-graph visualizations showing agent coordination
|
||||
- Connection lines use VoltAgent green variants
|
||||
- Nodes styled as mini-cards within the Warm Charcoal border system
|
||||
**`content-band`** — the standard content band hosting feature grids.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.3xl}`. Section headline in `{typography.display-lg}`.
|
||||
|
||||
**Community / GitHub Section**
|
||||
- Large GitHub icon as the visual anchor
|
||||
- Star count and contributor metrics prominently displayed
|
||||
- Warm social proof: Discord, X, Reddit, LinkedIn, YouTube links in footer
|
||||
**`green-divider-band`** — a thin green-glow band that occasionally separates major sections.
|
||||
- Background `{colors.canvas}`, 2 px solid `{colors.primary}` top/bottom border. The brand's only chromatic divider.
|
||||
|
||||
## 5. Layout Principles
|
||||
### Examples (illustrative)
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 2px, 4px, 5px, 6px, 6.4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 40px, 48px, 64px
|
||||
- Button padding: 12px 16px (standard), 20px (container-button)
|
||||
- Card internal padding: approximately 24–32px
|
||||
- Section vertical spacing: generous (estimated 64–96px between major sections)
|
||||
- Component gap: 16–24px between sibling cards/elements
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
### Grid & Container
|
||||
- Max container width: approximately 1280–1440px, centered
|
||||
- Hero: centered single-column with maximum breathing room
|
||||
- Feature sections: alternating asymmetric layouts (code left / text right, then reversed)
|
||||
- Logo marquee: full-width horizontal scroll, breaking the container constraint
|
||||
- Card grids: 2–3 column for feature showcases
|
||||
- Integration grid: responsive multi-column for partner/integration icons
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Cinematic breathing room between sections**: Massive vertical gaps create a "scroll-through-chapters" experience — each section feels like a new scene.
|
||||
- **Dense within components**: Cards and code blocks are internally compact, with tight line-heights and controlled padding. Information is concentrated, not spread thin.
|
||||
- **Border-defined separation**: Rather than relying solely on whitespace, VoltAgent uses the Warm Charcoal border system (`#3d3a39`) to delineate content zones. The border IS the whitespace signal.
|
||||
- **Hero-first hierarchy**: The top of the page commands the most space — the "AI Agent Engineering Platform" headline and npm command get maximum vertical runway before the first content section appears.
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
### Border Radius Scale
|
||||
- Nearly squared (4px): Small inline elements, SVG containers, code spans — the sharpest treatment, conveying technical precision
|
||||
- Subtly rounded (6px): Buttons, links, clipboard actions — the workhorse radius for interactive elements
|
||||
- Code-specific (6.4px): Code blocks, `pre` elements, clipboard copy targets — a deliberate micro-distinction from standard 6px
|
||||
- Comfortably rounded (8px): Content cards, feature containers, emphasized buttons — the standard containment radius
|
||||
- Pill-shaped (9999px): Tags, badges, status indicators, pill-shaped navigation elements — the roundest treatment for small categorical labels
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
## 6. Depth & Elevation
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow, no border | Page background (`#050507`), inline text |
|
||||
| Contained (Level 1) | `1px solid #3d3a39`, no shadow | Standard cards, nav bar, code blocks |
|
||||
| Emphasized (Level 2) | `3px solid #3d3a39`, no shadow | Large interactive buttons, emphasized containers |
|
||||
| Accent (Level 3) | `2px solid #00d992`, no shadow | Active/highlighted feature cards, selected states |
|
||||
| Ambient Glow (Level 4) | `rgba(92, 88, 85, 0.2) 0px 0px 15px` | Elevated cards, hover states, soft atmospheric lift |
|
||||
| Dramatic Float (Level 5) | `rgba(0, 0, 0, 0.7) 0px 20px 60px` + `rgba(148, 163, 184, 0.1) 1px inset` | Hero feature showcase, modals, maximum-elevation content |
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**Shadow Philosophy**: VoltAgent communicates depth primarily through **border weight and color**, not shadows. The standard `1px solid #3d3a39` border IS the elevation — adding a `3px` border weight or switching to green (`#00d992`) communicates importance more than adding shadow does. When shadows do appear, they're either warm and diffused (Level 4) or cinematic and dramatic (Level 5) — never medium or generic.
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
### Decorative Depth
|
||||
- **Green Signal Glow**: The VoltAgent bolt logo pulses with a `drop-shadow` animation cycling between 2px and 8px blur radius in Emerald Signal Green. This is the most distinctive decorative element — it makes the logo feel "powered on."
|
||||
- **Warm Charcoal Containment Lines**: The warm tone of `#3d3a39` borders creates a subtle visual warmth against the cool black, as if the cards are faintly heated from within.
|
||||
- **Dashed Workflow Lines**: `1px dashed rgba(79, 93, 117, 0.4)` creates a blueprint-like aesthetic for architecture diagrams, visually distinct from solid content borders.
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use Abyss Black (`#050507`) as the landing page background and Carbon Surface (`#101010`) for all contained elements — the two-shade dark system is essential
|
||||
- Reserve Emerald Signal Green (`#00d992`) exclusively for high-signal moments: active borders, glow effects, and the most important interactive accents
|
||||
- Use VoltAgent Mint (`#2fd6a1`) for button text on dark surfaces — it's more readable than pure Signal Green
|
||||
- Keep heading line-heights compressed (1.0–1.11) with negative letter-spacing for dense, authoritative text blocks
|
||||
- Use the warm gray palette (`#3d3a39`, `#8b949e`, `#b8b3b0`) for borders and secondary text — warmth prevents the dark theme from feeling sterile
|
||||
- Present code snippets as primary content — they're hero elements, not supporting illustrations
|
||||
- Use border weight (1px → 2px → 3px) and color shifts (`#3d3a39` → `#00d992`) to communicate depth and importance, rather than relying on shadows
|
||||
- Pair system-ui for headings with Inter for body text — the speed/authority of native fonts combined with the precision of a geometric sans
|
||||
- Use SFMono-Regular for all code content — it's the developer credibility signal
|
||||
- Apply `"calt"` and `"rlig"` OpenType features across all text
|
||||
- Reserve `{colors.primary}` (`#00d992`) for every primary CTA, the lightning logo glyph, and live-status indicators. The green is the brand's centre of gravity.
|
||||
- Use the dark `{colors.canvas}` (`#101010`) as the only page surface. There is no light-mode rhythm.
|
||||
- Build cards with 1 px `{colors.hairline}` borders, not shadows. Hairlines on dark IS the brand's elevation system.
|
||||
- Pair Inter (sentence-case) with SF Mono (inline code, command snippets). Every uppercase moment uses Inter at weight 600 with `2.52 px` tracking — not a separate mono.
|
||||
- Use `{rounded.sm}` 6 px for buttons, `{rounded.md}` 8 px for cards, `{rounded.pill}` 9999 px only for inline status tags.
|
||||
|
||||
### Don't
|
||||
- Don't use bright or light backgrounds as primary surfaces — the entire identity lives on near-black
|
||||
- Don't introduce warm colors (orange, red, yellow) as decorative accents — the palette is strictly green + warm neutrals on black. Warm colors are reserved for semantic states (warning, error) only
|
||||
- Don't use Emerald Signal Green (`#00d992`) on large surfaces or as background fills — it's an accent, never a surface
|
||||
- Don't increase heading line-heights beyond 1.33 — the compressed density is core to the engineering-platform identity
|
||||
- Don't use heavy shadows generously — depth comes from border treatment, not box-shadow. Shadows are reserved for Level 4–5 elevation only
|
||||
- Don't use pure white (`#ffffff`) as default body text — Snow White (`#f2f2f2`) is the standard. Pure white is reserved for maximum-emphasis headings and button text
|
||||
- Don't mix in serif or decorative fonts — the entire system is geometric sans + monospace
|
||||
- Don't use border-radius larger than 8px on content cards — 9999px (pill) is only for small tags and badges
|
||||
- Don't skip the warm-gray border system — cards without `#3d3a39` borders lose their containment and float ambiguously on the dark canvas
|
||||
- Don't animate aggressively — animations are slow and subtle (25–100s durations for marquee, gentle glow pulses). Fast motion contradicts the "engineering precision" atmosphere
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Small Mobile | <420px | Minimum layout, stacked everything, reduced hero text to ~24px |
|
||||
| Mobile | 420–767px | Single column, hamburger nav, full-width cards, hero text ~36px |
|
||||
| Tablet | 768–1024px | 2-column grids begin, condensed nav, medium hero text |
|
||||
| Desktop | 1025–1440px | Full multi-column layout, expanded nav with dropdowns, large hero (60px) |
|
||||
| Large Desktop | >1440px | Max-width container centered (est. 1280–1440px), generous horizontal margins |
|
||||
|
||||
*23 breakpoints detected in total, ranging from 360px to 1992px — indicating a fluid, heavily responsive grid system rather than fixed breakpoint snapping.*
|
||||
|
||||
### Touch Targets
|
||||
- Buttons use comfortable padding (12px 16px minimum) ensuring adequate touch area
|
||||
- Navigation links spaced with sufficient gap for thumb navigation
|
||||
- Interactive card surfaces are large enough to serve as full touch targets
|
||||
- Minimum recommended touch target: 44x44px
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Full horizontal nav with dropdowns collapses to hamburger menu on mobile
|
||||
- **Feature grids**: 3-column → 2-column → single-column vertical stacking
|
||||
- **Hero text**: 60px → 36px → 24px progressive scaling with maintained compression ratios
|
||||
- **Logo marquee**: Adjusts scroll speed and item sizing; maintains infinite loop
|
||||
- **Code blocks**: Horizontal scroll on smaller viewports rather than wrapping — preserving code readability
|
||||
- **Section padding**: Reduces proportionally but maintains generous vertical rhythm between chapters
|
||||
- **Cards**: Stack vertically on mobile with full-width treatment and maintained internal padding
|
||||
|
||||
### Image Behavior
|
||||
- Dark-themed screenshots and diagrams scale proportionally within containers
|
||||
- Agent flow diagrams simplify or scroll horizontally on narrow viewports
|
||||
- Dot-pattern decorative backgrounds scale with viewport
|
||||
- No visible art direction changes between breakpoints — same crops, proportional scaling
|
||||
- Lazy loading for below-fold images (Docusaurus default behavior)
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Brand Accent: "Emerald Signal Green (#00d992)"
|
||||
- Button Text: "VoltAgent Mint (#2fd6a1)"
|
||||
- Page Background: "Abyss Black (#050507)"
|
||||
- Card Surface: "Carbon Surface (#101010)"
|
||||
- Border / Containment: "Warm Charcoal (#3d3a39)"
|
||||
- Primary Text: "Snow White (#f2f2f2)"
|
||||
- Secondary Text: "Warm Parchment (#b8b3b0)"
|
||||
- Tertiary Text: "Steel Slate (#8b949e)"
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a feature card on Carbon Surface (#101010) with a 1px solid Warm Charcoal (#3d3a39) border, comfortably rounded corners (8px). Use Snow White (#f2f2f2) for the title in system-ui at 24px weight 700, and Warm Parchment (#b8b3b0) for the description in Inter at 16px. Add a subtle Warm Ambient shadow (rgba(92, 88, 85, 0.2) 0px 0px 15px)."
|
||||
- "Design a ghost button with transparent background, Snow White (#f2f2f2) text in Inter at 16px, a 1px solid Warm Charcoal (#3d3a39) border, and subtly rounded corners (6px). Padding: 12px vertical, 16px horizontal. On hover, background shifts to rgba(0, 0, 0, 0.2)."
|
||||
- "Build a hero section on Abyss Black (#050507) with a massive heading at 60px system-ui, line-height 1.0, letter-spacing -0.65px. The word 'Platform' should be colored in Emerald Signal Green (#00d992). Below the heading, place a code block showing 'npm create voltagent-app@latest' in SFMono-Regular at 14px on Carbon Surface (#101010) with a copy button."
|
||||
- "Create a highlighted feature card using a 2px solid Emerald Signal Green (#00d992) border instead of the standard Warm Charcoal. Keep Carbon Surface background, comfortably rounded corners (8px), and include a code snippet on the left with feature description text on the right."
|
||||
- "Design a navigation bar on Abyss Black (#050507) with the VoltAgent logo (bolt icon with animated green glow) on the left, nav links in Inter at 14px weight 500 in Snow White, and a green CTA button (Carbon Surface bg, VoltAgent Mint text) on the right. Add a 1px solid Warm Charcoal bottom border."
|
||||
|
||||
### Iteration Guide
|
||||
When refining existing screens generated with this design system:
|
||||
1. Focus on ONE component at a time
|
||||
2. Reference specific color names and hex codes — "use Warm Parchment (#b8b3b0)" not "make it lighter"
|
||||
3. Use border treatment to communicate elevation: "change the border to 2px solid Emerald Signal Green (#00d992)" for emphasis
|
||||
4. Describe the desired "feel" alongside measurements — "compressed and authoritative heading at 36px with line-height 1.11 and -0.9px letter-spacing"
|
||||
5. For glow effects, specify "Emerald Signal Green (#00d992) as a drop-shadow with 2–8px blur radius"
|
||||
6. Always specify which font — system-ui for headings, Inter for body/UI, SFMono-Regular for code
|
||||
7. Keep animations slow and subtle — marquee scrolls at 25–80s, glow pulses gently
|
||||
- Don't introduce a light-mode counterpart. The brand is dark-canvas only.
|
||||
- Don't use the primary green as a body-text fill. It's CTA-only.
|
||||
- Don't drop a soft drop-shadow on cards. The brand uses hairlines + occasional glow, never material shadows.
|
||||
- Don't render the hero headline in heavy weight (700+). The brand's display is intentionally calm at weight 400.
|
||||
- Don't replace Inter or SF Mono with a different family — both faces are part of the brand's voice and pairing.
|
||||
|
||||
@ -1,253 +1,526 @@
|
||||
# Design System Inspired by Warp
|
||||
---
|
||||
version: alpha
|
||||
name: Warp Inspired
|
||||
description: An inspired interpretation of Warp's design language — an agentic terminal-and-development-environment brand whose surface is a warm near-charcoal canvas (a tint warmer than pure black), broken only by clean Inter typography, the occasional Instrument Serif italic moment, and dense terminal-mockup imagery; CTAs are unusually understated, with shape geometry running tighter than most marketing sites.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#f7f5f0"
|
||||
on-primary: "#2b2622"
|
||||
ink: "#f7f5f0"
|
||||
body: "#c9c0ad"
|
||||
body-strong: "#dad2c1"
|
||||
mute: "#aea69c"
|
||||
canvas: "#2b2622"
|
||||
canvas-soft: "#383330"
|
||||
hairline: "#3f3a36"
|
||||
|
||||
Warp's website feels like sitting at a campfire in a deep forest — warm, dark, and alive with quiet confidence. Unlike the cold, blue-tinted blacks favored by most developer tools, Warp wraps everything in a warm near-black that feels like charred wood or dark earth. The text isn't pure white either — it's Warm Parchment (`#faf9f6`), a barely-perceptible cream that softens every headline and makes the dark canvas feel inviting rather than austere.
|
||||
typography:
|
||||
display-xl:
|
||||
fontFamily: Inter, system-ui, -apple-system, Segoe UI, Roboto, sans-serif
|
||||
fontSize: 64px
|
||||
fontWeight: 400
|
||||
lineHeight: 70.4px
|
||||
letterSpacing: -1.6px
|
||||
display-lg:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 400
|
||||
lineHeight: 52.8px
|
||||
letterSpacing: -1.2px
|
||||
display-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 500
|
||||
lineHeight: 40px
|
||||
letterSpacing: -0.8px
|
||||
display-sm:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 500
|
||||
lineHeight: 32px
|
||||
letterSpacing: -0.4px
|
||||
display-serif:
|
||||
fontFamily: Instrument Serif, Georgia, "Times New Roman", serif
|
||||
fontSize: 48px
|
||||
fontWeight: 400
|
||||
lineHeight: 52px
|
||||
letterSpacing: -0.5px
|
||||
body-lg:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
body-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-md-strong:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 24px
|
||||
body-sm:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-sm-strong:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
caption:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
code:
|
||||
fontFamily: DM Mono, ui-monospace, SFMono-Regular, Menlo, monospace
|
||||
fontSize: 13px
|
||||
fontWeight: 400
|
||||
lineHeight: 18px
|
||||
code-md:
|
||||
fontFamily: DM Mono, ui-monospace, SFMono-Regular, Menlo, monospace
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
button-md:
|
||||
fontFamily: Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 20px
|
||||
|
||||
The typography is the secret weapon: Matter, a geometric sans-serif with distinctive character, deployed at Regular weight across virtually all text. The font choice is unusual for a developer tool — Matter has a softness and humanity that signals "this terminal is for everyone, not just greybeards." Combined with tight line-heights and controlled negative letter-spacing on headlines, the effect is refined and approachable simultaneously. Nature photography is woven between terminal screenshots, creating a visual language that says: this tool brings you closer to flow, to calm productivity.
|
||||
rounded:
|
||||
none: 0px
|
||||
xxs: 1px
|
||||
xs: 2px
|
||||
sm: 3px
|
||||
md: 4px
|
||||
lg: 6px
|
||||
pill: 9999px
|
||||
full: 9999px
|
||||
|
||||
The overall design philosophy is restraint through warmth. Minimal color (almost monochromatic warm grays), minimal ornamentation, and a focus on product showcases set against cinematic dark landscapes. It's a terminal company that markets like a lifestyle brand.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 10px
|
||||
lg: 16px
|
||||
xl: 24px
|
||||
2xl: 32px
|
||||
3xl: 48px
|
||||
4xl: 64px
|
||||
5xl: 96px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
nav-link:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
button-secondary-ghost:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.xs}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.sm} {spacing.md}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
card-mockup:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.code}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
download-tile:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
press-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
padding: "{spacing.lg} 0"
|
||||
job-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
padding: "{spacing.lg} 0"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.5xl} {spacing.xl}"
|
||||
content-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
padding: "{spacing.5xl} {spacing.xl}"
|
||||
partner-logo-tile:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.lg}"
|
||||
testimonial-card:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.sm} {spacing.md}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.sm} {spacing.md}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.lg}"
|
||||
padding: "{spacing.2xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.sm} {spacing.md}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Warp is an "agentic development environment" — a terminal application that wraps an AI agent — and its marketing site mirrors the product's posture: a single dark band running the entire page, warmer than pure black (`{colors.canvas}` `#2b2622` carries a hint of brown-beige from the brand's oklch-defined warmth value), with copy set almost entirely in Inter. The page reads more like a developer's reading-mode editor than a marketing surface.
|
||||
|
||||
The decoration is restrained. Two terminal screenshots open the hero (split between the two main product modes — agent + terminal). A partner-logo strip (Anthropic / OpenAI / Google / Stanford) sits below the hero on a slightly warmer tile surface. A single testimonial card with a portrait photograph. A press-coverage list. Then the page closes with download tiles for Mac / Linux / Windows. There is no gradient, no atmospheric backdrop, no illustration system.
|
||||
|
||||
Type is the second decisive voice. Hero display sits at 64 px Inter weight 400 with `-1.6px` tracking — restrained for a hero, deliberately quiet. The brand carries DM Mono as its monospace face for code blocks, and Instrument Serif italics occasionally appear for editorial moments. Body text is 16 px Inter at line-height 1.5, very readable.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Warm dark background — not cold black, but earthy near-black with warm gray undertones
|
||||
- Warm Parchment (`#faf9f6`) text instead of pure white — subtle cream warmth
|
||||
- Matter font family (Regular weight) — geometric but approachable, not the typical developer-tool typeface
|
||||
- Nature photography interleaved with product screenshots — lifestyle meets developer tool
|
||||
- Almost monochromatic warm gray palette — no bold accent colors
|
||||
- Uppercase labels with wide letter-spacing (2.4px) for categorization — editorial signaling
|
||||
- Pill-shaped dark buttons (`#353534`, 50px radius) — restrained, muted CTAs
|
||||
- A single primary "color" — really an off-white `{colors.primary}` (`#f7f5f0`) — that doubles as text on canvas and as the button-primary fill. There is no chromatic brand accent.
|
||||
- Warm dark canvas (`{colors.canvas}` `#2b2622`) is the only page surface. The brand's defining tone is the brown-warmth, not pure black.
|
||||
- Extremely tight button radii — 3 / 4 px (1 / 2× the brand's `{rounded.md}` 4 px base) — the brand never uses generous pill shapes for CTAs. Only icon containers use `{rounded.full}`.
|
||||
- Inter sans + DM Mono mono is the canonical pairing. Instrument Serif appears as a third editorial face for occasional italics.
|
||||
- Terminal-mockup imagery is the brand's only consistent decorative system — no gradients, no atmospheric overlays.
|
||||
- A subtle warm tint runs through every neutral; even body text and dividers carry a hint of warmth rather than neutral gray.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Warm Parchment** (`#faf9f6`): Primary text color — a barely-cream off-white that softens every surface
|
||||
- **Earth Gray** (`#353534`): Button backgrounds, dark interactive surfaces — warm, not cold
|
||||
- **Deep Void** (near-black, page background): The warm dark canvas derived from the body background
|
||||
### Brand & Accent
|
||||
- **Off White Primary** (`{colors.primary}` — `#f7f5f0`): The brand's "primary" is a warm off-white. Used as button-primary fill, as default text on canvas, as the wordmark color. There is no chromatic brand accent — the off-white IS the brand's distinguishing tone.
|
||||
|
||||
### Secondary & Accent
|
||||
- **Stone Gray** (`#868584`): Secondary text, muted descriptions — warm mid-gray
|
||||
- **Ash Gray** (`#afaeac`): Body text, button text — the workhorse reading color
|
||||
- **Purple-Tint Gray** (`#666469`): Link text with subtle purple undertone — underlined links in content
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#2b2622`): The warm dark page background. Resolved from `oklch(22.0% 0.004 84.6)`. Slightly browner than pure black, slightly warmer than a neutral gray — the warmth IS the brand's identity.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#383330`): A lighter warm-dark fill used for cards, mockup chrome, and partner-logo tiles.
|
||||
- **Hairline** (`{colors.hairline}` — `#3f3a36`): 1 px solid divider on dark surfaces.
|
||||
|
||||
### Surface & Background
|
||||
- **Frosted Veil** (`rgba(255, 255, 255, 0.04)`): Ultra-subtle white overlay for surface differentiation
|
||||
- **Mist Border** (`rgba(226, 226, 226, 0.35)` / `rgba(227, 227, 227, 0.337)`): Semi-transparent borders for card containment
|
||||
- **Translucent Parchment** (`rgba(250, 249, 246, 0.9)`): Slightly transparent primary surface, allowing depth
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#f7f5f0`): Default text on canvas — same off-white as the primary, intentionally unified.
|
||||
- **Body Strong** (`{colors.body-strong}` — `#dad2c1`): Mid-emphasis body text.
|
||||
- **Body** (`{colors.body}` — `#c9c0ad`): Secondary body text — captions, supporting copy, press-coverage rows.
|
||||
- **Mute** (`{colors.mute}` — `#aea69c`): Lowest-priority text — timestamps, fine print, footer secondary lines. Resolved from `oklch(71.5% 0.008 84.6)`.
|
||||
|
||||
### Neutrals & Text
|
||||
- **Warm Parchment** (`#faf9f6`): Headlines, high-emphasis text
|
||||
- **Ash Gray** (`#afaeac`): Body paragraphs, descriptions
|
||||
- **Stone Gray** (`#868584`): Secondary labels, subdued information
|
||||
- **Muted Purple** (`#666469`): Underlined links, tertiary content
|
||||
- **Dark Charcoal** (`#454545` / `#353534`): Borders, button backgrounds
|
||||
### Semantic
|
||||
The brand doesn't surface a separate error / warning / success palette in its marketing pages. Validation cues come from the unified off-white system; in-product semantic colors live in the terminal application proper.
|
||||
|
||||
### Semantic & Accent
|
||||
- Warp operates as an almost monochromatic system — no bold accent colors
|
||||
- Interactive states are communicated through opacity changes and underline decorations rather than color shifts
|
||||
- Any accent color would break the warm, restrained palette
|
||||
|
||||
### Gradient System
|
||||
- No explicit gradients on the marketing site
|
||||
- Depth is created through layered semi-transparent surfaces and photography rather than color gradients
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Display & Body**: `Matter Regular` — geometric sans-serif with soft character. Fallbacks: `Matter Regular Placeholder`, system sans-serif
|
||||
- **Medium**: `Matter Medium` — weight 500 variant for emphasis. Fallbacks: `Matter Medium Placeholder`
|
||||
- **Square**: `Matter SQ Regular` — squared variant for select display contexts. Fallbacks: `Matter SQ Regular Placeholder`
|
||||
- **UI Supplement**: `Inter` — used for specific UI elements. Fallbacks: `Inter Placeholder`
|
||||
- **Monospace Display**: `Geist Mono` — for code/terminal display headings
|
||||
- **Monospace Body**: `Matter Mono Regular` — custom mono companion. Fallbacks: `Matter Mono Regular Placeholder`
|
||||
Three faces ladder the system:
|
||||
1. **Inter** for every display, body, button, link, and label role. Weights 400 / 500 are the working pair. Used with the brand's "Inter Fallback" custom face as the metric-compatible system fallback.
|
||||
2. **DM Mono** for terminal mockups, command snippets, and code blocks. Weight 400 only. Loaded as `--font-dm-mono`.
|
||||
3. **Instrument Serif** for occasional editorial italic moments — rare on the marketing surface, but documented as a third face for emphasised tagline-style phrases. **Abel** is also loaded as a fourth fallback for headline emphasis.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display Hero | Matter Regular | 80px | 400 | 1.00 | -2.4px | Maximum compression, hero impact |
|
||||
| Section Display | Matter Regular | 56px | 400 | 1.20 | -0.56px | Feature section headings |
|
||||
| Section Heading | Matter Regular | 48px | 400 | 1.20 | -0.48px to -0.96px | Alternate heading weight |
|
||||
| Feature Heading | Matter Regular | 40px | 400 | 1.10 | -0.4px | Feature block titles |
|
||||
| Sub-heading Large | Matter Regular | 36px | 400 | 1.15 | -0.72px | Sub-section headers |
|
||||
| Card Display | Matter SQ Regular | 42px | 400 | 1.00 | 0px | Squared variant for special display |
|
||||
| Sub-heading | Matter Regular | 32px | 400 | 1.19 | 0px | Content sub-headings |
|
||||
| Body Heading | Matter Regular | 24px | 400 | 1.20 | -0.72px to 0px | Bold content intros |
|
||||
| Card Title | Matter Medium | 22px | 500 | 1.14 | 0px | Emphasized card headers |
|
||||
| Body Large | Matter Regular | 20px | 400 | 1.40 | -0.2px | Primary body text, relaxed |
|
||||
| Body | Matter Regular | 18px | 400 | 1.30 | -0.18px | Standard body paragraphs |
|
||||
| Nav/UI | Matter Regular | 16px | 400 | 1.20 | 0px | Navigation links, UI text |
|
||||
| Button Text | Matter Medium | 16px | 500 | 1.20 | 0px | Button labels |
|
||||
| Caption | Matter Regular | 14px | 400 | 1.00 | 1.4px | Uppercase labels (transform: uppercase) |
|
||||
| Small Label | Matter Regular | 12px | 400 | 1.35 | 2.4px | Uppercase micro-labels (transform: uppercase) |
|
||||
| Micro | Matter Regular | 11px | 400 | 1.20 | 0px | Smallest text elements |
|
||||
| Code UI | Geist Mono | 16px | 400 | 1.00 | 0px | Terminal/code display |
|
||||
| Code Body | Matter Mono Regular | 16px | 400 | 1.00 | -0.2px | Code content |
|
||||
| UI Supplement | Inter | 16px | 500 | 1.00 | -0.2px | Specific UI elements |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xl}` | 64px | 400 | 70.4px | -1.6px | Hero headline ("Warp is the agentic development environment"). |
|
||||
| `{typography.display-lg}` | 48px | 400 | 52.8px | -1.2px | Section headlines. |
|
||||
| `{typography.display-md}` | 32px | 500 | 40px | -0.8px | Sub-section displays. |
|
||||
| `{typography.display-sm}` | 24px | 500 | 32px | -0.4px | Card titles and lead emphasis. |
|
||||
| `{typography.display-serif}` | 48px | 400 | 52px | -0.5px | Instrument Serif italic editorial moments. |
|
||||
| `{typography.body-lg}` | 18px | 400 | 28px | 0 | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 24px | 0 | Default body. |
|
||||
| `{typography.body-md-strong}` | 16px | 500 | 24px | 0 | Bold inline body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 14px | 500 | 20px | 0 | Nav link / button labels. |
|
||||
| `{typography.caption}` | 12px | 400 | 16px | 0 | Captions, fine print. |
|
||||
| `{typography.code}` | 13px | 400 | 18px | 0 | Terminal mockup body. |
|
||||
| `{typography.code-md}` | 14px | 400 | 20px | 0 | Inline command snippets. |
|
||||
| `{typography.button-md}` | 14px | 500 | 20px | 0 | Button labels. |
|
||||
|
||||
### Principles
|
||||
- **Regular weight dominance**: Nearly all text uses weight 400 (Regular) — even headlines. Matter Medium (500) appears only for emphasis moments like card titles and buttons. This creates a remarkably even, calm typographic texture
|
||||
- **Uppercase as editorial signal**: Small labels and categories use uppercase transform with wide letter-spacing (1.4px–2.4px), creating a magazine-editorial categorization system
|
||||
- **Warm legibility**: The combination of Matter's geometric softness + warm text colors (#faf9f6) + controlled negative tracking creates text that reads as effortlessly human on dark surfaces
|
||||
- **No bold display**: Zero use of bold (700+) weight anywhere — restraint is the philosophy
|
||||
- **Hero display at weight 400** — the brand reads as quietly confident, not as a billboard.
|
||||
- **Negative tracking is part of the voice.** `-1.6 px` at 64 px hero, scaling down through display levels.
|
||||
- **Inter for narrative, DM Mono for technical.** Strict role separation.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
All three faces are open or freely-loadable:
|
||||
- **Inter** — load directly from Google Fonts or Vercel-hosted CDN.
|
||||
- **DM Mono** — open-source on Google Fonts.
|
||||
- **Instrument Serif** — open-source on Google Fonts.
|
||||
|
||||
### Buttons
|
||||
- **Dark Pill**: `#353534` background, Ash Gray (`#afaeac`) text, pill shape (50px radius), `10px` padding. The primary CTA — warm, muted, understated
|
||||
- **Frosted Tag**: `rgba(255, 255, 255, 0.16)` background, black text (`rgb(0, 0, 0)`), rectangular (6px radius), `1px 6px` padding. Small inline tag-like buttons
|
||||
- **Ghost**: No visible background, text-only with underline decoration on hover
|
||||
- **Hover**: Subtle opacity or brightness shift — no dramatic color changes
|
||||
|
||||
### Cards & Containers
|
||||
- **Photography Cards**: Full-bleed nature imagery with overlay text, 8px–12px border-radius
|
||||
- **Terminal Screenshot Cards**: Product UI embedded in dark containers with rounded corners (8px–12px)
|
||||
- **Bordered Cards**: Semi-transparent border (`rgba(226, 226, 226, 0.35)`) for containment, 12px–14px radius
|
||||
- **Hover**: Minimal — content cards don't dramatically change on hover, maintaining the calm aesthetic
|
||||
|
||||
### Inputs & Forms
|
||||
- Minimal form presence on the marketing site
|
||||
- Dark background inputs with warm gray text
|
||||
- Focus: Border brightness increase, no colored rings (consistent with the monochromatic palette)
|
||||
|
||||
### Navigation
|
||||
- **Top nav**: Dark background, warm parchment brand text, Matter Regular at 16px for links
|
||||
- **Link color**: Stone Gray (`#868584`) for muted nav, Warm Parchment for active/hover
|
||||
- **CTA button**: Dark pill (#353534) at nav end — restrained, not attention-grabbing
|
||||
- **Mobile**: Collapses to simplified navigation
|
||||
- **Sticky**: Nav stays fixed on scroll
|
||||
|
||||
### Image Treatment
|
||||
- **Nature photography**: Landscapes, forests, golden-hour scenes — completely unique for a developer tool
|
||||
- **Terminal screenshots**: Product UI shown in realistic terminal window frames
|
||||
- **Mixed composition**: Nature images and terminal screenshots are interleaved, creating a lifestyle-meets-tool narrative
|
||||
- **Full-bleed**: Images often span full container width with 8px radius
|
||||
- **Video**: Video elements present with 10px border-radius
|
||||
|
||||
### Testimonial Section
|
||||
- Social proof area ("Don't take our word for it") with quotes
|
||||
- Muted styling consistent with overall restraint
|
||||
|
||||
## 5. Layout Principles
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 8px
|
||||
- **Scale**: 1px, 4px, 5px, 8px, 10px, 12px, 14px, 15px, 16px, 18px, 24px, 26px, 30px, 32px, 36px
|
||||
- **Section padding**: 80px–120px vertical between major sections
|
||||
- **Card padding**: 16px–32px internal spacing
|
||||
- **Component gaps**: 8px–16px between related elements
|
||||
- **Base unit**: 4 px (with occasional 10 px and 6 px values for button padding).
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 10 px · `{spacing.lg}` 16 px · `{spacing.xl}` 24 px · `{spacing.2xl}` 32 px · `{spacing.3xl}` 48 px · `{spacing.4xl}` 64 px · `{spacing.5xl}` 96 px.
|
||||
- **Section padding**: hero / content bands use `{spacing.5xl}` 96 px on desktop.
|
||||
- **Card interior**: cards sit at `{spacing.xl}` 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- **Max width**: ~1500px container (breakpoint at 1500px), centered
|
||||
- **Column patterns**: Full-width hero, 2-column feature sections with photography, single-column testimonials
|
||||
- **Cinematic layout**: Wide containers that let photography breathe
|
||||
- Marketing content centres at roughly 1200 px width.
|
||||
- Hero: 2-column at desktop (split between two terminal screenshots), stacks at mobile.
|
||||
- Partner logos: 5-up wrapping flex row.
|
||||
- Download tiles: 3-up at desktop (Mac / Linux / Windows), 1-up at mobile.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Vast and warm**: Generous spacing between sections — the dark background creates a warm void that feels contemplative rather than empty
|
||||
- **Photography as whitespace**: Nature images serve as visual breathing room between dense product information
|
||||
- **Editorial pacing**: The layout reads like a magazine — each section is a deliberate page-turn moment
|
||||
### Responsive Strategy
|
||||
|
||||
### Border Radius Scale
|
||||
- **4px**: Small interactive elements — buttons, tags
|
||||
- **5px–6px**: Standard components — links, small containers
|
||||
- **8px**: Images, video containers, standard cards
|
||||
- **10px**: Video elements, medium containers
|
||||
- **12px**: Feature cards, large images
|
||||
- **14px**: Large containers, prominent cards
|
||||
- **40px**: Large rounded sections
|
||||
- **50px**: Pill buttons — primary CTAs
|
||||
- **200px**: Progress bars — full pill shape
|
||||
#### Breakpoints
|
||||
|
||||
## 6. Depth & Elevation
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 768px | Hero stacks; 1-up grids; nav hamburger. |
|
||||
| Tablet | 768–1023px | 2-up grids. |
|
||||
| Desktop | ≥ 1024px | Full hero split; 3-up download tiles. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render at ~36 px tall (8 px vertical padding + 20 px line-height). Mobile inflates touch area through additional padding to meet WCAG 44 × 44 px floor.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- Nav: full link row + Sign in / Download right cluster at desktop. Hamburger at mobile.
|
||||
- Hero terminal-mockup split: stacks vertically at mobile.
|
||||
- Press / job rows: full-width single column; stay legible at all widths.
|
||||
|
||||
#### Image Behavior
|
||||
- **Terminal mockups**: rendered as dark cards with the actual terminal UI inside (warm canvas + colored syntax). Aspect ratio ~3:2.
|
||||
- **Partner logos**: monochrome SVGs on dark tile cards.
|
||||
- **Testimonial portraits**: 1:1 square crop inside `{rounded.md}` card chrome.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Level 0 (Flat) | No shadow, dark background | Page canvas, most surfaces |
|
||||
| Level 1 (Veil) | `rgba(255, 255, 255, 0.04)` overlay | Subtle surface differentiation |
|
||||
| Level 2 (Border) | `rgba(226, 226, 226, 0.35) 1px` border | Card containment, section separation |
|
||||
| Level 3 (Ambient) | `rgba(0, 0, 0, 0.2) 0px 5px 15px` (inferred from design) | Image containers, floating elements |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default for hero band. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` border on `{colors.canvas-soft}`. | Default card chrome. |
|
||||
| Level 2 — Inset Card | Canvas-soft fill against canvas background with 1 px hairline. | Mockup cards, download tiles, testimonial cards. |
|
||||
|
||||
### Shadow Philosophy
|
||||
Warp's elevation system is remarkably flat — almost zero shadow usage on the marketing site. Depth is communicated through:
|
||||
- **Semi-transparent borders** instead of shadows — borders at 35% opacity create a ghostly containment
|
||||
- **Photography layering** — images create natural depth without artificial shadows
|
||||
- **Surface opacity shifts** — `rgba(255, 255, 255, 0.04)` overlays create barely-perceptible layer differences
|
||||
- The effect is calm and grounded — nothing floats, everything rests
|
||||
The brand uses surface-contrast and hairline borders for elevation; soft drop-shadows do not appear in the marketing surface.
|
||||
|
||||
### Decorative Depth
|
||||
- **Photography as depth**: Nature images create atmospheric depth that shadows cannot
|
||||
- **No glass or blur effects**: The design avoids trendy glassmorphism entirely
|
||||
- **Warm ambient**: Any glow comes from the photography's natural lighting, not artificial CSS
|
||||
## Shapes
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.xxs}` | 1px | Tightest in-text indicator. |
|
||||
| `{rounded.xs}` | 2px | Inline very-small chips. |
|
||||
| `{rounded.sm}` | 3px | Default button radius — extremely tight. |
|
||||
| `{rounded.md}` | 4px | Card chrome (the brand's `--radius` base). |
|
||||
| `{rounded.lg}` | 6px | Slightly larger cards. |
|
||||
| `{rounded.pill}` | 9999px | Icon containers, status pills. |
|
||||
|
||||
### Photography Geometry
|
||||
- Terminal mockups: ~3:2 inside `{rounded.md}` card chrome.
|
||||
- Partner logos: monochrome SVGs at consistent 24 px height inside tile cards.
|
||||
- Testimonial portraits: 1:1 square inside `{rounded.md}`.
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**`button-primary`** — the off-white CTA on dark canvas.
|
||||
- Background `{colors.primary}` (off-white), text `{colors.on-primary}` (warm dark), label `{typography.button-md}`, padding `{spacing.sm} {spacing.lg}`, shape `{rounded.sm}` 3 px. Tight.
|
||||
|
||||
**`button-secondary-ghost`** — the ghost-style secondary used for nav and tertiary actions.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, no border, same typography / shape.
|
||||
|
||||
**`button-icon-circular`** — the circular icon container.
|
||||
- Background `{colors.canvas}`, ink icon, shape `{rounded.full}`. Used for nav controls (search, theme).
|
||||
|
||||
### Cards & Containers
|
||||
|
||||
**`card-content`** — the default content card on canvas-soft.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, padding `{spacing.xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`card-mockup`** — the terminal-screenshot mockup card.
|
||||
- Same chrome as `card-content` but body in `{typography.code}` (DM Mono) when text appears inside.
|
||||
|
||||
**`download-tile`** — the Mac / Linux / Windows download tile.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, hairline border, padding `{spacing.xl}`, shape `{rounded.md}`. Hosts a platform icon + label + download CTA.
|
||||
|
||||
**`partner-logo-tile`** — the canvas-soft tile hosting a partner logo.
|
||||
- Background `{colors.canvas-soft}`, monochrome logo SVG inside, padding `{spacing.lg}`, shape `{rounded.md}`.
|
||||
|
||||
**`testimonial-card`** — the single quote-style card with a portrait.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.md}`. Portrait 1:1 + body in `{typography.body-md}`.
|
||||
|
||||
**`press-row`** — the press-coverage list item.
|
||||
- Background `{colors.canvas}` (no fill — sits on the canvas band), 1 px solid bottom border `{colors.hairline}`, body in `{typography.body-md}`, padding `{spacing.lg}` 0.
|
||||
|
||||
**`job-row`** — the "Join our team" list item (single row per open role).
|
||||
- Background `{colors.canvas}`, 1 px solid bottom border, body in `{typography.body-md-strong}`, padding `{spacing.lg}` 0.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the dark-canvas text input.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, body in `{typography.body-sm}`, padding `{spacing.sm} {spacing.md}`, shape `{rounded.sm}`.
|
||||
|
||||
### Navigation
|
||||
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`.
|
||||
|
||||
**`nav-link`** — link items in nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, body in `{typography.body-sm-strong}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.sm}`.
|
||||
|
||||
**`footer`** — the footer band.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.3xl} {spacing.xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
### Signature Components
|
||||
|
||||
**`hero-band`** — the dark hero band hosting the 64-px Inter headline.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.xl}`. Headline `{typography.display-xl}` (64 px / 400 / `-1.6 px`). Below: a 2-column terminal-mockup split.
|
||||
|
||||
**`content-band`** — the standard content band.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.5xl} {spacing.xl}`. Section headline `{typography.display-md}`.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use warm off-white (`#faf9f6`) for text instead of pure white — the cream undertone is essential
|
||||
- Keep buttons restrained and muted — dark fill (#353534) with muted text (#afaeac), no bright CTAs
|
||||
- Apply Matter Regular (weight 400) for nearly everything — even headlines. Reserve Medium (500) for emphasis only
|
||||
- Use uppercase labels with wide letter-spacing (1.4px–2.4px) for categorization
|
||||
- Interleave nature photography with product screenshots — this is core to the brand identity
|
||||
- Maintain the almost monochromatic warm gray palette — no bold accent colors
|
||||
- Use semi-transparent borders (`rgba(226, 226, 226, 0.35)`) for card containment instead of shadows
|
||||
- Keep negative letter-spacing on headlines (-0.4px to -2.4px) for Matter's compressed display treatment
|
||||
- Reserve `{colors.primary}` off-white for primary CTA pills and default text. There is no chromatic accent.
|
||||
- Use tight `{rounded.sm}` 3 px or `{rounded.md}` 4 px button radii. The brand never uses generous pills for CTAs.
|
||||
- Set hero headlines in Inter weight 400 with `-1.6 px` tracking. The brand reads as quietly confident.
|
||||
- Pair Inter (sentence-case) with DM Mono (code blocks, terminal mockups).
|
||||
- Keep the warm-dark canvas tone — pure black breaks the brand's identity.
|
||||
|
||||
### Don't
|
||||
- Use pure white (#ffffff) for text — it's always warm parchment (#faf9f6)
|
||||
- Add bold accent colors (blue, red, green) — the system is deliberately monochromatic warm grays
|
||||
- Apply bold weight (700+) to any text — Warp never goes above Medium (500)
|
||||
- Use heavy drop shadows — depth comes from borders, photography, and opacity shifts
|
||||
- Create cold or blue-tinted dark backgrounds — the warmth is essential
|
||||
- Add decorative gradients or glow effects — the photography provides all visual interest
|
||||
- Use tight, compressed layouts — the editorial spacing is generous and contemplative
|
||||
- Mix in additional typefaces beyond the Matter family + Inter supplement
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | <810px | Single column, stacked sections, hero text reduces to ~48px, hamburger nav |
|
||||
| Tablet | 810px–1500px | 2-column features begin, photography scales, nav links partially visible |
|
||||
| Desktop | >1500px | Full cinematic layout, 80px hero display, side-by-side photography + text |
|
||||
|
||||
### Touch Targets
|
||||
- Pill buttons: 50px radius with 10px padding — comfortable touch targets
|
||||
- Nav links: 16px text with surrounding padding for accessibility
|
||||
- Mobile CTAs: Full-width pills on mobile for easy thumb reach
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Navigation**: Full horizontal nav → simplified mobile navigation
|
||||
- **Hero text**: 80px display → 56px → 48px across breakpoints
|
||||
- **Feature sections**: Side-by-side photography + text → stacked vertically
|
||||
- **Photography**: Scales within containers, maintains cinematic aspect ratios
|
||||
- **Section spacing**: Reduces proportionally — generous desktop → compact mobile
|
||||
|
||||
### Image Behavior
|
||||
- Nature photography scales responsively, maintaining wide cinematic ratios
|
||||
- Terminal screenshots maintain aspect ratios within responsive containers
|
||||
- Video elements scale with 10px radius maintained
|
||||
- No art direction changes — same compositions across breakpoints
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary Text: Warm Parchment (`#faf9f6`)
|
||||
- Secondary Text: Ash Gray (`#afaeac`)
|
||||
- Tertiary Text: Stone Gray (`#868584`)
|
||||
- Button Background: Earth Gray (`#353534`)
|
||||
- Border: Mist Border (`rgba(226, 226, 226, 0.35)`)
|
||||
- Background: Deep warm near-black (page background)
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on warm dark background with 80px Matter Regular heading in warm parchment (#faf9f6), line-height 1.0, letter-spacing -2.4px, and a dark pill button (#353534, 50px radius, #afaeac text)"
|
||||
- "Design a feature card with semi-transparent border (rgba(226,226,226,0.35)), 12px radius, warm dark background, Matter Regular heading at 24px, and ash gray (#afaeac) body text at 18px"
|
||||
- "Build a category label using Matter Regular at 12px, uppercase transform, letter-spacing 2.4px, stone gray (#868584) color — editorial magazine style"
|
||||
- "Create a testimonial section with warm parchment quotes in Matter Regular 24px, attributed in stone gray (#868584), on dark background with minimal ornamentation"
|
||||
- "Design a navigation bar with warm dark background, Matter Regular links at 16px in stone gray (#868584), hover to warm parchment (#faf9f6), and a dark pill CTA button (#353534) at the right"
|
||||
|
||||
### Iteration Guide
|
||||
When refining existing screens generated with this design system:
|
||||
1. Verify text color is warm parchment (#faf9f6) not pure white — the warmth is subtle but essential
|
||||
2. Ensure all buttons use the restrained dark palette (#353534) — no bright or colorful CTAs
|
||||
3. Check that Matter Regular (400) is the default weight — Medium (500) only for emphasis
|
||||
4. Confirm uppercase labels have wide letter-spacing (1.4px–2.4px) — tight uppercase feels wrong here
|
||||
5. The overall tone should feel warm and calm, like a well-designed magazine — not aggressive or tech-flashy
|
||||
- Don't introduce a chromatic brand accent. The off-white-on-warm-dark IS the brand's voice.
|
||||
- Don't render the hero headline in heavy weight (700+). The brand's display is intentionally light.
|
||||
- Don't use generous pill CTAs. The brand's button radius is 3-4 px, almost rectangular.
|
||||
- Don't replace the warm dark canvas with neutral gray or pure black. The warmth IS the brand.
|
||||
- Don't drop a soft drop-shadow on cards. Hairlines + surface contrast carry elevation.
|
||||
|
||||
@ -1,92 +1,588 @@
|
||||
# Design System Inspired by Webflow
|
||||
---
|
||||
version: alpha
|
||||
name: Webflow Inspired
|
||||
description: An inspired interpretation of Webflow's design language — a visual web development platform whose surface contrasts a deep near-black `#080808` primary against a generous white canvas, broken by a five-stop chromatic accent system (purple / pink / blue / orange / green) that maps to the brand's product categories, and anchored by the proprietary WF Visual Sans family used at restrained 500 / 600 weights with negative tracking.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#080808"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#080808"
|
||||
ink-strong: "#222222"
|
||||
body: "#363636"
|
||||
body-mid: "#5a5a5a"
|
||||
mute: "#898989"
|
||||
mute-soft: "#ababab"
|
||||
hairline: "#d8d8d8"
|
||||
canvas: "#ffffff"
|
||||
accent-purple: "#7a3dff"
|
||||
accent-pink: "#ed52cb"
|
||||
accent-blue: "#3b89ff"
|
||||
accent-blue-deep: "#006acc"
|
||||
accent-blue-info: "#146ef5"
|
||||
accent-orange: "#ff6b00"
|
||||
accent-green: "#00d722"
|
||||
accent-yellow: "#ffae13"
|
||||
accent-red: "#ee1d36"
|
||||
|
||||
Webflow's website is a visually rich, tool-forward platform that communicates "design without code" through clean white surfaces, the signature Webflow Blue (`#146ef5`), and a rich secondary color palette (purple, pink, green, orange, yellow, red). The custom WF Visual Sans Variable font creates a confident, precise typographic system with weight 600 for display and 500 for body.
|
||||
typography:
|
||||
display-xxl:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 80px
|
||||
fontWeight: 600
|
||||
lineHeight: 83.2px
|
||||
letterSpacing: -0.8px
|
||||
display-xl:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 56px
|
||||
fontWeight: 600
|
||||
lineHeight: 58.24px
|
||||
display-lg:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 44.8px
|
||||
fontWeight: 600
|
||||
lineHeight: 46.6px
|
||||
display-md:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 500
|
||||
lineHeight: 41.6px
|
||||
display-sm:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 500
|
||||
lineHeight: 31.2px
|
||||
display-xs:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 500
|
||||
lineHeight: 28px
|
||||
eyebrow-uppercase:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 15px
|
||||
fontWeight: 500
|
||||
lineHeight: 19.5px
|
||||
letterSpacing: 1.5px
|
||||
eyebrow-uppercase-sm:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 500
|
||||
lineHeight: 12px
|
||||
letterSpacing: 0.6px
|
||||
body-lg:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 28.8px
|
||||
fontWeight: 400
|
||||
lineHeight: 46.08px
|
||||
letterSpacing: -0.288px
|
||||
body-md:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 25.6px
|
||||
letterSpacing: -0.16px
|
||||
body-md-strong:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 25.6px
|
||||
letterSpacing: -0.16px
|
||||
body-sm:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 22.4px
|
||||
body-sm-strong:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 22.4px
|
||||
caption:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 12.8px
|
||||
fontWeight: 550
|
||||
lineHeight: 15.36px
|
||||
caption-mono:
|
||||
fontFamily: WFVisualSans-Mono, Inconsolata, ui-monospace, SFMono-Regular, Menlo, monospace
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 18px
|
||||
button-md:
|
||||
fontFamily: WF Visual Sans Variable, Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 500
|
||||
lineHeight: 25.6px
|
||||
letterSpacing: -0.16px
|
||||
|
||||
rounded:
|
||||
none: 0px
|
||||
xs: 2px
|
||||
sm: 4px
|
||||
md: 8px
|
||||
full: 9999px
|
||||
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
padding: "{spacing.lg} {spacing.3xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-secondary:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-text-arrow:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
padding: "{spacing.xl} 0"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.sm}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
badge-info:
|
||||
backgroundColor: "{colors.accent-blue-info}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.caption}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.sm}"
|
||||
badge-info-soft:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.accent-blue-info}"
|
||||
typography: "{typography.caption}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xs} {spacing.sm}"
|
||||
card-feature:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
card-feature-dark:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
card-pricing:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xxl}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-xxl}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
content-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
category-card-purple:
|
||||
backgroundColor: "{colors.accent-purple}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
category-card-blue:
|
||||
backgroundColor: "{colors.accent-blue}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
category-card-orange:
|
||||
backgroundColor: "{colors.accent-orange}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
category-card-green:
|
||||
backgroundColor: "{colors.accent-green}"
|
||||
textColor: "{colors.primary}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
category-card-pink:
|
||||
backgroundColor: "{colors.accent-pink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body-mid}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.3xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.2xl}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Webflow positions itself as the visual web development platform — the marketing surface reads as a confident professional product, not a tech startup. The default page is a generous white canvas (`{colors.canvas}`) with a deep near-black `{colors.primary}` (`#080808`) for the brand's primary CTA, typography, and ink. Around this restrained primary, the brand layers a five-stop chromatic accent system — `{colors.accent-purple}` `#7a3dff`, `{colors.accent-pink}` `#ed52cb`, `{colors.accent-blue}` `#3b89ff`, `{colors.accent-orange}` `#ff6b00`, `{colors.accent-green}` `#00d722` — each mapped to one of the platform's product categories (design, CMS, hosting, ecommerce, etc.). These accents appear as full-card fills inside the product-category grid, not as button colours; the brand's primary CTA stays near-black.
|
||||
|
||||
Type carries the second decisive voice. The proprietary `WF Visual Sans Variable` family carries every display, body, and label role at weight 500 / 600 — the brand never goes heavier than semibold, never lighter than regular. Hero display sits at 80 px / weight 600 / `-0.8 px` tracking — confident but not shouting. Uppercase eyebrows in 15 px weight 500 with `1.5 px` positive tracking mark every section header.
|
||||
|
||||
The shape system is restrained. Buttons take a tight `{rounded.sm}` 4 px radius — neither pill nor square; the brand reads as engineered. Cards step up to `{rounded.md}` 8 px. Pill (`{rounded.full}` 9999 px) is reserved for circular icon containers. Layered drop-shadows on featured cards add modest elevation but never feel material-heavy.
|
||||
|
||||
**Key Characteristics:**
|
||||
- White canvas with near-black (`#080808`) text
|
||||
- Webflow Blue (`#146ef5`) as primary brand + interactive color
|
||||
- WF Visual Sans Variable — custom variable font with weight 500–600
|
||||
- Rich secondary palette: purple `#7a3dff`, pink `#ed52cb`, green `#00d722`, orange `#ff6b00`, yellow `#ffae13`, red `#ee1d36`
|
||||
- Conservative 4px–8px border-radius — sharp, not rounded
|
||||
- Multi-layer shadow stacks (5-layer cascading shadows)
|
||||
- Uppercase labels: 10px–15px, weight 500–600, wide letter-spacing (0.6px–1.5px)
|
||||
- translate(6px) hover animation on buttons
|
||||
- A two-colour conversion hierarchy — `{colors.primary}` near-black for every primary CTA, white-on-hairline for every secondary. Chromatic accents are used as full surface fills on category cards, never as button backgrounds.
|
||||
- The brand's signature is its **five-stop chromatic category palette**: purple / pink / blue / orange / green, each tied to a product surface. Used at full saturation as card fills.
|
||||
- Hero typography at 80 px weight 600 with `-0.8 px` tracking — restrained, confident, never billboard-loud.
|
||||
- WF Visual Sans Variable is the single family; the brand uses no separate sans for body / display. WFVisualSans-Mono / Inconsolata appears only for technical captions.
|
||||
- Tight `{rounded.sm}` 4 px button geometry; cards at `{rounded.md}` 8 px. The brand never uses pill CTAs.
|
||||
- Layered multi-offset drop-shadows on featured cards — the brand's only elevation cue.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Near Black** (`#080808`): Primary text
|
||||
- **Webflow Blue** (`#146ef5`): `--_color---primary--webflow-blue`, primary CTA and links
|
||||
- **Blue 400** (`#3b89ff`): `--_color---primary--blue-400`, lighter interactive blue
|
||||
- **Blue 300** (`#006acc`): `--_color---blue-300`, darker blue variant
|
||||
- **Button Hover Blue** (`#0055d4`): `--mkto-embed-color-button-hover`
|
||||
### Brand & Accent
|
||||
- **Ink Black** (`{colors.primary}` — `#080808`): The brand's primary conversion colour. Every primary CTA, every heading, every wordmark. Deeper than pure black to read as branded.
|
||||
- **Accent Purple** (`{colors.accent-purple}` — `#7a3dff`): One of the five chromatic category accents — used for design / build product surfaces.
|
||||
- **Accent Pink** (`{colors.accent-pink}` — `#ed52cb`): Magenta accent — used for animation / interaction product surfaces.
|
||||
- **Accent Blue** (`{colors.accent-blue}` — `#3b89ff`): Bright cyan-blue — used for SEO / analytics product surfaces.
|
||||
- **Accent Blue Deep** (`{colors.accent-blue-deep}` — `#006acc`): The deeper blue used for emphasis links.
|
||||
- **Accent Blue Info** (`{colors.accent-blue-info}` — `#146ef5`): The badge-info blue.
|
||||
- **Accent Orange** (`{colors.accent-orange}` — `#ff6b00`): Used for hosting / infrastructure product surfaces.
|
||||
- **Accent Green** (`{colors.accent-green}` — `#00d722`): Used for ecommerce / status-success surfaces.
|
||||
- **Accent Yellow** (`{colors.accent-yellow}` — `#ffae13`): Used for warning / collaboration product surfaces.
|
||||
- **Accent Red** (`{colors.accent-red}` — `#ee1d36`): Used for error / destructive states.
|
||||
|
||||
### Secondary Accents
|
||||
- **Purple** (`#7a3dff`): `--_color---secondary--purple`
|
||||
- **Pink** (`#ed52cb`): `--_color---secondary--pink`
|
||||
- **Green** (`#00d722`): `--_color---secondary--green`
|
||||
- **Orange** (`#ff6b00`): `--_color---secondary--orange`
|
||||
- **Yellow** (`#ffae13`): `--_color---secondary--yellow`
|
||||
- **Red** (`#ee1d36`): `--_color---secondary--red`
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The default page background.
|
||||
- **Hairline** (`{colors.hairline}` — `#d8d8d8`): 1 px solid borders — input borders, card chrome, divider lines.
|
||||
|
||||
### Neutral
|
||||
- **Gray 800** (`#222222`): Dark secondary text
|
||||
- **Gray 700** (`#363636`): Mid text
|
||||
- **Gray 300** (`#ababab`): Muted text, placeholder
|
||||
- **Mid Gray** (`#5a5a5a`): Link text
|
||||
- **Border Gray** (`#d8d8d8`): Borders, dividers
|
||||
- **Border Hover** (`#898989`): Hover border
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#080808`): Default text and headings.
|
||||
- **Ink Strong** (`{colors.ink-strong}` — `#222222`): Near-black emphasis.
|
||||
- **Body** (`{colors.body}` — `#363636`): Default body paragraph color.
|
||||
- **Body Mid** (`{colors.body-mid}` — `#5a5a5a`): Mid-emphasis secondary text — footer lines, captions.
|
||||
- **Mute** (`{colors.mute}` — `#898989`): Lower-priority text.
|
||||
- **Mute Soft** (`{colors.mute-soft}` — `#ababab`): The lightest text role — placeholder text, fine print.
|
||||
|
||||
### Shadows
|
||||
- **5-layer cascade**: `rgba(0,0,0,0) 0px 84px 24px, rgba(0,0,0,0.01) 0px 54px 22px, rgba(0,0,0,0.04) 0px 30px 18px, rgba(0,0,0,0.08) 0px 13px 13px, rgba(0,0,0,0.09) 0px 3px 7px`
|
||||
### Semantic
|
||||
- **Info Blue** (`{colors.accent-blue-info}` — `#146ef5`): Info badge / notification.
|
||||
- **Success Green** (`{colors.accent-green}` — `#00d722`): Success indicators.
|
||||
- **Warning Yellow** (`{colors.accent-yellow}` — `#ffae13`): Warning states.
|
||||
- **Error Red** (`{colors.accent-red}` — `#ee1d36`): Validation / destructive.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font: `WF Visual Sans Variable`, fallback: `Arial`
|
||||
### Font Family
|
||||
A single proprietary family carries every typographic role: **WF Visual Sans Variable** (with `Arial` system fallback). Weights 400 / 500 / 550 / 600 are present; the brand never uses 700 / 800 / 900. A monospace variant — **WFVisualSans-Mono** with `Inconsolata` fallback — handles rare technical caption moments and code-style labels. OpenType features `"ss02"`, `"ss10"`, `"zero"` are enabled in the mono variant for the styled zero glyph.
|
||||
|
||||
| Role | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|--------|-------------|----------------|-------|
|
||||
| Display Hero | 80px | 600 | 1.04 | -0.8px | |
|
||||
| Section Heading | 56px | 600 | 1.04 | normal | |
|
||||
| Sub-heading | 32px | 500 | 1.30 | normal | |
|
||||
| Feature Title | 24px | 500–600 | 1.30 | normal | |
|
||||
| Body | 20px | 400–500 | 1.40–1.50 | normal | |
|
||||
| Body Standard | 16px | 400–500 | 1.60 | -0.16px | |
|
||||
| Button | 16px | 500 | 1.60 | -0.16px | |
|
||||
| Uppercase Label | 15px | 500 | 1.30 | 1.5px | uppercase |
|
||||
| Caption | 14px | 400–500 | 1.40–1.60 | normal | |
|
||||
| Badge Uppercase | 12.8px | 550 | 1.20 | normal | uppercase |
|
||||
| Micro Uppercase | 10px | 500–600 | 1.30 | 1px | uppercase |
|
||||
| Code: Inconsolata (companion monospace font)
|
||||
### Hierarchy
|
||||
|
||||
## 4. Component Stylings
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xxl}` | 80px | 600 | 83.2px | -0.8px | Hero headline. |
|
||||
| `{typography.display-xl}` | 56px | 600 | 58.24px | 0 | Sub-hero displays. |
|
||||
| `{typography.display-lg}` | 44.8px | 600 | 46.6px | 0 | Section headlines. |
|
||||
| `{typography.display-md}` | 32px | 500 | 41.6px | 0 | Card-cluster headlines. |
|
||||
| `{typography.display-sm}` | 24px | 500 | 31.2px | 0 | Sub-section displays. |
|
||||
| `{typography.display-xs}` | 20px | 500 | 28px | 0 | Inline display micro-headings. |
|
||||
| `{typography.eyebrow-uppercase}` | 15px | 500 | 19.5px | 1.5px | UPPERCASE eyebrow tags above sections. |
|
||||
| `{typography.eyebrow-uppercase-sm}` | 12px | 500 | 12px | 0.6px | Small uppercase metadata. |
|
||||
| `{typography.body-lg}` | 28.8px | 400 | 46.08px | -0.288px | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 25.6px | -0.16px | Default body. |
|
||||
| `{typography.body-md-strong}` | 16px | 500 | 25.6px | -0.16px | Bolded inline body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 22.4px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 14px | 500 | 22.4px | 0 | Bold caption / nav-link. |
|
||||
| `{typography.caption}` | 12.8px | 550 | 15.36px | 0 | Badge labels (the brand's signature 550 weight). |
|
||||
| `{typography.caption-mono}` | 12px | 400 | 18px | 0 | Mono code captions. |
|
||||
| `{typography.button-md}` | 16px | 500 | 25.6px | -0.16px | Button labels. |
|
||||
|
||||
### Principles
|
||||
- **Weight ceiling at 600.** The brand never uses 700+. Confident, not loud.
|
||||
- **Negative tracking at display sizes.** `-0.8 px` at 80 px, scaling through. Tight kerning is part of the voice.
|
||||
- **Uppercase eyebrows mark every section.** 15 px / weight 500 / `1.5 px` positive tracking is the brand's signature label style.
|
||||
- **Single family across the system.** No separate display vs body face. The variable axes do the work.
|
||||
|
||||
### Note on Font Substitutes
|
||||
WF Visual Sans Variable is proprietary. Open-source substitutes:
|
||||
- **Display + body** — *Inter* weights 400 / 500 / 600 with `font-feature-settings: "ss01"` enabled is the closest stylistic match.
|
||||
- **Mono** — *Inconsolata* (the documented fallback) or *DM Mono*.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px (with frequent 0.4 / 0.8 sub-multiples for fine padding).
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px.
|
||||
- **Section padding**: hero / content bands use `{spacing.3xl}` 32 px gutters with generous vertical spacing.
|
||||
- **Card interior padding**: feature and pricing cards sit at `{spacing.3xl}` 32 px.
|
||||
|
||||
### Grid & Container
|
||||
- Marketing container is wide (effectively edge-to-edge with `{spacing.3xl}` gutters).
|
||||
- Category card grid: 2 / 3-up at desktop with mixed sizing (some larger feature cards span 2 columns).
|
||||
- Pricing tier grid: 3-up at desktop, 1-up at mobile.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 479px | Hero stacks; all grids 1-up. |
|
||||
| Mobile-Large | 479–767px | Same as Mobile. |
|
||||
| Tablet | 768–991px | 2-up grids. |
|
||||
| Desktop | ≥ 992px | Full multi-up grids. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render at ~44 px (12 px vertical padding + 25.6 px line-height). WCAG AAA met.
|
||||
|
||||
#### Collapsing Strategy
|
||||
- Nav: full link row at desktop. Hamburger at mobile.
|
||||
- Category card grid: 2 / 3 / 4-up at desktop, drops to 1-up at mobile.
|
||||
- Pricing tier: 3 / 4-up at desktop, 1-up at mobile.
|
||||
|
||||
#### Image Behavior
|
||||
- Category cards: full-bleed solid colour fills (no photography).
|
||||
- Product screenshots: 16:9 inside `{rounded.md}` card chrome.
|
||||
- No portrait imagery in the marketing surface.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default bands. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` border on `{colors.canvas}`. | Default card chrome and input borders. |
|
||||
| Level 2 — Layered Drop | Multi-stop layered shadow with subtle warm offsets — `0 84px 24px rgba(0,0,0,0), 0 54px 22px rgba(0,0,0,0.01), 0 30px 18px rgba(0,0,0,0.04), 0 13px 13px rgba(0,0,0,0.08), 0 3px 7px rgba(0,0,0,0.09)`. | Featured cards needing visible lift. |
|
||||
| Level 3 — Layered Drop Strong | Deeper version of Level 2 with `0.12` final offset opacity. | Pricing / modal-level emphasis. |
|
||||
| Level 4 — Heavy Modal | Extremely heavy multi-stop — `0 24px 24px rgba(0,0,0,0.26), 0 6px 13px rgba(0,0,0,0.29)` final stops. | Modal / dialog surfaces. |
|
||||
|
||||
### Decorative Depth
|
||||
- The chromatic category cards (full-saturation purple / pink / blue / orange / green fills) provide visual depth through pure colour contrast against the white canvas.
|
||||
- Layered shadow recipes are the brand's only true atmospheric effect — they're 5-stop drop-shadow stacks with very low individual opacities.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.xs}` | 2px | Tight inline pills. |
|
||||
| `{rounded.sm}` | 4px | The brand's canonical button + badge + small-element radius. |
|
||||
| `{rounded.md}` | 8px | Card chrome and feature / category cards. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers only. |
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
- Transparent: text `#080808`, translate(6px) on hover
|
||||
- White circle: 50% radius, white bg
|
||||
- Blue badge: `#146ef5` bg, 4px radius, weight 550
|
||||
|
||||
### Cards: `1px solid #d8d8d8`, 4px–8px radius
|
||||
### Badges: Blue-tinted bg at 10% opacity, 4px radius
|
||||
**`button-primary`** — the canonical near-black CTA.
|
||||
- Background `{colors.primary}` (`#080808`), text `{colors.on-primary}` white, label `{typography.button-md}` (16 px weight 500), padding `{spacing.md} {spacing.xl}`, shape `{rounded.sm}` 4 px.
|
||||
|
||||
## 5. Layout
|
||||
- Spacing: fractional scale (1px, 2.4px, 3.2px, 4px, 5.6px, 6px, 7.2px, 8px, 9.6px, 12px, 16px, 24px)
|
||||
- Radius: 2px, 4px, 8px, 50% — conservative, sharp
|
||||
- Breakpoints: 479px, 768px, 992px
|
||||
**`button-secondary`** — the white outline CTA.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` border, same typography + padding + shape.
|
||||
|
||||
## 6. Depth: 5-layer cascading shadow system
|
||||
**`button-text-arrow`** — the underlined text-link CTA with arrow used in long-form sections.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, no border, body in `{typography.button-md}`, padding `{spacing.xl}` 0.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
- Do: Use WF Visual Sans Variable at 500–600. Blue (#146ef5) for CTAs. 4px radius. translate(6px) hover.
|
||||
- Don't: Round beyond 8px for functional elements. Use secondary colors on primary CTAs.
|
||||
**`button-icon-circular`** — the circular icon button for carousel controls.
|
||||
- Background `{colors.canvas}`, ink icon, shape `{rounded.full}`.
|
||||
|
||||
## 8. Responsive: 479px, 768px, 992px
|
||||
### Cards & Containers
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
- Text: Near Black (`#080808`)
|
||||
- CTA: Webflow Blue (`#146ef5`)
|
||||
- Background: White (`#ffffff`)
|
||||
- Border: `#d8d8d8`
|
||||
- Secondary: Purple `#7a3dff`, Pink `#ed52cb`, Green `#00d722`
|
||||
**`card-feature`** — the canonical feature card on canvas.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, padding `{spacing.3xl}`, shape `{rounded.md}`. Often elevated to Level 2 shadow when featured.
|
||||
|
||||
**`card-feature-dark`** — the polarity-flipped feature card on near-black.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`card-pricing`** — the pricing-tier card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, hairline border, padding `{spacing.3xl}`, shape `{rounded.md}`. Layered shadow on the featured tier.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the canonical text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, body in `{typography.body-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}`.
|
||||
|
||||
### Navigation
|
||||
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg} {spacing.3xl}`.
|
||||
|
||||
**`nav-link`** — link items inside `nav-bar`.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm-strong}`.
|
||||
|
||||
**`footer`** — the footer band.
|
||||
- Background `{colors.canvas}`, text `{colors.body-mid}`, padding `{spacing.3xl} {spacing.3xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
### Signature Components
|
||||
|
||||
**`hero-band`** — the white hero band.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-xxl}` (80 px weight 600).
|
||||
|
||||
**`hero-band-dark`** — the polarity-flipped near-black hero band (used on some campaign pages).
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, same padding / headline scale.
|
||||
|
||||
**`content-band`** — the standard content band on canvas.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.3xl}`. Section headline in `{typography.display-lg}`.
|
||||
|
||||
**`category-card-purple`** — full-fill purple category card.
|
||||
- Background `{colors.accent-purple}`, text white, padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`category-card-pink`** — full-fill pink category card.
|
||||
- Background `{colors.accent-pink}`, text white, padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`category-card-blue`** — full-fill blue category card.
|
||||
- Background `{colors.accent-blue}`, text white, padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`category-card-orange`** — full-fill orange category card.
|
||||
- Background `{colors.accent-orange}`, text white, padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`category-card-green`** — full-fill green category card (uses ink text for legibility against the lighter green).
|
||||
- Background `{colors.accent-green}`, text `{colors.primary}` (ink), padding `{spacing.3xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`badge-info`** + **`badge-info-soft`** — info badges in solid blue or soft outline.
|
||||
- Filled: bg `{colors.accent-blue-info}` text white. Soft: bg canvas, text `{colors.accent-blue-info}`. Both at `{typography.caption}` (12.8 px weight 550) — the brand's signature 550-weight caption.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Reserve `{colors.primary}` (`#080808`) for every primary CTA, every heading, and every wordmark. Near-black is the conversion colour.
|
||||
- Use the five chromatic accents (purple / pink / blue / orange / green) as full-fill category cards, NOT as button backgrounds.
|
||||
- Set hero headlines in `{typography.display-xxl}` weight 600 with `-0.8 px` tracking.
|
||||
- Pair the proprietary WF Visual Sans family across every typographic role.
|
||||
- Use `{rounded.sm}` 4 px for buttons, `{rounded.md}` 8 px for cards. The brand never uses pill CTAs.
|
||||
- Use layered multi-stop drop-shadows on featured cards — the brand's distinctive elevation recipe.
|
||||
|
||||
### Don't
|
||||
- Don't promote button-medium weight to 700+. The brand's weight ceiling is 600.
|
||||
- Don't use chromatic accents as button backgrounds. They're surface fills, not actions.
|
||||
- Don't render CTAs as pills. The brand's button geometry is tight 4 px rectangle.
|
||||
- Don't introduce a sixth accent colour. The 5-stop palette is the system.
|
||||
|
||||
@ -1,278 +1,497 @@
|
||||
# Design System Inspired by WIRED
|
||||
---
|
||||
version: alpha
|
||||
name: Wired Inspired
|
||||
description: An inspired interpretation of Wired's design language — a flagship technology-magazine brand whose surface is a strict editorial duet of stark black wordmark on white canvas, anchored by a tall narrow custom display serif for hero headlines, a humanist serif body face for long-form reading, and a clean sans face for metadata; layout reads like a printed magazine ported to the web with very little marketing chrome.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#000000"
|
||||
on-primary: "#ffffff"
|
||||
ink: "#000000"
|
||||
ink-soft: "#1a1a1a"
|
||||
body: "#757575"
|
||||
hairline: "#e0e0e0"
|
||||
canvas: "#ffffff"
|
||||
canvas-soft: "#f5f5f5"
|
||||
link: "#057dbc"
|
||||
|
||||
WIRED's homepage feels like a printed broadsheet that someone has plugged into a wall socket. The grid is dense, the rules are thin, the type is loud, and almost every surface is paper-white or pure black with no rounded corners and no decoration that doesn't earn its place. Image rectangles butt directly against headlines, hairline dividers separate stories the way pica rules separate columns in a real magazine, and the only colors that aren't grayscale come from the photography itself. There is no "card with shadow" anywhere — the entire layout is held together by typographic weight and the discipline of rules and whitespace, the same way a Condé Nast print page would be assembled in a paste-up room.
|
||||
typography:
|
||||
display-hero:
|
||||
fontFamily: WiredDisplay, "Times New Roman", Georgia, serif
|
||||
fontSize: 64px
|
||||
fontWeight: 400
|
||||
lineHeight: 59.52px
|
||||
letterSpacing: -0.5px
|
||||
display-lg:
|
||||
fontFamily: WiredDisplay, "Times New Roman", Georgia, serif
|
||||
fontSize: 48px
|
||||
fontWeight: 400
|
||||
lineHeight: 50.4px
|
||||
letterSpacing: -0.4px
|
||||
display-md:
|
||||
fontFamily: WiredDisplay, "Times New Roman", Georgia, serif
|
||||
fontSize: 32px
|
||||
fontWeight: 400
|
||||
lineHeight: 35.2px
|
||||
letterSpacing: -0.3px
|
||||
display-sm:
|
||||
fontFamily: WiredDisplay, "Times New Roman", Georgia, serif
|
||||
fontSize: 26px
|
||||
fontWeight: 400
|
||||
lineHeight: 28.08px
|
||||
display-xs:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 700
|
||||
lineHeight: 24px
|
||||
letterSpacing: -0.28px
|
||||
body-serif-lg:
|
||||
fontFamily: BreveText, Georgia, "Times New Roman", serif
|
||||
fontSize: 19px
|
||||
fontWeight: 400
|
||||
lineHeight: 27.93px
|
||||
letterSpacing: 0.108px
|
||||
body-serif-md:
|
||||
fontFamily: BreveText, Georgia, "Times New Roman", serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
letterSpacing: 0.09px
|
||||
body-md:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 17px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-md-strong:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 17px
|
||||
fontWeight: 700
|
||||
lineHeight: 22px
|
||||
letterSpacing: -0.144px
|
||||
body-sm:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 18px
|
||||
letterSpacing: 0.4px
|
||||
body-sm-strong:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 700
|
||||
lineHeight: 18px
|
||||
letterSpacing: 0.4px
|
||||
byline:
|
||||
fontFamily: BreveText, Georgia, "Times New Roman", serif
|
||||
fontSize: 12.73px
|
||||
fontWeight: 700
|
||||
lineHeight: 28px
|
||||
letterSpacing: 0.108px
|
||||
caption:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
button-md:
|
||||
fontFamily: Apercu, "Helvetica Neue", Helvetica, Arial, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 700
|
||||
lineHeight: 20px
|
||||
letterSpacing: 0.3px
|
||||
|
||||
The signature move is the **typographic stack**: a brutally large custom serif (WiredDisplay) for the main headline, a humanist serif (BreveText) for body and decks, a geometric sans (Apercu) for UI affordances, and a hard mono uppercase (WiredMono) for the kickers, eyebrows, and timestamps that mark every story. That mono kicker — usually black caps with letter-spacing wide enough to read as a Geiger-counter tick — is what makes a WIRED page instantly recognizable from across the room.
|
||||
rounded:
|
||||
none: 0px
|
||||
full: 9999px
|
||||
|
||||
There is exactly one accent color that matters: a saturated link blue (`#057dbc`) that lights up underlined hover states like a CRT scanline. Everything else is black, paper white, and two grays — the design's confidence comes from refusing to invent more.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 20px
|
||||
2xl: 24px
|
||||
3xl: 32px
|
||||
4xl: 48px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-outline:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.sm}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
story-card-large:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
padding: "{spacing.lg}"
|
||||
story-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xs}"
|
||||
padding: "{spacing.md}"
|
||||
story-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
padding: "{spacing.lg} 0"
|
||||
category-eyebrow:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
byline-row:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.byline}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-hero}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
masthead-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md-strong}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
hairline-divider:
|
||||
borderColor: "{colors.hairline}"
|
||||
footer:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.lg}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.none}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Wired is the flagship technology-magazine brand under Condé Nast — and the web surface refuses to dress itself as a SaaS marketing site. The page is unmistakably an editorial product: a white canvas, a strict black wordmark in the brand's proprietary `WiredDisplay` (a tall, narrow, high-contrast serif used at 64 px), and stacked story cards that read as a printed magazine grid ported to the screen. There is no atmospheric gradient, no decorative chrome, no chromatic accent — the brand's only colour beyond the black-and-white duet is the small `{colors.link}` (`#057dbc`) used for inline body links inside long-form articles.
|
||||
|
||||
Type carries the entire identity. Three families ladder the system: `WiredDisplay` (the proprietary high-contrast serif) for hero / section headlines; `BreveText` (a humanist serif) for long-form body and bylines; and `Apercu` (a humanist sans) for metadata, captions, eyebrow tags, and buttons. The pairing is editorial-grade: serifs for narrative, sans for navigation and structural labels.
|
||||
|
||||
Buttons are square. The brand uses `{rounded.none}` 0 px corners across the entire UI — newsletter sign-ups, login forms, "Read more" CTAs all render as sharp rectangles. The only circular shape is the `button-icon-circular` used for social-share affordances. There are no soft drop-shadows; the brand uses hairline borders for elevation when needed.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Newsstand-density editorial grid: rules and whitespace, never cards or shadows
|
||||
- Custom serif display + technical mono kickers — the Condé-Nast-meets-engineering-lab voice
|
||||
- Strictly square corners on every image, container, and ribbon (only icon buttons are circular)
|
||||
- 2px hard black borders on buttons and links — printerly, not webby
|
||||
- Mono ALL-CAPS eyebrows on every story with wide tracking (0.9–1.2px)
|
||||
- Single ink-blue accent for links; everything else lives in pure grayscale
|
||||
- Dark theme = the *footer*, not the page; the page itself is committed paper-white
|
||||
- A strict black-and-white duet with no chromatic accent except the inline link blue `{colors.link}`. The brand reads as a printed magazine.
|
||||
- Three-face typographic system — `WiredDisplay` serif for display, `BreveText` serif for body, `Apercu` sans for metadata and buttons.
|
||||
- Square buttons (`{rounded.none}`) — the brand never softens corners on interactive elements.
|
||||
- A magazine-style story grid: large feature card at top, two-up secondary, then a vertical stack of bylined story rows separated by `{colors.hairline}` 1 px dividers.
|
||||
- The brand's only signature decorative move is the **masthead band** — a thin black strip with the wordmark centred, no other decoration.
|
||||
- A near-black `{colors.ink}` (`#000000`) footer band, no graphics, just text columns and the wordmark repeating.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary (Editorial Ink)
|
||||
- **WIRED Black** (`#000000`): Pure ink for ribbons, section dividers, button borders, headline rules — the strongest hand on the page.
|
||||
- **Page Ink** (`#1a1a1a`): Near-black used for headlines and body type. Slightly softened so long-form reading doesn't feel like staring at a power button.
|
||||
- **Paper White** (`#ffffff`): Default canvas for the entire site. Treat it like newsprint stock — uninterrupted, never tinted.
|
||||
### Brand & Accent
|
||||
- **Ink Black** (`{colors.primary}` — `#000000`): The brand's only "accent." Used for wordmark, headlines, CTAs, footer fill. Pure black, never softened.
|
||||
|
||||
### Secondary (Editorial Voice)
|
||||
- **Link Blue** (`#057dbc`): The single brand accent. Used for inline link hovers, breadcrumbs, and the rare button — never for backgrounds, never decorated. Think of it as the only color allowed in a black-and-white film.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): The default page background.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#f5f5f5`): Rare tint used for the comment-section background and search-result row hover states (not in the main page rhythm).
|
||||
- **Hairline** (`{colors.hairline}` — `#e0e0e0`): 1 px dividers between story rows. The brand's only "line."
|
||||
|
||||
### Surface & Background
|
||||
- **Newsprint** (`#ffffff`): Editorial pages, story grids, hero zones.
|
||||
- **Footer Ink** (`#1a1a1a`): The only inverted region on the homepage. Paper white type sits on top.
|
||||
- **Hairline Tint** (`#e2e8f0`): Reserved for `<hr>` elements between sections — barely visible, like a margin rule.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#000000`): Every headline, every body paragraph in BreveText.
|
||||
- **Ink Soft** (`{colors.ink-soft}` — `#1a1a1a`): A near-black variant used for caption-strong / footer link emphasis.
|
||||
- **Body** (`{colors.body}` — `#757575`): Secondary metadata — bylines, timestamps, supporting body lines.
|
||||
|
||||
### Neutrals & Text
|
||||
- **Headline Black** (`#1a1a1a`): All H1/H2 display type.
|
||||
- **Body Gray** (`#1a1a1a`): Long-form body text — same ink as headlines for unity.
|
||||
- **Caption Gray** (`#757575`): Secondary metadata: bylines, timestamps, photo credits.
|
||||
- **Disabled Gray** (`#999999`): Inactive links, low-priority labels.
|
||||
- **Hairline Border** (`#e2e8f0`): Subtle separators only.
|
||||
### Semantic
|
||||
The brand operates with one inline link colour and no separate error / success / warning palette in its marketing surface. Validation cues on form pages use the ink black + body grey hierarchy.
|
||||
|
||||
### Semantic & Accent
|
||||
- **Brand Hover Blue** (`#057dbc`): Link rollover state — also serves as the only "interactive" cue.
|
||||
- *(WIRED's homepage intentionally omits semantic success/error/warning palettes — this is editorial, not a SaaS dashboard.)*
|
||||
- **Link** (`{colors.link}` — `#057dbc`): The inline body-link blue. Used only inside long-form article body copy, never on UI buttons or navigation.
|
||||
|
||||
### Gradient System
|
||||
None. WIRED uses zero gradients. The closest thing to a gradient on the page is the tonal range inside a photograph — gradients live *in the imagery*, not in the chrome.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **WiredDisplay** (custom serif, fallback `helvetica`) — Display headlines and feature titles.
|
||||
- **BreveText** (humanist serif, fallback `helvetica`) — Article body, decks, longer captions.
|
||||
- **Apercu** (geometric sans, fallback `helvetica`) — UI labels, buttons, navigation, mid-weight headings.
|
||||
- **WiredMono** (custom monospace, fallback `helvetica`) — Eyebrows, kickers, timestamps, section labels, ALL CAPS.
|
||||
- **Inter** (sans, system fallback) — Utility UI in newer modules.
|
||||
- **ProximaNova** (sans, fallback `helvetica`) — Legacy UI surfaces.
|
||||
- **WIRED Mono** (custom mono, fallback `Monaco, Courier New, Courier`) — Article-page eyebrows.
|
||||
Three families ladder the system:
|
||||
1. **WiredDisplay** — the proprietary tall-narrow high-contrast serif used exclusively for display headlines (64 px hero, scaling down to 26 px sub-display). The brand's most-recognisable typographic signature.
|
||||
2. **BreveText** — the proprietary humanist serif used for long-form body, bylines, and editorial captions. Used at 16 – 19 px line-height 1.45 – 1.50 for comfortable reading density.
|
||||
3. **Apercu** — a humanist sans used for nav, button labels, category eyebrows, metadata, and captions. Weights 400 / 700.
|
||||
|
||||
Inter is loaded as a fourth fallback face for embedded utility surfaces (the comment section, account pages) but does not appear on the main marketing / article surface.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|---|---|---|---|---|---|---|
|
||||
| Display Headline (Hero) | WiredDisplay | 64px / 4.00rem | regular | 0.93 | -0.5px | Tight, almost touching descenders — newsstand presence |
|
||||
| Display Headline (Mobile / Mid) | WiredDisplay | 26px / 1.63rem | regular | 1.08 | — | Same face, scaled down for grid blocks |
|
||||
| Section Heading | Apercu | 20px / 1.25rem | 700 | 1.20 | -0.28px | Bold sans for module titles ("Most Popular", "Featured") |
|
||||
| Subheading | Apercu | 17px / 1.06rem | 700 | 1.29 | -0.144px | Story decks within feature blocks |
|
||||
| Article Deck (Serif) | BreveText | 19px / 1.19rem | regular | 1.47 | 0.108px | Long-form lead paragraphs |
|
||||
| Article Body (Serif) | BreveText | 16px / 1.00rem | regular | 1.50 | 0.09px | Standard paragraph text |
|
||||
| UI Heading | Apercu | 16px / 1.00rem | 700 | 1.25 | 0.3px | Inline UI labels, button captions |
|
||||
| Button Label | Apercu | 16px / 1.00rem | 700 | 1.25 | 0.3px | All caps optional, depending on placement |
|
||||
| Link (Inline UI) | Apercu | 14px / 0.88rem | regular | 1.29 | 0.4px | Footer links, secondary nav |
|
||||
| Eyebrow / Kicker | WiredMono | 13px / 0.81rem | regular | 1.23 | 0.92px | UPPERCASE — story category above headline |
|
||||
| Eyebrow Bold | WiredMono | 13px / 0.81rem | 700 | 1.23 | — | UPPERCASE — featured story marker |
|
||||
| Section Ribbon | WiredMono | 12px / 0.75rem | 700 | 1.00 | 1.2px | UPPERCASE — black-bar section labels |
|
||||
| Photo Caption | BreveText | 12.73px / 0.80rem | 700 | 2.20 (relaxed) | 0.108px | Generous leading — print-photo treatment |
|
||||
| Timestamp / Meta | WiredMono | 12px / 0.75rem | regular | 1.33 | 1.1px | UPPERCASE, used for "X HOURS AGO" markers |
|
||||
| Tertiary Footer Link | ProximaNova | 11px / 0.69rem | regular | 1.45 | — | Newsletter footer, legal links |
|
||||
| Inter UI Heading | Inter | 16px / 1.00rem | 600 | 1.23 | 0.108px | Newer module headers |
|
||||
| Inter UI Caption | Inter | 14px / 0.88rem | 600 | 1.40 | — | Compact UI metadata |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-hero}` | 64px | 400 | 59.5px | -0.5px | Cover-story headline. |
|
||||
| `{typography.display-lg}` | 48px | 400 | 50.4px | -0.4px | Major section / feature headlines. |
|
||||
| `{typography.display-md}` | 32px | 400 | 35.2px | -0.3px | Story-card large variant. |
|
||||
| `{typography.display-sm}` | 26px | 400 | 28px | 0 | Sub-display headings inside long-form articles. |
|
||||
| `{typography.display-xs}` | 20px | 700 | 24px | -0.28px | Sans (Apercu) display micro-headings for category callouts. |
|
||||
| `{typography.body-serif-lg}` | 19px | 400 | 27.93px | 0.108px | Lead paragraph of an article (BreveText). |
|
||||
| `{typography.body-serif-md}` | 16px | 400 | 24px | 0.09px | Default article body (BreveText). |
|
||||
| `{typography.body-md}` | 17px | 400 | 20px | 0 | Sans body (Apercu) for nav / metadata. |
|
||||
| `{typography.body-md-strong}` | 17px | 700 | 22px | -0.144px | Bold sans body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 18px | 0.4px | Secondary sans body. |
|
||||
| `{typography.body-sm-strong}` | 14px | 700 | 18px | 0.4px | Bold caption / nav-link. |
|
||||
| `{typography.byline}` | 12.73px | 700 | 28px | 0.108px | Article byline (BreveText). |
|
||||
| `{typography.caption}` | 12px | 400 | 16px | 0 | Fine print, image captions. |
|
||||
| `{typography.button-md}` | 16px | 700 | 20px | 0.3px | Button label. |
|
||||
|
||||
### Principles
|
||||
- **Four faces, four jobs.** WiredDisplay is for shouting, BreveText is for reading, Apercu is for clicking, WiredMono is for labeling. They never trade roles. This separation is what keeps the page from feeling like a typography sample.
|
||||
- **Tight headlines, generous body.** Display type runs as low as 0.93 line-height (nearly touching), while body BreveText opens out to 1.47–1.50. The contrast is the editorial fingerprint.
|
||||
- **Mono is always uppercase.** Every WiredMono usage carries `text-transform: uppercase` and 0.9–1.2px letter-spacing. Treat lowercase mono as broken — it should not appear on a WIRED page.
|
||||
- **Bold is rare.** Apercu uses weight 700 only for UI emphasis; the editorial layer (Display + BreveText) leans entirely on size and ink color, never on bolding.
|
||||
- **Letter-spacing has two registers**: positive (0.9–1.2px) for ALL-CAPS mono, negative (-0.144 to -0.5px) for large display serif. Never neutral on the largest type.
|
||||
- **Serif for narrative, sans for structure.** The serif faces never carry button labels or nav text; the sans face never carries article body.
|
||||
- **Display weight 400** — the proprietary WiredDisplay reads as elegant by virtue of its thin-tall-narrow design at default weight, not via weight 700+.
|
||||
- **Bylines use BreveText weight 700 with relaxed line-height 2.2.** The vertical breathing is part of the editorial signature.
|
||||
|
||||
### Note on Font Substitutes
|
||||
The line-height values in the hierarchy table (especially the 0.93 on the 64px hero) assume the **proprietary WiredDisplay and BreveText faces**, which have tight metrics with short ascenders/descenders. If you substitute these with wide-metric open-source fonts like **Playfair Display** or **Libre Caslon**, loosen display line-heights by approximately **+0.10 to +0.12** to prevent ascender/descender collisions on wrapping lines (e.g., 0.93 → 1.05, 1.08 → 1.18). Apercu substitutes (Inter, Work Sans, Manrope) work at the token values without adjustment. BreveText body substitutes (Lora, Source Serif 4) also work without adjustment because body leading is already generous.
|
||||
The three proprietary faces have no exact substitutes. Best open-source approximations:
|
||||
- **WiredDisplay** — *Playfair Display* weight 400 at large display sizes captures the high-contrast didone feel, though wider than the brand's tall-narrow proportions.
|
||||
- **BreveText** — *Lora* or *Source Serif Pro* at 16 – 19 px.
|
||||
- **Apercu** — *Inter* or *Manrope* weights 400 / 700.
|
||||
|
||||
## 4. Component Stylings
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary CTA — Black Outline ("Subscribe")**
|
||||
- Background: `#ffffff` (Paper White)
|
||||
- Text: `#000000` (WIRED Black), Apercu 16px / 700 / 0.3px tracking
|
||||
- Border: `2px solid #000000` — the printerly hard rule, not a 1px UI border
|
||||
- Border radius: `0` (square corners)
|
||||
- Padding: vertical ≈ 12–14px, horizontal ≈ 24px
|
||||
- Hover: background flips to `#000000`, text flips to `#ffffff` — pure inversion, no easing on the rule
|
||||
- Transition: ~150ms color/background only
|
||||
|
||||
**Secondary — Inverted ("Sign In", in dark zones)**
|
||||
- Background: `#000000`
|
||||
- Text: `#ffffff`
|
||||
- Border: `2px solid #ffffff`
|
||||
- Same square corners, same inversion-on-hover behavior
|
||||
|
||||
**Tertiary — Underlined Inline Link**
|
||||
- Treated as a button when wrapped in nav: text `#1a1a1a`, underline always present, hover swaps color to `#057dbc` while keeping the underline
|
||||
- No padding, no border, no background — this is editorial linking, not UI
|
||||
|
||||
**Pill / Round Icon Button**
|
||||
- Border radius: `50%` (the only circular shape on the site)
|
||||
- Used exclusively for icon controls (search, account, social) in the header
|
||||
- Border: 1px solid `#757575` or no border depending on placement
|
||||
- Size: ~32–40px square footprint
|
||||
|
||||
**Tag / Span Pill**
|
||||
- Border radius: `1920px` (effectively a full pill — only used inside text spans like "BREAKING")
|
||||
- Background: solid black or red accent depending on context
|
||||
- Text: white, mono 11–12px caps
|
||||
|
||||
### Cards & Containers
|
||||
- **Cards do not exist.** WIRED's homepage has no rounded boxes, no shadows, no surface elevation.
|
||||
- A "story tile" is just an image rectangle stacked above a kicker + headline + deck, separated from neighbors by **1px hairline rules** (`#000000` or `#4a5568`) or by raw whitespace.
|
||||
- The closest thing to a "container" is the black ribbon section header (e.g., "MOST POPULAR") — a full-bleed black bar with white WiredMono caps, no padding refinement, no rounded ends.
|
||||
- Hover behavior on a story tile: the headline link text shifts from `#1a1a1a` to `#057dbc` and the underline appears. The image itself does not zoom, lift, or shadow.
|
||||
|
||||
### Inputs & Forms
|
||||
- **Newsletter input**: rectangular, `2px solid #000000` border, `0` radius, white background, Apercu 16px placeholder.
|
||||
- **Focus**: border stays 2px black, no glow ring, no color change — focus is signaled by the blinking caret only. (Add a 2px outset for accessibility if you ship this — WIRED's own implementation under-serves keyboard users here.)
|
||||
- **Error**: text label below in `#e53e3e` (Fides cookie overlay borrows this red — use sparingly).
|
||||
- **Disabled**: text drops to `#a0aec0`, border softens to `#757575`.
|
||||
|
||||
### Navigation
|
||||
- **Top utility bar**: black (`#000000`) full-bleed strip, ~32–40px tall, mono caps links separated by hairline dividers, `#ffffff` text, hover → `#057dbc`.
|
||||
- **Main nav**: paper-white (`#ffffff`) row beneath the bug logo, Apercu 14–16px / regular, hover → `#057dbc` underline.
|
||||
- **Logo**: WIRED bug, ~209×42px, centered or left-aligned, never recolored, always pure black on white.
|
||||
- **Mobile**: nav collapses to a hamburger left of the bug logo. Section nav becomes a slide-down drawer of mono caps links.
|
||||
- **Transition**: hover color swaps are instant or ~120ms; no bouncy easing — editorial restraint.
|
||||
|
||||
### Image Treatment
|
||||
- **Aspect ratios**: predominantly 16:9 for hero images, 4:3 for grid story tiles, 1:1 for smaller "Most Popular" thumbnails.
|
||||
- **Corners**: ALWAYS 0 radius. Square. The only rounded image is a circular author avatar (50%).
|
||||
- **Full-bleed**: hero photographs run edge-to-edge of the column they occupy; no inset, no border.
|
||||
- **Captions**: BreveText 12.73px / 700 with relaxed 2.20 line-height — placed directly under the image, italicized in some templates.
|
||||
- **Hover**: no zoom, no opacity dip — only the headline below the image responds.
|
||||
- **Lazy loading**: standard `loading="lazy"` on all below-the-fold imagery.
|
||||
|
||||
### Editorial Ribbons & Section Markers
|
||||
- Black bar (`#000000`) full-bleed with white WiredMono uppercase label inside (e.g., "MOST POPULAR", "BACKCHANNEL", "GEAR").
|
||||
- Height ~32–40px, no padding refinement, no rounded ends.
|
||||
- Sometimes a thin 2px black rule sits directly above or below to double-frame the bar.
|
||||
|
||||
### Numbered Lists ("Most Popular")
|
||||
- A vertical list of stories prefixed with WiredDisplay numerals (01, 02, 03…) at ~40–48px, sitting tight against the headline they label.
|
||||
- Hairline rule between each item, no other decoration.
|
||||
|
||||
## 5. Layout Principles
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 8px.
|
||||
- **Scale**: 1px (hairline), 4px, 8px, 12px, 14.11px, 15px, 16px, 24px, 25.46px, 29.66px, 32px, 40px, 48px, 64px.
|
||||
- **Section padding**: typically 32–48px vertical between major editorial blocks.
|
||||
- **Card padding**: there are no cards; the gutter between story tiles is 24–32px horizontally and 16–24px vertically.
|
||||
- **Inline spacing**: kickers sit ~4–8px above headlines; decks sit ~8–12px below headlines; bylines/timestamps another 8–12px below the deck.
|
||||
- **Base unit**: 4 px.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px · `{spacing.4xl}` 48 px.
|
||||
- **Section padding**: hero / story grid use `{spacing.4xl}` 48 px top/bottom on desktop.
|
||||
- **Story row padding**: `{spacing.lg}` 16 px vertical between bylined story rows.
|
||||
|
||||
### Grid & Container
|
||||
- **Max width**: ~1280–1600px on desktop (the dembrandt sweep detected breakpoints up to 1600px), centered with generous outer margins.
|
||||
- **Column patterns**: 12-column grid that resolves into 2/3/4 column story arrangements depending on module — feature blocks often run a "1 large + 2 small" pattern with hairline rules between each.
|
||||
- **Column gutters**: ~24–32px, separated by hairline `#000000` or `#4a5568` 1px rules where the editorial logic demands a "page-fold" feel.
|
||||
- Marketing content uses a wide container (~1400 px max).
|
||||
- Cover-story grid: 1 large hero + 2-up secondary stories + vertical stack.
|
||||
- Story-row stack: full-width single column with hairline dividers.
|
||||
|
||||
### Whitespace Philosophy
|
||||
WIRED treats whitespace the way a magazine art director treats margin: it's the silence around the type, not a styling choice. The page never breathes excessively (this is not Stripe or Apple); it breathes *editorially* — enough room to keep adjacent stories from arguing, never enough to suggest there's nothing on the page. If an empty area looks like it could fit another headline, that empty area is doing its job.
|
||||
### Responsive Strategy
|
||||
|
||||
### Border Radius Scale
|
||||
- `0` — every container, every image, every button, every input. The default.
|
||||
- `1920px` — only inside text spans that need to look like a full pill ("BREAKING", "LIVE").
|
||||
- `50%` — only on round icon buttons and circular author avatars.
|
||||
|
||||
There are exactly three radii on the entire site, and two of them are reserved for non-rectangular shapes. This is the **strictest** corner discipline of any major editorial property.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| 0 | No shadow, no border | Default editorial surface — text on paper |
|
||||
| 1 | 1px solid `#e2e8f0` hairline `<hr>` | Quiet section divider, almost invisible |
|
||||
| 2 | 1px solid `#000000` hairline rule | Editorial column divider — printerly, structural |
|
||||
| 3 | 2px solid `#000000` border | Buttons, inputs, ribbons — interactive emphasis |
|
||||
| 4 | Black ribbon bar (`#000000` fill) | Section labels — the most "elevated" surface on the page |
|
||||
| 5 | Inverted footer block | Dark `#1a1a1a` zone with white type — the only inversion |
|
||||
|
||||
WIRED's depth philosophy is **flat by religion**. There is exactly one shadow token in the entire site (a default `0 0 0 transparent` placeholder) and no `box-shadow` is applied to story tiles, headers, modals, or cards. Depth is communicated by **rule weight** (1px hairline → 2px hard rule → solid black ribbon), not by simulated lighting.
|
||||
|
||||
### Decorative Depth
|
||||
None. No gradients, no glow, no halos, no scrim overlays beyond the standard photo caption gradient. WIRED earns its visual interest from photography and typographic contrast, not from chrome.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- **Do** use 2px hard black borders on every primary button — no 1px softness, no rounded edges.
|
||||
- **Do** put a WiredMono ALL-CAPS kicker above every story headline (4–8px above, 0.9–1.2px tracking).
|
||||
- **Do** use BreveText for any paragraph longer than two lines — Apercu is for UI, not reading.
|
||||
- **Do** keep images square-cornered, edge-to-edge, with the caption hugging the bottom edge.
|
||||
- **Do** separate story tiles with hairline rules or whitespace, never with cards or shadows.
|
||||
- **Do** invert (black background, white type) only for footers, ribbons, and the utility nav strip.
|
||||
- **Do** use `#057dbc` link blue exclusively for hover states — never as a background or button fill.
|
||||
- **Do** scale headlines aggressively: 64px on hero, 26px on grid blocks, never 32px "safe middle ground".
|
||||
|
||||
### Don't
|
||||
- **Don't** add `box-shadow` to anything. Ever. WIRED doesn't ship shadows.
|
||||
- **Don't** round corners on rectangular containers — `border-radius: 0` is law.
|
||||
- **Don't** mix typefaces inside one role: WiredDisplay never sets body, BreveText never sets buttons.
|
||||
- **Don't** use color outside grayscale + `#057dbc`. No orange CTAs, no green success pills.
|
||||
- **Don't** use Apercu in lowercase for kickers — that's WiredMono's job, and it must be UPPERCASE.
|
||||
- **Don't** use gradients, blurs, glassmorphism, or atmospheric effects — they break the printerly contract.
|
||||
- **Don't** rely on hover lift effects. WIRED's hover is a color swap on text, nothing more.
|
||||
- **Don't** invent new pill shapes. Round = icons only. Pill = inline text spans only. Everything else is square.
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Small Mobile | <375px | Single column, hamburger nav, all hero modules collapse to stacked image-headline-deck |
|
||||
| Mobile | 375–767px | Single column, story grid becomes vertical scroll, "Most Popular" numbers shrink to 32px |
|
||||
| Tablet | 768–1023px | 2-column story grid, sidebar collapses below main feed, nav becomes condensed |
|
||||
| Desktop | 1024–1599px | Full editorial 3–4 column grid, sidebar restored, max headline scale active |
|
||||
| Large Desktop | ≥1600px | Page caps at ~1600px container, whitespace expands at the margins, no further scaling |
|
||||
| Mobile | < 768px | Cover hero 64→40 px; all grids 1-up; hamburger nav. |
|
||||
| Tablet | 768–1023px | 2-up secondary story grid. |
|
||||
| Desktop | ≥ 1024px | Full magazine grid. |
|
||||
|
||||
The dembrandt sweep detected an unusual range of intermediate breakpoints (1280, 1025, 1024, 1023, 768, 767, 667, 599, 570, 569, 480, 425, 375, 320, 319) — Wired's grid micro-tunes at almost every common viewport, especially around the iPad portrait/landscape boundary.
|
||||
#### Touch Targets
|
||||
Button-primary renders ~44 px tall (12 vertical padding + 20 line). WCAG AAA at all widths.
|
||||
|
||||
### Touch Targets
|
||||
- Primary button: ~44x44px minimum (16px text + 12–14px vertical padding satisfies WCAG AAA).
|
||||
- Mono caps links in the utility bar are smaller (~32px tall) — WIRED's own implementation undershoots WCAG here. **For derivative work, pad mono nav links to 44px.**
|
||||
- Round icon buttons in the header are ~40px circles, comfortably touch-friendly.
|
||||
#### Collapsing Strategy
|
||||
- Nav: full link row + Subscribe CTA at desktop. Hamburger at mobile.
|
||||
- Magazine grid: hero stays full-width; 2-up secondary drops to 1-up at mobile.
|
||||
- Story rows: stay single-column at all viewports.
|
||||
|
||||
### Collapsing Strategy
|
||||
- **Nav**: utility bar drops below 768px; main nav collapses into hamburger drawer. Bug logo recenters on mobile.
|
||||
- **Grid**: 4-col → 3-col → 2-col → 1-col as viewport tightens. Hairline rules persist between every column count, so the printerly feel survives the collapse.
|
||||
- **Spacing**: vertical rhythm tightens from 48px → 32px → 24px between modules on mobile. Horizontal page padding shrinks from 64px → 24px → 16px.
|
||||
- **Type**: WiredDisplay hero scales from 64px to ~36–42px on mobile, headlines from 26px to ~22px, kickers stay locked at 12–13px (mono caps don't scale down further or they become unreadable).
|
||||
#### Image Behavior
|
||||
- Cover images: full-bleed 16:9 hero / 4:3 secondary.
|
||||
- Article body images: full-width inside the article column.
|
||||
- Author avatars: small inline circular crops next to bylines.
|
||||
|
||||
### Image Behavior
|
||||
- All images are responsive raster (`srcset`-driven), aspect ratios preserved: 16:9 hero, 4:3 mid, 1:1 thumbnails.
|
||||
- No art-direction swaps — the same crop scales across breakpoints.
|
||||
- `loading="lazy"` on all below-the-fold imagery, `eager` on the hero only.
|
||||
## Elevation & Depth
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default — almost every surface lives at this level. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` border. | Story-row dividers, input borders. |
|
||||
| Level 2 — Heavy Black Border | 2 px solid `{colors.ink}` border. | Subscribe CTA on certain campaign moments. |
|
||||
|
||||
### Quick Color Reference
|
||||
- **Primary Ink (text + ribbons)**: "WIRED Black (`#000000`)"
|
||||
- **Page Canvas**: "Paper White (`#ffffff`)"
|
||||
- **Headline / Body Text**: "Page Ink (`#1a1a1a`)"
|
||||
- **Caption / Metadata**: "Caption Gray (`#757575`)"
|
||||
- **Hairline / Quiet Border**: "Hairline Tint (`#e2e8f0`)"
|
||||
- **Link Hover Accent (the only color)**: "Link Blue (`#057dbc`)"
|
||||
The brand uses no drop-shadows. Surface contrast and hairline borders carry all visual hierarchy.
|
||||
|
||||
### Example Component Prompts
|
||||
1. *"Create an editorial story tile with a 16:9 image (square corners), an UPPERCASE WiredMono kicker in `#1a1a1a` above a 26px WiredDisplay headline. Separate the tile from its neighbor with a 1px black hairline rule. No card, no shadow, no border-radius."*
|
||||
2. *"Design a primary subscribe button with a 2px solid `#000000` border, square corners, `#ffffff` background, Apercu 16px / 700 / 0.3px tracking text in `#000000`. Hover state inverts to black background with white text in 150ms."*
|
||||
3. *"Build a 'Most Popular' module: full-bleed black ribbon header with WiredMono uppercase label in white, followed by a numbered list (01–05) using 40px WiredDisplay numerals and 17px Apercu 700 headlines, separated by hairline rules."*
|
||||
4. *"Create a newsletter signup form with a 2px solid black input border, no radius, Apercu 16px placeholder in `#757575`, and an inverted black submit button beside it."*
|
||||
5. *"Design a footer in `#1a1a1a` with paper-white tertiary navigation in ProximaNova 11px, hover color `#057dbc`, and a centered WIRED bug logo at the top of the block."*
|
||||
## Shapes
|
||||
|
||||
### Iteration Guide
|
||||
When refining existing screens generated with this design system:
|
||||
1. **Audit corners first.** If you see any `border-radius` other than `0`, `50%` (icons/avatars), or `1920px` (text pills), flatten it. Round corners are the single most common mistake.
|
||||
2. **Audit shadows.** Strip every `box-shadow`. If a tile needs to feel "lifted", use a 2px black border or a hairline rule instead.
|
||||
3. **Audit typeface roles.** Make sure WiredDisplay only sets headlines, BreveText only sets reading body, Apercu only sets UI, WiredMono only sets ALL-CAPS labels. Swapping roles breaks the voice instantly.
|
||||
4. **Audit color sprawl.** If a color outside `#000`, `#1a1a1a`, `#757575`, `#e2e8f0`, `#ffffff`, `#057dbc` appears in chrome (not photography), remove it. WIRED's restraint is non-negotiable.
|
||||
5. **Audit kickers.** Every story should have an UPPERCASE mono kicker. Without it, the page reads as a generic blog, not WIRED.
|
||||
6. **Audit rules.** Add hairline `1px solid #000` dividers wherever two stories or modules meet without a clear visual break. Rules are the connective tissue.
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Every interactive shape — buttons, inputs, cards. The brand's signature square geometry. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers only (social-share, account avatar). |
|
||||
|
||||
### Photography Geometry
|
||||
- Cover stories: 16:9 hero, edge-to-edge.
|
||||
- Secondary story cards: 4:3 thumbnails.
|
||||
- Article body images: native aspect, full column width.
|
||||
- Bylines / avatars: circular `{rounded.full}` 28 px crops.
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**`button-primary`** — the square black CTA.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label `{typography.button-md}` (Apercu 16 px / 700 / 0.3 px tracking), padding `{spacing.md} {spacing.xl}`, shape `{rounded.none}` 0 px.
|
||||
|
||||
**`button-outline`** — the white outline CTA.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, same typography / padding / shape.
|
||||
|
||||
**`button-icon-circular`** — the circular share-icon button.
|
||||
- Background `{colors.canvas}`, ink icon, shape `{rounded.full}`.
|
||||
|
||||
### Cards & Containers
|
||||
|
||||
**`story-card-large`** — the cover-story card with `{typography.display-md}` headline.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}`. No border — the card lives on the canvas with the photo doing the work.
|
||||
|
||||
**`story-card`** — the secondary story card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md}`. Photo at top, sans display heading + body lead below.
|
||||
|
||||
**`story-row`** — the bylined story list row.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.hairline}` bottom border, body in `{typography.body-md-strong}`, padding `{spacing.lg}` 0.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the standard text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, body in `{typography.body-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.none}`.
|
||||
|
||||
### Navigation
|
||||
|
||||
**`nav-bar`** — the top nav, light by default.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`. Layout: hamburger left, masthead centre, Subscribe right.
|
||||
|
||||
**`nav-link`** — link items inside nav.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm-strong}` (Apercu 14 / 700).
|
||||
|
||||
**`footer`** — the black footer band.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.4xl} {spacing.xl}`. Body in `{typography.body-sm}` (Apercu 14 / 400). Footer column eyebrows in `{typography.body-sm-strong}`.
|
||||
|
||||
### Signature Components
|
||||
|
||||
**`hero-band`** — the white hero band hosting the cover-story.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.4xl} {spacing.xl}`. Cover headline in `{typography.display-hero}` (WiredDisplay 64 px).
|
||||
|
||||
**`masthead-band`** — the thin top band with the wordmark.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`. The wordmark sits centred; flanked by section nav.
|
||||
|
||||
**`category-eyebrow`** — the small uppercase category label above story headlines.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm-strong}` (Apercu 14 / 700 — though some campaigns use ALL CAPS via CSS).
|
||||
|
||||
**`byline-row`** — the article byline strip.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, body in `{typography.byline}` (BreveText 12.73 / 700 / line-height 2.2). Includes an author avatar + name + date.
|
||||
|
||||
**`hairline-divider`** — the 1 px line between story rows.
|
||||
- 1 px solid `{colors.hairline}`.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Reserve `{colors.primary}` black for the wordmark, every CTA, and the footer fill. The brand IS the strict black-on-white duet.
|
||||
- Set hero headlines in `{typography.display-hero}` (WiredDisplay 64 px weight 400). The proprietary serif IS the brand's typographic signature.
|
||||
- Use `{rounded.none}` 0 px on every button and form input. The brand reads as a printed magazine — square corners are non-negotiable.
|
||||
- Pair WiredDisplay (serif display) with BreveText (serif body) and Apercu (sans labels). Three faces, three roles.
|
||||
- Render story rows with `{colors.hairline}` 1 px dividers — the brand's only elevation cue.
|
||||
|
||||
### Don't
|
||||
- Don't introduce a chromatic brand accent. The link blue is reserved for inline body links inside articles only.
|
||||
- Don't round button corners. The brand never softens its rectangular geometry.
|
||||
- Don't drop a soft drop-shadow on cards. Surface contrast and hairlines carry elevation.
|
||||
- Don't substitute the proprietary serif faces with a generic sans for display. The serif voice is the brand.
|
||||
- Don't promote display weight beyond 400. The brand's elegance is in the typeface design, not bold weight.
|
||||
|
||||
@ -1,173 +1,544 @@
|
||||
# Design System Inspired by Wise
|
||||
---
|
||||
version: alpha
|
||||
name: Wise Inspired
|
||||
description: An inspired interpretation of Wise's design language — a global money-transfer brand whose surface combines an unusually heavy near-black display sans (weight 900 at 64–126 px) with a vivid lime-green brand accent, sage-tinted surface neutrals, and rounded white cards on a pale green-tinted canvas; the whole system reads more like a Scandinavian fintech magazine than a bank.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#9fe870"
|
||||
on-primary: "#0e0f0c"
|
||||
primary-active: "#cdffad"
|
||||
primary-neutral: "#c5edab"
|
||||
primary-pale: "#e2f6d5"
|
||||
ink: "#0e0f0c"
|
||||
ink-deep: "#163300"
|
||||
body: "#454745"
|
||||
mute: "#868685"
|
||||
canvas: "#ffffff"
|
||||
canvas-soft: "#e8ebe6"
|
||||
positive: "#2ead4b"
|
||||
positive-deep: "#054d28"
|
||||
warning: "#ffd11a"
|
||||
warning-deep: "#b86700"
|
||||
warning-content: "#4a3b1c"
|
||||
negative: "#d03238"
|
||||
negative-deep: "#a72027"
|
||||
negative-darkest: "#a7000d"
|
||||
negative-bg: "#320707"
|
||||
accent-orange: "#ffc091"
|
||||
accent-cyan: "#38c8ff"
|
||||
|
||||
Wise's website is a bold, confident fintech platform that communicates "money without borders" through massive typography and a distinctive lime-green accent. The design operates on a warm off-white canvas with near-black text (`#0e0f0c`) and a signature Wise Green (`#9fe870`) — a fresh, lime-bright color that feels alive and optimistic, unlike the corporate blues of traditional banking.
|
||||
typography:
|
||||
display-mega:
|
||||
fontFamily: Wise Sans, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 126px
|
||||
fontWeight: 900
|
||||
lineHeight: 107.1px
|
||||
display-xxl:
|
||||
fontFamily: Wise Sans, Inter, system-ui, sans-serif
|
||||
fontSize: 96px
|
||||
fontWeight: 900
|
||||
lineHeight: 81.6px
|
||||
display-xl:
|
||||
fontFamily: Wise Sans, Inter, system-ui, sans-serif
|
||||
fontSize: 64px
|
||||
fontWeight: 900
|
||||
lineHeight: 54.4px
|
||||
display-lg:
|
||||
fontFamily: Wise Sans, Inter, system-ui, sans-serif
|
||||
fontSize: 47px
|
||||
fontWeight: 400
|
||||
lineHeight: 70.5px
|
||||
letterSpacing: -0.108px
|
||||
display-md:
|
||||
fontFamily: Wise Sans, Inter, system-ui, sans-serif
|
||||
fontSize: 40px
|
||||
fontWeight: 900
|
||||
lineHeight: 34px
|
||||
display-sm:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 600
|
||||
lineHeight: 38.4px
|
||||
letterSpacing: -0.96px
|
||||
display-xs:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 600
|
||||
lineHeight: 31.2px
|
||||
letterSpacing: -0.48px
|
||||
body-lg:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 400
|
||||
lineHeight: 30px
|
||||
body-md:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-md-strong:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 600
|
||||
lineHeight: 24px
|
||||
body-sm:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
body-sm-strong:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 600
|
||||
lineHeight: 20px
|
||||
caption:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
button-md:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 600
|
||||
lineHeight: 24px
|
||||
|
||||
The typography uses Wise Sans — a proprietary font used at extreme weight 900 (black) for display headings with a remarkably tight line-height of 0.85 and OpenType `"calt"` (contextual alternates). At 126px, the text is so dense it feels like a protest sign — bold, urgent, and impossible to ignore. Inter serves as the body font with weight 600 as the default for emphasis, creating a consistently confident voice.
|
||||
rounded:
|
||||
none: 0px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 24px
|
||||
pill: 9999px
|
||||
full: 9999px
|
||||
|
||||
What distinguishes Wise is its green-on-white-on-black material palette. Lime Green (`#9fe870`) appears on buttons with dark green text (`#163300`), creating a nature-inspired CTA that feels fresh. Hover states use `scale(1.05)` expansion rather than color changes — buttons physically grow on interaction. The border-radius system uses 9999px for buttons (pill), 30px–40px for cards, and the shadow system is minimal — just `rgba(14,15,12,0.12) 0px 0px 0px 1px` ring shadows.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 24px
|
||||
2xl: 32px
|
||||
3xl: 48px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-secondary:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-tertiary:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-icon-circular:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
rounded: "{rounded.full}"
|
||||
padding: "{spacing.sm}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-sage:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-green:
|
||||
backgroundColor: "{colors.primary-pale}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.primary}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-mega}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.primary}"
|
||||
typography: "{typography.display-mega}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
content-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
currency-converter-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
badge-positive:
|
||||
backgroundColor: "{colors.primary-pale}"
|
||||
textColor: "{colors.positive-deep}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
badge-negative:
|
||||
backgroundColor: "{colors.negative-bg}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-sm-strong}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
footer:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.canvas-soft}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.mute}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
item-divider: "{colors.canvas-soft}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.canvas-soft}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.xl}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Wise — the global money-transfer brand — wears its identity in a single signature pairing: a vivid lime-green `{colors.primary}` (`#9fe870`) used as the CTA pill and brand accent, set against a pale sage-tinted canvas `{colors.canvas-soft}` (`#e8ebe6`) that runs across the hero band, and a near-black ink `{colors.ink}` (`#0e0f0c`) with a hint of warmth from the brand's underlying olive cast. The brand reads more like a calm Scandinavian magazine than a bank — generous whitespace, large rounded cards, and an unusually heavy display sans set at weight 900 carrying every hero headline.
|
||||
|
||||
Display typography is the second decisive voice. The proprietary `Wise Sans` family carries hero displays at weight 900 in scales from 64 px up to 126 px on the largest hero. The brand pairs Wise Sans 900 with Inter at weight 600 for sub-displays — the contrast between the chunky proprietary face and Inter's neutrality creates a particular hierarchy: Wise Sans for the brand moment, Inter for everything else.
|
||||
|
||||
Cards are universally pill-rounded — `{rounded.xl}` 24 px is the brand's signature card radius. Buttons take the same 24 px pill-rectangle shape. The brand never uses sharp corners on UI elements; the visual softness is part of the friendly fintech voice.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Wise Sans at weight 900, 0.85 line-height — billboard-scale bold headlines
|
||||
- Lime Green (`#9fe870`) accent with dark green text (`#163300`) — nature-inspired fintech
|
||||
- Inter body at weight 600 as default — confident, not light
|
||||
- Near-black (`#0e0f0c`) primary with warm green undertone
|
||||
- Scale(1.05) hover animations — buttons physically grow
|
||||
- OpenType `"calt"` on all text
|
||||
- Pill buttons (9999px) and large rounded cards (30px–40px)
|
||||
- Semantic color system with comprehensive state management
|
||||
- A single lime-green CTA accent `{colors.primary}` (`#9fe870`) — the brand's universal primary action color. No second accent.
|
||||
- Two-face display typography — Wise Sans (proprietary, weight 900, hero scale) + Inter (weight 600, sub-display scale). The contrast is the brand's typographic story.
|
||||
- `{rounded.xl}` 24 px is the canonical card and button radius. Generous, friendly.
|
||||
- Sage-tinted canvas `{colors.canvas-soft}` (`#e8ebe6`) is the brand's hero surface; white `{colors.canvas}` is reserved for cards within the sage band.
|
||||
- A full semantic palette: positive green family, warning yellow family, negative red family — each documented with content / hover / active variants for in-product use.
|
||||
- Currency-converter card on the hero — the brand's signature interactive component, hosting from/to amount inputs.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary Brand
|
||||
- **Near Black** (`#0e0f0c`): Primary text, background for dark sections
|
||||
- **Wise Green** (`#9fe870`): Primary CTA button, brand accent
|
||||
- **Dark Green** (`#163300`): Button text on green, deep green accent
|
||||
- **Light Mint** (`#e2f6d5`): Soft green surface, badge backgrounds
|
||||
- **Pastel Green** (`#cdffad`): `--color-interactive-contrast-hover`, hover accent
|
||||
### Brand & Accent
|
||||
- **Wise Green** (`{colors.primary}` — `#9fe870`): The brand's universal CTA color. Every primary button, every "Send money" pill, the brand's logo accent.
|
||||
- **Wise Green Hover** (`{colors.primary-active}` — `#cdffad`): The lighter green for active state.
|
||||
- **Wise Green Neutral** (`{colors.primary-neutral}` — `#c5edab`): A mid-saturation green used as a neutral active fill.
|
||||
- **Wise Green Pale** (`{colors.primary-pale}` — `#e2f6d5`): The lightest green for soft surface tints / badge backgrounds.
|
||||
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#ffffff`): Pure white for card interiors.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#e8ebe6`): The sage-tinted page background. Defining mood of the brand.
|
||||
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#0e0f0c`): Near-black with a hint of olive warmth — the brand's default text and headings color.
|
||||
- **Ink Deep** (`{colors.ink-deep}` — `#163300`): A deep forest-green ink used on positive-state surfaces.
|
||||
- **Body** (`{colors.body}` — `#454745`): Secondary body text.
|
||||
- **Mute** (`{colors.mute}` — `#868685`): Lowest-priority text — captions, placeholder, fine print.
|
||||
|
||||
### Semantic
|
||||
- **Positive Green** (`#054d28`): `--color-sentiment-positive-primary`, success
|
||||
- **Danger Red** (`#d03238`): `--color-interactive-negative-hover`, error/destructive
|
||||
- **Warning Yellow** (`#ffd11a`): `--color-sentiment-warning-hover`, warnings
|
||||
- **Background Cyan** (`rgba(56,200,255,0.10)`): `--color-background-accent`, info tint
|
||||
- **Bright Orange** (`#ffc091`): `--color-bright-orange`, warm accent
|
||||
- **Positive** (`{colors.positive}` — `#2ead4b`): Success indicator.
|
||||
- **Positive Deep** (`{colors.positive-deep}` — `#054d28`): Pressed positive state.
|
||||
- **Warning** (`{colors.warning}` — `#ffd11a`): Caution indicator.
|
||||
- **Warning Deep** (`{colors.warning-deep}` — `#b86700`): Pressed warning.
|
||||
- **Warning Content** (`{colors.warning-content}` — `#4a3b1c`): Text on warning surfaces.
|
||||
- **Negative** (`{colors.negative}` — `#d03238`): Destructive / error red.
|
||||
- **Negative Deep** (`{colors.negative-deep}` — `#a72027`): Pressed destructive.
|
||||
- **Negative Darkest** (`{colors.negative-darkest}` — `#a7000d`): Highest-emphasis destructive text.
|
||||
- **Negative Bg** (`{colors.negative-bg}` — `#320707`): Dark maroon for destructive callout backgrounds.
|
||||
|
||||
### Neutral
|
||||
- **Warm Dark** (`#454745`): Secondary text, borders
|
||||
- **Gray** (`#868685`): Muted text, tertiary
|
||||
- **Light Surface** (`#e8ebe6`): Subtle green-tinted light surface
|
||||
### Brand Accent — Tertiary
|
||||
- **Accent Orange** (`{colors.accent-orange}` — `#ffc091`): Bright peach used inside illustrative content / pricing cards.
|
||||
- **Accent Cyan** (`{colors.accent-cyan}` — `#38c8ff`): Bright sky-blue used as a tertiary illustration accent.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Families
|
||||
- **Display**: `Wise Sans`, fallback: `Inter` — OpenType `"calt"` on all text
|
||||
- **Body / UI**: `Inter`, fallbacks: `Helvetica, Arial`
|
||||
### Font Family
|
||||
Two faces ladder the system:
|
||||
1. **Wise Sans** — proprietary geometric sans with an unusually heavy weight 900 used for all hero displays. The face is the brand's typographic signature. Always at weight 900, never lighter on the marketing surface.
|
||||
2. **Inter** — used for sub-displays (weight 600), all body, and form labels. Loaded with `font-feature-settings: "calt"` for contextual alternates.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display Mega | Wise Sans | 126px (7.88rem) | 900 | 0.85 (ultra-tight) | normal | `"calt"` |
|
||||
| Display Hero | Wise Sans | 96px (6.00rem) | 900 | 0.85 | normal | `"calt"` |
|
||||
| Section Heading | Wise Sans | 64px (4.00rem) | 900 | 0.85 | normal | `"calt"` |
|
||||
| Sub-heading | Wise Sans | 40px (2.50rem) | 900 | 0.85 | normal | `"calt"` |
|
||||
| Alt Heading | Inter | 78px (4.88rem) | 600 | 1.10 (tight) | -2.34px | `"calt"` |
|
||||
| Card Title | Inter | 26px (1.62rem) | 600 | 1.23 (tight) | -0.39px | `"calt"` |
|
||||
| Feature Title | Inter | 22px (1.38rem) | 600 | 1.25 (tight) | -0.396px | `"calt"` |
|
||||
| Body | Inter | 18px (1.13rem) | 400 | 1.44 | 0.18px | `"calt"` |
|
||||
| Body Semibold | Inter | 18px (1.13rem) | 600 | 1.44 | -0.108px | `"calt"` |
|
||||
| Button | Inter | 18px–22px | 600 | 1.00–1.44 | -0.108px | `"calt"` |
|
||||
| Caption | Inter | 14px (0.88rem) | 400–600 | 1.50–1.86 | -0.084px to -0.108px | `"calt"` |
|
||||
| Small | Inter | 12px (0.75rem) | 400–600 | 1.00–2.17 | -0.084px to -0.108px | `"calt"` |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-mega}` | 126px | 900 | 107.1px | 0 | Hero stencil at maximum scale. |
|
||||
| `{typography.display-xxl}` | 96px | 900 | 81.6px | 0 | Sub-hero scale. |
|
||||
| `{typography.display-xl}` | 64px | 900 | 54.4px | 0 | Standard hero headline. |
|
||||
| `{typography.display-lg}` | 47px | 400 | 70.5px | -0.108px | Lighter sub-display. |
|
||||
| `{typography.display-md}` | 40px | 900 | 34px | 0 | Section / card headlines. |
|
||||
| `{typography.display-sm}` | 32px | 600 | 38.4px | -0.96px | Inter-rendered section headings. |
|
||||
| `{typography.display-xs}` | 24px | 600 | 31.2px | -0.48px | Sub-section displays. |
|
||||
| `{typography.body-lg}` | 20px | 400 | 30px | 0 | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 24px | 0 | Default body. |
|
||||
| `{typography.body-md-strong}` | 16px | 600 | 24px | 0 | Bold inline body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 14px | 600 | 20px | 0 | Bold caption / nav-link. |
|
||||
| `{typography.caption}` | 12px | 400 | 16px | 0 | Fine print. |
|
||||
| `{typography.button-md}` | 16px | 600 | 24px | 0 | Button label. |
|
||||
|
||||
### Principles
|
||||
- **Weight 900 as identity**: Wise Sans Black (900) is used exclusively for display — the heaviest weight in any analyzed system. It creates text that feels stamped, pressed, physical.
|
||||
- **0.85 line-height**: The tightest display line-height analyzed. Letters overlap vertically, creating dense, billboard-like text blocks.
|
||||
- **"calt" everywhere**: Contextual alternates enabled on ALL text — both Wise Sans and Inter.
|
||||
- **Weight 600 as body default**: Inter Semibold is the standard reading weight — confident, not light.
|
||||
- **Weight 900 for hero, weight 600 for everything else.** The brand's display ceiling is full-black weight; everything below is semibold.
|
||||
- **Wise Sans for the brand voice, Inter for utility.** Strict role separation.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
Wise Sans is proprietary. Open-source substitutes:
|
||||
- **Display** — *Inter* at weight 900 or *Manrope* at weight 800 / 900 captures the geometric heaviness. *Geist* weight 800 is a passable second choice.
|
||||
- **Sub-display + body** — *Inter* is the brand's actual second face.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 24 px · `{spacing.2xl}` 32 px · `{spacing.3xl}` 48 px.
|
||||
- **Section padding**: bands use `{spacing.3xl}` 48 px top/bottom on desktop.
|
||||
- **Card interior**: cards at `{spacing.xl}` 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- Marketing container centres at ~1200 px.
|
||||
- Hero: split layout (headline left, currency-converter card right) at desktop; stacked at mobile.
|
||||
- Feature grids: 2-up / 3-up at desktop.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 768px | Hero stacks; converter card full-width below headline; grids 1-up. |
|
||||
| Tablet | 768–1023px | Grids 2-up. |
|
||||
| Desktop | ≥ 1024px | Hero split; full grids. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render ~48 px tall (12 vertical padding + 24 line). WCAG AAA at all widths.
|
||||
|
||||
#### Image Behavior
|
||||
Photography is sparse; the brand prefers illustrative SVGs and product mockups inside cards. Country flag thumbnails appear inside currency rows.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default. |
|
||||
| Level 1 — Hairline on Dark | 1 px solid `{colors.ink}` border. | Tertiary outline buttons, form inputs. |
|
||||
| Level 2 — Soft Card | Implicit Level 0 white card sitting on sage canvas — the surface contrast IS the elevation. | Cards on the sage hero band. |
|
||||
|
||||
The brand uses surface contrast (`{colors.canvas-soft}` background vs `{colors.canvas}` cards) as the primary elevation cue.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.sm}` | 8px | Inline pills, small badges. |
|
||||
| `{rounded.md}` | 12px | Form inputs, smaller chrome. |
|
||||
| `{rounded.lg}` | 16px | Mid-size cards. |
|
||||
| `{rounded.xl}` | 24px | The brand's canonical button + card radius. |
|
||||
| `{rounded.pill}` | 9999px | Status pills and full-radius accents. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers. |
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary Green Pill**
|
||||
- Background: `#9fe870` (Wise Green)
|
||||
- Text: `#163300` (Dark Green)
|
||||
- Padding: 5px 16px
|
||||
- Radius: 9999px
|
||||
- Hover: scale(1.05) — button physically grows
|
||||
- Active: scale(0.95) — button compresses
|
||||
- Focus: inset ring + outline
|
||||
**`button-primary`** — the lime-green CTA pill.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}`, label `{typography.button-md}`, padding `{spacing.md} {spacing.xl}`, shape `{rounded.xl}` 24 px.
|
||||
|
||||
**Secondary Subtle Pill**
|
||||
- Background: `rgba(22, 51, 0, 0.08)` (dark green at 8% opacity)
|
||||
- Text: `#0e0f0c`
|
||||
- Padding: 8px 12px 8px 16px
|
||||
- Radius: 9999px
|
||||
- Same scale hover/active behavior
|
||||
**`button-secondary`** — the sage-tinted secondary.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, same typography / padding / shape.
|
||||
|
||||
**`button-tertiary`** — the white outline tertiary.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, same typography / padding / shape.
|
||||
|
||||
**`button-icon-circular`** — the circular icon button.
|
||||
- Background `{colors.canvas}`, ink icon, shape `{rounded.full}`.
|
||||
|
||||
### Cards & Containers
|
||||
- Radius: 16px (small), 30px (medium), 40px (large cards/tables)
|
||||
- Border: `1px solid rgba(14,15,12,0.12)` or `1px solid #9fe870` (green accent)
|
||||
- Shadow: `rgba(14,15,12,0.12) 0px 0px 0px 1px` (ring shadow)
|
||||
|
||||
**`card-content`** — the default white card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.xl}`. No border, sits on sage canvas.
|
||||
|
||||
**`card-feature-sage`** — the sage-tinted feature card.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.xl}`.
|
||||
|
||||
**`card-feature-green`** — the soft-green feature card.
|
||||
- Background `{colors.primary-pale}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.xl}`.
|
||||
|
||||
**`card-feature-dark`** — the polarity-flipped dark card with green text.
|
||||
- Background `{colors.ink}`, text `{colors.primary}` (Wise green!), padding `{spacing.xl}`, shape `{rounded.xl}`. Used for promotional moments.
|
||||
|
||||
**`currency-converter-card`** — the brand's signature interactive widget.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, padding `{spacing.xl}`, shape `{rounded.xl}`. Hosts from/to amount inputs + currency selectors.
|
||||
|
||||
### Inputs & Forms
|
||||
|
||||
**`text-input`** — the canonical text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, body in `{typography.body-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.md}`.
|
||||
|
||||
### Navigation
|
||||
- Green-tinted navigation hover: `rgba(211,242,192,0.4)`
|
||||
- Clean header with Wise wordmark
|
||||
- Pill CTAs right-aligned
|
||||
|
||||
## 5. Layout Principles
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 1px, 2px, 3px, 4px, 5px, 8px, 10px, 11px, 12px, 16px, 18px, 19px, 20px, 22px, 24px
|
||||
**`nav-link`** — link items inside nav.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm-strong}`.
|
||||
|
||||
### Border Radius Scale
|
||||
- Minimal (2px): Links, inputs
|
||||
- Standard (10px): Comboboxes, inputs
|
||||
- Card (16px): Small cards, buttons, radio
|
||||
- Medium (20px): Links, medium cards
|
||||
- Large (30px): Feature cards
|
||||
- Section (40px): Tables, large cards
|
||||
- Mega (1000px): Presentation elements
|
||||
- Pill (9999px): All buttons, images
|
||||
- Circle (50%): Icons, badges
|
||||
**`footer`** — the dark footer band.
|
||||
- Background `{colors.ink}`, text `{colors.canvas-soft}`, padding `{spacing.3xl} {spacing.xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
### Signature Components
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow | Default |
|
||||
| Ring (Level 1) | `rgba(14,15,12,0.12) 0px 0px 0px 1px` | Card borders |
|
||||
| Inset (Level 2) | `rgb(134,134,133) 0px 0px 0px 1px inset` | Input focus |
|
||||
**`hero-band`** — the sage-canvas hero band.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.xl}`. Headline in `{typography.display-mega}` (Wise Sans weight 900).
|
||||
|
||||
**Shadow Philosophy**: Wise uses minimal shadows — ring shadows only. Depth comes from the bold green accent against the neutral canvas.
|
||||
**`hero-band-dark`** — the polarity-flipped dark hero.
|
||||
- Background `{colors.ink}`, text `{colors.primary}` (Wise green headline on near-black!), same padding / scale.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`content-band`** — the white content band that follows hero.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.xl}`. Section headline in `{typography.display-md}`.
|
||||
|
||||
**`badge-positive`** — the positive status pill.
|
||||
- Background `{colors.primary-pale}`, text `{colors.positive-deep}`, body in `{typography.body-sm-strong}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill}`.
|
||||
|
||||
**`badge-negative`** — the negative status pill.
|
||||
- Background `{colors.negative-bg}`, text white, body in `{typography.body-sm-strong}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill}`.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use Wise Sans weight 900 for display — the extreme boldness IS the brand
|
||||
- Apply line-height 0.85 on Wise Sans display — ultra-tight is intentional
|
||||
- Use Lime Green (#9fe870) for primary CTAs with Dark Green (#163300) text
|
||||
- Apply scale(1.05) hover and scale(0.95) active on buttons
|
||||
- Enable "calt" on all text
|
||||
- Use Inter weight 600 as the body default
|
||||
- Reserve `{colors.primary}` Wise green for every primary CTA. The lime-green pill IS the brand's conversion signature.
|
||||
- Set hero headlines in `{typography.display-mega}` / `{typography.display-xl}` Wise Sans weight 900. Never lighter.
|
||||
- Use `{rounded.xl}` 24 px for buttons and cards. The generous radius is the brand's friendliness signature.
|
||||
- Cycle page surfaces in `{colors.canvas-soft}` sage canvas → `{colors.canvas}` white cards. Surface contrast carries elevation.
|
||||
- Use the full semantic palette (positive / warning / negative) for in-product status — never repurpose Wise green as success indicator since it IS the brand CTA.
|
||||
|
||||
### Don't
|
||||
- Don't use light font weights for Wise Sans — only 900
|
||||
- Don't relax the 0.85 line-height on display — the density is the identity
|
||||
- Don't use the Wise Green as background for large surfaces — it's for buttons and accents
|
||||
- Don't skip the scale animation on buttons
|
||||
- Don't use traditional shadows — ring shadows only
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | <576px | Single column |
|
||||
| Tablet | 576–992px | 2-column |
|
||||
| Desktop | 992–1440px | Full layout |
|
||||
| Large | >1440px | Expanded |
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Text: Near Black (`#0e0f0c`)
|
||||
- Background: White (`#ffffff` / off-white)
|
||||
- Accent: Wise Green (`#9fe870`)
|
||||
- Button text: Dark Green (`#163300`)
|
||||
- Secondary: Gray (`#868685`)
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create hero: white background. Headline at 96px Wise Sans weight 900, line-height 0.85, 'calt' enabled, #0e0f0c text. Green pill CTA (#9fe870, 9999px radius, 5px 16px padding, #163300 text). Hover: scale(1.05)."
|
||||
- "Build a card: 30px radius, 1px solid rgba(14,15,12,0.12). Title at 22px Inter weight 600, body at 18px weight 400."
|
||||
|
||||
### Iteration Guide
|
||||
1. Wise Sans 900 at 0.85 line-height — the extreme weight IS the brand
|
||||
2. Lime Green for buttons only — dark green text on green background
|
||||
3. Scale animations (1.05 hover, 0.95 active) on all interactive elements
|
||||
4. "calt" on everything — contextual alternates are mandatory
|
||||
5. Inter 600 for body — confident reading weight
|
||||
- Don't introduce a second brand accent. Wise green is the sole identity colour.
|
||||
- Don't render the hero in weight 700 or lighter. The brand's display weight is 900.
|
||||
- Don't render CTAs as sharp rectangles. The 24 px pill geometry is non-negotiable.
|
||||
- Don't pair the green CTA with a green background. The brand always sits Wise green on neutral surfaces (sage / white / ink).
|
||||
- Don't replace Wise Sans with a generic geometric sans for hero typography — the proprietary face IS the brand's voice.
|
||||
|
||||
@ -1,257 +1,465 @@
|
||||
# Design System Inspired by xAI
|
||||
---
|
||||
version: alpha
|
||||
name: xAI Inspired
|
||||
description: An inspired interpretation of xAI's design language — Elon Musk's frontier-AI company whose web surface is a strict near-black canvas broken only by white pill outlines, occasional warm sunset / dusk gradient accents, a custom geometric sans (Universal Sans) for display, and an uppercase tracked monospace caption face; the whole system reads as engineered-cosmic, unmarketed.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#ffffff"
|
||||
on-primary: "#0a0a0a"
|
||||
ink: "#ffffff"
|
||||
ink-hover: "#fafaf7"
|
||||
body: "#dadbdf"
|
||||
body-mid: "#7d8187"
|
||||
mute: "#7d8187"
|
||||
hairline: "#212327"
|
||||
canvas: "#0a0a0a"
|
||||
canvas-soft: "#1a1c20"
|
||||
canvas-card: "#191919"
|
||||
canvas-mid: "#363a3f"
|
||||
accent-sunset: "#ff7a17"
|
||||
accent-sunset-soft: "#ffc285"
|
||||
accent-dusk: "#7c3aed"
|
||||
accent-twilight: "#c4b5fd"
|
||||
accent-breeze: "#a0c3ec"
|
||||
accent-midnight: "#0d1726"
|
||||
|
||||
xAI's website is a masterclass in dark-first, monospace-driven brutalist minimalism -- a design system that feels like it was built by engineers who understand that restraint is the ultimate form of sophistication. The entire experience is anchored to an almost-black background (`#1f2228`) with pure white text (`#ffffff`), creating a high-contrast, terminal-inspired aesthetic that signals deep technical credibility. There are no gradients, no decorative illustrations, no color accents competing for attention. This is a site that communicates through absence.
|
||||
typography:
|
||||
display-xl:
|
||||
fontFamily: universalSans, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 96px
|
||||
fontWeight: 400
|
||||
lineHeight: 96px
|
||||
letterSpacing: -2.4px
|
||||
display-lg:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 72px
|
||||
fontWeight: 400
|
||||
lineHeight: 72px
|
||||
letterSpacing: -1.8px
|
||||
display-md:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 400
|
||||
lineHeight: 48px
|
||||
letterSpacing: -1.2px
|
||||
display-sm:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 400
|
||||
lineHeight: 36px
|
||||
letterSpacing: -0.6px
|
||||
display-xs:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
body-lg:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 28px
|
||||
body-md:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-sm:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
caption-mono:
|
||||
fontFamily: GeistMono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
letterSpacing: 1.4px
|
||||
caption-mono-sm:
|
||||
fontFamily: GeistMono, ui-monospace, SFMono-Regular, Menlo, monospace
|
||||
fontSize: 12px
|
||||
fontWeight: 400
|
||||
lineHeight: 16px
|
||||
letterSpacing: 1.2px
|
||||
button-md:
|
||||
fontFamily: universalSans, Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 20px
|
||||
|
||||
The typographic system is split between two carefully chosen typefaces. `GeistMono` (Vercel's monospace font) handles display-level headlines at an extraordinary 320px with weight 300, and also serves as the button typeface in uppercase with tracked-out letter-spacing (1.4px). `universalSans` handles all body and secondary heading text with a clean, geometric sans-serif voice. The monospace-as-display-font choice is the defining aesthetic decision -- it positions xAI not as a consumer product but as infrastructure, as something built by people who live in terminals.
|
||||
rounded:
|
||||
none: 0px
|
||||
sm: 8px
|
||||
pill: 9999px
|
||||
full: 9999px
|
||||
|
||||
The spacing system operates on an 8px base grid with values concentrated at the small end (4px, 8px, 24px, 48px), reflecting a dense, information-focused layout philosophy. Border radius is minimal -- the site barely rounds anything, maintaining sharp, architectural edges. There are no decorative shadows, no gradients, no layered elevation. Depth is communicated purely through contrast and whitespace.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 24px
|
||||
2xl: 32px
|
||||
3xl: 48px
|
||||
4xl: 64px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
borderColor: "{colors.primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
button-outline-on-dark:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
button-outline-sm:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas-card}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-product:
|
||||
backgroundColor: "{colors.canvas-card}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
content-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-md}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
eyebrow-mono:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.caption-mono}"
|
||||
divider-hairline:
|
||||
borderColor: "{colors.hairline}"
|
||||
footer:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.body}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.hairline}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
item-divider: "{colors.hairline}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption-mono}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.hairline}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
xAI is Elon Musk's frontier-AI lab and the website wears that posture with engineered restraint: a near-black canvas `{colors.canvas}` (`#0a0a0a`) edge-to-edge, white outline pills as every interactive element, and a single proprietary geometric sans `Universal Sans` carrying every display headline at weight 400. There is no gradient hero, no atmospheric backdrop, no product screenshot. The brand reads as confidently sparse — a research lab announcing its work rather than a SaaS marketing site.
|
||||
|
||||
Type is the second decisive voice. `Universal Sans` carries every display at weight 400 (regular) with aggressive negative tracking (`-2.4 px` at 96 px, scaling down through the display ladder). For technical labels, eyebrows, and metric counters, the brand pairs `Geist Mono` (uppercase, 1.4 px positive tracking) — every section eyebrow reads as a code comment more than a marketing label.
|
||||
|
||||
Every interactive element is a pill (`{rounded.pill}` 9999 px) with 1 px white-translucent border `rgba(255, 255, 255, 0.25)`. The button shape never varies — the same translucent-white pill carries "Try Grok", "Read announcement", "Custom Voices", "Sign up now", and every "Read" anchor. The pill is the entire shape system.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Pure dark theme: `#1f2228` background with `#ffffff` text -- no gray middle ground
|
||||
- GeistMono at extreme display sizes (320px, weight 300) -- monospace as luxury
|
||||
- Uppercase monospace buttons with 1.4px letter-spacing -- technical, commanding
|
||||
- universalSans for body text at 16px/1.5 and headings at 30px/1.2 -- clean contrast
|
||||
- Zero decorative elements: no shadows, no gradients, no colored accents
|
||||
- 8px spacing grid with a sparse, deliberate scale
|
||||
- Heroicons SVG icon system -- minimal, functional
|
||||
- Tailwind CSS with arbitrary values -- utility-first engineering approach
|
||||
- A single near-black canvas (`{colors.canvas}` `#0a0a0a`) with white outline pills as the entire interactive vocabulary.
|
||||
- Universal Sans weight 400 for display, Geist Mono uppercase tracked for labels — the two-face contrast IS the brand voice.
|
||||
- Every button is a `{rounded.pill}` outline with translucent-white border. The brand never uses filled CTAs except for one variant (white-filled pill on Sign Up).
|
||||
- Cards are tight `{rounded.sm}` 8 px rectangles in a slightly-lighter `{colors.canvas-card}` (`#191919`) fill with hairline border. No shadows.
|
||||
- A muted accent palette of sunset-orange / dusk-purple / twilight-violet / breeze-blue lives in the design tokens but appears rarely on the main marketing surface — reserved for product illustrations / icons.
|
||||
- Massive negative letter-spacing on display headlines (`-2.4 px` at 96 px) gives the typography a precise, gathered look.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Pure White** (`#ffffff`): The singular text color, link color, and all foreground elements. In xAI's system, white is not a background -- it is the voice.
|
||||
- **Dark Background** (`#1f2228`): The canvas. A warm near-black with a subtle blue undertone (not pure black, not neutral gray). This specific hue prevents the harsh eye strain of `#000000` while maintaining deep darkness.
|
||||
### Brand & Accent
|
||||
- **White** (`{colors.primary}` — `#ffffff`): The brand's primary "color" — used as button outline, button-primary fill, all display text. The brand's signature is white-on-near-black.
|
||||
- **Sunset Orange** (`{colors.accent-sunset}` — `#ff7a17`): A warm orange used inside product illustrations and accent moments.
|
||||
- **Sunset Soft** (`{colors.accent-sunset-soft}` — `#ffc285`): The lighter variant of the sunset accent.
|
||||
- **Dusk Purple** (`{colors.accent-dusk}` — `#7c3aed`): Deep purple used inside product illustrations.
|
||||
- **Twilight** (`{colors.accent-twilight}` — `#c4b5fd`): Soft violet — illustrative accent.
|
||||
- **Breeze Blue** (`{colors.accent-breeze}` — `#a0c3ec`): Soft blue — illustrative accent.
|
||||
- **Midnight** (`{colors.accent-midnight}` — `#0d1726`): Deep blue-black for illustrative backgrounds.
|
||||
|
||||
### Interactive
|
||||
- **White Default** (`#ffffff`): Link and interactive element color in default state.
|
||||
- **White Muted** (`rgba(255, 255, 255, 0.5)`): Hover state for links -- a deliberate dimming rather than brightening, which is unusual and distinctive.
|
||||
- **White Subtle** (`rgba(255, 255, 255, 0.2)`): Borders, dividers, and subtle surface treatments.
|
||||
- **Ring Blue** (`rgb(59, 130, 246) / 0.5`): Tailwind's default focus ring color (`--tw-ring-color`), used for keyboard accessibility focus states.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#0a0a0a`): The default near-black page background. The brand's only true surface.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#1a1c20`): A slightly lighter dark fill used for hovered nav items and tooltips.
|
||||
- **Canvas Card** (`{colors.canvas-card}` — `#191919`): The charcoal card fill used inside product-feature cards.
|
||||
- **Canvas Mid** (`{colors.canvas-mid}` — `#363a3f`): A mid-dark used for nested surfaces and code mockup backgrounds.
|
||||
- **Hairline** (`{colors.hairline}` — `#212327`): 1 px solid dividers on dark surfaces.
|
||||
|
||||
### Surface & Borders
|
||||
- **Surface Elevated** (`rgba(255, 255, 255, 0.05)`): Subtle card backgrounds and hover surfaces -- barely visible lift.
|
||||
- **Surface Hover** (`rgba(255, 255, 255, 0.08)`): Slightly more visible hover state for interactive containers.
|
||||
- **Border Default** (`rgba(255, 255, 255, 0.1)`): Standard border for cards, dividers, and containers.
|
||||
- **Border Strong** (`rgba(255, 255, 255, 0.2)`): Emphasized borders for active states and button outlines.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#ffffff`): Default text on canvas — pure white.
|
||||
- **Ink Hover** (`{colors.ink-hover}` — `#fafaf7`): Slightly off-white used for hover states (filtered out per no-hover policy in component specs).
|
||||
- **Body** (`{colors.body}` — `#dadbdf`): Secondary body text — supporting copy in lighter weight.
|
||||
- **Body Mid / Mute** (`{colors.body-mid}` — `#7d8187`): Mid-emphasis body and mute text — captions, fine print.
|
||||
|
||||
### Functional
|
||||
- **Text Primary** (`#ffffff`): All headings, body text, labels.
|
||||
- **Text Secondary** (`rgba(255, 255, 255, 0.7)`): Descriptions, captions, supporting text.
|
||||
- **Text Tertiary** (`rgba(255, 255, 255, 0.5)`): Muted labels, placeholder text, timestamps.
|
||||
- **Text Quaternary** (`rgba(255, 255, 255, 0.3)`): Disabled text, very subtle annotations.
|
||||
### Semantic
|
||||
The brand doesn't surface a separate semantic palette on the marketing site. Validation cues use the white-on-canvas hierarchy.
|
||||
|
||||
## 3. Typography Rules
|
||||
## Typography
|
||||
|
||||
### Font Family
|
||||
- **Display / Buttons**: `GeistMono`, with fallback: `ui-monospace, SFMono-Regular, Roboto Mono, Menlo, Monaco, Liberation Mono, DejaVu Sans Mono, Courier New`
|
||||
- **Body / Headings**: `universalSans`, with fallback: `universalSans Fallback`
|
||||
Two faces ladder the system:
|
||||
1. **universalSans** — proprietary geometric sans used for every display, body, button, and link role. Weight 400 only on the marketing surface (the brand's restraint is part of the voice). Negative letter-spacing at display sizes is the visual signature.
|
||||
2. **GeistMono** — used for uppercase section eyebrows, label captions, and metric counters. Positive tracking (1.2 – 1.4 px) at 12 – 14 px.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Transform | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-----------|-------|
|
||||
| Display Hero | GeistMono | 320px (20rem) | 300 | 1.50 | normal | none | Extreme scale, monospace luxury |
|
||||
| Section Heading | universalSans | 30px (1.88rem) | 400 | 1.20 (tight) | normal | none | Clean sans-serif contrast |
|
||||
| Body | universalSans | 16px (1rem) | 400 | 1.50 | normal | none | Standard reading text |
|
||||
| Button | GeistMono | 14px (0.88rem) | 400 | 1.43 | 1.4px | uppercase | Tracked monospace, commanding |
|
||||
| Label / Caption | universalSans | 14px (0.88rem) | 400 | 1.50 | normal | none | Supporting text |
|
||||
| Small / Meta | universalSans | 12px (0.75rem) | 400 | 1.50 | normal | none | Timestamps, footnotes |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xl}` | 96px | 400 | 96px | -2.4px | Maximum hero scale. |
|
||||
| `{typography.display-lg}` | 72px | 400 | 72px | -1.8px | Sub-hero displays. |
|
||||
| `{typography.display-md}` | 48px | 400 | 48px | -1.2px | Section headlines. |
|
||||
| `{typography.display-sm}` | 32px | 400 | 36px | -0.6px | Card-cluster headings. |
|
||||
| `{typography.display-xs}` | 20px | 400 | 28px | 0 | Inline displays. |
|
||||
| `{typography.body-lg}` | 18px | 400 | 28px | 0 | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 16px | 400 | 24px | 0 | Default body. |
|
||||
| `{typography.body-sm}` | 14px | 400 | 20px | 0 | Secondary body. |
|
||||
| `{typography.caption-mono}` | 14px | 400 | 20px | 1.4px | Section eyebrow (GeistMono uppercase). |
|
||||
| `{typography.caption-mono-sm}` | 12px | 400 | 16px | 1.2px | Small mono labels. |
|
||||
| `{typography.button-md}` | 14px | 400 | 20px | 0 | Button label. |
|
||||
|
||||
### Principles
|
||||
- **Monospace as display**: GeistMono at 320px is not a gimmick -- it is the brand statement. The fixed-width characters at extreme scale create a rhythmic, architectural quality that no proportional font can achieve.
|
||||
- **Light weight at scale**: Weight 300 for the 320px headline prevents the monospace from feeling heavy or brutish at extreme sizes. It reads as precise, not overwhelming.
|
||||
- **Uppercase buttons**: All button text is uppercase GeistMono with 1.4px letter-spacing. This creates a distinctly technical, almost command-line aesthetic for interactive elements.
|
||||
- **Sans-serif for reading**: universalSans at 16px/1.5 provides excellent readability for body content, creating a clean contrast against the monospace display elements.
|
||||
- **Two-font clarity**: The system uses exactly two typefaces with clear roles -- monospace for impact and interaction, sans-serif for information and reading. No overlap, no ambiguity.
|
||||
- **Weight 400 for everything.** The brand never bolds. Negative tracking + size hierarchy do the emphasis work.
|
||||
- **Tight negative tracking on display sizes.** Reverting to neutral tracking loses the precision feel.
|
||||
- **GeistMono uppercase for eyebrows.** Tracked positively (1.4 px) to make the mono read as a code comment.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
universalSans is proprietary. Open-source substitutes:
|
||||
- **Display + body** — *Inter* weight 400 with `-0.04em` to `-0.02em` letter-spacing at display sizes comes closest. *Geist* is the second-best option.
|
||||
- **Mono** — *Geist Mono* is the documented brand companion; *JetBrains Mono* or *IBM Plex Mono* are alternates.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 24 px · `{spacing.2xl}` 32 px · `{spacing.3xl}` 48 px · `{spacing.4xl}` 64 px.
|
||||
- **Section padding**: hero / content bands at `{spacing.4xl}` 64 px on desktop.
|
||||
- **Card interior padding**: `{spacing.xl}` 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- Marketing content centres at ~1200 px.
|
||||
- Product / announcement card grid: 2-up at desktop, 1-up at mobile.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 768px | Hero scales 96 → 48 px; grids 1-up; hamburger nav. |
|
||||
| Desktop | ≥ 768px | Full hero + 2-up grids. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render ~32 – 40 px tall (8 vertical padding + 20 line). Mobile inflates touch area to meet WCAG 44 × 44 px.
|
||||
|
||||
#### Image Behavior
|
||||
The brand uses sparse SVG illustrations for product moments (Grok, Voice, API). No photography on the marketing surface.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.hairline}` border. | Card chrome, button outlines (with translucent white). |
|
||||
|
||||
The brand uses no shadows. Hairline borders carry all elevation cues.
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.sm}` | 8px | Card chrome (the brand's `--radius` value). |
|
||||
| `{rounded.pill}` | 9999px | Every button — the brand's universal interactive shape. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers. |
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary (White on Dark)**
|
||||
- Background: `#ffffff`
|
||||
- Text: `#1f2228`
|
||||
- Padding: 12px 24px
|
||||
- Radius: 0px (sharp corners)
|
||||
- Font: GeistMono 14px weight 400, uppercase, letter-spacing 1.4px
|
||||
- Hover: `rgba(255, 255, 255, 0.9)` background
|
||||
- Use: Primary CTA ("TRY GROK", "GET STARTED")
|
||||
**`button-primary`** — the rare white-filled pill (used on a single Sign Up CTA).
|
||||
- Background `{colors.primary}` white, text `{colors.on-primary}` near-black, 1 px solid white border, label `{typography.button-md}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill}` 9999 px.
|
||||
|
||||
**Ghost / Outlined**
|
||||
- Background: transparent
|
||||
- Text: `#ffffff`
|
||||
- Padding: 12px 24px
|
||||
- Radius: 0px
|
||||
- Border: `1px solid rgba(255, 255, 255, 0.2)`
|
||||
- Font: GeistMono 14px weight 400, uppercase, letter-spacing 1.4px
|
||||
- Hover: `rgba(255, 255, 255, 0.05)` background
|
||||
- Use: Secondary actions ("LEARN MORE", "VIEW API")
|
||||
**`button-outline-on-dark`** — the canonical white-outline pill, used for every non-primary CTA.
|
||||
- Background `{colors.canvas}` (transparent in practice — `rgba(0,0,0,0)`), text `{colors.ink}` white, 1 px solid `{colors.hairline}` border (translucent white at runtime), same typography / padding scale / shape.
|
||||
|
||||
**Text Link**
|
||||
- Background: none
|
||||
- Text: `#ffffff`
|
||||
- Font: universalSans 16px weight 400
|
||||
- Hover: `rgba(255, 255, 255, 0.5)` -- dims on hover
|
||||
- Use: Inline links, navigation items
|
||||
**`button-outline-sm`** — the smaller outline pill used in card-cluster CTAs.
|
||||
- Same as `button-outline-on-dark` with tighter padding `{spacing.xs} {spacing.md}`.
|
||||
|
||||
### Cards & Containers
|
||||
- Background: `rgba(255, 255, 255, 0.03)` or transparent
|
||||
- Border: `1px solid rgba(255, 255, 255, 0.1)`
|
||||
- Radius: 0px (sharp) or 4px (subtle)
|
||||
- Shadow: none -- xAI does not use box shadows
|
||||
- Hover: border shifts to `rgba(255, 255, 255, 0.2)`
|
||||
|
||||
### Navigation
|
||||
- Dark background matching page (`#1f2228`)
|
||||
- Brand logotype: white text, left-aligned
|
||||
- Links: universalSans 14px weight 400, `#ffffff` text
|
||||
- Hover: `rgba(255, 255, 255, 0.5)` text color
|
||||
- CTA: white primary button, right-aligned
|
||||
- Mobile: hamburger toggle
|
||||
**`card-content`** — the default content card.
|
||||
- Background `{colors.canvas-card}` (`#191919`), text `{colors.ink}`, 1 px solid `{colors.hairline}` border, padding `{spacing.xl}`, shape `{rounded.sm}` 8 px.
|
||||
|
||||
### Badges / Tags
|
||||
**Monospace Tag**
|
||||
- Background: transparent
|
||||
- Text: `#ffffff`
|
||||
- Padding: 4px 8px
|
||||
- Border: `1px solid rgba(255, 255, 255, 0.2)`
|
||||
- Radius: 0px
|
||||
- Font: GeistMono 12px uppercase, letter-spacing 1px
|
||||
**`card-feature-product`** — the product-feature card (Grok / Voice / API).
|
||||
- Same chrome as `card-content`. Hosts an SVG illustration + headline + body + outline pill CTA.
|
||||
|
||||
### Inputs & Forms
|
||||
- Background: transparent or `rgba(255, 255, 255, 0.05)`
|
||||
- Border: `1px solid rgba(255, 255, 255, 0.2)`
|
||||
- Radius: 0px
|
||||
- Focus: ring with `rgb(59, 130, 246) / 0.5`
|
||||
- Text: `#ffffff`
|
||||
- Placeholder: `rgba(255, 255, 255, 0.3)`
|
||||
- Label: `rgba(255, 255, 255, 0.7)`, universalSans 14px
|
||||
|
||||
## 5. Layout Principles
|
||||
**`text-input`** — the standard text input on dark.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, 1 px solid `{colors.hairline}`, body in `{typography.body-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 8 px.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 4px, 8px, 24px, 48px
|
||||
- The scale is deliberately sparse -- xAI avoids granular spacing distinctions, preferring large jumps that create clear visual hierarchy through whitespace alone
|
||||
### Navigation
|
||||
|
||||
### Grid & Container
|
||||
- Max content width: approximately 1200px
|
||||
- Hero: full-viewport height with massive centered monospace headline
|
||||
- Feature sections: simple vertical stacking with generous section padding (48px-96px)
|
||||
- Two-column layouts for feature descriptions at desktop
|
||||
- Full-width dark sections maintain the single dark background throughout
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Extreme generosity**: xAI uses vast amounts of whitespace. The 320px headline with 48px+ surrounding padding creates a sense of emptiness that is itself a design statement -- the content is so important it needs room to breathe.
|
||||
- **Vertical rhythm over horizontal density**: Content stacks vertically with large gaps between sections rather than packing horizontally. This creates a scroll-driven experience that feels deliberate and cinematic.
|
||||
- **No visual noise**: The absence of decorative elements, borders between sections, and color variety means whitespace is the primary structural tool.
|
||||
**`nav-link`** — link items inside nav.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm}`.
|
||||
|
||||
### Breakpoints
|
||||
- 2000px, 1536px, 1280px, 1024px, 1000px, 768px, 640px
|
||||
- Tailwind responsive modifiers drive breakpoint behavior
|
||||
**`footer`** — the footer band.
|
||||
- Background `{colors.canvas}`, text `{colors.body}`, padding `{spacing.3xl} {spacing.xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
### Border Radius Scale
|
||||
- Sharp (0px): Primary treatment for buttons, cards, inputs -- the default
|
||||
- Subtle (4px): Occasional softening on secondary containers
|
||||
- The near-zero radius philosophy is core to the brand's brutalist identity
|
||||
### Signature Components
|
||||
|
||||
## 6. Depth & Elevation
|
||||
**`hero-band`** — the dark hero with massive display headline.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.4xl} {spacing.xl}`. Headline in `{typography.display-xl}` (96 px weight 400 with `-2.4 px` tracking).
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow, no border | Page background, body content |
|
||||
| Surface (Level 1) | `rgba(255,255,255,0.03)` background | Subtle card surfaces |
|
||||
| Bordered (Level 2) | `1px solid rgba(255,255,255,0.1)` border | Cards, containers, dividers |
|
||||
| Active (Level 3) | `1px solid rgba(255,255,255,0.2)` border | Hover states, active elements |
|
||||
| Focus (Accessibility) | `ring` with `rgb(59,130,246)/0.5` | Keyboard focus indicator |
|
||||
**`content-band`** — the standard content section.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.4xl} {spacing.xl}`. Section headline in `{typography.display-md}` preceded by a `{typography.caption-mono}` UPPERCASE GeistMono eyebrow.
|
||||
|
||||
**Elevation Philosophy**: xAI rejects the conventional shadow-based elevation system entirely. There are no box-shadows anywhere on the site. Instead, depth is communicated through three mechanisms: (1) opacity-based borders that brighten on interaction, creating a sense of elements "activating" rather than lifting; (2) extremely subtle background opacity shifts (`0.03` to `0.08`) that create barely-perceptible surface differentiation; and (3) the massive scale contrast between the 320px display type and 16px body text, which creates typographic depth. This is elevation through contrast and opacity, not through simulated light and shadow.
|
||||
**`eyebrow-mono`** — the uppercase tracked GeistMono label above every section headline.
|
||||
- Text `{colors.ink}`, set in `{typography.caption-mono}`. The brand's signature label style.
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`divider-hairline`** — the 1 px line between section bands.
|
||||
- 1 px solid `{colors.hairline}`.
|
||||
|
||||
### Examples (illustrative)
|
||||
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use `#1f2228` as the universal background -- never pure black `#000000`
|
||||
- Use GeistMono for all display headlines and button text -- monospace IS the brand
|
||||
- Apply uppercase + 1.4px letter-spacing to all button labels
|
||||
- Use weight 300 for the massive display headline (320px)
|
||||
- Keep borders at `rgba(255, 255, 255, 0.1)` -- barely visible, not absent
|
||||
- Dim interactive elements on hover to `rgba(255, 255, 255, 0.5)` -- the reverse of convention
|
||||
- Maintain sharp corners (0px radius) as the default -- brutalist precision
|
||||
- Use universalSans for all body and reading text at 16px/1.5
|
||||
- Reserve `{colors.canvas}` (`#0a0a0a`) as the only page surface. The brand is dark-canvas only.
|
||||
- Set hero headlines in `{typography.display-xl}` Universal Sans weight 400 with `-2.4 px` tracking. The precision IS the voice.
|
||||
- Use `{rounded.pill}` 9999 px on every interactive element. The pill is the brand.
|
||||
- Pair Universal Sans (sentence-case) with GeistMono UPPERCASE (eyebrows, labels, metric counters).
|
||||
- Use white-translucent borders for outline buttons — the brand never uses solid white borders on its outline pill.
|
||||
|
||||
### Don't
|
||||
- Don't use box-shadows -- xAI has zero shadow elevation
|
||||
- Don't introduce color accents beyond white and the dark background -- the monochromatic palette is sacred
|
||||
- Don't use large border-radius (8px+, pill shapes) -- the sharp edge is intentional
|
||||
- Don't use bold weights (600-700) for headlines -- weight 300-400 only
|
||||
- Don't brighten elements on hover -- xAI dims to `0.5` opacity instead
|
||||
- Don't add decorative gradients, illustrations, or color blocks
|
||||
- Don't use proportional fonts for buttons -- GeistMono uppercase is mandatory
|
||||
- Don't use colored status indicators unless absolutely necessary -- keep everything in the white/dark spectrum
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile | <640px | Single column, hero headline scales dramatically down |
|
||||
| Small Tablet | 640-768px | Slight increase in padding |
|
||||
| Tablet | 768-1024px | Two-column layouts begin, heading sizes increase |
|
||||
| Desktop | 1024-1280px | Full layout, generous whitespace |
|
||||
| Large | 1280-1536px | Wider containers, more breathing room |
|
||||
| Extra Large | 1536-2000px | Maximum content width, centered |
|
||||
| Ultra | >2000px | Content stays centered, extreme margins |
|
||||
|
||||
### Touch Targets
|
||||
- Buttons use 12px 24px padding for comfortable touch
|
||||
- Navigation links spaced with 24px gaps
|
||||
- Minimum tap target: 44px height
|
||||
- Mobile: full-width buttons for easy thumb reach
|
||||
|
||||
### Collapsing Strategy
|
||||
- Hero: 320px monospace headline scales down dramatically (to ~48px-64px on mobile)
|
||||
- Navigation: horizontal links collapse to hamburger menu
|
||||
- Feature sections: two-column to single-column stacking
|
||||
- Section padding: 96px -> 48px -> 24px across breakpoints
|
||||
- Massive display type is the first thing to resize -- it must remain impactful but not overflow
|
||||
|
||||
### Image Behavior
|
||||
- Minimal imagery -- the site relies on typography and whitespace
|
||||
- Any product screenshots maintain sharp corners
|
||||
- Full-width media scales proportionally with viewport
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Background: Dark (`#1f2228`)
|
||||
- Text Primary: White (`#ffffff`)
|
||||
- Text Secondary: White 70% (`rgba(255, 255, 255, 0.7)`)
|
||||
- Text Muted: White 50% (`rgba(255, 255, 255, 0.5)`)
|
||||
- Text Disabled: White 30% (`rgba(255, 255, 255, 0.3)`)
|
||||
- Border Default: White 10% (`rgba(255, 255, 255, 0.1)`)
|
||||
- Border Strong: White 20% (`rgba(255, 255, 255, 0.2)`)
|
||||
- Surface Subtle: White 3% (`rgba(255, 255, 255, 0.03)`)
|
||||
- Surface Hover: White 8% (`rgba(255, 255, 255, 0.08)`)
|
||||
- Focus Ring: Blue (`rgb(59, 130, 246)` at 50% opacity)
|
||||
- Button Primary BG: White (`#ffffff`), text Dark (`#1f2228`)
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on #1f2228 background. Headline in GeistMono at 72px weight 300, color #ffffff, centered. Subtitle in universalSans 18px weight 400, rgba(255,255,255,0.7), max-width 600px centered. Two buttons: primary (white bg, #1f2228 text, 0px radius, GeistMono 14px uppercase, 1.4px letter-spacing, 12px 24px padding) and ghost (transparent bg, 1px solid rgba(255,255,255,0.2), white text, same font treatment)."
|
||||
- "Design a card: transparent or rgba(255,255,255,0.03) background, 1px solid rgba(255,255,255,0.1) border, 0px radius, 24px padding. No shadow. Title in universalSans 22px weight 400, #ffffff. Body in universalSans 16px weight 400, rgba(255,255,255,0.7), line-height 1.5. Hover: border changes to rgba(255,255,255,0.2)."
|
||||
- "Build navigation: #1f2228 background, full-width. Brand text left (GeistMono 14px uppercase). Links in universalSans 14px #ffffff with hover to rgba(255,255,255,0.5). White primary button right-aligned (GeistMono 14px uppercase, 1.4px letter-spacing)."
|
||||
- "Create a form: dark background #1f2228. Label in universalSans 14px rgba(255,255,255,0.7). Input with transparent bg, 1px solid rgba(255,255,255,0.2) border, 0px radius, white text 16px universalSans. Focus: blue ring rgb(59,130,246)/0.5. Placeholder: rgba(255,255,255,0.3)."
|
||||
- "Design a monospace tag/badge: transparent bg, 1px solid rgba(255,255,255,0.2), 0px radius, GeistMono 12px uppercase, 1px letter-spacing, white text, 4px 8px padding."
|
||||
|
||||
### Iteration Guide
|
||||
1. Always start with `#1f2228` background -- never use pure black or gray backgrounds
|
||||
2. GeistMono for display and buttons, universalSans for everything else -- never mix these roles
|
||||
3. All buttons must be GeistMono uppercase with 1.4px letter-spacing -- this is non-negotiable
|
||||
4. No shadows, ever -- depth comes from border opacity and background opacity only
|
||||
5. Borders are always white with low opacity (0.1 default, 0.2 for emphasis)
|
||||
6. Hover behavior dims to 0.5 opacity rather than brightening -- the reverse of most systems
|
||||
7. Sharp corners (0px) by default -- only use 4px for specific secondary containers
|
||||
8. Body text at 16px universalSans with 1.5 line-height for comfortable reading
|
||||
9. Generous section padding (48px-96px) -- let content breathe in the darkness
|
||||
10. The monochromatic white-on-dark palette is absolute -- resist adding color unless critical for function
|
||||
- Don't introduce a light-mode counterpart. xAI is dark-canvas only.
|
||||
- Don't bold display headlines. Weight 400 is the entire scale.
|
||||
- Don't use filled buttons broadly. The brand uses outline pills almost exclusively; one Sign Up white-filled pill is the rare exception.
|
||||
- Don't drop a drop-shadow on cards. Hairline borders carry elevation.
|
||||
- Don't substitute Universal Sans with a generic geometric sans without adjusting letter-spacing. The negative tracking is part of the brand.
|
||||
|
||||
@ -1,328 +1,537 @@
|
||||
# Design System Inspired by Zapier
|
||||
---
|
||||
version: alpha
|
||||
name: Zapier Inspired
|
||||
description: An inspired interpretation of Zapier's design language — a workflow-automation platform whose surface combines warm-cream neutrals (`#fffefb` canvas, `#f8f4f0` soft cream) with deep coffee ink (`#201515`) and a single saturated orange CTA accent (`#ff4f00`); typography pairs the proprietary Degular Display family at hero scale with Inter for sub-displays and body, giving the brand a confident-warm rather than cool-tech voice.
|
||||
|
||||
## 1. Visual Theme & Atmosphere
|
||||
colors:
|
||||
primary: "#ff4f00"
|
||||
on-primary: "#fffefb"
|
||||
ink: "#201515"
|
||||
ink-soft: "#2f2a26"
|
||||
ink-mid: "#36342e"
|
||||
body: "#605d52"
|
||||
body-mid: "#939084"
|
||||
mute: "#c5c0b1"
|
||||
canvas: "#fffefb"
|
||||
canvas-soft: "#f8f4f0"
|
||||
|
||||
Zapier's website radiates warm, approachable professionalism. It rejects the cold monochrome minimalism of developer tools in favor of a cream-tinted canvas (`#fffefb`) that feels like unbleached paper -- the digital equivalent of a well-organized notebook. The near-black (`#201515`) text has a faint reddish-brown warmth, creating an atmosphere more human than mechanical. This is automation designed to feel effortless, not technical.
|
||||
typography:
|
||||
display-xl:
|
||||
fontFamily: Degular Display, Inter, system-ui, -apple-system, sans-serif
|
||||
fontSize: 56px
|
||||
fontWeight: 500
|
||||
lineHeight: 56px
|
||||
display-lg:
|
||||
fontFamily: Degular Display, Inter, system-ui, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 500
|
||||
lineHeight: 48px
|
||||
display-md:
|
||||
fontFamily: Degular Display, Inter, system-ui, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 500
|
||||
lineHeight: 36px
|
||||
letterSpacing: 1px
|
||||
display-sub-lg:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 48px
|
||||
fontWeight: 500
|
||||
lineHeight: 49.92px
|
||||
display-sub-md:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 32px
|
||||
fontWeight: 400
|
||||
lineHeight: 40px
|
||||
display-sub-sm:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 24px
|
||||
fontWeight: 600
|
||||
lineHeight: 30px
|
||||
letterSpacing: -0.6px
|
||||
display-xs:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 700
|
||||
lineHeight: 25px
|
||||
letterSpacing: -0.5px
|
||||
body-lg:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 20px
|
||||
fontWeight: 400
|
||||
lineHeight: 30px
|
||||
letterSpacing: -0.2px
|
||||
body-md:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 400
|
||||
lineHeight: 27px
|
||||
body-md-strong:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 600
|
||||
lineHeight: 27px
|
||||
body-sm:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 400
|
||||
lineHeight: 24px
|
||||
body-sm-strong:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 16px
|
||||
fontWeight: 600
|
||||
lineHeight: 24px
|
||||
caption:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 400
|
||||
lineHeight: 21px
|
||||
eyebrow-uppercase:
|
||||
fontFamily: Degular Display, Inter, system-ui, sans-serif
|
||||
fontSize: 14px
|
||||
fontWeight: 500
|
||||
lineHeight: 14px
|
||||
letterSpacing: 1px
|
||||
button-md:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 18px
|
||||
fontWeight: 600
|
||||
lineHeight: 27px
|
||||
button-sm:
|
||||
fontFamily: Inter, system-ui, sans-serif
|
||||
fontSize: 14.4px
|
||||
fontWeight: 700
|
||||
lineHeight: 14.4px
|
||||
letterSpacing: 0.144px
|
||||
|
||||
The typographic system is a deliberate interplay of two distinct personalities. **Degular Display** -- a geometric, wide-set display face -- handles hero-scale headlines at 56-80px with medium weight (500) and extraordinarily tight line-heights (0.90), creating headlines that compress vertically like stacked blocks. **Inter** serves as the workhorse for everything else, from section headings to body text and navigation, with fallbacks to Helvetica and Arial. **GT Alpina**, an elegant thin-weight serif with aggressive negative letter-spacing (-1.6px to -1.92px), makes occasional appearances for softer editorial moments. This three-font system gives Zapier the ability to shift register -- from bold and punchy (Degular) to clean and functional (Inter) to refined and literary (GT Alpina).
|
||||
rounded:
|
||||
none: 0px
|
||||
sm: 6px
|
||||
md: 12px
|
||||
pill: 9999px
|
||||
full: 9999px
|
||||
|
||||
The brand's signature orange (`#ff4f00`) is unmistakable -- a vivid, saturated red-orange that sits precisely between traffic-cone urgency and sunset warmth. It's used sparingly but decisively: primary CTA buttons, active state underlines, and accent borders. Against the warm cream background, this orange creates a color relationship that feels energetic without being aggressive.
|
||||
spacing:
|
||||
xxs: 2px
|
||||
xs: 4px
|
||||
sm: 8px
|
||||
md: 12px
|
||||
lg: 16px
|
||||
xl: 24px
|
||||
2xl: 32px
|
||||
3xl: 48px
|
||||
4xl: 64px
|
||||
|
||||
components:
|
||||
nav-bar:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
nav-link:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
button-primary:
|
||||
backgroundColor: "{colors.primary}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-secondary:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-tertiary:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.button-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.xl}"
|
||||
button-text:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.button-sm}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.sm} {spacing.lg}"
|
||||
text-input:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
card-content:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-cream:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
card-feature-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
pricing-card:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.ink}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
pricing-card-featured:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.body-md}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
hero-band:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
hero-band-dark:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
typography: "{typography.display-xl}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
content-band-cream:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
content-band-light:
|
||||
backgroundColor: "{colors.canvas}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.display-lg}"
|
||||
padding: "{spacing.4xl} {spacing.xl}"
|
||||
eyebrow-uppercase:
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.eyebrow-uppercase}"
|
||||
badge-pill:
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
typography: "{typography.body-sm}"
|
||||
rounded: "{rounded.pill}"
|
||||
padding: "{spacing.xs} {spacing.md}"
|
||||
footer:
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.canvas-soft}"
|
||||
typography: "{typography.body-sm}"
|
||||
padding: "{spacing.3xl} {spacing.xl}"
|
||||
|
||||
# ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
|
||||
ex-pricing-tier:
|
||||
description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
textColor: "{colors.ink}"
|
||||
borderColor: "{colors.mute}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-pricing-tier-featured:
|
||||
description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)."
|
||||
backgroundColor: "{colors.ink}"
|
||||
textColor: "{colors.on-primary}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-product-selector:
|
||||
description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-cart-drawer:
|
||||
description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
item-divider: "{colors.mute}"
|
||||
ex-app-shell-row:
|
||||
description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
activeIndicator: "{colors.primary}"
|
||||
rounded: "{rounded.sm}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
ex-data-table-cell:
|
||||
description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm."
|
||||
headerBackground: "{colors.canvas-soft}"
|
||||
headerTypography: "{typography.caption}"
|
||||
bodyTypography: "{typography.body-sm}"
|
||||
cellPadding: "{spacing.md} {spacing.lg}"
|
||||
rowBorder: "{colors.mute}"
|
||||
ex-auth-form-card:
|
||||
description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-modal-card:
|
||||
description: "Modal dialog surface — same chrome as feature-card with elevated shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.xl}"
|
||||
ex-empty-state-card:
|
||||
description: "Empty-state illustration frame."
|
||||
backgroundColor: "{colors.canvas-soft}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.3xl}"
|
||||
captionTypography: "{typography.body-md}"
|
||||
ex-toast:
|
||||
description: "Toast notification surface — feature-card shape + medium shadow."
|
||||
backgroundColor: "{colors.canvas}"
|
||||
rounded: "{rounded.md}"
|
||||
padding: "{spacing.md} {spacing.lg}"
|
||||
typography: "{typography.body-sm}"
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Zapier is the original "connect your apps" workflow automation platform — and the marketing surface today reads as confidently-mature. The brand pairs a warm-cream canvas `{colors.canvas}` (`#fffefb`) with a deep coffee-ink `{colors.ink}` (`#201515`) and a single saturated orange `{colors.primary}` (`#ff4f00`) CTA. The warmth in the neutrals — slightly cream rather than pure white — is the brand's defining temperature signal.
|
||||
|
||||
Type carries the second voice. The proprietary `Degular Display` family carries hero displays at weight 500. The brand uses `Inter` for everything else — sub-displays, body, button, eyebrow. The two-face pairing reads as "the brand has its own typeface for the loud moments and uses the workhorse for the rest" — modest and unflashy.
|
||||
|
||||
Cards are universally `{rounded.md}` 12 px. Buttons share the same 12 px radius — not pills, not square. The brand sits between the friendly-rounded and the technical-square camps with a deliberate middle position.
|
||||
|
||||
**Key Characteristics:**
|
||||
- Warm cream canvas (`#fffefb`) instead of pure white -- organic, paper-like warmth
|
||||
- Near-black with reddish undertone (`#201515`) -- text that breathes rather than dominates
|
||||
- Degular Display for hero headlines at 0.90 line-height -- compressed, impactful, modern
|
||||
- Inter as the universal UI font across all functional typography
|
||||
- GT Alpina for editorial accents -- thin-weight serif with extreme negative tracking
|
||||
- Zapier Orange (`#ff4f00`) as the single accent -- vivid, warm, sparingly applied
|
||||
- Warm neutral palette: borders (`#c5c0b1`), muted text (`#939084`), surface tints (`#eceae3`)
|
||||
- 8px base spacing system with generous padding on CTAs (20px 24px)
|
||||
- Border-forward design: `1px solid` borders in warm grays define structure over shadows
|
||||
- A single primary CTA color `{colors.primary}` (`#ff4f00`) — saturated orange. The brand's conversion signature.
|
||||
- Warm-cream canvas `{colors.canvas}` (`#fffefb`) — not pure white. The temperature IS the brand voice.
|
||||
- Deep coffee ink `{colors.ink}` (`#201515`) — not pure black. Warmth carries through to text.
|
||||
- Proprietary Degular Display for hero-scale, Inter for everything else. Two-face system.
|
||||
- `{rounded.md}` 12 px for buttons and cards — the brand's middle-radius signature.
|
||||
- A muted cream / coffee neutral ladder — `{colors.canvas-soft}` (`#f8f4f0`), `{colors.mute}` (`#c5c0b1`), `{colors.body-mid}` (`#939084`), `{colors.body}` (`#605d52`) — every neutral carries warmth, none are cool grey.
|
||||
|
||||
## 2. Color Palette & Roles
|
||||
## Colors
|
||||
|
||||
### Primary
|
||||
- **Zapier Black** (`#201515`): Primary text, headings, dark button backgrounds. A warm near-black with reddish undertones -- never cold.
|
||||
- **Cream White** (`#fffefb`): Page background, card surfaces, light button fills. Not pure white; the yellowish warmth is intentional.
|
||||
- **Off-White** (`#fffdf9`): Secondary background surface, subtle alternate tint. Nearly indistinguishable from cream white but creates depth.
|
||||
### Brand & Accent
|
||||
- **Zapier Orange** (`{colors.primary}` — `#ff4f00`): The single brand accent. Every primary CTA pill, every conversion target. The saturated orange IS the brand.
|
||||
|
||||
### Brand Accent
|
||||
- **Zapier Orange** (`#ff4f00`): Primary CTA buttons, active underline indicators, accent borders. The signature color -- vivid and warm.
|
||||
### Surface
|
||||
- **Canvas** (`{colors.canvas}` — `#fffefb`): Warm off-white page background.
|
||||
- **Canvas Soft** (`{colors.canvas-soft}` — `#f8f4f0`): Cream-tinted soft surface for cards / inset regions.
|
||||
|
||||
### Neutral Scale
|
||||
- **Dark Charcoal** (`#36342e`): Secondary text, footer text, border color for strong dividers. A warm dark gray-brown with 70% opacity variant.
|
||||
- **Warm Gray** (`#939084`): Tertiary text, muted labels, timestamp-style content. Mid-range with greenish-warm undertone.
|
||||
- **Sand** (`#c5c0b1`): Primary border color, hover state backgrounds, divider lines. The backbone of Zapier's structural elements.
|
||||
- **Light Sand** (`#eceae3`): Secondary button backgrounds, light borders, subtle card surfaces.
|
||||
- **Mid Warm** (`#b5b2aa`): Alternate border tone, used on specific span elements.
|
||||
### Text
|
||||
- **Ink** (`{colors.ink}` — `#201515`): Deep coffee — every heading and primary text.
|
||||
- **Ink Soft** (`{colors.ink-soft}` — `#2f2a26`): Near-black with brown warmth.
|
||||
- **Ink Mid** (`{colors.ink-mid}` — `#36342e`): Mid-emphasis text.
|
||||
- **Body** (`{colors.body}` — `#605d52`): Default body text color.
|
||||
- **Body Mid** (`{colors.body-mid}` — `#939084`): Secondary body / metadata.
|
||||
- **Mute** (`{colors.mute}` — `#c5c0b1`): Lowest-priority text — fine print, low-emphasis captions.
|
||||
|
||||
### Interactive
|
||||
- **Orange CTA** (`#ff4f00`): Primary action buttons and active tab underlines.
|
||||
- **Dark CTA** (`#201515`): Secondary dark buttons with sand hover state.
|
||||
- **Light CTA** (`#eceae3`): Tertiary/ghost buttons with sand hover.
|
||||
- **Link Default** (`#201515`): Standard link color, matching body text.
|
||||
- **Hover Underline**: Links remove `text-decoration: underline` on hover (inverse pattern).
|
||||
### Semantic
|
||||
The brand doesn't surface a separate semantic palette on its marketing pages. Status / validation cues borrow from the ink + orange hierarchy.
|
||||
|
||||
### Overlay & Surface
|
||||
- **Semi-transparent Dark** (`rgba(45, 45, 46, 0.5)`): Overlay button variant, backdrop-like elements.
|
||||
- **Pill Surface** (`#fffefb`): White pill buttons with sand borders.
|
||||
## Typography
|
||||
|
||||
### Shadows & Depth
|
||||
- **Inset Underline** (`rgb(255, 79, 0) 0px -4px 0px 0px inset`): Active tab indicator -- orange underline using inset box-shadow.
|
||||
- **Hover Underline** (`rgb(197, 192, 177) 0px -4px 0px 0px inset`): Inactive tab hover -- sand-colored underline.
|
||||
|
||||
## 3. Typography Rules
|
||||
|
||||
### Font Families
|
||||
- **Display**: `Degular Display` -- wide geometric display face for hero headlines
|
||||
- **Primary**: `Inter`, with fallbacks: `Helvetica, Arial`
|
||||
- **Editorial**: `GT Alpina` -- thin-weight serif for editorial moments
|
||||
- **System**: `Arial` -- fallback for form elements and system UI
|
||||
### Font Family
|
||||
Two faces ladder the system:
|
||||
1. **Degular Display** — proprietary geometric display sans used for hero headlines at weight 500. The brand's typographic signature.
|
||||
2. **Inter** — used for sub-displays, body, links, buttons, and eyebrows. Weights 400 / 500 / 600 / 700 are present.
|
||||
|
||||
### Hierarchy
|
||||
|
||||
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
||||
|------|------|------|--------|-------------|----------------|-------|
|
||||
| Display Hero XL | Degular Display | 80px (5.00rem) | 500 | 0.90 (tight) | normal | Maximum impact, compressed block |
|
||||
| Display Hero | Degular Display | 56px (3.50rem) | 500 | 0.90-1.10 (tight) | 0-1.12px | Primary hero headlines |
|
||||
| Display Hero SM | Degular Display | 40px (2.50rem) | 500 | 0.90 (tight) | normal | Smaller hero variant |
|
||||
| Display Button | Degular Display | 24px (1.50rem) | 600 | 1.00 (tight) | 1px | Large CTA button text |
|
||||
| Section Heading | Inter | 48px (3.00rem) | 500 | 1.04 (tight) | normal | Major section titles |
|
||||
| Editorial Heading | GT Alpina | 48px (3.00rem) | 250 | normal | -1.92px | Thin editorial headlines |
|
||||
| Editorial Sub | GT Alpina | 40px (2.50rem) | 300 | 1.08 (tight) | -1.6px | Editorial subheadings |
|
||||
| Sub-heading LG | Inter | 36px (2.25rem) | 500 | normal | -1px | Large sub-sections |
|
||||
| Sub-heading | Inter | 32px (2.00rem) | 400 | 1.25 (tight) | normal | Standard sub-sections |
|
||||
| Sub-heading MD | Inter | 28px (1.75rem) | 500 | normal | normal | Medium sub-headings |
|
||||
| Card Title | Inter | 24px (1.50rem) | 600 | normal | -0.48px | Card headings |
|
||||
| Body Large | Inter | 20px (1.25rem) | 400-500 | 1.00-1.20 (tight) | -0.2px | Feature descriptions |
|
||||
| Body Emphasis | Inter | 18px (1.13rem) | 600 | 1.00 (tight) | normal | Emphasized body text |
|
||||
| Body | Inter | 16px (1.00rem) | 400-500 | 1.20-1.25 | -0.16px | Standard reading text |
|
||||
| Body Semibold | Inter | 16px (1.00rem) | 600 | 1.16 (tight) | normal | Strong labels |
|
||||
| Button | Inter | 16px (1.00rem) | 600 | normal | normal | Standard buttons |
|
||||
| Button SM | Inter | 14px (0.88rem) | 600 | normal | normal | Small buttons |
|
||||
| Caption | Inter | 14px (0.88rem) | 500 | 1.25-1.43 | normal | Labels, metadata |
|
||||
| Caption Upper | Inter | 14px (0.88rem) | 600 | normal | 0.5px | Uppercase section labels |
|
||||
| Micro | Inter | 12px (0.75rem) | 600 | 0.90-1.33 | 0.5px | Tiny labels, often uppercase |
|
||||
| Micro SM | Inter | 13px (0.81rem) | 500 | 1.00-1.54 | normal | Small metadata text |
|
||||
| Token | Size | Weight | Line Height | Letter Spacing | Use |
|
||||
|---|---|---|---|---|---|
|
||||
| `{typography.display-xl}` | 56px | 500 | 56px | 0 | Hero headline (Degular Display). |
|
||||
| `{typography.display-lg}` | 48px | 500 | 48px | 0 | Sub-hero displays (Degular Display). |
|
||||
| `{typography.display-md}` | 32px | 500 | 36px | 1px | Section displays (Degular Display, positive tracking). |
|
||||
| `{typography.display-sub-lg}` | 48px | 500 | 49.92px | 0 | Inter-rendered sub-display. |
|
||||
| `{typography.display-sub-md}` | 32px | 400 | 40px | 0 | Inter sub-display. |
|
||||
| `{typography.display-sub-sm}` | 24px | 600 | 30px | -0.6px | Card titles (Inter, semibold). |
|
||||
| `{typography.display-xs}` | 20px | 700 | 25px | -0.5px | Inline display micro-headings. |
|
||||
| `{typography.body-lg}` | 20px | 400 | 30px | -0.2px | Lead paragraphs. |
|
||||
| `{typography.body-md}` | 18px | 400 | 27px | 0 | Default body. |
|
||||
| `{typography.body-md-strong}` | 18px | 600 | 27px | 0 | Bolded inline body. |
|
||||
| `{typography.body-sm}` | 16px | 400 | 24px | 0 | Secondary body. |
|
||||
| `{typography.body-sm-strong}` | 16px | 600 | 24px | 0 | Bold caption. |
|
||||
| `{typography.caption}` | 14px | 400 | 21px | 0 | Fine print. |
|
||||
| `{typography.eyebrow-uppercase}` | 14px | 500 | 14px | 1px | UPPERCASE eyebrow (Degular Display, positive tracking). |
|
||||
| `{typography.button-md}` | 18px | 600 | 27px | 0 | Primary button label. |
|
||||
| `{typography.button-sm}` | 14.4px | 700 | 14.4px | 0.144px | Small button label. |
|
||||
|
||||
### Principles
|
||||
- **Three-font system, clear roles**: Degular Display commands attention at hero scale only. Inter handles everything functional. GT Alpina adds editorial warmth sparingly.
|
||||
- **Compressed display**: Degular at 0.90 line-height creates vertically compressed headline blocks that feel modern and architectural.
|
||||
- **Weight as hierarchy signal**: Inter uses 400 (reading), 500 (navigation/emphasis), 600 (headings/CTAs). Degular uses 500 (display) and 600 (buttons).
|
||||
- **Uppercase for labels**: Section labels (like "01 / Colors") and small categorization use `text-transform: uppercase` with 0.5px letter-spacing.
|
||||
- **Negative tracking for elegance**: GT Alpina uses -1.6px to -1.92px letter-spacing for its thin-weight editorial headlines.
|
||||
- **Degular Display 500 for hero, Inter for everything else.** Strict role separation.
|
||||
- **Positive tracking on the Degular eyebrow** — `1 px` at 14 px is the brand's signature label style.
|
||||
- **Sentence-case headlines.** The brand never uppercases display sizes.
|
||||
|
||||
## 4. Component Stylings
|
||||
### Note on Font Substitutes
|
||||
Degular Display is proprietary. Open-source substitutes:
|
||||
- **Display** — *Inter* weight 500 at hero scale comes closest. *Mona Sans* weight 500 is a softer alternative.
|
||||
- **Sub-display + body** — *Inter* is the brand's actual second face.
|
||||
|
||||
## Layout
|
||||
|
||||
### Spacing System
|
||||
- **Base unit**: 4 px.
|
||||
- **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 24 px · `{spacing.2xl}` 32 px · `{spacing.3xl}` 48 px · `{spacing.4xl}` 64 px.
|
||||
- **Section padding**: bands use `{spacing.4xl}` 64 px top/bottom.
|
||||
- **Card interior**: cards at `{spacing.xl}` 24 px.
|
||||
|
||||
### Grid & Container
|
||||
- Marketing container ~1280 px wide; centred with gutters.
|
||||
- Hero: split at desktop (headline left, illustration right); stacked at mobile.
|
||||
- Pricing tier grid: 3 / 4-up at desktop.
|
||||
|
||||
### Responsive Strategy
|
||||
|
||||
#### Breakpoints
|
||||
|
||||
| Name | Width | Key Changes |
|
||||
|---|---|---|
|
||||
| Mobile | < 768px | Hero stacks; grids 1-up; hamburger nav. |
|
||||
| Tablet | 768–1023px | 2-up grids. |
|
||||
| Desktop | ≥ 1024px | Full grids; hero split. |
|
||||
|
||||
#### Touch Targets
|
||||
Buttons render ~48 px tall (12 vertical padding + 27 line). WCAG AAA met.
|
||||
|
||||
#### Image Behavior
|
||||
The brand uses illustrative SVGs of zaps / workflows + product screenshots inside `{rounded.md}` framed cards. Photography is rare.
|
||||
|
||||
## Elevation & Depth
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|---|---|---|
|
||||
| Level 0 — Flat | No shadow, no border. | Default for hero. |
|
||||
| Level 1 — Hairline | 1 px solid `{colors.ink}` border. | Pricing-tier card chrome, outline buttons. |
|
||||
| Level 2 — Soft Card | `{colors.canvas-soft}` cream fill against `{colors.canvas}` page. | Default content cards — surface contrast carries elevation. |
|
||||
|
||||
## Shapes
|
||||
|
||||
### Border Radius Scale
|
||||
|
||||
| Token | Value | Use |
|
||||
|---|---|---|
|
||||
| `{rounded.none}` | 0px | Full-bleed bands. |
|
||||
| `{rounded.sm}` | 6px | Inline pills, form inputs. |
|
||||
| `{rounded.md}` | 12px | The brand's canonical button + card radius. |
|
||||
| `{rounded.pill}` | 9999px | Status pills, badges. |
|
||||
| `{rounded.full}` | 9999px | Circular icon containers. |
|
||||
|
||||
## Components
|
||||
|
||||
### Buttons
|
||||
|
||||
**Primary Orange**
|
||||
- Background: `#ff4f00`
|
||||
- Text: `#fffefb`
|
||||
- Padding: 8px 16px
|
||||
- Radius: 4px
|
||||
- Border: `1px solid #ff4f00`
|
||||
- Use: Primary CTA ("Start free with email", "Sign up free")
|
||||
**`button-primary`** — the orange CTA.
|
||||
- Background `{colors.primary}`, text `{colors.on-primary}` (warm white), label `{typography.button-md}`, padding `{spacing.md} {spacing.xl}`, shape `{rounded.md}` 12 px.
|
||||
|
||||
**Primary Dark**
|
||||
- Background: `#201515`
|
||||
- Text: `#fffefb`
|
||||
- Padding: 20px 24px
|
||||
- Radius: 8px
|
||||
- Border: `1px solid #201515`
|
||||
- Hover: background shifts to `#c5c0b1`, text to `#201515`
|
||||
- Use: Large secondary CTA buttons
|
||||
**`button-secondary`** — the dark coffee-ink CTA.
|
||||
- Background `{colors.ink}`, text `{colors.on-primary}`, same typography / padding / shape.
|
||||
|
||||
**Light / Ghost**
|
||||
- Background: `#eceae3`
|
||||
- Text: `#36342e`
|
||||
- Padding: 20px 24px
|
||||
- Radius: 8px
|
||||
- Border: `1px solid #c5c0b1`
|
||||
- Hover: background shifts to `#c5c0b1`, text to `#201515`
|
||||
- Use: Tertiary actions, filter buttons
|
||||
**`button-tertiary`** — the outline CTA.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, same typography / padding / shape.
|
||||
|
||||
**Pill Button**
|
||||
- Background: `#fffefb`
|
||||
- Text: `#36342e`
|
||||
- Padding: 0px 16px
|
||||
- Radius: 20px
|
||||
- Border: `1px solid #c5c0b1`
|
||||
- Use: Tag-like selections, filter pills
|
||||
|
||||
**Overlay Semi-transparent**
|
||||
- Background: `rgba(45, 45, 46, 0.5)`
|
||||
- Text: `#fffefb`
|
||||
- Radius: 20px
|
||||
- Hover: background becomes fully opaque `#2d2d2e`
|
||||
- Use: Video play buttons, floating actions
|
||||
|
||||
**Tab / Navigation (Inset Shadow)**
|
||||
- Background: transparent
|
||||
- Text: `#201515`
|
||||
- Padding: 12px 16px
|
||||
- Shadow: `rgb(255, 79, 0) 0px -4px 0px 0px inset` (active orange underline)
|
||||
- Hover shadow: `rgb(197, 192, 177) 0px -4px 0px 0px inset` (sand underline)
|
||||
- Use: Horizontal tab navigation
|
||||
**`button-text`** — text-only CTA used inside cards / nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, body in `{typography.button-sm}`, padding `{spacing.sm} {spacing.lg}`, shape `{rounded.md}`.
|
||||
|
||||
### Cards & Containers
|
||||
- Background: `#fffefb`
|
||||
- Border: `1px solid #c5c0b1` (warm sand border)
|
||||
- Radius: 5px (standard), 8px (featured)
|
||||
- No shadow elevation by default -- borders define containment
|
||||
- Hover: subtle border color intensification
|
||||
|
||||
**`card-content`** — the default cream content card.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`card-feature-cream`** — the cream feature card.
|
||||
- Same chrome as `card-content`. Hosts headline + body + illustration.
|
||||
|
||||
**`card-feature-dark`** — the polarity-flipped dark coffee card.
|
||||
- Background `{colors.ink}`, text `{colors.on-primary}`, padding `{spacing.xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`pricing-card`** — the default pricing tier card.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, padding `{spacing.xl}`, shape `{rounded.md}`.
|
||||
|
||||
**`pricing-card-featured`** — the polarity-flipped featured pricing tier.
|
||||
- Background `{colors.ink}`, text `{colors.on-primary}`, same shape / padding.
|
||||
|
||||
### Inputs & Forms
|
||||
- Background: `#fffefb`
|
||||
- Text: `#201515`
|
||||
- Border: `1px solid #c5c0b1`
|
||||
- Radius: 5px
|
||||
- Focus: border color shifts to `#ff4f00` (orange)
|
||||
- Placeholder: `#939084`
|
||||
|
||||
**`text-input`** — the canonical text input.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, body in `{typography.body-md}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 6 px.
|
||||
|
||||
### Navigation
|
||||
- Clean horizontal nav on cream background
|
||||
- Zapier logotype left-aligned, 104x28px
|
||||
- Links: Inter 16px weight 500, `#201515` text
|
||||
- CTA: Orange button ("Start free with email")
|
||||
- Tab navigation uses inset box-shadow underline technique
|
||||
- Mobile: hamburger collapse
|
||||
|
||||
### Image Treatment
|
||||
- Product screenshots with `1px solid #c5c0b1` border
|
||||
- Rounded corners: 5-8px
|
||||
- Dashboard/workflow screenshots prominent in feature sections
|
||||
- Light gradient backgrounds behind hero content
|
||||
**`nav-bar`** — the sticky top nav.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.md} {spacing.xl}`.
|
||||
|
||||
### Distinctive Components
|
||||
**`nav-link`** — link items inside nav.
|
||||
- Text `{colors.ink}`, set in `{typography.body-sm}`.
|
||||
|
||||
**Workflow Integration Cards**
|
||||
- Display connected app icons in pairs
|
||||
- Arrow or connection indicator between apps
|
||||
- Sand border containment
|
||||
- Inter weight 500 for app names
|
||||
**`footer`** — the dark coffee footer.
|
||||
- Background `{colors.ink}`, text `{colors.canvas-soft}`, padding `{spacing.3xl} {spacing.xl}`. Body in `{typography.body-sm}`.
|
||||
|
||||
**Stat Counter**
|
||||
- Large display number using Inter 48px weight 500
|
||||
- Muted description below in `#36342e`
|
||||
- Used for social proof metrics
|
||||
### Signature Components
|
||||
|
||||
**Social Proof Icons**
|
||||
- Circular icon buttons: 14px radius
|
||||
- Sand border: `1px solid #c5c0b1`
|
||||
- Used for social media follow links in footer
|
||||
**`hero-band`** — the cream hero band.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.4xl} {spacing.xl}`. Headline in `{typography.display-xl}` (Degular Display 56 px / 500).
|
||||
|
||||
## 5. Layout Principles
|
||||
**`hero-band-dark`** — the polarity-flipped dark coffee hero.
|
||||
- Background `{colors.ink}`, text `{colors.on-primary}`, same scale.
|
||||
|
||||
### Spacing System
|
||||
- Base unit: 8px
|
||||
- Scale: 1px, 4px, 6px, 8px, 10px, 12px, 16px, 20px, 24px, 32px, 40px, 48px, 56px, 64px, 72px
|
||||
- CTA buttons use generous padding: 20px 24px for large, 8px 16px for standard
|
||||
- Section padding: 64px-80px vertical
|
||||
**`content-band-cream`** — the cream content band that follows hero.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, padding `{spacing.4xl} {spacing.xl}`. Section headline in `{typography.display-lg}`.
|
||||
|
||||
### Grid & Container
|
||||
- Max content width: approximately 1200px
|
||||
- Hero: centered single-column with large top padding
|
||||
- Feature sections: 2-3 column grids for integration cards
|
||||
- Full-width sand-bordered dividers between sections
|
||||
- Footer: multi-column dark background (`#201515`)
|
||||
**`content-band-light`** — the white content band.
|
||||
- Background `{colors.canvas}`, text `{colors.ink}`, same padding / scale.
|
||||
|
||||
### Whitespace Philosophy
|
||||
- **Warm breathing room**: Generous vertical spacing between sections (64px-80px), but content areas are relatively dense -- Zapier packs information efficiently within its cream canvas.
|
||||
- **Architectural compression**: Degular Display headlines at 0.90 line-height compress vertically, contrasting with the open spacing around them.
|
||||
- **Section rhythm**: Cream background throughout, with sections separated by sand-colored borders rather than background color changes.
|
||||
**`eyebrow-uppercase`** — the small UPPERCASE Degular eyebrow above section headlines.
|
||||
- Text `{colors.ink}`, set in `{typography.eyebrow-uppercase}` (14 px / 500 / `1 px` tracking).
|
||||
|
||||
### Border Radius Scale
|
||||
- Tight (3px): Small inline spans
|
||||
- Standard (4px): Buttons (orange CTA), tags, small elements
|
||||
- Content (5px): Cards, links, general containers
|
||||
- Comfortable (8px): Featured cards, large buttons, tabs
|
||||
- Social (14px): Social icon buttons, pill-like elements
|
||||
- Pill (20px): Play buttons, large pill buttons, floating actions
|
||||
**`badge-pill`** — the inline pill for metadata / tag.
|
||||
- Background `{colors.canvas-soft}`, text `{colors.ink}`, body in `{typography.body-sm}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill}`.
|
||||
|
||||
## 6. Depth & Elevation
|
||||
### Examples (illustrative)
|
||||
|
||||
| Level | Treatment | Use |
|
||||
|-------|-----------|-----|
|
||||
| Flat (Level 0) | No shadow | Page background, text blocks |
|
||||
| Bordered (Level 1) | `1px solid #c5c0b1` | Standard cards, containers, inputs |
|
||||
| Strong Border (Level 1b) | `1px solid #36342e` | Dark dividers, emphasized sections |
|
||||
| Active Tab (Level 2) | `rgb(255, 79, 0) 0px -4px 0px 0px inset` | Active tab underline (orange) |
|
||||
| Hover Tab (Level 2b) | `rgb(197, 192, 177) 0px -4px 0px 0px inset` | Hover tab underline (sand) |
|
||||
| Focus (Accessibility) | `1px solid #ff4f00` outline | Focus ring on interactive elements |
|
||||
> Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
|
||||
|
||||
**Shadow Philosophy**: Zapier deliberately avoids traditional shadow-based elevation. Structure is defined almost entirely through borders -- warm sand (`#c5c0b1`) borders for standard containment, dark charcoal (`#36342e`) borders for emphasis. The only shadow-like technique is the inset box-shadow used for tab underlines, where a `0px -4px 0px 0px inset` shadow creates a bottom-bar indicator. This border-first approach keeps the design grounded and tangible rather than floating.
|
||||
**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
|
||||
- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
|
||||
|
||||
### Decorative Depth
|
||||
- Orange inset underline on active tabs creates visual "weight" at the bottom of elements
|
||||
- Sand hover underlines provide preview states without layout shifts
|
||||
- No background gradients in main content -- the cream canvas is consistent
|
||||
- Footer uses full dark background (`#201515`) for contrast reversal
|
||||
**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
|
||||
- Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
|
||||
|
||||
## 7. Do's and Don'ts
|
||||
**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
|
||||
|
||||
**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
|
||||
- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
|
||||
|
||||
**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
|
||||
- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
|
||||
|
||||
**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`
|
||||
|
||||
**`ex-empty-state-card`** — Empty-state illustration frame.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
|
||||
|
||||
**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
|
||||
- Properties: `backgroundColor`, `rounded`, `padding`, `typography`
|
||||
|
||||
|
||||
## Do's and Don'ts
|
||||
|
||||
### Do
|
||||
- Use Degular Display exclusively for hero-scale headlines (40px+) with 0.90 line-height for compressed impact
|
||||
- Use Inter for all functional UI -- navigation, body text, buttons, labels
|
||||
- Apply warm cream (`#fffefb`) as the background, never pure white
|
||||
- Use `#201515` for text, never pure black -- the reddish warmth matters
|
||||
- Keep Zapier Orange (`#ff4f00`) reserved for primary CTAs and active state indicators
|
||||
- Use sand (`#c5c0b1`) borders as the primary structural element instead of shadows
|
||||
- Apply generous button padding (20px 24px) for large CTAs to match Zapier's spacious button style
|
||||
- Use inset box-shadow underlines for tab navigation rather than border-bottom
|
||||
- Apply uppercase with 0.5px letter-spacing for section labels and micro-categorization
|
||||
- Reserve `{colors.primary}` Zapier orange for every primary CTA. The saturated orange IS the conversion signature.
|
||||
- Keep canvas WARM — `{colors.canvas}` `#fffefb` cream, not pure white. The temperature is the brand voice.
|
||||
- Set hero headlines in `{typography.display-xl}` Degular Display weight 500. Sentence-case, no uppercase.
|
||||
- Pair Degular Display (hero, eyebrow) with Inter (everything else). Two faces, two roles.
|
||||
- Use `{rounded.md}` 12 px for buttons + cards. The middle radius is the brand's signature.
|
||||
- Pair orange CTA with ink-dark text on cream backgrounds — the three-token rhythm is the brand's whole conversion story.
|
||||
|
||||
### Don't
|
||||
- Don't use Degular Display for body text or UI elements -- it's display-only
|
||||
- Don't use pure white (`#ffffff`) or pure black (`#000000`) -- Zapier's palette is warm-shifted
|
||||
- Don't apply box-shadow elevation to cards -- use borders instead
|
||||
- Don't scatter Zapier Orange across the UI -- it's reserved for CTAs and active states
|
||||
- Don't use tight padding on large CTA buttons -- Zapier's buttons are deliberately spacious
|
||||
- Don't ignore the warm neutral system -- borders should be `#c5c0b1`, not gray
|
||||
- Don't use GT Alpina for functional UI -- it's an editorial accent at thin weights only
|
||||
- Don't apply positive letter-spacing to GT Alpina -- it uses aggressive negative tracking (-1.6px to -1.92px)
|
||||
- Don't use rounded pill shapes (9999px) for primary buttons -- pills are for tags and social icons
|
||||
|
||||
## 8. Responsive Behavior
|
||||
|
||||
### Breakpoints
|
||||
| Name | Width | Key Changes |
|
||||
|------|-------|-------------|
|
||||
| Mobile Small | <450px | Tight single column, reduced hero text |
|
||||
| Mobile | 450-600px | Standard mobile, stacked layout |
|
||||
| Mobile Large | 600-640px | Slight horizontal breathing room |
|
||||
| Tablet Small | 640-680px | 2-column grids begin |
|
||||
| Tablet | 680-768px | Card grids expand |
|
||||
| Tablet Large | 768-991px | Full card grids, expanded padding |
|
||||
| Desktop Small | 991-1024px | Desktop layout initiates |
|
||||
| Desktop | 1024-1280px | Full layout, maximum content width |
|
||||
| Large Desktop | >1280px | Centered with generous margins |
|
||||
|
||||
### Touch Targets
|
||||
- Large CTA buttons: 20px 24px padding (comfortable 60px+ height)
|
||||
- Standard buttons: 8px 16px padding
|
||||
- Navigation links: 16px weight 500 with adequate spacing
|
||||
- Social icons: 14px radius circular buttons
|
||||
- Tab items: 12px 16px padding
|
||||
|
||||
### Collapsing Strategy
|
||||
- Hero: Degular 80px display scales to 40-56px on smaller screens
|
||||
- Navigation: horizontal links + CTA collapse to hamburger menu
|
||||
- Feature cards: 3-column grid to 2-column to single-column stacked
|
||||
- Integration workflow illustrations: maintain aspect ratio, may simplify
|
||||
- Footer: multi-column dark section collapses to stacked
|
||||
- Section spacing: 64-80px reduces to 40-48px on mobile
|
||||
|
||||
### Image Behavior
|
||||
- Product screenshots maintain sand border treatment at all sizes
|
||||
- Integration app icons maintain fixed sizes within responsive containers
|
||||
- Hero illustrations scale proportionally
|
||||
- Full-width sections maintain edge-to-edge treatment
|
||||
|
||||
## 9. Agent Prompt Guide
|
||||
|
||||
### Quick Color Reference
|
||||
- Primary CTA: Zapier Orange (`#ff4f00`)
|
||||
- Background: Cream White (`#fffefb`)
|
||||
- Heading text: Zapier Black (`#201515`)
|
||||
- Body text: Dark Charcoal (`#36342e`)
|
||||
- Border: Sand (`#c5c0b1`)
|
||||
- Secondary surface: Light Sand (`#eceae3`)
|
||||
- Muted text: Warm Gray (`#939084`)
|
||||
|
||||
### Example Component Prompts
|
||||
- "Create a hero section on cream background (`#fffefb`). Headline at 56px Degular Display weight 500, line-height 0.90, color `#201515`. Subtitle at 20px Inter weight 400, line-height 1.20, color `#36342e`. Orange CTA button (`#ff4f00`, 4px radius, 8px 16px padding, white text) and dark button (`#201515`, 8px radius, 20px 24px padding, white text)."
|
||||
- "Design a card: cream background (`#fffefb`), `1px solid #c5c0b1` border, 5px radius. Title at 24px Inter weight 600, letter-spacing -0.48px, `#201515`. Body at 16px weight 400, `#36342e`. No box-shadow."
|
||||
- "Build a tab navigation: transparent background. Inter 16px weight 500, `#201515` text. Active tab: `box-shadow: rgb(255, 79, 0) 0px -4px 0px 0px inset`. Hover: `box-shadow: rgb(197, 192, 177) 0px -4px 0px 0px inset`. Padding 12px 16px."
|
||||
- "Create navigation: cream sticky header (`#fffefb`). Inter 16px weight 500 for links, `#201515` text. Orange pill CTA 'Start free with email' right-aligned (`#ff4f00`, 4px radius, 8px 16px padding)."
|
||||
- "Design a footer with dark background (`#201515`). Text `#fffefb`. Links in `#c5c0b1` with hover to `#fffefb`. Multi-column layout. Social icons as 14px-radius circles with sand borders."
|
||||
|
||||
### Iteration Guide
|
||||
1. Always use warm cream (`#fffefb`) background, never pure white -- the warmth defines Zapier
|
||||
2. Borders (`1px solid #c5c0b1`) are the structural backbone -- avoid shadow elevation
|
||||
3. Zapier Orange (`#ff4f00`) is the only accent color; everything else is warm neutrals
|
||||
4. Three fonts, strict roles: Degular Display (hero), Inter (UI), GT Alpina (editorial)
|
||||
5. Large CTA buttons need generous padding (20px 24px) -- Zapier buttons feel spacious
|
||||
6. Tab navigation uses inset box-shadow underlines, not border-bottom
|
||||
7. Text is always warm: `#201515` for dark, `#36342e` for body, `#939084` for muted
|
||||
8. Uppercase labels at 12-14px with 0.5px letter-spacing for section categorization
|
||||
- Don't replace cream canvas with pure white. The warmth is the brand.
|
||||
- Don't use pure black ink. The coffee-warmth in `#201515` carries through every text color.
|
||||
- Don't render CTAs as pills. The brand's button is 12 px rounded rectangle.
|
||||
- Don't introduce a second chromatic accent. Orange + cream + coffee is the entire palette.
|
||||
- Don't substitute Degular Display with a cool geometric sans (e.g., generic Helvetica) — the brand's display face has warm proportions that the substitute doesn't capture.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user