EtherBrandGuidelinesFoundationsComponentsOverviewColorLayoutTypographyElevationMotionIconography
Foundations

Color

Roles, not a mood board. Every color has a job. Brand teal is a fill, not body text.

Signal #1AA68A is how a control is filled. It is not how a sentence is colored. Foundations split fill, text, and focus because the brand teal fails both 4.5:1 and 3:1 on paper.

Roles

RoleJob
Canvas / surface / raised / insetWhere the instrument sits. Elevation is a surface token, not a mood.
InverseThe opposite canvas. Buttons that must win, skip links.
Foreground / muted / subtle / disabledReading, secondary reading, inactive UI.
Border / border-strongHairlines. Solid, never alpha.
Signal fillThe one saturated fill on a surface. Action background, selected mark, large accent.
Signal text (--fg-signal)Links, signal words, the paper focus ring.
Status fill + status textCritical, caution, positive, info. Fill for dots and large UI; text pair for words.
Action / action-fgPrimary control: signal fill, ink on the fill. Never white on signal.
Focus2px ring. Paper uses --fg-signal. Ink uses luminous signal.

One saturated fill per surface. Never mix paper and ink tokens on one surface.

Accessibility

These ratios were measured. Do not round them into a different story.

PairRatioLevel
--fg #0E141B on --bg-canvas paper #F6F3EE16.7:1AAA
--fg-muted #5A6370 on paper5.5:1AA
Signal fill #1AA68A on paper2.76:1FAIL text and FAIL non-text 3:1. Do not use as text or as the sole focus ring on paper.
--fg-signal #0F6E5C on paper5.57:1AA — links, signal words, paper focus ring
Signal luminous #3EE0C2 on ink #0E141B11.2:1AAA — fill + text + focus on ink
Action: ink on signal fill #1AA68A6.05:1AA. Never white on signal (3.06, large-only).
--fg-critical #B42318 on paper5.94:1AA. Fill #D64541 on paper is 3.96 (UI / large only, not small text).
--fg-caution #8A5A00 on paper5.36:1AA. Fill on paper is #B57812 (3.35 UI), not brand #C4841D (2.85, FAIL even UI).
--fg-positive #0F6B4C on paper5.88:1AA. Fill #1F8A65 is 3.89 UI / large only.
Dark status text on ink: critical #E89B978.4:1AA
Dark status text on ink: caution #E8C27A11.0:1AA
Dark status text on ink: positive #8FCBB310.0:1AA
Dark status text on ink: info #7EC8E39.9:1AA
--fg-muted #9AA3AD on ink7.24:1AA

Check the pair, not the swatch. A color that passes on ink can fail on paper.

--fg-disabled #9AA3AD on paper is inactive UI (WCAG 1.4.3 exempt). Keep it visible; do not fade it into the canvas.

Semantic tokens — paper

Default theme. Light canvas, ink reading, teal as a fill.

TokenPaperRole
--bg-canvas#F6F3EEPage canvas
--bg-surface#FFFCF7Panel
--bg-raised#FFFCF7Sticky, dropdown
--bg-inset#EBE6DERecessed well
--bg-inverse#0E141BInverse fill
--fg#0E141BBody text
--fg-muted#5A6370Secondary text
--fg-subtle#5A6370Tertiary; do not drop below 4.5:1
--fg-inverse#F6F3EEText on inverse
--fg-disabled#9AA3ADInactive UI
--border#D6D0C7Hairline
--border-strong#B7B0A4Strong hairline
--signal#1AA68AFill only
--fg-signal#0F6E5CText, links, focus
--signal-muted#D5EFE8Quiet signal well
--critical#D64541Fill / dot
--fg-critical#B42318Critical words
--critical-muted#F8D6D4Quiet critical well
--caution#B57812Fill / dot (darkened vs brand #C4841D so UI hits 3:1)
--fg-caution#8A5A00Caution words
--caution-muted#F3E4C4Quiet caution well
--positive#1F8A65Fill / dot
--fg-positive#0F6B4CPositive words
--positive-muted#D5EBE3Quiet positive well
--info#155E75Fill / dot
--fg-info#155E75Info words
--info-muted#D4EAF1Quiet info well
--actionvar(--signal)Primary fill
--action-fgvar(--fg)Ink on teal
--focusvar(--fg-signal)2px ring

Semantic tokens — ink

Dark canvas. Elevation is a lighter surface, not a drop shadow. Luminous signal is fill, text, and focus.

