Espn

ESPN's iOS app is a live scoreboard that happens to also be a newsroom.

Back to all styles

A live page in this style is not built yet — the CSS variables and the prompt below are enough to reproduce it.

At a glance

16tokens
11type steps
1radius steps
8pxspacing base

Espn, in one page

ESPN's iOS app is a live scoreboard that happens to also be a newsroom. Everything in the design serves one goal: get the score in front of the user in under a second. The canvas is a near-black #0E0F11 (deliberately not pure black, so the scores ticker and game cards lift cleanly off it). The first thing on screen is a horizontally scrolling scores ticker — a strip of compact cards, one per game, each showing league, two team abbreviations with logos, scores in tabular numerals, and a status pill (LIVE Q3 / FINAL / 7:05 ET). Below it flows the SportsCenter feed: a mix of live game cards, breaking-news stories, highlights, and analysis. The app is dense, fast, and information-first — it is engineered for a fan glancing at it 30 times a day.

The single brand accent is ESPN Red (#D50A0A — with a brighter #CC0000 for emphatic CTAs and links). It is used with discipline: the ESPN logo block, the primary "Watch Live" / "Watch on ESPN+" call-to-action, the active bottom-tab indicator dot, story category tags ("BREAKING", "ANALYSIS"), and section accents. Red is never decoration — it means "ESPN brand", "watch this", or "this is hot". Live games get a hotter, brighter red (#FF1A1A) with a pulsing dot so a glance instantly separates in-progress from finished. Final scores dim the loser to gray; the winning team's score turns green (#1FAA59) so a result is legible without reading a single word.

The signature surfaces are the scores feed (ticker + game cards + SportsCenter stories) and the game detail screen (a big score header, team records, a live clock, drive/play info, and tabbed sections — Gamecast / Box Score / Plays / News). The defining components are the game card (league header, two team rows with logo + name + record + big tabular score, a footer with the clock and an ESPN+ watch link) and the live status badge (a pulsing-dot LIVE pill). No other sports app packs this much live state into a glanceable card.

Typography is a bold condensed-leaning sans — ESPN's brand face is a custom "ESPN" type; the closest free analog is Archivo (with its expanded weight range and slightly condensed feel). Hierarchy is built for scanning: enormous heavy headlines and scores, tight team names, small dense metadata. Weights concentrate at 400 (body/meta), 700 (team names, story titles), 800 (section headers), and 900 (headlines, screen titles, scores, status badges). Scores always use tabular (monospaced) numerals so digits stay column-aligned across every card — a non-negotiable for a scoreboard. On iOS, Archivo falls back to SF Pro (use SF Pro's .heavy/.black and a tabular numeral feature for scores).

Key Characteristics:

Do's and don'ts

