All designs

Sonos

Home audio. Matte monochrome, product photography on tonal fields, quiet type.

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

Sonos | Wireless Speakers and Home Sound Systems

light-leaning · 2 stylesheets · 120 native variables

fonts aktiv-grotesk · bold · arial
---
name: sonos-com-design-system
source: https://www.sonos.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: "#737373"
  surface: "#eeeeee"
  hairline: "#e0e0e0"
  accent: "#de8579"  # red
  accent-2: "#3b82f6"  # blue
  accent-3: "#1c5f4a"  # teal
fonts:
  primary: "aktiv-grotesk"  # medium-confidence: usage counts are close
---

# Sonos | Wireless Speakers and Home Sound Systems — Design System

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

> Sonos is the ultimate wireless home sound system: a whole-house WiFi network that fills your home with brilliant sound, room by room.

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 60 light against 64 dark. The palette is chromatic: 12 saturated values against 11 neutrals, led by red (`#de8579`). **aktiv-grotesk** leads the font stack, though usage counts are close — verify against rendered pages before committing. 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 12% of measured color usage. Reserve `accent` (`#de8579`) 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 60:64). Don't flip individual sections to the opposite mode.
- The most-used radius is the full pill (x9); mid-size radii are the exception in this system.
- The only shadows are blur-less hairline offsets — this system barely uses elevation; don't add soft drop shadows.
- Spacing sits on a 4px grid (11 of 12 values divisible by 4) — stay on it.
- One family does the work — build hierarchy with size and weight (100/300/400/500/600/700), not by adding typefaces.

## Colors

### Neutrals (light → dark)

| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `neutral-50` | `#ffffff` | 27 | **canvas** — lightest neutral, matches the measured light-leaning theme |
| `neutral-100` | `#eeeeee` | 14 | **surface** — neutral closest to canvas luminance |
| `neutral-200` | `#e0e0e0` | 16 | **hairline** — next neutral near canvas, hairline-border weight |
| `neutral-300` | `#cccccc` | 3 | — |
| `neutral-400` | `#bfbfbf` | 2 | — |
| `neutral-500` | `#ababab` | 2 | — |
| `neutral-600` | `#737373` | 3 | **text-muted** — most-used mid-luminance neutral |
| `neutral-700` | `#626457` | 1 | — |
| `neutral-800` | `#454749` | 2 | — |
| `neutral-900` | `#2e2e2e` | 15 | — |
| `neutral-950` | `#000000` | 43 | **ink** — darkest neutral, highest contrast against canvas |

### Accents

| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `red` | `#de8579` | 3 | **accent** — most-used chromatic color |
| `blue` | `#3b82f6` | 3 | **accent-2** — supporting chromatic color |
| `teal` | `#1c5f4a` | 2 | **accent-3** — supporting chromatic color |
| `red-2` | `#d92f18` | 2 | — |
| `lime` | `#cee7b6` | 1 | — |
| `lime-2` | `#c0fd00` | 1 | — |
| `green` | `#03c04a` | 1 | — |
| `lime-3` | `#465c35` | 1 | — |
| `orange` | `#fec8a6` | 1 | — |
| `orange-2` | `#fb7522` | 1 | — |
| `red-3` | `#65303d` | 1 | — |
| `pale-indigo` | `#d6c8ff` | 1 | — |

## Typography

**aktiv-grotesk** 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 |
| --- | --- |
| aktiv-grotesk | 3 |
| bold | 1 |
| arial | 1 |

**Size scale (px):** `12`, `14`, `16`, `18`, `20`, `21`, `24`, `26`, `28`, `32`, `48`, `72`

**Weights in use:** `100` (x1), `300` (x2), `400` (x6), `500` (x3), `600` (x1), `700` (x2)

**Line-heights (unitless):** `1`, `1.2`, `1.3`, `1.31`, `1.4`, `1.43`, `1.5`, `2.81`

**Letter-spacing values:** `-.18px`, `-.01em`, `.012em`, `.2px`, `.1em`

## Spacing

Most-used values (px): `4`, `8`, `10`, `12`, `16`, `20`, `24`, `28`, `32`, `40`, `48`, `56`

11 of 12 values sit on a 4px grid.

## Border radius