TokenInkRole
--bg-canvas#0E141BPage canvas
--bg-surface#161E27Panel
--bg-raised#1C2630Sticky, dropdown
--bg-inset#121922Recessed well
--bg-inverse#F6F3EEInverse fill
--fg#F6F3EEBody text
--fg-muted#9AA3ADSecondary text (7.24:1)
--fg-inverse#0E141BText on inverse
--fg-disabled#6B7480Inactive UI
--border#2A333CHairline
--border-strong#3D4854Strong hairline
--signal#3EE0C2Fill
--fg-signal#3EE0C2Text, links, focus
--signal-muted#0F2A26Quiet signal well
--critical#D64541Fill / dot
--fg-critical#E89B97Critical words (8.4:1)
--critical-muted#3A1A1AQuiet critical well
--caution#E8C27AFill / dot
--fg-caution#E8C27ACaution words (11.0:1)
--caution-muted#33260EQuiet caution well
--positive#1F8A65Fill / dot
--fg-positive#8FCBB3Positive words (10.0:1)
--positive-muted#0F2A22Quiet positive well
--info#7EC8E3Fill / dot
--fg-info#7EC8E3Info words (9.9:1)
--info-muted#0E2430Quiet info well
--actionvar(--signal)Primary fill
--action-fg#0E141BInk on luminous teal
--focusvar(--fg-signal)2px ring

Dark mode

Follow prefers-color-scheme. The Paper / Ink toggle overrides.

Do / Don't

DoDon't
One filled action per region.Type set in fill colors (#1AA68A as body, #D64541 as small text).
Links and focus use --fg-signal on paper.Color-only status. A delta is icon + word + color.
Pills = muted well + --fg-* text.Caution behind long copy. The fill is a dot, not a paragraph background.
Check the pair, not the swatch.Signal-on-signal. Teal text on a teal well.
Ink on signal for action labels (6.05:1).White on signal (3.06, large-only).

Validation

We do not claim guaranteed compliance. Tokens make the floor constructible; they do not ship the receipt.

Validate with axe, Lighthouse, and real operators — both themes, keyboard-only, and under prefers-reduced-motion. See Accessibility.

Live tokens

These swatches use CSS variables. The Paper / Ink toggle in the header recolors them.

Canvasvar(--bg-canvas)
Surfacevar(--bg-surface)
Raisedvar(--bg-raised)
Insetvar(--bg-inset)
Foregroundvar(--fg)
Mutedvar(--fg-muted)
Signal fillvar(--signal)
Signal textvar(--fg-signal)
Criticalvar(--critical)
Cautionvar(--caution)
Positivevar(--positive)
Infovar(--info)

Dual preview below is independent of the toggle — both themes at once.

Paper

Canvasvar(--bg-canvas)
Surfacevar(--bg-surface)
Raisedvar(--bg-raised)
Insetvar(--bg-inset)
Foregroundvar(--fg)
Mutedvar(--fg-muted)
Signal fillvar(--signal)
Signal textvar(--fg-signal)
Criticalvar(--critical)
Cautionvar(--caution)
Positivevar(--positive)
Infovar(--info)

Ink

Canvasvar(--bg-canvas)
Surfacevar(--bg-surface)
Raisedvar(--bg-raised)
Insetvar(--bg-inset)
Foregroundvar(--fg)
Mutedvar(--fg-muted)
Signal fillvar(--signal)
Signal textvar(--fg-signal)
Criticalvar(--critical)
Cautionvar(--caution)
Positivevar(--positive)
Infovar(--info)

Contrast pairs

Measured ratios. Do not round them into a different story. Check the pair, not the swatch.

PairSampleRatio
fg on paper#0E141B on #F6F3EE16.7:1 AAA
fg-muted on paper#5A6370 on paper5.5:1 AA
signal fill on paper#1AA68A on paper2.76:1 FAIL text and FAIL 3:1
fg-signal on paper#0F6E5C on paper5.57:1 AA
signal luminous on ink#3EE0C2 on #0E141B11.2:1 AAA
action: ink on signalink on #1AA68A6.05:1 AA
white on signalwhite on #1AA68A3.06:1 large-only
fg-critical on paper#B42318 on paper5.94:1 AA
critical fill on paper#D64541 on paper3.96:1 UI / large only
fg-caution on paper#8A5A00 on paper5.36:1 AA
caution fill #B57812#B57812 on paper3.35:1 UI
caution brand #C4841D#C4841D on paper2.85:1 FAIL even UI
fg-positive on paper#0F6B4C on paper5.88:1 AA
positive fill on paper#1F8A65 on paper3.89:1 UI / large only
fg-muted on ink#9AA3AD on ink7.24:1 AA
critical text on ink#E89B97 on ink8.4:1 AA
caution text on ink#E8C27A on ink11.0:1 AA
positive text on ink#8FCBB3 on ink10.0:1 AA
info text on ink#7EC8E3 on ink9.9:1 AA

Related