One language.
Foundations, components, and the way they move.
Foundations
Color
Ink for structure. Blue responds. Steel holds state.
Type
Eleven roles. Optima for voice, Geist for the rest. Caps only in eyebrow and label.
display60One language.chapter36Section headingcardTitle24Card headlinevoice24An editorial momentlead18The line under a headlinebody16Reading copy, capped at 68chblockTitle16Sub-head in a blockeyebrow13Selected workmeta13Lead designer · 2025label12Design challengechip13Proof chipLayout
Whitespace is the hierarchy.
xssmrelatedeyebrowcontentblockhero-metasectionShape
Radius is materiality. Tone before shadow before line.
4px8px12pxpillshadowshadowshadow1pxMotion
Only when it names a moment.
--duration-instant100ms · opacity snap, icon nudge--duration-fast200ms · hover, arrow reveal, color--duration-base300ms · crossfade, collapsible--duration-slow550ms · scroll entrance only
--ease-out-soft--ease-apple--ease-springComponents
Actions
One primary per view. All 8px.
ctaPrimaryctaSecondary:disabledctaTertiaryCtaGhostLinkRead the case study.
ctaInlineLabels
Plain text marks. Chips are evidence.
roles.eyebrowroles.chippillSurfaces
Tone and spacing, not borders.
raisedn-100steel sweepn-950Loading
Hold the shape of what is coming.
SkeletonCarouselArrowInteraction
Language
Four motions, repeated everywhere.
Principles
Every microinteraction has four parts.
- 01TriggerRespond on press, not release.
- 02RulesInterruptible. Start from where it is.
- 03FeedbackTransform + opacity. Under 300ms.
- 04LoopsExit faster than enter. Reduced motion settles.
Feedback
The interface answers the moment you act.
Tokens start in .
Disclosure
Quiet by default. Detail on request.
AI
Rules
Calm about uncertainty.
- Thinking ≠ frozenRetry after 20s
- Words, not charactersAnnounce once
- Footing in wordsNever a percentage
- Unsure ≠ brokenOne quiet retry
- Acts when askedHuman checkpoint
States
Thinking, answering, unsure, broken.
I start with the decision someone has to make, then design the fewest states that get them there.
Gaps
Needed, not shipped.
- No grounded answer
- Stop mid-stream
- Partial-stream failure
- Out of scope
- Retry exhausted
- Accept · edit · reject