---
version: alpha
name: wavelen-design
description: "A near-black instrument panel on a #0a0e12 canvas with #eef2f5 text, teal (#2dd4c8) for progress and identity and amber (#ffb020) for position in time. Space Mono carries every headline, number and timestamp, Inter carries prose and control labels. The page is laid out around a scrubbable waveform strip docked to the viewport floor: the strip is the episode navigator, and everything above it is a readout of where the strip is standing."
---
## Brand Positioning
Wavelen is a four-show podcast network for people who already listen to podcasts and are tired of being onboarded onto one. It exists because a podcast network's front page is almost always the same page: a centred photo of a microphone, a headline nobody wrote on purpose, three platform badges, and a carousel of episode cards that tell you a title and a date and nothing about the thing itself. Wavelen's bet is that the most honest object a network can put on a page is the audio, drawn. So the whole current feed, six episodes end to end, is rendered as one continuous waveform and docked across the bottom of the screen, and dragging it is how you move between episodes. Every decision below serves that bet. The strip is the structure: it decides where the headline sits, how tall the first screen is, and what the rest of the page is for. Nothing on either page is decorative, and nothing claims to do something it does not do. There is no play button, because there is no audio, and a network this fussy about corrections does not get to fake a transport control.
colors:
accent: "#2dd4c8"
accent-hot: "#5fe6dc"
accent-alt: "#ffb020"
ink: "#eef2f5"
ink-muted: "#93a4b1"
canvas: "#0a0e12"
surface: "#10161c"
surface-raised: "#182028"
border: "#1e2830"
border-strong: "#2b3a45"
border-ui: "#5d7484"
focus-ring: "#eef2f5"
## Logo / Wordmark System
The mark is the instrument, at 20 by 16. Six amplitude bars around a horizontal centre axis, cut by one amber vertical rule at the 48% mark. The three bars behind the rule are teal, the three ahead of it are `--border-ui`. It is not a microphone, a headphone cup, a sound-wave arc, or a play triangle. It is the scrubber in miniature, with the same colour contract: teal behind the playhead, grey ahead of it, amber for the playhead itself.
```svg
```
- **Lockup**: mark, then a `0.55rem` gap, then "Wavelen" in Space Mono 700 at `1.05rem`, `-0.02em` tracking, sentence case. The mark is always left of the wordmark. Never stacked, never reversed, never centred over the word.
- **Minimum size**: mark not smaller than `18px` by `14px`. Below that the 1.5px playhead and the 2px bars merge. Wordmark not smaller than `0.9rem`.
- **Clearspace**: empty margin equal to the mark's own height (16px at default size) on all four sides.
- **Don't**: don't recolour the mark. Don't put the playhead in the middle of the six bars, its 48% offset is the whole point, a centred rule reads as a symmetrical logo instead of a position. Don't flip the teal and grey groups, teal is always the passed side and always on the left. Don't animate the mark's playhead, the mark is a still frame of an instrument, not a second instrument. Don't set the wordmark in Inter.
## Color System
### Roles
| Role | Token | Value | Used for |
|---|---|---|---|
| Canvas | `--bg` | `#0a0e12` | Page background, scrubber track, cells, table body rows |
| Surface | `--panel` | `#10161c` | Nav, the strip, chapter panel, notice, follow form, footer, empty state |
| Surface raised | `--raised` | `#182028` | Filter segment hover |
| Border | `--border` | `#1e2830` | Card edges, row rules, dividers |
| Border strong | `--border-strong` | `#2b3a45` | Chapter hairlines inside the wave, disabled control edge, inactive chapter rule |
| Border UI | `--border-ui` | `#5d7484` | Every interactive boundary: scrubber frame, secondary button, input, filter frame, and the unplayed waveform itself |
| Ink | `--ink` | `#eef2f5` | Headlines, body copy, episode titles, focus ring |
| Ink muted | `--dim` | `#93a4b1` | Labels, meta lines, helper text, durations, footer lists |
| Progress accent | `--accent` | `#2dd4c8` | Played waveform, current segment, show names, primary button, transcript-ready status |
| Progress accent hot | `--accent-hot` | `#5fe6dc` | Primary button hover only |
| Position accent | `--accent-alt` | `#ffb020` | The playhead, the two clocks, the standing-notice rule, an episode still asking for attention, a form error |
The two accents split by job, and the split is printed on the page in the "Reading the strip" section, so it has to be true. **Teal is progress and identity**: what the playhead has passed, which show you are on, the one primary action. **Amber is position in time and the attention that goes with it**: the playhead, the feed clock, the chapter clock, "New this week", "Correction attached", and a field that needs correcting. A static list of keyboard bindings is neither, so those are `--ink`, not amber. There is deliberately no green and no red: "transcript ready" and "transcript in progress" are a word and a shape, not a traffic light, and an error is amber because on this page amber already means "look here now."
### Contrast (computed from the hex values above via WCAG relative luminance)
| Pairing | Ratio | Passes |
|---|---|---|
| `--ink` on `--bg` (headlines, body copy) | 17.2:1 | AAA |
| `--ink` on `--panel` (deck copy inside a panel, footer) | 16.2:1 | AAA |
| `--ink` on `--raised` (hovered filter segment) | 14.6:1 | AAA |
| `--dim` on `--bg` (meta lines, chapter rows, row notes) | 7.5:1 | AAA |
| `--dim` on `--panel` (labels, hints, footer lists) | 7.1:1 | AAA |
| `--dim` on `--raised` (hovered filter label) | 6.4:1 | AA |
| `--accent` on `--bg` (show names, segment numbers) | 10.5:1 | AAA |
| `--accent` on `--panel` (current segment, success helper) | 9.9:1 | AAA |
| `--accent-alt` on `--bg` (chapter clock, status words) | 10.6:1 | AAA |
| `--accent-alt` on `--panel` (feed clock, error helper) | 10.0:1 | AAA |
| `--bg` label on `--accent` fill (primary button, selected filter) | 10.5:1 | AAA |
| `--bg` label on `--accent-hot` fill (primary button hover) | 12.8:1 | AAA |
| `--dim` label on `--bg` (disabled control) | 7.5:1 | AAA |
| `--border-ui` control edge on `--bg` (non-text) | 4.0:1 | AA (1.4.11) |
| `--border-ui` control edge on `--panel` (non-text) | 3.7:1 | AA (1.4.11) |
| `--ink` focus ring on `--bg` (non-text) | 17.2:1 | AA (1.4.11) |
Two failures are load-bearing and are the reason for two specific rules:
**`--ink` on `--accent` measures 1.6:1.** Anything filled with teal labels itself in `--bg`, never in ink and never in white.
**`--accent-alt` on `--accent` measures 1.01:1.** Teal and amber sit at almost exactly the same relative luminance, which is a hue-only difference and effectively invisible to a large number of people. This has two consequences that the whole system obeys. First, **the focus ring is `--ink`, not either accent**, at `2px` with `2px` offset, so it always lands on canvas or panel and reads at 14:1 or better no matter which control it surrounds. Second, **the playhead carries a 1px `--bg` halo** (`box-shadow: 0 0 0 1px var(--bg)`). Without it, the most important mark on the instrument disappears at the exact moment it matters, when it crosses the teal it is meant to be leading.
`--border` at 1.3:1 and `--border-strong` at 1.7:1 are decorative only: card edges, row rules, and chapter hairlines drawn on top of a waveform, never a control boundary. Anything a person can click, type in, or drag gets `--border-ui` at 4.0:1. That split is why there are three border tokens rather than one.
typography:
display:
fontFamily: Space Mono
fontWeight: 700
body:
fontFamily: Inter
fontWeight: 400
## Type Scale
| Token | Size | Weight | Family | Line-height | Letter-spacing | Used for |
|---|---|---|---|---|---|---|
| `--text-episode` | `clamp(1.9rem, 4.4vw, 3.3rem)` | 700 | Space Mono | 1.06 | -0.035em | The episode under the playhead |
| `--text-page-h1` | `clamp(2rem, 5vw, 3.2rem)` | 700 | Space Mono | default | -0.04em | Second-page H1 |
| `--text-h2` | `clamp(1.3rem, 2.6vw, 2rem)` | 700 | Space Mono | default | -0.03em | Section headings |
| `--text-standing` | `clamp(1.05rem, 1.8vw, 1.35rem)` | 400 | Space Mono | 1.4 | -0.015em | The homepage H1, the standing line |
| `--text-clock` | `1.15rem` | 400 | Space Mono | 1 | 0 | The feed clock |
| `--text-clock-sm` | `1.05rem` | 400 | Space Mono | 1 | 0 | Chapter clock, episode durations |
| `--text-h3` | `1.08rem` | 700 | Space Mono | default | -0.02em | Episode titles in a list |
| `--text-body` | `1rem` | 400 | Inter | 1.65 | 0 | Paragraph copy |
| `--text-small` | `0.88rem` | 400 | Inter | 1.6 | 0 | Cell copy, footer links, chapter rows |
| `--text-meta` | `0.82rem` | 400 | Inter | 1.55 | 0 | Host and date lines, hints, status line |
| `--text-status` | `0.8rem` | 600 | Inter | 1 | 0.04em | Status words |
| `--text-control` | `0.75rem` | 600 | Inter | 1 | 0.09em | Button labels, uppercase |
| `--text-label` | `0.74rem` | 600 | Inter | 1 | 0.15em | Section kickers, form labels, footer headings, segment numbers |
| `--text-seg` | `0.7rem` to `0.72rem` | 400 to 600 | mixed | 1 | 0 to 0.07em | The four labels inside a scrubber segment |
Rule for Space Mono versus Inter: **Space Mono carries anything that is a title or a measurement**, because a monospace face makes every timestamp on the page align down a column without a single tabular-nums declaration, and because an episode title set in a typewriter face reads as a transcript rather than as marketing. **Inter carries anything a person reads as a sentence or clicks as a control.** Space Mono has exactly two weights here, 400 for numbers and the standing line, 700 for titles, and no italic, so hierarchy inside a heading comes from size and colour rather than a fake bold.
**Nothing functional is set below 11px.** The smallest type in the system is `0.7rem` (11.2px), and it appears only inside the scrubber's segment labels, where four facts have to fit into a column that can be 120px wide. Every one of those facts also appears at `--text-small` or larger in the feed list below, in plain markup, at all times.
## Spacing Scale
Base unit `8px`. Tokens in use: `--space-1: .25rem`, `--space-2: .5rem`, `--space-3: 1rem`, `--space-4: 1.5rem`, `--space-6: 2rem`, `--space-8: 3rem`, `--space-12: 4rem`.
Four structural constants sit outside the scale because they are measured, not spaced:
- `--nav-h: 60px`, the single nav line.
- `--strip-h: 184px` (`168px` below 760px), the docked scrubber. The document reserves exactly this much `padding-bottom`, so nothing on either page ever ends up underneath it.
- `--label-h: 36px` (`26px` below 760px), the label band inside a segment. The playhead starts below it, so a vertical amber rule never cuts through a line of text.
- The deck's first screen is `calc(100dvh - var(--nav-h) - var(--strip-h))`. The strip does not sit under the fold, it defines where the fold is.
## Shape
`--radius: 3px` on buttons, inputs, cards, the chapter panel, and the scrubber frame. Small enough to read as machined rather than friendly. Three things are deliberately square: the waveform bars (butt caps, `vector-effect: non-scaling-stroke`, so they hold 2px at every segment width), the strip itself, which is full bleed edge to edge and has no radius to have, and the standing-policy notice on the archive, which is a plate bolted to the wall rather than another card in the list. Depth is a 1px hairline and a step from `--bg` to `--panel` to `--raised`. No shadows, no glows, no glass, and no gradients anywhere except the 135 degree hatch that marks a control out of service.
## Iconography
No icon library and no pictograms. The only non-text marks in the system are structural, and every one of them is a reading of the same data:
- the logo mark, which is the scrubber in miniature,
- the waveform itself, one `` of vertical line commands per episode, drawn twice by `