Skip to content

Reddit Design System

Reddit's orangered #d93a00 and Alien Blue #0079d3 on a system-font stack, as a DESIGN.md with colors and components for React, Next.js and AI tools.

Primary color
#d93a00
Typeface
-apple-system
Shape
Pill
Base radius
4px
Colors
23
Type tokens
14
Components
22
Spacing values
8

About Reddit DESIGN.md

Curated by Dov Azencot, updated May 13, 2026. Source reddit.com (opens in a new tab).

Reddit's chrome is the chrome of a 19-year-old forum that grew up — every text role on the page renders in the native operating-system sans (`-apple-system`, `BlinkMacSystemFont`, `'Segoe UI'`, Roboto, `'Helvetica Neue'`, Arial) with no proprietary face anywhere on the marketing surface, and the voting palette is split across two opposing hues that neither blend nor share a button. Orangered (`#d93a00`) carries the upvote arrow, the admin label, and the live-stream identity dot; Periwinkle (`#7193ff`) carries the downvote arrow alone. Between them sits a sober Alien Blue (`#0079d3`) for links and switch-on states, a brighter Action Primary (`#24a0ed`) for the primary CTA hover, and an Action Secondary (`#006cbf`) for tertiary-button text and outline borders. The grey ladder runs seven steps from `#1a1a1b` ink down through `#878a8c`, `#d3d6da`, `#eaedef`, `#f6f7f8` to pure `#ffffff`, and the entire structural chrome — hairlines, surface fills, helper text, disabled states — resolves through one of those seven tones.

This file packages the Reddit marketing chrome as a single Google Labs DESIGN.md spec, sourced from the 221 `:root` CSS custom properties the page declares. Inside: 23 colors tokens covering the split-voltage voting pair, the four-stop blue stack, the seven-step tone ladder, plus identity colors (`#46d160` moderator green, `#660099` visited purple, `#0dd3bb` self-teal, `#ddbd37` coin yellow, `#ff3881` NSFW pink, `#ea0027` negative-alert red, `#ffb000` caution amber); 12 typography roles all set in the native system stack with six title levels h0-h5 stepping from 26px to 12px at weight 500, four button registers from 18px down to 12px at weight 700, plus body, label, code, and small; a four-step radius scale where every CTA pill resolves to `9999px` and every card snaps to `0.25rem`; eight spacing steps tuned to a 4-8-16-24-32-48px rhythm; and 22 components recipes covering primary, secondary, tertiary, and plain button variants, the dark-blue top nav, the modal scrim, the focus ring, and the text input.

Feed this file to Claude, Cursor, or GitHub Copilot and the agent will produce React components that read as Reddit chrome — a native-sans stack, the orange-vs-periwinkle voting split, the seven-tone grey ladder, the pill-or-card binary on every interactive surface — instead of a generic social-feed theme. Or reference the tokens directly when wiring a community-driven UI: every hex is quoted, every component recipe is wired through `{token.path}` references ready to paste into Tailwind config or CSS custom properties. The system is worth studying because it argues a community network can carry a 19-year-old brand on operating-system fonts and a two-hue voting split — restraint at the chrome level, opinion at the voltage level, no proprietary type required.

What makes it distinct

5 highlights

  1. Split-voltage voting paletteOrangered '#d93a00' carries upvote and admin identity, Periwinkle '#7193ff' carries downvote, the two never share a button
  2. Native font stack as type signatureEvery text role runs the OS sans (-apple-system, Segoe UI, Roboto) with no proprietary face on the chrome
  3. Pill-or-card binaryInteractive elements collapse to a '9999px' full-pill while every surface card snaps to a tight '0.25rem' corner
  4. Tone-1 through tone-7 grey ladder'#1a1a1b' ink steps through '#878a8c', '#d3d6da', '#eaedef', '#f6f7f8' to '#ffffff' across every neutral on the page
  5. Uppercase 10px label registerSection labels render at 0.625rem weight 700 with '0.5px' tracking, the only typographic register on the chrome that shouts

Live at reddit.com

Reddit in production, as captured. Scroll the window to see the whole page.

Reddit's website at reddit.com

23 colors

Reddit's system runs on #d93a00 as its primary voltage, used in 2 of 22 components. Type is set in -apple-system across 14 tokens from 10px to 26px, weights 400–700. Shape language leans on pill geometry — fully rounded surfaces dominate the component library.

