Personal / Interactive webPersonal project

Spatial Portfolio Experience

A bilingual Next.js portfolio combining one shared WebGL scene, scroll-driven orbital navigation, procedural planet materials and an accessible semantic interface.

The portfolio in dark mode on desktop, next to the projects section in light mode on a phone.

The portfolio in dark mode on desktop, next to the projects section in light mode on a phone.

Technologies

  • Next.js
  • React
  • TypeScript
  • Three.js
  • React Three Fiber
  • Playwright
  • Node.js

What I built

  • Shared WebGL canvas
  • Scroll-driven orbital navigation
  • Procedural planet textures
  • Keyboard and touch alternatives
  • Localized content and routes
  • Persistent light and dark themes
  • Responsive DPR management

Context

This portfolio is a bilingual Next.js application whose four homepage destinations share a spatial navigation system and lead into localized project case studies.

Problem

The interface needed to keep long-form content readable while a persistent 3D scene gives each destination a distinct world and follows the page without taking control away from scrolling.

Implementation

I built the portfolio in React and TypeScript, including the project carousel, localized routes, theme persistence and one React Three Fiber canvas shared by the four main destinations.

The planets use generated color, displacement, normal and roughness maps with instanced surface details. Their orbital position follows document progress, while their slow axial motion uses elapsed frame time independently.

Technical architecture

Semantic HTML sections remain the source of navigation and content. A destination context measures their anchors and converts document scroll into orbital progress; the WebGL controller projects world positions back into the DOM for accessible interaction targets.

Key engineering decisions

A single canvas avoids multiplying WebGL contexts. Procedural assets are generated ahead of time, responsive DPR is capped, and reduced-motion mode removes continuous animation while preserving the content and navigation.

Challenges

The main challenge was keeping projected planets visually in front on small screens without blocking links or text. The canvas ignores pointer input and separate semantic controls provide keyboard and touch access.

What I learned

The implementation clarified how scroll measurements, WebGL projection, layered CSS and accessible HTML can cooperate without making the 3D scene the only way to use the site.

Visual evidence

Projects section in light mode on desktop, with the spatial carousel and orbiting planets.
About section in dark mode on desktop.
Three portfolio screens on a phone: home in dark mode, projects in light mode, about in dark mode.