Skip to content

01 — FOUNDATIONS

Tokens

Every colour decision the system can make, named once. There is no palette underneath — no `blue`, no `grey-400`. Ask for a colour by how it looks and you have built something nobody can retheme, which is the failure this layer exists to prevent.

THE ROLES24 ROLES × 2 THEMES
GROUNDThree depths, never more. Sections alternate; nothing floats.
DARK
LIGHT
ground--ds-groundPage ground and the deepest surface
DARK
LIGHT
sunk--ds-sunkAlternating sections and control wells
DARK
LIGHT
raised--ds-raisedHover states and held rows
DARK
LIGHT
cream--ds-creamThe one warm surface — CTAs and open slots
INKThe steps of text, each with a stated job, plus the two bound to a filled surface.
DARK
LIGHT
ink--ds-inkHeadings and primary text
DARK
LIGHT
ink-read--ds-ink-readLong-form body copy at 17px and up
DARK
LIGHT
ink-soft--ds-ink-softSupporting paragraphs and descriptions
DARK
LIGHT
ink-faint--ds-ink-faintLabels, meta, captions
DARK
LIGHT
ink-on-cream--ds-ink-on-creamAnything sitting on the cream surface
DARK
LIGHT
ink-on-accent--ds-ink-on-accentAnything sitting on the filled accent — a chip that is open, an avatar, the selection
LINE & ACCENTOne hairline weight; the accent is a pointer, not a decoration. And the deep one is a surface, never a word.
DARK
LIGHT
rule--ds-ruleSection and grid dividers
DARK
LIGHT
rule-strong--ds-rule-strongControl borders and focusable edges
DARK
LIGHT
accent--ds-accentSection numbers, links, active state
DARK
LIGHT
accent-deep--ds-accent-deepFilled accent surfaces and selection
DARK
LIGHT
accent-warm--ds-accent-warmCaptions on the warm placeholder tint
DARK
LIGHT
rule-on-cream--ds-rule-on-creamThe hairline ON the cream surface — the dark rule is far too harsh there
STATEFour colours the controls need and nothing else may use.
DARK
LIGHT
state-error--ds-state-errorError border, label and hint — 7.4:1 on ground
DARK
LIGHT
state-success--ds-state-successSuccess border and kicker — 8.4:1 on ground
DARK
LIGHT
ink-disabled--ds-ink-disabledDisabled controls only — 2.4:1 on sunk, below AA by intent
DARK
LIGHT
muted-on-cream--ds-muted-on-creamSecondary text on the cream surface — 6.1:1
PLACEHOLDERTwo tints for empty media, each with its caption ink bound to it.
DARK
LIGHT
tint-cool--ds-tint-coolDefault media placeholder
DARK
LIGHT
caption-on-cool--ds-caption-on-coolCaptions on tint-cool — 6.1:1
DARK
LIGHT
tint-warm--ds-tint-warmAlternate placeholder, breaks a run of blue
DARK
LIGHT
caption-on-warm--ds-caption-on-warmCaptions on tint-warm — 7.2:1
USING THEM

AS A UTILITY

Every role also generates a utility class, for a page laying out something the library has no component for.

bg-ground
text-ink-faint
border-rule

AS A VARIABLE

Components read the variable directly, never the utility. That is what lets the component layer work with no build step at all.

background: var(--ds-ground);
color: var(--ds-ink-faint);

Reference

Read from themes/portfolio-dark.css when this page was built, so it cannot fall behind the stylesheet.

CLASSES
READSNothing from the theme — it is arrangement only.