Full-Stack & AI Engineer β Kanpur, India Β· Crafting production-grade, human-centered products
National Finalist β India Innovates 2026 Β· 300+ DSA Β· MERN + RAG Β· Bharat Mandapam, New Delhi
Live Site Β· LinkedIn Β· GitHub Β· Book a Call Β· Resume
Replace with a real screenshot after deploy β
public/images/preview.png
| Hero β Editorial | Projects β Dark | Photography β Spotlight |
|---|---|---|
| Champagne / Navy / Gold typography, pillars | 3 featured dark cards + 4 secondary | 16-frame fanned carousel β FLIP focus |
- Editorial luxury system β Champagne
#FAF7F0/ Navy#0F1F3D/ Gold#C89B3C/ Burgundy#7A263A, Playfair Display + JetBrains Mono, hairlines and grain - Motion without jank β Lenis smooth scroll + GSAP ScrollTrigger + Framer Motion FLIP,
prefers-reduced-motionaware, rAF-lerped carousel - Photography spotlight β 16-image fanned stack (AβP), wheel/drag/arrows, true FLIP: tapped card lifts from its exact spot leaving a dashed vacancy, blurs the bunch, shows full
object-containframe, sinks back on outside/β/Esc - Single source of truth β every word, link, and image in
src/data/portfolio.ts - Production-grade DX β Vite 6 + React 18 + TS strict, Tailwind 3, code-split chunks (gsap/motion/three), Vercel zero-config
| Layer | Choice | Why |
|---|---|---|
| Build | Vite 6 | Instant HMR, Rollup code-split |
| Framework | React 18 + TypeScript 5.7 | Strict, component MVVM |
| Styling | Tailwind CSS 3.4 + custom vars | Editorial tokens, no CSS bloat |
| Motion | GSAP 3.12 + @gsap/react + Framer Motion 11 + Lenis 1.1 | Scroll, FLIP, spring physics |
| 3D | Three.js 0.174 | Hero particle field |
| Icons | react-icons | Minimal bundle |
| Deploy | Vercel | Edge, preview deploys |
graph TD
A[portfolio.ts β Single Source of Truth] --> B[App.tsx β Layout + LenisContext]
B --> C[Editorial Shell]
C --> C1[NavbarEditorial]
C --> C2[HeroEditorial β 3D + Pillars]
C --> C3[ProjectsEditorial β 3 featured + 4 secondary]
C --> C4[ProcessSkills β Workflow + Skills Grid]
C --> C5[ExperienceEditorial]
C --> C6[EducationEditorial β MilestoneRail + useScroll]
C --> C7[HackathonsEditorial]
C --> C8[PhotographyEditorial β Fanned FLIP Carousel]
C --> C9[ContactEditorial β Form + Calendly]
C2 & C3 & C4 & C5 & C6 & C7 & C8 & C9 --> D[Vite Build β chunk: gsap / motion / three]
D --> E[Vercel Edge β aditya-dixit.vercel.app]
flowchart LR
P[portfolio.ts] -- import --> H[Hero] & PR[Projects] & EX[Experience] & ED[Education] & PH[Photography] & CO[Contact]
PR -- props --> Card[ProjectCard β badge/lang/snippet]
PH -- photos AβP --> Fan[Fanned Stack β translate 800%/200% rotate 120deg]
Fan -- layoutId photo-i --> Spot[Spotlight β FLIP spring 380/32]
CO -- mailto + clipboard --> Mail[User Inbox]
journey
title Visitor journey
section Discover
Land on Hero: 5: Visitor
Read Pillars: 4: Visitor
section Explore
Scan Projects: 5: Visitor
Follow Workflow: 4: Visitor
Check Experience & Education: 4: Recruiter
section Delight
Play Photography FLIP: 5: Visitor
Open Spotlight & navigate: 5: Visitor
section Convert
Copy email / Book call: 5: Recruiter
Submit contact form: 5: Visitor
portfolio/
βββ public/
β βββ images/
β β βββ photography/ # A.jpeg β P.jpeg (16, alphabetical)
β β βββ hackathons/ # 4 event covers
β β βββ aditya-hero-3d.png
β β βββ college.jpg / school.jpg
β β βββ contact-profile.png
β βββ resume/SDE-Resume.pdf
βββ src/
β βββ components/
β β βββ editorial/ # Hero, Projects, ProcessSkills, Experience,
β β # Education, Hackathons, Photography, Contact,
β β # Navbar, Reveal, ScrollProgress, useMagnetic
β βββ context/LenisContext.tsx
β βββ data/portfolio.ts # β EDIT EVERYTHING HERE
β βββ hooks/ # cursor, magnet, scramble
β βββ lib/gsap.ts
β βββ index.css # editorial tokens
β βββ App.tsx
βββ tailwind.config.ts
βββ vite.config.ts
# clone
git clone https://github.com/Aditya-dxt/Portfolio.git
cd Portfolio
# install (Node >=18)
npm install
# develop β http://localhost:5173
npm run dev
# production build
npm run build
npm run previewsrc/data/portfolio.ts β change once, everywhere updates.
| To change | Edit |
|---|---|
| Name, roles, bio, pillars | name, rolesCycle, bio, pillars |
| Projects (3 featured) | projectsFeatured β badge/lang/snippet/title/subtitle/desc/tags/live/github |
| Projects (secondary) | projectsSecondary |
| Skills grid | skills β abbr/name/cat/icon |
| Workflow | process β 01β05 |
| Experience | experience β period/badge/title/role/desc/tags |
| Education + milestones | education.college / education.school β milestones with current/upcoming/grade/badge |
| Hackathons | hackathons β venue/date/role/tags/image |
| Photography alts | PhotographyEditorial.tsx β photos[] β title AβP, alt text |
| Nav / Social / Booking | nav, social, bookingUrl, resumePath |
Photography: add new shots as
Q.jpeg,R.jpg⦠inpublic/images/photography/and append tophotos[]alphabetically. Counter/dots adapt automatically.
| # | Section | Anchor | Signature Interaction |
|---|---|---|---|
| 1 | Hero | # |
3D tilt hero image, pillars, rotating roles |
| 2 | Projects | #projects |
3 dark featured cards (no load flicker) + 4 secondaries |
| 3 | Workflow + Skills | #process |
5-step process + branded skill grid |
| 4 | Experience | #experience |
Timeline editorial |
| 5 | Education | #education |
MilestoneRail with useScroll gold growth |
| 6 | Hackathons | #hackathons |
4 national events |
| 7 | Photography | #photography |
Fanned FLIP carousel, 16 frames, spotlight |
| 8 | Contact | #contact |
Magnetic CTAs, copy email, Calendly, validated form |
stateDiagram-v2
[*] --> Fan: drag / wheel / ββ
Fan --> Fan: smoothTo β rAF lerp 0.14
Fan --> Spotlight: tap card β jumpTo + 360ms + FLIP layoutId photo-i
Spotlight --> Spotlight: ββ / PrevΒ·Next β step selected
Spotlight --> Fan: click backdrop / β / Esc β spring back to dashed gap
Fan --> [*]
- Frame isolation:
wheelwith{passive:false}+preventDefault+stopPropagationinside navyrounded-[20px] border gold 18%frame; page doesn't scroll when cursor is inside. - Physics:
progress 0β100,active = floor(progress/100*(n-1)),translate(800%*off, 200%*off) rotate(120deg*off),zIndex n-|i-active|, opacity curving. - A11y:
tabIndex 0,focus-visible:ring,aria-label, keyboard focus on hover.
Form in ContactEditorial.tsx uses mailto: + validation and clipboard copy today. To make it live with an endpoint:
- Create endpoint at Formspree or FormSubmit
- Replace
handleSubmittofetch(ENDPOINT, {method:'POST', body: FormData}) - Keep
mailto:fallback for no-JS.
Calendly button uses bookingUrl from portfolio.ts.
npm run build # β dist/ (ignored by git, built on Vercel)Connect repo at vercel.com β framework auto-detected as Vite. No env vars required. Each push to main deploys.
Custom domain: aditya-dixit.vercel.app (add your domain in Vercel β Settings β Domains).
| Script | What it does |
|---|---|
npm run dev |
Vite dev server + HMR |
npm run build |
tsc -b && vite build β type-check + bundle |
npm run preview |
Serve dist locally |
npm run lint |
ESLint on src |
MIT β fork, customize portfolio.ts, replace public/images/*, ship. A β is appreciated.
- Light/Dark editorial toggle (persisted)
- MDX case-study pages per project
- View transitions API for route morphs
- OG image generation per project
Built with β€οΈ by Aditya Dixit β Kanpur, India
Photography is not just a hobby β it's how I see the world.
