Twilight Lavender DESIGN.md
Calm, contemplative, low-light. A deep midnight surface #1A1A2E) is the anchoring mood: the screen feels like a quiet room after dark, lit by a single lavender lamp. A saturated lavender #B794F4) and a warm butter-yellow #FFCB6B) carry every accent, the lavender for selection and primary action, the amber for streaks, energy, and warmth notes.
Screen example: Lavender Twilight.
Describe your app to generate screens with this visual style.
Read and download the full DESIGN.md

Color palette
- primary
#B794F4 - on-primary
#1A1A2E - accent
#FFCB6B - surface
#1A1A2E - surface-alt
#25253A - surface-muted
#2D2D44 - on-surface
#E2E2E8 - on-surface-variant
#9E9EB3 - border
#2D2D44 - chart-1
#F6AD55 - chart-2
#B794F4 - chart-3
#63B3ED - chart-4
#F687B3 - chart-5
#68D391 - destructive
#7F1D1D - illus-lavender
#B794F4 - illus-butter
#FFCB6B - illus-coral
#F687B3 - illus-forest
#68D391 - illus-sky
#63B3ED - illus-amber
#F6AD55
Typography
| Token | Font | Size | Weight | Line height |
|---|---|---|---|---|
| display-md | DM Sans | 30px | 500 | 36px |
| headline-lg | DM Sans | 24px | 500 | 30px |
| headline-md | DM Sans | 20px | 500 | 26px |
| headline-sm | DM Sans | 18px | 500 | 24px |
| body-md | Plus Jakarta Sans | 14px | 500 | 20px |
| body-sm | Plus Jakarta Sans | 12px | 400 | 18px |
| label-md | Plus Jakarta Sans | 14px | 500 | 20px |
| label-sm | Plus Jakarta Sans | 12px | 600 | 16px |
| label-uppercase | Plus Jakarta Sans | 10px | 700 | 14px |
| caption | Plus Jakarta Sans | 12px | 400 | 16px |
Corner radii
- sm
- 8px
- md
- 12px
- lg
- 16px
- xl
- 20px
- 2xl
- 24px
- 3xl
- 28px
- full
- 9999px
Spacing
- xs
- 4px
- sm
- 8px
- md
- 16px
- lg
- 24px
- xl
- 32px
- gutter
- 24px
- card-padding
- 16px
- card-padding-lg
- 20px
- section-gap
- 24px
The full DESIGN.md
Copy the source into your project. No sign-in required.
---
version: 1
name: Twilight Lavender Mobile
colors:
primary: "#B794F4"
on-primary: "#1A1A2E"
accent: "#FFCB6B"
surface: "#1A1A2E"
surface-alt: "#25253A"
surface-muted: "#2D2D44"
on-surface: "#E2E2E8"
on-surface-variant: "#9E9EB3"
border: "#2D2D44"
border-hairline: "rgba(255,255,255,0.05)"
border-hairline-strong: "rgba(255,255,255,0.10)"
chart-1: "#F6AD55"
chart-2: "#B794F4"
chart-3: "#63B3ED"
chart-4: "#F687B3"
chart-5: "#68D391"
destructive: "#7F1D1D"
illus-lavender: "#B794F4"
illus-butter: "#FFCB6B"
illus-coral: "#F687B3"
illus-forest: "#68D391"
illus-sky: "#63B3ED"
illus-amber: "#F6AD55"
typography:
display-md:
fontFamily: DM Sans
fontSize: 30px
fontWeight: 500
lineHeight: 36px
letterSpacing: -0.02em
headline-lg:
fontFamily: DM Sans
fontSize: 24px
fontWeight: 500
lineHeight: 30px
letterSpacing: -0.01em
headline-md:
fontFamily: DM Sans
fontSize: 20px
fontWeight: 500
lineHeight: 26px
letterSpacing: -0.01em
headline-sm:
fontFamily: DM Sans
fontSize: 18px
fontWeight: 500
lineHeight: 24px
letterSpacing: -0.005em
body-md:
fontFamily: Plus Jakarta Sans
fontSize: 14px
fontWeight: 500
lineHeight: 20px
letterSpacing: 0em
body-sm:
fontFamily: Plus Jakarta Sans
fontSize: 12px
fontWeight: 400
lineHeight: 18px
letterSpacing: 0em
label-md:
fontFamily: Plus Jakarta Sans
fontSize: 14px
fontWeight: 500
lineHeight: 20px
letterSpacing: 0em
label-sm:
fontFamily: Plus Jakarta Sans
fontSize: 12px
fontWeight: 600
lineHeight: 16px
letterSpacing: 0em
label-uppercase:
fontFamily: Plus Jakarta Sans
fontSize: 10px
fontWeight: 700
lineHeight: 14px
letterSpacing: 0.18em
caption:
fontFamily: Plus Jakarta Sans
fontSize: 12px
fontWeight: 400
lineHeight: 16px
letterSpacing: 0em
rounded:
sm: 8px
md: 12px
lg: 16px
xl: 20px
2xl: 24px
3xl: 28px
full: 9999px
spacing:
xs: 4px
sm: 8px
md: 16px
lg: 24px
xl: 32px
gutter: 24px
card-padding: 16px
card-padding-lg: 20px
section-gap: 24px
icons:
set: solar
default_variant: linear
active_variant: bold
stroke_weight: 1.5px
default_size: 24px
components:
card:
backgroundColor: "{colors.surface-alt}"
textColor: "{colors.on-surface}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.lg}"
padding: "{spacing.card-padding}"
boxShadow: none
card-feature:
backgroundColor: "{colors.surface-alt}"
textColor: "{colors.on-surface}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.3xl}"
padding: 0
boxShadow: "0 1px 2px rgba(0,0,0,0.20)"
button-primary:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
typography: "{typography.label-md}"
rounded: "{rounded.full}"
paddingX: 20px
paddingY: 8px
border: none
boxShadow: none
button-secondary:
backgroundColor: "rgba(59,59,88,0.5)"
textColor: "{colors.on-surface}"
typography: "{typography.label-md}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.full}"
paddingX: 20px
paddingY: 8px
boxShadow: none
button-text:
backgroundColor: "transparent"
textColor: "{colors.on-surface}"
typography: "{typography.label-md}"
border: none
boxShadow: none
paddingX: 0
paddingY: 0
button-icon-circle:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
rounded: "{rounded.full}"
size: 40px
iconSize: 16px
border: none
boxShadow: "0 4px 12px rgba(183,148,244,0.20)"
button-icon-circle-muted:
backgroundColor: "rgba(59,59,88,0.5)"
textColor: "{colors.on-surface-variant}"
rounded: "{rounded.full}"
size: 40px
iconSize: 16px
border: none
boxShadow: none
input-text:
backgroundColor: "{colors.surface-alt}"
textColor: "{colors.on-surface}"
typography: "{typography.body-md}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.xl}"
paddingX: 16px
paddingY: 16px
focusRingColor: "rgba(183,148,244,0.20)"
boxShadow: none
chip:
backgroundColor: "rgba(59,59,88,0.5)"
textColor: "{colors.on-surface}"
typography: "{typography.label-md}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.full}"
paddingX: 20px
paddingY: 8px
boxShadow: none
chip-active:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
typography: "{typography.label-md}"
rounded: "{rounded.full}"
paddingX: 20px
paddingY: 8px
border: none
boxShadow: none
badge-pill:
backgroundColor: "rgba(59,59,88,0.30)"
textColor: "{colors.chart-1}"
typography: "{typography.label-sm}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.full}"
paddingX: 12px
paddingY: 6px
boxShadow: none
badge-glass:
backgroundColor: "rgba(0,0,0,0.40)"
textColor: "#FFFFFF"
typography: "{typography.label-uppercase}"
rounded: "{rounded.sm}"
paddingX: 8px
paddingY: 4px
border: none
boxShadow: none
avatar:
rounded: "{rounded.full}"
borderColor: "{colors.border-hairline-strong}"
borderWidth: 1px
size: 48px
boxShadow: none
list-row:
backgroundColor: "{colors.surface-alt}"
textColor: "{colors.on-surface}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.lg}"
padding: 16px
gap: 16px
boxShadow: none
progress-bar:
backgroundColor: "{colors.surface-muted}"
rounded: "{rounded.full}"
height: 6px
border: none
boxShadow: none
category-tile:
backgroundColor: "rgba(59,59,88,0.30)"
textColor: "{colors.on-surface}"
borderColor: "{colors.border-hairline}"
borderWidth: 1px
rounded: "{rounded.xl}"
padding: 16px
boxShadow: none
top-app-bar:
backgroundColor: "{colors.surface}"
textColor: "{colors.on-surface}"
typography: "{typography.headline-lg}"
paddingX: 24px
paddingY: 24px
border: none
boxShadow: none
tab-bar-floating:
backgroundColor: "rgba(37,37,58,0.80)"
borderColor: "{colors.border-hairline-strong}"
borderWidth: 1px
rounded: "{rounded.full}"
paddingX: 24px
paddingY: 8px
boxShadow: "0 25px 50px -12px rgba(0,0,0,0.40)"
tab-item-active:
textColor: "{colors.primary}"
iconSize: 30px
background: none
tab-item-inactive:
textColor: "{colors.on-surface-variant}"
iconSize: 30px
background: none
---
# Twilight Lavender Mobile
## Overview
**Calm, contemplative, low-light.** A deep midnight surface (`{colors.surface}` `#1A1A2E`) is the anchoring mood: the screen feels like a quiet room after dark, lit by a single lavender lamp. A saturated lavender (`{colors.primary}` `#B794F4`) and a warm butter-yellow (`{colors.accent}` `#FFCB6B`) carry every accent — the lavender for selection and primary action, the amber for streaks, energy, and warmth notes.
The aesthetic is **composed and unhurried**: spacious vertical rhythm, hairline white borders at 5–10% alpha that whisper rather than divide, and a clear typographic two-track system — DM Sans (medium-weight, slightly tightened) for headlines, Plus Jakarta Sans for body and labels. Nothing shouts. Even the brightest accent (lavender on dark) reads as glowing rather than loud, because everything sits on a near-black canvas.
The signature chrome move is a **floating pill nav** — a translucent capsule docked above the bottom edge with backdrop blur and a soft drop shadow, separate from the page surface. Cards are tonal lifts (slightly lighter than the background) rather than shadow-elevated. Imagery is a soft, painterly companion — moody mid-distance landscapes, abstract wave fields — never photographic-bright, never illustrative-cartoon.
## Colors
The palette has three boundaries that must not blur:
**Chrome layer** (`{colors.surface}`, `{colors.surface-alt}`, `{colors.surface-muted}`, `{colors.on-surface}`, `{colors.on-surface-variant}`): the page background is the deepest tone (`#1A1A2E`); cards lift one step (`#25253A`); the muted layer (`#2D2D44`) is reserved for inert tracks (progress backgrounds, divider rules) and input fills when needed. Foreground text is `#E2E2E8` for full-attention copy and `#9E9EB3` for metadata.
**Brand & accent** (`{colors.primary}`, `{colors.accent}`): lavender is the single primary action color — active chip, primary CTA, active tab, focus ring at 20% alpha. Butter yellow (`#FFCB6B`) is reserved for warmth/highlight moments (streak indicators, secondary kicker labels on featured content). Never use both at full saturation in the same card; they are alternates, not partners.
**Categorical chart palette** (`{colors.chart-1}` through `{colors.chart-5}`): orange `#F6AD55`, lavender `#B794F4`, sky `#63B3ED`, pink `#F687B3`, mint `#68D391`. Use ONLY for differentiating peer items — categorical icon tiles, parallel progress fills, taxonomy. They appear inside soft 20%-alpha backgrounds (e.g. `bg-chart-1/20 text-chart-1` on a small icon square). Never as page-level chrome.
**Borders** are functionally invisible: a 1px `rgba(255,255,255,0.05)` hairline on cards and inputs (`{colors.border-hairline}`), upgraded to `rgba(255,255,255,0.10)` on the floating tab bar (`{colors.border-hairline-strong}`). They define the edge of a surface without contrasting with it.
**Illustration palette** (`illus-*`): the painterly imagery uses muted, dusk-leaning tones — lavender, butter, coral, forest, sky, amber. These tokens are for the artwork inside image frames, not for UI fills. UI never borrows the soft pastel range; imagery never borrows the saturated lavender at full strength.
## Typography
Two families, deliberate split:
**DM Sans** (`{typography.display-*}`, `{typography.headline-*}`) — geometric sans, weight **500 medium** as the default heading weight. Headlines are slightly tightened (`-0.01em` to `-0.02em`) to feel poised rather than bold. We never use 700+ for headings; the dark surface already provides plenty of contrast and bold weights would feel aggressive against the calm mood.
**Plus Jakarta Sans** (`{typography.body-*}`, `{typography.label-*}`, `{typography.caption}`) — humanist sans for everything below heading level. Body uses **500 medium** at 14px (notably heavier than typical body to hold up against the dark surface and small size); captions drop to 400 at 12px in `{colors.on-surface-variant}` for whispering metadata.
**Role assignments:**
- `{typography.display-md}` — primary screen title only when the screen needs a hero (e.g. greeting + name).
- `{typography.headline-lg}` (24px) — top-of-screen page title in the app bar.
- `{typography.headline-md}` (20px) — section anchors ("[Section name]" above scrollers and lists).
- `{typography.headline-sm}` (18px) — featured card titles.
- `{typography.body-md}` — paragraph and list-row primary lines.
- `{typography.body-sm}` / `{typography.caption}` — metadata, "Session 3 of 8 · [Subtitle]", duration captions in `{colors.on-surface-variant}`.
- `{typography.label-md}` — chip and button labels.
- `{typography.label-uppercase}` — tracked-out tiny kickers ("[N] DAYS", "[CATEGORY]") in `{colors.primary}` or `{colors.accent}` over featured cards. The wide letter-spacing (0.18em) is load-bearing here.
**Weight rule of thumb**: 500 is the workhorse for both heading and body. 700 only appears on micro-labels (`label-uppercase`, streak count). Never use 600 — it muddies the two-tier weight system.
## Spacing & Layout
**Generous, breathing.** Screen gutter is `{spacing.gutter}` (24px) — a noticeable inset from the edge that lets the dark canvas frame content. Section-to-section vertical gap is `{spacing.section-gap}` (24px); within a section, the section title sits 16px (`{spacing.md}`) above its content.
Cards have `{spacing.card-padding}` (16px) internal padding for compact list-row cards, and `{spacing.card-padding-lg}` (20px) for hero/feature cards with imagery.
Horizontal scroll rails (chip rows, course carousels) use `gap-3` (12px) or `gap-4` (16px) depending on whether children are tags or imagery cards.
The bottom of the page is reserved for the floating nav: pages need `pb-24` minimum so nothing scrolls under the docked pill.
## Elevation & Depth
**Tonal, not shadowed.** The hierarchy is built by stacking translucent or slightly-lighter surfaces over the dark page:
- Page surface: `#1A1A2E`
- Card (resting): `#25253A` — one step lighter
- Muted track / inert fill: `#2D2D44`
- Translucent overlay (chip-secondary, badge-glass): `bg-secondary/30` or `bg-secondary/50` — surface-alt at 30–50% alpha
Drop shadows appear in only **two** places:
1. The floating tab bar — a heavy soft shadow (`shadow-2xl shadow-black/40`) so it feels detached from the page.
2. The primary action button when icon-circle (small `shadow-primary/20`) — a faint lavender glow that hints at warmth.
Cards do NOT carry shadows. They lift via tonal contrast and the 1px hairline border at 5% white alpha.
## Shapes
A generous, rounded family — no square corners anywhere except brief glass badges:
- `{rounded.sm}` (8px) — small inline glass badges over imagery (e.g. session-count chip overlaid on a thumbnail).
- `{rounded.md}` (12px) — small thumbnail avatars inside list rows (the 64px image squares).
- `{rounded.lg}` (16px) — default card radius, list-row cards, progress bars at full pill.
- `{rounded.xl}` (20px) — text inputs, category tiles, image frames inside Programs scrollers.
- `{rounded.2xl}` (24px) — large list-row cards on the music tracklist.
- `{rounded.3xl}` (28px) — featured course cards (the most prominent imagery containers).
- `{rounded.full}` — every chip, every button, every nav element, every avatar, every circular icon-button. Pills are the dominant shape.
Rule of thumb: anything interactive is either fully pilled (`rounded-full`) or generously rounded (`rounded-2xl`+). Sharp corners feel out of place.
## Components
### card
```html
<div class="bg-card border border-white/5 rounded-2xl p-4 text-foreground">
<h4 class="font-heading text-base font-medium">[Card title]</h4>
<p class="text-xs text-muted-foreground mt-1">[Card metadata]</p>
</div>
```
### card-feature (with full-bleed image)
```html
<div class="min-w-[280px] bg-card rounded-3xl overflow-hidden border border-white/5 shadow-sm">
<img src="[image-url]" alt="" class="w-full h-40 object-cover" />
<div class="p-5">
<span class="text-[10px] text-primary uppercase font-bold tracking-[0.18em]">[Kicker label]</span>
<h4 class="font-heading text-lg font-medium text-foreground mt-1 mb-2">[Feature title]</h4>
<p class="text-sm text-muted-foreground line-clamp-1">[Short description.]</p>
</div>
</div>
```
The kicker color alternates between `text-primary` (lavender) and `text-accent` (butter) across a row of features to create rhythm.
### button-primary
```html
<button class="bg-primary text-primary-foreground px-5 py-2 rounded-full text-sm font-medium">
[Action]
</button>
```
### button-secondary
```html
<button class="bg-secondary/50 text-foreground border border-white/5 px-5 py-2 rounded-full text-sm font-medium">
[Action]
</button>
```
### button-icon-circle (primary play / forward)
```html
<button class="size-10 rounded-full bg-primary text-primary-foreground flex items-center justify-center shadow-sm shadow-primary/20">
<iconify-icon icon="solar:[icon-name]-bold" class="size-4"></iconify-icon>
</button>
```
For inert / locked variants, swap to `bg-secondary/50 text-muted-foreground` and drop the shadow.
### input-text
```html
<div class="relative group">
<iconify-icon icon="solar:[icon-name]-linear"
class="absolute left-4 top-1/2 -translate-y-1/2 text-muted-foreground text-xl group-focus-within:text-primary transition-colors size-5"></iconify-icon>
<input type="text"
class="w-full bg-card rounded-2xl py-4 pl-12 pr-4 text-sm focus:ring-2 focus:ring-primary/20 transition-all placeholder:text-muted-foreground/60 outline-none border border-white/5"
placeholder="[Placeholder text]" />
</div>
```
The leading icon switches from `muted-foreground` to `primary` on focus — small detail that makes inputs feel alive.
### chip / chip-active
```html
<button class="bg-primary text-primary-foreground px-5 py-2 rounded-full text-sm font-medium whitespace-nowrap">
[Active label]
</button>
<button class="bg-secondary/50 text-foreground border border-white/5 px-5 py-2 rounded-full text-sm font-medium whitespace-nowrap">
[Inactive label]
</button>
```
Chip rows scroll horizontally with `gap-3`, and the active chip is always the lavender pill.
### badge-pill (streak / status)
```html
<div class="flex items-center gap-2 bg-secondary/30 px-3 py-1.5 rounded-full border border-white/5 backdrop-blur-sm">
<iconify-icon icon="solar:[icon-name]-bold" class="text-chart-1 size-5"></iconify-icon>
<span class="text-sm font-bold text-chart-1">[Status text]</span>
</div>
```
### badge-glass (overlay on imagery)
```html
<div class="absolute bottom-3 left-3 bg-black/40 backdrop-blur-md px-2 py-1 rounded-lg text-[10px] text-white font-bold tracking-wider">
[META LABEL]
</div>
```
### avatar
```html
<img alt="" src="[image-url]" class="size-12 rounded-full border border-white/10" />
```
### list-row (with thumbnail + progress)
```html
<div class="bg-card p-4 rounded-2xl border border-white/5 flex gap-4 items-center">
<div class="size-16 rounded-xl overflow-hidden flex-shrink-0 bg-muted">
<img src="[image-url]" class="w-full h-full object-cover" />
</div>
<div class="flex-1 min-w-0">
<h4 class="font-medium text-sm text-foreground truncate">[Item title]</h4>
<p class="text-xs text-muted-foreground mb-3">[Subtitle / progress note]</p>
<div class="h-1.5 w-full bg-secondary rounded-full overflow-hidden">
<div class="h-full bg-chart-3 w-[35%] rounded-full"></div>
</div>
</div>
<button class="size-10 rounded-full bg-primary flex-shrink-0 flex items-center justify-center text-primary-foreground shadow-sm shadow-primary/20">
<iconify-icon icon="solar:[icon-name]-bold" class="size-4"></iconify-icon>
</button>
</div>
```
For locked/inactive rows, wrap in `opacity-80` and overlay the thumbnail with `bg-black/40` + a centered lock icon.
### progress-bar
```html
<div class="h-1.5 w-full bg-secondary rounded-full overflow-hidden">
<div class="h-full bg-chart-3 w-[35%] rounded-full"></div>
</div>
```
The fill color rotates through the chart palette to differentiate parallel items in a list. Use the same chart color consistently for a single item across screens.
### category-tile (in-scroller mini-card with icon + label)
```html
<div class="min-w-[120px] bg-secondary/30 border border-white/5 rounded-2xl p-4 flex flex-col items-center gap-3">
<iconify-icon icon="solar:[icon-name]-bold" class="text-3xl text-primary size-8"></iconify-icon>
<span class="text-xs font-medium">[Category]</span>
</div>
```
The icon color cycles through `text-primary`, `text-chart-1`, `text-chart-3`, `text-chart-5` etc. across a row to give each category its own hue.
### top-app-bar
```html
<header class="pt-12 px-6 pb-6">
<h1 class="font-heading text-3xl font-medium text-foreground">[Page title]</h1>
</header>
```
When the bar carries an avatar + greeting, the layout is a flex row: avatar on the left, eyebrow `label-uppercase` ("GOOD EVENING" pattern) above name in `{typography.headline-lg}`, and a status badge on the right.
### tab-bar-floating
```html
<nav class="fixed bottom-6 left-6 right-6 bg-card/80 backdrop-blur-lg border border-white/10 p-2 px-6 rounded-full flex justify-between items-center z-50 shadow-2xl shadow-black/40">
<button class="flex items-center justify-center p-2 text-primary">
<iconify-icon icon="solar:[icon-name]-bold" class="size-8"></iconify-icon>
</button>
<button class="flex items-center justify-center p-2 text-muted-foreground hover:text-foreground transition-colors">
<iconify-icon icon="solar:[icon-name]-linear" class="size-8"></iconify-icon>
</button>
<!-- repeat for each tab -->
</nav>
```
This is the signature chrome move. The floating pill is detached from the page edges (24px inset on all sides), translucent (80% surface-alt), backdrop-blurred, hairline-bordered at 10% white, and shadowed. The active tab is the lavender bold-variant icon; inactive tabs use the linear variant in `{colors.on-surface-variant}`.
### tab-item-active / tab-item-inactive
Active = `text-primary` + bold-variant icon. Inactive = `text-muted-foreground` + linear-variant icon. No pill backplate, no underline — the variant swap and color carry the entire active state.
### Tonal recipes (compositional, NOT new components)
- **Locked / disabled list row**: wrap the standard `list-row` in `opacity-80`, overlay its thumbnail with `bg-black/40` + a centered `solar:lock-bold` icon, and swap the trailing button to the muted variant (`bg-secondary/50 text-muted-foreground`, no shadow).
- **Categorical icon tile**: a 48px square in `bg-{chart-N}/20 text-{chart-N} rounded-xl` flex-centered around the icon. Used as the thumbnail for sound/category list rows.
- **Promo card** (subtle CTA card embedded in a section): `bg-primary/10 border border-primary/20 rounded-3xl p-6` with a primary-colored heading and a primary-fill icon-circle button on the right.
- **"View all" link**: a `{typography.label-md}` text link in `{colors.on-surface}` (or `{colors.primary}` when emphasized) — no underline, no chevron, no chrome.
### Composition recipe — section header
A section opens with a flex row: section title in `{typography.headline-md}` on the left, optional "[View all]" `button-text` in `{typography.label-md}` on the right, with `{spacing.md}` vertical gap to the content below. Section-to-section spacing is `{spacing.section-gap}`.
## Iconography
**Set: `solar`.** Solar's two variants — `linear` (1.5px stroke) and `bold` (filled) — drive the entire active/inactive convention.
- **Default state**: `solar:[icon-name]-linear` in `{colors.on-surface-variant}` (or `on-surface` for higher-attention positions).
- **Active state**: `solar:[icon-name]-bold` in `{colors.primary}` (or the relevant chart color for categorical icons).
- **Featured / emphatic state**: `solar:[icon-name]-bold` in `{colors.accent}` or `{colors.chart-1}` (for warmth/streak/energy contexts).
Default icon size is 24px (`size-6`), nav icons step up to 30–32px (`size-8`), trailing list-row action icons are 16px (`size-4`) inside a 40px circle.
Icons are sized with Tailwind classes (`size-6`, `size-8`, `size-4`) — never with HTML `width`/`height` attributes — to stay consistent with the rest of the snippet system.
## Illustration & Imagery
The aesthetic uses imagery as a soft, painterly companion to the dark UI — never bright, never photographic-realistic, never illustrative-cartoony. Two image archetypes appear: **moody mid-distance landscape paintings** (foggy forests, sunset silhouettes, dim windows lit from outside) and **abstract layered wave fields** (smooth pastel curves stacked horizontally, suggesting horizons or gentle motion).
- **Style / Technique**: soft digital painting with airbrushed edges and atmospheric perspective for landscape imagery; flat layered vector with smooth gradient transitions between bands for abstract wave imagery. Both share a hand-painted-yet-digital feel — visible softness, no hard outlines, no harsh detail.
- **Palette**: each illustration uses 2–4 colors max, drawn from `{colors.illus-lavender}`, `{colors.illus-butter}`, `{colors.illus-coral}`, `{colors.illus-forest}`, `{colors.illus-sky}`, `{colors.illus-amber}`. Within a single image, colors are dusk-saturation — desaturated enough to feel hushed but warm/cool enough to carry mood. Forest scenes lean monochromatic green-teal; sunset scenes lean coral + butter + lavender; abstract waves often pair lavender + butter or stack monochrome blue-teal.
- **Edge treatment**: NO outlines anywhere. All shape boundaries are soft paint edges or smooth color-band transitions.
- **Shading & light**: atmospheric, single ambient source (a glowing low sun, a hidden window light) — never directional cel-shading. Wave imagery is flat-tonal with no shading; landscape imagery has soft fog gradients.
- **Composition & framing**: subject sits centered or distributed across the frame with significant breathing room; horizons and sun discs sit slightly above center. Abstract wave imagery fills the frame edge-to-edge. There is always negative space — never cluttered.
- **Background within the illustration**: the painted scene IS the background (sky, fog, water) — no transparent cutouts.
- **Container styling**: images sit inside `{rounded.2xl}` (course feature cards, 24px) or `{rounded.xl}` (program tiles, 20px) frames with `border border-white/5` (1px hairline at 5% white). Padding inside the container around the image is **0** — images bleed full-width to the card's rounded corners. Container background where image doesn't reach: `{colors.surface-alt}`.
- **CSS treatment on `<img>`**: always `object-cover`, full width, fixed aspect (h-40 for course cards, aspect-[4/5] for program tiles, size-16 for list-row thumbnails). No `mix-blend-mode`, no opacity reduction, no filter. The image renders at full intensity inside its frame.
- **Box-shadow on the image or its frame**: none — image sits flat on the card surface. The card itself may carry the optional `shadow-sm` for featured variants, but the image inside has no separate shadow.
- **Aspect ratio rule**: course feature cards are 280×160 (≈7:4 landscape); program tiles are 4:5 portrait; tracklist thumbnails are 1:1 square; greeting avatars are 1:1 circular. Crop to fit; preserve subject centering.
- **Anti-references**: NOT photographic with bright daylight, NOT 3D rendered, NOT claymation, NOT line-art, NOT children's-book cartoon, NOT pixel art, NOT high-contrast or sharp-edged, NOT overly saturated.
- **Style recipe prompt**: *A soft digital painting of [SUBJECT], rendered with airbrushed atmospheric edges and no outlines. Dusk-saturation palette of 2–4 muted colors drawn from lavender, butter yellow, coral, forest green, soft teal, and amber. Single ambient light source — a low glowing sun or diffuse fog light — with smooth gradient transitions between color bands. Hushed, contemplative, twilight mood. Composition centered with generous negative space. NOT photographic, NOT 3D, NOT cartoon, NOT high-contrast, NOT sharp-edged.*
For abstract / non-figurative needs (e.g. category banners, mood backdrops), use the wave variant: *Smooth flat-vector layered wave bands stacked horizontally, in a 2-color dusk palette (e.g. lavender + butter, or stacked monochrome teal). No outlines, soft gradient between bands, gentle organic curves. Calm, meditative, abstract.*
## Hierarchy & Emphasis
What gets weight, in order:
1. **Saturated lavender fill** (chip-active, button-primary, active tab icon) — reserved for the single most-important interactive element on screen.
2. **DM Sans 500 at 24–30px** — primary screen titles command top-of-screen attention.
3. **Imagery** — feature card images carry weight through scale and color, but always inside a contained frame.
4. **Tonal lift to `surface-alt`** — anything in a card stands out from the page just enough to read as "a unit".
5. **`{colors.on-surface-variant}` muted text** — metadata, captions, and inert subtitles always whisper.
Active states win attention by **switching from line to bold icon variant + flipping color to lavender**, never by adding chrome (no underlines, no backplate pills behind tab icons).
## Distinctive Details
1. **The floating tab pill.** The single most recognizable chrome move: a translucent backdrop-blurred capsule docked 24px above the bottom edge with a heavy soft shadow. It feels like it's floating over the content rather than anchored to the screen frame. Active state is variant-switch only — bold icon + lavender — no pill behind the icon.
2. **Hairline white-alpha borders.** Every card, input, chip, and surface carries a 1px border at `rgba(255,255,255,0.05)`. Individually invisible; collectively they give every surface a crisp outer edge against the dark canvas without any visual weight. The floating nav steps up to 10% to feel slightly more architectural.
3. **Tracked-out micro-kickers in alternating accent colors.** Featured cards open with a tiny `label-uppercase` (10px, weight 700, 0.18em letter-spacing) — alternating between `text-primary` lavender and `text-accent` butter across a row to give the carousel rhythm. The wide tracking is load-bearing; without it the kicker collapses into ordinary metadata.
## Do's and Don'ts
### Do
- Use lavender (`{colors.primary}`) as the single primary action color, sparingly.
- Reach for `{colors.accent}` butter yellow for warmth/streak/highlight moments only.
- Build hierarchy with tonal lifts (`surface` → `surface-alt` → translucent overlays), not shadows.
- Use the chart palette ONLY for categorical differentiation (parallel progress bars, peer category icons).
- Render active icons as the **bold** variant in lavender; inactive as **linear** in `on-surface-variant`.
- Round generously: chips, buttons, nav, avatars are always `rounded-full`.
- Frame imagery in `rounded-xl`+ with a 5%-white hairline and zero padding inside the frame.
- Float the tab bar 24px above the bottom edge with backdrop blur, hairline, and `shadow-2xl shadow-black/40`.
- Keep headings at DM Sans **500** medium — never bolder.
### Don't
- Don't put shadows on cards. Tonal lift only.
- Don't use lavender and butter at full saturation in the same component.
- Don't bring chart colors into UI chrome (page surface, default text, button fills).
- Don't use heading weights of 600 or 700 — it breaks the calm tone.
- Don't outline illustrations or render them with hard cartoon edges.
- Don't insert bright daylight photography. Imagery must read as dusk / fog / dim light.
- Don't add pill backplates behind active tab icons — variant swap + color is the entire treatment.
- Don't use `{rounded.sm}` (8px) or sharper anywhere except small inline glass badges over imagery.
- Don't size icons with HTML `width`/`height` attributes — always Tailwind `size-*` classes.
- Don't let cards sit flush to the screen edge — respect the 24px gutter.
- Don't borrow saturated UI lavender into the illustration palette, or soft pastel illustration colors into UI fills.
These files follow the Google Labs format with Sleek extensions. Learn how to load DESIGN.md in your coding agent.