Do

  • Use near-black (#0E0F11) as the canvas — NOT pure black; cards and the ticker must lift off it
  • Pin a horizontal scores ticker near the top — it's the fastest path to "what's the score"
  • Use ESPN Red (#D50A0A / bright #CC0000) as the only brand accent — logo, CTA, active-tab dot, tags
  • Use a hotter red (#FF1A1A) + a pulsing dot for LIVE games; dim finals to gray
  • Turn the winning team's score green (#1FAA59) on finished games — a result readable at a glance
  • Use tabular numerals on every score, clock, record, and ranking — columns must align
  • Build the game card with league header + two team rows (logo/name/record/score) + clock & ESPN+ footer
  • Use Archivo (or SF Pro .black) at heavy weights for headlines, scores, and badges
  • Mark the active tab with a small red dot — keep the icon white
  • Keep the layout dense and information-first — fans want maximum signal per glance

Don't

  • Don't use pure black (#000000) — ESPN's ground is near-black so cards have contrast
  • Don't introduce a second brand accent — red is it; live red and win green are *status*, not accents
  • Don't use proportional numerals for scores — digits will shift and the scoreboard breaks
  • Don't hide or bury the scores ticker — it is the product's spine
  • Don't use a tint pill for the active tab — ESPN uses a red dot under a white icon
  • Don't let metadata (league/time/read-length) use white — it's secondary gray #9AA0A6
  • Don't drop the live pulse — motion is how ESPN says "this is happening now"
  • Don't use heavy drop-shadows for structure — use surface-color steps; reserve shadow for floating UI
  • Don't dim the winning score — winners are white or green, never gray
  • Don't over-space the layout — ESPN's density is intentional; airy layouts feel un-ESPN
  • Don't animate aggressively elsewhere — only the pulse and the score-pop are lively; the rest is calm

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 Espn design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- ESPN Red: #d50a0a
- Red Bright: #cc0000
- Red Pressed: #a50808
- Near-Black Canvas: #0e0f11
- Surface 1: #18191b
- Surface 2: #212327
- Surface 3: #2b2d31
- Divider: #2a2c30
- Text Primary: #ffffff
- Text Secondary: #9aa0a6

Type:
- families: Archivo, Heavy Display, Numerals, Fallback Stack
- scale: 10, 11, 12, 13, 14, 15, 16, 18, 22
- weights: 400, 700, 800, 900

Shape:
- radius: 6

Spacing: 8, 12, 14, 16

Rules:
- Use near-black (`#0E0F11`) as the canvas — NOT pure black; cards and the ticker must lift off it
- Pin a horizontal scores ticker near the top — it's the fastest path to "what's the score"
- Use ESPN Red (`#D50A0A` / bright `#CC0000`) as the only brand accent — logo, CTA, active-tab dot, tags
- Use a hotter red (`#FF1A1A`) + a pulsing dot for LIVE games; dim finals to gray
- Turn the winning team's score green (`#1FAA59`) on finished games — a result readable at a glance
- Use tabular numerals on every score, clock, record, and ranking — columns must align

Avoid:
- Don't use pure black (`#000000`) — ESPN's ground is near-black so cards have contrast
- Don't introduce a second brand accent — red is it; live red and win green are *status*, not accents
- Don't use proportional numerals for scores — digits will shift and the scoreboard breaks
- Don't hide or bury the scores ticker — it is the product's spine
- Don't use a tint pill for the active tab — ESPN uses a red dot under a white icon
- Don't let metadata (league/time/read-length) use white — it's secondary gray `#9AA0A6`

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

The specification

Colour paletteRead the full spec

Primary (Interactive)

  • ESPN Red (#D50A0A): The core brand accent — logo block, active-tab indicator dot, section accents, primary surfaces of brand identity.
  • Red Bright (#CC0000): Emphatic CTAs and links — "Watch on ESPN+", story category tags, inline links.
  • Red Pressed (#A50808): Pressed state of the red CTA.

Canvas & Surfaces (Dark — the primary mode)

  • Near-Black Canvas (#0E0F11): Primary canvas — not pure black, so cards and the ticker lift.
  • Surface 1 (#18191B): Game-card body, story containers.
  • Surface 2 (#212327): Ticker chips, card headers, score rows, search field.
  • Surface 3 (#2B2D31): Pressed rows, "FINAL" badge fill, chips.
  • Divider (#2A2C30): Hairline dividers between team rows, stories, and sections.

ESPN's app is dark-first. A light theme exists in some surfaces but the scoreboard identity (near-black ground, red accent, green-winner) is defined in dark; this spec documents the dark system.

Text

  • Text Primary (#FFFFFF): Headlines, team names, scores, screen titles — pure white.
  • Text Secondary (#9AA0A6): Metadata (league · time · read-length), team records, losing-team scores, inactive tab labels.
  • Text Tertiary (#6B7075): Disabled actions, "FINAL" label text, very low-emphasis captions.

Brand & Status Accents

RoleColorUsage
ESPN Red#D50A0ALogo block, active-tab dot, section accents
Red Bright#CC0000"Watch on ESPN+" link, category tags, inline links
Live Red#FF1A1ALIVE badge fill + pulsing dot — in-progress games
Win Green#1FAA59The winning team's score on a finished game
Rank Gold#F2C200Top-25 / ranking numerals, "#1 seed" emphasis

Semantic

  • Error Red (#E5484D): Network/feed-failure banner, destructive confirm (distinct from brand red).
  • Success / Win (#1FAA59): Winning score, "Following" confirmation toast.
  • Live / Alert (#FF1A1A): Live games, breaking-alert banner pulse.
  • Pulse Dot: a small filled circle that animates opacity 1 → 0.4 → 1 over ~1.2s beside the LIVE label.
Type scaleRead the full spec

Font Family

  • Primary: ESPN's brand face is a proprietary condensed sans. The closest free analog is Archivo (by Omnibus-Type, SIL OFL) — a grotesque with a slightly condensed feel and a wide weight range (400–900), well-suited to dense sports UI.
  • Heavy Display: Archivo weight 900 (Black), occasionally italic — used for headlines, scores, and status badges; the energetic sports voice.
  • Numerals: Scores and clocks must use tabular (monospaced) figures — font-variant-numeric: tabular-nums / SF Pro's .monospacedDigit — so digits stay column-aligned.
  • Fallback Stack: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Archivo', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif
  • iOS Note: Without Archivo bundled, fall back to SF Pro .heavy/.black and apply .monospacedDigit() on all scores/clocks.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Screen TitleArchivo32pt9001.1-0.5pt"Scores", "Watch" large nav titles
HeadlineArchivo26pt9001.15-0.3ptLead-story headline
Section HeaderArchivo22pt8001.2-0.2pt"Top Headlines", "Today's Games"
Team NameArchivo18pt7001.20pt"Los Angeles Lakers" on the game card
BodyArchivo16pt4001.50ptArticle body, game summary
Story TitleArchivo15pt7001.30ptFeed story headline (compact)
Score (large)Archivo26pt9001.00ptGame-card team score — tabular
Score (ticker)Archivo13pt7001.00ptTicker team score — tabular
Meta LineArchivo14pt4001.40pt"NBA · 14m ago · 3 min read"
Team RecordArchivo12pt4001.30pt"48–34 · Home"
Button LabelArchivo16pt8001.00.3pt"Watch Live", "Follow Team"
Status BadgeArchivo11pt9001.00.5ptLIVE / FINAL / 7:05 ET (uppercase)
Category TagArchivo10pt9001.00.5pt"BREAKING", "ANALYSIS" (uppercase, red)
Tab LabelArchivo10pt7001.00.1ptBottom-tab labels

Principles

  • Tabular numerals everywhere there's a number: scores, clocks, records, rankings — non-negotiable for a scoreboard; digits never shift.
  • Scanning rhythm, not reading rhythm: enormous 900-weight headlines and scores, tight team names, dense meta — built for a 1-second glance.
  • Uppercase only for badges, category tags, and league labels — never for headlines or body.
  • Body and meta stay 400 — only headlines, team names, scores, and CTAs get weight.
  • Metadata is secondary gray (#9AA0A6) — league/time/read-length never compete with the headline or score.
  • Dynamic Type: headlines, body, meta scale; ticker scores, status badges, tab labels, the pulse dot stay FIXED (the ticker is a fixed-height strip).
Components and layoutRead the full spec

Buttons

Primary Button ("Watch Live")

  • Shape: Rounded rectangle, 6pt corner radius (ESPN runs tighter radii than most — sharp, sporty)
  • Background: #D50A0A (ESPN Red)
  • Text + leading play glyph: #FFFFFF, Archivo 16pt weight 800, 0.3pt tracking
  • Padding: 14pt vertical, 28pt horizontal (or full-width on detail screens)
  • Pressed: background #A50808 + scale 0.98
  • Disabled: background #212327, text #6B7075

Secondary / Outline Button ("Follow Team")

  • Background: transparent
  • Border: 1.5pt rgba(255,255,255,0.35)
  • Text: #FFFFFF, Archivo 14pt weight 700
  • Padding: 12pt vertical, 20pt horizontal
  • Corner radius: 6pt
  • Pressed: background rgba(255,255,255,0.06); once following, fills #D50A0A

Ghost Button ("Gamecast")

  • Background: #212327
  • Text: #FFFFFF, Archivo 14pt weight 700
  • Corner radius: 6pt
  • Padding: 12pt vertical, 20pt horizontal

Text Button ("Full box score")

  • Background: none
  • Text: #CC0000 (Red Bright), Archivo 14pt weight 800
  • No underline
  • Pressed: opacity 0.6

Game Card (the core atom)

The single most important ESPN component — a glanceable summary of one game.

  • Container: #18191B, 12pt corner radius, 1pt #2A2C30 border
  • Header: #212327 strip, league/series label (Archivo 11pt weight 800 #9AA0A6, uppercase, 0.5pt tracking) on the left; status on the right — LIVE pill (#FF1A1A + pulsing dot) / "FINAL" (gray) / start time
  • Team row (×2): team logo (30pt circle) + name (Archivo 18pt weight 700 #FFFFFF) + record (Archivo 12pt weight 400 #9AA0A6) on the left; big score (Archivo 26pt weight 900, tabular) on the right
  • Live/leading or winning team: score #FFFFFF (or #1FAA59 if the game is final and they won)
  • Trailing/losing team: score #9AA0A6 (dimmed)
  • 1pt #2A2C30 divider between the two team rows
  • Footer: #0E0F11-toned strip, top 1pt divider — live clock (Archivo 13pt weight 700 #FFFFFF, e.g. "Q3 · 4:12") on the left; "Watch on ESPN+" link (Archivo 12pt weight 800 #CC0000 + play glyph) on the right
  • Pressed: scale 0.98, 150ms ease-out → pushes the game detail screen

Scores Ticker (signature component)

  • A horizontally scrolling strip pinned near the top, ~fixed height, 1pt #2A2C30 bottom border
  • Each chip: #212327, 8pt corner radius, ~116pt wide, 8–10pt padding
  • Chip header: league (Archivo 10pt weight 800 #9AA0A6) + status (LIVE #FF1A1A pill / "FINAL" gray / start time)
  • Two team lines: abbreviation + 16pt logo dot on the left, score (Archivo 13pt weight 700, tabular) on the right
  • Winning/leading team line #FFFFFF; other line #9AA0A6
  • Tapping a chip opens the game detail screen
  • Horizontal scroll only; never wraps — the ticker is a one-line glance

SportsCenter Story Row

  • Container: full width, 14pt vertical padding, 1pt #2A2C30 bottom divider
  • Thumbnail: 96×72pt, 8pt corner radius (image or sport-tinted placeholder)
  • Category tag: Archivo 10pt weight 900 uppercase #CC0000, 0.5pt tracking — "BREAKING" / "ANALYSIS" / "HIGHLIGHT"
  • Title: Archivo 15pt weight 700 #FFFFFF, 4pt below tag, 2-line clamp
  • Meta: Archivo 12pt weight 400 #9AA0A6, 6pt below title — "NBA · 14m ago · 3 min read"
  • 12pt gap between thumbnail and text column

Navigation

Bottom Tab Bar

  • Height: 50pt + safe area (≈64pt total)
  • Background: rgba(14,15,17,0.96) with backdrop-filter: blur(20px) saturate(180%), 0.5pt top border #2A2C30
  • Tabs (5): Home, Scores, Watch, ESPN BET, More
  • Icon size: 22pt
  • Active: glyph + label #FFFFFF, plus a small #D50A0A indicator dot below the label
  • Inactive: glyph + label #6B7075
  • Labels: Archivo 10pt weight 700, always shown
  • The red dot (not a tint pill) is the active marker — ESPN keeps the icon white and uses red only as the indicator

Top Bar (Home / feed)

  • Height: 44pt + safe area
  • Background: #0E0F11
  • Leading: ESPN red logo block
  • Trailing: search glyph + alerts bell, 22pt, #FFFFFF
  • The scores ticker sits directly beneath the top bar (pinned above the scrolling feed)

Top Bar (game detail)

  • Compact: back chevron + matchup label + share + alert-toggle
  • Below: the big score header (team logos, names, big tabular scores, live clock) then a tabbed control (Gamecast / Box Score / Plays / News)

Input Fields

Search Field

  • Height: 44pt
  • Background: #212327
  • Corner radius: 6pt
  • Leading icon: magnifier 16pt #9AA0A6
  • Placeholder: "Search teams, players, news" Archivo 15pt weight 400 #6B7075
  • Text: #FFFFFF
  • Focus: 1.5pt #D50A0A border

Tabbed Control (game detail: Gamecast / Box Score / Plays / News)

  • A row of items, Archivo 14pt weight 800 — #9AA0A6 inactive, #FFFFFF active
  • Active indicator: 3pt #D50A0A underline beneath the active item, slides 200ms ease-out
  • Sits above a 1pt #2A2C30 divider

Distinctive Components

Live Status Badge

  • Pill, #FF1A1A fill, Archivo 11pt weight 900 uppercase #FFFFFF, 0.5pt tracking, 4×9pt padding, 3pt radius
  • Leading 6pt white pulsing dot (opacity 1 → 0.4 → 1 over ~1.2s)
  • Variants: LIVE (+ period, e.g. "LIVE Q3"), FINAL (#2B2D31 fill, #9AA0A6 text, no dot), start time (transparent + 1pt rgba(255,255,255,0.4) outline, white text)

Winning-Score Treatment

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375ptTicker chips ≈ 110pt; single-column feed; tab labels stay
iPhone 13/14/15390ptStandard layout; ticker chips ≈ 116pt
iPhone 15/16 Pro393ptDynamic Island accommodated by the top bar; ticker sits below it
iPhone 15/16 Pro Max430ptTicker chips ≈ 124pt; larger game cards
iPad (portrait)768pt2-column feed; game detail = score header + tabbed pane
iPad (landscape)1024pt+2–3 column feed; persistent ticker; multi-pane game detail

Dynamic Type

  • Scales: headlines, section headers, body, story titles, meta
  • Fixed: ticker scores + chips, status badges, tab labels, the pulse dot, the game-card score size (the card is a fixed-rhythm scoreboard)
  • Long headlines wrap to 2 lines; story titles clamp to 2 lines

Orientation

  • Portrait-primary for the feed; the video player (Watch / ESPN+) is landscape full-screen
  • iPad supports landscape with a wider multi-column feed and a persistent ticker

Touch Targets

  • Primary CTA: 48pt+ tall
  • Tab icons: 22pt glyph, 49pt+ hit area
  • Ticker chip: full-chip tap, ≥56pt tall
  • Game card: full-card tap, ≥120pt tall
  • Story row: full-row tap, ≥72pt tall

Safe Area Handling

  • Top: top bar + pinned ticker respect the safe area and the Dynamic Island
  • Bottom: bottom tab bar + home indicator respected; the persistent watch mini-bar (if playing) sits above the tab bar
  • The ticker is pinned (not under the status bar) — it stays glanceable while the feed scrolls beneath it
  • Sides: 16pt content inset; the ticker is full-bleed horizontal scroll

Drop-in CSS variables

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

body.theme-espn {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #555555;
  --heading-color: #555555;
  --link-color: #cc0000;
  --link-hover-color: #990000;
  --border-color: #e0e0e0;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(85,85,85,0.06);
  --card-hover-shadow: 0 6px 18px rgba(85,85,85,0.12);
  --header-bg: #555555;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #737373;
  --button-bg: #cc0000;
  --button-text-color: #ffffff;
  --button-hover-bg: #990000;
  --button-border: none;
  --button-border-radius: 6px;
  --button-secondary-bg: #f5f5f5;
  --button-secondary-text-color: #555555;
  --button-secondary-hover-bg: #ebebeb;
  --button-secondary-border: 1px solid #e0e0e0;
  --prompt-bg: #f7f7f7;
  --prompt-text-color: #555555;
  --base-font: var(--font-sans);
  --heading-font: var(--font-sans);
  --card-border-radius: 6px;
}

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/video/espn/DESIGN.md · 26.0 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.