Soundcheck design system

The visual language of soundcheck — London's nightlife discovery + diary, on the way to a Goodreads/Letterboxd for clubbing. Every token and component below is drawn from the live product, not invented. One rule above all: dark room, one salmon spotlight.

Foundations

Brand & voice

soundcheck lives under 6 Minutes — a community-owned London club. The product helps people find the night's best line-ups, preview a DJ's full set in one tap, and keep a diary of who they've seen and want to see.

Personality

Underground, knowledgeable, warm — a clued-in friend, never a corporate listings site. Confident and low-ego. The "6 Minutes" wink (YouTube sets start at 6:00) is the kind of detail that signals care without shouting.

Voice

DoDon't
"Heart any artist to add to your picks.""Click here to favourite an item."
"No upcoming London date yet.""No results found (0)."
Lowercase, plain, specific.Title Case Marketing Speak.
"Seen live", "Wanna see""Watched", "Watchlist"
Labels are short and human. UI eyebrows/labels are UPPERCASE with wide tracking; everything the user reads as a sentence is sentence case.
Foundations

Color

A near-black room with a single warm salmon spotlight. Salmon (--accent) is the only hue with meaning — it marks anything interactive, selected, or "yours". Everything else is greyscale so the accent never has to compete.

Background
#0f0f12 · --bg
Surface
#1b1b20 · --surface
Border
#28282f · --border
Foreground
#f3ece6 · --fg
Muted
#9292a0 · --muted
Accent (salmon)
#ff7a6b · --accent
Ink on accent
#1a0f0e · --ink
Error
#ff6b6b

Accent tints

Salmon at low opacity creates "soft selected" fills and washes — used for hovered calendar cells, picked rows, the wanna-see fill, and CTA panels.

Wash strong
salmon @ 18%
Selected fill
salmon @ 14–16%
CTA panel
salmon @ 8%
TokenUsed for
--bgPage canvas, input fields, ink-on-light contexts
--surfaceCards, sheets, dock, menus, overlays' content
--border1px hairlines, dividers, idle chip/button outlines
--fgPrimary text, idle icons
--mutedSecondary text, metadata, labels, idle controls
--accentInteractive, selected, "mine", links, focus
--inkText/icons sitting on a salmon fill
Contrast rule: never put --muted text on --surface for anything essential — it's for de-emphasis only. Text on salmon is always --ink (#1a0f0e), never white.
Foundations

Typography

Two families. Bricolage Grotesque (800/700) for display + anything branded — tight, characterful, set with negative tracking. Inter for body, metadata, and UI. The signature move: tiny UPPERCASE labels with wide letter-spacing as connective tissue.

h1 · Bricolage 800

London Tonight.

sheet title · 1.7rem
FOLD: All Night Long
card title · 1.05rem
Objekt + Call Super
section · sec-h
Upcoming in London
eyebrow
Tonight in London
lede · Inter 500
Hit ▶ next to any DJ to preview their full set.
body · Inter 15px
Default reading size, 1.55 line-height.
meta · 0.72rem
FOLD · Sun 14 Jun · 23:00

Scale & rules

RoleFamily / weightSizeTracking
Hero h1Bricolage 800clamp(2.8 → 5rem)-0.04em
Sheet / signup titleBricolage 8001.5–1.8rem-0.02em
Card / tile titleBricolage 7000.72–1.05rem-0.015em
Big aggregate numberBricolage 8001.7–2.4rem-0.02em
Section headerBricolage 8000.82rem+0.02em
Eyebrow / UI labelInter 7000.54–0.64rem+0.12 → 0.28em ▲ UPPER
Body / ledeInter 400–5000.92–0.96rem0
MetadataInter 6000.72rem0
Display type tightens (negative tracking) as it grows; labels loosen (positive tracking) as they shrink. Numbers in scrubbers/counts use font-variant-numeric:tabular-nums.
Foundations

Layout & spacing

Centered column, max-width:1180px, side padding that steps down on small screens (40 → 28 → 18px). Full-page in-app views (profile, artist, diary) cap content at 760px for readability.

