← Back to Blog
Design··14 min read

DDS — The dani design system

One monochrome foundation. Eighteen product accents. A single rectangular, monospace-data design language that scales across every dani app on every platform.

DDS (dani design system) is the visual language shared by every dani product — from dani.subs to dani.zone, dani.bot to dani.pet. It is deliberately narrow: one typographic scale, one spacing grid, one set of components, one monochrome base. The only thing that changes between products is the accent color — and even that is chosen from a single curated 18-hue palette spanning the color wheel.

This document is the complete specification. It defines the foundations, components, accent system, usage rules, accessibility floors, and per-platform implementations. Anything not documented here should not ship.

01 · Philosophy

DDS draws from four schools — Dieter Rams' functional discipline, the Swiss International Typographic style, Nothing OS's industrial monochrome, and Apple's platform polish. From each we took one thing:

02 · Color

The DDS color system has two layers. The monochrome base is shared across every product, dark mode and light mode. The accent is per-product and appears only on action surfaces.

Monochrome base

Nine tokens per mode. Memorize them. Never deviate.

Darkon #000000
bg#000000
surface#0B0B0B
surface_2#141414
border#1F1F1F
text#FFFFFF
text_2#777777
text_3#444444
Lighton #F7F7F7
bg#F7F7F7
surface#FFFFFF
surface_2#F0F0F0
border#E0E0E0
text#111111
text_2#666666
text_3#AAAAAA

