Skip to content

Charles Schwab Design System

Charles Schwab's marketing system as a DESIGN.md file. Bot-blocked extraction, fallback scaffold drawn from public brand identity. Schwab Blue voltage, conservative ink-on-white editorial chrome. Tokens for React, Next.js, and AI coding 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
#00a0df
Typeface
system-ui
Shape
Sharp
Base radius
6px
Colors
8
Type tokens
10
Components
13
Spacing values
8

About

About Charles Schwab DESIGN.md

Curated by Dov Azencot · Updated May 19, 2026 · Source schwab.com (opens in a new tab)

Charles Schwab's marketing site does something unusual for a public investment firm: it defends itself behind a bot-fight wall that returns an authorization error to any automated browser request. The deterministic extractor for this directory hit the wall on the first try, and the captured screenshot is a single line of Times serif rendering an apology message ("We're sorry, but we were unable to authorize your request. Please call us...") on a near-white canvas with the Schwab Logo image referenced but not loaded. The structural-tier extract is a single hex — pure ink — and the typography extract is Times at 16px / 400, the browser default serif. The bot-fight wall is so aggressive that almost no brand tokens survive the extraction.

The DESIGN.md file packages what is observable from public Schwab brand identity sources alongside the limited captured data. Inside: a small color tier anchored on Schwab Blue with structural ink-on-white surfaces; a typography scaffold acknowledging the brand's custom sans display family (Schwab ships a proprietary sans for marketing surfaces) with conservative weight ladder; a standard 4-step radius scale; an 8px spacing base; and 13 components definitions covering the conservative editorial chrome a wealth-management brand carries. The file is honest about the gap — the bot-fight wall means the token frequencies, exact hex values, and component dimensions are inferred from public brand materials rather than measured directly.

Feed this file to Claude or Cursor and it produces a conservative wealth-management marketing scaffold: ink-on-white composition, blue voltage held at moderate frequency rather than as a saturated canvas, editorial paragraph rhythm without the photographic-lifestyle hero bands Capital One and Chase ship. The one move worth flagging: this file is a scaffold, not a deterministic capture. A team building against Schwab's actual marketing surface should re-run extraction against the live page after dismissing the bot-fight challenge, or consult Schwab's brand-asset portal directly. The file as written is a starting point, not a ground-truth specification.

What makes it distinct

5

  1. Bot-fight wallthe deterministic extractor hit an authorization error page, returning Times serif on near-white with no usable brand tokens
  2. Schwab Blue voltagethe brand identity Schwab ships externally anchors on a deep saturated cyan voltage paired with a deeper navy secondary
  3. Conservative editorial chromeink-on-white composition without the photographic-lifestyle hero bands Capital One and Chase use
  4. Custom display sans at weight 700Schwab's brand identity carries a proprietary sans-serif at heavier weights than Capital One's editorial weight 300
  5. Limited-extraction scaffoldthis file documents what is publicly observable about the brand and notes the gap where the deterministic extraction failed

schwab.com

Live at schwab.com

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

Charles Schwab's website at schwab.com

Colors

8 colors

Charles Schwab's system runs on #00a0df as its primary voltage, used in 1 of 13 components. Type is set in system-ui across 10 tokens from 12px to 48px, weights 400–700. Shape language is sharp — components average 4px corner radius, favoring crisp rectangles.

Brand & Accent

Sparing, CTA-only voltage · 2

Surface

Page and card backgrounds · 2

Text

Headlines, body, captions · 3

Borders & Hairlines

Dividers, outlines, rules · 1

Typography

