PORTFOLIO DESIGN SYSTEM / V1.0

One system.
Every portfolio page.

A shared reference for the homepage and all five case studies. Change semantic tokens and component rules to keep the portfolio consistent.

View portfolio
01 / COLOURS & THEMES

Semantic roles, two themes.

Use the theme toggle to inspect the same roles in light and dark. Project artwork and product screenshots retain their original palettes.

Background

--color-background

Surface

--color-surface

Text

--color-text

Text Muted

--color-text-muted

Border

--color-border

Accent

--color-accent

Panel

--color-panel

Focus

--color-focus
02 / TYPOGRAPHY

Space Grotesk + DM Sans.

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.

Section heading

Small card heading

Readable body copy with a 1.65 line height.

Caption and supplementary information

Homepage and case study hero titles use larger responsive display styles. Product typography inside screenshots is preserved.

03 / LAYOUT & SPACING

A repeatable rhythm.

Desktop

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.

Compact screens

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.

04 / COMPONENTS

Small cards and large panels have different jobs.

01 / INSIGHT

A small content card

A white surface, thin border and 12 px radius group a finding, persona, decision or component summary.

55

A research statistic

Large numeric value, descriptive heading and supporting context. Every number must have a source.

PROJECT AT A GLANCE

A larger context panel.

A soft background and generous spacing distinguish context, screen narratives and visual foundations from smaller cards.

Navigation & controls

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.

Links & callouts

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 study
Callout · Context, methodology or a caveat sits near the content it explains.

Project 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.

05 / IMAGES & GALLERIES

Preserve the work being shown.

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.

06 / INTERACTION & ACCESSIBILITY

Visible feedback, restrained motion.

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.

07 / CODE STANDARDS

Change the source, not individual pages.

  1. Edit design-system/tokens.json for shared values.
  2. Run python scripts/build-tokens.py to regenerate CSS.
  3. Use ds-card, ds-panel, ds-grid, ds-control and ds-image for shared component roles.
  4. Keep canonical rules in components.css. Use layout.css for page composition and artwork.
  5. Keep new shared values semantic. Add product-specific artwork values only when a semantic role would be misleading.
  6. Run 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.

08 / TOKEN REFERENCE

The source of truth.

View semantic tokens
TokenValue (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-14px
space-28px
space-312px
space-416px
space-520px
space-624px
space-832px
space-1040px
space-1248px
space-1664px
radius-image8px
radius-card12px
radius-banner16px
radius-pill999px
border-width1px
motion-fast150ms
motion-standard250ms
motion-reveal750ms
motion-easecubic-bezier(.2,.7,.2,1)
text-caption12px
text-small14px
text-body16px
text-lead18px
heading-sectionclamp(32px,4.4vw,51px)
heading-card19px
line-body1.65
line-heading1.08
layout-wide1440px
layout-study1260px
layout-sidebar230px
layout-gutter44px
layout-card-gap24px
layout-section-gap48px
layout-card-padding24px
layout-panel-padding32px

Legacy names such as --paper and --ink are aliases to canonical semantic roles. Dimension and palette primitives preserve exact existing artwork and layout values.