All designs

Sonos

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

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

Sonos | Boxe wireless și sisteme de sonorizare pentru locuință

light-leaning · 2 stylesheets · 120 native variables

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

# Sonos | Boxe wireless și sisteme de sonorizare pentru locuință — Design System

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

> Sonos este cel mai bun sistem wireless de sonorizare pentru acasă: o rețea WiFi pentru întreaga casă care îți umple locuința cu sunet briliant, cameră după cameră.

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 blue (`#3b82f6`). **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` (`#3b82f6`) 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 |
| --- | --- | --- | --- |
| `blue` | `#3b82f6` | 3 | **accent** — most-used chromatic color |
| `teal` | `#1c5f4a` | 2 | **accent-2** — supporting chromatic color |
| `red` | `#de8579` | 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); /* #3b82f6 */
  color: var(--color-ink); /* #000000 — contrast 5.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) #3b82f6 — contrast vs canvas 3.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;
}
```

## Components

4 UI components were detected and rebuilt from the site's own CSS (see `components.html` for the rendered gallery):

- **Buttons** (3) — `Caută`, `Abonează-te`, `România`
- **Inputs** (1) — `Introdu adresa de e-mail`

Each is a reconstruction: real component classes matched against the extracted stylesheet with custom properties resolved. Hover/focus states are not captured.

## Files

- `tailwind.css` — Tailwind v4 `@theme` block; tokens become utilities (e.g. `bg-neutral-900`, `text-blue`). Semantic roles alias the base palette; sizes carry line-heights; dark mode included.
- `preview.html` — a visual style-guide of this system: palette cards, type scale, spacing tables, and do/don't guidelines.
- `components.html` — a rendered gallery of the detected UI components, each with a copyable snippet.
- `variables.css` — framework-agnostic `:root` variables with semantic aliases and a `data-theme="dark"` block.
- `tokens.json` — W3C DTCG design tokens: semantic aliases, composite shadow and typography tokens, for Figma plugins, Style Dictionary, etc.