---
version: alpha
name: On
website: "https://www.on.com"
description: >-
  A Swiss performance-running storefront anchored on absolute monochrome — ink `#000000` carries 906 occurrences (420 text, 417 border, 46 gradient) against a `#ffffff` canvas at 323, while the only chromatic moments in the chrome are the browser-default unstyled link colors (bright `#0000ee` at 190 text-and-border occurrences for the activity list, and visited-state brown `#995c00` at 32) that On deliberately surfaces rather than restyles. Type runs the proprietary On sans at a heroic 49.584px h1/h2 with `-0.49584px` tracking against a 12px uppercase On Semi Mono label with `0.72px` tracking — a two-typeface system where the body sans does the editorial weight and the mono carries the category caps.

seo:
  title: "On Running Design System for React — On sans, ink #000000, 17 components"
  metaDescription: "On's storefront as a DESIGN.md file. On sans 49.584px hero, ink #000000, 19 color tokens, 17 components. For React, Next.js, and AI tools."
  highlights:
    - "Hyperlink-blue as accent — On uses the browser-default `#0000ee` (190 occurrences as text and border) for category list items, never restyling it to a brand voltage"
    - "Heroic h1/h2 parity — display sits at 49.584px / 700 with `-0.49584px` tracking, and the section h2 ('Shop') uses the identical size, not a downscaled tier"
    - "Two-typeface split — proprietary On sans for body and display, On Semi Mono for 12px uppercase category captions with `0.72px` tracking"
    - "4px-base radius vocabulary — 24 occurrences of `4px` corners against 8 occurrences of `3px` and 4 of `40px` pill, with a hard `0px` on every photographic tile"
    - "Footer newsletter inverts the canvas — single `#000000` input with `#666666` placeholder, 64px height, no border, sitting under the otherwise white-canvas chrome"
  tags:
    - "E-commerce & Retail"
  lastUpdated: "2026-05-13"
  author:
    name: "Dov Azencot"
    url: "https://x.com/dovazencot"
  opening: |
    On's storefront reads like a Swiss product brochure compiled for the browser. The chrome is reductive to the point of being almost stubborn — ink `#000000` carries 906 occurrences across the captured page (420 as text, 417 as hairline border, 46 inside gradient overlays, plus 18 as shadow), while the canvas runs pure `#ffffff` at 323. Where most performance-running brands inject saturated voltage — neon yellow, signal orange, electric green — to telegraph athletic energy, On withholds entirely. The only chromatic note in the entire chrome is the unstyled hyperlink: bright `#0000ee` reaches 190 occurrences as both text and border, used on the vertical activity list ("Running →", "Road running →", "Marathon →", "Trail running →"), and the visited-link brown `#995c00` reaches 32. These are not brand colors. They are the browser's defaults, surfaced deliberately as a brutalist signal that On trusts the photograph and the type to do every other job.

    This page packages the storefront into a DESIGN.md file written to the Google Labs open spec. Inside: 19 color tokens grouped into ink, canvas, link, status, and graded-neutral layers; 12 typography roles built around a proprietary On sans display tier at 49.584px / weight 700 with `-0.49584px` letter-spacing, paired with On Semi Mono at 12px uppercase tracked `0.72px` for category caps; a 6-step radius vocabulary anchored on the observed `4px` (24 hits) with a `40px` pill reserved for chips; a 9-step spacing scale extracted from the `8px` (69 hits) and `24px` (26 hits) rhythm; and 17 component entries covering the top nav, the hero portrait with overlay heading, the activity list with right-pointing arrow glyphs, the 4-up product card grid, the swatch picker, the editorial "Stories that move" tile, and the inverted newsletter footer.

    Feed the file to Claude, Cursor, or GitHub Copilot and the agent reproduces On's reductive chrome — the heroic h1/h2 parity at 49.584px, the hyperlink-blue activity list, the 4px-cornered product cards on `#ffffff`, the inverted black newsletter input — rather than inventing a generic athletic-template with neon accents and saturated badges. Reference tokens directly when you want one specific value: `{colors.ink}` resolves to `#000000`, `{typography.display-h1}` to On sans 49.584px / 700 / `-0.49584px`, `{colors.link}` to `#0000ee`, and `{rounded.pill}` to 40px. The reason this system rewards study is that most running brands chase velocity through chromatic noise, while On chases it through typographic parity — every section header and every hero shares the same 49.584px ceiling, and the photograph carries the rest.
  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.on.com"
      title: "On — official site"
      description: "The On storefront this DESIGN.md was extracted from on 2026-05-13."
    - 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 On's primary brand color?"
      answer: "On's chrome is built on ink `#000000` at 906 page occurrences (420 text, 417 border, 46 gradient, 18 shadow) against a `#ffffff` canvas at 323. There is no saturated brand voltage. The only chromatic note in the captured page is the browser-default unstyled hyperlink — bright `#0000ee` at 190 occurrences and visited-state `#995c00` at 32 — which On surfaces deliberately on the vertical activity list rather than restyling. The error red `#ed0000` appears twice; the swiper-default `#007aff` is declared on `:root` but never rendered. Treat ink and canvas as the system; treat the hyperlink colors as the only accent and never extend them to non-link chrome."
    - id: "typography"
      title: "What typography does On use, and what should I substitute?"
      answer: "On runs a proprietary On sans (system fallback chain to Noto Sans JP / KR / sans-serif) across every display and body role, plus an On Semi Mono and On Mono for the uppercase category captions. Hero h1 and section h2 share the identical 49.584px / 700 / `-0.49584px` tracking — there is no smaller h2 tier on the homepage. Nav links sit at 20px / 700; body paragraphs at 16px / 400 with `0.2px` tracking; the monospace caption at 12px / 500 / `0.72px` tracking, uppercase. The closest open substitute is Inter Display at weight 700 with `-1%` tracking for the heroic tier, paired with JetBrains Mono or IBM Plex Mono at 12px uppercase tracked `0.72px` for the category caps. Preserve the negative tracking on display — On's optical density depends on it."
    - id: "hyperlink-blue"
      title: "Why is the activity list bright blue?"
      answer: "Bright `#0000ee` is the browser's default unstyled `<a>` color, and On surfaces it intentionally on the 'Running → / Road running → / Marathon →' list — 95 text occurrences and 95 border occurrences, exactly the same count, because each link is also underlined. The visited-state brown `#995c00` reaches 32. On is not styling these as a brand voltage; it is letting the user agent declare them. The signal is brutalist: the only color in the chrome is the color the browser hands you for free. Don't restyle these to a brand hex when reusing the system — the absence of styling is the design."
    - id: "shape-system"
      title: "Why are the product cards 4px and not pill or zero?"
      answer: "On's radius vocabulary runs across six values: `4px` at 24 occurrences (product tile corners, swatch chips, small surfaces), `3px` at 8 (inner-card details), `50%` at 10 (icon buttons, swatch dots), `40px` at 4 (the pill chip used on the editorial tile), `2px` at 1, and `12px` at 1. The product card lands on 4px — soft enough that the photograph doesn't read like a printed catalog, hard enough that the corner never competes with the silhouette of the shoe. The hero photograph itself uses `0px`. There is no 8px or 16px corner anywhere in the system; the jump goes 4 → 12 → 40."
    - id: "use-in-project"
      title: "Can I use this DESIGN.md to build my own React running storefront?"
      answer: "Yes — drop the file into Claude, Cursor, or any AI tool that reads structured design tokens and the agent reproduces On's reductive chrome (heroic 49.584px h1/h2 parity, hyperlink-blue activity list at `#0000ee`, 4px-cornered product cards on `#ffffff`, inverted `#000000` newsletter input at 64px height) rather than inventing a generic athletic template with neon accents. Reference tokens directly when you want one specific value: `{colors.ink}` resolves to `#000000`, `{typography.display-h1}` to On sans 49.584px / 700 / `-0.49584px`, `{colors.link}` to `#0000ee`, `{spacing.lg}` to 24px. Every hex, font, radius, and spacing entry is a quoted literal you can paste into Tailwind config or CSS variables."
    - id: "known-gaps"
      title: "What's missing from this DESIGN.md spec?"
      answer: "Five things, documented in the Known Gaps section: the PDP (product detail page) typography hierarchy beyond the homepage tile is not captured (size selector, add-to-bag CTA placement, fit-finder), the Cyclon subscription flow and the membership-area chrome are not present, hover and focus states are not extracted (On's CSS does not declare them on :root variables the extractor reads), the geo-picker and currency dialog are not visible in the captured page, and the full On sans weight ramp is partially captured — weights 400, 500, and 700 appear, but the 600 demi tier referenced in On's font kit is not present on the homepage. The primary CTA selector returned null because On uses a custom anchor element rather than a `<button>` for the hero call-to-action."

