This portfolio is a ground-up custom build with no templates, no component libraries, no CSS frameworks. The goal was to design a site that communicated technical depth and aesthetic sensibility simultaneously, using the design itself as proof of the claim.
The visual identity draws from editorial print design: a cream-and-dark palette, condensed display typography (Barlow Condensed), and a typographic hierarchy that feels considered rather than generated. The hero uses a custom Shrimp typeface for the name, set at large scale to fill the viewport as a single bold statement.
Interactivity is handled entirely with GSAP and Lenis Smooth Scroll with no React, no Vue. Every scroll animation, page transition, and cursor behavior is hand-written. The SPA router on the home/about pages uses history.pushState to give clean URLs without a full page reload, with GSAP dark-overlay transitions bridging between views.
The project stacking section was inspired by many many professional websites from awwwwards.com. The cards pin sequentially via ScrollTrigger and scale/blur out as the next card arrives. The skills section uses a horizontal scroll panel pinned to the viewport and many more. Both required careful ScrollTrigger.refresh() orchestration when switching between SPA views.
The hero name uses a custom Shrimp typeface at 290px that is not for decoration but to make identity the loudest element on arrival. Barlow Condensed at 900 weight carries all section headings, letting numeric scale do the visual work. Body copy stays in Barlow Regular to keep reading comfortable without competing.
The palette alternates between cream (#e8e6e0) and near-black (#111111) at the section level, creating natural rhythm without decorative dividers. The single red accent (#8b1a1a) appears only on the scroll progress bar and nav hover underlines — used sparingly so it always reads as signal.
Lenis provides the smooth scroll RAF loop, which feeds into ScrollTrigger's update cycle. All animations are timeline-based and killed on page swap to avoid scroll position conflicts. The stacking cards use a scrubbed ScrollTrigger per card, scaling and blurring as the next one enters. Performance target: 60fps throughout.
The navbar starts as a full-width cream bar. After 60px of scroll, GSAP animates it to a floating pill with backdrop blur and a reduced footprint — no CSS transitions involved, so the morph is fully GSAP-controlled and interruptible. The same logic runs independently on every page via a shared pattern.
Home and About share one HTML file. Clicking "Learn More" or nav links triggers a GSAP dark overlay fade, swaps the visible div, pushes a URL via history.pushState, then kills and re-initializes all ScrollTrigger instances. This eliminates the loader re-trigger bug that occurs with full page reloads while keeping clean browser history.
A custom cursor uses two elements: a 6px dot that follows instantly and a 26px ring that lerps at 13% per frame. On dark sections, both elements invert to cream via a CSS class toggle on mousemove — checked with elementFromPoint() so the inversion tracks the exact element under the pointer, not a scroll threshold.