Background
--color-background
A shared reference for the homepage and all five case studies. Change semantic tokens and component rules to keep the portfolio consistent.
View portfolioUse the theme toggle to inspect the same roles in light and dark. Project artwork and product screenshots retain their original palettes.
--color-background
--color-surface
--color-text
--color-text-muted
--color-border
--color-accent
--color-panel
--color-focus
Space Grotesk carries headings and labels. DM Sans carries body copy. Section headings scale from 32 to 51 px; small card titles use 19 px. Body copy is 16 px, supporting text 14 px, captions 12 px.
Readable body copy with a 1.65 line height.
Caption and supplementary informationHomepage and case study hero titles use larger responsive display styles. Product typography inside screenshots is preserved.
Wide shell: 1440 px maximum. Case studies: 1260 px maximum. Section spacing: 48 px. Small cards: 24 px padding and gap. Large panels: 32 px padding.
At 650 px: section spacing becomes 32 px; card padding and gaps become 20 px; large panels use 24 px. At 850 px: the case study sidebar joins the content flow.
Spacing scale: 4, 8, 12, 16, 20, 24, 32, 40, 48 and 64 px. Layout uses content-driven heights; screenshot galleries keep their intended column counts.
A white surface, thin border and 12 px radius group a finding, persona, decision or component summary.
Large numeric value, descriptive heading and supporting context. Every number must have a source.
A soft background and generous spacing distinguish context, screen narratives and visual foundations from smaller cards.
Brand, primary links, theme toggle, back link, case study anchors and next-project navigation. Controls have visible keyboard focus and a minimum 44 px height.
Text links use descriptive labels. External links open in a new tab with noopener. Notes use the soft surface with an accent border.
Explore a case studyProject covers, banners, metadata rows, section labels, research grids, image galleries, footer and scroll progress are shared portfolio patterns. Their established artwork and animations remain part of the system.
Use original screenshots at their natural aspect ratio, with no cropping or content edits. Images are responsive and have descriptive alt text. Frames use an 8 px radius; project banners use 16 px. Galleries collapse at their documented content breakpoints.
Use 150 ms for quick feedback, 250 ms for standard transitions, and 750 ms for reveals. Existing artwork animations retain dedicated timing tokens. Hover, keyboard focus, pressed and disabled states must be intentional. Reduced-motion preferences disable decorative animations and reveals.
All pages include Skip to content. Theme choice persists in the browser. Links and buttons remain native, keyboard-accessible HTML elements.
design-system/tokens.json for shared values.
python scripts/build-tokens.py to regenerate CSS.
ds-card, ds-panel, ds-grid, ds-control and ds-image for shared component roles.
components.css. Use layout.css for page composition and artwork.
python scripts/check-design-system.py before publication.
CSS is the reusable component layer for this static HTML site. Content remains in each project’s HTML file; no framework dependency is required.
| Token | Value (light/default) |
|---|---|
| color-background | #f8f7f4 |
| color-surface | #ffffff |
| color-text | #1b1c1c |
| color-text-muted | #6d706f |
| color-border | #dcdcd6 |
| color-accent | #d6ef83 |
| color-panel | #eeede8 |
| color-focus | #7baaf7 |
| font-display | "Space Grotesk",sans-serif |
| font-body | "DM Sans",sans-serif |
| space-1 | 4px |
| space-2 | 8px |
| space-3 | 12px |
| space-4 | 16px |
| space-5 | 20px |
| space-6 | 24px |
| space-8 | 32px |
| space-10 | 40px |
| space-12 | 48px |
| space-16 | 64px |
| radius-image | 8px |
| radius-card | 12px |
| radius-banner | 16px |
| radius-pill | 999px |
| border-width | 1px |
| motion-fast | 150ms |
| motion-standard | 250ms |
| motion-reveal | 750ms |
| motion-ease | cubic-bezier(.2,.7,.2,1) |
| text-caption | 12px |
| text-small | 14px |
| text-body | 16px |
| text-lead | 18px |
| heading-section | clamp(32px,4.4vw,51px) |
| heading-card | 19px |
| line-body | 1.65 |
| line-heading | 1.08 |
| layout-wide | 1440px |
| layout-study | 1260px |
| layout-sidebar | 230px |
| layout-gutter | 44px |
| layout-card-gap | 24px |
| layout-section-gap | 48px |
| layout-card-padding | 24px |
| layout-panel-padding | 32px |
Legacy names such as --paper and --ink are aliases to canonical semantic roles. Dimension and palette primitives preserve exact existing artwork and layout values.