Surface

Page and card backgrounds · 1

Text

Headlines, body, captions · 6

Borders & Hairlines

Dividers, outlines, rules · 1

Other

Specialty colors · 15

14 type tokens

Set in -apple-system across 14 tokens, from 10px to 26px, weights 400–700. Shown in its own stack: where the font isn't installed, the fallback the file names stands in.

  • display-xl26px · weight 500 · lh 32px · tracking normalThe quick brown fox jumps over the lazy dog
  • display-lg22px · weight 500 · lh 26px · tracking normalThe quick brown fox jumps over the lazy dog
  • display-md20px · weight 500 · lh 24px · tracking normalThe quick brown fox jumps over the lazy dog
  • heading-md18px · weight 500 · lh 22px · tracking normalThe quick brown fox jumps over the lazy dog
  • heading-sm16px · weight 500 · lh 20px · tracking normalThe quick brown fox jumps over the lazy dog
  • heading-xs14px · weight 500 · lh 18px · tracking normalThe quick brown fox jumps over the lazy dog
  • body-md14px · weight 400 · lh 20px · tracking normalThe quick brown fox jumps over the lazy dog
  • body-sm12px · weight 400 · lh 16px · tracking normalThe quick brown fox jumps over the lazy dog
  • button-lg18px · weight 700 · lh 22px · tracking normalThe quick brown fox jumps over the lazy dog
  • button-md16px · weight 700 · lh 20px · tracking normalThe quick brown fox jumps over the lazy dog
  • button-sm14px · weight 700 · lh 18px · tracking normalThe quick brown fox jumps over the lazy dog
  • button-xs12px · weight 700 · lh 14px · tracking normalThe quick brown fox jumps over the lazy dog
  • label-uppercase10px · weight 700 · lh 15px · tracking 0.5pxThe quick brown fox jumps over the lazy dog
  • code-md14px · weight 400 · lh 20px · tracking normalThe quick brown fox jumps over the lazy dog

Radii and spacing

4 corner radii and 8 spacing values. Shape language: pill, on a 4px base radius.

Radii4

  • none0px
  • sm4px
  • lg32px
  • full9999px

Spacing8

  • xxs2px
  • xs4px
  • sm8px
  • md12px
  • base16px
  • lg24px
  • xl32px
  • xxl48px

22 components

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

  • Button Primary
    Button Primarybutton-primary
  • Button Primary Hover
    Button Primary Hoverbutton-primary-hover
  • Button Primary Disabled
    Button Primary Disabledbutton-primary-disabled
  • Button Secondary
    Button Secondarybutton-secondary
  • Button Tertiary
    Button Tertiarybutton-tertiary
  • Button Plain
    Button Plainbutton-plain
  • Upvote Button
    Upvote Buttonupvote-button
  • Downvote Button
    Downvote Buttondownvote-button
  • Top Nav
    Top Navtop-nav
  • Nav Link
    Nav Linknav-link
  • Type here…
    Text Inputtext-input
  • Type here…
    Text Input Focustext-input-focus
  • Card
    Cardcard
  • Accordion Panel
    Accordion Panelaccordion-panel
  • Status Pill Mod
    Status Pill Modstatus-pill-mod
  • Status Pill Admin
    Status Pill Adminstatus-pill-admin
  • Status Pill Error
    Status Pill Errorstatus-pill-error
  • Status Pill Nsfw
    Status Pill Nsfwstatus-pill-nsfw
  • Switch On
    Switch Onswitch-on
  • Switch Off
    Switch Offswitch-off
  • Modal
    Modalmodal
  • Focus Ring
    Focus Ringfocus-ring

The system, in use

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

Marketing heroThe homepage: its nav, a headline and the main call to action.
Reddit
Sign up

Stay close to the people who matter

Share moments, start conversations and find your communities, on any device.

Join nowGet the app
Reddit
MMayaonline
Are we still on for Saturday?9:40Yes. 10am at the park?9:41Perfect, I'll bring coffee9:42
Message

Reddit design system FAQ

Reddit's tokens, its components and how to use this DESIGN.md in your project.

What are the color tokens in the Reddit DESIGN.md?

Reddit's DESIGN.md has 23 color tokens: orangered (#d93a00), periwinkle (#7193ff), alien-blue (#0079d3), action-primary (#24a0ed), action-secondary (#006cbf), visited-purple (#660099) and 17 more. Every value is a quoted hex you can copy.

