All designs

ChatGPT

AI assistant. Quiet gray canvas, conversation-first restraint, almost no chrome.

extracted from https://chatgpt.com/ on 2026-07-03

ChatGPT

light-leaning · 2 stylesheets · 120 native variables

fonts OpenAI Sans · OpenDyslexic · Circle · -apple-system-body · Segoe UI Variable Text · Atkinson Hyperlegible Mono · OpenDyslexic Mono · Segoe UI Variable Small
---
name: chatgpt-com-design-system
source: https://chatgpt.com/
extracted: 2026-07-03
theme: light  # measured from neutral usage weight
colors:  # roles inferred from usage frequency + luminance; names verified against values
  canvas: "#ffffff"
  ink: "#303030"
  text-muted: "#afafaf"
  surface: "#f3f3f3"
  hairline: "#dfdfdf"
  accent: "#0285ff"  # cyan
  accent-2: "#fa423e"  # red
  accent-3: "#7d5bff"  # blue
fonts:
  primary: "OpenAI Sans"
  mono: "Atkinson Hyperlegible Mono"
---

# ChatGPT — Design System

Extracted from **https://chatgpt.com/** on 2026-07-03.

> ChatGPT is your AI chatbot for everyday use. Chat with the most advanced AI to explore ideas, solve problems, and learn faster.

Every value below is mined from the site's live CSS (120 native custom properties, ranked usage counts). Role assignments are inferred from usage and luminance and marked as such — treat them as a strong starting point, not gospel.

## Overview

The system reads as light: measured neutral usage weighs 535 light against 109 dark. The palette is chromatic: 12 saturated values against 11 neutrals, led by cyan (`#0285ff`). **OpenAI Sans** carries the interface; **Atkinson Hyperlegible Mono** handles code and data. Geometry mixes sharp corners (.25rem) with full pills.

## Usage rules

Derived from the measured usage below — each rule cites its evidence.

- Chromatic color is only 23% of measured color usage. Reserve `accent` (`#0285ff`) for primary actions, links, and emphasis — spreading it into body text or large surfaces breaks the ratio that defines this look.
- The theme is light (measured neutral weight 535:109). Don't flip individual sections to the opposite mode.
- `.25rem` is the workhorse radius (x7); treat the other radii as exceptions, not options.
- The only shadows are blur-less hairline offsets — this system barely uses elevation; don't add soft drop shadows.
- `Atkinson Hyperlegible Mono` is the monospace — keep it for code, data, and metadata roles.

## Colors

### Neutrals (light → dark)

| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `neutral-50` | `#ffffff` | 382 | **canvas** — lightest neutral, matches the measured light-leaning theme |
| `neutral-100` | `#f3f3f3` | 95 | **surface** — neutral closest to canvas luminance |
| `neutral-200` | `#dfdfdf` | 24 | **hairline** — next neutral near canvas, hairline-border weight |
| `neutral-300` | `#cecece` | 34 | — |
| `neutral-400` | `#c1c0c0` | 6 | — |
| `neutral-500` | `#afafaf` | 18 | **text-muted** — most-used mid-luminance neutral |
| `neutral-600` | `#8f8f8f` | 18 | — |
| `neutral-700` | `#767676` | 14 | — |
| `neutral-800` | `#5d5d5d` | 21 | — |
| `neutral-900` | `#414141` | 10 | — |
| `neutral-950` | `#303030` | 27 | **ink** — darkest neutral, highest contrast against canvas |

### Accents

| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `cyan` | `#0285ff` | 53 | **accent** — most-used chromatic color |
| `red` | `#fa423e` | 19 | **accent-2** — supporting chromatic color |
| `blue` | `#7d5bff` | 19 | **accent-3** — supporting chromatic color |
| `blue-2` | `#aa96ff` | 17 | — |
| `blue-3` | `#5856d6` | 15 | — |
| `teal` | `#10a37f` | 15 | — |
| `blue-4` | `#4e86f7` | 15 | — |
| `deep-blue` | `#0f172a` | 13 | — |
| `yellow` | `#f2c94c` | 9 | — |
| `orange` | `#c76b12` | 8 | — |
| `red-2` | `#e02e2a` | 8 | — |
| `blue-5` | `#6157ff` | 7 | — |

### Modern color values (kept verbatim)

- `oklch(0.99 0 0)`
- `oklch(55.1%25 0.027 264.364)`
- `lab(0% 0 0)`
- `lab(53.6% 0 0/0)`
- `lab(82.6% .0000298023 -.0000119209)`
- `lab(91.6229% -.159115 -2.26791)`
- `lab(8.11897% .811279 -12.254)`
- `lab(8.11897% .811279 -12.254/.1)`
- `lab(16.1051% -1.18239 -11.7533)`
- `lab(85.1236% -.612259 -3.7138)`
- `lab(27.1134% -.956401 -12.3224)`
- `lab(35.6337% -1.58697 -10.8425)`