colors:
  ink: "#000000"
  canvas: "#ffffff"
  ink-graphite: "#151522"
  ink-secondary: "#333333"
  ink-mute: "#666666"
  ink-tertiary: "#999999"
  hairline: "#000000"
  surface-elevated: "#ffffff"
  surface-gradient-pale: "#eceef0"
  link: "#0000ee"
  link-visited: "#995c00"
  status-error: "#ed0000"
  on-ink: "#ffffff"
  on-canvas: "#000000"
  input-placeholder: "#666666"
  input-fill-inverse: "#000000"
  swiper-theme: "#007aff"
  overlay-scrim: "#000000"
  border-on-image: "#ffffff"

typography:
  display-h1:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 49.584px
    fontWeight: 700
    lineHeight: 1.1
    letterSpacing: "-0.49584px"
  display-h2:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 49.584px
    fontWeight: 700
    lineHeight: 1.1
    letterSpacing: "-0.49584px"
  heading-link:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 30.8px
    fontWeight: 400
    lineHeight: 1.3
    letterSpacing: 0
  heading-md:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 24.176px
    fontWeight: 700
    lineHeight: 1.2
    letterSpacing: 0
  nav-link:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 20px
    fontWeight: 700
    lineHeight: 1.5
    letterSpacing: 0
  body-md:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 16px
    fontWeight: 400
    lineHeight: 1.5
    letterSpacing: "0.2px"
  body-strong:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 15.312px
    fontWeight: 700
    lineHeight: 1.5
    letterSpacing: 0
  body-sm:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 15.312px
    fontWeight: 400
    lineHeight: 1.5
    letterSpacing: 0
  caption-sm:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 13.392px
    fontWeight: 400
    lineHeight: 1.5
    letterSpacing: 0
  mono-cap:
    fontFamily: "\"On Semi Mono\", menlo, consolas, \"roboto mono\", monospace"
    fontSize: 12px
    fontWeight: 500
    lineHeight: 1.5
    letterSpacing: "0.72px"
    textTransform: uppercase
  mono-lg:
    fontFamily: "\"On Mono\", menlo, consolas, \"roboto mono\", monospace"
    fontSize: 20px
    fontWeight: 400
    lineHeight: 1
    letterSpacing: "1.2px"
    textTransform: uppercase
  input-md:
    fontFamily: "On, \"Noto Sans JP\", \"Noto Sans KR\", system-ui, sans-serif"
    fontSize: 16px
    fontWeight: 400
    lineHeight: 1
    letterSpacing: 0

