‹ BackResume ↓
OVERVIEW

No color, on purpose

Built for a photographer, director, and editor, this portfolio makes one deliberate design decision and follows it everywhere: no color in the UI at all — only the work itself is in color. Hierarchy comes from typography and hairline rules instead of cards, rounded corners, or gradients.

The interaction layer is where most of the build time went: a custom two-ring cursor that mixes with whatever's underneath it, a WebGL shader on every image (liquid drag, a ripple, scroll-linked color shift, film grain, vignette — falling back to a plain image on mobile or without WebGL support), Lenis-smoothed scrolling tied to GSAP ScrollTrigger, and a panel-wipe transition between pages.

KEY FEATURES

The interaction layer, piece by piece

01

WebGL images

A custom shader per image: cursor-driven liquid distortion, scroll-linked color shift, film grain, and vignette.

02

Cursor

A two-ring cursor with independent trailing speeds, using mix-blend-difference to stay legible over any image.

03

Motion

Lenis smooth scroll driving GSAP ScrollTrigger for reveals, parallax, and a horizontal pinned work strip.

04

Accessibility

Fully respects prefers-reduced-motion, disabling the WebGL and motion layer when it's set.

STATUS

A rebuild, not a first draft

Built with React, Vite, TypeScript, and Tailwind — a full rebuild from an earlier Next.js version of the same site.

MORE WORK

See all work