YouTube Downloader Design System

A code-truthful spec for a native-first desktop utility. The design direction is "invisible utility" — charcoal and off-white, one muted crimson accent, Inter at system weights. Nothing competes with the content being downloaded. Every token maps to a real CSS custom property in css/main.css; when code and this doc disagree, code wins.

1 font family 1 accent colour 2 platforms v1.0
01 · Identity

Invisible utility.

A desktop tool that downloads video. Three principles hold the whole thing together — break any one and it stops feeling native.

Trust the OS.Native window chrome, system controls, no custom titlebars. Inherits the platform's credibility.
One input, everything opt-in.Paste + click = done. Quality, trim, subs, cookies — all available, none required.
One accent, maximum contrast.Crimson does the work: CTAs, active states, progress. Everything else is charcoal or off-white.
02 · Color

Charcoal base. Muted crimson accent. Nothing else.

Near-black for the app itself; cool off-whites for the case-study light mode; one muted crimson that does all the heavy lifting. No gradients in the chrome, no secondary accent colours bleeding in.

Case-study backgrounds — cool neutral

bg
#FAFAF9
Page base, cool off-white
bg-subtle
#F4F2EF
Panel background, one step darker
bg-soft
#EDEBE8
Hover states, dividers

Text — charcoal scale

text
#1C1C1E
Primary, headings, labels
text-dim
#484848
Body, descriptions
muted
#727272
Captions, helper text

Accent & signals

crimson
#C0392B
Primary accent — Download CTA, active states, progress
crimson-mid
#D44232
Hover on crimson
success-teal
#2E7D6A
Download complete, subtitle confirmed
crimson-soft
#F5E8E6
Tinted card backgrounds

App dark-mode surfaces

window-bg
#1C1C1E
Main window background (macOS dark mode)
card-bg
#2C2C2E
Input cards, panel surfaces
border-dark
#3A3A3C
Dividers and borders in dark mode
03 · Typography

Inter. System weights. No decorative families.

Inter is the closest web-safe equivalent to the macOS/Windows system font. Set at native weights — 400 for body, 600 for UI labels, 700 for headings. JetBrains Mono appears only on technical output: version strings, file sizes, progress values.

Inter 700Display · heading · 44/700 · -0.03em
YouTube Downloader
Inter 600Panel header · button · 28/600 · -0.02em
Download settings
Inter 400Body · UI · default · 16
Paste a YouTube URL and press Download. Choose your quality, trim start and end times if needed, and pick a subtitle language. The file lands in Downloads.
JetBrains MonoTechnical · eyebrows · progress · 11/600
yt-dlp 2024.12.13 · 1080p H.264 · 847.3 MB · 62%
04 · Spacing

A base-4 scale, matching macOS HIG guidance.

Eight steps mirroring the 4px grid the macOS Human Interface Guidelines recommend for layout and control spacing.

sp-1
4px
sp-2
8px
sp-3
12px
sp-4
16px
sp-5
24px
sp-6
32px
sp-7
48px
sp-8
64px
05 · Radius

Precise, not soft.

Tighter radii than a consumer app — matching macOS's own control language. Nothing rounded for the sake of friendliness.

Pill Status badges, nav links
r-pill · 999px
Card Input cards, panels
r-lg · 16px
Button Download CTA, controls
r-md · 12px
Chip Quality tags, file-type badges
r-sm · 6px
06 · Elevation

Every shadow is cool charcoal — never warm.

Warm shadows would pull the UI toward a different palette. Cool near-black alpha keeps cards looking like they sit on a desktop surface.

sh-sm
sh-card
glow-crimson
glow-teal
07 · Components

Native-weight controls on a dark stage.

Components render inside the app's dark window surface. They're shown on a dark stage here to match that context — they look wrong on white.

Download input + primary CTA

Quality picker chips

240p · 18 MB 480p · 62 MB 1080p · 284 MB 2160p · 1.4 GB mp3 · 6 MB

Progress indicator

Downloading · 62% · 3.2 MB/s · 0:28 left
08 · Motion

System-weight transitions, not animations.

Short, purposeful, invisible when prefers-reduced-motion is on. Nothing animates for decoration — every motion conveys state.

Download
Card appear fade + translateY, 220ms ease-out
Done
Completion tick scale 1 → 1.15 → 1, teal flash
panel
Panel open scale 0.94 → 1, opacity 0 → 1
Error
Error shake horizontal shake — standard OS pattern
09 · Voice

Plain, direct, never salesy.

The app talks to you like a well-written man page — direct, specific, and honest about what's happening. No enthusiasm, no hedging.

We say

"Paste a URL to get started."

"Download complete. 847.3 MB saved."

"Update yt-dlp from the Tools menu (⌘U)."

We don't say

"Awesome! Your video is ready to rock!"

"Oops! Something went wrong 😥"

"Want to unlock premium features?"

10 · Doing it wrong

Five ways to break the feel.

If a new screen does any of these, it doesn't belong in this app.

  • Don't add a second accent colour. Crimson does all the work. A teal CTA next to a crimson one creates hierarchy confusion. Teal is for success states only.
  • Don't use warm shadows. All shadows are cool near-black alpha. Warm shadows make the UI feel like a game or consumer app, not a utility.
  • Don't use rounded display fonts. Inter is the family. Rounded faces are explicitly not used — they undermine the native feel.
  • Don't show options the user didn't ask for. Trim, subtitles, cookies, re-encode are all opt-in. Never surface them by default. Progressive disclosure is a hard rule.
  • Don't place dark-mode components on white backgrounds. Components designed for the dark app window must use the dark stage wrapper in the case-study.
11 · Source of truth

Where every token actually lives.

This page documents the system; the code defines it. When they disagree, the code wins.

Tokenscss/main.css (:root block)
macOS UISources/YTDownloader/ContentView.swift
App stateSources/YTDownloader/AppState.swift
Windows UIwindows/templates/
App iconResources/AppIcon.icns
Source codegithub.com/ilan-stack/youtube-downloader →