rounded:
  none: "0px"
  xs: "2px"
  sm: "3px"
  md: "4px"
  lg: "12px"
  pill: "40px"
  full: "9999px"

spacing:
  xxs: "2px"
  xs: "4px"
  sm: "7px"
  md: "8px"
  base: "12px"
  lg: "16px"
  xl: "24px"
  xxl: "48px"
  section: "81px"

components:
  top-nav:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.nav-link}"
    rounded: "{rounded.none}"
    padding: "0px 24px"
    height: "56px"
    border: "0"
  nav-link-on-image:
    backgroundColor: "transparent"
    textColor: "{colors.on-ink}"
    typography: "{typography.nav-link}"
    rounded: "{rounded.none}"
    padding: "0px"
  hero-frame:
    backgroundColor: "{colors.overlay-scrim}"
    textColor: "{colors.on-ink}"
    rounded: "{rounded.none}"
    padding: "0px"
  hero-heading:
    backgroundColor: "transparent"
    textColor: "{colors.on-ink}"
    typography: "{typography.display-h1}"
    rounded: "{rounded.none}"
    padding: "0px"
    height: "109px"
  section-heading:
    backgroundColor: "transparent"
    textColor: "{colors.ink}"
    typography: "{typography.display-h2}"
    rounded: "{rounded.none}"
    padding: "0px 48px"
  button-primary:
    backgroundColor: "{colors.ink}"
    textColor: "{colors.on-ink}"
    typography: "{typography.body-strong}"
    rounded: "{rounded.md}"
    padding: "12px 24px"
    height: "44px"
    border: "0"
  button-secondary-on-image:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.body-strong}"
    rounded: "{rounded.md}"
    padding: "12px 24px"
    height: "44px"
  activity-link:
    backgroundColor: "transparent"
    textColor: "{colors.link}"
    typography: "{typography.display-h1}"
    rounded: "{rounded.none}"
    padding: "4px 0px"
    textDecoration: "underline"
  activity-link-visited:
    backgroundColor: "transparent"
    textColor: "{colors.link-visited}"
    typography: "{typography.display-h1}"
    textDecoration: "underline"
  mono-category-cap:
    backgroundColor: "transparent"
    textColor: "{colors.ink}"
    typography: "{typography.mono-cap}"
    rounded: "{rounded.none}"
    padding: "0px"
  product-card:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.body-strong}"
    rounded: "{rounded.md}"
    padding: "0px"
    border: "0"
  product-card-image:
    backgroundColor: "{colors.surface-gradient-pale}"
    rounded: "{rounded.md}"
  swatch-chip:
    backgroundColor: "{colors.canvas}"
    rounded: "{rounded.md}"
    padding: "0px"
    border: "1px solid {colors.ink}"
  swatch-dot:
    backgroundColor: "{colors.ink}"
    rounded: "{rounded.full}"
    height: "12px"
  editorial-tile:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.heading-md}"
    rounded: "{rounded.md}"
    padding: "16px"
  mono-pill-tag:
    backgroundColor: "{colors.canvas}"
    textColor: "{colors.ink}"
    typography: "{typography.mono-cap}"
    rounded: "{rounded.pill}"
    padding: "4px 12px"
    border: "1px solid {colors.ink}"
  newsletter-input:
    backgroundColor: "{colors.input-fill-inverse}"
    textColor: "{colors.input-placeholder}"
    typography: "{typography.input-md}"
    rounded: "{rounded.none}"
    padding: "16px 4px 0px 16px"
    height: "64px"
    border: "0"
