Terminal Design System

The surface component sets background, border, texture, and scoped text tokens via data-surface. All content should sit on a surface. Surface type determines texture — cream gets dots, navy gets hatch, red gets cross-hatch.

Page Header

Consistent title block for non-hero pages

Simple Title

With Subtitle

Additional context below the title

With Actions

Cream Surface

Default variant — dot pattern, light background

Heading on cream

Body text resolves to navy-800

Muted text resolves to cream-600

Subtle text resolves to cream-500

Faint text resolves to cream-400 (decorative only)

Navy Surface

Heroes, featured cards, departure board

Heading on navy

Body text resolves to navy-200

Muted text resolves to navy-300

Subtle text resolves to navy-400

Faint text resolves to navy-500 (decorative only)

Red Surface

Section headers, detail bar, accent cards

Heading on red

Body text resolves to red-100

Muted text resolves to red-200

Subtle text resolves to red-300

Faint text resolves to red-300 (decorative only)

With Dividers

Surface wrapping a divided list — dividers are the caller's responsibility

First item metadata
Second item metadata
Third item metadata

Empty State

Surface with centered message and optional action button

No calendar sources yet
No feeds yet

Without Texture

Explicit opt-out for dense data or form-heavy surfaces

No texture

Clean surface for dense content where dots would be distracting.

Weather Accent Surfaces

Flight category colors as surfaces — same text tokens, auto-resolved per surface

VFR
72°F
Body text on green
Muted label text
Subtle / raw METAR
MVFR
54°F
Body text on green
Muted label text
Subtle / raw METAR
IFR
45°F
Body text on red
Muted label text
Subtle / raw METAR
LIFR
32°F
Body text on dark red
Muted label text
Subtle / raw METAR

All Three — Same Markup

Same content block, three surfaces — text tokens auto-resolve

Cream
Heading
Body
Muted
Navy
Heading
Body
Muted
Red
Heading
Body
Muted