MLB Brand Design System Deep Dive
1. Brand Overview
Major League Baseball (MLB) operates in a visual space that's instantly recognizable — high-contrast, bold, and patriotic without slipping into cliché. The official MLB site feels like a sports hub first and a brand exercise second. It’s designed for speed, clarity, and delivering insane amounts of information without overwhelming the user.
The vibe: functional Americana. Blue and white are the DNA here, with occasional pops of red, green, and yellow for functional states. Typography leans into sans-serif families, both custom (“mlb-primary”) and workhorses like Proxima Nova and Helvetica Neue. The font choice isn't ornamental—it’s about instant readability across tables, stats, and mobile scoreboards.
Design philosophy? Utility first. You see that in the spacing scale (strict 8px grid with 1px increments for micro-control) and a clear component hierarchy (buttons, tabs, and badges have consistent rules, no random radius values popping up without reason). This site is for fans in a hurry: loading scores, reading stats, maybe buying tickets. The design supports that momentum.
Compared to other sports leagues (NBA leans heavy on lifestyle imagery, NFL is almost militaristic in its typography), MLB lands squarely in data-driven minimalism. You won’t see gratuitous animations or tonal gradients as decoration — color is used sparingly and only with purpose: action states, navigation focus, or team identities.
And while the site is packed with functionality, certain aesthetic decisions show discipline: card shadows are subtle (rgba blacks under 0.25 opacity), border radii avoid extremes (2px, 3px, 8px, 12px — no random giant pills unless justified), and text colors maintain WCAG-friendly contrast against white and dark backgrounds.
If you’re a designer or developer reverse-engineering this system, expect a lot of tokenized discipline. Everything is a variable, from blue shades (#000c57 to #2c7df8) to green levels for positive states. Odd choice: this is one of the rare design systems where purple gets a full ramp (#e7e0fa to #210b3e) without being a primary brand driver—probably internal tooling or special campaign use.
2. Color System
2.1 Primary Colors
Primary interaction blue: #0048c7 (“--mlb-2-1-0-color-blue-blue700”). It’s saturated and deep, perfect for CTAs and nav highlights. This shade is calmer than typical neon sports blues — it feels trustworthy and official. In CTAs, it holds up against white text with excellent accessibility. There’s also a darker navy (#000c57) for headers and emphasis, and brighter blues (#2c7df8, #5298ff) for hover states and accents.
Psychologically, MLB’s blue family signals stability and tradition. Compare this to NBA’s brighter electric blue which feels high-energy; MLB’s choice is more about authority.
White (#ffffff) dominates the interface, forming the base canvas. Secondary is transparent (rgba(0, 0, 0, 0)), used for overlays or untouched backgrounds.
2.2 Complete Palette
| Color Name | Hex | Role | Usage |
|---|---|---|---|
| Primary Blue 1000 | #000c57 | Deep navy | Headlines, backgrounds |
| Primary Blue 900 | #001d80 | Navy | Large scale CTAs |
| Primary Blue 800 | #0031a6 | Dark blue | Secondary CTAs, tabs |
| Primary Blue 700 | #0048c7 | Main CTA blue | Buttons, active links |
| Primary Blue 600 | #0062e3 | Mid blue | Hover/focus CTA |
| Primary Blue 500 | #2c7df8 | Bright blue | Hover accents |
| Primary Blue 400 | #5298ff | Light bright | Links, icons |
| Primary Blue 300 | #7ab2ff | Pale bright | Background accents |
| Primary Blue 200 | #a4cdff | Soft sky | Charts, backgrounds |
| Primary Blue 100 | #d0e6ff | Very light | Fills, hover backgrounds |
| White | #ffffff | Base | Page background, text on dark |
| Neutral 1300 | #14191f | Dark UI elements | Nav, footer |
| Neutral 1200 | #232931 | Dark gray | Panels |
| Neutral 1100 | #333b44 | Gray | Body text on white |
| Neutral 1000 | #444d58 | Mid-gray | Secondary text |
| Neutral 900 | #57606c | Mid-tone | Dividers |
| Neutral 800 | #6a7480 | Medium-light gray | Backgrounds |
| Neutral 700 | #7f8994 | Gray | UI controls default |
| Neutral 600 | #959da8 | Light gray | Disabled text |
| Neutral 500 | #acb3bc | Light-medium gray | Inputs |
| Neutral 400 | #c3c8cf | Very light gray | Borders |
| Gray | #222222 | Near black | Text |
| Gray dark | #070a0d | Very dark | Backgrounds |
| Gray mid | #808080 | Gray | Text/icons |
| Gray UI mid Dark | #696969 | Dark gray | Headers |
| Gray UI light | #dddddd | Light gray | Background fill |
| Functional Green 1000 | #002500 | Deep green | Success emphasis |
| Functional Green 900 | #003c00 | Dark green | Success headers |
| Functional Green 800 | #005400 | Deep-mid green | Success contexts |
| Functional Green 700 | #006c00 | Mid green | Success CTAs |
| Functional Green 600 | #098314 | Bright green | Primary positive |
| Functional Green 500 | #399a39 | Green | Hover states for success |
| Functional Green 400 | #5eb15c | Light green | Background positive |
| Functional Green 300 | #84c681 | Softer green | Charts |
| Functional Green 200 | #acdaa9 | Light | Charts |
| Functional Green 100 | #d4edd3 | Very light | Background success |
| Functional Yellow 1000 | #370900 | Deep brown-yellow | Warnings/banners |
| Functional Yellow 900 | #541700 | Dark brown | Warnings |
| Functional Yellow 800 | #712800 | Deep | Alerts |
| Functional Yellow 700 | #8c3c00 | Brown-orange | Alerts |
| Functional Yellow 600 | #a65400 | Orange-brown | Hover states |
| Functional Yellow 500 | #bd6d00 | Orange | Warnings |
| Functional Yellow 400 | #d08929 | Orange-yellow | Alerts |
| Functional Yellow 300 | #e0a561 | Gold | Accents |
| Functional Yellow 200 | #edc394 | Light | Backgrounds |
| Functional Yellow 100 | #f7e0c8 | Very light | Background fills |
| Functional Red 1000 | #450000 | Deep red | Error emphasis |
| Functional Red 900 | #680000 | Dark red | Headers alerts |
| Functional Red 800 | #8a0000 | Deep red | Buttons alerts |
| Functional Red 700 | #aa0013 | Mid red | CTAs alerts |
| Functional Red 600 | #c61b2b | Bright red | Error primary |
| Functional Red 500 | #de4447 | Light bright red | Hover alerts |
| Functional Red 400 | #f16966 | Mid-light red | Backgrounds errors |
| Functional Red 300 | #fd8d87 | Light soft red | Charts |
| Functional Red 200 | #ffb3ad | Light | Background errors |
| Functional Red 100 | #ffd8d4 | Very light | Error subtle states |
| Purple 1000 | #210b3e | Deep purple | Special branding |
| Purple 900 | #361a5e | Dark purple | Panels/events |
| Purple 800 | #4b2b7d | Purple | Headers campaign |
| Purple 700 | #613f99 | Mid purple | CTAs campaign |
| Purple 600 | #7756b3 | Light-mid purple | Backgrounds |
| Purple 500 | #8d6fc9 | Purple | Accents |
| Purple 400 | #a38adb | Light purple | Charts |
| Purple 300 | #b9a5e9 | Light | Fills |
| Purple 200 | #d0c2f3 | Very light | Backgrounds |
| Purple 100 | #e7e0fa | Very light | Fills |
2.3 Color Relationships
Contrast is managed tightly: primary blue against white is AAA accessible. Text contrast against dark neutrals is high enough even for small caption text. Reds and yellows lean dark for text-bearing backgrounds — no washed-out tones that would fail WCAG.
Dark mode potential is embedded here: with navy and deep neutrals, you could flip whites to dark grays and maintain cohesion.
2.4 Usage Guide
- Action elements: Use blue ramp; #0048c7 for default, #2c7df8 for hover, #000c57 for pressed.
- Positive states: Use green ramp; #098314 for CTA, #399a39 for secondary actions.
- Warnings: Yellows stay on brown spectrum for contrast.
- Errors: Reds like #c61b2b for primary action, #de4447 for hovers.
- Avoid mixing purples with functional states — they’re reserved for special campaigns.
3. Typography
3.1 Font Families
Core: "mlb-primary" — custom font face. Fallbacks: Helvetica Neue, Helvetica, Arial. Secondary: "Proxima Nova" in headings and captions. "proxima-nova" appears with mlb-primary fallback for certain captions/links. No Google or Adobe hosted fonts; likely self-hosted.
3.2 Type Scale
| Element | Font | Size | Weight | Line Height |
|---|---|---|---|---|
| Heading-1 | mlb-primary | 30.1384px | 700 | 1.15 |
| Heading-1 | mlb-primary | 30px | 800 | 1.23 |
| Heading-1 | Proxima Nova | 28px | 700 | 1.20 |
| Heading-1 | mlb-primary | 23px | 700 | 1.20 |
| Heading-1 | mlb-primary | 22px | 700 | 1.27 |
| Button | mlb-primary | 22px | 700 | 1.27 |
| Heading-1 | mlb-primary | 21.92px | 600 | 1.20 |
| Heading-1 | mlb-primary | 19px | 500 | 1.26 |
| Heading-1 | Proxima Nova | 19px | 600 | 1.20 |
| Heading-1 | mlb-primary | 19px | 600 | 1.26 |
| Button | mlb-primary | 19px | 700 | 1.15 |
| Heading-1 | mlb-primary | 19px | 700 | 1.15 |
| Button | mlb-primary | 18px | 700 | 2.67 |
| Heading-1 | mlb-primary | 18px | 700 | 2.67 |
| Heading-1 | mlb-primary | 17px | 400 | 1.29 |
| Link | mlb-primary | 16px | 400 | 1.50 |
| Button | Helvetica Neue | 16px | 400 | 1.15 |
| Button | mlb-primary | 16px | 400 | 1.15 |
| Heading-1 | mlb-primary | 16px | 400 | 1.50 |
| Heading-1 | mlb-primary | 16px | 700 | 1.30 |
| Heading-1 | mlb-primary | 15px | 700 | 1.20 |
| Button | mlb-primary | 14.4px | 400 | 2.64 |
| Button | mlb-primary | 14.4px | 700 | 1.00 |
| Caption | proxima-nova | 14px | 700 | 1.43 |
| Link | proxima-nova | 14px | 500 | 1.07 |
| Link | proxima-nova | 14px | 700 | 1.07 |
| Caption | proxima-nova | 14px | 700 | 1.07 |
| Caption | proxima-nova | 14px | 500 | 1.07 |
| Button | proxima-nova | 14px | 700 | 1.15 |
| Link | proxima-nova | 14px | 500 | 1.07 |
| Caption | proxima-nova | 14px | 500 | 1.07 |
| Caption | Helvetica Neue | 14px | 400 | 1.50 |
| Link | mlb-primary | 14px | 700 | 1.50 |
| Caption | mlb-primary | 14px | 700 | 1.50 |
| Caption | mlb-primary | 14px | 400 | 1.50 |
| Link | Proxima Nova | 14px | 500 | 1.00 |
| Caption | Proxima Nova | 14px | 700 | 1.00 |
| Button | Proxima Nova | 14px | 500 | 1.00 |
| Caption | mlb-primary | 14px | 700 | 1.40 |
| Caption | mlb-primary | 14px | 600 | 1.40 |
| Caption | mlb-primary | 13.6px | 400 | - |
| Link | mlb-primary | 13.008px | 700 | 1.50 |
| Button | mlb-primary | 13.008px | 600 | 1.20 |
| Caption | mlb-primary | 13.008px | 400 | 1.50 |
| Link | mlb-primary | 13.008px | 400 | 1.50 |
| Button | mlb-primary | 13px | 700 | 1.15 |
| Caption | mlb-primary | 13px | 700 | 1.15 |
| Button | proxima-nova | 13px | 700 | 1.15 |
| Caption | proxima-nova | 13px | 700 | 1.15 |
| Caption | mlb-primary | 12.8px | 400 | 1.10 |
| Caption | mlb-primary | 12.2469px | 400 | 1.50 |
| Caption | proxima-nova | 12px | 700 | 1.25 |
| Button | mlb-primary | 12px | 700 | 1.15 |
| Caption | mlb-primary | 12px | 700 | 1.15 |
| Caption | mlb-primary | 12px | 700 | 1.50 |
| Link | mlb-primary | 12px | 400 | - |
| Caption | proxima-nova | 10px | 500 | 1.50 |
| Button | mlb-primary | 9px | 700 | 2.00 |
| Caption | mlb-primary | 9px | 700 | 2.00 |
3.3 Hierarchy
The smallest sizes (9px, 10px) are for badges and micro labels — bold weights maintain legibility. Large headings (30px) are rare, reserved for hero areas. UI buttons range from 12px to 22px depending on prominence. Line-heights vary strongly: tight 1.15 for dense UI, extended 2.x for special emphasis.
4. Spacing & Layout
4.1 Spacing Scale
Base grid: 8px scale with smaller increments down to 1px for fine alignments.
Common values:
- Micro: 1px (195 uses) for borders, fine adjustments.
- 2px, 3px, 4px — minimal gaps, icon padding.
- 6px (90 uses): button padding vertical.
- 8px (228 uses): main spacing unit for UI.
- 11px (212 uses): card gutters.
- 12px (322 uses): common padding for inputs and controls.
- 16px (241 uses): body text padding, card spacing.
- Larger: 20px, 32px as section gaps.
- Extreme: 581.984px (!) — likely hero/banner offset.
4.2 Layout
Breakpoints: mobile from 320px, scaling through 768px tablet, desktop beyond 1024px, with additional micro breakpoints (426px, 567px) — probably device-specific optimization.
5. Visual Elements
Border Radius
Values cluster:
- 0px for data tables and some flyouts.
- 2px — inputs/buttons.
- 3px — sliders/div.
- 8px — cards/groups (151 uses; primary radius).
- 12px — buttons.
- 21px — paragraphs (!).
- 50% — avatars/icons.
Shadows
Most used: rgba(0, 0, 0, 0.08) 0px 1px 3px. Subtle depth. Max observed: rgba(0,0,0,0.25) 0px 0px 14px — only for hover/focus on certain components.
6. Components
6.1 Buttons
We have five main variants extracted:
Primary (blue background)
Default:
- Background: #0048c7
- Color: #ffffff
- Padding: 1px 10px
- Radius: 5px
Hover: #1eaddb with opacity 0.9.
Active: #080808.
Focus: outline black solid 2px, border black solid 1px.
Circular icon button (semi-transparent background)
Default:
- Background: rgba(255,255,255,0.3), radius: 50%.
Hover: #1eaddb, shadow rgba black 0.24 at 4px 9px.
Focus: same as primary.
Gray pill button
Default:
- Background: #666666, radius: 12px.
Hover/focus as above.
Cookie setting link
Default: white background, text blue (#057aff).
Hover: #1eaddb.
Focus: follows primary.
Secondary solid blue button
Default: #4076c7 background, border same color.
6.2 Links
Variants:
- Default gray (#333333), hover blue (#1883fd).
- Default blue (#0048c7), hover lighter blue.
- White text links for dark backgrounds.
- Underlined blue (#057aff) — becomes non-underlined hover.
No random underline toggles: consistent hover removes underline except special link.
6.3 Forms
No text inputs in snapshot — likely styled with neutral 400/500 borders.
7. Design Tokens
:root {
/* Colors */
--color-primary-blue-1000: #000c57;
--color-primary-blue-900: #001d80;
--color-primary-blue-800: #0031a6;
--color-primary-blue-700: #0048c7;
--color-primary-blue-600: #0062e3;
--color-primary-blue-500: #2c7df8;
--color-primary-blue-400: #5298ff;
--color-primary-blue-300: #7ab2ff;
--color-primary-blue-200: #a4cdff;
--color-primary-blue-100: #d0e6ff;
--color-white: #ffffff;
--color-neutral-1300: #14191f;
--color-neutral-1200: #232931;
--color-neutral-1100: #333b44;
--color-neutral-1000: #444d58;
--color-neutral-900: #57606c;
--color-neutral-800: #6a7480;
--color-neutral-700: #7f8994;
--color-neutral-600: #959da8;
--color-neutral-500: #acb3bc;
--color-neutral-400: #c3c8cf;
--color-gray-dark: #222222;
--color-gray-darker: #070a0d;
--color-gray-mid: #808080;
--color-gray-ui-dark: #696969;
--color-gray-light: #dddddd;
--color-green-1000: #002500;
/* ... continue for all greens, yellows, reds, purples */
/* Spacing */
--space-1: 1px;
--space-2: 2px;
--space-3: 3px;
--space-4: 4px;
--space-6: 6px;
--space-8: 8px;
--space-11: 11px;
--space-12: 12px;
--space-16: 16px;
--space-20: 20px;
--space-32: 32px;
/* Radius */
--radius-none: 0;
--radius-sm: 2px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 50%;
/* Shadows */
--shadow-sm: rgba(0,0,0,0.08) 0px 1px 3px;
--shadow-md: rgba(0,0,0,0.25) 0px 0px 14px;
/* Typography */
--font-primary: "mlb-primary", "Helvetica Neue", Helvetica, Arial, sans-serif;
--font-secondary: "Proxima Nova", sans-serif;
}8. AI Coding Assistant Prompt
# MLB Design System Specification
You are an MLB design expert. Build UIs matching their visual language exactly.
## Brand Context
MLB's design is data-driven and functional. Blue and white dominate, with clear ramps for functional states (red = error, green = success, yellow = warning). Typography is sans-serif for clarity; spacing follows an 8px grid.
## Color Palette
- Primary Blue 700: #0048c7 — CTAs, primary buttons
- Primary Blue 500: #2c7df8 — Hover states
- White: #ffffff — Background
- Neutral 1100: #333b44 — Body text
- Red 600: #c61b2b — Error messages
- Green 600: #098314 — Success states
- Yellow 500: #bd6d00 — Warnings
- Purple 600: #7756b3 — Special campaigns
## Typography
- Font Family Primary: "mlb-primary", Helvetica Neue, Helvetica, Arial
- Font Secondary: "Proxima Nova", sans-serif
| Level | Size | Weight | Line Height | Use |
| H1 | 30px | 800 | 1.23 | Page titles |
| Button Large | 22px | 700 | 1.27 | CTA |
| Body | 16px | 400 | 1.50 | Content |
| Caption | 14px | 700 | 1.40 | Labels |
## Spacing & Grid
Base: 8px grid. Tokens: 1px, 2px, 4px, 6px, 8px, 11px, 12px, 16px, 20px, 32px.
## Border Radius
- none: 0 — Tables
- sm: 2px — Inputs
- md: 8px — Cards
- lg: 12px — Buttons
- full: 50% — Avatars
## Shadows
- sm: rgba(0,0,0,0.08) 0px 1px 3px
- md: rgba(0,0,0,0.25) 0px 0px 14px
## Components
### Primary Button
Default: background #0048c7, color #fff, padding 1px 10px, radius 5px.
Hover: background #1eaddb, opacity 0.9.
Active: background #080808.
Focus: outline 2px solid black.
### Link
Default: color #333333, no underline. Hover: color #1883fd.
## Layout & Responsive Rules
Content widths: mobile from 320px, tablet 768px, desktop >1024px.
## Interaction Rules
Transition: 150ms ease for state changes. Focus indicators must be visible.
## DO List
- Use only palette colors
- Maintain 8px grid
- Bold weights for legibility under 14px
- Keep CTAs blue unless state dictates red/yellow/green
## DON'T List
- Don’t invent new shades
- Don’t mix corner radii in the same component
- Don’t remove focus outline
## Code Examples
### Primary Button
.btn-primary {
background: #0048c7;
color: #fff;
padding: 1px 10px;
border-radius: 5px;
font-weight: 700;
font-size: 13px;
}
.btn-primary:hover { background: #1eaddb; opacity: 0.9; }
### Card
.card {
background: #ffffff;
border-radius: 8px;
padding: 16px;
box-shadow: rgba(0,0,0,0.08) 0px 1px 3px;
}9. Summary
TL;DR — MLB’s design system is a disciplined, utility-first palette of blues, neutrals, and functional reds/greens/yellows. Typography is custom sans-serif with Proxima Nova for supporting roles. Spacing is strictly tokenized; components are predictable.
Brand Keywords
- data-driven-minimalist
- functional-patriotic
- disciplined-token-based
- high-contrast-accessible