The studio-portfolio answer to a scroll world: a physics-driven WebGL hero, then the 3D recedes and lets a perfectly ordinary case-study grid do its job, then it comes back for the finale.
Technically flexing but commercially serious. Opens with a trick to prove capability, then gets straight to the work. Reads as a studio that ships, not an experiment.
Colors
Bright near-white paper for the content stretch, hard cut to true black for the WebGL beats. The 3D scenes carry saturated candy colour (electric blue, iridescent pinks) that never appears in the UI itself.
Type
Large tight-tracked geometric sans for statements, ~11px uppercase mono for project meta. Statements sit centred on their own screen with nothing else on it.
Layout
Alternating full-bleed 3D beats and conventional two-column content. The grid is a plain two-up of project cards — deliberately unremarkable, because it is the part that has to be readable.
Motion
Physics rather than a camera path: objects collide, tumble and settle under simulated forces, and the cursor pushes them. Scroll advances between beats while a decorative curve threads continuously behind the content.
Texture
Matcap and clearcoat plastics, soft studio lighting, real contact shadows, subtle bloom. Surfaces read as injection-moulded objects photographed in a studio.
Imagery
Two asset classes and they must not be confused. The hero and finale are real-time WebGL — build them in code. The case-study grid wants actual project stills and short muted loops, which is where a portfolio either convinces or doesn't. Tool: real client work if it exists, kie-ai concept renders if it doesn't; hand-build the 3D in three.js.
Don't
Don't run 3D under the case-study grid. The whole structure works because the effects stop when there is something to actually read, and start again when there isn't.
Make it your own
Turn this reference into a useful brief for your project. Copy it into the AI tool you already use.
Add constraintsPreview & edit promptAssembled in your browser. No API key or AI request needed. Changing the fields refreshes the preview.