Next.js 14 (App Router) + TypeScript + Tailwind CSS.
- Install dependencies:
npm install
- Add your isometric room image as
public/isometric-room.png(any square-ish PNG/WebP works — the layout scales it responsively). - Run the dev server:
Open http://localhost:3000
npm run dev
app/layout.tsx— loads JetBrains Mono (headings/nav) + Inter (body), sets base backgroundapp/page.tsx— assembles Starfield + Hero + TechProficiencycomponents/Starfield.tsx— canvas-based twinkling star background (respectsprefers-reduced-motion)components/Hero.tsx— name, intro copy, isometric image, side navcomponents/SideNav.tsx— the four pill nav buttons (Skills / Projects / Gallery / Contact) — point thesehrefs at real sections/routes as you build them outcomponents/TechProficiency.tsx— skill category cards
- Colors/fonts live in
tailwind.config.ts(ember,void,dusk,nebula,mist) - Copy in
Hero.tsxandTechProficiency.tsx— swap in your real project list and bio SideNavlinks use#anchors— either add matchingids to sections/build real pages (e.g./projects) and swap thehrefs
Hero.tsxexportsIMAGE_POSITION— a{ start, end }object invh/vw/scale.startis where the isometric image sits at rest;endis where it settles once you've scrolled through the hero (currently: shrinks and tucks into the top-right). Edit those numbers directly to move it anywhere.SideNav.tsxexportsNAV_POSITIONthe same way — the four buttons start at their resting spot next to the image and rise to a compact bar near the top as you scroll.- Both are driven by
useScrollProgress(inuseScrollProgress.ts), a 0→1 value tracking how far the user has scrolled through the hero'sHERO_SCROLL_SPAN_VH(default 200vh — increase for a slower/longer parallax, decrease for snappier). - Both fade out and disappear rather than parking on top of the content below.
fadeOpacity()inuseScrollProgress.tsdefines a shared fade window (FADE_START/FADE_END, as fractions of the hero's 0→1 scroll progress — currently 0.55→0.9): fully visible untilFADE_START, then eases toopacity: 0byFADE_END. Once faded,pointer-events: nonekicks in so they don't block clicks on the section underneath, and theirendpositions (inIMAGE_POSITION/NAV_POSITION) are pushed off-screen (negativetop) so the exit motion continues even as they vanish rather than freezing in a corner. Widen/narrow theFADE_START–FADE_ENDgap to make the disappearance more gradual or more abrupt.
Starfield.tsx has a knobs block at the top: PARTICLE_DENSITY, MAX_SPEED,
LINK_DISTANCE (how close particles need to be to draw a connecting line),
PARTICLE_COLOR, LINE_OPACITY, particle radius range, and MOUSE_LINK_DISTANCE
(cursor-to-particle connecting lines). All plain numbers — tweak and refresh.
npm run buildConfigured with output: "export" in next.config.js for static hosting (e.g. GitHub Pages, same as your current site).