10 type tokens

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

  • display-xl48px · weight 700 · lh 56pxThe quick brown fox jumps over the lazy dog
  • display-md32px · weight 700 · lh 40pxThe quick brown fox jumps over the lazy dog
  • heading-md24px · weight 600 · lh 32pxThe quick brown fox jumps over the lazy dog
  • heading-sm18px · weight 600 · lh 28pxThe quick brown fox jumps over the lazy dog
  • body-lg18px · weight 400 · lh 28pxThe quick brown fox jumps over the lazy dog
  • body-md16px · weight 400 · lh 24pxThe quick brown fox jumps over the lazy dog
  • body-sm14px · weight 400 · lh 20pxThe quick brown fox jumps over the lazy dog
  • caption12px · weight 400 · lh 18pxThe quick brown fox jumps over the lazy dog
  • button-md16px · weight 600 · lh 24pxThe quick brown fox jumps over the lazy dog
  • fallback-serif16px · weight 400 · lh 18pxThe quick brown fox jumps over the lazy dog

Layout

Radii and spacing

5 corner radii and 8 spacing values. Shape language: sharp.

Radii

  • none0px
  • sm4px
  • md6px
  • lg8px
  • full9999px

Spacing

  • xs4px
  • sm8px
  • md12px
  • base16px
  • lg24px
  • xl32px
  • 2xl48px
  • 3xl64px

Components

13 components

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

  • Hero Section
    hero-sectionHero Section
  • Hero Heading
    hero-headingHero Heading
  • Section Heading
    section-headingSection Heading
  • Body Paragraph
    body-paragraphBody Paragraph
  • Body Paragraph Muted
    body-paragraph-mutedBody Paragraph Muted
  • Button Primary
    button-primaryButton Primary
  • Button Secondary
    button-secondaryButton Secondary
  • Top Nav
    top-navTop Nav
  • Nav Link
    nav-linkNav Link
  • Card
    cardCard
  • Surface Card
    surface-cardSurface Card
  • Type here…
    text-inputText Input
  • Footer
    footerFooter

In use

The system, in use

Charles Schwab'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.
Active users12,489+8.4%
Revenue$84.2k+12.1%
Sessions32,118+3.2%
Errors47−18%
Dashboard4-tile analytics grid — the dev-tools / SaaS-platform archetype.

FAQ

Charles Schwab design system FAQ

Common questions about Charles Schwab'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 Charles Schwab 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 Charles Schwab.

  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 Charles Schwab'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