The event grid

ViewportColumnsGap
Desktop (default)426 × 22px
≤ 920px3
≤ 620px2
≤ 380px1

Spacing is informal but consistent — common steps: 4 · 7 · 8 · 12 · 14 · 18 · 22 · 26px. Posters are a fixed 3:4 ratio; artist tiles are 1:1. Reserving these ratios up-front means images never cause layout shift.

Foundations

Radius & elevation

4px
badge
8px
input
10–12px
card/tile
14–18px
sheet/panel
999px
pill

Elevation is quiet. Surfaces sit on the canvas with a 1px --border hairline rather than shadows. Shadows appear only on things that genuinely float — the dock, menus, the picks chip, toasts.

flat · border only
menu / dropdown
dock (salmon top edge)
Overlays dim the room with rgba(0,0,0,.6) + backdrop-filter:blur(3px). The player dock is the one element with a 2px salmon top border — it's the "now playing" signature.
Foundations

Motion

UseDuration / easing
Hover (color, border, bg)120ms linear
Overlay fade in/out200–220ms
Sheet / dock slide300–320ms cubic-bezier(.4,0,.2,1)
Spinner0.8s linear loop
Ambient marquee375s linear loop (barely moving)

Restraint is the rule. Bottom sheets and the dock slide up with a soft decelerate; overlays cross-fade; controls give a 1px lift on hover. Buttons hovered nudge translateY(-1px). Nothing bounces.

Foundations

Iconography

Two icon vocabularies: line icons (Lucide-style, 24×24, stroke-width:2, round caps/joins, currentColor) for UI, and brand glyphs (SoundCloud, YouTube) in their own colors for source attribution.

Line icons inherit text color via currentColor, so a heart turns salmon simply by being inside an .on control. Brand glyphs keep their platform colors and are never recolored.
Foundations

Generative imagery

When a real poster or artist photo is missing, soundcheck never shows a grey box — it generates a deterministic gradient from the name's hash. Same name → same gradient, every time. Hues stay in the salmon → magenta family so fallbacks feel native, never random.

Event posters (3:4)

FOLD: All Night
Phonox Saturdays
M.O.T presents…

genPoster: hue = hash(title) → linear-gradient(ang, hsl(hue 68% 54%), hsl(hue+18 45% 11%)), with a 10% salmon screen tint over everything (real photos included) for tonal unity.

Artist tiles (1:1)

Objekt
Helena Hauff
Batu

artGrad: hue constrained to 330–400° (pink/salmon). Real artwork (SoundCloud avatar → RA image) layers on top when available, with a bottom-up black scrim so the name stays legible.

Components

Buttons & pills

Almost everything is a pill (border-radius:999px). Three weights: solid salmon (primary), ghost outline (secondary), and bare text. Form/CTA buttons use a softer 10px radius.

All ›
VariantWhen
Solid salmon + ink textThe one primary action in a view (Follow, Share, Send link)
Ghost (border + fg)Secondary action; hover turns salmon
Bare text (salmon)Tertiary / "More ›" / inline links
One solid salmon button per screen. If two CTAs sit together (e.g. Share / Copy), the secondary is always ghost.
Components

Toggles & switches

Segmented switches and quick-chips share one selected state: salmon fill, ink text. Idle is bordered/muted.

Selected = salmon fill. Hover (idle) = salmon border + salmon text. The same grammar covers the nav site-switch, date quick-picks, calendar modes, and profile tabs.
Components

Badges

Tiny uppercase tags in a salmon outline. Pick marks a venue soundcheck rates; Trending marks the most-saved event on a day.

Pick 🔥 Trending Objekt
Components

Play pills

A compact 48×23 pill carrying a brand glyph + a tiny state char. Idle is outlined; playing fills (salmon for SoundCloud, foreground-white for YouTube — matching the now-playing source).

Components

Heart · Share · Seen

Round 26–38px icon buttons (sized to context). Idle = muted outline. On = salmon stroke + soft salmon fill. These three carry the entire picks/diary interaction model.