Dark mode is matte black (#000000), not charcoal. This gives DDS its electronic/industrial character — closer to a piece of consumer hardware than a typical software UI. Light mode uses warm off-white (#F7F7F7) with pure-white surfaces stacked on top.

The 18 product accents

Each dani product is assigned a single hue from the color wheel. Every accent ships as a pair — a dark variant tuned for #000 surfaces (brighter, more saturated) and a light variant tuned for #F7F7F7 (deeper, denser). Never cross-use.

Dark accents18 hues · 0° → 339°
subs
news
penny
park
tos
money
snap
go
plant
budget
clean
zone
track
web
bot
photo
design
pet
Light accentssame hues · tuned deeper for white
subs
news
penny
park
tos
money
snap
go
plant
budget
clean
zone
track
web
bot
photo
design
pet
ProductNameDarkLight
dani.subsAlert Red#FF2D2D#E80000
dani.newsScarlet#FF4518#D11500
dani.pennyCopper#FF6B1A#C4470A
dani.parkSignal Orange#FF8A00#B26500
dani.tosAmber#FFB300#8F5C00
dani.moneyGold#FFD400#8C7000
dani.snapFlash Yellow#E8FF1A#5C7A00
dani.goLime#8AFF1A#3D7A00
dani.plantGreen#3AFF7D#0A8F3D
dani.budgetMint#00FFB0#008F5E
dani.cleanTeal#00E0C4#00806F
dani.zoneElectric Cyan#00F0FF#008A94
dani.trackSky#00B8FF#0070B2
dani.webBlue#3D7AFF#0047D6
dani.botViolet#8F5CFF#4B1FBF
dani.photoPurple#C14DFF#7A14B5
dani.designMagenta#FF4DD4#B51495
dani.petPink#FF4D8F#C4144F

All 18 accents are pre-verified for ≥4.5:1 contrastagainst their mode's surface (WCAG AA). White text on an accent button hits the same floor. If you need a new hue, don't invent one — pick the closest existing accent, or propose the addition in a design review.

03 · Typography

Two families. Space Grotesk is the voice of the UI. Space Mono is the voice of data — every number, date, code, label, and timestamp uses mono. This split is the system's signature.

Display28/600
Netflix Premium
Title20/600
Subscriptions
Heading18/600
Payment history
Body13/500
Netflix · renews 04 apr · monthly
Body sm12/500
secondary copy here
Amount36/700
$214.32
Data12/700
04.APR.2026
Label9/700
MONTHLY TOTAL
Micro8/700
08 NEW · X3

Labels are always uppercase with 0.08–0.12emletter-spacing, weight 700, 8–10px size. This is the "small tag" style that appears throughout — above section headers, inside pills, as hex-code labels, and in the bottom tab bar.

04 · Spacing

DDS is built on a 4px grid. Every padding, margin, gap, and dimension snaps to a multiple of 4. This is non-negotiable.

xs · 4
sm · 8
md · 12
lg · 16
xl · 20
xxl · 24

Screen padding is 16px horizontal. Card internal padding is 18px. Card-to-card gap is 14px. Section gap (between logical groupings on a screen) is 24px.

05 · Radii

DDS is rectangular. Three radii exist. There are no pills and no circles (except the small decorative dot indicators — the system's one exception to its own rule).

xs · 2px
phone screens
sm · 4px
controls, cards, buttons
md · 8px
phone frame outer

06 · Borders & depth

DDS uses borders instead of shadows. Two widths exist: 1px hairline for standard dividers and card boundaries, and 2px strong for emphasis and selected states. No drop shadows. Ever. Depth comes from surface stacking (surface over surface_2) and borders, never from blur.

07 · Motion

Motion is functional, not expressive. Two durations exist: 100ms for instant feedback (button press, tab switch) and 200ms for default state transitions (reveal, dismiss, route change). Easing is always ease-out. Haptic feedback is light.

There are no physics-based animations, no parallax, no particle effects, no easter egg flourishes. If a user can't explain what an animation is for, it shouldn't be there.

08 · Components

Every DDS component is built from the same primitives. A button is a rectangle with a 4px radius, a 1px border, a 14px padding, and uppercase semibold text. A card is a rectangle with a 1px border and 18px padding. The system is combinatorial — there are no special-case components.

Buttons

Dark
Light

List items

Dark
N
Netflix
RENEWS 04 APR · MONTHLY
$15.99
S
Spotify Family
RENEWS 11 APR · MONTHLY
$16.99
A
Adobe Creative
RENEWS 07 APR · MONTHLY
$54.99
Light
N
Netflix
RENEWS 04 APR · MONTHLY
$15.99
S
Spotify Family
RENEWS 11 APR · MONTHLY
$16.99
A
Adobe Creative
RENEWS 07 APR · MONTHLY
$54.99

Data card / totals

Dark
MONTHLY SPEND
$214.32
ANNUAL$2,571.84
Light
MONTHLY SPEND
$214.32
ANNUAL$2,571.84

Chips & tags

Dark
12 ACTIVE08 NEWTAG
Light
12 ACTIVE08 NEWTAG

Gauge / progress

Dark
PROGRESS · 5 OF 5
PROGRESS · 3 OF 5
PROGRESS · 1 OF 5
Light
PROGRESS · 5 OF 5
PROGRESS · 3 OF 5
PROGRESS · 1 OF 5

Inputs

Dark
$15.99
Netflix Premium
Light
$15.99
Netflix Premium

09 · Usage rules

These are the enforcement rules. Every design and code review applies them.

Accent applies to
  • · Primary button fill
  • · Key numeric values (amounts, counts)
  • · Active tab / selected state
  • · Alert badges and status pills
  • · Tag indicators (small dots)
  • · Section bullets
× Accent never applies to
  • · Body text
  • · Borders or dividers
  • · Page or card backgrounds
  • · Disabled / muted states
  • · Standard icons
  • · Section headers

10 · Accessibility

11 · Platform implementations

DDS tokens live in shared/design/dot-tokens.yaml as the single source of truth. Each platform mirrors them into native code. There is no auto-generation — the yaml is the contract, each project owns its translation.

Flutter (Dart)

// lib/core/theme/dds_tokens.dart
class DdsBase {
  // Dark
  static const darkBg        = Color(0xFF000000);
  static const darkSurface   = Color(0xFF0B0B0B);
  static const darkSurface2  = Color(0xFF141414);
  static const darkBorder    = Color(0xFF1F1F1F);
  static const darkText      = Color(0xFFFFFFFF);
  static const darkText2     = Color(0xFF777777);

  // Light
  static const lightBg       = Color(0xFFF7F7F7);
  static const lightSurface  = Color(0xFFFFFFFF);
  static const lightBorder   = Color(0xFFE0E0E0);
  static const lightText     = Color(0xFF111111);
  static const lightText2    = Color(0xFF666666);
}

class DdsAccent {
  // dani.subs
  static const dark  = Color(0xFFFF2D2D);
  static const light = Color(0xFFE80000);
}

class DdsRadii {
  static const xs = 2.0;   // phone screens
  static const sm = 4.0;   // all controls
  static const md = 8.0;   // phone frame
}

Next.js / Web

/* globals.css */
:root {
  /* Light mode (default) */
  --bg: #F7F7F7;
  --surface: #FFFFFF;
  --border: #E0E0E0;
  --text: #111111;
  --text-2: #666666;
  --accent: #E80000;  /* dani.subs light */
}

[data-theme="dark"] {
  --bg: #000000;
  --surface: #0B0B0B;
  --border: #1F1F1F;
  --text: #FFFFFF;
  --text-2: #777777;
  --accent: #FF2D2D;  /* dani.subs dark */
}

.btn-primary {
  background: var(--accent);
  color: #FFFFFF;
  border-radius: 4px;
  padding: 14px 16px;
  font: 600 12px 'Space Grotesk';
}

SwiftUI

// DdsTokens.swift
enum DdsBase {
  static let darkBg       = Color(hex: 0x000000)
  static let darkSurface  = Color(hex: 0x0B0B0B)
  static let darkBorder   = Color(hex: 0x1F1F1F)
  static let darkText     = Color(hex: 0xFFFFFF)

  static let lightBg      = Color(hex: 0xF7F7F7)
  static let lightSurface = Color(hex: 0xFFFFFF)
  static let lightBorder  = Color(hex: 0xE0E0E0)
  static let lightText    = Color(hex: 0x111111)
}

enum DdsAccent {
  static let dark  = Color(hex: 0xFF2D2D)
  static let light = Color(hex: 0xE80000)
}

12 · Governance & versioning

DDS is versioned semantically. The current version is 1.0.0.

Any change to the yaml must be mirrored in every consuming project's local token file before the next release of that project. The yaml is the contract.

DDS is not a design system you customize. It's a design system you live inside. The constraints are the feature.

Version 1.0.0 · Published April 5, 2026 · Tokens at shared/design/dot-tokens.yaml