Charles Schwab's marketing surface is the rare brand in this directory that the deterministic extractor could not reach. Defended chrome. The site runs an aggressive bot-fight wall that intercepts headless-browser requests well before the marketing chrome renders, returning a Times-serif apology message on a near-white error page in its place. Where every other US bank in the directory (Chase, Capital One, Ally, Wells Fargo) extracts cleanly, Schwab's wall is uncommonly assertive — the captured screenshot is a single line of error text, and the structural extract is a single hex ({colors.ink} — #000000) at 10 captured occurrences, all on the error page. The brand voltage, typeface, and component dimensions are not directly observable through automated capture.

This file is therefore a scaffold rather than a deterministic capture. The token values declared in the frontmatter — Schwab Blue ({colors.primary} — #00a0df) as the documented brand voltage, the deeper navy {colors.primary-dark} as the secondary tier, the conservative ink-on-white structural tier — are drawn from publicly-documented Schwab brand identity (corporate materials, press kits, cached previews) rather than from a measured live capture. The frequencies, exact component dimensions, and the proprietary display sans Schwab ships externally are not represented here. The file is honest about the gap.

The chrome register is conservative wealth-management editorial. Where Capital One paints lifestyle photography under weight-300 display, and where Chase fills the hero band with saturated blue and stacks dense cash-bonus offer cards, Schwab's external brand identity carries calmer ink-on-white composition, smaller display tiers, and white-space-driven rhythm. The visual register communicates wealth-management gravitas — conservative for a generation of retired investors — rather than transactional consumer banking. The exact dimensions and rhythm patterns are not captured here.

Key Characteristics:

  • Bot-fight wall blocked the deterministic extraction — the captured screenshot is a single-line authorization error page rather than the live marketing surface.
  • The captured structural ink is {colors.ink} (#000000) at 10 occurrences (5 text, 5 border), all on the error page.
  • The captured typography is Times serif at 16px / 400 — the browser default font on the error page, not a legitimate brand typeface choice.
  • Documented Schwab Blue voltage ({colors.primary} — #00a0df) and deeper navy ({colors.primary-dark} — #0033a0) are drawn from public Schwab brand materials, not from the live page extraction.
  • Conservative editorial register inferred from public Schwab brand identity — calmer than the transactional consumer-banking register Chase and Capital One ship.
  • System-sans fallback typography in this scaffold — Schwab's actual marketing surface ships a proprietary sans for display tiers that is not captured here.
  • 4-step radius scale (4 / 6 / 8 / 9999px) — conservative banking radius without committing to the pill-fintech convention or the sub-pill 2px banking-standard.
  • This file is a starting point for AI tooling; a team building against the live Schwab marketing surface should re-run extraction after dismissing the bot-fight challenge.

Colors

Brand

  • Schwab Blue ({colors.primary} — #00a0df): frequency not captured. The documented brand voltage from Schwab's external corporate brand identity — a deep saturated cyan that carries primary CTAs and link text on the live marketing surface. Not observable in the captured extraction because the extractor was blocked at the bot-fight wall.
  • Schwab Navy ({colors.primary-dark} — #0033a0): frequency not captured. The deeper navy secondary voltage — carries secondary CTAs, active link states, and emphasis blocks on the live marketing surface. Inferred from public Schwab brand materials.

Surface

  • Canvas ({colors.canvas} — #ffffff): frequency not captured. The expected page floor — pure white. Inferred from the conservative wealth-management register Schwab ships externally.
  • Surface-1 ({colors.surface-1} — #f5f5f5): frequency not captured. The expected off-white emphasis surface for feature cards and footer band. Inferred from Schwab's public brand materials.

Text

  • Ink ({colors.ink} — #000000): frequency 10 — used as text (5), border (5). The single captured token from the extraction. All 10 occurrences appear on the bot-fight error page rather than on the live marketing surface. Pure black is also the expected dominant text color on the live page.
  • Ink Soft ({colors.ink-soft} — #262626): frequency not captured. The expected secondary text color for body paragraphs, inferred from the conservative editorial register.
  • Muted ({colors.muted} — #666666): frequency not captured. The expected tertiary text color for secondary nav labels and footer captions.

Hairline

  • Hairline ({colors.hairline} — #e5e5e5): frequency not captured. The expected border tone for card outlines and the top-nav bottom rule. Inferred from the conservative chrome register.

Typography

Font Family

The captured extraction returned only Times serif at 16px / 400 — the browser default font rendered on the bot-fight error page. This is not a legitimate brand typeface choice; it is what the browser falls back to when the error page does not load a custom font.

Schwab's actual marketing surface ships a proprietary sans-serif display family alongside a system-sans body fallback. The display sans is not observable through the blocked extraction; this scaffold uses a system-ui fallback stack across every tier to document the typographic ladder Schwab's external brand identity carries.

Hierarchy

TokenSizeWeightLine HeightUse
{typography.display-xl}48px70056pxHero h1 (inferred)
{typography.display-md}32px70040pxSection h2 (inferred)
{typography.heading-md}24px60032pxSub-section heads (inferred)
{typography.heading-sm}18px60028pxTertiary heads (inferred)
{typography.body-lg}18px40028pxLead paragraphs (inferred)
{typography.body-md}16px40024pxDefault running text (inferred)
{typography.body-sm}14px40020pxSecondary running text (inferred)
{typography.caption}12px40018pxLegal disclosures (inferred)
{typography.button-md}16px60024pxPrimary CTA labels (inferred)
{typography.fallback-serif}16px40018pxTimes serif on the bot-fight error page (captured)

Principles

The captured page shows only the fallback-serif token in actual use — Times at 16px / 400 on the bot-fight error message. Every other token in the hierarchy is inferred from Schwab's external brand identity rather than measured from the live page.

The inferred display register sits at weight 700 — heavier than Capital One's editorial weight 300, in line with Chase's transactional weight 700. The conservative wealth-management positioning suggests display tiers stay below 48px on the live surface, with most marketing headlines landing in the 32-40px range rather than the 56px+ heroic tier some consumer brands ship.

Note on Font Substitutes

Without a captured proprietary font name to substitute against, the substitute question is open. Inter at weights 400 and 700, or Source Sans 3 at the same weights, are conservative open-source substitutes that fit the wealth-management register. The system-ui stack declared in this scaffold falls back to whatever the operating system ships — San Francisco on Apple, Segoe UI on Windows, Roboto on Android.

Layout

Spacing System

  • Base unit: 8px (inferred from the conservative wealth-management register; not directly captured).
  • Tokens: {spacing.xs} 4px · {spacing.sm} 8px · {spacing.md} 12px · {spacing.base} 16px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.2xl} 48px · {spacing.3xl} 64px.
  • Section padding (vertical): the captured extraction shows only one spacing value at 16px (2 occurrences) and one at 8px (1 occurrence) — both from the bot-fight error page. The actual live rhythm is not captured.
  • Card internal padding: the inferred value for a conservative wealth-management surface is 24-32px on feature cards.

Grid & Container

  • Max content width: inferred at ~1200px on the editorial sections and ~720px on centered prose bands. Not directly captured.
  • Hero block: inferred as an ink-on-white composition with a 48px h1 and a primary CTA below — without the saturated-blue hero band Chase ships or the lifestyle-photography hero band Capital One ships.
  • Below-fold sections: inferred as a 3-up feature row with conservative ink-on-white cards, followed by editorial prose bands and a footer disclosure section.

Rhythm

The expected rhythm for a conservative wealth-management marketing surface is paragraph-led rather than CTA-led. Where Chase stacks dense offer cards with dollar-amount emphasis below the fold, Schwab's external brand identity carries longer-form editorial paragraphs aimed at higher-net-worth investors who want to read rather than to click. The exact band-by-band rhythm is not captured here.

Elevation

The expected elevation tier for a conservative wealth-management marketing surface is flat with hairline outlines. Schwab's external brand identity does not appear to use a layered-shadow elevation system; cards are expected to sit on the page floor with 1px {colors.hairline} borders doing the elevation work. The exact shadow values are not captured.

  • Flat (no shadow): expected for all surfaces on the live marketing page.
  • Hairline: {colors.hairline} (#e5e5e5) is expected to carry card outlines, input field borders, and the top-nav bottom rule.

Shapes

The expected radius scale is conservative banking: small-step rounding without committing to either the sub-pill 2px banking-standard or the fully-rounded pill-fintech convention.

  • {rounded.none} 0px — section bands and full-bleed surfaces.
  • {rounded.sm} 4px — text inputs and small chips.
  • {rounded.md} 6px — primary buttons.
  • {rounded.lg} 8px — cards and feature panels.
  • {rounded.full} 9999px — circular avatars and icon containers.

The captured extraction returned zero radius values from the live page; this scale is inferred from Schwab's external brand identity. A live re-run after dismissing the bot-fight challenge would refine these values.

Components

hero-section — Inferred as a white {colors.canvas} canvas, ink text, no border-radius, 64×32px padding. Holds the inferred hero h1 at {typography.display-xl} (48px / 700) and a primary CTA. Without the saturated-blue hero band Chase ships.

hero-heading — Inferred as ink {colors.ink} text, 48px / 700. Not directly captured.

section-heading — Inferred as ink text, 32px / 700. Used for the below-fold section heads.

body-paragraph — Inferred as ink-soft {colors.ink-soft} running-text at {typography.body-lg} (18px / 400). The expected workhorse paragraph style on a wealth-management editorial surface.

body-paragraph-muted — Muted {colors.muted} variant for secondary copy and metadata.

button-primary — Inferred as Schwab Blue {colors.primary} fill, white text, {rounded.sm} 4px radius, 12×24px padding, 44px height. The expected canonical primary CTA.

button-secondary — Inferred as white fill, navy text, 1px navy border, 4px radius, 44px height. The expected canonical secondary CTA.

top-nav — Inferred as white {colors.canvas} surface, ink labels, 64px height, 1px bottom hairline. Carries the Schwab wordmark flush left and product links center.

nav-link — Inferred as transparent background, ink-soft text in {typography.body-md} (16px / 400), 8×12px padding.

card — Inferred as white fill, 1px hairline border, {rounded.lg} 8px radius, 24px internal padding. The expected default feature card.

surface-card — Inferred as {colors.surface-1} (#f5f5f5) fill, ink text, 8px radius, 32px padding. The expected emphasis surface.

text-input — Inferred as white fill, ink text, 1px hairline border, 4px radius, 10×12px padding, 44px height.

footer — Inferred as {colors.surface-1} canvas, muted caption text at 14px / 400, 48×32px padding.

Do's and Don'ts

Do treat this file as a starting scaffold rather than as a ground-truth specification. The bot-fight wall blocked the deterministic extraction; every value below the ink-on-white structural tier is inferred from public Schwab brand materials.

Do anchor the brand voltage on Schwab Blue ({colors.primary} — #00a0df) with the deeper navy ({colors.primary-dark} — #0033a0) as the secondary tier. Both are documented in Schwab's external corporate brand identity.

Do keep the editorial register conservative. Schwab's wealth-management positioning calls for longer-form paragraphs and calmer ink-on-white composition rather than the photographic-lifestyle hero bands Capital One and Chase ship.

Do re-run extraction against the live Schwab marketing surface before treating any token here as authoritative. The bot-fight wall is the dominant capture failure mode; a fresh capture after the wall is dismissed would refine every value in this file.

Don't treat the Times serif font ({typography.fallback-serif}) as a legitimate Schwab brand typeface. It is the browser default font that rendered on the bot-fight error page; the live marketing surface ships a proprietary sans display family that is not captured here.

Don't fill the hero band with saturated brand blue the way Chase does. Schwab's external brand identity holds the blue at moderate frequency on CTAs and links rather than as the canvas voltage Chase ships.

Don't stack dense dollar-amount offer cards below the fold the way Chase does. The wealth-management register calls for paragraph-led editorial content aimed at higher-net-worth investors, not transactional consumer-banking cash-bonus tiles.

Don't assume the frequencies, exact dimensions, or component proportions in this file match the live Schwab marketing surface. Every value below the captured structural ink at {colors.ink} is inferred rather than measured.

Known Gaps

  • Bot-fight wall blocked the deterministic extraction. The captured page is a single-line Times-serif authorization error page rather than the live marketing surface. The structural extract is one hex ({colors.ink} — #000000) at 10 occurrences, all on the error page.
  • Brand voltage frequencies not captured. Schwab Blue ({colors.primary} — #00a0df) and the deeper navy ({colors.primary-dark} — #0033a0) are documented from Schwab's external brand identity, not measured from the live page. The exact usage-count, text vs. border vs. background distribution is not represented.
  • Proprietary display sans not captured. Schwab's actual marketing surface ships a custom sans-serif display family that is not observable through the blocked extraction. This scaffold uses a system-ui fallback stack across every tier.
  • Component dimensions inferred, not measured. Every padding, height, border-radius, and font-size in the components map is inferred from Schwab's public brand identity and from the conservative wealth-management register. A live re-run after dismissing the bot-fight challenge would refine each value.
  • Hover, focus, and error states not captured. None of the interactive state matrices are observable through the blocked extraction.
  • Dark mode, motion, photography treatments not captured. Any visual treatments Schwab ships on the live surface (lifestyle imagery, animation easing, scroll-driven transitions) are not represented in this file.
  • Recommendation for a team using this file. Re-run bun run design:extract after dismissing the Schwab bot-fight challenge (manually open the URL once, accept cookies, and capture the live page with --force or with a non-headless browser flag). The result will refine every token in this file from inferred to measured.

Banking & Payments

More systems like this

More DESIGN.md files in Banking & Payments.

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