Citymapper

Citymapper's iOS app is a transit nerd's instrument panel disguised as a friendly app.

Back to all styles

Preview

Every style on this site is applied to the same sample page — same headline, same three columns, same footer. Only the stylesheet changes, so every difference you see below belongs to Citymapper, not to the copy.

A live page, not a screenshot — the frame scrolls. Open full preview ↗

At a glance

22tokens
10type steps
2radius steps
6pxspacing base

Citymapper, in one page

Citymapper's iOS app is a transit nerd's instrument panel disguised as a friendly app. Its whole reason to exist is to answer "how do I get from here to there, right now, the smartest way?" — and the visual language is built around a single insight: every transport mode gets its own loud, consistent color, and a route is read as a colored strip. Open the app, type a destination, and you get a stack of route cards; each card shows a leg strip — a horizontal row of color-coded mode chips (a green walk pill → a blue tube badge → a red bus badge → a green walk pill) with little arrows between them. You don't read the words; you read the *colors and the ETA*. This mode-color system (walk green, bus red, tube/metro blue, rail purple, bike cyan, cab amber) is the brand. It is consistent across every city Citymapper supports, and it never changes between light and dark mode — a bus is always red.

The canvas is clean and near-neutral so the mode colors and the live map carry all the energy: white (#FFFFFF) in light, a deep blue-black (#0C0E14) in dark. Citymapper's own brand accent is an electric blue (#2B5BFF) used for the destination pin, primary links, the metro mode, and selected states. But the single most iconic control in the entire product is the GO button: a fat, friendly, rounded green (#00C281) pill with a play triangle and the word "GO", which launches GO trip mode — a live, step-by-step navigation experience that counts down to your next action ("Get off in 2 stops", "Walk 4 min to the platform", "Your bus is 1 min away") with big type, a progress line, and disruption alerts. The GO pill is shape- and color-locked: it looks the same on every screen, in every city, in every theme.

The structure is: an origin→destination card at the top (two dots — a gray "from" dot and a blue "to" dot — connected by a short line, exactly like a transit map), a list of route options ranked by Citymapper's blend of speed/cost/effort (tagged "Fastest", "Cheapest", "Easiest", "Rain-safe"), and the GO button. Tapping a route opens step-by-step, and starting it enters GO trip mode. Other signature surfaces: the departures board (a live list of next departures at a stop, each row a colored line badge + destination + minutes, with imminent departures in amber), the Nearby screen (stops around you with live arrivals), and disruption banners (orange) that surface line closures inline in route results.

Typography is a friendly geometric grotesque — Citymapper uses a custom face, well-approximated by Inter with heavy weights. The personality is *confident and chunky*: ETAs and the GO label are extra-bold (800–900), place names are semibold, supporting text is regular gray. It's playful but never cute at the expense of legibility — you have to read this while half-running for a train.

Key Characteristics:

Do's and don'ts

Do

  • Give every transport mode its loud, consistent color (walk green / bus red / tube blue / rail purple / bike cyan / cab amber) and keep it identical across themes
  • Render routes as a leg strip of colored mode chips with arrows — color first, words second
  • Keep the GO button a fat green (#00C281) pill, shape- and color-locked on every screen and theme
  • Use Citymapper Blue (#2B5BFF) for the brand accent / destination / metro; reserve green for GO
  • Show the O→D as a gray "from" dot + blue "to" dot joined by a transit-map line
  • Tag routes with *why* ("Fastest", "Cheapest", "Easiest", "Rain-safe")
  • Make the departures board live, with imminent (≤3 min) departures in orange
  • Use tabular figures for every ETA, minute, and countdown
  • Surface disruptions inline as orange banners in route results
  • Keep the canvas calm (white / deep blue-black #0C0E14) so mode colors and the map pop
  • Use chunky extra-bold type for ETAs and GO — readable while moving

Don't

  • Don't recolor modes per theme — a bus is always red, light or dark
  • Don't render a route as a plain text list — it must be the colored leg strip
  • Don't use green for anything except GO / live / on-time — green means "go"
  • Don't change the GO button's shape or color contextually — it is the brand control
  • Don't use pure black (#000000) for dark canvas — it's deep blue-black #0C0E14
  • Don't bury the GO button or crowd it — it always has clear space
  • Don't let real line colors get overridden by category color when the official line color is known (use the line's true color, fall back to mode color)
  • Don't animate countdowns abruptly — cross-fade the minute number (150ms)
  • Don't hide disruptions in a sub-screen — they belong inline, in orange, in the results
  • Don't thin out ETA type — it's the loudest thing on screen (800–900)
  • Don't add a second "primary" green action competing with GO

Copy this into your AI builder

Paste it as-is. Every value below was measured from the original site, not guessed.

Assembled from the measured tokens — the source document has no prompt block.

Build a page in the Citymapper design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- Citymapper Blue: #2b5bff
- Citymapper Blue Bright: #4d7bff
- Citymapper Blue Pressed: #1e45cc
- GO Green: #00c281
- Canvas White: #ffffff
- Surface Gray: #f4f5f8
- Surface Pressed: #e8eaf0
- Divider: #e3e5ec
- Dark Canvas: #0c0e14
- Dark Surface 1: #15171f

Type:
- families: Inter, Numerics, Grotesque
- scale: 10, 12, 13, 14, 15, 16, 18, 22, 26
- weights: 400, 600, 700, 800, 900

Shape:
- radius: 8, 12
- elevation: Shadow: `0 10px 22px -10px rgba(0,194,129,0.7)`

Spacing: 6, 11, 12, 13, 14

Rules:
- Give every transport mode its loud, consistent color (walk green / bus red / tube blue / rail purple / bike cyan / cab amber) and keep it identical across theme…
- Render routes as a leg strip of colored mode chips with arrows — color first, words second
- Keep the GO button a fat green (`#00C281`) pill, shape- and color-locked on every screen and theme
- Use Citymapper Blue (`#2B5BFF`) for the brand accent / destination / metro; reserve green for GO
- Show the O→D as a gray "from" dot + blue "to" dot joined by a transit-map line
- Tag routes with *why* ("Fastest", "Cheapest", "Easiest", "Rain-safe")

Avoid:
- Don't recolor modes per theme — a bus is always red, light or dark
- Don't render a route as a plain text list — it must be the colored leg strip
- Don't use green for anything except GO / live / on-time — green means "go"
- Don't change the GO button's shape or color contextually — it is the brand control
- Don't use pure black (`#000000`) for dark canvas — it's deep blue-black `#0C0E14`
- Don't bury the GO button or crowd it — it always has clear space

Keep every value literal. If a token is given, use that exact value.

The specification

Colour paletteRead the full spec

Primary (Interactive)

  • Citymapper Blue (#2B5BFF): The brand accent — destination pin, primary links, selected states, the "metro/tube" mode color, secondary CTAs.
  • Citymapper Blue Bright (#4D7BFF): Dark-mode link & active-tab variant for contrast on the dark canvas.
  • Citymapper Blue Pressed (#1E45CC): Pressed state of blue CTAs.
  • GO Green (#00C281): Reserved exclusively for the GO button and GO trip mode — never used for generic UI.

Transit Mode Colors (Theme-Invariant — the brand)

These define a route's readability and do not change between light and dark.

ModeColorTint (bg use)
Walk#00B894rgba(0,184,148,0.18)
Bus#E8453Crgba(232,69,60,0.18)
Tube / Metro / Subway#2B5BFFrgba(43,91,255,0.18)
Rail / Train / Overground#8E44D8rgba(142,68,216,0.18)
Bike / Scooter#00A8C5rgba(0,168,197,0.18)
Cab / Rideshare#FFB400rgba(255,180,0,0.18)
Ferry#0094C6rgba(0,148,198,0.18)

Real transit lines (e.g., London Victoria line navy, NYC A/C/E blue) override these defaults with the operator's official line color when known. The mode colors are the *fallback and category* color.

Canvas & Surfaces (Light Mode)

  • Canvas White (#FFFFFF): Primary light canvas.
  • Surface Gray (#F4F5F8): Route cards, grouped sections.
  • Surface Pressed (#E8EAF0): Pressed rows.
  • Divider (#E3E5EC): Hairlines between route legs and departure rows.

Canvas & Surfaces (Dark Mode)

  • Dark Canvas (#0C0E14): Primary dark canvas — a deep blue-black, NOT pure black.
  • Dark Surface 1 (#15171F): Route cards, elevated surfaces.
  • Dark Surface 2 (#1E212B): Departures board, hovered/selected cards.
  • Dark Divider (#282C38): Hairline dividers on dark.

Text

  • Text Primary Light (#10131A): ETAs, place names, titles — near-black.
  • Text Secondary Light (#5A6473): Metadata, "min" suffix, captions.
  • Text Tertiary Light (#8A93A3): Disabled, placeholder, leg arrows.
  • Text Primary Dark (#ECEEF3): Primary text on dark.
  • Text Secondary Dark (#98A0AE): Secondary on dark.
  • Text Tertiary Dark (#646C7A): Tertiary on dark.

Surface / Tint Map

RoleLight ModeDark Mode
Canvas#FFFFFF#0C0E14
Surface 1#F4F5F8#15171F
Surface 2#E8EAF0#1E212B
Divider#E3E5EC#282C38
Blue tint#2B5BFF14#2B5BFF29
GO Green tint#00C2811F#00C2812E

Semantic

  • Disruption Orange (#FF8A00): Line closures, severe delays — inline banners and the "minutes soon" departure state.
  • Live Green (#00C281): "Live" indicator dot, on-time confirmation (shares the GO green).
  • Delay Red (#E8453C): Cancelled/severely-delayed services (shares the bus red intentionally — "red = stop/problem").
  • Info Blue (#2B5BFF): Informational tips, "we updated this route".
Type scaleRead the full spec

Font Family

  • Primary: Citymapper's custom geometric grotesque (a chunky, friendly sans tuned for glanceable transit data).
  • iOS Fallback: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Inter', 'Helvetica Neue', sans-serif
  • Web/Catalog Substitute: Inter (weights 400–900) — closest free face matching the chunky grotesque feel.
  • Numerics: Tabular figures for ETAs, minutes, and the departures board so countdowns don't jitter.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
DisplayGrotesque32pt9001.1-0.5pt"Get me somewhere" / GO-mode primary instruction
ETA HeroGrotesque26pt8001.15-0.3ptRoute card "24 min", GO-mode countdown
SectionGrotesque22pt8001.2-0.2pt"Best routes", "Departures"
Row TitleGrotesque18pt7001.3-0.1ptLine name, step title
BodyGrotesque16pt4001.450ptStep descriptions, route notes
PlaceGrotesque15pt6001.30ptOrigin/destination, stop names
MetaGrotesque14pt4001.40pt"Updated 12s ago · live"
Mode BadgeGrotesque12pt8001.00.3ptLine/route number on a colored chip — uppercase
ETA SuffixGrotesque13pt6001.00ptThe "min" after a number
GO LabelGrotesque18pt9001.00.4ptThe word "GO" in the button — uppercase
ButtonGrotesque15pt8001.00ptSecondary buttons
TagGrotesque10pt8001.00.4pt"Fastest"/"Cheapest" pills — uppercase
Departure MinGrotesque16pt8001.00ptMinutes on the departures board, tabular
Tab LabelGrotesque10pt6001.00.1ptBottom tab labels

Principles

  • ETAs and GO are the loudest type (800–900): the number you act on dominates every screen.
  • Tabular figures for anything counting down: route ETAs, departure minutes, GO-mode countdowns.
  • Mode badges are uppercase, chunky, tracked: line numbers/names sit in colored chips at 12pt 800.
  • Confident, not cute: heavy weights, tight tracking on big type — readable while moving.
  • Dynamic Type first-class: display, ETA, body scale; mode badges, tab labels, the GO label stay fixed (chips are layout-sensitive).
Components and layoutRead the full spec

Buttons

GO Button (the icon of the app)

  • Shape: Full rounded pill, 28pt corner radius (≈ height/2), height 54pt
  • Background: #00C281 (GO Green) — never any other color
  • Content: a play triangle (filled) + the word "GO" in 18pt weight 900, color #003322 (dark green text for warmth) or white per contrast
  • Shadow: 0 10px 22px -10px rgba(0,194,129,0.7)
  • Pressed: scale 0.98 + brightness 0.95
  • Locked: identical shape, color, and label on every screen and in every theme — it is the brand control

Primary Button (Get directions / secondary CTA)

  • Background: #2B5BFF (Citymapper Blue)
  • Text: white, 15pt weight 800
  • Corner radius: 12pt; padding 13pt/24pt
  • Pressed: #1E45CC

Outline Button (Save place)

  • Background: transparent
  • Text & border: #2B5BFF light / #4D7BFF dark, 1.5pt border
  • Corner radius: 12pt; padding 11pt/18pt

Text Button (More routes)

  • Font: 14pt weight 700
  • Color: #2B5BFF / #4D7BFF dark
  • Pressed: 60% opacity

Cards & Containers

Origin→Destination Card

  • Background: #F4F5F8 / #15171F, 1pt divider border, 14pt corner radius, 12pt/14pt padding
  • Two rows: a 10pt gray dot ("from") and a 10pt blue dot ("to"), joined by a 2pt vertical divider segment between them — reads like a transit-map stop pair
  • Place text: 14–15pt weight 600

Route Option Card

  • Background: #F4F5F8 / #15171F, 1pt divider border, 16pt corner radius, 14pt/16pt padding, 12pt vertical gap between cards
  • "Best" route: border switches to GO Green #00C281
  • Head: ETA "24" 22pt 800 + "min" 13pt 600 secondary, with a right-aligned tag pill ("Fastest"/"Cheapest")
  • Leg strip: horizontal flex row of mode chips: each chip is a colored rounded-8pt pill with a 13pt white mode glyph + a short label/number (e.g., "4" for walk minutes, "Victoria" for a line); chips separated by a tertiary "›" arrow

Departures Board

  • Container: #1E212B / surface, 14pt radius, overflow: hidden
  • Row: 13pt/16pt padding, 1pt bottom divider (none last)
  • Leading: a 34×24 line badge (mode-colored, 12pt 900 white text — e.g., "VIC", "63", "NR")
  • Middle: destination 14pt weight 600
  • Trailing: minutes 16pt weight 800 — GO Green normally, Disruption Orange when ≤ 3 min ("leave now")

Mode Chip / Badge

  • Rounded 8–10pt pill, mode color background, white text 12pt 800 uppercase, optional 13pt glyph
  • The atomic unit of every route view

Navigation

Top (Origin→Destination)

  • The O→D card *is* the top region on the route screen — no separate nav bar; back chevron floats top-left when drilled in

Bottom Tab Bar

  • Height: 64pt + safe area
  • Background: #FFFFFF / rgba(12,14,20,0.94) with backdrop-filter: blur(20px), 0.5pt top divider
  • Tabs (4): Get me / Nearby / Saved / You
  • Icon: 22pt; active #2B5BFF light / #4D7BFF dark (filled), inactive tertiary gray
  • Label: 10pt weight 600, always shown
  • No pill indicator — color + icon-fill change only

GO Trip Mode (full-screen takeover)

  • Replaces normal chrome: a big current-instruction header (ETA Hero / Display weight), a vertical progress line with mode-colored segments and stop dots, a "next action" card, and a persistent disruption strip if relevant
  • A floating "End" / minimize control; the GO green theme dominates

Input Fields

Destination Search

  • Height: 48pt
  • Background: #F4F5F8 / #1E212B
  • Corner radius: 12pt
  • Leading 18pt search glyph (tertiary)
  • Placeholder: "Where to?" 15pt 400 tertiary
  • Focus: 2pt #2B5BFF border

Origin Field (inline in O→D card)

  • Borderless row in the O→D card; tap to edit, opens the same search sheet

Distinctive Components

Leg Strip

  • The signature route visualization — a horizontal sequence of mode chips + arrows
  • Reads in <1s: color = mode, number = line/duration
  • Never render a route as plain text — always the colored strip

GO Trip Mode Countdown

  • Big "Get off in 2 stops" / "Bus in 1 min" instruction (ETA Hero/Display weight)
  • A live vertical progress line; the current leg's segment animates/pulses in its mode color
  • Haptic + voice cues at each step transition

Departures Board

  • Live, auto-refreshing; minutes tick down; imminent (≤3 min) turn orange
  • "Live" green dot + "updated Ns ago" caption

Route Tag Pill

  • Tiny uppercase pill on a route card: "Fastest" (GO-green tint), "Cheapest" (blue tint), "Easiest", "Rain-safe" (a cloud glyph), "Step-free"
  • Communicates *why* you'd pick this route

Disruption Banner

  • Inline orange (#FF8A00) strip in route results: "⚠ Victoria line: minor delays"
  • Tap to expand details; severe closures use Delay Red #E8453C

Nearby Stops List

  • Each entry: stop name + a row of mode badges with the soonest arrival per line
  • The "I just want to see what's around me" surface

Spacing System

  • Base unit: 4pt
  • Scale: 4, 6, 8, 12, 16, 18, 24, 32, 40, 54
  • Page horizontal inset: 16pt
  • Card internal padding: 14–16pt
  • Route-card vertical gap: 12pt
  • Leg-strip chip gap: 6pt

Grid & Container

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375ptLeg-strip labels abbreviate sooner; 3 route cards visible
iPhone 13/14/15390ptStandard layout
iPhone 15/16 Pro393ptDynamic Island accommodated above the map / O→D card
iPhone 15/16 Pro Max430ptLarger map peek; leg strips show fuller line names
iPad (portrait)768ptTwo-pane: route list (≤420pt) + live map
iPad (landscape)1024pt+Same two-pane wider; GO trip mode full-screen with side step list

Dynamic Type

  • Display, ETA hero, body, place: full scale
  • Mode badges, route tag pills, the GO label, departure-min, tab labels: FIXED (chips are layout-sensitive)
  • GO-mode instruction scales up generously (you read it from a pocket-glance distance)

Orientation

  • All screens rotate
  • iPad landscape locks the two-pane split; GO mode rotates with a side-by-side step list + map
  • The leg strip wraps rather than truncating mode color

Touch Targets

  • GO button: 54pt tall pill, full width of its inset
  • Route card: full-card tap, ≥ 72pt tall
  • Mode chip (when tappable): ≥ 44pt hit even if visually ~28pt
  • Departures row: full-row tap, ≥ 50pt
  • Tab bar icons: 22pt glyph, 44pt hit

Safe Area Handling

  • Top: O→D card / map respects safe area + Dynamic Island
  • Bottom: tab bar + home indicator respected; the route sheet's peek height sits above the home indicator; the GO button floats above safe area
  • Keyboard: destination search sheet rises above the keyboard
  • Sides: 16pt content inset

Drop-in CSS variables

The same values as a theme block. Add the class to <body> and the site repaints.

body.theme-citymapper {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #0c0e14;
  --heading-color: #0c0e14;
  --link-color: #2b5bff;
  --link-hover-color: #0038f7;
  --border-color: #d3d4d5;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(12,14,20,0.06);
  --card-hover-shadow: 0 6px 18px rgba(12,14,20,0.12);
  --header-bg: #0c0e14;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #616266;
  --button-bg: #2b5bff;
  --button-text-color: #ffffff;
  --button-hover-bg: #0038f7;
  --button-border: none;
  --button-border-radius: 12px;
  --button-secondary-bg: #f0f1f1;
  --button-secondary-text-color: #0c0e14;
  --button-secondary-hover-bg: #e2e2e3;
  --button-secondary-border: 1px solid #d3d4d5;
  --prompt-bg: #f3f3f3;
  --prompt-text-color: #0c0e14;
  --base-font: var(--font-inter);
  --heading-font: var(--font-helvetica);
  --card-border-radius: 12px;
}

Download theme.css

Visually close to

Measured with a deterministic colour + geometry comparison across 958 styles. Not a hand-picked list.

Where this came from

Source document
ios/design-md/travel/citymapper/DESIGN.md · 25.7 KB
Repository
Meliwat/awesome-ios-design-md
Licence
MIT

Source text is reproduced under its original licence. Tokens, similarity scores and page structure are ours.