Design System

This portfolio has a deliberately quiet, editorial feel: hairline borders, restrained caps labels, plain paper and ink with no accent hue, and motion that supports the content instead of replacing it. This page documents the tokens and primitives that produce that feel.

Color Tokens

Background primary
--bg-primary
Background secondary
--bg-secondary
Background tertiary
--bg-tertiary
Text primary
--text-primary
Text secondary
--text-secondary
Text tertiary
--text-tertiary
Border primary
--border-primary
Border secondary
--border-secondary
Accent
--accent

Typography

PP Neue Montreal with 7 weights. Use semantic tokens for consistent weight across the site.

Aa
--font-weight-book Book (350) Long-form reading
Aa
--font-weight-regular Regular (400) Body text (default)
Aa
--font-weight-semibold SemiBold (600) Strong emphasis, nav
Aa
--font-weight-bold Bold (700) Headings, buttons

Scales & Dimensions

Token Name Description Value Preview
--space-4xs Space 4xs
--space-3xs Space 3xs
--space-2xs Space 2xs
--space-xs Space xs
--space-s Space s
--space-m Space m
--space-l Space l
--space-xl Space xl
--space-2xl Space 2xl
--border-width-hairline Border hairline
--border-width-strong Border strong
--radius-card Radius card
--radius-pill Radius pill
--lift-distance Hover lift

Component Primitives

Tags

tag sm tag md active dashed

Frames & Surfaces

Frame + hover lift

Reusable border/radius/overflow + the signature float-on-hover motion.


Design Rules

Interaction

  • Keyboard First: Full support per WAI-ARIA. Visible focus rings are mandatory.
  • Touch Targets: Minimum 44px on mobile, 24px on desktop.
  • Feedback: Loading states must maintain label. Destructive actions require confirmation.

Typography & Layout

  • Optical Alignment: Adjust by Β±1px when perception beats geometry.
  • Text Glue: Use non-breaking spaces for terms like 10 MB, Vercel SDK.
  • Line Height: Tight for headings (1.1), relaxed for body (1.5).

Accessibility

  • Contrast: Meet APCA standards. Increase validation on hover/focus.
  • Motion: Respect `prefers-reduced-motion`. Animate transforms/opacity only.
  • Semantics: Use native elements (`button`, `a`, `dialog`) before ARIA.