---

## Overview

On's storefront is built on a single, almost stubbornly reductive idea: the chrome carries no color, and the photograph carries everything. Ink `#000000` lands 906 times on the captured page (420 as text, 417 as hairline border, 46 inside gradient overlays, 18 as shadow); canvas `#ffffff` lands 323. Across the hero portrait, the activity list, the Shop heading, the 4-up product grid, and the editorial "Stories that move" tile, the same monochrome chrome reappears in identical proportions — only the photograph and the copy change. Where most performance-running brands inject neon yellow, signal orange, or electric green to telegraph athletic energy, On withholds entirely and lets the shoe photograph be the only colored object on the page.

**Hyperlink as accent**: the only chromatic note in the chrome is the browser-default unstyled `<a>` color. Bright `#0000ee` reaches 190 occurrences (95 text, 95 border, because every link is also underlined) on the vertical activity list — "Running →", "Road running →", "Marathon →", "Trail running →", "Lifestyle →", "Hiking and outdoor →", "Tennis →", "Training and gym →". Visited brown `#995c00` reaches 32. These are not styled. On is declaring that the only color in the system is the color the user agent provides for free, and the activity list is the one place it surfaces. Restyling the link would erase the move.

**Heroic h1/h2 parity**: the hero heading "Bloom. A new shade to move in." and the section heading "Shop" both sit at 49.584px / weight 700 / `-0.49584px` letter-spacing — identical tokens. There is no downscaled h2 tier on the homepage. The 30.8px tier exists only for paragraph-shaped link copy, and the 24.176px tier exists for sub-section labels. Unlike the convention of a 64–48–32–24 display ramp, On flattens the top two tiers into a single ceiling — the section header carries the same weight as the campaign.

## Colors

- **Ink (`#000000`)** — frequency 906. Used as text (420), border (417), shadow (18), gradient (46), bg (5). The load-bearing token: every headline, every hairline, every body line, and the inverted newsletter input fill.
- **Canvas (`#ffffff`)** — frequency 323. Used as text (131), bg (11), border (135), gradient (46). The page surface and the on-image text color for the hero portrait.
- **Hyperlink (`#0000ee`)** — frequency 190. Used as text (95), border (95). The browser's default unstyled `<a>` color, surfaced deliberately on the activity list as the only saturated accent.
- **Link-visited (`#995c00`)** — frequency 32. Used as text (16), border (16). The browser's default visited-state brown; appears on activity items the user has already opened.
- **Ink-secondary (`#333333`)** — frequency 22. Used as text (11), border (11). Body paragraph copy in the geo-availability message; the workhorse soft-text role.
- **Surface-gradient-pale (`#eceef0`)** — frequency 10. Used as gradient (10). Product-card photographic backdrop and the soft gradient under swatch chips.
- **Status-error (`#ed0000`)** — frequency 2. Used as text (1), border (1). Form validation only; never decorative.
- **Ink-tertiary (`#999999`)** — frequency 1. Used as bg (1). Disabled-state placeholder fill.
- **Ink-graphite (`#151522`)** — frequency 1. Used as bg (1). A near-black with a violet cast on one editorial overlay.
- **Ink-mute (`#666666`)** — frequency 1. Used as text (1). The newsletter input placeholder color.
- **Swiper-theme (`#007aff`)** — declared on `:root` via `--swiper-theme-color`. Never rendered in the captured page; reserved for the product-carousel pagination dots.

