All designs
Netlify
Web platform. Teal-to-blue brand accents on clean white developer marketing.
extracted from https://www.netlify.com/ on 2026-07-03
Push your ideas to the web | Netlify
light-leaning · 5 stylesheets · 120 native variables
fonts Martian Mono · Instrument Sans · YouTube Noto · Figtree
---
name: netlify-com-design-system
source: https://www.netlify.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: "#000000"
text-muted: "#6b7280"
surface: "#d1d5da"
hairline: "#9da7b2"
accent: "#131920" # deep-cyan
accent-2: "#e5e7eb" # pale-blue
accent-3: "#05bdba" # teal
fonts:
primary: "Instrument Sans" # medium-confidence: usage counts are close
mono: "Martian Mono"
---
# Push your ideas to the web | Netlify — Design System
Extracted from **https://www.netlify.com/** on 2026-07-03.
> Create with AI or code, deploy instantly on production infrastructure. One platform to build and ship.
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 67 light against 20 dark. The palette is chromatic: 12 saturated values against 8 neutrals, led by deep-cyan (`#131920`). **Instrument Sans** leads the font stack, though usage counts are close — verify against rendered pages before committing. Geometry mixes sharp corners (2px) with full pills.
## Usage rules
Derived from the measured usage below — each rule cites its evidence.
- Chromatic color carries 39% of measured usage — this palette uses color structurally. Saturated values can hold large surfaces here; timidity would misrepresent the source.
- The theme is light (measured neutral weight 67:20). Don't flip individual sections to the opposite mode.
- `.25rem` is the workhorse radius (x5); 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.
- `Martian Mono` is the monospace — keep it for code, data, and metadata roles.
## Colors
### Neutrals (light → dark)
| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `neutral-50` | `#ffffff` | 66 | **canvas** — lightest neutral, matches the measured light-leaning theme |
| `neutral-200` | `#d1d5da` | 1 | **surface** — neutral closest to canvas luminance |
| `neutral-400` | `#9da7b2` | 2 | **hairline** — next neutral near canvas, hairline-border weight |
| `neutral-500` | `#778089` | 2 | — |
| `neutral-600` | `#6b7280` | 4 | **text-muted** — most-used mid-luminance neutral |
| `neutral-700` | `#545a61` | 2 | — |
| `neutral-800` | `#353a3e` | 3 | — |
| `neutral-950` | `#000000` | 11 | **ink** — darkest neutral, highest contrast against canvas |
### Accents
| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `deep-cyan` | `#131920` | 13 | **accent** — most-used chromatic color |
| `pale-blue` | `#e5e7eb` | 12 | **accent-2** — supporting chromatic color |
| `teal` | `#05bdba` | 10 | **accent-3** — supporting chromatic color |
| `teal-2` | `#14d8d4` | 7 | — |
| `blue` | `#2036a1` | 4 | — |
| `deep-teal` | `#0c2a2a` | 2 | — |
| `blue-2` | `#80abfa` | 2 | — |
| `blue-3` | `#1b205b` | 2 | — |
| `teal-3` | `#30c8c9` | 2 | — |
| `blue-4` | `#183dd1` | 2 | — |
| `pale-teal` | `#d0fffe` | 2 | — |
| `teal-4` | `#26736c` | 1 | — |
### Modern color values (kept verbatim)
- `color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .047058823529411764)`
- `color(srgb .9294117647058824 .9568627450980393 1)`
- `color(srgb .803921568627451 .8862745098039215 1)`
- `color(srgb .7098039215686275 .8235294117647058 .984313725490196)`
- `color(srgb .611764705882353 .7450980392156863 .9647058823529412)`
- `color(srgb .5019607843137255 .6705882352941176 .9803921568627451)`
- `color(srgb .36470588235294116 .5529411764705883 .9607843137254902)`
- `color(srgb .19215686274509805 .4196078431372549 .9568627450980393)`
- `color(srgb .1803921568627451 .3176470588235294 .9294117647058824)`
- `color(srgb .12549019607843137 .21176470588235294 .6313725490196078)`
- `color(srgb .10588235294117647 .12549019607843137 .3568627450980392)`
- `color(srgb 0 0 0 / 0)`
### Dark mode
The source defines 60 dark-mode variants (via prefers-color-scheme). Both halves of the system, first 30:
| Token | Light | Dark |
| --- | --- | --- |
| `--start-card-glow-1` | — | `hsla(175, 50%, 30%, .5)` |
| `--start-card-glow-2` | — | `hsla(195, 40%, 25%, .4)` |
| `--ntl-active-switcher-tab-bg-color` | `color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .047058823529411764)` | `color(srgb .047058823529411764 .16470588235294117 .16470588235294117)` |
| `--ntl-badge-bg-color` | `var(--ntl-neutral-100)` | `var(--ntl-neutral-700)` |
| `--ntl-badge-border-color` | `var(--ntl-neutral-300)` | `var(--ntl-neutral-600)` |
| `--ntl-badge-text-color` | `var(--ntl-neutral-500)` | `var(--ntl-neutral-100)` |
| `--ntl-blockquote-accent-color` | `var(--ntl-blue-700)` | `var(--ntl-teal-200)` |
| `--ntl-button-outline-bg-color` | `color(srgb 0 0 0 / 0)` | `color(srgb 0 0 0 / 0)` |
| `--ntl-button-outline-bg-color-hover` | `color(srgb .8392156862745098 .9803921568627451 .9764705882352941)` | `var(--ntl-neutral-500)` |
| `--ntl-button-outline-stroke-color` | `var(--ntl-neutral-800)` | `var(--ntl-teal-200)` |
| `--ntl-button-outline-text-color` | `var(--ntl-neutral-800)` | `var(--ntl-teal-200)` |
| `--ntl-button-primary-bg-color` | `var(--ntl-teal-200)` | `var(--ntl-teal-200)` |
| `--ntl-button-primary-bg-color-hover` | `var(--ntl-teal-100)` | `var(--ntl-teal-100)` |
| `--ntl-button-primary-text-color` | `var(--ntl-neutral-800)` | `var(--ntl-neutral-800)` |
| `--ntl-button-secondary-bg-color` | `color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .09803921568627451)` | `color(srgb 1 1 1 / .09803921568627451)` |
| `--ntl-button-secondary-bg-color-hover` | `color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .14901960784313725)` | `color(srgb .6549019607843137 1 .9921568627450981 / .14901960784313725)` |
| `--ntl-button-secondary-text-color` | `var(--ntl-neutral-800)` | `var(--ntl-teal-200)` |
| `--ntl-card-bg-color` | `var(--ntl-neutral-000)` | `var(--ntl-teal-900)` |
| `--ntl-card-border-color` | `var(--ntl-neutral-200)` | `var(--ntl-teal-900)` |
| `--ntl-card-border-color-hover` | `var(--ntl-neutral-300)` | `var(--ntl-teal-800)` |
| `--ntl-code-bg-color` | `var(--ntl-teal-900)` | `var(--ntl-teal-900)` |
| `--ntl-color-bg` | `var(--ntl-neutral-000)` | `var(--ntl-neutral-800)` |
| `--ntl-color-bg-2` | `var(--ntl-neutral-100)` | `var(--ntl-neutral-700)` |
| `--ntl-color-bg-3` | `var(--ntl-neutral-200)` | `var(--ntl-neutral-600)` |
| `--ntl-color-bg-inverse` | `var(--ntl-neutral-300)` | `var(--ntl-neutral-000)` |
| `--ntl-color-bg-translucent` | `color(srgb 1 1 1 / .9019607843137255)` | `color(srgb .07058823529411765 .09411764705882353 .12156862745098039 / .9490196078431372)` |
| `--ntl-color-border-default` | `color(srgb 0 0 0 / .14901960784313725)` | `color(srgb 1 1 1 / .09803921568627451)` |
| `--ntl-color-border-strong` | `var(--ntl-neutral-300)` | `var(--ntl-neutral-500)` |
| `--ntl-color-border-subtle` | `color(srgb 0 0 0 / .06274509803921569)` | `color(srgb 1 1 1 / .0392156862745098)` |
| `--ntl-color-brand-primary` | `var(--ntl-blue-700)` | `var(--ntl-teal-300)` |
`variables.css` ships these as a `prefers-color-scheme: dark` override block.
## Typography
**Instrument Sans** has the most `font-family` declarations, but the margin over the rest is thin — treat the primary-face call as provisional and verify on rendered pages. Full list by usage:
| Family | Usage |
| --- | --- |
| Martian Mono | 4 |
| Instrument Sans | 2 |
| YouTube Noto | 1 |
| Figtree | 1 |
**Size scale (px):** `8`, `11.2`, `12`, `12.8`, `14`, `14.4`, `16`, `18`, `20`, `24`
**Weights in use:** `100` (x3), `400` (x2), `500` (x2), `600` (x8), `700` (x5), `800` (x1)
**Line-heights (unitless):** `1`, `1.1`, `1.2`, `1.3`, `1.35`, `1.5`, `1.75`
**Letter-spacing values:** `-.025em`, `.2px`, `.02em`, `.025em`, `.05em`
## Spacing
Most-used values (px): `1`, `2`, `4`, `5`, `8`, `10`, `12`, `14`, `16`, `24`, `32`, `48`
## Border radius
| Token | Value | Usage |
| --- | --- | --- |
| `radius-sm` | `2px` | 3 |
| `radius-md` | `.25rem` | 5 |
| `radius-lg` | `.375rem` | 2 |
| `radius-xl` | `.5rem` | 3 |
| `radius-2xl` | `.75rem` | 1 |
| `radius-3xl` | `1.3rem` | 1 |
| `radius-full` | `50%` | 5 |
## Shadows (ordered by blur radius)
- `shadow-sm` — `0 2px 8px #00000026` (x1)
- `shadow-md` — `0 2px 12px #0000004d` (x1)
## Breakpoints
`480px`, `500px`, `600px`, `640px`, `750px`, `768px`, `1085px`
## 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); /* #131920 */
color: var(--color-canvas); /* #ffffff — contrast 17.7:1 */
border-radius: 9999px; /* pill — mined as 50% */
font-weight: 500;
}
.card {
background: var(--color-surface); /* #d1d5da */
border: 1px solid var(--color-hairline); /* #9da7b2 */
border-radius: .25rem; /* most-used finite radius */
box-shadow: var(--shadow-sm);
}
.input {
background: var(--color-canvas); /* #ffffff */
color: var(--color-ink); /* #000000 — contrast 21.0:1 */
border: 1px solid var(--color-hairline); /* #9da7b2 */
border-radius: 2px;
/* placeholder color: var(--color-text-muted) #6b7280 */
}
.nav {
background: var(--color-canvas); /* #ffffff */
border-bottom: 1px solid var(--color-hairline); /* #9da7b2 */
color: var(--color-ink); /* #000000 */
/* inactive links: var(--color-text-muted) #6b7280 */
/* active link: var(--color-accent) #131920 — contrast vs canvas 17.7:1 */
}
.modal {
background: var(--color-surface); /* #d1d5da */
border-radius: .25rem;
box-shadow: var(--shadow-md); /* largest mined shadow */
}
.modal-backdrop {
background: color-mix(in srgb, var(--color-ink) 55%, transparent); /* scrim from #000000 */
}
.input-error {
/* no red exists in the mined palette — this site does not expose an error color in its CSS. */
/* Introduce one deliberately rather than borrowing a random red; keep saturation near the accent's. */
}
```
## Observations
- 8 of 20 extracted colors are neutrals.
- 2 distinct shadows; the softest reaches 0px blur.
- 7 breakpoints, from 480px to 1085px.
- 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 {
--font-size-display-2xl: var(--step-5);
--ntl-active-switcher-tab-bg-color: color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .047058823529411764);
--ntl-badge-bg-color: var(--ntl-neutral-100);
--ntl-badge-border-color: var(--ntl-neutral-300);
--ntl-badge-text-color: var(--ntl-neutral-500);
--ntl-blockquote-accent-color: var(--ntl-blue-700);
--ntl-blue-000: color(srgb .9294117647058824 .9568627450980393 1);
--ntl-blue-100: color(srgb .803921568627451 .8862745098039215 1);
--ntl-blue-200: color(srgb .7098039215686275 .8235294117647058 .984313725490196);
--ntl-blue-300: color(srgb .611764705882353 .7450980392156863 .9647058823529412);
--ntl-blue-400: color(srgb .5019607843137255 .6705882352941176 .9803921568627451);
--ntl-blue-500: color(srgb .36470588235294116 .5529411764705883 .9607843137254902);
--ntl-blue-600: color(srgb .19215686274509805 .4196078431372549 .9568627450980393);
--ntl-blue-700: color(srgb .1803921568627451 .3176470588235294 .9294117647058824);
--ntl-blue-800: color(srgb .12549019607843137 .21176470588235294 .6313725490196078);
--ntl-blue-900: color(srgb .10588235294117647 .12549019607843137 .3568627450980392);
--ntl-border-width-base: 1.5px;
--ntl-border-width-heavy: 3px;
--ntl-border-width-thick: 2px;
--ntl-border-width-thin: 1px;
--ntl-button-outline-bg-color: color(srgb 0 0 0 / 0);
--ntl-button-outline-bg-color-hover: color(srgb .8392156862745098 .9803921568627451 .9764705882352941);
--ntl-button-outline-stroke-color: var(--ntl-neutral-800);
--ntl-button-outline-text-color: var(--ntl-neutral-800);
--ntl-button-primary-bg-color: var(--ntl-teal-200);
--ntl-button-primary-bg-color-hover: var(--ntl-teal-100);
--ntl-button-primary-text-color: var(--ntl-neutral-800);
--ntl-button-secondary-bg-color: color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .09803921568627451);
--ntl-button-secondary-bg-color-hover: color(srgb .047058823529411764 .16470588235294117 .16470588235294117 / .14901960784313725);
--ntl-button-secondary-text-color: var(--ntl-neutral-800);
--ntl-card-bg-color: var(--ntl-neutral-000);
--ntl-card-border-color: var(--ntl-neutral-200);
--ntl-card-border-color-hover: var(--ntl-neutral-300);
--ntl-code-bg-color: var(--ntl-teal-900);
--ntl-color-bg: var(--ntl-neutral-000);
--ntl-color-bg-2: var(--ntl-neutral-100);
--ntl-color-bg-3: var(--ntl-neutral-200);
--ntl-color-bg-inverse: var(--ntl-neutral-300);
--ntl-color-bg-translucent: color(srgb 1 1 1 / .9019607843137255);
--ntl-color-border-default: color(srgb 0 0 0 / .14901960784313725);
}
```
## Files
- `tailwind.css` — Tailwind v4 `@theme` block; tokens become utilities (e.g. `bg-neutral-900`, `text-deep-cyan`).
- `variables.css` — framework-agnostic `:root` variables, same values.
- `tokens.json` — W3C Design Tokens format for Figma plugins, Style Dictionary, etc.
