Skip to content

NPR Design System

NPR's design system as a DESIGN.md file. NPRSans across every tier, single cobalt blue link voltage, NPRSerif body deks, photography-led story tiles, 9 colors, 18 components. For React, Next.js, and AI tools.

Add shadcn.io to your AI agent. · Pro It installs blocks, icons and templates in your design system from a prompt, with Pro.

Set up MCP
Primary
#0a61db
Typeface
NPRSans
Shape
Soft
Base radius
6px
Colors
9
Type tokens
15
Components
18
Spacing values
7

About

About NPR DESIGN.md

Curated by Dov Azencot · Updated May 18, 2026 · Source npr.org (opens in a new tab)

NPR's homepage looks like nothing else in US news media — and the trick is what it leaves out. There is no red, no second saturated color, no atmospheric gradient. The page sets every word in NPRSans (a Gotham-derivative sans), prints headlines in charcoal #333333 rather than pure black, and reserves exactly one chromatic voltage — cobalt blue #0a61db — for link text and the audio-play pill buttons. Where CNN saturates its masthead in brand red, where The Guardian leans on a deep indigo masthead bar, and where The New York Times mixes serif headlines with red breaking-news flags, NPR runs the full editorial system in one typeface and one accent color and lets photography do every other chromatic job.

The DESIGN.md file packages the system into a machine-readable spec for React tooling. Inside: 9 colors tokens drawn from a 110-variable gray / blue palette that NPR exposes as `--gray-100` through `--gray-900` and `--blue-100` through `--blue-900`. The rendered chrome uses 7 of them — `{colors.ink}` charcoal, `{colors.ink-soft}` near-black, `{colors.canvas}` white, `{colors.muted}` mid-gray, `{colors.muted-2}` dark gray, `{colors.hairline}` light gray, and `{colors.primary}` cobalt blue. 16 typography tokens cover NPRSans at four weights and four scale steps, plus NPRSerif at the body-dek tier. 4 radius tokens centered on 2px for cards and 60px for the audio-play pills. 18 components covering the headline-into-dek story tile, the cobalt audio-play pill, the uppercase section eyebrow, the secondary metadata strip, the photograph-led media card, and the top-nav with its cobalt link treatment.

Feed this file to an AI coding tool and it reproduces NPR's specific moves: NPRSans across every tier with NPRSerif reserved for body deks, charcoal-not-black ink, single cobalt link voltage with no second brand color, uppercase 14px / 500 eyebrows with 0.84px tracking, and 60px pill audio CTAs. The token references resolve cleanly. The one move worth borrowing if your product is news-or-podcast-shaped: the photography-led story-tile rhythm with a 1px hairline between rows. The one move to leave alone unless your brand actually owns a single accent color: the chromatic restraint — most products need at least a secondary semantic palette for status and category cues.

What makes it distinct

5

  1. Charcoal-not-black inkevery story headline and body line renders in #333333, never pure black; the contrast against white softens the broadcaster utility tone
  2. Single cobalt link voltage#0a61db is the only saturated color above the fold, carrying both link text and the audio-play pill buttons
  3. NPRSans as workhorse, NPRSerif as accentthe Gotham-derivative sans runs every headline, label, and chrome string; the serif appears only in body deks
  4. Uppercase eyebrow labels at 0.84px trackingsection names like Law, Politics, and Culture sit as 14px / 500 caps above each story tile
  5. 60px pill audio buttonsthe listen-and-duration CTAs use full pill rounding with the duration timestamp baked into the label

npr.org

Live at npr.org

A snapshot of the brand in production. Scroll the frame to see the whole page.

NPR's website at npr.org

Colors

9 colors

NPR's system runs on #0a61db as its primary voltage, used in 3 of 18 components. Type is set in NPRSans across 15 tokens from 10px to 32px, weights 400–700. Shape language is soft — components average 16px corner radius, with no sharp interactive edges.

Brand & Accent

Sparing, CTA-only voltage · 1

Surface

Page and card backgrounds · 2

Text

Headlines, body, captions · 5

Borders & Hairlines

Dividers, outlines, rules · 1

Typography

15 type tokens

