- About the project
- Design philosophy
- Features
- Tech stack
- Project architecture
- Application flow
- Main components
- Getting Started
- Available scripts
- Performance and optimizations
- Responsive Design
- Contact
- License
This portfolio is a single-page application built with React 19, Vite 8, and Tailwind CSS 4. It was born as a static site and migrated to a modern architecture with one clear goal: convey quality from the very first pixel.
Every section is designed as an independent editorial piece. It's not just a website with information β it's a visual experience that accompanies the visitor from the moment it loads until they close the tab.
The project has no backend. It's a static SPA deployed on Vercel.
The portfolio's aesthetic follows a high-end editorial style. Every visual decision was made with intention:
| Principle | Implementation |
|---|---|
| High-impact typography | Custom Acorn font for headings, Bricolage Grotesque for subheadings, Google Sans Flex for body |
| Breathing whitespace | Clean layout with clear hierarchy between sections |
| Advanced effects | Apple-style Gradual Blur Header, glassmorphism on cards, custom cursor |
| Movement with purpose | Scroll animations, smooth transitions, hover micro-interactions |
| Visual coherence | Unified palette (green β blue β purple), consistent gradients, refined shadows |
Elegance should always be above quantity.
Powered by Lenis Smooth Scroll, every scroll feels like a premium experience with a custom easing curve.
A progressive blur effect inspired by Apple. The header gradually blurs as the user scrolls, adding depth and elegance without distractions.
Not a fake timer. The preloader loads real assets in 7 phases (fonts β hero β experience β services β projects β blog β about β other) and displays actual progress. When finished, it slides up revealing the content.
Project categories (Originals, Clones, UI/UX, Web 3D) with an animated slider using Framer Motion with spring transitions and blur effects between panels.
Bento-style layout with glassmorphic cards that include color blobs as decorative backgrounds. Each service has its own gradient palette.
An 8px dot with a 40px follower ring, both using mix-blend-mode: difference. Automatically hidden on touch devices.
All content appears with a coordinated opacity + translateY transition, synchronized with the preloader exit.
| Technology | Version | Purpose |
|---|---|---|
| React | 19.2.5 | UI framework |
| Vite | 8.0.10 | Build tool and dev server |
| Tailwind CSS | 4.2.4 | Utility-first styling |
| Library | Version | Purpose |
|---|---|---|
| Framer Motion | 12.38.0 | React animations (project slider) |
| GSAP | 3.15.0 | High-performance advanced animations |
| Lenis | 1.3.23 | Smooth scrolling |
| OverlayScrollbars | 2.15.1 | Custom scrollbar |
| Font | Purpose |
|---|---|
| Acorn | High-impact headings (display font) |
| Bricolage Grotesque | Secondary subheadings (300/600/800) |
| Google Sans Flex | Body text (400-800) |
portfolio/
βββ index.html # HTML entry point (lang="es")
βββ package.json # Dependencies and scripts
βββ vite.config.js # Vite configuration
β
βββ src/
β βββ main.jsx # React entry point
β βββ App.jsx # Main orchestrator (loading, scroll, layout)
β βββ index.css # Global styles (3040 lines)
β β
β βββ components/
β βββ LoadingScreen.jsx # Preloader with real asset loading
β βββ Header.jsx # Sticky nav with gradual blur + mobile menu
β βββ Hero.jsx # Main section with portrait and CTAs
β βββ Experience.jsx # Professional experience timeline
β βββ Services.jsx # Bento grid of services
β βββ Projects.jsx # Animated slider with 4 categories
β βββ Blog.jsx # Learning section
β βββ Lab.jsx # Genesis Pixel chapters
β βββ About.jsx # Personal bio + testimonials
β βββ Footer.jsx # Photo gallery + social links
β βββ Icons.jsx # SVG icon library
β βββ GradualBlur.jsx # Progressive blur component (Apple-style)
β
βββ css/
β βββ estilos.css # Legacy CSS from the original static site
β
βββ public/
βββ fonts/ # 8 font files
βββ img/ # 70+ images (profiles, projects, emojis, decorations)
1. HTML loads β React mounts <App /> in StrictMode
β
2. LoadingScreen mounts and starts preloading:
β Fonts (2 Google Fonts URLs)
β Images by phases: hero, experience, services,
projects, blog, about, other (~55 images)
β Progress bar + percentage + phase text
β
3. All assets loaded:
β Preloader triggers exit animation (slide-up)
β onComplete β setIsLoading(false)
β
4. Content reveal:
β Double requestAnimationFrame ensures DOM is ready
β contentState changes to 'enter' β fade-in + translateY (0.8s)
β After 0.8s β headerReady = true β header appears
β
5. User navigates with Lenis smooth scroll active
The hero has a separate entry from the rest of the content. The header appears after the content has been fully revealed.
The orchestrator. Controls loading state, initializes Lenis, manages the content reveal sequence, and renders all sections in order.
Complete preloader that loads real assets in 7 phases. Shows progress percentage, phase text, and profile avatar. Slides up with a CSS transition when finished.
Sticky nav with gradual blur using the GradualBlur component. Includes:
- Desktop navigation with animated SVG underline on hover
- "Let's Talk" button linking to WhatsApp
- Full-screen mobile menu with
scaleYanimation - Scroll-to-top button that appears after 400px
The first impression. Profile portrait, main heading, two CTAs ("Check out what I've done" and "Download my CV"), social links, and a portrait with a glassmorphic card and animated floating emojis.
Vertical timeline with 3 professional experiences. Includes interactive screenshot grid with tooltips using React portals.
Animated slider with 4 categories and 16 projects. Each category has its own background. Transitions use Framer Motion spring physics.
Reusable progressive blur component inspired by Apple. Supports presets, curves, Intersection Observer, and responsive mode.
1. Clone the repository
git clone https://github.com/sebastianvasquezechavarria1234/portfolio.git
cd portfolio2. Install dependencies
npm install3. Start the development server
npm run devIt will automatically open at
http://localhost:5173.
| Script | Command | Description |
|---|---|---|
| Development | npm run dev |
Starts the Vite dev server |
| Build | npm run build |
Generates the production bundle in dist/ |
| Preview | npm run preview |
Previews the production build |
| Lint | npm run lint |
Runs ESLint to detect errors |
- Smart preloading: The preloader loads real assets by phases, no fake timers
- Optimized smooth scrolling: Lenis with
smoothTouch: falseon mobile to preserve performance - WebP images: Most assets use WebP format for smaller file size
- Custom CSS: CSS variables for reusable colors, gradients, and shadows
- Memoized components:
GradualBlurusesReact.memoto prevent unnecessary re-renders - Optimized bundle: Vite generates a single JS and a single CSS for production
- Lazy scroll-to-top: The button only appears after 400px of scrolling
The portfolio adapts from ultra-wide displays to mobile with 12 breakpoints:
| Breakpoint | Behavior |
|---|---|
1380px |
Padding and layout adjustments |
1280px |
Container overflow visible |
1180px |
Project grid switches to 2 columns |
1065px |
Font size reduction |
975px |
Services layout adjusted |
900px |
About section switches to flex-col |
800px |
Mobile menu activated, hamburger visible |
768px |
Desktop nav hidden, overlay menu |
600px |
Hero gradient to 100% width, 400px height |
500px |
Reduced font sizes |
480px |
Final adjustments for small mobile devices |
Β© 2023 β 2026 SebastiΓ‘n VΓ‘squez EchavarrΓa
Designed and written in code with dedication and precision.
Made with β€οΈ by SebastiΓ‘n V
