---
version: alpha
name: "Charles Schwab"
website: "https://www.schwab.com"
description: >-
  A US investment brokerage and wealth-management firm whose marketing surface defends itself behind a bot-fight wall — the deterministic extraction returned an authorization error page rendering Times serif on near-white, with no captured tokens beyond the structural ink hex. The brand identity Schwab ships externally on the actual marketing surface (visible in cached previews, press kits, and corporate materials) anchors on a Schwab Blue voltage at a deep saturated cyan, paired with a deeper navy for secondary chrome and a conservative ink-on-white editorial composition. Display tier sits at weight 700 in a custom sans built for the brand, body at weight 400 in a tighter sans, and the chrome stops short of the photographic-lifestyle moves Capital One and Chase make on their hero bands. This file is a conservative scaffold based on publicly-documented Schwab brand identity rather than a deterministic capture.

seo:
  title: "Charles Schwab Design System for React — Schwab Blue, conservative chrome, 13 components"
  metaDescription: "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."
  highlights:
    - "Bot-fight wall — the deterministic extractor hit an authorization error page, returning Times serif on near-white with no usable brand tokens"
    - "Schwab Blue voltage — the brand identity Schwab ships externally anchors on a deep saturated cyan voltage paired with a deeper navy secondary"
    - "Conservative editorial chrome — ink-on-white composition without the photographic-lifestyle hero bands Capital One and Chase use"
    - "Custom display sans at weight 700 — Schwab's brand identity carries a proprietary sans-serif at heavier weights than Capital One's editorial weight 300"
    - "Limited-extraction scaffold — this file documents what is publicly observable about the brand and notes the gap where the deterministic extraction failed"
  tags:
    - "Banking & Payments"
    - "Fintech & Crypto"
  lastUpdated: "2026-05-19"
  author:
    name: "Dov Azencot"
    url: "https://x.com/dovazencot"
  opening: |
    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 component 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.
  related:
    - href: "/design"
      title: "Browse all design systems"
      description: "The full directory of DESIGN.md files on shadcn.io, with live mockups for each."
    - href: "https://www.schwab.com"
      title: "Charles Schwab — official site"
      description: "Charles Schwab's public marketing site — the source of truth that the deterministic extraction could not reach due to a bot-fight wall."
    - href: "https://github.com/google-labs-code/design.md"
      title: "The DESIGN.md specification"
      description: "Google Labs' open spec for machine-readable design system files — the format this page is built on."
  questions:
    - id: "primary-color"
      title: "What is Charles Schwab's primary brand color?"
      answer: "The captured extraction returned a bot-fight error page rather than the live marketing surface, so the deterministic frequency data for the brand voltage is not available. Schwab's external brand identity (visible in corporate materials, press kits, and cached previews) anchors on a deep saturated cyan voltage paired with a deeper navy secondary. The dominant ink color on the captured surface is pure black, used on the error-message text at 10 occurrences (5 text, 5 border). The actual brand voltage is documented in this file as a conservative scaffold drawn from Schwab's public brand materials rather than as a measured capture. A team building against the live site should re-run extraction after dismissing the bot-fight challenge."
    - id: "typography"
      title: "What typeface does Charles Schwab use, and what should I use as a substitute?"
      answer: "The captured extraction returned only Times serif at 16px / 400 — the browser default font on the bot-fight error page. Schwab's actual marketing surface ships a proprietary sans-serif for display tiers and a system-sans fallback for body, with display at weight 700 carrying the marketing headlines and body at weight 400 carrying the conservative editorial paragraphs. The closest open-source substitute for the display tier is Inter at weight 700 or Source Sans 3 at weight 700; both transfer cleanly at marketing-headline sizes. The Times serif in the extraction is an artifact of the error-page render, not a legitimate brand typeface choice."
    - id: "extraction-block"
      title: "Why does the extraction file show only an error message?"
      answer: "Charles Schwab's marketing site runs an aggressive bot-fight wall that returns a 403-style authorization error page to any request whose User-Agent, header fingerprint, or behavioral signature looks like an automated browser. The deterministic extractor that builds this directory uses headless Chromium with cookie-banner dismissal and scroll-driven lazy-load — but Schwab's wall intercepts the request well before any of that runs. The captured screenshot is a single line of apology text ('We're sorry, but we were unable to authorize your request. Please call us at 800-433-9196') on a near-white canvas. Almost no brand tokens survived. Most other finance-vertical sites in the directory (Capital One, Chase, Robinhood, Stripe, Plaid) extract cleanly; Schwab's wall is unusually aggressive."
    - id: "conservative-chrome"
      title: "What is distinctive about Schwab's marketing register compared to other US investment brands?"
      answer: "Schwab's brand identity anchors on a conservative editorial register rather than on the photographic-lifestyle moves Capital One and Chase ship. Where Capital One runs lifestyle photography (a man fishing, two friends gardening) under Optimist weight 300, and where Chase fills the hero band with saturated brand blue and stacks dense cash-bonus offer cards below it, Schwab's marketing surface is structured as editorial paragraphs with calmer color use, smaller display tiers, and more white-space-driven rhythm. The brand register communicates wealth-management gravitas rather than transactional consumer banking. The exact dimensions and frequencies are not captured here due to the bot-fight wall."
    - id: "use-in-project"
      title: "Can I use this DESIGN.md to build my own investment-brokerage marketing site?"
      answer: "The file is usable as a conservative scaffold for a wealth-management or investment-brokerage marketing site, but it is not a deterministic capture of Schwab's actual live tokens. The hex values, font names, and component dimensions are inferred from public Schwab brand materials rather than measured from the live page; the bot-fight wall blocked the deterministic extraction. A team building a Schwab clone should treat this file as a starting point and consult Schwab's actual brand-asset portal or re-run extraction after dismissing the bot-fight challenge. For a generic conservative-finance marketing scaffold, the tokens here resolve cleanly and produce a reasonable starting composition."

