---
name: expo-design-reference
provider: DesignSkill (https://designskill.dev)
reference: expo.dev
source_url: https://expo.dev/
tool: designskill-extract/3.2.0
extracted_at: 2026-07-27T08:56:22.067Z
mode: full-render
classification: reference_only
---

# Expo — Design Reference (measured)

Measured design tokens extracted from `https://expo.dev/` by designskill-extract/3.2.0.
Every value below was observed in the live page (×N = observation count). Values not listed were **not observed** — do not invent them.
This document is `reference_only`: an analysis of a third-party site, not a license to its brand assets.

## Overview

- Extraction mode: **full-render** (viewports 390/768/1440px × light/dark), 1 page(s), 686 observation records.
- Primary action color observed as `#0090ff` (basis: cross-validated, confidence 0.62).
- Dominant font family: **Inter** (×1051; secondary JetBrains Mono ×12).
- Type scale observed at 8 sizes from 12px to 48px.
- Corner radius values in use: 12px, 16px, 24px, 32px….
- Not observed in this extraction: forms.

## Colors

### Role Tokens

Semantic roles inferred from observed usage. `basis` tells how the role was established (declared CSS var > cross-validated > inferred).

| Token | Value | Basis | Confidence | Observed |
|---|---|---|---|---|
| `{color.primary}` | `#0090ff` | cross-validated | 0.62 | ×20 |
| `{color.background}` | `#ffffff` | cross-validated | 0.93 | ×344 |
| `{color.ink}` | `#fffcfe` | declared | 0.92 | ×0 — --pink-1 |
| `{color.muted}` | `#60646c` | inferred | 0.7 | ×232 |
| `{color.surface}` | `#edeef0` | inferred | 0.7 | ×218 |
| `{color.accent}` | `#f76809` | inferred | 0.65 | ×8 |

### Observed Palette

Full measured palette ordered by usage share. `Used in` lists the CSS properties the color appeared on.

| Hex | Share | Used in | Observed |
|---|---|---|---|
| `#1c2024` | 26.1% | color, background-color, border-color, --tw-gradient-to, custom-property | ×545 (cross-validated, 0.94) |
| `#ffffff` | 16.4% | background-color, color, initial-value, border-color, custom-property | ×344 (cross-validated, 0.93) |
| `#60646c` | 11.1% | background-color, color, border-color, --tw-prose-counters | ×232 (cross-validated, 0.93) |
| `#b0b4ba` | 10.6% | background-color, color | ×222 (observed, 0.78) |
| `#edeef0` | 10.4% | color, background-color, border-color, --tw-prose-hr | ×218 (cross-validated, 0.93) |
| `#000000` | 7.8% | background-color, border-color, color, -webkit-mask-image, --expo-theme-background-screen | ×163 (cross-validated, 0.92) |
| `#e0e1e6` | 5.2% | background-color, border-color | ×109 (cross-validated, 0.92) |
| `#2e3135` | 1.7% | border-color | ×36 (observed, 0.75) |
| `#0d74ce` | 1.0% | color, background-color | ×21 (observed, 0.74) |
| `#70b8ff` | 0.7% | color | ×15 (observed, 0.74) |
| `#0090ff` | 1.0% | background-color, border-color | ×20 (cross-validated, 0.89) |
| `#0072de` | 0.4% | background-color, --tw-gradient-to | ×9 (cross-validated, 0.88) |
| `#f76809` | 0.4% | background-color | ×8 (cross-validated, 0.88) |
| `#30a46c` | 0.8% | custom-property, background-color | ×16 (cross-validated, 0.89) |
| `#f7df1e` | 0.3% | background-color | ×6 (observed, 0.73) |
| `#f15139` | 0.3% | background-color | ×6 (observed, 0.73) |

## Typography

### Font Families

| Family | Observed |
|---|---|
| `Inter` | ×1051 |
| `JetBrains Mono` | ×12 |
| `system-ui` | ×12 |
| `ui-monospace` | ×6 |

Use **Inter** as the default family — it accounts for the overwhelming majority of observed text nodes.

### Type Scale

| Token | Size | Observed |
|---|---|---|
| `{type.display}` | 48px | ×19 |
| `{type.h1}` | 32px | ×38 |
| `{type.h2}` | 24px | ×108 |
| `{type.h3}` | 20px | ×22 |
| `{type.body-lg}` | 18px | ×13 |
| `{type.body}` | 16px | ×250 |
| `{type.body-sm}` | 14px | ×454 |
| `{type.caption}` | 12px | ×257 |

The most frequently observed size is **14px** (×454) — treat it as the default body size.

## Spacing

| Value | Observed |
|---|---|
| `8px` | ×300 |
| `32px` | ×292 |
| `24px` | ×218 |
| `4px` | ×209 |
| `16px` | ×141 |
| `12px` | ×81 |
| `40px` | ×50 |
| `6px` | ×48 |
| `64px` | ×44 |
| `48px` | ×42 |
| `20px` | ×30 |
| `10px` | ×27 |

## Shape (Border Radius)

| Value | Observed |
|---|---|
| `12px` | ×252 |
| `16px` | ×112 |
| `24px` | ×58 |
| `32px` | ×42 |
| `40px` | ×24 |
| `20px` | ×22 |
| `48px` | ×18 |
| `4px` | ×17 |

## Elevation

| Shadow | Observed |
|---|---|
| `var(--expo-theme-shadows-xs)` | ×3 |
| `0 .1rem 0 1px var(--expo-theme-border-default)` | ×2 |
| `var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)` | ×2 |
| `var(--expo-theme-shadows-sm)` | ×1 |
| `inset 0 0 4px var(--expo-theme-background-hover)` | ×1 |
| `inset 0 0 4px var(--expo-theme-background-screen)` | ×1 |

## Motion

| Duration | Observed |
|---|---|
| `0.15s` | ×140 |
| `0.2s` | ×54 |
| `0.3s` | ×46 |
| `.15s` | ×7 |
| `.2s` | ×2 |

## Components

Measured computed styles of representative components (desktop viewport).

| Component | Measured spec | Samples |
|---|---|---|
| button.primary | bg `#0090ff` · text `#ffffff` · radius `32px` · padding `0px 12px` · font `12px/600` | ×1 |
| button.outline | text `#1c2024` · border `1px solid rgba(0, 0, 0, 0)` · radius `36px` · padding `0px 8px 0px 16px` · font `14px` | ×3 |
| card | bg `#ffffff` · radius `16px` · border `1px solid rgb(224, 225, 230)` · padding `32px` | ×18 |
| badge | bg `#f0f0f3` · text `#1c2024` · radius `999px` · font `12px/500` · padding `0px 12px` | ×1 |
| nav | height `68px` · position `relative` · link `#1c2024` | — |

### Hero Gradient (observed)

```css
background-image: radial-gradient(circle, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 34%, color(srgb 0.976471 0.976471 0.984314 / 0.024) 40.6%, color(srgb 0.976471 0.976471 0.984314 / 0.095) 47.2%, color(srgb 0.976471 0.976471 0.984314 / 0.206) 53.8%, color(srgb ;
```

### Interaction States (observed)

| State | Property | From | To |
|---|---|---|---|
| hover | background-color | `rgba(0, 0, 0, 0)` | `rgb(240, 240, 243)` |
| hover | background-color | `rgba(0, 0, 0, 0)` | `rgb(240, 240, 243)` |
| hover | background-color | `rgba(0, 0, 0, 0)` | `rgb(240, 240, 243)` |
| focus | background-color | `rgba(0, 0, 0, 0)` | `rgb(240, 240, 243)` |
| focus | outline-color | `rgb(28, 32, 36)` | `rgb(5, 136, 240)` |
| focus | outline-width | `3px` | `2px` |

## Accessibility (WCAG Contrast)

| FG | BG | Ratio | AA | Source |
|---|---|---|---|---|
| `#1c2024` | `#ffffff` | 16.39 | pass | observed ×195 |
| `#60646c` | `#ffffff` | 5.94 | pass | observed ×189 |
| `#1c2024` | `#f9f9fb` | 15.58 | pass | observed ×57 |
| `#1c2024` | `#f0f0f3` | 14.41 | pass | observed ×27 |
| `#60646c` | `#f9f9fb` | 5.65 | pass | observed ×20 |
| `#ffffff` | `#000000` | 21 | pass | observed ×16 |
| `#0d74ce` | `#f9f9fb` | 4.53 | pass | observed ×15 |
| `#60646c` | `#fcfcfd` | 5.79 | pass | observed ×6 |
| `#60646c` | `#f0f0f3` | 5.22 | pass | observed ×3 |
| `#ffffff` | `#f9f9fb` | 1.05 | fail | observed ×3 |
| `#ffffff` | `#0090ff` | 3.26 | fail | observed ×3 |
| `#fffcfe` | `#ffffff` | 1.02 | fail | ink_on_background |
| `#ffffff` | `#0090ff` | 3.26 | fail | white_on_primary |
| `#60646c` | `#ffffff` | 5.94 | pass | muted_on_background |

4 measured pair(s) fail AA — if you reuse those pairs, adjust lightness until the ratio reaches 4.5:1.

## Usage Rules

### Do
- Use `{color.primary}` (`#0090ff`) for primary actions only — that is where it was observed.
- Default text pairing: `{color.ink}` (`#fffcfe`) on `{color.background}` (`#ffffff`).
- Set all text in `Inter` (fallbacks only for glyph coverage).
- Pick corner radii from the measured set (12px, 16px, 24px, 32px) — no intermediate values were observed.
- Cite this file's token names (`{color.*}`, `{type.*}`) when generating UI so output stays traceable to observations.

### Don't
- Don't invent colors, sizes, shadows, or spacing not listed above — absence means *not observed*, and this document records observations only.
- Don't assume the missing blocks (forms) don't exist on the site — they were simply not captured in this run.
- Don't copy brand assets (logo, wordmark, imagery, copy) — `reference_only` covers measured style values, not brand identity.

## Provenance

- Source: https://expo.dev/ (1 page(s))
- Tool: designskill-extract/3.2.0 · extracted 2026-07-27T08:56:22.067Z
- Mode: full-render — 풀렌더 모드 — 3뷰포트 × 라이트/다크 computed style + 상태 관측.
- Blocks observed: 00, 01, 02, 03, 04, 05, 07, 08, 09, 10, 11, 12 · missing: forms
- Warning: primary 불일치: static=#155dfc vs render=#0090ff — render 채택

---

<sub>Generated & served by [DesignSkill](https://designskill.dev)</sub>
