diff --git a/src/components/AboutSection.tsx b/src/components/AboutSection.tsx new file mode 100644 index 0000000..b8224de --- /dev/null +++ b/src/components/AboutSection.tsx @@ -0,0 +1,194 @@ +import { motion } from "framer-motion"; +import { useTranslations } from "@/i18n/utils"; +import MotionWrapper from "./MotionWrapper"; +import { User, Code, Coffee, Heart } from "lucide-react"; + +/** + * About section component that displays personal introduction + */ +export default function AboutSection({ lang }: { lang: "en" | "zh" }) { + const t = useTranslations(lang); + + const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2, + delayChildren: 0.1, + }, + }, + }; + + const itemVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.6, + }, + }, + }; + + const stats = [ + { + number: "152", + label: t('about.stats.repositories'), + icon: Code, + }, + { + number: "42K", + label: t('about.stats.commits'), + icon: Coffee, + }, + { + number: "87", + label: t('about.stats.prsmerged'), + icon: Heart, + }, + ]; + + return ( +
+ {/* Background gradient */} +
+ +
+ + + {/* Section Title */} + +

+ {t('about.title')} +

+
+ + {/* About Content */} +
+ {/* Left side - Description and Stats */} + + {/* Description */} +
+

+ 👋 + 关于我 +

+
+

+ {t('about.description.paragraph1')} +

+

+ {t('about.description.paragraph2')} +

+

+ {t('about.description.paragraph3')} +

+
+
+ + {/* Stats Grid */} +
+ {stats.map((stat, index) => { + const IconComponent = stat.icon; + return ( + + +
+ {stat.number} +
+
+ {stat.label} +
+
+ ); + })} +
+
+ + {/* Right side - Skills Toolbox */} + +

+ 💻 + {t('about.toolbox.title')} +

+ +
+ {/* Skills Progress */} +
+
+ {t('about.toolbox.frontend')} + 90% +
+
+
+
+ +
+ {t('about.toolbox.backend')} + 85% +
+
+
+
+ +
+ {t('about.toolbox.devops')} + 75% +
+
+
+
+ +
+ {t('about.toolbox.mobile')} + 65% +
+
+
+
+
+ + {/* Tech Stack Tags */} +
+
+ {['JavaScript', 'React', 'Node.js', 'TypeScript', 'TailwindCSS', 'Python', 'Docker', 'Git'].map((tech) => ( + + {tech} + + ))} +
+
+
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/ExperienceSection.tsx b/src/components/ExperienceSection.tsx deleted file mode 100644 index 6aa6217..0000000 --- a/src/components/ExperienceSection.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { workExperience } from "@/lib/data"; -import TimelineItem from "./TimelineItem"; -import { useTranslations } from "@/i18n/utils"; -import { Briefcase } from "lucide-react"; -import { motion } from "framer-motion"; -import MotionWrapper from "./MotionWrapper"; - -export default function ExperienceSection({ lang }: { lang: "en" | "zh" }) { - const t = useTranslations(lang); - return ( -
-
- -

- - 💼 - - {t('experience.title')} -

-
-
- {workExperience.map((job, index) => { - const companyKey = job.company.toLowerCase().replace(/ /g, ''); - return ( - - -
-
- -
-

{t('experience.keyAchievements')}

-
-
    - {job.achievements.map((achievement, i) => ( - - {t(`work.${companyKey}.achievements.${i}` as any)} - - ))} -
-
-
- )})} -
-
-
- ); -} diff --git a/src/components/GlassHeader.tsx b/src/components/GlassHeader.tsx index c21bb71..2f58c0c 100644 --- a/src/components/GlassHeader.tsx +++ b/src/components/GlassHeader.tsx @@ -41,7 +41,7 @@ export default function GlassHeader({ lang }: GlassHeaderProps) { {/* Desktop Navigation */}