From ed02039a9e1f07b683ba772e427267bb717b5620 Mon Sep 17 00:00:00 2001 From: joyzhao Date: Mon, 16 Jun 2025 11:29:53 +0800 Subject: [PATCH] feat(portfolio): redesign hero and projects sections with modern UI - Implement new glassmorphism design for hero section with terminal mockup - Redesign projects section with improved card layout and tech stack indicators - Update project data with new entries and translations - Add scroll-aware header with dynamic styling - Remove unused ExperienceSection component --- src/components/GlassHeader.tsx | 28 +++- src/components/HeroSection.tsx | 244 +++++++++++++++++++---------- src/components/ProjectsSection.tsx | 119 ++++++++++---- src/i18n/ui.ts | 54 +++++-- src/lib/data.ts | 39 +++-- src/pages/index.astro | 2 - src/pages/zh/index.astro | 4 - 7 files changed, 335 insertions(+), 155 deletions(-) diff --git a/src/components/GlassHeader.tsx b/src/components/GlassHeader.tsx index 53c7dfa..5eb11ae 100644 --- a/src/components/GlassHeader.tsx +++ b/src/components/GlassHeader.tsx @@ -1,7 +1,7 @@ import ThemeToggle from "./ui/theme-toggle"; import LanguageSwitcher from "./LanguageSwitcher"; import { useTranslations, getLocalizedPath, type Lang } from "@/i18n/utils"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import { Menu, X } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; @@ -12,11 +12,25 @@ interface GlassHeaderProps { export default function GlassHeader({ lang }: GlassHeaderProps) { const t = useTranslations(lang); const [isMenuOpen, setIsMenuOpen] = useState(false); + const [isScrolled, setIsScrolled] = useState(false); + + useEffect(() => { + const handleScroll = () => { + setIsScrolled(window.scrollY > 0); + }; + + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); const toggleMenu = () => setIsMenuOpen(!isMenuOpen); return ( -
+
{[ - // { key: 'nav.experience', icon: '💼 ', sectionId: 'experience' }, { key: 'nav.skills', icon: '🛠️ ', sectionId: 'skills' }, { key: 'nav.projects', icon: '🚀 ', sectionId: 'projects' }, ].map( @@ -72,7 +85,11 @@ export default function GlassHeader({ lang }: GlassHeaderProps) { {isMenuOpen && (