← Mare Interior

How both doors were built

A two-wing artist site: a dry gallery and a WebGL ocean, sharing one waterline.

The landing is the thesis: the viewport is split by an animated waterline, and each half is a door. Above, a white-cube gallery of six works; below, the artist's "inner ocean" — a scroll-descent through three depth zones built with three.js.

The waterline

An SVG path recomputed every frame from two stacked sines (long swell + short chop), with a cyan glow line tracing the crest. The foam half "pours" into the sea half because the same points close both shapes. Under prefers-reduced-motion the swell slows to a near-stand.

Below the line: canvas caustics

The lower door's atmosphere is a 2D canvas: seven translucent light shafts drifting on sines plus a shimmer net of displaced horizontal lines — cheap, quiet, and only animated while on screen.

The Deep

The descent is a position:sticky full-viewport three.js canvas behind 3.6 viewport-heights of scroll. Scroll progress maps to camera depth (90 world units); the fog and clear color lerp from twilight blue to abyss black. In the water: 1,600 marine-snow points, additive god-ray planes that fade with depth, nine pulsing jellyfish (squash-and-stretch on a sphere + torus skirt, drifting on individual phases), and a seafloor glow ring that brightens on arrival. Three HTML "rooms" — sunlight, twilight, midnight — fade in beside the dive at their own fathom ranges.

Type & palette

Image slots

Seven <img> slots (six works + artist portrait) with stable filenames hold rendered oceanic gradient stand-ins; the real paintings drop in file-for-file with no code changes.

Deployment

npx wrangler pages deploy set3-a --project-name=set3-a

Static deploy to Cloudflare Pages. Three self-critique passes at 1440px and 390px preceded shipping (see NOTES.md).

Designed and built end-to-end by Claude Fable 5.