## Typography

On runs a proprietary **On sans** (system fallback to Noto Sans JP / Noto Sans KR / sans-serif) across every display and body role, plus **On Semi Mono** and **On Mono** for the 12px uppercase category captions and the 20px uppercase mono-lg tier. Hero h1 and section h2 share the identical 49.584px / weight 700 / `-0.49584px` letter-spacing — a heroic display ceiling that flattens the top of the type hierarchy into one tier. Below the ceiling, the system uses 30.8px / 400 for paragraph-shaped link copy, 24.176px / 700 for sub-section labels, 20px / 700 for nav links, and a 15.312px / 400 body tier (with a 15.312px / 700 strong variant) for product names and meta. Body-md sits at 16px / 400 with `0.2px` tracking — the only positive tracking value in the body tier.

The mono pair carries the brand's Swiss-engineering signal. On Semi Mono at 12px / 500 uppercase with `0.72px` tracking renders the category caps below each product card (e.g. "Cloudsurfer", "Cloud", "CloudX", "Cloudboom"), and On Mono at 20px / 400 uppercase with `1.2px` tracking carries the larger editorial labels. Substitution path: Inter Display at weight 700 with `-1%` tracking for the heroic 49.584px tier, paired with JetBrains Mono or IBM Plex Mono at 12px uppercase tracked `0.72px` for the captions.

## Layout

The page runs on a 12-column grid inside a roughly 1440px maximum content width, with section padding extracted as `0px 47.952px` (≈ 48px) horizontal gutters. Vertical rhythm follows an 8px base — the spacing array shows 69 occurrences of `8px`, 26 of `24px`, 17 of `4px`, and 8 of `12px`. The dominant section break is `81.104px` (the `section` spacing token), which separates the hero portrait from the Shop heading and the activity list from the product grid. Inside cards, the rhythm tightens to `4px` / `7px` / `8px`. The activity list sits as a vertical column at roughly 33% page width, with each link receiving `4px 0px` vertical padding — a paragraph-shaped stack rather than a grid of pills.

## Elevation & Depth

Depth is achieved by photography and hairlines rather than shadow. The captured page declares `#000000` shadow 18 times — exclusively on the announcement banner pill and the geo-availability dialog, never on cards or buttons. Surface elevation comes from three devices: a `#eceef0` gradient backdrop behind each product photograph (10 occurrences), a 1px `#000000` hairline border between the top-nav and the hero overlay, and the inverted black newsletter section that drops the user into a dark band at the page foot. Where most retailers ladder a card with a 0/2/8/24px shadow scale, On runs flat — the photograph carries the weight, the gradient backdrop carries the soft separation, and the hairline carries every other line of demarcation.

## Shapes

Six radius values appear in the captured page: `4px` at 24 occurrences (the dominant corner — product tiles, swatch chips, small surfaces), `3px` at 8 (inner-card details and the announcement-bar pill stroke), `50%` at 10 (icon buttons and swatch dots), `40px` at 4 (the mono-pill tag used on the editorial tile), `2px` at 1, and `12px` at 1. The product card lands on `4px` — soft enough that the photograph does not read like a printed catalog, hard enough that the corner never competes with the silhouette of the shoe. The hero portrait itself sits at `0px`. The jump goes 4 → 12 → 40; there is no 8px, 16px, 24px, or 32px corner anywhere in the chrome.

## Components