### Dark mode

The source defines 60 dark-mode variants (via dark selector). Both halves of the system, first 30:

| Token | Light | Dark |
| --- | --- | --- |
| `--interactive-bg-primary-default-context` | — | `var(--interactive-bg-primary-default)` |
| `--interactive-bg-primary-hover-context` | — | `var(--interactive-bg-primary-hover)` |
| `--interactive-bg-primary-press-context` | — | `var(--interactive-bg-primary-press)` |
| `--interactive-bg-primary-inactive-context` | — | `var(--interactive-bg-primary-inactive)` |
| `--interactive-bg-primary-selected-context` | — | `var(--interactive-bg-primary-selected)` |
| `--interactive-bg-primary-inverted-context` | — | `var(--bg-primary-inverted)` |
| `--interactive-border-primary-inverted-context` | — | `var(--bg-primary-inverted)` |
| `--interactive-label-primary-context` | — | `var(--interactive-label-primary-default)` |
| `--interactive-label-primary-inactive-context` | — | `var(--interactive-label-primary-inactive)` |
| `--interactive-label-primary-inverted-context` | — | `var(--text-inverted)` |
| `--interactive-icon-primary-context` | — | `var(--interactive-icon-primary-default)` |
| `--interactive-icon-primary-inactive-context` | — | `var(--interactive-icon-primary-inactive)` |
| `--interactive-icon-primary-inverted-context` | — | `var(--icon-inverted)` |
| `--interactive-bg-danger-primary-default-context` | — | `var(--red-500)` |
| `--interactive-bg-danger-primary-hover-context` | — | `var(--red-600)` |
| `--interactive-bg-danger-primary-press-context` | — | `var(--red-500)` |
| `--interactive-bg-danger-primary-inactive-context` | — | `#0d0d0d0f` |
| `--interactive-bg-danger-primary-selected-context` | — | `var(--red-500)` |
| `--interactive-label-danger-primary-context` | — | `var(--white)` |
| `--interactive-label-danger-primary-press-context` | — | `var(--white)` |
| `--interactive-label-danger-primary-inactive-context` | — | `var(--gray-500)` |
| `--interactive-icon-danger-primary-context` | — | `var(--white)` |
| `--interactive-icon-danger-primary-press-context` | — | `var(--white)` |
| `--interactive-icon-danger-primary-inactive-context` | — | `var(--gray-500)` |
| `--interactive-bg-danger-soft-default-context` | — | `var(--red-50)` |
| `--interactive-bg-danger-soft-hover-context` | — | `var(--red-75)` |
| `--interactive-bg-danger-soft-press-context` | — | `var(--red-50)` |
| `--interactive-bg-danger-soft-inactive-context` | — | `#0d0d0d0f` |
| `--interactive-bg-danger-soft-selected-context` | — | `var(--red-50)` |
| `--interactive-label-danger-soft-context` | — | `var(--red-600)` |

`variables.css` ships these as a `prefers-color-scheme: dark` override block.

## Typography

**OpenAI Sans** is the primary interface face; **Atkinson Hyperlegible Mono** is the monospace. Full list by usage:

| Family | Usage |
| --- | --- |
| OpenAI Sans | 34 |
| OpenDyslexic | 4 |
| Circle | 3 |
| -apple-system-body | 3 |
| Segoe UI Variable Text | 3 |
| Atkinson Hyperlegible Mono | 2 |
| OpenDyslexic Mono | 1 |
| Segoe UI Variable Small | 1 |

**Size scale (px):** `8`, `10`, `11`, `12`, `13.71`, `14`, `14.4`, `16`, `17`, `20`, `24`, `36`

**Weights in use:** `300` (x10), `400` (x23), `500` (x17), `510` (x5), `600` (x22), `700` (x15)

**Line-heights (unitless):** `1`, `1.33`, `1.4`, `1.43`, `1.45`, `1.5`, `1.6`, `1.71`

**Letter-spacing values:** `-.026875rem`, `-.015em`, `-.18px`, `-.154px`, `-.08px`, `-.005rem`

## Spacing

Most-used values (px): `1`, `2`, `3`, `4`, `5`, `6`, `8`, `10`, `12`, `14`, `16`, `20`

## Border radius

| Token | Value | Usage |
| --- | --- | --- |
| `radius-sm` | `.25rem` | 7 |
| `radius-md` | `.375rem` | 2 |
| `radius-lg` | `10px` | 3 |
| `radius-xl` | `18px` | 3 |
| `radius-2xl` | `1.25rem` | 2 |
| `radius-3xl` | `26px` | 3 |
| `radius-4xl` | `100%` | 3 |
| `radius-full` | `50%` | 5 |