Set in NPRSans across 15 tokens, from 10px to 32px, weights 400–700. Shown in its own stack: where the font isn't installed, the fallback the file names stands in.

  • display-xl32px · weight 700 · lh 40pxThe quick brown fox jumps over the lazy dog
  • display-md24px · weight 700 · lh 27.6pxThe quick brown fox jumps over the lazy dog
  • heading-lg22px · weight 700 · lh 27.5pxThe quick brown fox jumps over the lazy dog
  • heading-md18px · weight 700 · lh 22.5pxThe quick brown fox jumps over the lazy dog
  • body-dek16px · weight 400 · lh 24px · tracking 0.32pxThe quick brown fox jumps over the lazy dog
  • body-md16px · weight 700 · lh 24px · tracking 0.32pxThe quick brown fox jumps over the lazy dog
  • body-sm14px · weight 400 · lh 21px · tracking 0.28pxThe quick brown fox jumps over the lazy dog
  • caption12px · weight 400 · lh 18px · tracking 0.24pxThe quick brown fox jumps over the lazy dog
  • eyebrow-cap14px · weight 500 · lh 19.6px · tracking 0.84pxThe quick brown fox jumps over the lazy dog
  • eyebrow-cap-sm12px · weight 400 · lh 18px · tracking 0.72pxThe quick brown fox jumps over the lazy dog
  • meta-cap14px · weight 400 · lh 14px · tracking 0.84pxThe quick brown fox jumps over the lazy dog
  • nav-link14px · weight 400 · lh 21px · tracking 0.28pxThe quick brown fox jumps over the lazy dog
  • pill-label14px · weight 400 · lh 21px · tracking 0.84pxThe quick brown fox jumps over the lazy dog
  • span-md18px · weight 400 · lh 22.5pxThe quick brown fox jumps over the lazy dog
  • micro10px · weight 400 · lh 15px · tracking 0.2pxThe quick brown fox jumps over the lazy dog

Layout

Radii and spacing

5 corner radii and 7 spacing values. Shape language: soft.

Radii

  • none0px
  • sm2px
  • md6px
  • pill60px
  • full9999px

Spacing

  • xs5px
  • sm8px
  • base10px
  • md11px
  • lg15px
  • xl16px
  • 2xl20px

Components

18 components

Each rendered from its tokens (color, type, radius, padding) on NPR's own canvas.

  • Button Primary
    button-primaryButton Primary
  • Button Secondary
    button-secondaryButton Secondary
  • Audio Play Pill
    audio-play-pillAudio Play Pill
  • Top Nav
    top-navTop Nav
  • Nav Link
    nav-linkNav Link
  • Hero Heading
    hero-headingHero Heading
  • Section Heading
    section-headingSection Heading
  • Story Tile Headline
    story-tile-headlineStory Tile Headline
  • Body Paragraph
    body-paragraphBody Paragraph
  • Eyebrow
    eyebrowEyebrow
  • Byline
    bylineByline
  • Story Tile
    story-tileStory Tile
  • Media Card
    media-cardMedia Card
  • Card
    cardCard
  • Type here…
    text-inputText Input
  • Divider
    dividerDivider
  • Photograph
    photographPhotograph
  • Footer
    footerFooter

In use

The system, in use

NPR's tokens on the kind of product it builds.

Build something people actually use.

A short paragraph of marketing copy that previews how the brand's display tier and body tier read together. Two sentences is usually enough.

Get startedLearn more
Marketing heroHeadline, sub-copy, primary CTA — the universal homepage opener.
Reporting · 14 min read

The quiet collapse of an old idea

For decades the consensus held that the system would correct itself. Then it didn't. This is the inside story of what changed, told by the people who watched it unravel.

"Nobody noticed because the failure was indistinguishable from progress."

By Sam Reporter · Updated 2 hours ago

Editorial articleMagazine-style longform with display headline.

FAQ

NPR design system FAQ

Common questions about NPR's tokens, components, and how to use this DESIGN.md in your project.

Read next

Specs, directories, and component libraries that pair with this design system.

Use it

Use NPR in your project

One machine-readable file. Drop it into Claude, Cursor, or any AI tool that reads DESIGN.md.

