update design.md v2
This commit is contained in:
+585
-244
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user