Design System

Style guide

Salt-worn and credible. Weathered navy for structure, brass for the accent, warm sand underfoot. Every text pairing here is verified WCAG AA.

Colour

Six ramps. Reach for a semantic token first — the raw ramps exist so the semantic tokens have somewhere to point, not so components can use them directly.

hull

Structure, headings, dark bands, primary action.

50
100
200
300
400
500
600
700
800
900
950

brass

The accent. Mark, active state, emphasis, advisory.

50
100
200
300
400
500
600
700
800
900

sand

Warm ground. Page background and section banding.

50
100
200
300
400
500

ink

Warm neutral. All text and hairlines.

50
100
200
300
400
500
600
700
800
900

marsh

Good — biting, open season, in stock.

50
100
200
300
400
500
600
700
800

buoy

Alert — closed season, advisory, sold out.

50
100
200
300
400
500
600
700
800

Semantic tokens

TokenUseSwatch
--color-bgPage ground
--color-surfaceCards, panels
--color-surface-sunkenWells, table stripes
--color-borderHairlines
--color-border-strongInputs, dividers that must read
--color-textBody copy
--color-text-secondarySupporting copy
--color-text-mutedMeta, captions
--color-text-faintLeast emphasis (still AA)
--color-actionPrimary button fill
--color-accentBrand accent, focus ring
--color-accent-textLinks on light
--color-goodPositive state
--color-warnAdvisory
--color-badNegative state
--color-infoNeutral information

Typography

Archivo carries headings, UI, labels and data — an American grotesque that reads like harbour signage. Source Serif 4 is reserved for long-form prose, where it gives articles the weight of a printed field guide. Both are self-hosted variable fonts; there is no third-party font request.

Display

text-display · Hero headlines only. One per page.

Heading 1

text-h1 · Page title. Set by the <h1> element.

Heading 2

text-h2 · Section title.

Heading 3

text-h3 · Card and subsection title.

Heading 4

text-h4 · Dense subheads, list group labels.

Lead paragraph

text-lead · Standfirst under a headline.

Body

text-base · Default UI copy.

Small

text-sm · Secondary UI, table cells, form help.

Caption

text-caption · Metadata, timestamps, image credits.

OVERLINE

text-overline · Eyebrows and column headers. Always uppercase.

Prose specimen

Cobia show up on the nearshore wrecks once the water pushes past 68°F, usually the second week of May. Sight-cast a bucktail ahead of a cruising fish and hold on.

The serif is doing a job here: it slows the eye down for reading, and it signals that this is reference material rather than interface chrome.

Components

Buttons

Primary is navy, not brass — that keeps brass meaningful. Use accent for at most one action per page.

Badges

Status badges carry a dot or icon as well as colour, so they survive greyscale and colour-blindness.

FeaturedPremiumVerifiedRed DrumSurfNewBitingAdvisoryClosed seasonLive

Cards

Default

Hairline border, no shadow at rest.

Featured

Brass rule on top. No glow, no coloured box.

Clickable

Lifts 2px and gains a shadow on hover.

Flat

Sunken well for secondary content.

Form controls

Enter a valid email address.

Data table

PierWater tempWindStatus
Jennette's72.4°FSW 12 ktBiting
Avalon71.8°FSW 14 ktAdvisory
Rodanthe70.1°FNE 22 ktClosed

Radius, elevation, motion

Radius

Four steps, one rule each.

rounded-smBadges, tags, chips
rounded-mdButtons, inputs
rounded-lgCards, panels, dropdowns
rounded-fullPills, avatars, dots

Elevation

Borders do the work. Shadow means lift.

shadow-smResting chrome
shadow-mdHover, dropdowns
shadow-lgModals, drawers

Motion

Entrance only, and only once. Nothing loops except the live dot, because it means "now".

120ms — colour and state change

200ms — hover, dropdown, card lift

340ms — drawer, accordion

All of it collapses to near-zero under prefers-reduced-motion.

Live indicator