Download DESIGN.md
  1. Download the DESIGN.md

    One machine-readable file: every color, type, radius, spacing, and component token of NPR.

  2. Feed it to your AI tool

    Drop it into Claude, Cursor, or GitHub Copilot. The agent writes React components and Tailwind classes that match NPR's visual language.

  3. Reference the tokens directly

    Or paste the values into your Tailwind config, CSS variables, or component library: every color, size and radius is a quoted, ready-to-copy value.

Read the full DESIGN.md: overview, rationale, do’s and don’ts

Overview

NPR's homepage looks like nothing else in US news media — and the trick is what it leaves out. Single-voltage broadcast utility. There is no red, no second saturated color, no atmospheric gradient. The page sets every word in NPRSans (a Gotham-derivative sans), prints headlines in charcoal {colors.ink} rather than pure black, and reserves exactly one chromatic voltage — cobalt blue {colors.primary} — for link text and the audio-play pill buttons. Where CNN saturates its masthead in brand red, where The Guardian leans on a deep indigo masthead bar, and where The New York Times mixes serif headlines with red breaking-news flags, NPR runs the full editorial system in one typeface and one accent color and lets photography do every other chromatic job.

The chromatic restraint is the move. Across the captured page the cobalt appears 485 times — 239 as text, 19 as background fill, 227 as border — almost entirely on link text and on the 60px-radius audio-play pills. The broadcaster-red token --red-500 and the NPR-pink-magenta tokens exist in the underlying variable palette (110 tokens spanning gray, blue, red, orange, yellow, green, teal, violet, magenta, tan families) but the homepage chrome uses just 7 of them: {colors.ink} charcoal, {colors.ink-soft} near-black, {colors.canvas} white, {colors.muted} mid-gray, {colors.muted-2} dark gray, {colors.hairline} light gray, and {colors.primary} cobalt. Every other token in the palette is reserved for editorial overrides (election graphics, podcast art, special-report pages) that don't show on the homepage.

Typography is two families. NPRSans (Gotham-derivative) carries every headline, eyebrow, label, nav link, and most body strings — at 10-32px across weights 400, 500, and 700. NPRSerif (an NPR-specific serif) appears only at the body-dek tier (16px / 400 / 24px line height) under each story-tile headline. There is no third family and no display-sans-vs-text-sans split — the same NPRSans does both jobs at different sizes.

