Midnight Categorical Dashboard DESIGN.md
Editorial-tech, dark-mode, data-forward. A near-black canvas hosts crisp slate cards, each separated by a hairline border rather than shadow. Information is organized into a tight grid of metric tiles where every category claims its own saturated swatch, coral, periwinkle, butter-yellow, mint, violet, so that meaning is read by hue at a glance.
Screen example: Midnight Dashboard.
Describe your app to generate screens with this visual style.
Read and download the full DESIGN.md

Color palette
- background
#0F0F11 - surface
#1A1A1C - surface-alt
#27272A - on-surface
#FAFAFA - on-surface-variant
#A1A1AA - border
#3F3F46 - primary
#F7A5A5 - on-primary
#1A1A1A - secondary
#8E99F3 - on-secondary
#1A1A1A - accent
#FCE570 - on-accent
#1A1A1A - success
#4ADE80 - error
#EF4444 - chart-violet
#C084FC - chart-coral
#FF8577
Typography
| Token | Font | Size | Weight | Line height |
|---|---|---|---|---|
| display-lg | Space Grotesk | 30px | 900 | 1 |
| display-md | Space Grotesk | 24px | 900 | 1.1 |
| numeral-xl | Space Grotesk | 36px | 900 | 1 |
| numeral-lg | Space Grotesk | 24px | 900 | 1 |
| headline-md | Space Grotesk | 20px | 700 | 1.2 |
| body-md | Plus Jakarta Sans | 14px | 500 | 1.5 |
| body-sm | Plus Jakarta Sans | 12px | 500 | 1.4 |
| label-uppercase | Plus Jakarta Sans | 12px | 700 | 1 |
| label-micro | Plus Jakarta Sans | 10px | 700 | 1 |
| numeral-mono | JetBrains Mono | 12px | 500 | 1 |
Corner radii
- sm
- 4px
- md
- 12px
- lg
- 16px
- xl
- 24px
- full
- 9999px
Spacing
- xs
- 4px
- sm
- 8px
- md
- 12px
- lg
- 16px
- xl
- 20px
- 2xl
- 24px
- 3xl
- 32px
- gutter
- 16px
- card-padding
- 20px
- section-gap
- 16px
The full DESIGN.md
Copy the source into your project. No sign-in required.
---
version: 1
name: "Midnight Categorical Dashboard Mobile"
colors:
background: "#0F0F11"
surface: "#1A1A1C"
surface-alt: "#27272A"
on-surface: "#FAFAFA"
on-surface-variant: "#A1A1AA"
border: "#3F3F46"
primary: "#F7A5A5"
on-primary: "#1A1A1A"
secondary: "#8E99F3"
on-secondary: "#1A1A1A"
accent: "#FCE570"
on-accent: "#1A1A1A"
success: "#4ADE80"
error: "#EF4444"
chart-violet: "#C084FC"
chart-coral: "#FF8577"
typography:
display-lg:
fontFamily: "Space Grotesk"
fontSize: 30px
fontWeight: 900
lineHeight: 1
letterSpacing: -0.025em
display-md:
fontFamily: "Space Grotesk"
fontSize: 24px
fontWeight: 900
lineHeight: 1.1
letterSpacing: -0.02em
numeral-xl:
fontFamily: "Space Grotesk"
fontSize: 36px
fontWeight: 900
lineHeight: 1
letterSpacing: -0.02em
numeral-lg:
fontFamily: "Space Grotesk"
fontSize: 24px
fontWeight: 900
lineHeight: 1
letterSpacing: -0.01em
headline-md:
fontFamily: "Space Grotesk"
fontSize: 20px
fontWeight: 700
lineHeight: 1.2
letterSpacing: -0.01em
body-md:
fontFamily: "Plus Jakarta Sans"
fontSize: 14px
fontWeight: 500
lineHeight: 1.5
letterSpacing: 0em
body-sm:
fontFamily: "Plus Jakarta Sans"
fontSize: 12px
fontWeight: 500
lineHeight: 1.4
letterSpacing: 0em
label-uppercase:
fontFamily: "Plus Jakarta Sans"
fontSize: 12px
fontWeight: 700
lineHeight: 1
letterSpacing: 0.12em
label-micro:
fontFamily: "Plus Jakarta Sans"
fontSize: 10px
fontWeight: 700
lineHeight: 1
letterSpacing: 0.1em
numeral-mono:
fontFamily: "JetBrains Mono"
fontSize: 12px
fontWeight: 500
lineHeight: 1
letterSpacing: 0em
rounded:
sm: 4px
md: 12px
lg: 16px
xl: 24px
full: 9999px
spacing:
xs: 4px
sm: 8px
md: 12px
lg: 16px
xl: 20px
2xl: 24px
3xl: 32px
gutter: 16px
card-padding: 20px
section-gap: 16px
icons:
set: solar
default_variant: bold
active_variant: bold
stroke_weight: n/a (filled glyphs)
default_size: 24px
components:
card:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.xl}"
padding: "{spacing.card-padding}"
boxShadow: none
button-primary:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
typography: "{typography.label-uppercase}"
rounded: "{rounded.full}"
height: 48px
paddingX: 24px
border: none
boxShadow: "0 8px 24px rgba(247,165,165,0.3)"
button-secondary:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface-variant}"
typography: "{typography.label-uppercase}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.full}"
height: 36px
paddingX: 16px
boxShadow: none
button-text:
backgroundColor: transparent
textColor: "{colors.accent}"
typography: "{typography.label-uppercase}"
border: none
boxShadow: none
paddingX: 0px
paddingY: 0px
button-icon-square:
backgroundColor: "{colors.surface}"
textColor: "{colors.primary}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.md}"
size: 44px
iconSize: 24px
boxShadow: none
fab-circle:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
borderColor: "{colors.background}"
borderWidth: 4px
rounded: "{rounded.full}"
size: 56px
iconSize: 32px
boxShadow: "0 10px 25px rgba(247,165,165,0.3)"
input-text:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
typography: "{typography.body-md}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.lg}"
paddingX: 48px
paddingY: 16px
boxShadow: none
focusRingColor: "{colors.accent}"
chip:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface-variant}"
typography: "{typography.label-uppercase}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.full}"
paddingX: 16px
paddingY: 8px
boxShadow: none
chip-active:
backgroundColor: "{colors.secondary}"
textColor: "{colors.on-secondary}"
typography: "{typography.label-uppercase}"
border: none
rounded: "{rounded.full}"
paddingX: 16px
paddingY: 8px
boxShadow: none
badge-pill:
backgroundColor: "{colors.primary}/10"
textColor: "{colors.primary}"
typography: "{typography.label-micro}"
border: none
rounded: "{rounded.sm}"
paddingX: 8px
paddingY: 4px
boxShadow: none
badge-circle:
backgroundColor: "{colors.success}"
textColor: "{colors.on-surface}"
borderColor: "{colors.background}"
borderWidth: 2px
rounded: "{rounded.full}"
size: 16px
boxShadow: none
avatar:
backgroundColor: "{colors.surface-alt}"
borderColor: "{colors.border}"
borderWidth: 2px
rounded: "{rounded.full}"
size: 48px
boxShadow: none
list-row:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.xl}"
padding: "{spacing.lg}"
gap: "{spacing.lg}"
boxShadow: none
category-icon-tile:
backgroundColor: "{colors.surface-alt}"
textColor: "{colors.on-surface-variant}"
borderColor: "{colors.border}"
borderWidth: 1px
rounded: "{rounded.md}"
size: 48px
iconSize: 24px
boxShadow: none
progress-bar:
backgroundColor: "{colors.surface-alt}"
rounded: "{rounded.full}"
height: 8px
border: none
boxShadow: none
progress-ring:
backgroundColor: "{colors.surface-alt}"
rounded: "{rounded.full}"
border: none
boxShadow: none
top-app-bar:
backgroundColor: "{colors.background}"
textColor: "{colors.on-surface}"
paddingX: "{spacing.xl}"
paddingY: "{spacing.lg}"
border: none
boxShadow: none
tab-bar:
backgroundColor: "{colors.surface}"
borderColor: "{colors.border}"
borderWidth: 1px
paddingX: "{spacing.sm}"
paddingY: "{spacing.sm}"
boxShadow: none
tab-item-active:
backgroundColor: transparent
textColor: "{colors.primary}"
typography: "{typography.label-micro}"
iconSize: 24px
border: none
boxShadow: none
tab-item-inactive:
backgroundColor: transparent
textColor: "{colors.on-surface-variant}"
typography: "{typography.label-micro}"
iconSize: 24px
border: none
boxShadow: none
---
# Midnight Categorical Dashboard Mobile
## Overview
**Editorial-tech, dark-mode, data-forward.** A near-black canvas hosts crisp slate cards, each separated by a hairline border rather than shadow. Information is organized into a tight grid of metric tiles where every category claims its own saturated swatch — coral, periwinkle, butter-yellow, mint, violet — so that meaning is read by hue at a glance.
The voice is **bold and shouty**: oversized Space Grotesk display numerals carry the data, while everything else is set in tight, all-caps wide-tracked Plus Jakarta Sans, like editorial chrome on a magazine spread. The mood is athletic and analytical — confident, clinical, and a little aggressive — without ever feeling sterile, because the categorical palette injects warmth.
## Colors
The system runs in a strict three-layer dark stack:
- `{colors.background}` (`#0F0F11`) is the page — nearly black, slightly cool.
- `{colors.surface}` (`#1A1A1C`) is the card layer, lifted only by a hairline `{colors.border}` (`#3F3F46`). No shadows participate in elevation.
- `{colors.surface-alt}` (`#27272A`) is the deepest tonal step — used inside cards for input fills, progress-bar tracks, and category icon tiles.
Foregrounds: `{colors.on-surface}` (`#FAFAFA`) for primary type, `{colors.on-surface-variant}` (`#A1A1AA`) for secondary type and metadata.
The **categorical palette** (`primary` coral, `secondary` periwinkle, `accent` butter-yellow, `success` mint-green, `chart-violet`, `chart-coral`) is the soul of the aesthetic. Each color tags one category of data and is reused consistently every time that category appears — heading text, progress fills, icon tints, badges, dotted highlights. Saturated solid fills are reserved for the single most important call-to-action element on the screen (a featured tile, the FAB, or the active tab chip); everywhere else, categorical colors appear as **10% alpha tonal washes** behind their full-strength foreground (e.g. `bg-primary/10 text-primary`).
`{colors.error}` (`#EF4444`) and `{colors.success}` (`#4ADE80`) carry semantic meaning but are also free to play categorical roles.
**Boundary rule**: categorical colors NEVER fill an entire chrome surface (page background, full card, full tab bar). They always come in as tonal accent, glyph color, or a single signature solid block.
## Typography
Two typefaces, working as a duo:
- **Space Grotesk** (`font-heading`) — geometric sans with subtle quirks. Used at weight 900 (Black) for every numeral and headline. This is where the design shouts.
- **Plus Jakarta Sans** (`font-sans`) — neutral humanist sans. Used at weight 700 (Bold) for labels, captions, and metadata, almost always in **ALL CAPS with `tracking-widest` (~0.12em letter-spacing)**.
- **JetBrains Mono** (`font-mono`) appears in tiny doses for data ratios (`450/600`, `25/30`) where tabular precision matters.
- **Playfair Display** is loaded but unused in source chrome — reserve for editorial-display moments.
Roles:
- `{typography.display-lg}` and `{typography.display-md}` — screen titles, set uppercase. The headline is rendered with `font-black` (900) Space Grotesk, tight `tracking-tight`, `leading-none`.
- `{typography.numeral-xl}` / `{typography.numeral-lg}` — the data centerpieces. Always Space Grotesk Black. Data is the hero on every card.
- `{typography.headline-md}` — card sub-headlines like "Rings Closed".
- `{typography.label-uppercase}` and `{typography.label-micro}` — the connective tissue. `text-xs`/`text-[10px]`, weight 700, uppercase, `tracking-widest`. These read as section kickers, metric units, button copy, tab labels, status pills.
- `{typography.body-md}` / `{typography.body-sm}` — sparingly used; secondary descriptive text inside list rows.
- `{typography.numeral-mono}` — JetBrains Mono for inline ratio strings.
**Weight rule**: there is no middle weight. Headlines and numerals are 900; labels are 700; body is 500. Skip 400 and 600 entirely.
## Spacing & Layout
Density: **balanced-tight**. Cards sit close to each other (`gap-3` = 12px), generous internal padding (`{spacing.card-padding}` = 20px). Page gutter is `{spacing.gutter}` (16px); top header inset is `{spacing.xl}` (20px). The home grid uses a 2-column metric-tile pattern with selected cards spanning both columns.
Vertical rhythm is dictated by the consistent uppercase-kicker → display-numeral → progress-or-chart → metadata stack inside each card. Section gap between groups is `{spacing.section-gap}` (16px); larger conceptual breaks use 24px.
## Elevation & Depth
**This system is deliberately flat.** Cards do not float. Hierarchy is conveyed by:
1. **Tonal layering** — `{colors.background}` < `{colors.surface}` < `{colors.surface-alt}`.
2. **Hairline borders** — every card is enclosed by `border border-border` (1px, `#3F3F46`).
3. **Color saturation** — the loudest tile is the one with a saturated fill (e.g. accent-yellow card); everything else is dark-on-dark.
The only shadow in the system is a colored glow tied to the FAB and to brand-colored chart bars: `shadow-[0_0_15px_rgba(247,165,165,0.3)]` or `shadow-lg shadow-primary/30`. These are not depth shadows — they are aura effects that announce the active brand element.
## Shapes
Soft-rectangular, never circular for chrome. Radii roles:
- `{rounded.sm}` (4px) — chart bar tops, tiny pill badges.
- `{rounded.md}` (12px) — category icon tiles, square icon buttons, top-bar accessory chips.
- `{rounded.lg}` (16px) — text inputs, smaller content tiles.
- `{rounded.xl}` (24px) — the canonical card radius. Most surfaces use this.
- `{rounded.full}` — pills (chips, status badges, progress bars), avatars, the FAB.
The system reads as **chunky-soft**: 24px on cards is generous enough to feel friendly, but the strict hairline borders keep it architectural rather than puffy.
## Components
### card
Tokens: see `{components.card}`.
```html
<div class="bg-[#1A1A1C] border border-[#3F3F46] rounded-[24px] p-5">
<div class="flex justify-between items-start mb-4">
<div>
<h3 class="text-[#A1A1AA] text-xs font-bold uppercase tracking-widest">[Category]</h3>
<p class="text-2xl font-black font-[Space_Grotesk] text-white">[Card title]</p>
</div>
<div class="bg-[#27272A] p-2 rounded-full">
<iconify-icon icon="solar:[icon-name]-bold" class="size-5 text-white"></iconify-icon>
</div>
</div>
<!-- card body -->
</div>
```
**Featured-tile variant**: replace `bg-[#1A1A1C] border border-[#3F3F46]` with a saturated categorical fill (e.g. `bg-[#FCE570] text-[#1A1A1A] border border-[#FCE570]`). Inside the saturated tile, secondary text uses `text-accent-foreground/70` and dividers use `bg-accent-foreground/20`. Use this treatment on at most ONE tile per screen.
**Tonal-tile variant**: replace the dark surface with a 10%-alpha categorical wash and a 30%-alpha matching border (e.g. `bg-secondary/10 border border-secondary/30`); the kicker label switches to the full-strength categorical color.
### button-primary, button-secondary, button-text
```html
<!-- primary: pill-shaped, saturated coral, uppercase label -->
<button class="h-12 px-6 rounded-full bg-[#F7A5A5] text-[#1A1A1A] text-xs font-bold uppercase tracking-widest shadow-[0_8px_24px_rgba(247,165,165,0.3)] flex items-center justify-center gap-2">
[Action label]
</button>
<!-- secondary: pill, dark surface, hairline border -->
<button class="h-9 px-4 rounded-full bg-[#1A1A1C] border border-[#3F3F46] text-[#A1A1AA] text-xs font-bold uppercase tracking-widest">
[Action label]
</button>
<!-- text: bare uppercase label, accent color -->
<button class="text-xs font-bold uppercase tracking-widest text-[#FCE570]">
[Action label]
</button>
```
### button-icon-square
A square-radius surface housing a single icon, sitting in the top-app-bar accessory slot.
```html
<button class="size-11 bg-[#1A1A1C] border border-[#3F3F46] rounded-xl flex items-center justify-center">
<iconify-icon icon="solar:[icon-name]-bold" class="size-6 text-[#F7A5A5]"></iconify-icon>
</button>
```
### fab-circle
The hero floating action button, raised above the tab bar with a thick page-colored ring and a colored aura.
```html
<div class="relative -top-5">
<div class="size-14 bg-[#F7A5A5] rounded-full border-4 border-[#0F0F11] flex items-center justify-center shadow-lg shadow-[#F7A5A5]/30">
<iconify-icon icon="solar:[icon-name]-bold" class="size-8 text-[#1A1A1A]"></iconify-icon>
</div>
</div>
```
### input-text
```html
<div class="relative">
<iconify-icon icon="solar:magnifer-linear" class="absolute left-4 top-1/2 -translate-y-1/2 size-5 text-[#A1A1AA]"></iconify-icon>
<input type="text"
class="w-full bg-[#1A1A1C] border border-[#3F3F46] rounded-2xl py-4 pl-12 pr-4 text-sm text-white placeholder:text-[#A1A1AA] focus:outline-none focus:ring-2 focus:ring-[#FCE570]/50"
placeholder="[Search prompt]" />
</div>
```
### chip / chip-active
```html
<!-- inactive -->
<button class="px-4 py-2 rounded-full bg-[#1A1A1C] border border-[#3F3F46] text-[#A1A1AA] text-xs font-bold uppercase tracking-widest">[Label]</button>
<!-- active: solid categorical fill, no border -->
<button class="px-4 py-2 rounded-full bg-[#8E99F3] text-[#1A1A1A] text-xs font-bold uppercase tracking-widest">[Label]</button>
```
### badge-pill, badge-circle
```html
<!-- pill: low-alpha categorical wash with full-strength text -->
<span class="bg-[#F7A5A5]/10 text-[#F7A5A5] text-[10px] font-bold uppercase tracking-widest px-2 py-1 rounded">[Status]</span>
<!-- circle: status dot anchored to an avatar corner -->
<div class="size-4 bg-[#4ADE80] rounded-full border-2 border-[#0F0F11]"></div>
```
### avatar
```html
<div class="size-12 rounded-full border-2 border-[#3F3F46] overflow-hidden bg-[#27272A]">
<img alt="[Person]" src="[image-url]" class="w-full h-full object-cover" />
</div>
```
### list-row
A dark-card row built around a `category-icon-tile` on the left, two-line label/sublabel in the middle, and a right-aligned numeral + uppercase caption.
```html
<div class="bg-[#1A1A1C] rounded-2xl p-4 border border-[#3F3F46] flex items-center justify-between">
<div class="flex items-center gap-4">
<div class="size-12 rounded-xl bg-[#F7A5A5]/10 border border-[#F7A5A5]/20 flex items-center justify-center text-[#F7A5A5]">
<iconify-icon icon="solar:[icon-name]-bold" class="size-6"></iconify-icon>
</div>
<div>
<p class="font-bold text-white">[Primary label]</p>
<p class="text-xs text-[#A1A1AA]">[Sublabel]</p>
</div>
</div>
<div class="text-right">
<p class="font-bold text-white">[Value]</p>
<p class="text-[10px] text-[#A1A1AA] uppercase font-bold tracking-wider">[Status]</p>
</div>
</div>
```
**Empty/placeholder list-row recipe**: swap `border` for `border-dashed` and add `opacity-60`. The category-icon-tile becomes neutral (`bg-[#27272A]` with `text-[#A1A1AA]`), and the trailing element switches to a small circular add-button using the `accent` color.
### category-icon-tile
The categorical color-coded square that opens every list row. Always a 10%-alpha wash + 20%-alpha border + full-strength glyph in the same hue.
```html
<div class="size-12 rounded-xl bg-[#8E99F3]/10 border border-[#8E99F3]/20 flex items-center justify-center text-[#8E99F3]">
<iconify-icon icon="solar:[icon-name]-bold" class="size-6"></iconify-icon>
</div>
```
### progress-bar, progress-ring
```html
<!-- bar: thin, full-radius, surface-alt track -->
<div class="h-2 w-full bg-[#27272A] rounded-full overflow-hidden">
<div class="h-full bg-[#F7A5A5] w-[75%] rounded-full"></div>
</div>
<!-- ring: SVG, surface-alt track, categorical stroke, rounded line caps -->
<svg viewBox="0 0 100 100" class="size-32 -rotate-90">
<circle cx="50" cy="50" r="40" fill="transparent" stroke="#27272A" stroke-width="8" />
<circle cx="50" cy="50" r="40" fill="transparent" stroke="#F7A5A5" stroke-width="8"
stroke-linecap="round" stroke-dasharray="251.2" stroke-dashoffset="60" />
</svg>
```
Multiple concentric rings stack at 100% / 75% / 50% scale, each in a different categorical hue, to render combined progress.
### top-app-bar
Flush against the page (no border, no shadow). Headline left, optional accessory right.
```html
<div class="px-5 pt-12 pb-4 flex items-end justify-between">
<div>
<p class="text-[#A1A1AA] text-xs font-bold tracking-widest uppercase mb-1">[Eyebrow]</p>
<h1 class="text-3xl font-black font-[Space_Grotesk] uppercase tracking-tight leading-none text-white">[Screen title]</h1>
</div>
<!-- avatar OR button-icon-square as accessory -->
</div>
```
### tab-bar, tab-item-active, tab-item-inactive
A flat dark bar with hairline top border. The active item simply switches to `{colors.primary}` color — no pill background, no underline. The center slot hosts the FAB which rises above the bar.
```html
<div class="fixed bottom-0 left-0 right-0 bg-[#1A1A1C] border-t border-[#3F3F46] px-2 pb-6 pt-2">
<div class="flex items-center justify-around">
<!-- inactive -->
<div class="flex flex-col items-center gap-1 p-2 rounded-xl text-[#A1A1AA]">
<iconify-icon icon="solar:[icon-name]-bold" class="size-6"></iconify-icon>
<span class="text-[10px] font-bold uppercase tracking-wider">[Label]</span>
</div>
<!-- active: text-primary, no other change -->
<div class="flex flex-col items-center gap-1 p-2 rounded-xl text-[#F7A5A5]">
<iconify-icon icon="solar:[icon-name]-bold" class="size-6"></iconify-icon>
<span class="text-[10px] font-bold uppercase tracking-wider">[Label]</span>
</div>
<!-- center slot: fab-circle, raised -->
</div>
</div>
```
### Composition recipes (not separate components)
- **Stat-divider strip**: three center-aligned stat columns each showing `{typography.numeral-lg}` over a `{typography.label-micro}` caption, separated by a 1px vertical divider (`h-12 w-px bg-border mx-4`). Use to summarize headline metrics inside a card.
- **Bar-chart row**: a flex row of equal-width bars on a `{colors.surface-alt}` baseline. Inactive bars use `bg-primary/20`; the focal day uses full `bg-primary` with the colored aura shadow. Bars have `rounded-t-sm` only — flat at the bottom.
- **Achievement medallion**: a `size-16 rounded-full` ring with a `2px` border in a categorical color, a 20%-alpha matching wash inside, and a 32px categorical-tinted icon centered. Locked variant uses `{colors.surface-alt}` + `{colors.border}` and `opacity-40 grayscale`.
- **Tonal accent-action**: for a low-attention secondary CTA, render `button-primary` shape with `bg-primary/10 text-primary` instead of solid fill, and drop the shadow.
## Iconography
Source set: **Solar** (Iconify). Default and active variant: **`-bold`** (filled). The exception is `solar:magnifer-linear` for search-input affordances — line variants are reserved for inline glyphs that mark *interaction* rather than *category*.
Style character: rounded geometric, slightly chunky filled silhouettes, low detail. Pairs naturally with the chunky-soft chrome radii.
Sizes: 16px inside small kicker rows, 20px in pill/badge contexts, 24px is canonical (tabs, list rows, category tiles), 32px inside the FAB and achievement medallions.
Color rule: tab-bar icons inherit `text-on-surface-variant` when inactive and `text-primary` when active. Inside `category-icon-tile`, the icon is always the full-strength categorical hue matching its 10%-alpha background. Inside cards, single accessory icons take whichever categorical hue is associated with that card's data.
## Illustration & Imagery
**Note**: the only image present in the source HTML is a single user-portrait photograph used as an avatar (square crop, color photo of a person against a neutral studio background). There are no decorative illustrations. This section locks in how photography should be treated and explicitly forbids decorative illustrative imagery, which would clash with the dense data-tooling aesthetic.
- **Style / Technique**: photographic only, treated as identity/portrait or product imagery. Natural color, clean studio or daylight lighting, neutral or softly out-of-focus backgrounds. No filters, no duotones, no painterly effects. NOT illustrative, NOT 3D, NOT pixel, NOT collage.
- **Palette**: full natural color from the source photo. Photos are NOT recolored to match the categorical palette — keeping them as-is provides a humanizing counterpoint to the otherwise tightly tinted UI.
- **Edge treatment**: none on the image itself. The frame supplies the edge.
- **Shading & light**: as captured. Prefer photos with even lighting and a clearly separated subject so they read at small sizes.
- **Composition & framing**: tight crop on subject; subject roughly centered. Square or 1:1 crop is the default since photos are almost always presented as avatars.
- **Background within the image**: prefer neutral or mildly out-of-focus; avoid busy environments.
- **Container styling** (read directly from source): photos sit inside a `rounded-full` (avatar) or `rounded-2xl` container with `overflow-hidden`, a `border-2 border-[#3F3F46]` hairline, and a `bg-[#27272A]` placeholder fill that shows during load. Padding is 0 — the image is flush to the inside of the border.
- **CSS treatment on `<img>`**: `class="w-full h-full object-cover"`. No `mix-blend-mode`, no `opacity` change, no CSS `filter`.
- **Box-shadow on the image or its frame**: none — the photo sits flat on the surface. Elevation is conveyed by the frame's hairline border, not by shadow.
- **Aspect ratio rule**: lock to 1:1 (square / circle) for avatars. For larger imagery slots (rare), use 4:5 portrait or 16:9 inside a `{rounded.xl}` frame; always crop with `object-cover`.
- **Status decoration**: avatars may carry a single `badge-circle` overlay anchored bottom-right for online/status. Never overlay logos, gradients, or text on photographs.
- **Anti-references**: NOT 3D-rendered, NOT claymation, NOT flat-vector illustration, NOT cartoon/mascot, NOT line-drawing, NOT watercolor, NOT pastel scenes, NOT decorative icon-as-illustration scenes, NOT duotone or color-tinted treatments.
- **Style recipe prompt**: *Editorial-clean color photograph of [SUBJECT], natural daylight or soft studio lighting, neutral or gently out-of-focus background, tight centered framing, square 1:1 crop, sharp focus on subject, true-to-life color, no filter or stylization. The photograph is presented inside a circular or 24px-radius dark frame with a 1–2px slate hairline border and no shadow. NOT illustrated, NOT 3D, NOT cartoon, NOT painterly, NOT duotone.*
When a brief asks for "illustration" in this aesthetic, the right answer is **not a generated illustration** — it is one of: a saturated solid-color tile housing a `solar:-bold` glyph, an oversized typographic block in Space Grotesk Black, or a categorical `progress-ring` arrangement. The aesthetic communicates through type, color, and data shapes, never through scenes.
## Hierarchy & Emphasis
- **Numerals are the loudest element on every card** — Space Grotesk 900, large size, on-surface white.
- **Saturation flags importance**: the single most important card on a screen takes a saturated categorical fill; everything else is dark-on-dark. There is exactly one "loud" tile per visible screen at most.
- **Categorical color is meaning, not decoration** — once a category is assigned a hue, every appearance of that category (icon, progress fill, label, badge) reuses the same hue.
- **Labels whisper**: all-caps, weight 700, `text-xs`/`text-[10px]`, in `{colors.on-surface-variant}`. They identify; they do not compete.
- **Borders, not shadows, separate surfaces.**
## Distinctive Details
1. **All-caps wide-tracked label system**: the relentless use of `font-bold uppercase tracking-widest` at small sizes turns labels into a graphic motif. Even `bpm`, `kcal`, `vs yesterday`, and timestamp strips are uppercase-tracked.
2. **Categorical 10/20/100 tonal recipe**: 10%-alpha background + 20%-alpha hairline border + 100% glyph, repeated across icon-tiles, badges, and tonal accent cards. This single recipe is the reason the dark UI never feels muddy.
3. **Concentric activity-ring stack**: three SVG progress rings in three categorical hues, scaled at 100/75/50%, become a signature data sculpture for any "combined progress" pattern.
4. **Brand-colored aura shadow on the focal element**: `shadow-[0_0_15px_rgba(247,165,165,0.3)]` (or `shadow-lg shadow-primary/30`) used sparingly on the FAB and on the focal chart bar — a light source rather than a depth shadow.
## Do's and Don'ts
### Do
- Use `{colors.background}` for the page, `{colors.surface}` for cards, `{colors.surface-alt}` for inset wells (tracks, inputs, disabled tiles).
- Lift cards with a 1px `{colors.border}` hairline, never a shadow.
- Set numerals in Space Grotesk 900, labels in Plus Jakarta Sans 700 ALL CAPS with `tracking-widest`.
- Reserve solid categorical fills for the single hero tile or active state; everywhere else use the 10%-alpha wash + matching border + full-strength glyph recipe.
- Pick `solar:-bold` as the default icon variant; switch to `solar:-linear` only inside input affordances.
- Round cards at `{rounded.xl}` (24px), pills at `{rounded.full}`, icon-buttons at `{rounded.md}` (12px).
- Tag every category with a fixed categorical hue and reuse it everywhere that category recurs.
### Don't
- Don't use drop shadows for elevation. The only sanctioned shadow is the colored aura on the FAB / focal chart bar.
- Don't fill an entire card or page surface with `{colors.primary}` or `{colors.secondary}` — saturated fills are reserved for one focal element per screen.
- Don't introduce middle-weight type. Numerals are 900, labels are 700, body is 500. No 400, no 600.
- Don't set labels in mixed case or normal letter-spacing — they must be uppercase + `tracking-widest` to participate in the system.
- Don't add decorative illustrations, mascots, or stylized scenes. Express category through colored icon-tiles and typographic blocks.
- Don't recolor or filter photographs. Keep them natural-color inside a flat-bordered round frame.
- Don't invent a new categorical hue mid-design. Stay inside the defined palette (coral, periwinkle, butter-yellow, mint, violet, coral-red).
- Don't use the line variant of an icon for a category glyph; line is for interaction affordances only.
These files follow the Google Labs format with Sleek extensions. Learn how to load DESIGN.md in your coding agent.