## Shadows (ordered by blur radius)

- `shadow-sm` — `0 1px #0000` (x2)
- `shadow-md` — `0 -1px #0000` (x2)
- `shadow-lg` — `0 2px 8px #0000000d` (x1)

## Breakpoints

`480px`, `640px`, `768px`, `1024px`, `1280px`, `1536px`

## Starter recipes

Tokens composed into components. The source site's real components were **not** inspected — these are starting points built from the extracted values, with contrast ratios computed rather than assumed.

```css
.button-primary {
  background: var(--color-accent); /* #0285ff */
  color: var(--color-ink); /* #303030 — contrast 3.6:1, below AA for small text; use large or bold labels */
  border-radius: 9999px; /* pill — mined as 50% */
  font-weight: 500;
}

.card {
  background: var(--color-surface); /* #f3f3f3 */
  border: 1px solid var(--color-hairline); /* #dfdfdf */
  border-radius: .25rem; /* most-used finite radius */
  box-shadow: var(--shadow-sm);
}

.input {
  background: var(--color-canvas); /* #ffffff */
  color: var(--color-ink); /* #303030 — contrast 13.2:1 */
  border: 1px solid var(--color-hairline); /* #dfdfdf */
  border-radius: .25rem;
  /* placeholder color: var(--color-text-muted) #afafaf */
}

.nav {
  background: var(--color-canvas); /* #ffffff */
  border-bottom: 1px solid var(--color-hairline); /* #dfdfdf */
  color: var(--color-ink); /* #303030 */
  /* inactive links: var(--color-text-muted) #afafaf */
  /* active link: var(--color-accent) #0285ff — contrast vs canvas 3.6:1 */
}

.modal {
  background: var(--color-surface); /* #f3f3f3 */
  border-radius: .25rem;
  box-shadow: var(--shadow-lg); /* largest mined shadow */
}

.modal-backdrop {
  background: color-mix(in srgb, var(--color-ink) 55%, transparent); /* scrim from #303030 */
}

.input-error {
  border-color: #fa423e; /* mined token: red */
  /* error text: #fa423e on canvas — contrast 3.6:1, below AA; darken for message text */
}
```

## Observations

- 11 of 23 extracted colors are neutrals.
- 3 distinct shadows; the softest reaches 0px blur.
- 6 breakpoints, from 480px to 1536px.
- The site ships a large native token system (120+ custom properties) — prefer those names when extending it.

## Native CSS custom properties

First 40 of 120:

```css
:root {
  --spring-fast-duration: .667s;
  --spring-common-duration: .667s;
  --spring-standard: var(--spring-common);
  --spring-slow-bounce-duration: 1.167s;
  --spring-bounce-duration: .833s;
  --spring-fast-bounce-duration: 1s;
  --easing-spring-elegant-duration: .58171s;
  --easing-common: ease-in-out;
  --spring-common: ease-in-out;
  --spring-bounce: ease-in-out;
  --spring-fast: ease-in-out;
  --spring-fast-bounce: ease-in-out;
  --spring-slow-bounce: ease-in-out;
  --font-mono: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", "monospace";
  --spacing: .25rem;
  --breakpoint-md: 48rem;
  --breakpoint-lg: 64rem;
  --breakpoint-xl: 80rem;
  --breakpoint-2xl: 96rem;
  --container-xs: 20rem;
  --container-sm: 24rem;
  --container-md: 28rem;
  --container-lg: 32rem;
  --container-xl: 36rem;
  --container-2xl: 42rem;
  --container-3xl: 48rem;
  --container-4xl: 56rem;
  --container-5xl: 64rem;
  --container-6xl: 72rem;
  --container-7xl: 80rem;
  --text-xs: .75rem;
  --text-xs--line-height: calc(1 / .75);
  --text-sm: .875rem;
  --text-sm--line-height: calc(1.25 / .875);
  --text-base: 1rem;
  --text-base--line-height: calc(1.5 / 1);
  --text-lg: 1.125rem;
  --text-lg--line-height: calc(1.75 / 1.125);
  --text-xl: 1.25rem;
  --text-xl--line-height: calc(1.75 / 1.25);
}
```

## Files

- `tailwind.css` — Tailwind v4 `@theme` block; tokens become utilities (e.g. `bg-neutral-900`, `text-cyan`).
- `variables.css` — framework-agnostic `:root` variables, same values.
- `tokens.json` — W3C Design Tokens format for Figma plugins, Style Dictionary, etc.