What is Reddit's primary color hex code?

The color token `orangered` is #d93a00, used by 2 components. The surface behind it is `canvas` (#ffffff).

How do I use Reddit's colors in Tailwind CSS?

Map the tokens to your CSS variables: `orangered` (#d93a00) to `--primary`, `canvas` (#ffffff) to `--background`, `periwinkle` (#7193ff) to `--foreground`. shadcn/ui's Tailwind setup maps them to classes such as `bg-primary` and `text-foreground`, so they then use Reddit's palette.

What is Reddit's primary brand color?

Reddit Orangered is '#d93a00' — the signature voltage that carries the upvote arrow, the admin-tag label, and the live-stream identity dot. The system exposes it through four CSS variables: '--color-global-orangered', '--color-action-upvote', '--color-identity-admin', and '--color-category-live'. A second voting voltage sits opposite: Periwinkle '#7193ff' for the downvote arrow alone, declared as '--color-action-downvote'. Between them runs a four-stop blue stack — Alien Blue '#0079d3' for switch checked states, Action Primary '#24a0ed' for primary-button hover, Action Secondary '#006cbf' for tertiary text and outline-button borders, and a deep navy '#1d2535' for the dark canvas. The split-voltage system is the brand's defining move: Orangered and Periwinkle never share a button surface.

Use Reddit in your project

One machine-readable file. Drop it into Claude Code, Cursor, VS Code 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 Reddit.

  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 Reddit'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

Reddit's chrome is the operating system's own forum, dressed for the public web — every text role on the page renders in the native -apple-system / BlinkMacSystemFont / 'Segoe UI' / Roboto stack with no proprietary face shipped on the marketing surface, and the voting voltage is split across two opposing hues that never touch the same button. Orangered (#d93a00) carries the upvote arrow, the admin tag, the live-stream identity dot, and the category-live indicator — four semantic roles bound to one chromatic value. Periwinkle (#7193ff) carries the downvote arrow alone, no other role attached. Between the two extremes sits the four-stop blue stack — Alien Blue #0079d3 for switch-checked surfaces, Action Primary #24a0ed for the primary-button hover, Action Secondary #006cbf for tertiary text and outline borders, and a deep navy #1d2535 for the dark canvas region — and a tone-1 through tone-7 grey ladder that handles every non-chromatic ink, hairline, surface, and disabled state.

Split-voltage voting: where most binary-vote interfaces (Stack Overflow, Hacker News, Twitter's heart) collapse positive and negative sentiment into a single accent that toggles on/off, Reddit splits the polarity across two opposing hues — Orangered for up, Periwinkle for down — and refuses to let the two cohabit. The upvote button can never render with Periwinkle text, the downvote arrow can never render with Orangered fill, and no chrome button in the catalog uses either color as its primary background. Both voltages live exclusively inside the voting widget; the rest of the chrome runs through the blue stack and the seven-tone grey ladder.

The typography is the second voice signature. System-sans as brand: Reddit declares no proprietary face. The full CSS variable stack lists -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif for every text role from h0 26px down to the 10px uppercase label — a deliberate decision that lets the platform's own letterforms carry the brand. Unlike the convention of shipping a custom display face for a 20-year-old consumer property (Airbnb Cereal, Stripe Sohne, Discord Ginto Nord), Reddit trusts San Francisco on iOS, Segoe on Windows, and Roboto on Android to render its 1.4 billion monthly headlines. The display tier runs six title sizes (h0 26 / h1 22 / h2 20 / h3 18 / h4 16 / h5 14 / h6 12px) all at weight 500, the button tier runs four sizes (18 / 16 / 14 / 12px) at weight 700, and the uppercase label register sits alone at 10px weight 700 with 0.5px positive tracking — the only typographic register on the chrome that shouts.

Key Characteristics:

  • Split-voltage voting palette — Orangered {colors.orangered} (#d93a00) for upvote/admin/live, Periwinkle {colors.periwinkle} (#7193ff) for downvote, the two never share a button
  • Native operating-system sans stack — -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto renders every text role on the chrome with no proprietary face
  • Four-stop blue ladder — Alien Blue #0079d3, Action Primary #24a0ed, Action Secondary #006cbf, Navy-deep #1d2535 handle links, CTAs, outlines, and dark canvas in that order
  • Tone-1 through tone-7 grey ladder — #1a1a1b ink, #576f76 mute, #878a8c tone-3, #d3d6da tone-4, #eaedef tone-5, #f6f7f8 tone-6, #ffffff canvas
  • Pill-or-card radius binary — every interactive surface resolves to 9999px, every card snaps to 0.25rem (4px), with one outlier 2rem (32px) tier for the secondary accordion variant
  • Uppercase 10px label register — 0.5px positive tracking, weight 700, the only typographic register that breaks lowercase
  • Four button-height tier — 22px, 34px, 44px, 54px (xs / sm / md / lg) all share the full-pill geometry

Colors

The palette splits along three function lines: a split-voltage voting pair (Orangered for up, Periwinkle for down), a four-stop blue stack for links, CTAs, switches, and outlines, and a tone-1 through tone-7 grey ladder that handles every neutral structural role. A small identity stack (moderator green, visited purple, self-teal, coin yellow, NSFW pink) and an alert stack (red, amber) sit outside the chrome and live only inside in-product semantic surfaces.

  • Orangered (#d93a00) — frequency 0 on the captured chrome, declared in 4 CSS variables: --color-global-orangered, --color-action-upvote, --color-identity-admin, --color-category-live. Reserved for upvote arrows, admin badges, the live-stream identity dot, and the category-live indicator. The singular brand voltage that gives Reddit its 19-year-old visual signature — never used as a button fill on the captured marketing chrome, exclusively the upvote arrow and identity-tag color.
  • Periwinkle (#7193ff) — frequency 0 on captured chrome, declared as --color-action-downvote. The downvote arrow voltage; one semantic role, one CSS variable. The split-voltage opposite of Orangered — the two never share a surface and never appear in the same component.
  • Alien Blue (#0079d3) — frequency 0 on captured chrome, declared in 3 variables: --color-global-alienblue, --color-switch-input-background-checked, --color-switch-input-background-checked-hover. Reserved for the switch-on surface and the focus-ring color; the structural blue that handles toggle states and accessibility outlines.
  • Action Primary (#24a0ed) — frequency 0 on captured chrome, declared as --color-action-primary, --color-primary-background, --color-button-primary-background-hover. The brighter blue used on primary-button hover surfaces and the primary background tier.
  • Action Secondary (#006cbf) — frequency 0 on captured chrome, declared in 19 variables including --color-a-default, --color-button-secondary-text, --color-button-tertiary-text, --color-button-plain-text, --button-color-text-default. The workhorse blue — link color, secondary-button text, tertiary-button text, plain-button text, outline-button border. The most-referenced blue token in the system.
  • Visited Purple (#660099) — declared as --color-primary-visited. The traditional visited-link color, a 1990s web convention preserved as a load-bearing token in Reddit's link chrome — the visual continuity with the early-web forum aesthetic the brand was born into.
  • Mod Green (#46d160) — declared in 3 variables: --color-alert-positive, --color-identity-moderator, --color-success-content. The moderator-identity color, also the success-state and positive-alert color — three semantic roles bound to one green.
  • Self Teal (#0dd3bb) — declared as --color-identity-self. The "you" indicator color inside threads; renders on the current-user's own comment-author label.
  • Coin Yellow (#ddbd37) — declared as --color-identity-coins. The Reddit Coins indicator color; renders on award badges and the coin-balance counter.
  • Alert Amber (#ffb000) — declared as --color-alert-caution. The caution-tier alert; renders on warning banners and form-validation cautions.
  • Alert Red (#ea0027) — declared in 2 variables: --color-alert-negative, --color-danger-content. The error-tier alert and destructive action color; renders on validation errors, delete-confirmation modals, and destructive-button fills.
  • NSFW Pink (#ff3881) — declared as --color-category-nsfw. The "not safe for work" category tag color; reserved for content-warning badges and adult-content pills.
  • Navy Deep (#1d2535) — declared as --color-global-darkblue. The dark canvas color; renders as the top-nav background and the dark-theme page surface.
  • Ink (#1a1a1b) — frequency 18 (text 9, border 9). Declared in 7 variables including --color-tone-1, --color-input-text, --color-label-default, --color-scrim, --color-opacity-08, --color-category-spoiler. The primary ink and the highest-frequency non-white color on the chrome — every body paragraph, every input label, every default text role resolves through this tone.
  • Ink Mute (#576f76) — frequency 6 (text 3, border 3). Declared in 7 variables, all *-text-disabled and *-border-disabled roles. The disabled-state ink — every dimmed label, every disabled button border. Tone-2 on the official ladder.
  • Tone-3 (#878a8c) — declared in 3 variables: --color-tone-3, --color-switch-input-background-default, --color-switch-input-background-hover. The off-state switch surface and the mid-grey label tone.
  • Tone-4 (#d3d6da) — declared as --color-tone-4. The light-grey divider and inactive-card border tone.
  • Tone-5 (#eaedef) — frequency 1 (bg 1). Declared in 5 variables including --color-divider-default, --color-input-border, --color-ui-canvas. The hairline border color and the UI canvas wash — the lightest visible grey on the chrome before the page collapses to pure white.
  • Tone-6 (#f6f7f8) — declared in many --color-button-*-background variants. The default surface fill for tertiary buttons, disabled-state surfaces, and the resting text-input background.
  • Canvas (#ffffff) — frequency 1 (bg 1). Declared in 16 variables across --color-tone-7, --color-global-white, --color-ui-modalbackground, --color-input-default, and most *-background-disabled roles. The page background, modal interior, and on-dark text color.
  • Hairline (#edeff1) — declared as --color-tone-5 alternative and across --misc-accordion-border. The 1px border rendered on cards, accordions, and input chrome — the structural divider that handles every "card meets canvas" boundary.
  • Scrim (rgba(26,26,27,0.3)) — declared as --color-scrim. The ink color at 30% opacity, used as the modal overlay and the photo-darkening wash on hero illustrations.

Typography

Every text role on the chrome resolves to the same native font stack — -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif. There is no proprietary face declared on the captured chrome. The CSS variables --font-sans (the body stack), --font-mono ('Noto Mono', Menlo, Monaco, Consolas, monospace for code), and --font-body (0.875rem / 14px base size) configure the entire typographic scale, and every higher-level token (--font-title-h0 through --font-title-h6, --font-button-lg through --font-button-xs, --font-label-default) inherits from --font-sans.

The display tier runs six title sizes — h0 26px, h1 22px, h2 20px, h3 18px, h4 16px, h5 14px, h6 12px — all at weight 500 with line-heights that step from 32px down to 16px in a tight 4-6px rhythm. Tracking stays at normal across every title register; the system does not deploy negative tracking even on the largest 26px hero. The button tier runs four sizes at weight 700 — lg 18px / 22px line-height, md 16px / 20px, sm 14px / 18px, xs 12px / 14px — and matches the four button height tokens (xs 22px, sm 34px, md 44px, lg 54px) one-to-one. The body register is 14px weight 400 with 20px line-height; the small register drops to 12px / 16px. The single typographic register that breaks the lowercase chrome is the label tier — 10px (0.625rem) weight 700 with 0.5px positive tracking and uppercase text-transform, declared through --misc-label-text-transform and --misc-label-letter-spacing. The code-md register switches the stack to 'Noto Mono', Menlo, Monaco, Consolas, monospace at 14px weight 400 for inline code and code-block content.

Layout

The marketing page composes a column-first vertical scroll on a 1440px-wide canvas, with the inner content held to a ~1100px max-width container and the outer page wash running edge-to-edge in the tone-5 #eaedef UI canvas color. The top-nav strip renders as a 48px-tall navy-deep #1d2535 band that sticks to the viewport top with the --boxshadow-navigation (0px 4px 14px rgba(0, 0, 0, 0.1)) elevation. Subsequent feed cards stack vertically with a 16px gap (spacing-base token), each card rendering as a 0.25rem-radius surface on the canvas with a 1px tone-5 #edeff1 hairline border.

The vertical rhythm leans on a 4-8-16-24-32-48px spacing scale exposed through --spacer-4xs (2px), --spacer-2xs (4px), --spacer-xs (8px), --spacer-sm (12px), --spacer-md (16px), --spacer-lg (24px), --spacer-xl (32px), and --spacer-2xl (48px). The button-internal padding tokens are split — --spacer-button-sm-px (16px), --spacer-button-md-px (24px), --spacer-button-lg-px (24px) — and the button heights step in a 22 / 34 / 44 / 54px ladder via --size-button-xs-h through --size-button-lg-h. The size scale runs from --size-2xs (4px) through --size-xs (8px), --size-sm (12px), --size-md (16px), --size-lg (24px), --size-xl (32px), --size-2xl (48px), --size-3xl (64px), --size-4xl (96px), and --size-5xl (128px) — a ten-step scale tuned to a 4-multiple base.

Elevation & Depth

Depth is encoded through four declared elevation tokens — --elevation-xs, --elevation-sm, --elevation-md, --elevation-lg — plus three named box-shadows for chrome features: --boxshadow-navigation, --boxshadow-modal, and --boxshadow-tooltip. The elevation-xs shadow is a tight 1-2px drop at 25% ink opacity; elevation-sm doubles the layer count to a 4px drop plus a 4px ambient layer at 15% opacity; elevation-md sits at an 8px primary plus 12px ambient stack at 10-25% opacity; and elevation-lg lifts to a 12px primary plus 32px ambient stack at 15-25% opacity — the heaviest shadow on the chrome, reserved for the dropdown panel and the floating action menu.

The navigation shadow uses rgba(0, 0, 0, 0.1) at 14px blur — a 10% opacity drop reserved for the sticky top-nav strip. The modal shadow steps up to rgba(26, 26, 27, 0.3) at 15px blur and tints the shadow color with the ink tone-1 #1a1a1b rather than pure black — a chromatic-tinted shadow that pulls the modal-card surface closer to the page's grey ladder. The tooltip shadow combines two layers at 15% opacity — a 1px-blur primary plus a 4px-blur ambient — that reads as a soft hovering chip. The focus-ring elevation (--elevation-focus-ring) renders as a 4px offset of Alien Blue #0079d3, the only chromatic shadow on the chrome and the load-bearing accessibility signal for keyboard navigation.

Shapes

The radius scale is short and intentional: 0px for sharp dividers, 0.25rem (4px) for cards, accordions, inputs, and surface containers, 2rem (32px) for the accordion-large variant (the outlier mid-tier), and 9999px (declared as --radius-full: 624.9375rem) for every interactive pill — buttons, switches, status chips, badges, the focus ring. Pill-or-card binary: every interactive element on the chrome resolves to a full-pill, every card surface snaps to the tight 4px corner. Unlike the convention of running a single radius across an entire system (Bootstrap's 4px, Material's 4px or 8px), Reddit splits the geometry across two extremes — full-pill for click affordances, near-square for content surfaces — and the gap signals "interactive vs. canvas" at a glance.

The accordion-size radius (--radius-accordion-size) sits at 0.25rem, matching the card tier; the radius-sm token sits at 0.25rem; the radius-lg token sits at 2rem for the secondary accordion / panel-large surface. There is no 8px, 12px, or 16px radius declared anywhere on the chrome — the system skips the mid-tier entirely and runs only the 0 / 4 / 32 / 9999px steps.

Components

  • button-primary — Alien Blue {colors.alien-blue} (#0079d3) fill, white text, button-md typography at 16px weight 700, 44px tall, 24px horizontal padding, 9999px full-pill radius. The primary CTA shape, used for "Sign up", "Continue", and the in-product "Join community" actions.
  • button-primary-hover — Action Primary {colors.action-primary} (#24a0ed) fill, same geometry. The hover state lifts the saturation rather than darkening — inverts the typical hover-darkens convention but characteristic of Reddit's blue stack.
  • button-primary-disabled — Tone-6 {colors.tone-6} (#f6f7f8) fill with ink-mute {colors.ink-mute} (#576f76) text. The disabled register pulls the button fully into the grey ladder.
  • button-secondary — Transparent fill, Action Secondary {colors.action-secondary} (#006cbf) text, 1px Action Secondary border, 44px × 24px geometry. The outline-button variant — the only chrome surface that exposes a colored border.
  • button-tertiary — Tone-6 {colors.tone-6} (#f6f7f8) fill, Action Secondary {colors.action-secondary} (#006cbf) text, 34px tall, 16px horizontal padding, full-pill. The smaller utility CTA used for inline actions.
  • button-plain — Transparent fill, Action Secondary text, 34px × 16px geometry. The borderless plain-button variant for low-emphasis actions.
  • upvote-button — Transparent fill, Orangered {colors.orangered} (#d93a00) icon and text, 22px tall, 4px × 8px padding, full-pill. The signature upvote affordance — the only chrome surface that renders Orangered.
  • downvote-button — Transparent fill, Periwinkle {colors.periwinkle} (#7193ff) icon and text, same 22px × 4px × 8px geometry. The signature downvote affordance — the only chrome surface that renders Periwinkle.
  • top-nav — Navy-deep {colors.navy-deep} (#1d2535) fill, white text, body-md typography, 48px tall, 8px × 16px padding. The sticky header strip with the --boxshadow-navigation elevation.
  • nav-link — Transparent fill, Action Secondary text at body-md, 20px line-height. The top-nav link items.
  • text-input — Tone-6 {colors.tone-6} (#f6f7f8) fill, ink text, body-md typography, 40px tall, 12px horizontal padding, 4px corner radius, 1px tone-5 #edeff1 hairline border.
  • text-input-focus — Canvas white fill, 1px Action Secondary #006cbf border, same geometry. Focus is signaled by the border-color shift plus the 0 0 0 0.25rem #0079d3 focus-ring elevation.
  • card — Canvas white fill, ink text, body-md typography, 4px corner radius, 16px padding, 1px tone-5 #edeff1 border. The default subreddit-card and feed-item surface.
  • accordion-panel — Same surface chrome as card, with 8px × 16px padding for the lower-density accordion variant.
  • status-pill-mod — Mod Green {colors.mod-green} (#46d160) fill, white label-uppercase text at 10px weight 700 with 0.5px tracking, full-pill, 2px × 8px padding, 16px tall. The moderator identity badge.
  • status-pill-admin — Orangered {colors.orangered} (#d93a00) fill, white label-uppercase text, same geometry. The admin identity badge — the second chrome surface (after the upvote arrow) that renders Orangered.
  • status-pill-error — Alert Red {colors.alert-red} (#ea0027) fill, white label-uppercase text, same geometry. The destructive / error-state pill.
  • status-pill-nsfw — NSFW Pink {colors.nsfw-pink} (#ff3881) fill, white label-uppercase text, same geometry. The "NSFW" content-warning tag.
  • switch-on — Alien Blue {colors.alien-blue} (#0079d3) fill, 20px tall full-pill. The switch checked-state surface.
  • switch-off — Tone-3 {colors.tone-3} (#878a8c) fill, 20px tall full-pill. The switch unchecked-state surface.
  • modal — Canvas white fill, ink text, body-md typography, 4px corner radius, 24px padding, --boxshadow-modal elevation tinted with ink tone-1.
  • focus-ring — Transparent fill, 4px Alien Blue #0079d3 border. The accessibility-only outline that wraps any keyboard-focused interactive surface.

Do's and Don'ts

Do keep Orangered #d93a00 to upvote arrows, admin badges, and the live-stream identity dot only. The Orangered budget is bound to four CSS variables (--color-global-orangered, --color-action-upvote, --color-identity-admin, --color-category-live) and each one is a fixed semantic role. Using Orangered as a primary CTA fill breaks the split-voltage discipline that defines the brand.

Do render every interactive button as a 9999px full-pill. The four button-height tiers (22px / 34px / 44px / 54px) all share the same pill geometry — switching any of them to a 4px or 8px radius collapses the pill-or-card binary the chrome relies on.

Do keep the uppercase 10px label register at exactly 0.5px letter-spacing. The --misc-label-letter-spacing variable hard-codes the tracking; dropping it to 0 or stretching it to 1px breaks the label tier's role as the single typographic register that shouts.

Don't sub the native operating-system sans stack for a proprietary face like Inter or Roboto Flex on the marketing chrome. The system font choice is load-bearing — Reddit reads as the OS's own forum precisely because the type is San Francisco on macOS, Segoe on Windows, and Roboto on Android. Pinning the stack to one face collapses the platform-native rendering the brand has trusted for 19 years.

Don't use Periwinkle #7193ff as a primary-button fill or a link color. Periwinkle is bound exclusively to --color-action-downvote — assigning it any other role breaks the one-color-one-role discipline that splits the voting voltage in the first place. The natural temptation to use Periwinkle as a "secondary accent" because it's the only other saturated chrome color must be resisted.

Don't drop the focus-ring offset from 0.25rem to 0.0625rem because "thinner looks lighter." The 4px ring at Alien Blue #0079d3 is the system's load-bearing accessibility signal — the only chromatic shadow on the chrome, and the single visual cue that says "this element is keyboard-focused."

Don't introduce a third radius between 0.25rem (4px) and 9999px. The system runs the pill-or-card binary intentionally; adding an 8px or 12px tier produces a third "kind of rounded" geometry that erases the chrome-vs-canvas boundary. The one exception is the 2rem (32px) accordion-large variant — keep that as the only mid-tier and don't expand the radius vocabulary further.

Don't tint shadow colors with pure black. The --boxshadow-modal token uses rgba(26, 26, 27, 0.3) — the tone-1 ink color, not pure-black rgba(0,0,0,0.3) — which pulls the modal elevation into the same grey ladder as the rest of the chrome. Substituting pure black flattens the chromatic harmony the system uses to keep depth and ink tied to one ladder.

Known Gaps

  • In-product feed shell (subreddit sidebar, comment-tree indentation, vote-count animation) is out of scope — the captured surface is the public chrome only. The component recipes here cover marketing chrome, not the full timeline.
  • Mobile breakpoint behavior is not captured. The responsive collapse pattern (hamburger nav, single-column feed reflow, bottom-tab bar on iOS/Android web) is known but not extracted from this snapshot.
  • Dark mode — Reddit ships a full dark theme that inverts the tone ladder (canvas drops to the ink tone-1, body text lifts to a soft off-white near tone-7) and remaps the blue stack for legibility on dark surfaces. The captured snapshot is the light theme only.
  • Motion — vote-arrow tap feedback (the orangered fill that bursts on click), the karma-tick increment animation, and the chat-message slide-in are not in the captured tokens.
  • Hover and focus state pixel-precise treatments for nav links, inline links, and the upvote / downvote arrow hover states are only partially extracted.
  • Form validation — error-state borders, helper-text styles, and inline form-validation messaging beyond the alert-red and alert-amber color tokens are not captured.
  • Reddit Coins chrome — the gold-tier subscriber UI, coin-purchase modal, and award-bestowal flow are out of scope; only the #ddbd37 coin-yellow identity token is captured.

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
  • Page sections in 56 categories, from heroes and pricing tables to dashboards and settings, on every framework and UI library, in your theme.Blocks: All 6,181 blocks
  • Complete Next.js sites for startups, SaaS, agencies and portfolios, every page designed, ready to ship.Templates: All 14 templates
  • Your AI agent searches, previews and installs any component, block, icon or DESIGN.md from a prompt: 22 tools in Claude Code, Cursor, VS Code and 35 more clients.MCP server: 38 AI clients
  • Buttons with motion and states of their own, from an arrow that slides in to a burst of confetti.Animated buttons: All 35 buttons
  • Typewriters, scrambles, counters and more, for headlines, labels and numbers.Text effects: All 97 effects
  • Animated backgrounds for heroes, sections and cards, from a soft aurora to a flock that flees the cursor. Most are pure CSS.Backgrounds: All 100 backgrounds
  • WebGPU shaders, from a slow aurora to a black hole, each drawing only while it's on screen.Shaders: All 100 shaders
  • One design and one theme on all four: the components, blocks and effects are built for each framework.Frameworks: React, Vue, Svelte, Solid
  • React on Base UI, Radix UI, React Aria or Ark UI: install the version for the library your project already uses. Vue, Svelte and Solid run on Ark UI.UI libraries: Base UI, Radix, Aria, Ark
  • From a button to a date picker, a color picker or a guided tour: accessible, typed in TypeScript, each with live demos.Components: All 174 components
  • Real-world patterns built from the components, in 53 galleries: forms, tables, menus, dialogs and more.Examples: All 1,103 examples
  • Area, bar, line, pie, radar and radial charts on TanStack Charts, on every framework. React also gets the Recharts originals.Charts: All 70 charts
  • Debounce, local storage, media queries and more: each hook is one typed file you own.React hooks: All 35 hooks
  • From 222 libraries, Lucide, Heroicons, Tabler and Material Symbols among them, as SVG or a React component in one command.Icons: 294k+ icons
  • Stripe, Linear, Apple and 497 more: a brand's colors, typography and components in one file your AI agent builds from.DESIGN.md files: All 500 brands
  • Restyle every component and block at once: 8 styles, 7 grays, 18 colors and 5 radii, shared as a shadcn preset code.Theme builder: 8 styles × 18 colors
  • 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
  • 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
  • Secure checkout via Stripe
  • Code lives in your repo
  • Keep what you've shipped if you cancel
  • License terms

4.9 out of 5 from 150+ developers

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
  • Cancel anytime
  • Keep what you've shipped