|
1 | | -# React Application with Vite and Three.js |
| 1 | +# Gavin Hon Portfolio |
2 | 2 |
|
3 | | -This repository contains a React application that utilizes Vite as the build tool and integrates Three.js for 3D graphics rendering. It serves as a starting point for developing interactive and visually engaging web applications. |
| 3 | +This is a single-page portfolio site built with React and Vite. It is designed as a content-driven personal site rather than a CMS-backed app: profile details, experience, education, links, and featured work are maintained directly in the source code. |
4 | 4 |
|
5 | | -## Features |
| 5 | +The site combines a structured portfolio layout with a Three.js globe hero, grouped experience cards, and a light/dark theme that follows the user's device or browser preference. |
6 | 6 |
|
7 | | -- React: A JavaScript library for building user interfaces. |
8 | | -- Vite: A fast and lightweight development build tool for modern web applications. |
9 | | -- Three.js: A JavaScript library for creating 3D graphics and animations in the browser. |
| 7 | +## Tech Stack |
| 8 | + |
| 9 | +- React 18 for the UI and section composition |
| 10 | +- Vite for local development and production builds |
| 11 | +- Three.js for the hero globe |
| 12 | +- GSAP for globe motion |
| 13 | +- Plain CSS for layout, theming, and responsive behavior |
| 14 | +- React Context for portfolio content and profile data |
| 15 | + |
| 16 | +## How It Is Built |
| 17 | + |
| 18 | +### Application structure |
| 19 | + |
| 20 | +- `src/main.jsx` mounts the React app |
| 21 | +- `src/App.jsx` composes the page sections and applies reveal-on-scroll behavior |
| 22 | +- `src/context/DataContext.jsx` stores the portfolio content model |
| 23 | +- `src/components/sections/` contains the main page sections: |
| 24 | + - `Navbar` |
| 25 | + - `Home` |
| 26 | + - `About` |
| 27 | + - `Work` |
| 28 | + - `Credentials` |
| 29 | + - `Footer` |
| 30 | +- `src/components/ThreeEarth.jsx` renders the globe used in the hero |
| 31 | +- `public/` contains static assets such as logos, favicon, social icons, and profile imagery |
| 32 | + |
| 33 | +### Content model |
| 34 | + |
| 35 | +The site content is driven from `src/context/DataContext.jsx`. |
| 36 | + |
| 37 | +This includes: |
| 38 | + |
| 39 | +- profile headline, summaries, links, and hero highlights |
| 40 | +- grouped work experience entries and company metadata |
| 41 | +- certifications and education |
| 42 | +- featured public links |
| 43 | +- skill tags and focus areas |
| 44 | + |
| 45 | +If you want to update role history, hero text, public links, or company logos, that is the main file to change. |
| 46 | + |
| 47 | +### Styling and theming |
| 48 | + |
| 49 | +- `src/index.css` defines the global design tokens and the light/dark theme variables |
| 50 | +- the site uses `prefers-color-scheme` to switch automatically between light and dark mode |
| 51 | +- `src/App.css` provides the shared shell, card, button, pill, and reveal styles |
| 52 | +- each section has its own CSS file for layout-specific styling |
| 53 | + |
| 54 | +The current visual direction uses: |
| 55 | + |
| 56 | +- a cool-toned grid background |
| 57 | +- glass-like cards with soft borders and shadows |
| 58 | +- a restrained defense-tech inspired palette |
| 59 | +- responsive layouts for desktop and mobile |
| 60 | + |
| 61 | +### Hero globe |
| 62 | + |
| 63 | +The hero section lazy-loads `ThreeEarth` so the main page content does not depend on the rendering bundle loading first. |
| 64 | + |
| 65 | +The globe implementation uses: |
| 66 | + |
| 67 | +- Three.js scene/camera/renderer setup |
| 68 | +- GSAP-based rotation animation |
| 69 | +- a separate rendering chunk configured in `vite.config.js` |
| 70 | + |
| 71 | +## Build and Run |
| 72 | + |
| 73 | +Install dependencies: |
| 74 | + |
| 75 | +```bash |
| 76 | +npm install |
| 77 | +``` |
| 78 | + |
| 79 | +Start the local dev server: |
| 80 | + |
| 81 | +```bash |
| 82 | +npm run dev |
| 83 | +``` |
| 84 | + |
| 85 | +Create a production build: |
| 86 | + |
| 87 | +```bash |
| 88 | +npm run build |
| 89 | +``` |
| 90 | + |
| 91 | +Preview the production build locally: |
| 92 | + |
| 93 | +```bash |
| 94 | +npm run preview |
| 95 | +``` |
| 96 | + |
| 97 | +## Build Configuration |
| 98 | + |
| 99 | +`vite.config.js` uses: |
| 100 | + |
| 101 | +- `@vitejs/plugin-react` for React support |
| 102 | +- `vite-plugin-string` for loading shader strings |
| 103 | +- manual chunking so `three` and `gsap` are split into a dedicated `rendering` bundle |
| 104 | + |
| 105 | +This keeps the main app bundle smaller and isolates the heavier visual code. |
| 106 | + |
| 107 | +## Notes for Maintenance |
| 108 | + |
| 109 | +- update portfolio content in `src/context/DataContext.jsx` |
| 110 | +- update section layout/styling in the matching file under `src/components/sections/` |
| 111 | +- update global theme behavior in `src/index.css` and `src/App.css` |
| 112 | +- update static assets such as logos and favicon in `public/` |
| 113 | + |
| 114 | +## Current Characteristics |
| 115 | + |
| 116 | +- single-page portfolio experience |
| 117 | +- sticky top navigation with section jump links |
| 118 | +- grouped company experience cards |
| 119 | +- responsive first-fold hero with globe backdrop |
| 120 | +- public-facing links to LinkedIn, GitHub, and selected work |
| 121 | +- system-based light and dark mode |
0 commit comments