Add Three.js page graphics and GSAP site-wide motion system

- Home hero: full-height, with an interactive 3D wireframe of my face
  (MediaPipe landmarks from my-photo.png) rendered as a network graph
  with packets, scan sweeps and an assemble-on-load entry animation
- Inner pages: shared PageHero with a themed scene per page
  (About helix, Skills geodesic sphere, Work infra stack, Blog signal
  waves, Contact globe with connection arcs)
- Shared Three.js stage (framing, GSAP entry, pointer, off-screen
  pausing, reduced motion) with lazily loaded per-scene chunks
- GSAP motion system: data-reveal / data-reveal-stagger / data-parallax
  attributes, SplitText headings, divider draw-in, page exit fade,
  no-JS and reduced-motion fallbacks
- Mobile: graphic stacks above the text

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-11-03 11:57:05 +01:00
co-authored by Claude Opus 5.5
parent 8c280be7b8
commit d93550ed29
34 changed files with 2562 additions and 143 deletions
@@ -25,7 +25,7 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
);
const TitleSection = (
<Row className="w-full justify-between">
<Row className="w-full justify-between" data-reveal="up">
<Stack>
{!noTitle && (
<React.Fragment>
@@ -61,7 +61,10 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
<Stack className="gap-6">
<H3 className="m-0 text-lg">{ctgr}</H3>
<div className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full">
<div
className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full"
data-reveal-stagger="up"
>
{work[ctgr].portfolio.map(
(portfolio, index) => {
return (
@@ -113,7 +116,10 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
})}
</Stack>
<div className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full">
<div
className="grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 w-full"
data-reveal-stagger="up"
>
{work[category].portfolio.map((portfolio, index) => {
return (
<MyWorkPortfolioCard