- **top-nav**: `{colors.canvas}` background, `{colors.ink}` text, `{typography.nav-link}` at 20px / 700, `0px` radius, `56px` height, no border.
- **nav-link-on-image**: transparent fill, `{colors.on-ink}` text for the nav links that sit over the hero photograph.
- **hero-frame**: full-bleed `0px`-cornered black overlay scrim; the photograph beneath carries every other color note.
- **hero-heading**: 49.584px / 700 `{colors.on-ink}` typeset directly onto the portrait — captured at 109px rendered height for "Bloom. A new shade to move in."
- **section-heading**: identical 49.584px / 700 tier to the hero, used on "Shop" and "New arrivals" — flattens the h1/h2 ceiling.
- **button-primary**: `{colors.ink}` fill, `{colors.on-ink}` text, `4px` radius, 12/24px padding, 44px height. Used for the hero "Explore" CTA.
- **button-secondary-on-image**: `{colors.canvas}` fill, `{colors.ink}` text, otherwise identical to primary — sits beside the primary on the hero scrim.
- **activity-link**: the brutalist move — 49.584px / 700 in `{colors.link}` `#0000ee` with underline, padded `4px 0px` per line.
- **activity-link-visited**: identical to activity-link but text shifts to `{colors.link-visited}` `#995c00` once visited.
- **mono-category-cap**: 12px On Semi Mono uppercase with `0.72px` tracking, used as the small label under each product image ("Cloudsurfer", "Cloud", etc.).
- **product-card**: `{colors.canvas}` surface, `4px` radius, no border, sits in the 4-up grid.
- **product-card-image**: `{colors.surface-gradient-pale}` `#eceef0` photographic backdrop with a `4px` radius — the only place the gradient pale appears.
- **swatch-chip**: small `4px`-cornered swatch picker with a 1px `{colors.ink}` border.
- **swatch-dot**: `9999px` circular swatch indicator filled with `{colors.ink}` at 12px height.
- **editorial-tile**: the "Stories that move" surface — `{typography.heading-md}` at 24.176px / 700 inside a `4px`-cornered tile with `16px` padding.
- **mono-pill-tag**: 12px On Semi Mono uppercase inside a `40px` pill — the one place a pill geometry appears in the system, reserved for editorial category tags.
- **newsletter-input**: the inverted-canvas signature — `{colors.ink}` fill, `{colors.ink-mute}` placeholder, 64px height, `0px` radius, no border. Sits inside the black footer band.

## Do's and Don'ts

- **Don't** restyle the activity-list links from `#0000ee` to a brand voltage — the unstyled browser default is the design. Restyling erases the brutalist signal.
- **Don't** ladder a 64–48–32–24 display ramp. On's display ceiling is a single 49.584px tier shared by h1 and h2; the next tier is 30.8px / weight 400, not 32px / 700.
- **Don't** use `#eceef0` as a chip or button background — it is a gradient-only token (10 occurrences, all as gradient) reserved for the product-image backdrop. For light surfaces, use `{colors.canvas}` `#ffffff`.
- **Don't** add a drop shadow to the product card. On's depth comes from the `#eceef0` photographic gradient and a 1px ink hairline; the card itself is shadowless.
- **Don't** soften the newsletter input to a `4px` or `8px` corner. The 64px-tall `0px`-radius black field is the system's one inversion — corner-radius would push it toward a generic input.
- **Don't** apply the `40px` pill geometry to a primary CTA. The pill is reserved for editorial mono tags; primary buttons sit at `4px`.
- **Do** keep On Semi Mono at 12px / `0.72px` tracking, uppercase, for every category cap. The Swiss-engineering signal lives in the mono tier — collapsing it to the body sans erases the brand's voice.
- **Do** preserve the negative `-0.49584px` tracking on the 49.584px display tier when substituting a different sans. On's optical density depends on it.

## Known Gaps

- **PDP not captured** — product detail page typography (size selector, add-to-bag CTA placement, fit-finder) is not part of the homepage capture.
- **Cyclon subscription flow and membership chrome** are not present in the captured page; the recurring-rental Cyclon shoes have a dedicated visual treatment that isn't documented here.
- **Hover and focus states** are not extracted — On's CSS does not surface them on the `:root` variable cascade the extractor reads.
- **Geo-picker and currency dialog** are not visible in the captured page (the geo-availability message that triggered the `#333333` body paragraph is the closest analog).
- **On sans weight 600** referenced in On's font kit is not present on the homepage — weights 400, 500, and 700 are extracted but the demi tier is not.
- **Primary CTA selector returned null** — On uses a custom anchor element rather than a `<button>` for the hero call-to-action, so the extractor's primary-button probe captured nothing; the `button-primary` token above is reconstructed from the visible "Explore" CTA in the screenshot.
