Skip to content
WolfWave
Foundations

Foundations

WolfWave's core design tokens. Brand color scale, type ramp, spacing, radius, motion, and shadows. Generated from one tokens.json into Swift, CSS, JS, and TS.

TL;DR: these are the raw values behind every color, font size, gap, corner, and animation in WolfWave. Use the token name in code, never the number.

In SwiftIn CSS
DSColor, DSFont.Size, DSSpace, DSRadius, DSMotion, DSOpacity, DSDimension--ds-* custom properties

All values come from design-system/tokens.json. Edit there and run bun run tokens to regenerate every platform output.

Color

Brand scale

WolfWave's primary brand color is Apple System Blue (#0A84FF). The full scale is available for backgrounds, hover states, and accents.

50
100
200
300
400
500
600
700
800
900

Semantic

TokenLightDark
--ds-color-success#34C759#34C759
--ds-color-warning#FF9F0A#FF9F0A
--ds-color-error#FF453A#FF453A
--ds-color-info#0A84FF#0A84FF
--ds-color-neutral#8E8E93#8E8E93

neutral is the off / disconnected state. It is Apple's systemGray, the one system gray whose light and dark variants are identical, so a single flat value reads correctly in both themes.

Glyph

A status dot or icon sitting on its own 10% wash loses contrast in light mode, so each status color has a darker light-appearance glyph variant. Dark mode reuses the semantic tint above.

TokenLightDark
--ds-color-glyph-success#1E7B34#34C759
--ds-color-glyph-warning#9A5B00#FF9F0A
--ds-color-glyph-error#C9302C#FF453A
--ds-color-glyph-info#0066CC#0A84FF
--ds-color-glyph-neutral#6E6E73#8E8E93

Opacity

Tinted washes (status chips, callouts, the selected nav-rail row) use one of two fill opacities instead of a literal: --ds-opacity-wash 0.10 and --ds-opacity-wash-strong 0.14.

Surface & text

Surfaces and text colors swap on their own based on prefers-color-scheme / .dark class. Reference the abstract token, not the underlying hex.

SurfaceLightDark
surface-base#FFFFFF#000000
surface-surface#F5F5F7#1C1C1E
surface-elev#FBFBFD#0A0A0C
surface-hairline#D2D2D7#2C2C2E

Text

TokenLightDark
--ds-color-text-primary#1D1D1F#F5F5F7
--ds-color-text-secondary#505057#C0C0C6
--ds-color-text-muted#505057#B0B0B8

All three text roles meet AAA text contrast (at least 7:1) on the solid base, surface, and elev tokens in their appearance. bun run ds:test guards these pairs. This does not certify every component or transparent overlay: check actual composited backgrounds, focus indicators, and control states too.

Partner

Reserved for third-party brand identity (do not use as WolfWave brand):

partner-twitch #9146FF · partner-discord #5865F2 · partner-apple-music-start #FF5D8B → partner-apple-music-end #FA233B · partner-obs-start #2C2C2E → partner-obs-end #1A1A1C · partner-discord-surface #2B2D31 · partner-discord-control #4E5058 · partner-apple-music-surface-start #FA5C75 → partner-apple-music-surface-end #FA243B · partner-apple-music-pulse-start #FC4773 → partner-apple-music-pulse-end #FA1A52 · partner-wolfwave-gradient-start #0A2540 → partner-wolfwave-gradient-end #2563EB

Type scale

TokenpxUse
xs10Captions, smallest meta
sm11Tag, status chip
body12Body, dense rows
base13Default UI text
md14Row titles
lg17Section headers
xl20Subtle hero
2xl22Hero
3xl26Reserved for hero and the Monthly Wrap share card
display52Monthly Wrap headline figure
webSmall14Web labels and supporting text
webBody16Web body baseline
webSection48Desktop web section headings (30px on small screens)
webHero74Desktop web hero (38px on small screens)

Weights: regular 400, medium 500, semibold 600, bold 700.

In SwiftUI, use the heading ramp instead of picking sizes:

ModifierSizeRole
.paneTitle()22, boldPane title (H1)
.sectionHeader()17, semiboldSection (H2)
.sectionEyebrow()11, semibold, secondaryEyebrow (H3)
.fieldSubtitle()13, secondaryBody under a heading
.captionText()10, secondaryCaption, footnote

All five scale with the user's text size setting.

Families: --ds-font-family-display (Montserrat), --ds-font-family-sans (Roboto), --ds-font-family-serif (Instrument Serif fallback), --ds-font-family-mono (JetBrains Mono). The three web faces are self-hosted by Next.js at build time. Typography follows the MrDemonWolf website: 16px body, 1.6 or greater body line height, medium display headings, and responsive heading sizes. Native UI sizes remain the platform scale above.

Spacing

Thirteen steps. Indices align to common SwiftUI paddings, so they are not a strict 4px rhythm:

Tokenpx
space-02
space-14
space-1h6
space-28
space-310
space-412
space-514
space-616
space-720
space-824
space-928
space-1032
space-1144

Radius

TokenpxUse
xs4Small chips
sm6Hover backgrounds
md8Primary buttons
lg10Update banner
lg212Between lg and xl
xl14Cards, brand tiles
2xl16Onboarding hero
pill9999Capsules

Motion

TokenValue
duration-instant0 ms
duration-fast150 ms
duration-base220 ms
duration-slow320 ms
duration-long400 ms
duration-pulse900 ms
duration-pulseSlow1400 ms
easing-standardcubic-bezier(0.4, 0.0, 0.2, 1)
easing-emphasizedcubic-bezier(0.2, 0.0, 0, 1)

Springs (response in seconds, damping as a fraction):

TokenResponseDamping
snappy0.350.82
bouncy0.450.78
gentle0.300.60
expressive0.500.60

Respect prefers-reduced-motion. Drop to instant transitions.

Dimensions

DSDimension holds fixed sizes, like window sizes, the settings sidebar width, and chart heights. Use it for .frame(width:height:). DSSpace is only for gaps and padding. The full list is in tokens.json under dimension.

Shadows

TokenValue
shadow-xs0 1px 2px rgba(0,0,0,0.08)
shadow-sm0 2px 4px rgba(0,0,0,0.08)
shadow-md0 4px 12px rgba(0,0,0,0.10)
shadow-lg0 8px 32px rgba(0,0,0,0.20)
shadow-glow0 0 20px rgba(10,132,255,0.30)

On this page