├── .eslintrc.json ├── .gitignore ├── README.md ├── app ├── [locale] │ ├── globals.css │ ├── layout.tsx │ └── page.tsx ├── icon.ico ├── layout.tsx └── not-found.tsx ├── components.json ├── components ├── About.tsx ├── Contact.tsx ├── Experience.tsx ├── ExperienceLabel.tsx ├── Footer.tsx ├── Header.tsx ├── Intro.tsx ├── LanguageSwitch.tsx ├── Project.tsx ├── Projects.tsx ├── SectionDivider.tsx ├── SectionHeading.tsx ├── Skills.tsx ├── SubmitBtn.tsx ├── ThemeTwich.tsx └── WidgetWrapper.tsx ├── context ├── action-section-context.tsx └── theme-context.tsx ├── i18n.ts ├── lib ├── data.ts ├── hooks.ts └── utils.ts ├── messages ├── en.json └── zh.json ├── middleware.ts ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── 2048-game.png ├── breaddit.png ├── bubble.wav ├── d3.png ├── game-hub.png ├── joy-fullstack-resume.pdf ├── knowledge-sharing-platform.png ├── light-off.mp3 ├── light-on.mp3 ├── profile.png ├── typing-speed.png └── 前端开发-彭郁洁.pdf ├── tailwind.config.js ├── tailwind.config.ts ├── tsconfig.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Portfolio Project 2 | Welcome to my portfolio project! This repository features my personal portfolio website, inspired by [ByteGrad](https://www.youtube.com/watch?v=sUKptmUVIBM&t=21888s). 3 | 4 | image 5 | 6 | 7 | 8 | ## What I Did 9 | - Bug Fixes: Fixed the scrolling bug from the original project. 10 | - Updated Projects Section: Revamped the "Intro" and "Projects" sections. 11 | - UX Enhancements: Added sound effects, animations, and arrow indicators for a more engaging experience. 12 | - Multilingual Support: Added multiple language options using i18nNext. 13 | 14 | ## Contributions 15 | Contributions are welcome! Fork the repository and submit a pull request. 16 | -------------------------------------------------------------------------------- /app/[locale]/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /app/[locale]/layout.tsx: -------------------------------------------------------------------------------- 1 | import Header from "@/components/Header" 2 | import "./globals.css" 3 | import { Inter } from "next/font/google" 4 | import ThemeContextProvider from "@/context/theme-context" 5 | import { ActionSectionContextProvider } from "@/context/action-section-context" 6 | import Footer from "@/components/Footer" 7 | import ThemeSwitch from "@/components/ThemeTwich" 8 | // import { usePathname } from "next/navigation" 9 | import LanguageSwitch from "@/components/LanguageSwitch" 10 | import { NextIntlClientProvider, useMessages } from "next-intl" 11 | import WidgetWrapper from "@/components/WidgetWrapper" 12 | 13 | const inter = Inter({ subsets: ["latin"] }) 14 | 15 | export default function RootLayout({ 16 | children, 17 | params: { locale }, 18 | }: { 19 | children: React.ReactNode 20 | params: { locale: string } 21 | }) { 22 | const messages = useMessages() 23 | // const pathname = usePathname() 24 | // const isProjectDetail = pathname.includes("projects") 25 | return ( 26 | 27 | 30 |
31 |
32 | 33 | 34 | 35 | 36 |
37 | {children} 38 |