A modern, high-performance personal portfolio website built with React, TypeScript, and Tailwind CSS. Featuring a "Web3" aesthetic with dark mode, glassmorphism, and interactive 3D elements.
- π¨ Web3 Aesthetic: Deep dark mode, neon glows, glassmorphism (backdrop-blur), and noise textures.
- π± Bento Grid Layout: A fully responsive grid layout that adapts perfectly from mobile to desktop.
- π¦ Spotlight Effect: Custom mouse-tracking spotlight effect on cards using React hooks.
- π Interactive 3D Globe: A draggable, auto-rotating 3D dot-matrix globe using
cobe. - βοΈ 3D Icon Cloud: Interactive floating tech stack sphere using
react-icon-cloud. - π§ Spline 3D Integration: Immersive 3D background scenes with GSAP entrance animations.
- β‘οΈ High Performance: Built with Vite for instant server start and HMR.
- Core: React 18, TypeScript, Vite
- Styling: Tailwind CSS
- Animation: Framer Motion, GSAP
- 3D & Interactive:
@splinetool/react-spline(Hero Background)cobe(Interactive Globe)react-icon-cloud(Tech Stack)
- Icons: Lucide React
- Node.js (v18 or higher recommended)
- npm or yarn
-
Clone the repository
git clone https://github.com/chienhsiang-hung/chienhsiang-hung.github.io.git cd chienhsiang-hung.github.io -
Install dependencies
npm install
-
Run development server
npm run dev
-
Build for production
npm run build
src/
βββ components/
β βββ InteractiveIconCloud.tsx # 3D Tech Stack Sphere
β βββ LocationCard.tsx # Draggable Cobe Globe + Clock
β βββ SpotlightCard.tsx # Reusable Card with Hover Glow
β βββ ...
βββ App.tsx # Main Layout & Bento Grid
βββ main.tsx # Entry Point
βββ index.css # Global Styles & Tailwind Directives
public/
βββ my-demo-video.mp4 # Video assets
Go to App.tsx and replace the Spline URL with your own scene from Spline.design:
<Spline scene="YOUR_NEW_SPLINE_URL" onLoad={onLoad} />Edit src/components/InteractiveIconCloud.tsx. Add or remove slugs from the iconSlugs array (refer to Simple Icons for valid slugs):
const iconSlugs = [
"typescript",
"react",
"nextdotjs",
// ... add more
];Edit src/components/LocationCard.tsx inside the markers array:
markers: [
{ location: [24.774, 121.047], size: 0.1 }, // Your Lat/Long (e.g., Hsinchu)
],Place your video file in the public folder and update the src in App.tsx:
<source src="/your-video-filename.mp4" type="video/mp4" />If you prefer using Docker to avoid environment issues:
# Run the container with port mapping and volume mount
docker run -it --rm -v "${PWD}:/app" -w /app -p 5173:5173 node:24-alpine sh
# Inside the container
npm install
npm run devThis project is open source and available under the MIT License.
Designed & Built by Chien-Hsiang Hung.
