Design System
Atomic component library for the portfolio site — tokens, atoms, molecules, organisms and case-study patterns. Resize the browser to watch breakpoints respond, or toggle the theme to preview the dark scheme.
Responsive Breakpoints
Mobile-first: components stack single-column by default, then progressively enhance at each threshold. Tokens --bp-sm: 480px--bp-md: 768px--bp-lg: 1024px--bp-xl: 1200px · containers --container-max: 800px--container-narrow: 720px — the badge in the bottom-right corner tracks the live viewport.
Layout behavior per component
| Component | Mobile <680 | Tablet 768+ | Desktop 1024+ | Large 1200+ |
|---|---|---|---|---|
| Nav | Hamburger toggle | Full links · glass on scroll | — | 1080px inner |
| Hero | 70vh · h1 = text-hero (fluid) | h1 max-width 600px | — | 90vh · h1 caps at 4.25rem |
| About layout | 1 column | 1.2fr : 1fr split | — | Larger gap |
| Section head | Stacked | Baseline row | — | — |
| Work grid | 1 column | 1.5fr / 1fr | — | Larger gap |
| Essay index | 1 column | — | 2 columns · lead spans full | — |
| Timeline | 1 column · rail | 2 cols: head + highlights | — | — |
| Container | 16px padding | 800px max | 800px max | 1080px max |
Tokens
Color palette
Values shown for the light scheme — click any swatch to copy. The dark scheme remaps every token via [data-theme="dark"]; toggle it from the sidebar.
Typography scale
The static scale steps up one notch at ≥ 1200px (see layout.css): lg → 20px, xl → 24px, 2xl → 28px, 3xl → 36px, 4xl → 48px. --text-hero and --text-display are fluid clamp() values — no breakpoint needed.
Spacing scale · 4px base
Shadows
Border radii
Motion
Atoms
Badge .badge
Tag .tag
Stat .stat.stat-label
Section label .section-label
Hero stat .hero-stat
Timeline dot .timeline-dot
Contact link .contact-link.contact-link-fill
Toast .toast
Molecules
Card .card
Card — states
Card row .card-row
Card hero .card-hero
About skill .about-skill
Research
Mixed-methods study design, usability testing, field research.
Strategy
Roadmap planning, stakeholder alignment, research ops.
Approach card .approach-card
The tension between academic rigor and commercial speed is not a problem to be solved — it is a design constraint that produces better work.
Timeline item .timeline-item
Senior UX Researcher
- Led 12+ mixed-methods studies across developer tools and AI features
- Established quarterly research cycle and cross-functional stakeholder alignment
Product Manager
- Owned analytics and data visualization product area
Organisms
Nav .nav
Hero .hero
I turn user insights into product decisions
Section head .section-head
Selected work
About layout .about-layout
Research
Mixed-methods study design, usability testing, field research.
Strategy
Roadmap planning, stakeholder alignment, research ops.
Execution
Product discovery, feature definition, A/B testing.
Work grid .work-grid
How usability testing shortened our sales cycle
Mixed-methods study across 4 markets identified critical friction points.
Read full case study →Building a research practice
How I established UX research operations at a Series B startup.
Read →Research roadmaps
Creating a shared prioritization framework across teams.
Read →Essay index .essay-index
Why every AI feature needs a kill switch
On designing trustworthy AI interactions — and what happens when you skip the hard questions.
Argument →Weaving agents into the workplace
What I've learned from studying multi-agent systems.
Essay →Local AI is a privacy story
On running models where your data lives.
Opinion →Contact card .contact-card
Let's work together
Available for full-time roles and consulting engagements.
Publication .publication
Case Study Components
These live in css/case-study.css and are shared across hero.htmllight-1.htmllight-2.html.
Impact banner .impact-banner
Finding card .finding
Users expected "deploy" to work immediately with default settings
Methods grid .methods-grid.method-card
Unmoderated usability testing
24 participants across US, UK, Germany, and Japan.
In-depth interviews
12 follow-up interviews with users who abandoned activation.
Funnel analytics audit
Quantitative analysis of 10,000 sign-up sessions.
Competitive teardown
Compared onboarding flows of 5 competitor products.
Outcome list .outcome-list
- Activation rate34% → 54%
- Sales cycle length18 days → 11 days
- Time-to-deploy (median)11 min → 2.5 min
Reflection list .reflection-list
- We should have started with a competitive teardown. The template wizard was inspired by a competitor's pattern we discovered mid-study.
- Cross-market differences were larger than expected. We found meaningful differences in how Japanese users approached template selection.
Case footer .case-footer
Image Components
For user-uploaded images in case studies and portfolio pages. Supports single images and series (carousel, grid, filmstrip). No captions by default — replace placeholders with <img> tags.
Single image .img-media
Contained .img-media.contain
Carousel .img-carousel
Grid gallery .img-grid
Filmstrip .img-filmstrip
Motion
Calm editorial motion: long durations, short travel, one easing family. Entrances and reveals are JS-driven on production pages (anime.js + IntersectionObserver), and every animation collapses to instant under prefers-reduced-motion: reduce.
Easing family
Hero entrance — h1 line mask
I turn user insights into product decisions
Scroll reveals
Section head
Scroll-linked — hero parallax
Page transitions — directional
Micro-interactions
Accessibility — prefers-reduced-motion
A global CSS guard collapses animation-duration, animation-delay, animation-iteration-count and transition-duration to 0.01ms (animations.css), and every JS block — entrances, reveals, counters, parallax, page transitions — is gated by matchMedia('(prefers-reduced-motion: reduce)'). Reduced-motion users get static content and instant navigation, never a blank page.