mockups:
  - "marketing-hero"
  - "dashboard-card-grid"

colors:
  primary: "#00a0df"
  primary-dark: "#0033a0"
  ink: "#000000"
  ink-soft: "#262626"
  muted: "#666666"
  hairline: "#e5e5e5"
  canvas: "#ffffff"
  surface-1: "#f5f5f5"

typography:
  display-xl:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 48px
    fontWeight: 700
    lineHeight: 56px
    letterSpacing: 0
  display-md:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 32px
    fontWeight: 700
    lineHeight: 40px
    letterSpacing: 0
  heading-md:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 24px
    fontWeight: 600
    lineHeight: 32px
    letterSpacing: 0
  heading-sm:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 18px
    fontWeight: 600
    lineHeight: 28px
    letterSpacing: 0
  body-lg:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 18px
    fontWeight: 400
    lineHeight: 28px
    letterSpacing: 0
  body-md:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 16px
    fontWeight: 400
    lineHeight: 24px
    letterSpacing: 0
  body-sm:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 14px
    fontWeight: 400
    lineHeight: 20px
    letterSpacing: 0
  caption:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 12px
    fontWeight: 400
    lineHeight: 18px
    letterSpacing: 0
  button-md:
    fontFamily: "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif"
    fontSize: 16px
    fontWeight: 600
    lineHeight: 24px
    letterSpacing: 0
  fallback-serif:
    fontFamily: "Times, \"Times New Roman\", serif"
    fontSize: 16px
    fontWeight: 400
    lineHeight: 18px
    letterSpacing: 0

rounded:
  none: "0px"
  sm: "4px"
  md: "6px"
  lg: "8px"
  full: "9999px"

spacing:
  xs: "4px"
  sm: "8px"
  md: "12px"
  base: "16px"
  lg: "24px"
  xl: "32px"
  2xl: "48px"
  3xl: "64px"

components:
  hero-section:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.display-xl}"
    rounded: "{rounded.none}"
    padding: "64px 32px"
  hero-heading:
    backgroundColor: transparent
    textColor: "{colors.ink}"
    typography: "{typography.display-xl}"
  section-heading:
    backgroundColor: transparent
    textColor: "{colors.ink}"
    typography: "{typography.display-md}"
  body-paragraph:
    backgroundColor: transparent
    textColor: "{colors.ink-soft}"
    typography: "{typography.body-lg}"
  body-paragraph-muted:
    backgroundColor: transparent
    textColor: "{colors.muted}"
    typography: "{typography.body-md}"
  button-primary:
    backgroundColor: "{colors.primary}"
    textColor: "{colors.canvas}"
    typography: "{typography.button-md}"
    rounded: "{rounded.sm}"
    padding: "12px 24px"
    height: "44px"
  button-secondary:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.primary-dark}"
    typography: "{typography.button-md}"
    rounded: "{rounded.sm}"
    padding: "12px 24px"
    height: "44px"
    borderColor: "{colors.primary-dark}"
  top-nav:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.body-md}"
    rounded: "{rounded.none}"
    padding: "16px 32px"
    height: "64px"
    borderColor: "{colors.hairline}"
  nav-link:
    backgroundColor: transparent
    textColor: "{colors.ink-soft}"
    typography: "{typography.body-md}"
    padding: "8px 12px"
  card:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.body-md}"
    rounded: "{rounded.lg}"
    padding: "24px"
    borderColor: "{colors.hairline}"
  surface-card:
    backgroundColor: "{colors.surface-1}"
    textColor: "{colors.ink}"
    typography: "{typography.body-md}"
    rounded: "{rounded.lg}"
    padding: "32px"
  text-input:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.body-md}"
    rounded: "{rounded.sm}"
    padding: "10px 12px"
    height: "44px"
    borderColor: "{colors.hairline}"
  footer:
    backgroundColor: "{colors.surface-1}"
    textColor: "{colors.muted}"
    typography: "{typography.body-sm}"
    padding: "48px 32px"
---

## 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

| Token | Size | Weight | Line Height | Use |
|---|---|---|---|---|
| `{typography.display-xl}` | 48px | 700 | 56px | Hero h1 (inferred) |
| `{typography.display-md}` | 32px | 700 | 40px | Section h2 (inferred) |
| `{typography.heading-md}` | 24px | 600 | 32px | Sub-section heads (inferred) |
| `{typography.heading-sm}` | 18px | 600 | 28px | Tertiary heads (inferred) |
| `{typography.body-lg}` | 18px | 400 | 28px | Lead paragraphs (inferred) |
| `{typography.body-md}` | 16px | 400 | 24px | Default running text (inferred) |
| `{typography.body-sm}` | 14px | 400 | 20px | Secondary running text (inferred) |
| `{typography.caption}` | 12px | 400 | 18px | Legal disclosures (inferred) |
| `{typography.button-md}` | 16px | 600 | 24px | Primary CTA labels (inferred) |
| `{typography.fallback-serif}` | 16px | 400 | 18px | Times 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.