Key Characteristics:

  • Charcoal {colors.ink} (#333333) ink instead of pure black — every headline and label renders 30 lightness points lighter than pure ink, softening the broadcaster utility tone.
  • Single cobalt voltage ({colors.primary}) carries link text AND the audio-play pill buttons; no other saturated color appears in the homepage chrome.
  • NPRSans across every tier with NPRSerif reserved only for body deks under story headlines.
  • Uppercase eyebrow labels at 14px / 500 with 0.84px tracking sit above every story tile carrying the section name ("Law," "Politics," "Culture," "National Security").
  • 60px pill rounding for audio-play CTAs, 2px rounding for cards / inputs / dropdowns — a binary radius system with nothing in between.
  • Photography-led story tiles: every tile begins with a full-width image, then eyebrow, then headline, then NPRSerif dek, separated from neighbors by 1px {colors.hairline} rules.
  • Audio CTAs bake the duration into the label ("Listen · 25:04," "Listen · 4:42") so the affordance and the time-commitment sit inside the same target.
  • The 110-token underlying color variable palette (gray-100..900, blue-100..900, red, orange, yellow, green, teal, violet, magenta, tan families) carries every potential editorial accent but only 7 are rendered on the homepage chrome.

Colors

  • Cobalt Primary ({colors.primary} — #0a61db): frequency 485. Used as text (239), bg (19), border (227). The single chromatic voltage on the page. Wired as --blue-500. Carries link text in every body paragraph and the fill on the audio-play pill CTAs. The only saturated color in the rendered homepage chrome.
  • Ink ({colors.ink} — #333333): frequency 1594. Used as text (795), bg (7), border (792). The dominant editorial color. Wired as --gray-700. Every NPRSans headline, eyebrow, dek body, and label renders in this charcoal. 30 lightness points lighter than pure black — the choice is deliberate.
  • Ink Soft ({colors.ink-soft} — #121212): frequency 67. Used as text (0), bg (1), border (0), shadow (55), gradient (11). Wired as --gray-900. Reserved for shadow tints under elevated surfaces and a single utility background — never for editorial text.
  • Ink Black ({colors.ink-black} — #000000): frequency 39. Used as text (18), bg (4), border (16). Reserved for the masthead logo and a small set of utility chrome surfaces; not used on editorial headlines.
  • Canvas ({colors.canvas} — #ffffff): frequency 495. Used as text (218), bg (62), border (215). The page floor. Pure white. Wired as --white-100. Every story tile, the masthead, the nav bar, and the footer sit on this canvas with no off-white softening.
  • Muted ({colors.muted} — #737373): frequency 363. Used as text (158), bg (47), border (158). Wired as --gray-500. Carries the body-dek text under each headline, the byline metadata, the eyebrow color, and the timestamp strings. The secondary-text workhorse.
  • Muted-2 ({colors.muted-2} — #575757): frequency 33. Used as text (16), bg (1), border (16). Wired as --gray-600. A darker mid-gray for slightly emphasized metadata — section labels in the dropdown nav, the "Updated 2 hours ago" timestamp on hero tiles.
  • Hairline ({colors.hairline} — #d4d4d4): frequency 17. Used as text (0), bg (0), border (17). Wired as --gray-100. The structural divider between story-tile rows and the bottom border on the top-nav. Used only as border; never as fill or text.
  • Surface Mute ({colors.surface-mute} — #f1f1f1): frequency 3. Used as text (0), bg (3), border (0). Wired as --gray-50 (and shared with the 50-tier of every color family). The pale loading-placeholder tone behind photographs while they load.

Typography

Font Family

The system runs two families. NPRSans (a Gotham-derivative sans wired as NPRSans, Helvetica, Arial, sans-serif) carries every headline, eyebrow, label, nav link, caption, and most body strings — at 10-32px across weights 400, 500, and 700. NPRSerif (NPRSerif, Georgia, serif) appears only at the body-dek tier (16px / 400 / 24px line height with 0.32px letter-spacing) under each story-tile headline. There is no third family and no separate display-vs-text split inside NPRSans — the same family does display at 32px / 700 and caption at 10px / 400.

Hierarchy

TokenFamilySizeWeightLine HeightUse
{typography.display-xl}NPRSans32px70040pxHero story headline ("Trump drops his IRS lawsuit, paving the way for a settlement")
{typography.display-md}NPRSans24px70027.6pxSecondary feature headlines and section-band titles
{typography.heading-lg}NPRSans22px70027.5pxStory-tile headline on standard editorial tiles
{typography.heading-md}NPRSans18px70022.5pxSmaller story-tile headlines in dense grids
{typography.body-dek}NPRSerif16px40024pxThe dek under every story-tile headline — the only serif tier in the system
{typography.body-md}NPRSans16px70024pxBolded body links and inline emphasis
{typography.body-sm}NPRSans14px40021pxDefault body and inline link strings
{typography.caption}NPRSans12px40018pxBylines, timestamps, photo captions
{typography.eyebrow-cap}NPRSans14px50019.6pxUppercase section eyebrow ("LAW," "POLITICS") with 0.84px tracking
{typography.eyebrow-cap-sm}NPRSans12px40018pxSmaller uppercase eyebrows on dense tiles with 0.72px tracking
{typography.meta-cap}NPRSans14px40014pxUppercase metadata strings ("UPDATED," "BREAKING") with 0.84px tracking
{typography.nav-link}NPRSans14px40021pxTop-nav link labels in cobalt
{typography.pill-label}NPRSans14px40021pxAudio-play pill label ("Listen · 25:04") with 0.84px tracking
{typography.span-md}NPRSans18px40022.5pxInline emphasis spans inside body paragraphs
{typography.micro}NPRSans10px40015pxSmallest footer chrome and accessibility hint text

Principles

Display weight is 700 — NPR is one of the few news brands willing to go full bold on headlines because the underlying NPRSans family is a Gotham derivative with the wide-letterform proportions that hold up at heavy weights without crowding. Eyebrow and metadata labels use a 0.84px tracking value (about 6% of the 14px size) for the uppercase treatment — distinctive enough to signal "this is a section label" without veering into letterpress-pastiche territory. Body deks are the only serif moment; everything else is NPRSans.

Note on Font Substitutes

Both families are licensed (NPRSans is a Gotham derivative; NPRSerif is NPR-specific). The closest open-source substitute for NPRSans is Inter at the same weights — proportions transfer cleanly and Inter's uppercase tracking responds well to the 0.84px treatment. The original Gotham (now licensed via Hoefler & Co.) is the closest paid alternative if you have the license. For NPRSerif use Source Serif 4 (Adobe's open-source serif) at 16px / 400 / 24px line height — the proportions match closely. PT Serif at the same size is the next-best open substitute.

Layout

Spacing System

  • Base unit: 5px (with 15px as the dominant module — 93 occurrences across the captured page).
  • Tokens: {spacing.xs} 5px · {spacing.sm} 8px · {spacing.base} 10px · {spacing.md} 11px · {spacing.lg} 15px · {spacing.xl} 16px · {spacing.2xl} 20px.
  • Page padding (horizontal): 0px 20px on narrow viewports; 0px 64px on wide viewports (the latter inherited from the broadsheet content container).
  • Section padding (vertical): 0px 0px 20px between story tiles; 20px 20px 0px on the section-band wrappers.
  • Story-tile padding: 20px 20px 0px on top / horizontal; the bottom edge inherits the 1px {colors.hairline} rule that separates rows.

Grid & Container

  • Max content width: ~1280px on the outer container, with the hero story column constrained to ~720px wide for headline readability.
  • Hero band: 2-column at desktop with the lead story (headline + dek + audio-play pill + photograph) on the left and a secondary stack of three follow-on stories on the right.
  • Story-tile grid: 4-column on dense editorial bands ("More Top Stories"), collapsing to 2-column on tablet and 1-column on narrow viewports.
  • Audio-segment band: dedicated full-bleed dark-background row with the segment thumbnail, title, host name, and audio-play pill.
  • Footer: 4-column NPRSans link grid carrying the standing sections and the donation / membership prompt.

Rhythm

The page alternates between full-bleed photographic plates (the hero photograph, the audio-segment thumbnail, the embedded video tile) and dense editorial grids (the multi-story tile bands). Section bands are separated by {spacing.2xl} 20px vertical gutters with no additional decorative break — the photograph density carries the rhythm, not background-color shifts. There is no atmospheric gradient between bands; every section terminates on pure white with a 1px hairline rule.

Elevation

The system has essentially no shadow tier on the editorial chrome. Story tiles sit flat on the white canvas, separated by 1px {colors.hairline} rules. Where most news sites use a 4-8px drop shadow under each tile, NPR uses border-only separation. The single exception is the audio-segment band, which carries a {colors.ink-soft} (#121212) shadow at low opacity under the embedded video card — but the editorial story tiles themselves are flat.

  • Flat (no shadow): every editorial story tile, the masthead, the nav bar, the footer — 99% of surfaces.
  • Hairline divider: {colors.hairline} at 1px between rows of story tiles and below the top-nav.
  • Single shadow exception: the audio-segment dark band uses a {colors.ink-soft} tint at low opacity under the embedded video card; not used anywhere else on the page.

Shapes

The radius scale is binary:

  • {rounded.none} 0px — story-tile photographs and the masthead surfaces.
  • {rounded.sm} 2px — every card, dropdown, input, and most utility chrome surfaces. Frequency 79 in the captured CSS.
  • {rounded.md} 6px — a small set of utility chips and the search input on the secondary nav. Frequency 8.
  • {rounded.pill} 60px — the audio-play pill buttons. Frequency 26. Exclusively used for the listen-and-duration CTAs.
  • {rounded.full} 9999px — profile-avatar treatments and play-icon glyphs (rendered as 50% in the captured CSS, frequency 12).

There is no 8px or 12px tier. The page chooses between near-sharp editorial corners (2px) and fully-rounded action pills (60px), with nothing in between. The 15px / 40px values in the captured CSS belong to a podcast-art treatment band and the embedded video chrome — not part of the editorial radius scale.

Components

button-primary — Cobalt {colors.primary} fill, white text, {rounded.pill} 60px radius, 0x10 padding, 30px height. The standing CTA pill in the masthead utility cluster ("Donate," "Subscribe"). Uses {typography.pill-label} (NPRSans 14px / 400 / 0.84px tracking).

button-secondary — Transparent fill, ink text, 1px {colors.hairline} border, {rounded.sm} 2px radius. Used for tertiary chrome buttons (filter chips, "Show more" toggles).

audio-play-pill — Cobalt {colors.primary} fill, ink text, {rounded.pill} 60px radius, 0x10 padding, 30px height. The signature CTA on the page. The label combines verb and duration ("Listen · 25:04," "Listen · 4:42") so the affordance and the time-commitment sit inside the same target. Used 26 times across the page wherever an audio segment is embedded.

top-nav — White canvas, ink text, 50px height, 15x20 padding, 1px {colors.hairline} bottom border. Houses the section navigation (News, Culture, Music, Podcasts, Programs, Newsletters), the search affordance, the cobalt-fill donate CTA, and the user-account chip.

nav-link — Transparent background, cobalt {colors.primary} text, {typography.nav-link} (NPRSans 14px / 400), 0x10 padding, 50px height. Cobalt is the only color used for nav link text in the standing nav — the same voltage as link text in editorial body.

hero-heading — Ink text on white canvas, {typography.display-xl} (NPRSans 32px / 700 / 40px line height). 0 padding. The lead story headline on the hero band.

section-heading — Ink text, {typography.display-md} (NPRSans 24px / 700). 16px bottom padding before the section's story-tile grid begins.

story-tile-headline — Ink text, {typography.heading-lg} (NPRSans 22px / 700), 8px vertical padding. The headline on every standard story tile in editorial bands.

body-paragraph — Muted text at {typography.body-dek} (NPRSerif 16px / 400 / 24px line height with 0.32px letter-spacing). The only serif moment in the system. Sits under every story-tile headline as the article dek.

eyebrow — Uppercase NPRSans 14px / 500 with 0.84px tracking in muted gray {colors.muted}. 5px bottom padding. Sits above every story-tile headline carrying the section name ("LAW," "POLITICS," "CULTURE," "NATIONAL SECURITY").

byline — Muted text, {typography.caption} (NPRSans 12px / 400 / 18px). 5px vertical padding. The named-host or correspondent byline below the dek ("By Becky Sullivan," "By Domenico Montanaro").

story-tile — White canvas, ink text, square corners, 20x20x0 padding, 1px {colors.hairline} bottom border (the row divider). The structural editorial container.

media-card — White canvas, {rounded.sm} 2px radius, 0 padding. The photograph-led media card with the image flush at the top edge.

card — White canvas, ink text, {rounded.sm} 2px radius, 12x16x16 padding, 1px {colors.hairline} border. Used for utility blocks (newsletter signup callout, donation prompt, podcast subscription card).

text-input — White canvas, ink text, 1px {colors.hairline} border, {rounded.sm} 2px radius, 0x12 padding, 40px height. Used in the search-input and the newsletter-signup form.

divider — 1px {colors.hairline} rule between story-tile rows and between section bands. The structural separator.

photograph — Pale {colors.surface-mute} placeholder while loading, {rounded.sm} 2px radius, 0 padding. Every story-tile image rides flush at the top of the tile.

footer — White canvas, muted text, {typography.caption} (NPRSans 12px / 400), 20x20x0 padding. Carries the standing footer link columns (Programs, Podcasts, About NPR, Stations, Press, Public Editor) and the legal / accessibility row beneath.

Do's and Don'ts

Do light link text AND the audio-play pill in the same cobalt {colors.primary} (#0a61db). The discipline is the move — using two different blues for "link" and "play" would break the single-voltage signal that distinguishes this brand from CNN's red-saturated chrome.

Do set every editorial headline in {colors.ink} (#333333), NOT in pure black. The 30-point lightness lift over {colors.ink-black} (#000000) is small but consistent, and it softens the broadcaster utility tone in a way that pure-black headlines wouldn't.

Do use uppercase NPRSans 14px / 500 with 0.84px tracking for every section eyebrow. The eyebrow-headline-dek lockup is the page's reading rhythm; the all-caps tracking specifically calls out "this is the section label, not the headline."

Do bake the duration into the audio-play pill label ("Listen · 25:04," not just "Listen"). The verb-plus-duration string is the distinctive affordance pattern; surfacing the time-cost up front fits a broadcaster whose audience picks between a 4-minute and a 25-minute segment.

Don't introduce a second saturated color into the editorial chrome — no red flag for "breaking," no orange for "opinion," no green for "live." The single-voltage discipline is the principle; multiplying brand voltages destroys it. Reserve the muted gray {colors.muted} (#737373) for any secondary semantic role you need.

Don't use 8px or 12px corner radii anywhere on the page. The system is binary at {rounded.sm} 2px for editorial chrome and {rounded.pill} 60px for action pills, with {rounded.full} for circular avatars. Adding a medium tier softens the editorial sharpness and weakens the contrast with the action pills.

Don't swap NPRSerif ({typography.body-dek}) into headline or eyebrow slots. The serif is the dek-only voice. Promoting it into headline tier would create a two-family display hierarchy and undercut the NPRSans-everywhere identity.

Don't add drop shadows under story tiles. The 1px {colors.hairline} rule is the divider; adding a 4-8px shadow makes the tiles read as floating cards and breaks the broadsheet-on-screen rhythm. The page is deliberately flat.

Known Gaps

  • Hover and focus states: documented only for resting states; the full state matrix (focus rings, disabled tints, error states) is not captured from the marketing surface.
  • Dark mode: there is none on the homepage. The captured surface is light-only.
  • The full 110-token color palette: the underlying CSS exposes gray, blue, red, orange, yellow, green, teal, violet, magenta, and tan families at 50/100/200/300/400/500/600/700/800/900 steps, but only 9 of those tokens render on the homepage chrome. The rest are reserved for editorial overrides (election graphics, podcast art, special-report pages, data visualizations) that are not represented here.
  • Audio-player chrome: the embedded persistent-player at the foot of the page (the "Now Playing" strip with scrubber, host-name, and queue) uses a different surface treatment that is not tokenized in this file.
  • Election and special-report graphics: the bright red {colors.muted}-adjacent tokens (red, orange, yellow families) appear in election-night charts, congressional-vote maps, and breaking-news flag overlays — none of which render on the standard homepage.
  • Podcast-art surfaces: the 15px and 40px radii in the captured CSS belong to podcast-cover-art treatments and embedded video chrome — separate sub-systems with their own radius scale.
  • Mobile-specific affordances: the captured CSS includes mobile breakpoint variations that are not enumerated as separate tokens in this file.

News & Publishing

More systems like this

More DESIGN.md files in News & Publishing.

Pricing

Build it with Pro

The DESIGN.md files are free. Pro adds 6,000+ blocks, premium templates and the MCP server, so your AI editor builds in your system for you.

4.9/5 out of 5 · 150+ reviewsfrom 150+ founders and developers.

Billed once a year in USD. Cancel anytime.

Individual

For personal projects & open source

$32instead of $49/mo

$389 billed yearly

  • How many people can use the license.Seats: 1 seat
  • Client work, SaaS products and anything you charge for.Commercial use: Personal & open source only
  • Production-ready React sections: hero, pricing, features, dashboards and more.Pro blocks: 6,000+ blocks
  • Complete multi-page sites you can ship as they are.Templates: All 14 templates
  • React icons from every major library, installable with one command.React icons: 294k+ icons
  • Presets that restyle every block, in light and dark.Themes: All 59 themes
  • Lets your AI editor search, preview and install blocks for you.MCP server: Basic usage
  • Priority requests are answered first.Support: Standard

Team

Most popular

For freelancers, agencies & startups

$66instead of $99/mo

$789 billed yearly · ≈ $13/dev/mo

Everything in Individual, plus

  • How many people can use the license.Seats: Up to 5 seats
  • Client work, SaaS products and anything you charge for.Commercial use: Included
  • Lets your AI editor search, preview and install blocks for you.MCP server: High usage
  • Priority requests are answered first.Support: Priority

Organization

For companies with larger teams

$132instead of $199/mo

$1,589 billed yearly

Everything in Team, plus

  • How many people can use the license.Seats: Unlimited seats
  • Lets your AI editor search, preview and install blocks for you.MCP server: Unlimited usage
  • Secure checkout via Stripe
  • Code lives in your repo
  • Keep what you've shipped if you cancel
  • License terms

Your system, built for you

Every block, template and icon, installed by your AI agent in your design system. The DESIGN.md files stay free.

Get Pro