ControlMeaning
Heart (filled)Wanna see (artist) / Saved (event)
Check (filled)Seen live
Share nodesShare this artist / event
Components

Event card

The workhorse. 3:4 poster (real or generated) is a button that opens the sheet; below it: optional Pick badge, title, venue · date · time meta, social proof, the line-up with per-artist play + heart, and a card-level heart/share row.

FOLD: All Night Long
Pick

Objekt + Call Super

FOLD · Sun 14 Jun · 23:00
  • Objekt
  • Call Super
Components

Artist tiles

1:1 gradient (or real artwork) with the name bottom-left and an optional salmon ✓ for "seen". Used on profile shelves — Wanna-see and Seen-live.

Objekt
Helena Hauff
Batu
Sherelle
Components

Stats & aggregates

Big salmon Bricolage numbers over tiny uppercase labels — the Letterboxd-y "this many people" texture. Inline panel-stats use bold foreground numbers in a muted sentence.

4.6avg from 5 logged gigs
12 have seen them live30 wanna see2 friends seen
23
Seen
41
Wanna see
12
Gigs
Components

Hub & profile

The account hub is built from action tiles; public profiles open with a gradient cover + circular initial avatar, a bordered stat strip, and tabs (Shelves / Diary / Network).

S
Suren
@suren
Components

Forms & autosuggest

Inputs sit on --bg (darker than the surface around them), 10px radius, salmon border on focus. Labels are tiny uppercase. Star ratings and removable artist chips power the log-a-gig flow.

Objekt Call Super
Components

Surfaces & overlays

Two families. Pages (profile, artist, diary, picks) are full destinations with a "‹ Back" pill and real browser history. Overlays are quick peeks — the event sheet and calendar slide up from the bottom; auth/email modals center. All dim the room with a blurred scrim.

SurfaceBehaviour
Event sheetBottom sheet (mobile) → centered (≥760px), 18px top radius, slide-up
Calendar / picks trayBottom sheet with blurred scrim
Auth / email gateCentered modal, 14–18px radius
Account menuAnchored dropdown, heavy shadow
Player dockFixed bottom bar, salmon top edge, slides up; collapses to a slim strip
Components

Feedback

Added to your picks ✓
Shared with youMaya sent you 3 picks
Tap ▶ to preview a full set
♥ 142 friends going
Toasts auto-dismiss (~2.8s). The shared-with-you banner and social-proof line use salmon to spotlight the social signal inside an otherwise muted row.
System

Patterns & principles

One spotlight. Salmon is reserved for interactive / selected / "yours". If everything is accented, nothing is.

Never an empty box. Missing poster or photo → a deterministic name-hashed gradient in the salmon family. The product always looks intentional, even with zero imagery.

Pages vs peeks. Destinations are real pages with back-history; quick actions are slide-up sheets. Don't nest a destination inside an overlay.

Mobile-first, thumb-first. Sheets rise from the bottom; the picks chip and dock sit in thumb reach; tap targets ≥26px with touch-action:manipulation.

Fast over fancy. Posters are downscaled + WebP through the image proxy; player SDKs load only on first play; surfaces use 1px borders instead of shadow stacks.

Source-honest. SoundCloud and YouTube keep their brand colors on play pills so people know exactly where a set comes from.

System

Accessibility

  • Focus uses a 2px salmon outline (outline:2px solid var(--accent)) — never removed without a replacement.
  • Icon-only controls carry aria-label and toggles expose aria-pressed.
  • Text on salmon is always --ink (#1a0f0e) for AA contrast; muted text is for non-essential copy only.
  • Gradient tiles/posters always carry the name as real text on top — the image is decorative, never the only label.
  • Body locks scroll behind sheets/overlays (iOS-safe, reference-counted) and restores position on close.
  • color-scheme:dark is declared so form controls and scrollbars render dark.

Soundcheck Design System v1 — generated from the live product. Tokens & component CSS mirror ra-london-sc/index.html; update both together.