feat(portfolio): redesign site as opportunity gateway

- add now/hire pages and update IA/navigation

- feature Elynd in projects and homepage messaging

- refresh services/blog/brand copy for AI product positioning

- reduce hydration overhead by using Astro Container

- remove Google Fonts external dependency and use local fallback stack
This commit is contained in:
zguiyang
2026-03-13 14:01:04 +08:00
parent 52a5d14a4e
commit a208bab7ea
25 changed files with 2069 additions and 493 deletions

View File

@@ -4,7 +4,7 @@ import { personalInfo } from "@/lib/data/index";
import { motion } from "framer-motion";
import { useState, useEffect } from "react";
import { defaultLang } from "@/i18n/ui";
import Container from "./ui/Container";
import Container from "./ui/Container.tsx";
import { type FooterProps } from "@/types";
export default function Footer({ lang: propLang }: FooterProps) {
@@ -39,7 +39,7 @@ export default function Footer({ lang: propLang }: FooterProps) {
className="text-sm text-purple-500 font-medium text-center md:text-left"
whileHover={{ scale: 1.01 }}
>
{lang === 'zh' ? '如果你正在寻找一名前端/Ts全栈工程师远程工作请联系我' : 'Looking for a Frontend/TS Full-stack Engineer (Remote)? Contact me!'}
{lang === 'zh' ? '构建 AI 产品?寻找技术合伙人?联系我!' : 'Building AI Products? Need a Technical Co-founder? Contact me!'}
</motion.p>
</motion.div>
<motion.p

View File

@@ -1,7 +1,7 @@
import { personalInfo } from "@/lib/data/index";
import LanguageSwitcher from "./LanguageSwitcher";
import ThemeToggle from "./ui/theme-toggle";
import Container from "./ui/Container";
import Container from "./ui/Container.tsx";
import { useTranslations, getLocalizedPath } from "@/i18n/utils";
import type { Lang } from "@/types/i18n";
import { useState, useEffect } from "react";
@@ -63,11 +63,12 @@ export default function GlassHeader({ lang: propLang }: GlassHeaderProps) {
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center space-x-6 text-sm font-medium">
{[
{[
{ key: 'nav.home', icon: '🏠 ', href: getLocalizedPath('/', lang) },
// { key: 'nav.projects', icon: '🚀 ', href: getLocalizedPath('/projects', lang) },
{ key: 'nav.projects', icon: '🚀 ', href: getLocalizedPath('/projects', lang) },
{ key: 'nav.blog', icon: '📝 ', href: getLocalizedPath('/blog', lang) },
{ key: 'nav.services', icon: '🛠️ ', href: getLocalizedPath('/services', lang) },
{ key: 'nav.now', icon: ' ', href: getLocalizedPath('/now', lang) },
{ key: 'nav.hire', icon: '💼 ', href: getLocalizedPath('/hire', lang) },
{ key: 'nav.about', icon: '👨‍💻 ', href: getLocalizedPath('/about', lang) },
].map((item, index) => (
@@ -133,12 +134,13 @@ export default function GlassHeader({ lang: propLang }: GlassHeaderProps) {
: 'bg-white/85 dark:bg-black/85'
}`}>
<nav className="flex flex-col space-y-3 text-sm font-medium">
{[
{[
{ key: 'nav.home', icon: '🏠 ', href: getLocalizedPath('/', lang) },
{ key: 'nav.about', icon: '👨‍💻 ', href: getLocalizedPath('/about', lang) },
{ key: 'nav.services', icon: '🛠️ ', href: getLocalizedPath('/services', lang) },
{ key: 'nav.projects', icon: '🚀 ', href: getLocalizedPath('/projects', lang) },
{ key: 'nav.blog', icon: '📝 ', href: getLocalizedPath('/blog', lang) },
{ key: 'nav.now', icon: '⚡ ', href: getLocalizedPath('/now', lang) },
{ key: 'nav.hire', icon: '💼 ', href: getLocalizedPath('/hire', lang) },
{ key: 'nav.about', icon: '👨‍💻 ', href: getLocalizedPath('/about', lang) },
].map((item, index) => (
<motion.a
key={item.key}

View File

@@ -0,0 +1,11 @@
---
interface Props {
className?: string;
}
const { className = "" } = Astro.props;
---
<div class={`container mx-auto px-4 sm:px-6 lg:px-8 max-w-6xl ${className}`.trim()}>
<slot />
</div>