| Token | Value | Usage |
| --- | --- | --- |
| `radius-sm` | `.25rem` | 5 |
| `radius-md` | `10px` | 2 |
| `radius-lg` | `1rem` | 2 |
| `radius-xl` | `20px` | 2 |
| `radius-2xl` | `1.5rem` | 3 |
| `radius-3xl` | `50px` | 2 |
| `radius-4xl` | `200px` | 2 |
| `radius-full` | `50%` | 9 |

## Shadows (ordered by blur radius)

- `shadow-sm` — `0 0 10px gray` (x1)

## Breakpoints

`575px`, `640px`, `767px`, `768px`, `991px`, `1023px`, `1024px`, `1200px`

## 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); /* #de8579 */
  color: var(--color-ink); /* #000000 — contrast 7.7:1 */
  border-radius: 9999px; /* pill — mined as 50% */
  font-weight: 500;
}

.card {
  background: var(--color-surface); /* #eeeeee */
  border: 1px solid var(--color-hairline); /* #e0e0e0 */
  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); /* #e0e0e0 */
  border-radius: .25rem;
  /* placeholder color: var(--color-text-muted) #737373 */
}

.nav {
  background: var(--color-canvas); /* #ffffff */
  border-bottom: 1px solid var(--color-hairline); /* #e0e0e0 */
  color: var(--color-ink); /* #000000 */
  /* inactive links: var(--color-text-muted) #737373 */
  /* active link: var(--color-accent) #de8579 — contrast vs canvas 2.7:1 */
}

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

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

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

.input-success {
  border-color: #1c5f4a; /* mined token: teal */
}
```

## Observations

- 11 of 23 extracted colors are neutrals.
- 1 distinct shadow; the softest reaches 0px blur.
- 8 breakpoints, from 575px to 1200px.
- 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 {
  --tw-xGrid-x0: 0vw;
  --tw-xGrid-x0p5: 1.8518518518518519vw;
  --tw-xGrid--x0p5: -1.8518518518518519vw;
  --tw-xGrid-x1: 3.7037037037037037vw;
  --tw-xGrid-x1p5: 5.555555555555555vw;
  --tw-xGrid--x1: -3.7037037037037037vw;
  --tw-xGrid--x1p5: -5.555555555555555vw;
  --tw-xGrid-x2: 7.407407407407407vw;
  --tw-xGrid-x2p5: 9.25925925925926vw;
  --tw-xGrid--x2: -7.407407407407407vw;
  --tw-xGrid--x2p5: -9.25925925925926vw;
  --tw-xGrid-x3: 11.11111111111111vw;
  --tw-xGrid-x3p5: 12.962962962962964vw;
  --tw-xGrid--x3: -11.11111111111111vw;
  --tw-xGrid--x3p5: -12.962962962962964vw;
  --tw-xGrid-x4: 14.814814814814815vw;
  --tw-xGrid-x4p5: 16.666666666666668vw;
  --tw-xGrid--x4: -14.814814814814815vw;
  --tw-xGrid--x4p5: -16.666666666666668vw;
  --tw-xGrid-x5: 18.51851851851852vw;
  --tw-xGrid-x5p5: 20.37037037037037vw;
  --tw-xGrid--x5: -18.51851851851852vw;
  --tw-xGrid--x5p5: -20.37037037037037vw;
  --tw-xGrid-x6: 22.22222222222222vw;
  --tw-xGrid-x6p5: 24.074074074074073vw;
  --tw-xGrid--x6: -22.22222222222222vw;
  --tw-xGrid--x6p5: -24.074074074074073vw;
  --tw-xGrid-x7: 25.925925925925927vw;
  --tw-xGrid-x7p5: 27.77777777777778vw;
  --tw-xGrid--x7: -25.925925925925927vw;
  --tw-xGrid--x7p5: -27.77777777777778vw;
  --tw-xGrid-x8: 29.62962962962963vw;
  --tw-xGrid-x8p5: 31.48148148148148vw;
  --tw-xGrid--x8: -29.62962962962963vw;
  --tw-xGrid--x8p5: -31.48148148148148vw;
  --tw-xGrid-x9: 33.333333333333336vw;
  --tw-xGrid-x9p5: 35.18518518518518vw;
  --tw-xGrid--x9: -33.333333333333336vw;
  --tw-xGrid--x9p5: -35.18518518518518vw;
  --tw-xGrid-x10: 37.03703703703704vw;
}
```

## Files

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