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:
@@ -4,7 +4,7 @@ import { personalInfo } from "@/lib/data/index";
|
|||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import { defaultLang } from "@/i18n/ui";
|
import { defaultLang } from "@/i18n/ui";
|
||||||
import Container from "./ui/Container";
|
import Container from "./ui/Container.tsx";
|
||||||
import { type FooterProps } from "@/types";
|
import { type FooterProps } from "@/types";
|
||||||
|
|
||||||
export default function Footer({ lang: propLang }: FooterProps) {
|
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"
|
className="text-sm text-purple-500 font-medium text-center md:text-left"
|
||||||
whileHover={{ scale: 1.01 }}
|
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.p>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
<motion.p
|
<motion.p
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { personalInfo } from "@/lib/data/index";
|
import { personalInfo } from "@/lib/data/index";
|
||||||
import LanguageSwitcher from "./LanguageSwitcher";
|
import LanguageSwitcher from "./LanguageSwitcher";
|
||||||
import ThemeToggle from "./ui/theme-toggle";
|
import ThemeToggle from "./ui/theme-toggle";
|
||||||
import Container from "./ui/Container";
|
import Container from "./ui/Container.tsx";
|
||||||
import { useTranslations, getLocalizedPath } from "@/i18n/utils";
|
import { useTranslations, getLocalizedPath } from "@/i18n/utils";
|
||||||
import type { Lang } from "@/types/i18n";
|
import type { Lang } from "@/types/i18n";
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
@@ -65,9 +65,10 @@ export default function GlassHeader({ lang: propLang }: GlassHeaderProps) {
|
|||||||
<nav className="hidden md:flex items-center space-x-6 text-sm font-medium">
|
<nav className="hidden md:flex items-center space-x-6 text-sm font-medium">
|
||||||
{[
|
{[
|
||||||
{ key: 'nav.home', icon: '🏠 ', href: getLocalizedPath('/', lang) },
|
{ 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.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) },
|
{ key: 'nav.about', icon: '👨💻 ', href: getLocalizedPath('/about', lang) },
|
||||||
|
|
||||||
].map((item, index) => (
|
].map((item, index) => (
|
||||||
@@ -135,10 +136,11 @@ export default function GlassHeader({ lang: propLang }: GlassHeaderProps) {
|
|||||||
<nav className="flex flex-col space-y-3 text-sm font-medium">
|
<nav className="flex flex-col space-y-3 text-sm font-medium">
|
||||||
{[
|
{[
|
||||||
{ key: 'nav.home', icon: '🏠 ', href: getLocalizedPath('/', lang) },
|
{ 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.projects', icon: '🚀 ', href: getLocalizedPath('/projects', lang) },
|
||||||
{ key: 'nav.blog', icon: '📝 ', href: getLocalizedPath('/blog', 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) => (
|
].map((item, index) => (
|
||||||
<motion.a
|
<motion.a
|
||||||
key={item.key}
|
key={item.key}
|
||||||
|
|||||||
11
src/components/ui/Container.astro
Normal file
11
src/components/ui/Container.astro
Normal 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>
|
||||||
@@ -13,6 +13,8 @@ export const translations = {
|
|||||||
projects: 'Projects',
|
projects: 'Projects',
|
||||||
blog: 'Blog',
|
blog: 'Blog',
|
||||||
contact: 'Contact',
|
contact: 'Contact',
|
||||||
|
now: 'Now',
|
||||||
|
hire: 'Hire',
|
||||||
},
|
},
|
||||||
site: {
|
site: {
|
||||||
title: 'Joy Zhao - Full Stack Developer',
|
title: 'Joy Zhao - Full Stack Developer',
|
||||||
@@ -20,13 +22,16 @@ export const translations = {
|
|||||||
},
|
},
|
||||||
hero: {
|
hero: {
|
||||||
greeting: "Hello, I'm",
|
greeting: "Hello, I'm",
|
||||||
viewProjects: 'About Me',
|
viewProjects: 'View Projects',
|
||||||
contactMe: 'Contact Me',
|
contactMe: 'Get in Touch',
|
||||||
lookingForJob: 'Looking for a Frontend/TS Full-stack Engineer (Remote)? Contact me!',
|
lookingForJob: 'Looking for a Frontend/TS Full-stack Engineer (Remote)? Contact me!',
|
||||||
digitalNomad: 'Exploring the freelance journey, striving to become a digital nomad',
|
digitalNomad: 'Exploring the freelance journey, striving to become a digital nomad',
|
||||||
contactInfo: 'Contact Me',
|
contactInfo: 'Contact Me',
|
||||||
githubLink: 'GitHub Profile',
|
githubLink: 'GitHub Profile',
|
||||||
linkedinLink: 'LinkedIn Profile',
|
linkedinLink: 'LinkedIn Profile',
|
||||||
|
tagline: 'Full-stack + AI Product Builder',
|
||||||
|
ctaPrimary: "Let's Build Together",
|
||||||
|
ctaSecondary: 'View My Work',
|
||||||
},
|
},
|
||||||
footer: {
|
footer: {
|
||||||
rights: 'All rights reserved',
|
rights: 'All rights reserved',
|
||||||
@@ -39,6 +44,18 @@ export const translations = {
|
|||||||
portfolio: 'Portfolio',
|
portfolio: 'Portfolio',
|
||||||
ecommerce: 'E-Commerce',
|
ecommerce: 'E-Commerce',
|
||||||
},
|
},
|
||||||
|
type: {
|
||||||
|
product: 'Product',
|
||||||
|
client: 'Client Project',
|
||||||
|
experiment: 'Experiment',
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
building: 'Building',
|
||||||
|
completed: 'Completed',
|
||||||
|
archived: 'Archived',
|
||||||
|
},
|
||||||
|
role: 'Role',
|
||||||
|
impact: 'Impact',
|
||||||
visit: 'Visit',
|
visit: 'Visit',
|
||||||
demo: 'Live Demo',
|
demo: 'Live Demo',
|
||||||
},
|
},
|
||||||
@@ -70,6 +87,8 @@ export const translations = {
|
|||||||
projects: '项目',
|
projects: '项目',
|
||||||
blog: '博客',
|
blog: '博客',
|
||||||
contact: '联系',
|
contact: '联系',
|
||||||
|
now: '现在',
|
||||||
|
hire: '合作',
|
||||||
},
|
},
|
||||||
site: {
|
site: {
|
||||||
title: 'Joy Zhao - 全栈开发者',
|
title: 'Joy Zhao - 全栈开发者',
|
||||||
@@ -77,13 +96,16 @@ export const translations = {
|
|||||||
},
|
},
|
||||||
hero: {
|
hero: {
|
||||||
greeting: '你好,我是',
|
greeting: '你好,我是',
|
||||||
viewProjects: '关于我',
|
viewProjects: '查看项目',
|
||||||
contactMe: '联系我',
|
contactMe: '联系我',
|
||||||
lookingForJob: '正在寻找前端/TS 全栈工程师(远程)?联系我!',
|
lookingForJob: '正在寻找前端/TS 全栈工程师(远程)?联系我!',
|
||||||
digitalNomad: '探索自由职业道路,努力成为数字游民',
|
digitalNomad: '探索自由职业道路,努力成为数字游民',
|
||||||
contactInfo: '联系我',
|
contactInfo: '联系我',
|
||||||
githubLink: 'GitHub 主页',
|
githubLink: 'GitHub 主页',
|
||||||
linkedinLink: 'LinkedIn 主页',
|
linkedinLink: 'LinkedIn 主页',
|
||||||
|
tagline: '全栈 + AI 产品构建者',
|
||||||
|
ctaPrimary: '一起构建',
|
||||||
|
ctaSecondary: '查看作品',
|
||||||
},
|
},
|
||||||
footer: {
|
footer: {
|
||||||
rights: '版权所有',
|
rights: '版权所有',
|
||||||
@@ -96,6 +118,18 @@ export const translations = {
|
|||||||
portfolio: '作品集',
|
portfolio: '作品集',
|
||||||
ecommerce: '电子商务',
|
ecommerce: '电子商务',
|
||||||
},
|
},
|
||||||
|
type: {
|
||||||
|
product: '产品',
|
||||||
|
client: '客户项目',
|
||||||
|
experiment: '实验',
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
building: '开发中',
|
||||||
|
completed: '已完成',
|
||||||
|
archived: '已归档',
|
||||||
|
},
|
||||||
|
role: '角色',
|
||||||
|
impact: '成果',
|
||||||
visit: '访问',
|
visit: '访问',
|
||||||
demo: '在线演示',
|
demo: '在线演示',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { type Lang, type FrontmatterProps } from '@/types';
|
|||||||
import { defaultLang } from '@/i18n/ui';
|
import { defaultLang } from '@/i18n/ui';
|
||||||
import GlassHeader from '@/components/GlassHeader';
|
import GlassHeader from '@/components/GlassHeader';
|
||||||
import Footer from '@/components/Footer';
|
import Footer from '@/components/Footer';
|
||||||
import Container from '../components/ui/Container';
|
import Container from "../components/ui/Container.astro";
|
||||||
|
|
||||||
// Use Astro's MarkdownLayoutProps for proper type safety
|
// Use Astro's MarkdownLayoutProps for proper type safety
|
||||||
export type Props = MarkdownLayoutProps<FrontmatterProps>;
|
export type Props = MarkdownLayoutProps<FrontmatterProps>;
|
||||||
@@ -30,7 +30,7 @@ const lang = Astro.currentLocale as Lang || defaultLang;
|
|||||||
|
|
||||||
<!-- Main content with proper spacing for fixed header -->
|
<!-- Main content with proper spacing for fixed header -->
|
||||||
<div class="pt-16 sm:pt-20">
|
<div class="pt-16 sm:pt-20">
|
||||||
<Container client:load className="py-8 md:py-12">
|
<Container className="py-8 md:py-12">
|
||||||
<div class="max-w-7xl mx-auto">
|
<div class="max-w-7xl mx-auto">
|
||||||
<div class="grid grid-cols-1 xl:grid-cols-4 gap-6 lg:gap-8">
|
<div class="grid grid-cols-1 xl:grid-cols-4 gap-6 lg:gap-8">
|
||||||
<!-- Main Content -->
|
<!-- Main Content -->
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import AuthorCard from '@/components/AuthorCard';
|
|||||||
import TableOfContents from '@/components/layout/TableOfContents.astro';
|
import TableOfContents from '@/components/layout/TableOfContents.astro';
|
||||||
import BlogNavigation from '@/components/layout/BlogNavigation.astro';
|
import BlogNavigation from '@/components/layout/BlogNavigation.astro';
|
||||||
import PostMeta from '@/components/blog/PostMeta.astro';
|
import PostMeta from '@/components/blog/PostMeta.astro';
|
||||||
import Container from '../components/ui/Container';
|
import Container from "../components/ui/Container.astro";
|
||||||
import Comments from '@/components/blog/Comments';
|
import Comments from '@/components/blog/Comments';
|
||||||
|
|
||||||
// Use Astro's MarkdownLayoutProps for proper type safety
|
// Use Astro's MarkdownLayoutProps for proper type safety
|
||||||
@@ -47,7 +47,7 @@ const finalReadingTime = readTime ? parseInt(readTime.replace(/\D/g, '')) : unde
|
|||||||
|
|
||||||
<!-- Main content with proper spacing for fixed header -->
|
<!-- Main content with proper spacing for fixed header -->
|
||||||
<div class="pt-16 sm:pt-20">
|
<div class="pt-16 sm:pt-20">
|
||||||
<Container client:load className="py-6 sm:py-8">
|
<Container className="py-6 sm:py-8">
|
||||||
<div class="max-w-7xl mx-auto">
|
<div class="max-w-7xl mx-auto">
|
||||||
<div class="grid grid-cols-1 xl:grid-cols-4 gap-6 lg:gap-8">
|
<div class="grid grid-cols-1 xl:grid-cols-4 gap-6 lg:gap-8">
|
||||||
<!-- Main Content -->
|
<!-- Main Content -->
|
||||||
|
|||||||
@@ -25,12 +25,6 @@ const t = useTranslations(lang);
|
|||||||
<meta name="generator" content={Astro.generator} />
|
<meta name="generator" content={Astro.generator} />
|
||||||
<meta name="description" content={description} />
|
<meta name="description" content={description} />
|
||||||
<title>{title}{t('site.title') ? ` | ${t('site.title')}` : ''}</title>
|
<title>{title}{t('site.title') ? ` | ${t('site.title')}` : ''}</title>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
||||||
<link
|
|
||||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
|
||||||
rel="stylesheet"
|
|
||||||
/>
|
|
||||||
{
|
{
|
||||||
import.meta.env.MODE === 'production' && (
|
import.meta.env.MODE === 'production' && (
|
||||||
<script defer src="https://cloud.umami.is/script.js" data-website-id="a79f759b-74ae-4165-b738-56d123a1c6be"></script>
|
<script defer src="https://cloud.umami.is/script.js" data-website-id="a79f759b-74ae-4165-b738-56d123a1c6be"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import BlogLayout from './BlogLayout.astro';
|
|||||||
import BlogList from '../components/blog/BlogList.astro';
|
import BlogList from '../components/blog/BlogList.astro';
|
||||||
import CategoryCard from '../components/blog/CategoryCard.astro';
|
import CategoryCard from '../components/blog/CategoryCard.astro';
|
||||||
import TagCard from '../components/blog/TagCard.astro';
|
import TagCard from '../components/blog/TagCard.astro';
|
||||||
import Container from '../components/ui/Container';
|
import Container from "../components/ui/Container.astro";
|
||||||
import { type Lang } from '@/types/i18n';
|
import { type Lang } from '@/types/i18n';
|
||||||
import { type BlogPost } from '@/types';
|
import { type BlogPost } from '@/types';
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ const localizedText = getLocalizedText();
|
|||||||
---
|
---
|
||||||
|
|
||||||
<BlogLayout title={title} description={Astro.props.description}>
|
<BlogLayout title={title} description={Astro.props.description}>
|
||||||
<Container client:load className="py-8">
|
<Container className="py-8">
|
||||||
<!-- Header Section - Centered at the top -->
|
<!-- Header Section - Centered at the top -->
|
||||||
<div class="text-center mb-10">
|
<div class="text-center mb-10">
|
||||||
<h1 class="text-4xl font-bold mb-3">
|
<h1 class="text-4xl font-bold mb-3">
|
||||||
|
|||||||
@@ -9,12 +9,12 @@ export const personalInfo: PersonalInfo = {
|
|||||||
website: "https://zhaoguiyang.com",
|
website: "https://zhaoguiyang.com",
|
||||||
twitter: "https://twitter.com/zhaoguiyang",
|
twitter: "https://twitter.com/zhaoguiyang",
|
||||||
position: {
|
position: {
|
||||||
en: "Full Stack Engineer",
|
en: "Full-stack + AI Product Builder",
|
||||||
zh: "全栈工程师"
|
zh: "全栈 + AI 产品构建者"
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
en: "Crafting elegant solutions to complex problems with clean code and innovative thinking. Welcome to my personal dev workspace where ideas come to life.",
|
en: "Building AI-powered products and turning ambitious ideas into reality. Currently focused on Elynd - an open AI workspace for builders.",
|
||||||
zh: "用优雅的代码和创新的思维,为复杂问题打造精致的解决方案。欢迎来到我的个人开发工作空间,这里是想法变为现实的地方。"
|
zh: "构建 AI 驱动产品,将雄心勃勃的想法变为现实。目前专注于 Elynd - 一个面向构建者的开放 AI 工作空间。"
|
||||||
},
|
},
|
||||||
about: {
|
about: {
|
||||||
en: [
|
en: [
|
||||||
|
|||||||
@@ -1,10 +1,42 @@
|
|||||||
import type { Project } from '@/types';
|
import type { Project } from '@/types';
|
||||||
export const projects = {
|
export const projects = {
|
||||||
en: [
|
en: [
|
||||||
|
{
|
||||||
|
id: "elynd",
|
||||||
|
featured: true,
|
||||||
|
type: "product",
|
||||||
|
status: "building",
|
||||||
|
role: "Founder & Lead Developer",
|
||||||
|
impact: "Building an open AI workspace for builders",
|
||||||
|
title: "Elynd",
|
||||||
|
icon: "⚡",
|
||||||
|
color: "purple",
|
||||||
|
image: {
|
||||||
|
bg: "from-purple-500/20 to-blue-500/20",
|
||||||
|
hover: "from-purple-500/30 to-blue-500/30",
|
||||||
|
text: "text-purple-400",
|
||||||
|
},
|
||||||
|
description: [
|
||||||
|
"An open AI workspace for builders to work smarter.",
|
||||||
|
"Built with AI-first principles, making AI your co-builder.",
|
||||||
|
"Fully open source and self-hostable.",
|
||||||
|
"Currently in active development with early access coming soon.",
|
||||||
|
],
|
||||||
|
tech: ["TypeScript", "React", "AI/ML", "Open Source"],
|
||||||
|
link: "#",
|
||||||
|
links: {
|
||||||
|
demo: "#",
|
||||||
|
github: "https://github.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "taskify",
|
id: "taskify",
|
||||||
tag: "business",
|
type: "client",
|
||||||
|
status: "completed",
|
||||||
|
role: "Lead Developer",
|
||||||
|
impact: "Helped startup launch MVP in 3 months",
|
||||||
title: "Taskify App",
|
title: "Taskify App",
|
||||||
|
tag: "business",
|
||||||
icon: "📱",
|
icon: "📱",
|
||||||
color: "purple",
|
color: "purple",
|
||||||
image: {
|
image: {
|
||||||
@@ -23,8 +55,12 @@ export const projects = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "eshop",
|
id: "eshop",
|
||||||
tag: "ecommerce",
|
type: "client",
|
||||||
|
status: "completed",
|
||||||
|
role: "Full-stack Developer",
|
||||||
|
impact: "E-commerce platform handling $100K+ monthly revenue",
|
||||||
title: "E-Shop Platform",
|
title: "E-Shop Platform",
|
||||||
|
tag: "business",
|
||||||
icon: "🛒",
|
icon: "🛒",
|
||||||
color: "green",
|
color: "green",
|
||||||
image: {
|
image: {
|
||||||
@@ -43,8 +79,12 @@ export const projects = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "portfolio",
|
id: "portfolio",
|
||||||
tag: "portfolio",
|
type: "experiment",
|
||||||
|
status: "completed",
|
||||||
|
role: "Creator",
|
||||||
|
impact: "Personal brand and portfolio showcasing",
|
||||||
title: "Portfolio Site",
|
title: "Portfolio Site",
|
||||||
|
tag: "portfolio",
|
||||||
icon: "🌐",
|
icon: "🌐",
|
||||||
color: "purple",
|
color: "purple",
|
||||||
image: {
|
image: {
|
||||||
@@ -63,10 +103,42 @@ export const projects = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
zh: [
|
zh: [
|
||||||
|
{
|
||||||
|
id: "elynd",
|
||||||
|
featured: true,
|
||||||
|
type: "product",
|
||||||
|
status: "building",
|
||||||
|
role: "创始人 & 首席开发者",
|
||||||
|
impact: "构建面向构建者的开放 AI 工作空间",
|
||||||
|
title: "Elynd",
|
||||||
|
icon: "⚡",
|
||||||
|
color: "purple",
|
||||||
|
image: {
|
||||||
|
bg: "from-purple-500/20 to-blue-500/20",
|
||||||
|
hover: "from-purple-500/30 to-blue-500/30",
|
||||||
|
text: "text-purple-400",
|
||||||
|
},
|
||||||
|
description: [
|
||||||
|
"一个面向构建者的开放 AI 工作空间。",
|
||||||
|
"从 AI 第一性原理出发,让 AI 成为你的共同构建者。",
|
||||||
|
"完全开源,可自托管。",
|
||||||
|
"目前正在积极开发中,早期访问即将推出。",
|
||||||
|
],
|
||||||
|
tech: ["TypeScript", "React", "AI/ML", "开源"],
|
||||||
|
link: "#",
|
||||||
|
links: {
|
||||||
|
demo: "#",
|
||||||
|
github: "https://github.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "taskify",
|
id: "taskify",
|
||||||
tag: "business",
|
type: "client",
|
||||||
|
status: "completed",
|
||||||
|
role: "首席开发者",
|
||||||
|
impact: "帮助创业公司在3个月内推出 MVP",
|
||||||
title: "Taskify 应用",
|
title: "Taskify 应用",
|
||||||
|
tag: "business",
|
||||||
icon: "📱",
|
icon: "📱",
|
||||||
color: "purple",
|
color: "purple",
|
||||||
image: {
|
image: {
|
||||||
@@ -85,8 +157,12 @@ export const projects = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "eshop",
|
id: "eshop",
|
||||||
tag: "ecommerce",
|
type: "client",
|
||||||
|
status: "completed",
|
||||||
|
role: "全栈开发者",
|
||||||
|
impact: "电商平台月营收超过 10 万美元",
|
||||||
title: "电商平台",
|
title: "电商平台",
|
||||||
|
tag: "business",
|
||||||
icon: "🛒",
|
icon: "🛒",
|
||||||
color: "green",
|
color: "green",
|
||||||
image: {
|
image: {
|
||||||
@@ -105,8 +181,12 @@ export const projects = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "portfolio",
|
id: "portfolio",
|
||||||
tag: "portfolio",
|
type: "experiment",
|
||||||
|
status: "completed",
|
||||||
|
role: "创作者",
|
||||||
|
impact: "个人品牌和作品集展示",
|
||||||
title: "个人作品集网站",
|
title: "个人作品集网站",
|
||||||
|
tag: "portfolio",
|
||||||
icon: "🌐",
|
icon: "🌐",
|
||||||
color: "purple",
|
color: "purple",
|
||||||
image: {
|
image: {
|
||||||
|
|||||||
@@ -2,66 +2,66 @@ import type { Service } from '@/types';
|
|||||||
export const services = {
|
export const services = {
|
||||||
en: [
|
en: [
|
||||||
{
|
{
|
||||||
title: "Outsourcing Projects",
|
title: "AI Product Development",
|
||||||
icon: {
|
icon: {
|
||||||
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>`,
|
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>`,
|
||||||
gradient: "from-blue-500 to-cyan-500",
|
gradient: "from-purple-500 to-blue-500",
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
"Provide outsourcing project services for overseas clients",
|
"Build AI-powered products from concept to launch",
|
||||||
"Project packaging, can provide services in different packages",
|
"RAG applications, AI agents, and intelligent automation",
|
||||||
"Use popular technologies: React, nest.js, next.js, etc.",
|
"Full-stack development with modern tech stack",
|
||||||
"Project delivery, provide three months of free maintenance",
|
"Product thinking - focus on solving real problems",
|
||||||
"Regardless of project size, can provide services",
|
"Rapid prototyping and iterative development",
|
||||||
],
|
],
|
||||||
color: "blue",
|
color: "purple",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Bug Fixes",
|
title: "Technical Consulting",
|
||||||
icon: {
|
icon: {
|
||||||
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>`,
|
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>`,
|
||||||
gradient: "from-red-500 to-pink-500",
|
gradient: "from-yellow-500 to-orange-500",
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
"Quickly locate and fix website issues, able to quickly locate and solve problems",
|
"Technical architecture and stack decisions",
|
||||||
"Help you solve any problems encountered in the project, Bug, functional optimization issues",
|
"Code reviews and best practices implementation",
|
||||||
"Application of Vue, React, Node and other technologies",
|
"Team mentoring and knowledge transfer",
|
||||||
"Frontend automation, deployment, monitoring, automation, etc.",
|
"Performance optimization and scaling strategies",
|
||||||
"Only limited to Node.js projects",
|
"Technical due diligence for investments",
|
||||||
],
|
],
|
||||||
color: "red",
|
color: "yellow",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
zh: [
|
zh: [
|
||||||
{
|
{
|
||||||
title: "外包项目",
|
title: "AI 产品开发",
|
||||||
icon: {
|
icon: {
|
||||||
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>`,
|
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>`,
|
||||||
gradient: "from-blue-500 to-cyan-500",
|
gradient: "from-purple-500 to-blue-500",
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
"为海外客户提供外包项目服务",
|
"从概念到上线构建 AI 驱动产品",
|
||||||
"项目打包,可以提供不同套餐的服务",
|
"RAG 应用、AI Agent 和智能自动化",
|
||||||
"使用流行技术:React、nest.js、next.js 等",
|
"使用现代技术栈的全栈开发",
|
||||||
"项目交付,提供三个月免费维护",
|
"产品思维 - 专注于解决实际问题",
|
||||||
"不论项目大小,都可以提供服务",
|
"快速原型和迭代开发",
|
||||||
],
|
],
|
||||||
color: "blue",
|
color: "purple",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Bug 修复",
|
title: "技术咨询",
|
||||||
icon: {
|
icon: {
|
||||||
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>`,
|
svg: `<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>`,
|
||||||
gradient: "from-red-500 to-pink-500",
|
gradient: "from-yellow-500 to-orange-500",
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
"快速定位和修复网站问题,能够快速定位和解决问题",
|
"技术架构和技术栈决策",
|
||||||
"帮助您解决项目中遇到的任何问题,Bug、功能优化问题",
|
"代码审查和最佳实践实施",
|
||||||
"Vue、React、Node 等技术的应用",
|
"团队指导和知识转移",
|
||||||
"前端自动化、部署、监控、自动化等",
|
"性能优化和扩展策略",
|
||||||
"仅限于 Node.js 项目",
|
"投资技术尽职调查",
|
||||||
],
|
],
|
||||||
color: "red",
|
color: "yellow",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -3,7 +3,7 @@ import BlogLayout from '../../layouts/BlogLayout.astro';
|
|||||||
import BlogList from '../../components/blog/BlogList.astro';
|
import BlogList from '../../components/blog/BlogList.astro';
|
||||||
import CategoryCard from '../../components/blog/CategoryCard.astro';
|
import CategoryCard from '../../components/blog/CategoryCard.astro';
|
||||||
import TagCard from '../../components/blog/TagCard.astro';
|
import TagCard from '../../components/blog/TagCard.astro';
|
||||||
import Container from '../../components/ui/Container';
|
import Container from "../../components/ui/Container.astro";
|
||||||
import { type BlogPost } from '@/types';
|
import { type BlogPost } from '@/types';
|
||||||
import { useTranslations } from '@/i18n/utils';
|
import { useTranslations } from '@/i18n/utils';
|
||||||
import { type Lang } from '@/types/i18n';
|
import { type Lang } from '@/types/i18n';
|
||||||
@@ -43,22 +43,22 @@ const sortedBlogPosts = sortPostsByDate(blogPosts);
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<BlogLayout title="Blog - Joy Zhao" description="Dive into my thoughts on coding, tech trends, and developer life. Explore my latest posts below.">
|
<BlogLayout title="Blog - Joy Zhao" description="Thoughts on AI products, full-stack development, and building in public. Explore my latest posts below.">
|
||||||
<main class="min-h-screen">
|
<main class="min-h-screen">
|
||||||
<!-- Header Section -->
|
<!-- Header Section -->
|
||||||
<Container client:load className="pt-24 pb-12">
|
<Container className="pt-24 pb-12">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<h1 class="text-5xl md:text-6xl font-bold bg-gradient-to-r from-foreground via-purple-600 to-purple-800 dark:from-foreground dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent mb-6">
|
<h1 class="text-5xl md:text-6xl font-bold bg-gradient-to-r from-foreground via-purple-600 to-purple-800 dark:from-foreground dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent mb-6">
|
||||||
Our <span class="text-purple-500">Latest</span> Blog
|
<span class="text-purple-500">Blog</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
||||||
{t('blog.slogan')} Dive into my thoughts on coding, tech trends, and developer life. Explore my latest posts below.
|
Thoughts on AI products, full-stack development, and building in public. Exploring the intersection of technology and product building.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<!-- Main Content -->
|
<!-- Main Content -->
|
||||||
<Container client:load className="pb-20">
|
<Container className="pb-20">
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
<div class="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||||
<!-- 侧边栏 -->
|
<!-- 侧边栏 -->
|
||||||
<div class="lg:col-span-1 space-y-8">
|
<div class="lg:col-span-1 space-y-8">
|
||||||
|
|||||||
374
src/pages/hire.astro
Normal file
374
src/pages/hire.astro
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/Layout.astro";
|
||||||
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
|
import Container from "@/components/ui/Container.astro";
|
||||||
|
import { useTranslations } from "@/i18n/utils";
|
||||||
|
import type { Lang } from "@/types/i18n";
|
||||||
|
import { defaultLang } from "@/i18n/ui";
|
||||||
|
|
||||||
|
const lang = Astro.currentLocale as Lang || defaultLang;
|
||||||
|
const t = useTranslations(lang);
|
||||||
|
const pageTitle = lang === 'zh' ? '合作' : 'Hire Me';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={pageTitle}>
|
||||||
|
<GlassHeader lang={lang} client:only="react" />
|
||||||
|
<main class="min-h-screen">
|
||||||
|
<!-- Hire Page Hero -->
|
||||||
|
<section class="py-24 relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30"></div>
|
||||||
|
|
||||||
|
<Container className="relative z-10">
|
||||||
|
<div class="text-center mb-16">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
{lang === 'zh' ? '专业合作' : 'Professional Collaboration'}
|
||||||
|
</span>
|
||||||
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
|
{lang === 'zh' ? '合作' : 'Hire Me'}
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '构建优秀产品,从找到合适的技术合伙人开始'
|
||||||
|
: 'Building great products starts with finding the right technical partner'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Who I Work With -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">👥</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '我与谁合作' : 'Who I Work With'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid md:grid-cols-2 gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? '初创公司' : 'Startups'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '从零到一构建产品的早期创业团队,需要快速迭代和灵活响应的技术方案。'
|
||||||
|
: 'Early-stage startup teams building products from scratch, needing fast iteration and flexible technical solutions.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? '独立创始人' : 'Indie Hackers'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '独自构建产品的创业者,需要技术合伙人来实现产品愿景。'
|
||||||
|
: 'Solo founders building products who need a technical partner to realize their product vision.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? '传统企业' : 'Traditional Businesses'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '希望数字化转型的传统企业,需要现代化的技术解决方案。'
|
||||||
|
: 'Traditional businesses looking to go digital and need modern technical solutions.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? '技术团队' : 'Technical Teams'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '需要额外技术资源或特定技能集来推进项目的开发团队。'
|
||||||
|
: 'Development teams needing additional technical resources or specific skill sets to move projects forward.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- What I Build -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🛠️</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '我能构建什么' : 'What I Build'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-purple-600 to-blue-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">⚡</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">AI 产品与应用</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '从 AI 助手到 Agent 系统,从 RAG 应用到 AI 驱动的 SaaS 产品。我可以帮助你将 AI 能力产品化。'
|
||||||
|
: 'From AI assistants to Agent systems, from RAG applications to AI-powered SaaS products. I can help you productize AI capabilities.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-green-600 to-teal-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">🌐</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">Web 应用</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '现代 Web 应用、SaaS 平台、电商系统、内容管理系统等。使用 React、Next.js、Node.js 等技术栈。'
|
||||||
|
: 'Modern web applications, SaaS platforms, e-commerce systems, content management systems, etc. Using React, Next.js, Node.js and other tech stacks.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-orange-600 to-red-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">📱</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">全栈产品</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '从前端到后端,从数据库到部署,我提供完整的全栈开发能力,一个项目只需一个开发者。'
|
||||||
|
: 'From frontend to backend, from database to deployment, I provide complete full-stack development capabilities - one developer for the entire project.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Engagement Models -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">📋</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '合作模式' : 'Engagement Models'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid md:grid-cols-3 gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">🤝</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
{lang === 'zh' ? '技术合伙人' : 'Technical Co-founder'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '长期合作,股权合作,共同承担创业风险与回报'
|
||||||
|
: 'Long-term partnership, equity-based, sharing startup risks and rewards'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">💰</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
{lang === 'zh' ? '项目制' : 'Project-based'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '按项目交付,固定价格或按阶段付款,适合明确需求的项目'
|
||||||
|
: 'Fixed-price or milestone-based, suitable for projects with clear requirements'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">⏰</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
{lang === 'zh' ? '咨询/顾问' : 'Consulting'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '按小时咨询,帮助你做出技术决策,审查代码,指导团队'
|
||||||
|
: 'Hourly consulting, helping you make technical decisions, code reviews, team guidance'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Delivery Style -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-yellow-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🎯</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '工作方式' : 'Delivery Style'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-yellow-500/20 p-8">
|
||||||
|
<ul class="space-y-4">
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">
|
||||||
|
{lang === 'zh' ? '敏捷迭代' : 'Agile Iteration'}
|
||||||
|
</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '2周一个迭代,快速交付可用功能,持续获取反馈'
|
||||||
|
: '2-week sprints, rapid delivery of usable features, continuous feedback'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">
|
||||||
|
{lang === 'zh' ? '透明沟通' : 'Transparent Communication'}
|
||||||
|
</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '定期同步进度,及时报告问题,保持信息对称'
|
||||||
|
: 'Regular progress updates, timely issue reporting, keeping information symmetric'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">
|
||||||
|
{lang === 'zh' ? '代码质量' : 'Code Quality'}
|
||||||
|
</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '完整的测试覆盖,清晰的文档注释,可维护的代码结构'
|
||||||
|
: 'Complete test coverage, clear documentation, maintainable code structure'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">
|
||||||
|
{lang === 'zh' ? '产品思维' : 'Product Thinking'}
|
||||||
|
</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '不只是写代码,还思考产品价值,用户体验和业务目标'
|
||||||
|
: 'Not just writing code, but also thinking about product value, user experience, and business goals'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Availability -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-red-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">📅</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '当前可用性' : 'Availability'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-red-500/20 p-8">
|
||||||
|
<div class="flex items-center gap-4 mb-6">
|
||||||
|
<div class="w-4 h-4 bg-green-500 rounded-full animate-pulse"></div>
|
||||||
|
<span class="text-lg font-semibold">
|
||||||
|
{lang === 'zh' ? '目前可接受新项目' : 'Currently Available for New Projects'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p class="text-muted-foreground mb-6">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '我目前可以接受 1-2 个新项目。偏好长期合作模式(技术合伙人或长期项目),但也会考虑短期项目。'
|
||||||
|
: 'I can currently take on 1-2 new projects. Prefer long-term partnership (technical co-founder or long-term projects), but also open to short-term projects.'}
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<span class="px-3 py-1 bg-green-500/20 text-green-600 dark:text-green-400 rounded-full text-sm">
|
||||||
|
{lang === 'zh' ? '可立即开始' : 'Available immediately'}
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">
|
||||||
|
{lang === 'zh' ? '远程工作' : 'Remote only'}
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">
|
||||||
|
{lang === 'zh' ? '中英双语' : 'Bilingual EN/ZH'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Contact CTA -->
|
||||||
|
<section class="py-16 relative bg-gradient-to-br from-purple-900/20 to-blue-900/20 dark:from-purple-900/30 dark:to-blue-900/30">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<h2 class="text-3xl font-bold mb-6">
|
||||||
|
{lang === 'zh' ? '准备好一起构建了吗?' : 'Ready to build together?'}
|
||||||
|
</h2>
|
||||||
|
<p class="text-lg text-muted-foreground mb-8 max-w-xl mx-auto">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '告诉我你的项目想法,让我们看看能否合作。'
|
||||||
|
: "Tell me about your project idea and let's see if we can work together."}
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href="mailto:zhaoguiyang18@gmail.com"
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📧</span>
|
||||||
|
{lang === 'zh' ? '发送邮件' : 'Send Email'}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href={lang === 'zh' ? '/zh/now' : '/now'}
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📡</span>
|
||||||
|
{lang === 'zh' ? '了解更多关于我' : 'Learn More About Me'}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<Footer lang={lang} client:only="react" />
|
||||||
|
</Layout>
|
||||||
@@ -4,7 +4,7 @@ import GlassHeader from "@/components/GlassHeader";
|
|||||||
import SkillsMarquee from "@/components/SkillsMarquee";
|
import SkillsMarquee from "@/components/SkillsMarquee";
|
||||||
import TypewriterEffect from "@/components/TypewriterEffect";
|
import TypewriterEffect from "@/components/TypewriterEffect";
|
||||||
import Footer from "@/components/Footer";
|
import Footer from "@/components/Footer";
|
||||||
import Container from "@/components/ui/Container";
|
import Container from "@/components/ui/Container.astro";
|
||||||
import { useTranslations } from "@/i18n/utils";
|
import { useTranslations } from "@/i18n/utils";
|
||||||
import type { Lang } from "@/types/i18n";
|
import type { Lang } from "@/types/i18n";
|
||||||
import { defaultLang } from "@/i18n/ui";
|
import { defaultLang } from "@/i18n/ui";
|
||||||
@@ -24,7 +24,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Greeting -->
|
<!-- Greeting -->
|
||||||
<div class="flex items-center justify-center mb-6">
|
<div class="flex items-center justify-center mb-6">
|
||||||
@@ -79,23 +79,23 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Action buttons -->
|
<!-- Action buttons -->
|
||||||
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center mb-16">
|
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center mb-16">
|
||||||
<a
|
<a
|
||||||
href="#about"
|
href={`/${lang === 'zh' ? 'zh/' : ''}hire`}
|
||||||
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
|
||||||
</svg>
|
</svg>
|
||||||
{t('hero.viewProjects')}
|
{t('hero.ctaPrimary')}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href={`mailto:${personalInfo.email}`}
|
href={`/${lang === 'zh' ? 'zh/' : ''}projects`}
|
||||||
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
{t('hero.contactMe')}
|
{t('hero.ctaSecondary')}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -200,9 +200,80 @@ const pageTitle = t('site.title');
|
|||||||
|
|
||||||
<SkillsMarquee lang={lang} client:only="react" />
|
<SkillsMarquee lang={lang} client:only="react" />
|
||||||
|
|
||||||
|
<!-- Featured Project: Elynd -->
|
||||||
|
<section class="py-24 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30">
|
||||||
|
<Container>
|
||||||
|
<div class="text-center mb-12">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
{lang === 'zh' ? 'featured 项目' : 'Featured Project'}
|
||||||
|
</span>
|
||||||
|
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 via-blue-400 to-purple-400 bg-clip-text text-transparent">
|
||||||
|
Elynd
|
||||||
|
</h2>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '一个开放的 AI 工作空间,让构建者能够更智能地工作'
|
||||||
|
: 'An open AI workspace for builders to work smarter'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 overflow-hidden">
|
||||||
|
<div class="h-64 md:h-80 bg-gradient-to-br from-purple-600/20 via-blue-600/20 to-purple-600/20 flex items-center justify-center relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-grid-purple-500/10 [mask-image:linear-gradient(0deg,white,rgba(255,255,255,0.3))]"></div>
|
||||||
|
<div class="text-center z-10">
|
||||||
|
<div class="text-6xl md:text-8xl mb-4">⚡</div>
|
||||||
|
<div class="text-2xl md:text-3xl font-bold text-purple-400">
|
||||||
|
{lang === 'zh' ? '让 AI 成为你的共同构建者' : 'Make AI Your Co-Builder'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="p-8">
|
||||||
|
<div class="grid md:grid-cols-3 gap-6 mb-8">
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-purple-400 mb-2">AI-First</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh' ? '从第一天就融入 AI 思维' : 'Built with AI from day one'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-blue-400 mb-2">Open</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh' ? '完全开放,可自托管' : 'Fully open, self-hostable'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-green-400 mb-2">Builder-First</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh' ? '为构建者打造的工作空间' : 'Workspace built for builders'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href={`/${lang === 'zh' ? 'zh/' : ''}projects`}
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>🚀</span>
|
||||||
|
{t('hero.ctaSecondary')}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href={`/${lang === 'zh' ? 'zh/' : ''}now`}
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📡</span>
|
||||||
|
{lang === 'zh' ? '了解更多' : 'Learn More'}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Services Section - Inlined Content -->
|
<!-- Services Section - Inlined Content -->
|
||||||
<section id="services" class="py-20 bg-gradient-to-br from-slate-50 to-blue-50 dark:from-slate-900 dark:to-slate-800">
|
<section id="services" class="py-20 bg-gradient-to-br from-slate-50 to-blue-50 dark:from-slate-900 dark:to-slate-800">
|
||||||
<Container client:load>
|
<Container>
|
||||||
<h2 class="text-4xl font-bold text-center mb-16 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
|
<h2 class="text-4xl font-bold text-center mb-16 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
|
||||||
{t('services.title')}
|
{t('services.title')}
|
||||||
</h2>
|
</h2>
|
||||||
@@ -246,7 +317,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-blue-900/10 via-purple-800/5 to-indigo-700/10 dark:from-blue-900/20 dark:via-purple-800/10 dark:to-indigo-700/20"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-blue-900/10 via-purple-800/5 to-indigo-700/10 dark:from-blue-900/20 dark:via-purple-800/10 dark:to-indigo-700/20"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Section Title -->
|
<!-- Section Title -->
|
||||||
<div class="flex items-center justify-center mb-6">
|
<div class="flex items-center justify-center mb-6">
|
||||||
@@ -388,7 +459,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- <section id="projects" class="py-20 relative">
|
<!-- <section id="projects" class="py-20 relative">
|
||||||
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-purple-600 bg-clip-text text-transparent">
|
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-purple-600 bg-clip-text text-transparent">
|
||||||
Latest Projects
|
Latest Projects
|
||||||
|
|||||||
203
src/pages/now.astro
Normal file
203
src/pages/now.astro
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/Layout.astro";
|
||||||
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
|
import Container from "@/components/ui/Container.astro";
|
||||||
|
import { useTranslations } from "@/i18n/utils";
|
||||||
|
import type { Lang } from "@/types/i18n";
|
||||||
|
import { defaultLang } from "@/i18n/ui";
|
||||||
|
|
||||||
|
const lang = Astro.currentLocale as Lang || defaultLang;
|
||||||
|
const t = useTranslations(lang);
|
||||||
|
const pageTitle = lang === 'zh' ? '现在' : 'Now';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={pageTitle}>
|
||||||
|
<GlassHeader lang={lang} client:only="react" />
|
||||||
|
<main class="min-h-screen">
|
||||||
|
<!-- Now Page Hero -->
|
||||||
|
<section class="py-24 relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30"></div>
|
||||||
|
|
||||||
|
<Container className="relative z-10">
|
||||||
|
<div class="text-center mb-16">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
{lang === 'zh' ? '关于我现在正在做什么' : "What's happening now"}
|
||||||
|
</span>
|
||||||
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
|
{lang === 'zh' ? '现在' : 'Now'}
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '持续更新我的现状、正在构建的内容以及合作机会'
|
||||||
|
: 'Continuously updating my current status, what I am building, and collaboration opportunities'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Building Section -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🔨</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '正在构建' : 'Building'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-6">
|
||||||
|
<div class="w-16 h-16 bg-gradient-to-br from-purple-600 to-blue-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-3xl">⚡</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex-1">
|
||||||
|
<h3 class="text-xl font-bold mb-2">Elynd</h3>
|
||||||
|
<p class="text-muted-foreground mb-4">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '一个开放的 AI 工作空间,让构建者能够更智能地工作。从 AI 第一性原理出发,打造完全开放、可自托管的协作工具。'
|
||||||
|
: 'An open AI workspace for builders to work smarter. Built from first principles of AI, creating fully open, self-hostable collaboration tools.'}
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">AI Product</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">TypeScript</span>
|
||||||
|
<span class="px-3 py-1 bg-green-500/20 text-green-600 dark:text-green-400 rounded-full text-sm">Open Source</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Exploring Section -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🔭</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '正在探索' : 'Exploring'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? 'AI Agents 与工作流自动化' : 'AI Agents & Workflow Automation'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '研究如何构建能够自主完成复杂任务的 AI Agent,以及如何将 AI 能力融入日常工作流。'
|
||||||
|
: 'Researching how to build AI Agents that can autonomously complete complex tasks, and how to integrate AI capabilities into daily workflows.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
{lang === 'zh' ? '产品导向的开发实践' : 'Product-Led Development Practices'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '探索从产品角度思考开发,构建真正解决用户问题的产品,而不仅仅是技术实现。'
|
||||||
|
: 'Exploring product thinking in development, building products that truly solve user problems, not just technical implementations.'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Shipping Section -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🚀</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '最近发布' : 'Shipping'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl border border-green-500/20 p-6 flex items-center gap-4">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-lg flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-xl">✨</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="font-bold mb-1">
|
||||||
|
{lang === 'zh' ? '个人网站全新改版' : 'Portfolio Website Redesign'}
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '全新设计的个人网站,突出 AI 产品构建者的定位'
|
||||||
|
: 'Redesigned portfolio with focus on AI product builder positioning'}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Open to Collaborate Section -->
|
||||||
|
<section class="py-16 relative bg-gradient-to-br from-purple-900/10 to-blue-900/10 dark:from-purple-900/20 dark:to-blue-900/20">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<div class="flex items-center justify-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-yellow-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🤝</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
{lang === 'zh' ? '开放合作' : 'Open to Collaborate'}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-yellow-500/20 p-8">
|
||||||
|
<p class="text-lg text-muted-foreground mb-8">
|
||||||
|
{lang === 'zh'
|
||||||
|
? '我始终对新的合作机会持开放态度。无论你是想要构建产品、寻找技术合伙人,还是需要技术咨询,都可以联系我。'
|
||||||
|
: "I'm always open to new collaboration opportunities. Whether you're looking to build a product, seeking a technical co-founder, or need technical consulting, feel free to reach out."}
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href={lang === 'zh' ? '/zh/hire' : '/hire'}
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>💼</span>
|
||||||
|
{lang === 'zh' ? '查看合作方式' : 'View Collaboration Options'}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="mailto:zhaoguiyang18@gmail.com"
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📧</span>
|
||||||
|
{lang === 'zh' ? '发送邮件' : 'Send Email'}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Last Updated -->
|
||||||
|
<section class="py-12">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
{lang === 'zh' ? '最后更新:' : 'Last updated: '}
|
||||||
|
<span class="font-medium">2025年3月</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<Footer lang={lang} client:only="react" />
|
||||||
|
</Layout>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
import Layout from "@/layouts/Layout.astro";
|
import Layout from "@/layouts/Layout.astro";
|
||||||
import GlassHeader from "@/components/GlassHeader";
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
import Footer from "@/components/Footer";
|
import Footer from "@/components/Footer";
|
||||||
import Container from "@/components/ui/Container";
|
import Container from "@/components/ui/Container.astro";
|
||||||
import { useTranslations } from "@/i18n/utils";
|
import { useTranslations } from "@/i18n/utils";
|
||||||
import type { Lang } from "@/types/i18n";
|
import type { Lang } from "@/types/i18n";
|
||||||
import { defaultLang } from "@/i18n/ui";
|
import { defaultLang } from "@/i18n/ui";
|
||||||
@@ -15,6 +15,15 @@ const pageTitle = t('projects.title');
|
|||||||
|
|
||||||
// 根据当前语言获取项目数据
|
// 根据当前语言获取项目数据
|
||||||
const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
||||||
|
|
||||||
|
// Separate featured and grouped projects
|
||||||
|
const featuredProject = currentProjects.find(p => p.featured);
|
||||||
|
const otherProjects = currentProjects.filter(p => !p.featured);
|
||||||
|
|
||||||
|
// Group by type
|
||||||
|
const productProjects = otherProjects.filter(p => p.type === 'product');
|
||||||
|
const clientProjects = otherProjects.filter(p => p.type === 'client');
|
||||||
|
const experimentProjects = otherProjects.filter(p => p.type === 'experiment');
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title={pageTitle}>
|
<Layout title={pageTitle}>
|
||||||
@@ -25,7 +34,7 @@ const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Main title -->
|
<!-- Main title -->
|
||||||
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
@@ -40,68 +49,273 @@ const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
|||||||
</Container>
|
</Container>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Projects Grid Section -->
|
<!-- Featured Project Section -->
|
||||||
<section class="py-12 relative">
|
{featuredProject && (
|
||||||
<!-- Background gradient -->
|
<section class="py-12 bg-gradient-to-br from-purple-900/10 to-blue-900/10 dark:from-purple-900/20 dark:to-blue-900/20">
|
||||||
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
<Container>
|
||||||
|
<div class="max-w-5xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium">
|
||||||
|
Featured
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/30 overflow-hidden">
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 items-stretch">
|
<div class="grid lg:grid-cols-2">
|
||||||
{currentProjects.map((project) => (
|
<div class="h-64 lg:h-auto bg-gradient-to-br from-purple-600/20 via-blue-600/20 to-purple-600/20 flex items-center justify-center relative overflow-hidden">
|
||||||
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
<div class="text-8xl">{featuredProject.icon}</div>
|
||||||
<!-- Project tag - positioned at top right -->
|
</div>
|
||||||
<div class="absolute top-4 right-4 z-10">
|
<div class="p-8">
|
||||||
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.tag.${project.tag}`)}</span>
|
<div class="flex items-center gap-3 mb-4">
|
||||||
</div>
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">
|
||||||
|
{t(`project.status.${featuredProject.status}`)}
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">
|
||||||
|
{t(`project.type.${featuredProject.type}`)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Project image placeholder -->
|
<h2 class="text-3xl font-bold mb-4">{featuredProject.title}</h2>
|
||||||
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
|
||||||
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
<div class="space-y-4 mb-6">
|
||||||
<div class="absolute bottom-4 left-4 right-4">
|
<div>
|
||||||
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
<span class="text-sm text-muted-foreground">{t('project.role')}:</span>
|
||||||
{project.title}
|
<p class="font-medium">{featuredProject.role}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="text-sm text-muted-foreground">{t('project.impact')}:</span>
|
||||||
|
<p class="font-medium">{featuredProject.impact}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 mb-6">
|
||||||
|
{featuredProject.description.map((desc) => (
|
||||||
|
<p class="text-muted-foreground text-sm">{desc}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap gap-2 mb-6">
|
||||||
|
{featuredProject.tech.map((tech) => (
|
||||||
|
<span class="px-3 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-sm rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<a href={featuredProject.link} class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-2 rounded-lg font-medium transition-colors inline-flex items-center gap-2">
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{featuredProject.links?.github && (
|
||||||
|
<a href={featuredProject.links.github} target="_blank" rel="noopener noreferrer" class="border border-gray-500 text-gray-600 dark:text-gray-300 hover:bg-gray-500/10 px-6 py-2 rounded-lg font-medium transition-colors inline-flex items-center gap-2">
|
||||||
|
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
|
||||||
|
</svg>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-6 pb-4">
|
|
||||||
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
|
||||||
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
|
||||||
{project.title}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="px-6 flex-grow">
|
|
||||||
<div class="space-y-3">
|
|
||||||
{project.description.map((desc) => (
|
|
||||||
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
|
||||||
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
|
||||||
<span>{desc}</span>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tech stack indicators with unified gray styling -->
|
|
||||||
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
|
||||||
{project.tech.map((tech) => (
|
|
||||||
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Visit project link -->
|
|
||||||
<div class="p-6 pt-2">
|
|
||||||
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
|
||||||
{t('project.visit')}
|
|
||||||
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
</div>
|
||||||
</div>
|
</Container>
|
||||||
</div>
|
</section>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Projects by Type -->
|
||||||
|
<section class="py-12 relative">
|
||||||
|
<Container>
|
||||||
|
<!-- Product Projects -->
|
||||||
|
{productProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-purple-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">🛍️</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.product')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
|
||||||
|
{productProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Client Projects -->
|
||||||
|
{clientProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-blue-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">💼</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.client')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
|
||||||
|
{clientProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Experiment Projects -->
|
||||||
|
{experimentProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-green-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">🧪</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.experiment')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
||||||
|
{experimentProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Container>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
<Footer lang={lang} client:load />
|
<Footer lang={lang} client:load />
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
---
|
|
||||||
title: "My Services"
|
|
||||||
description: "Explore the professional services I offer to help bring your digital projects to life"
|
|
||||||
layout: "../layouts/AboutLayout.astro"
|
|
||||||
---
|
|
||||||
|
|
||||||
import HighlightBox from '../components/ui/HighlightBox.astro';
|
|
||||||
|
|
||||||
# Services I Provide 🛠️
|
|
||||||
|
|
||||||
<HighlightBox type="tip">
|
|
||||||
用优雅的代码和创新的思维,为复杂问题打造精致的解决方案。
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Web Development 🌐
|
|
||||||
|
|
||||||
<HighlightBox type="info" title="Web Development Services">
|
|
||||||
|
|
||||||
- Building responsive and modern websites using the latest technologies
|
|
||||||
- Creating custom web applications tailored to your specific needs
|
|
||||||
- Implementing frontend interfaces with React, Vue.js, or Angular
|
|
||||||
- Developing backend systems with Node.js, Express, Django, or Flask
|
|
||||||
- Optimizing website performance and user experience
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## App Development 📱
|
|
||||||
|
|
||||||
<HighlightBox type="success" title="Mobile App Solutions">
|
|
||||||
|
|
||||||
- Developing cross-platform mobile applications using React Native or Flutter
|
|
||||||
- Creating native iOS and Android applications
|
|
||||||
- Building progressive web apps (PWAs) for mobile-like experiences on the web
|
|
||||||
- Implementing offline functionality and push notifications
|
|
||||||
- Integrating with device features like camera, GPS, and sensors
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## WeChat Mini Program Development 💬
|
|
||||||
|
|
||||||
<HighlightBox type="tip" title="WeChat Mini Program Expertise">
|
|
||||||
|
|
||||||
- Designing and developing WeChat Mini Programs for businesses
|
|
||||||
- Creating interactive and engaging user interfaces
|
|
||||||
- Implementing WeChat Pay and other WeChat APIs
|
|
||||||
- Optimizing for WeChat's ecosystem and requirements
|
|
||||||
- Building custom features and functionalities specific to your business needs
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## UI Design 🎨
|
|
||||||
|
|
||||||
<HighlightBox type="note" title="UI Design Services">
|
|
||||||
|
|
||||||
- Creating modern, clean, and intuitive user interfaces
|
|
||||||
- Designing responsive layouts that work across all devices
|
|
||||||
- Developing brand identity and visual language
|
|
||||||
- Creating wireframes, prototypes, and high-fidelity mockups
|
|
||||||
- Implementing design systems for consistent user experiences
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Bug Fixing 🐛
|
|
||||||
|
|
||||||
<HighlightBox type="error" title="Bug Fixing & Code Optimization">
|
|
||||||
|
|
||||||
- Identifying and resolving issues in existing applications
|
|
||||||
- Debugging complex problems in frontend and backend systems
|
|
||||||
- Optimizing code for better performance and reliability
|
|
||||||
- Refactoring legacy code to modern standards
|
|
||||||
- Implementing automated testing to prevent future bugs
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Important Notes 📝
|
|
||||||
|
|
||||||
<HighlightBox type="warning" title="Before Contacting Me">
|
|
||||||
To avoid unnecessary misunderstandings, please read the following notes before contacting me:
|
|
||||||
|
|
||||||
1. Please provide detailed project requirements, including wireframes or design specifications (if you don't understand these, I can help guide you).
|
|
||||||
2. Please specify project completion time and development period.
|
|
||||||
3. In general, I only accept commercial projects, and other forms of cooperation need to be discussed separately.
|
|
||||||
4. I currently cannot provide invoicing services.
|
|
||||||
5. Projects can be maintained free of charge for 3 months after completion.
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Collaboration Process 🤝
|
|
||||||
|
|
||||||
<HighlightBox type="info" title="How We'll Work Together">
|
|
||||||
1. Confirm the project
|
|
||||||
2. Determine the collaboration method
|
|
||||||
3. Confirm project functional requirements
|
|
||||||
4. Confirm development period and delivery time
|
|
||||||
5. Confirm project design or wireframes
|
|
||||||
6. Make payment
|
|
||||||
7. Project development
|
|
||||||
8. Project testing
|
|
||||||
9. Project launch
|
|
||||||
10. Project maintenance
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Payment Methods 💰
|
|
||||||
|
|
||||||
<HighlightBox type="note" title="Payment Options">
|
|
||||||
|
|
||||||
- WeChat Pay
|
|
||||||
- Alipay
|
|
||||||
- Bank Transfer
|
|
||||||
|
|
||||||
**Note: All projects use the 442 payment method**
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## Contact Information 📞
|
|
||||||
|
|
||||||
<HighlightBox type="success" title="Get in Touch">
|
|
||||||
- QQ: **2770723534**
|
|
||||||
- WeChat: **JoyCodeing**
|
|
||||||
- Email: **zhaoguiyang18@gmail.com**
|
|
||||||
</HighlightBox>
|
|
||||||
@@ -1,71 +1,42 @@
|
|||||||
---
|
---
|
||||||
title: "My Services"
|
title: "What I Do"
|
||||||
description: "Explore the professional services I offer to help bring your digital projects to life"
|
description: "Professional services focused on building AI products and technical excellence"
|
||||||
layout: "../layouts/AboutLayout.astro"
|
layout: "../layouts/AboutLayout.astro"
|
||||||
---
|
---
|
||||||
|
|
||||||
import HighlightBox from '../components/markdown/HighlightBox.astro';
|
import HighlightBox from '../components/markdown/HighlightBox.astro';
|
||||||
|
|
||||||
# Services I Provide 🛠️
|
# What I Do 🚀
|
||||||
|
|
||||||
<HighlightBox type="tip">
|
<HighlightBox type="tip">
|
||||||
用优雅的代码和创新的思维,为复杂问题打造精致的解决方案。
|
Building AI-powered products and turning ambitious ideas into reality.
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
|
|
||||||
## Web Development 🌐
|
## AI Product Development 🤖
|
||||||
|
|
||||||
- Building responsive and modern websites using the latest technologies
|
- Building AI-powered products from concept to launch
|
||||||
- Creating custom web applications tailored to your specific needs
|
- RAG applications, AI agents, and intelligent automation
|
||||||
- Implementing frontend interfaces with React, Vue.js, or Angular
|
- Full-stack development with modern tech stack (React, Next.js, Node.js)
|
||||||
- Developing backend systems with Node.js, Express, Django, or Flask
|
- Product thinking - focus on solving real problems
|
||||||
- Optimizing website performance and user experience
|
- Rapid prototyping and iterative development
|
||||||
|
|
||||||
## Bug Fixing 🐛
|
## Technical Consulting 📊
|
||||||
|
|
||||||
<HighlightBox type="error" title="Bug Fixing & Code Optimization">
|
<HighlightBox type="info" title="How I Can Help">
|
||||||
|
|
||||||
- Identifying and resolving issues in existing applications
|
- Technical architecture and stack decisions
|
||||||
- Debugging complex problems in frontend and backend systems
|
- Code reviews and best practices implementation
|
||||||
- Optimizing code for better performance and reliability
|
- Team mentoring and knowledge transfer
|
||||||
- Refactoring legacy code to modern standards
|
- Performance optimization and scaling strategies
|
||||||
- Implementing automated testing to prevent future bugs
|
- Technical due diligence for investments
|
||||||
|
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
|
|
||||||
# Services I Provide 🛠️
|
# Let's Build Together 💼
|
||||||
## Important Notes 📝
|
|
||||||
|
|
||||||
<HighlightBox type="warning" title="Before Contacting Me">
|
|
||||||
To avoid unnecessary misunderstandings, please read the following notes before contacting me:
|
|
||||||
|
|
||||||
1. Please provide detailed project requirements, including wireframes or design specifications (if you don't understand these, I can help guide you).
|
|
||||||
2. Please specify project completion time and development period.
|
|
||||||
3. In general, I only accept commercial projects, and other forms of cooperation need to be discussed separately.
|
|
||||||
4. I currently cannot provide invoicing services.
|
|
||||||
5. Projects can be maintained free of charge for 3 months after completion.
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
# Services I Provide 🛠️
|
|
||||||
## Collaboration Process 🤝
|
|
||||||
|
|
||||||
<HighlightBox type="info" title="How We'll Work Together">
|
|
||||||
1. Confirm the project
|
|
||||||
2. Determine the collaboration method
|
|
||||||
3. Confirm project functional requirements
|
|
||||||
4. Confirm development period and delivery time
|
|
||||||
5. Confirm project design or wireframes
|
|
||||||
6. Make payment
|
|
||||||
7. Project development
|
|
||||||
8. Project testing
|
|
||||||
9. Project launch
|
|
||||||
10. Project maintenance
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
# Services I Provide 🛠️
|
|
||||||
## Contact Information 📞
|
|
||||||
|
|
||||||
<HighlightBox type="success" title="Get in Touch">
|
<HighlightBox type="success" title="Get in Touch">
|
||||||
- QQ: **2770723534**
|
I'm always open to discussing new projects and opportunities. Whether you're looking for a technical co-founder, need help building an AI product, or want technical consulting - let's talk.
|
||||||
- WeChat: **JoyCodeing**
|
|
||||||
- Email: **zhaoguiyang18@gmail.com**
|
- Email: **zhaoguiyang18@gmail.com**
|
||||||
|
- Check out my [Hire Me](/hire) page for collaboration options
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
@@ -3,7 +3,7 @@ import BlogLayout from '../../../layouts/BlogLayout.astro';
|
|||||||
import BlogList from '../../../components/blog/BlogList.astro';
|
import BlogList from '../../../components/blog/BlogList.astro';
|
||||||
import CategoryCard from '../../../components/blog/CategoryCard.astro';
|
import CategoryCard from '../../../components/blog/CategoryCard.astro';
|
||||||
import TagCard from '../../../components/blog/TagCard.astro';
|
import TagCard from '../../../components/blog/TagCard.astro';
|
||||||
import Container from '../../../components/ui/Container';
|
import Container from "../../../components/ui/Container.astro";
|
||||||
import { type BlogPost } from '@/types';
|
import { type BlogPost } from '@/types';
|
||||||
import { useTranslations } from '@/i18n/utils';
|
import { useTranslations } from '@/i18n/utils';
|
||||||
import { type Lang } from '@/types/i18n';
|
import { type Lang } from '@/types/i18n';
|
||||||
@@ -55,22 +55,22 @@ const tags = extractTags(allPostsArray);
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<BlogLayout title="博客 - Joy Zhao" description="深入我对编程、技术趋势和开发者生活的思考。探索我的最新文章。">
|
<BlogLayout title="博客 - Joy Zhao" description="关于 AI 产品、全栈开发和公开构建的思考。探索技术与产品构建的交汇点。">
|
||||||
<main class="min-h-screen">
|
<main class="min-h-screen">
|
||||||
<!-- 头部区域 -->
|
<!-- 头部区域 -->
|
||||||
<Container client:load className="pt-24 pb-12">
|
<Container className="pt-24 pb-12">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<h1 class="text-5xl md:text-6xl font-bold bg-gradient-to-r from-foreground via-purple-600 to-purple-800 dark:from-foreground dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent mb-6">
|
<h1 class="text-5xl md:text-6xl font-bold bg-gradient-to-r from-foreground via-purple-600 to-purple-800 dark:from-foreground dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent mb-6">
|
||||||
我的<span class="text-purple-500">博客</span>
|
<span class="text-purple-500">博客</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
||||||
{t('blog.slogan')} 探索我对网络开发、设计和技术的想法、教程和见解。
|
关于 AI 产品、全栈开发和公开构建的思考。探索技术与产品构建的交汇点。
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<!-- 主要内容 -->
|
<!-- 主要内容 -->
|
||||||
<Container client:load className="pb-20">
|
<Container className="pb-20">
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
<div class="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||||
<!-- 侧边栏 -->
|
<!-- 侧边栏 -->
|
||||||
<div class="lg:col-span-1 space-y-8">
|
<div class="lg:col-span-1 space-y-8">
|
||||||
|
|||||||
332
src/pages/zh/hire.astro
Normal file
332
src/pages/zh/hire.astro
Normal file
@@ -0,0 +1,332 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/Layout.astro";
|
||||||
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
|
import Container from "@/components/ui/Container.astro";
|
||||||
|
import { useTranslations } from "@/i18n/utils";
|
||||||
|
import type { Lang } from "@/types/i18n";
|
||||||
|
import { defaultLang } from "@/i18n/ui";
|
||||||
|
|
||||||
|
const lang = Astro.currentLocale as Lang || defaultLang;
|
||||||
|
const t = useTranslations(lang);
|
||||||
|
const pageTitle = lang === 'zh' ? '合作' : 'Hire Me';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={pageTitle}>
|
||||||
|
<GlassHeader lang={lang} client:only="react" />
|
||||||
|
<main class="min-h-screen">
|
||||||
|
<!-- Hire Page Hero -->
|
||||||
|
<section class="py-24 relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30"></div>
|
||||||
|
|
||||||
|
<Container className="relative z-10">
|
||||||
|
<div class="text-center mb-16">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
专业合作
|
||||||
|
</span>
|
||||||
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
|
合作
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
构建优秀产品,从找到合适的技术合伙人开始
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Who I Work With -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">👥</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
我与谁合作
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid md:grid-cols-2 gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
初创公司
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
从零到一构建产品的早期创业团队,需要快速迭代和灵活响应的技术方案。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
独立创始人
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
独自构建产品的创业者,需要技术合伙人来实现产品愿景。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
传统企业
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
希望数字化转型的传统企业,需要现代化的技术解决方案。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
技术团队
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
需要额外技术资源或特定技能集来推进项目的开发团队。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- What I Build -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🛠️</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
我能构建什么
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-purple-600 to-blue-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">⚡</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">AI 产品与应用</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
从 AI 助手到 Agent 系统,从 RAG 应用到 AI 驱动的 SaaS 产品。我可以帮助你将 AI 能力产品化。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-green-600 to-teal-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">🌐</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">Web 应用</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
现代 Web 应用、SaaS 平台、电商系统、内容管理系统等。使用 React、Next.js、Node.js 等技术栈。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-4">
|
||||||
|
<div class="w-12 h-12 bg-gradient-to-br from-orange-600 to-red-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-2xl">📱</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-bold mb-2">全栈产品</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
从前端到后端,从数据库到部署,我提供完整的全栈开发能力,一个项目只需一个开发者。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Engagement Models -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">📋</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
合作模式
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid md:grid-cols-3 gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">🤝</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
技术合伙人
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
长期合作,股权合作,共同承担创业风险与回报
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">💰</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
项目制
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
按项目交付,固定价格或按阶段付款,适合明确需求的项目
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-green-500/20 p-6 text-center">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center mx-auto mb-4">
|
||||||
|
<span class="text-2xl">⏰</span>
|
||||||
|
</div>
|
||||||
|
<h3 class="text-lg font-bold mb-2">
|
||||||
|
咨询/顾问
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
按小时咨询,帮助你做出技术决策,审查代码,指导团队
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Delivery Style -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-yellow-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🎯</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
工作方式
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-yellow-500/20 p-8">
|
||||||
|
<ul class="space-y-4">
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">敏捷迭代</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
2周一个迭代,快速交付可用功能,持续获取反馈
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">透明沟通</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
定期同步进度,及时报告问题,保持信息对称
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">代码质量</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
完整的测试覆盖,清晰的文档注释,可维护的代码结构
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-3">
|
||||||
|
<span class="text-green-500 text-xl">✓</span>
|
||||||
|
<div>
|
||||||
|
<strong class="block mb-1">产品思维</strong>
|
||||||
|
<p class="text-muted-foreground text-sm">
|
||||||
|
不只是写代码,还思考产品价值,用户体验和业务目标
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Availability -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-red-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">📅</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
当前可用性
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-red-500/20 p-8">
|
||||||
|
<div class="flex items-center gap-4 mb-6">
|
||||||
|
<div class="w-4 h-4 bg-green-500 rounded-full animate-pulse"></div>
|
||||||
|
<span class="text-lg font-semibold">
|
||||||
|
目前可接受新项目
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p class="text-muted-foreground mb-6">
|
||||||
|
我目前可以接受 1-2 个新项目。偏好长期合作模式(技术合伙人或长期项目),但也会考虑短期项目。
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<span class="px-3 py-1 bg-green-500/20 text-green-600 dark:text-green-400 rounded-full text-sm">
|
||||||
|
可立即开始
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">
|
||||||
|
远程工作
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">
|
||||||
|
中英双语
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Contact CTA -->
|
||||||
|
<section class="py-16 relative bg-gradient-to-br from-purple-900/20 to-blue-900/20 dark:from-purple-900/30 dark:to-blue-900/30">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<h2 class="text-3xl font-bold mb-6">
|
||||||
|
准备好一起构建了吗?
|
||||||
|
</h2>
|
||||||
|
<p class="text-lg text-muted-foreground mb-8 max-w-xl mx-auto">
|
||||||
|
告诉我你的项目想法,让我们看看能否合作。
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href="mailto:zhaoguiyang18@gmail.com"
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📧</span>
|
||||||
|
发送邮件
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/zh/now"
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📡</span>
|
||||||
|
了解更多关于我
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<Footer lang={lang} client:only="react" />
|
||||||
|
</Layout>
|
||||||
@@ -4,7 +4,7 @@ import GlassHeader from "@/components/GlassHeader";
|
|||||||
import SkillsMarquee from "@/components/SkillsMarquee";
|
import SkillsMarquee from "@/components/SkillsMarquee";
|
||||||
import TypewriterEffect from "@/components/TypewriterEffect";
|
import TypewriterEffect from "@/components/TypewriterEffect";
|
||||||
import Footer from "@/components/Footer";
|
import Footer from "@/components/Footer";
|
||||||
import Container from "@/components/ui/Container";
|
import Container from "@/components/ui/Container.astro";
|
||||||
import { useTranslations } from "@/i18n/utils";
|
import { useTranslations } from "@/i18n/utils";
|
||||||
import type { Lang } from "@/types/i18n";
|
import type { Lang } from "@/types/i18n";
|
||||||
import { defaultLang } from "@/i18n/ui";
|
import { defaultLang } from "@/i18n/ui";
|
||||||
@@ -24,7 +24,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Greeting -->
|
<!-- Greeting -->
|
||||||
<div class="flex items-center justify-center mb-6">
|
<div class="flex items-center justify-center mb-6">
|
||||||
@@ -79,23 +79,23 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Action buttons -->
|
<!-- Action buttons -->
|
||||||
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center mb-16">
|
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center mb-16">
|
||||||
<a
|
<a
|
||||||
href="#about"
|
href="/zh/hire"
|
||||||
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
class="bg-purple-500 hover:bg-purple-600 text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
|
||||||
</svg>
|
</svg>
|
||||||
{t('hero.viewProjects')}
|
{t('hero.ctaPrimary')}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href={`mailto:${personalInfo.email}`}
|
href="/zh/projects"
|
||||||
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-8 py-3 rounded-lg font-semibold transition-colors flex items-center gap-2"
|
||||||
>
|
>
|
||||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
{t('hero.contactMe')}
|
{t('hero.ctaSecondary')}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -200,9 +200,78 @@ const pageTitle = t('site.title');
|
|||||||
|
|
||||||
<SkillsMarquee lang={lang} client:only="react" />
|
<SkillsMarquee lang={lang} client:only="react" />
|
||||||
|
|
||||||
|
<!-- Featured Project: Elynd -->
|
||||||
|
<section class="py-24 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30">
|
||||||
|
<Container>
|
||||||
|
<div class="text-center mb-12">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
Featured 项目
|
||||||
|
</span>
|
||||||
|
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 via-blue-400 to-purple-400 bg-clip-text text-transparent">
|
||||||
|
Elynd
|
||||||
|
</h2>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
一个开放的 AI 工作空间,让构建者能够更智能地工作
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 overflow-hidden">
|
||||||
|
<div class="h-64 md:h-80 bg-gradient-to-br from-purple-600/20 via-blue-600/20 to-purple-600/20 flex items-center justify-center relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-grid-purple-500/10 [mask-image:linear-gradient(0deg,white,rgba(255,255,255,0.3))]"></div>
|
||||||
|
<div class="text-center z-10">
|
||||||
|
<div class="text-6xl md:text-8xl mb-4">⚡</div>
|
||||||
|
<div class="text-2xl md:text-3xl font-bold text-purple-400">
|
||||||
|
让 AI 成为你的共同构建者
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="p-8">
|
||||||
|
<div class="grid md:grid-cols-3 gap-6 mb-8">
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-purple-400 mb-2">AI-First</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
从第一天就融入 AI 思维
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-blue-400 mb-2">Open</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
完全开放,可自托管
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<div class="text-3xl font-bold text-green-400 mb-2">Builder-First</div>
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
为构建者打造的工作空间
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href="/zh/projects"
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>🚀</span>
|
||||||
|
{t('hero.ctaSecondary')}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/zh/now"
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📡</span>
|
||||||
|
了解更多
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- Services Section - Inlined Content -->
|
<!-- Services Section - Inlined Content -->
|
||||||
<section id="services" class="py-20 px-4 bg-gradient-to-br from-slate-50 to-blue-50 dark:from-slate-900 dark:to-slate-800">
|
<section id="services" class="py-20 px-4 bg-gradient-to-br from-slate-50 to-blue-50 dark:from-slate-900 dark:to-slate-800">
|
||||||
<Container client:load>
|
<Container>
|
||||||
<h2 class="text-4xl font-bold text-center mb-16 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
|
<h2 class="text-4xl font-bold text-center mb-16 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
|
||||||
{t('services.title')}
|
{t('services.title')}
|
||||||
</h2>
|
</h2>
|
||||||
@@ -246,7 +315,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-blue-900/10 via-purple-800/5 to-indigo-700/10 dark:from-blue-900/20 dark:via-purple-800/10 dark:to-indigo-700/20"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-blue-900/10 via-purple-800/5 to-indigo-700/10 dark:from-blue-900/20 dark:via-purple-800/10 dark:to-indigo-700/20"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Section Title -->
|
<!-- Section Title -->
|
||||||
<div class="flex items-center justify-center mb-6">
|
<div class="flex items-center justify-center mb-6">
|
||||||
@@ -389,7 +458,7 @@ const pageTitle = t('site.title');
|
|||||||
<!-- <section id="projects" class="py-20 relative">
|
<!-- <section id="projects" class="py-20 relative">
|
||||||
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-purple-600 bg-clip-text text-transparent">
|
<h2 class="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-purple-600 bg-clip-text text-transparent">
|
||||||
我的项目
|
我的项目
|
||||||
|
|||||||
191
src/pages/zh/now.astro
Normal file
191
src/pages/zh/now.astro
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/Layout.astro";
|
||||||
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
|
import Container from "@/components/ui/Container.astro";
|
||||||
|
import { useTranslations } from "@/i18n/utils";
|
||||||
|
import type { Lang } from "@/types/i18n";
|
||||||
|
import { defaultLang } from "@/i18n/ui";
|
||||||
|
|
||||||
|
const lang = Astro.currentLocale as Lang || defaultLang;
|
||||||
|
const t = useTranslations(lang);
|
||||||
|
const pageTitle = lang === 'zh' ? '现在' : 'Now';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={pageTitle}>
|
||||||
|
<GlassHeader lang={lang} client:only="react" />
|
||||||
|
<main class="min-h-screen">
|
||||||
|
<!-- Now Page Hero -->
|
||||||
|
<section class="py-24 relative overflow-hidden">
|
||||||
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-blue-900/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-blue-900/30"></div>
|
||||||
|
|
||||||
|
<Container className="relative z-10">
|
||||||
|
<div class="text-center mb-16">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium mb-4">
|
||||||
|
关于我现在正在做什么
|
||||||
|
</span>
|
||||||
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
|
现在
|
||||||
|
</h1>
|
||||||
|
<p class="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
持续更新我的现状、正在构建的内容以及合作机会
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Building Section -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-purple-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🔨</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
正在构建
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/20 p-8">
|
||||||
|
<div class="flex items-start gap-6">
|
||||||
|
<div class="w-16 h-16 bg-gradient-to-br from-purple-600 to-blue-600 rounded-xl flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-3xl">⚡</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex-1">
|
||||||
|
<h3 class="text-xl font-bold mb-2">Elynd</h3>
|
||||||
|
<p class="text-muted-foreground mb-4">
|
||||||
|
一个开放的 AI 工作空间,让构建者能够更智能地工作。从 AI 第一性原理出发,打造完全开放、可自托管的协作工具。
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-wrap gap-2">
|
||||||
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">AI 产品</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">TypeScript</span>
|
||||||
|
<span class="px-3 py-1 bg-green-500/20 text-green-600 dark:text-green-400 rounded-full text-sm">开源</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Exploring Section -->
|
||||||
|
<section class="py-16 relative bg-white/5 dark:bg-gray-900/50">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-blue-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🔭</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
正在探索
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
AI Agents 与工作流自动化
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
研究如何构建能够自主完成复杂任务的 AI Agent,以及如何将 AI 能力融入日常工作流。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-blue-500/20 p-6">
|
||||||
|
<h3 class="text-lg font-bold mb-3">
|
||||||
|
产品导向的开发实践
|
||||||
|
</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
探索从产品角度思考开发,构建真正解决用户问题的产品,而不仅仅是技术实现。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Shipping Section -->
|
||||||
|
<section class="py-16 relative">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🚀</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
最近发布
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl border border-green-500/20 p-6 flex items-center gap-4">
|
||||||
|
<div class="w-12 h-12 bg-green-500/20 rounded-lg flex items-center justify-center flex-shrink-0">
|
||||||
|
<span class="text-xl">✨</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 class="font-bold mb-1">
|
||||||
|
个人网站全新改版
|
||||||
|
</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
全新设计的个人网站,突出 AI 产品构建者的定位
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Open to Collaborate Section -->
|
||||||
|
<section class="py-16 relative bg-gradient-to-br from-purple-900/10 to-blue-900/10 dark:from-purple-900/20 dark:to-blue-900/20">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<div class="flex items-center justify-center gap-4 mb-8">
|
||||||
|
<div class="w-12 h-12 bg-yellow-500/20 rounded-xl flex items-center justify-center">
|
||||||
|
<span class="text-2xl">🤝</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-3xl font-bold">
|
||||||
|
开放合作
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-yellow-500/20 p-8">
|
||||||
|
<p class="text-lg text-muted-foreground mb-8">
|
||||||
|
我始终对新的合作机会持开放态度。无论你是想要构建产品、寻找技术合伙人,还是需要技术咨询,都可以联系我。
|
||||||
|
</p>
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href="/zh/hire"
|
||||||
|
class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>💼</span>
|
||||||
|
查看合作方式
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="mailto:zhaoguiyang18@gmail.com"
|
||||||
|
class="border border-purple-500 text-purple-500 hover:bg-purple-500 hover:text-white px-6 py-3 rounded-lg font-semibold transition-colors inline-flex items-center justify-center gap-2"
|
||||||
|
>
|
||||||
|
<span>📧</span>
|
||||||
|
发送邮件
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Last Updated -->
|
||||||
|
<section class="py-12">
|
||||||
|
<Container>
|
||||||
|
<div class="max-w-4xl mx-auto text-center">
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
最后更新:
|
||||||
|
<span class="font-medium">2025年3月</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
<Footer lang={lang} client:only="react" />
|
||||||
|
</Layout>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
import Layout from "@/layouts/Layout.astro";
|
import Layout from "@/layouts/Layout.astro";
|
||||||
import GlassHeader from "@/components/GlassHeader";
|
import GlassHeader from "@/components/GlassHeader";
|
||||||
import Footer from "@/components/Footer";
|
import Footer from "@/components/Footer";
|
||||||
import Container from "@/components/ui/Container";
|
import Container from "@/components/ui/Container.astro";
|
||||||
import { useTranslations } from "@/i18n/utils";
|
import { useTranslations } from "@/i18n/utils";
|
||||||
import type { Lang } from "@/types/i18n";
|
import type { Lang } from "@/types/i18n";
|
||||||
import { defaultLang } from "@/i18n/ui";
|
import { defaultLang } from "@/i18n/ui";
|
||||||
@@ -15,6 +15,15 @@ const pageTitle = t('projects.title');
|
|||||||
|
|
||||||
// 根据当前语言获取项目数据
|
// 根据当前语言获取项目数据
|
||||||
const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
||||||
|
|
||||||
|
// Separate featured and grouped projects
|
||||||
|
const featuredProject = currentProjects.find(p => p.featured);
|
||||||
|
const otherProjects = currentProjects.filter(p => !p.featured);
|
||||||
|
|
||||||
|
// Group by type
|
||||||
|
const productProjects = otherProjects.filter(p => p.type === 'product');
|
||||||
|
const clientProjects = otherProjects.filter(p => p.type === 'client');
|
||||||
|
const experimentProjects = otherProjects.filter(p => p.type === 'experiment');
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title={pageTitle}>
|
<Layout title={pageTitle}>
|
||||||
@@ -25,7 +34,7 @@ const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
|||||||
<!-- Background gradient -->
|
<!-- Background gradient -->
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
<div class="absolute inset-0 bg-gradient-to-br from-purple-900/20 via-purple-800/10 to-purple-700/20 dark:from-purple-900/30 dark:via-purple-800/20 dark:to-purple-700/30"></div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<Container className="relative z-10">
|
||||||
<div class="text-center mb-16">
|
<div class="text-center mb-16">
|
||||||
<!-- Main title -->
|
<!-- Main title -->
|
||||||
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
<h1 class="text-5xl md:text-6xl font-bold mb-6 bg-gradient-to-r from-gray-900 via-purple-600 to-purple-800 dark:from-white dark:via-purple-200 dark:to-purple-300 bg-clip-text text-transparent">
|
||||||
@@ -40,68 +49,273 @@ const currentProjects = projects[lang as keyof typeof projects] || projects.en;
|
|||||||
</Container>
|
</Container>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Projects Grid Section -->
|
<!-- Featured Project Section -->
|
||||||
<section class="py-12 relative">
|
{featuredProject && (
|
||||||
<!-- Background gradient -->
|
<section class="py-12 bg-gradient-to-br from-purple-900/10 to-blue-900/10 dark:from-purple-900/20 dark:to-blue-900/20">
|
||||||
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-purple-900/5 to-transparent"></div>
|
<Container>
|
||||||
|
<div class="max-w-5xl mx-auto">
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<span class="inline-block px-4 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm font-medium">
|
||||||
|
Featured 项目
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<Container client:load className="relative z-10">
|
<div class="bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-2xl border border-purple-500/30 overflow-hidden">
|
||||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 items-stretch">
|
<div class="grid lg:grid-cols-2">
|
||||||
{currentProjects.map((project) => (
|
<div class="h-64 lg:h-auto bg-gradient-to-br from-purple-600/20 via-blue-600/20 to-purple-600/20 flex items-center justify-center relative overflow-hidden">
|
||||||
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
<div class="text-8xl">{featuredProject.icon}</div>
|
||||||
<!-- Project tag - positioned at top right -->
|
</div>
|
||||||
<div class="absolute top-4 right-4 z-10">
|
<div class="p-8">
|
||||||
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.tag.${project.tag}`)}</span>
|
<div class="flex items-center gap-3 mb-4">
|
||||||
</div>
|
<span class="px-3 py-1 bg-purple-500/20 text-purple-600 dark:text-purple-400 rounded-full text-sm">
|
||||||
|
{t(`project.status.${featuredProject.status}`)}
|
||||||
|
</span>
|
||||||
|
<span class="px-3 py-1 bg-blue-500/20 text-blue-600 dark:text-blue-400 rounded-full text-sm">
|
||||||
|
{t(`project.type.${featuredProject.type}`)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Project image placeholder -->
|
<h2 class="text-3xl font-bold mb-4">{featuredProject.title}</h2>
|
||||||
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
|
||||||
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
<div class="space-y-4 mb-6">
|
||||||
<div class="absolute bottom-4 left-4 right-4">
|
<div>
|
||||||
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
<span class="text-sm text-muted-foreground">{t('project.role')}:</span>
|
||||||
{project.title}
|
<p class="font-medium">{featuredProject.role}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="text-sm text-muted-foreground">{t('project.impact')}:</span>
|
||||||
|
<p class="font-medium">{featuredProject.impact}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 mb-6">
|
||||||
|
{featuredProject.description.map((desc) => (
|
||||||
|
<p class="text-muted-foreground text-sm">{desc}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap gap-2 mb-6">
|
||||||
|
{featuredProject.tech.map((tech) => (
|
||||||
|
<span class="px-3 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-sm rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<a href={featuredProject.link} class="bg-purple-500 hover:bg-purple-600 text-white px-6 py-2 rounded-lg font-medium transition-colors inline-flex items-center gap-2">
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{featuredProject.links?.github && (
|
||||||
|
<a href={featuredProject.links.github} target="_blank" rel="noopener noreferrer" class="border border-gray-500 text-gray-600 dark:text-gray-300 hover:bg-gray-500/10 px-6 py-2 rounded-lg font-medium transition-colors inline-flex items-center gap-2">
|
||||||
|
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
|
||||||
|
</svg>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-6 pb-4">
|
|
||||||
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
|
||||||
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
|
||||||
{project.title}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="px-6 flex-grow">
|
|
||||||
<div class="space-y-3">
|
|
||||||
{project.description.map((desc) => (
|
|
||||||
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
|
||||||
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
|
||||||
<span>{desc}</span>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tech stack indicators with unified gray styling -->
|
|
||||||
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
|
||||||
{project.tech.map((tech) => (
|
|
||||||
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Visit project link -->
|
|
||||||
<div class="p-6 pt-2">
|
|
||||||
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
|
||||||
{t('project.visit')}
|
|
||||||
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
</div>
|
||||||
</div>
|
</Container>
|
||||||
</div>
|
</section>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Projects by Type -->
|
||||||
|
<section class="py-12 relative">
|
||||||
|
<Container>
|
||||||
|
<!-- Product Projects -->
|
||||||
|
{productProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-purple-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">🛍️</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.product')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
|
||||||
|
{productProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Client Projects -->
|
||||||
|
{clientProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-blue-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">💼</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.client')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-12">
|
||||||
|
{clientProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<!-- Experiment Projects -->
|
||||||
|
{experimentProjects.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div class="flex items-center gap-4 mb-8">
|
||||||
|
<div class="w-10 h-10 bg-green-500/20 rounded-lg flex items-center justify-center">
|
||||||
|
<span class="text-xl">🧪</span>
|
||||||
|
</div>
|
||||||
|
<h2 class="text-2xl font-bold">{t('project.type.experiment')}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
||||||
|
{experimentProjects.map((project) => (
|
||||||
|
<div class={`group overflow-hidden border border-${project.color}-500/20 hover:border-${project.color}-500/40 h-full flex flex-col transition-all duration-500 hover:scale-105 bg-white/10 dark:bg-gray-800/50 backdrop-blur-sm rounded-xl relative`}>
|
||||||
|
<div class="absolute top-4 right-4 z-10 flex gap-2">
|
||||||
|
<span class={`px-3 py-1 bg-${project.color}-100 dark:bg-${project.color}-800 text-${project.color}-800 dark:text-${project.color}-200 text-xs rounded-full font-medium border border-${project.color}-200 dark:border-${project.color}-700`}>{t(`project.status.${project.status}`)}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class={`h-48 bg-gradient-to-br ${project.image.bg} relative overflow-hidden`}>
|
||||||
|
<div class={`absolute inset-0 bg-gradient-to-br ${project.image.bg} group-hover:${project.image.hover} transition-all duration-500`}></div>
|
||||||
|
<div class="absolute bottom-4 left-4 right-4">
|
||||||
|
<div class={`bg-black/50 backdrop-blur-sm rounded px-3 py-1 text-xs font-mono ${project.image.text}`}>
|
||||||
|
{project.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pb-4">
|
||||||
|
<h3 class={`text-xl group-hover:text-${project.color}-400 transition-colors duration-300 flex items-center gap-2 font-bold mb-4`}>
|
||||||
|
<span class={`text-${project.color}-500`}>{project.icon}</span>
|
||||||
|
{project.title}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="px-6 flex-grow">
|
||||||
|
<div class="space-y-3">
|
||||||
|
{project.description.slice(0, 2).map((desc) => (
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-300">
|
||||||
|
<span class={`text-${project.color}-500 mt-1`}>•</span>
|
||||||
|
<span>{desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6 mb-4 flex flex-wrap gap-2">
|
||||||
|
{project.tech.slice(0, 4).map((tech) => (
|
||||||
|
<span class="px-2 py-1 bg-gray-500/10 dark:bg-gray-400/20 text-gray-600 dark:text-gray-300 text-xs rounded-md border border-gray-500/20 dark:border-gray-400/30">{tech}</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-6 pt-2">
|
||||||
|
<a href={project.link} class={`inline-flex items-center text-sm font-medium text-${project.color}-500 hover:text-${project.color}-600 dark:hover:text-${project.color}-400 transition-colors duration-300`}>
|
||||||
|
{t('project.visit')}
|
||||||
|
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Container>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
<Footer lang={lang} client:load />
|
<Footer lang={lang} client:load />
|
||||||
|
|||||||
@@ -1,108 +1,42 @@
|
|||||||
---
|
---
|
||||||
title: "我的服务"
|
title: "我能做什么"
|
||||||
description: "探索我提供的专业服务,帮助您实现数字项目"
|
description: "专注于构建 AI 产品和技术卓越的专业服务"
|
||||||
layout: "../../layouts/AboutLayout.astro"
|
layout: "../../layouts/AboutLayout.astro"
|
||||||
---
|
---
|
||||||
|
|
||||||
import HighlightBox from '../../components/markdown/HighlightBox.astro';
|
import HighlightBox from '../../components/markdown/HighlightBox.astro';
|
||||||
|
|
||||||
# 提供服务 🛠️
|
# 我能做什么 🚀
|
||||||
|
|
||||||
<HighlightBox type="tip" title="服务理念">
|
<HighlightBox type="tip">
|
||||||
用优雅的代码和创新的思维,为复杂问题打造精致的解决方案。
|
构建 AI 驱动产品,将雄心勃勃的想法变为现实。
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
|
|
||||||
## 网站开发 🌐
|
## AI 产品开发 🤖
|
||||||
|
|
||||||
- 使用最新技术构建响应式现代网站
|
- 从概念到上线构建 AI 驱动产品
|
||||||
- 创建根据您特定需求定制的网络应用程序
|
- RAG 应用、AI Agent 和智能自动化
|
||||||
- 使用 React、Vue.js 或 Angular 实现前端界面
|
- 使用现代技术栈的全栈开发(React、Next.js、Node.js)
|
||||||
- 使用 Node.js、Express、Django 或 Flask 开发后端系统
|
- 产品思维 - 专注于解决实际问题
|
||||||
- 优化网站性能和用户体验
|
- 快速原型和迭代开发
|
||||||
|
|
||||||
## APP 开发 📱
|
## 技术咨询 📊
|
||||||
|
|
||||||
- 使用 React Native 或 Flutter 开发跨平台移动应用
|
<HighlightBox type="info" title="我可以如何帮助">
|
||||||
- 创建原生 iOS 和 Android 应用
|
|
||||||
- 构建渐进式网络应用(PWAs),提供类似移动应用的网页体验
|
|
||||||
- 实现离线功能和推送通知
|
|
||||||
- 集成设备功能,如摄像头、GPS 和传感器
|
|
||||||
|
|
||||||
## 微信小程序开发 💬
|
- 技术架构和技术栈决策
|
||||||
|
- 代码审查和最佳实践实施
|
||||||
- 为企业设计和开发微信小程序
|
- 团队指导和知识转移
|
||||||
- 创建交互性强且引人入胜的用户界面
|
- 性能优化和扩展策略
|
||||||
- 实现微信支付和其他微信 API
|
- 投资技术尽职调查
|
||||||
- 针对微信生态系统和要求进行优化
|
|
||||||
- 构建特定于您业务需求的自定义功能
|
|
||||||
|
|
||||||
## UI设计 🎨
|
|
||||||
|
|
||||||
- 创建现代、简洁、直观的用户界面
|
|
||||||
- 设计适用于所有设备的响应式布局
|
|
||||||
- 开发品牌标识和视觉语言
|
|
||||||
- 创建线框图、原型和高保真模型
|
|
||||||
- 实现设计系统,确保一致的用户体验
|
|
||||||
|
|
||||||
## BUg 修复 🐛
|
|
||||||
|
|
||||||
<HighlightBox type="error" title="Bug修复与代码优化">
|
|
||||||
|
|
||||||
- 识别和解决现有应用程序中的问题
|
|
||||||
- 调试前端和后端系统中的复杂问题
|
|
||||||
- 优化代码以提高性能和可靠性
|
|
||||||
- 将旧代码重构为现代标准
|
|
||||||
- 实施自动化测试以防止未来出现错误
|
|
||||||
|
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
|
|
||||||
## 注意事项 📝
|
# 一起构建 💼
|
||||||
|
|
||||||
<HighlightBox type="warning" title="合作前须知">
|
<HighlightBox type="success" title="联系我">
|
||||||
为了减少不必要的麻烦,请在沟通之前仔细阅读以下注意事项:
|
我始终对讨论新项目和机会持开放态度。无论你是正在寻找技术合伙人、需要帮助构建 AI 产品,还是想要技术咨询 - 让我们聊聊。
|
||||||
|
|
||||||
1. 请提供详细的需求说明,有原型图或设计稿更佳(如果你不了解这些也没关系,我这边可以帮你整理)。
|
|
||||||
2. 请提供项目完成时间,开发周期。
|
|
||||||
3. 一般情况下只接商单,其他形式的合作需要另行协商。
|
|
||||||
4. 暂时无法提供开票服务。
|
|
||||||
5. 项目完成后可免费维护3个月。
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## 合作步骤 🤝
|
|
||||||
|
|
||||||
<HighlightBox type="info" title="合作流程">
|
|
||||||
|
|
||||||
1. 确定合作项目
|
|
||||||
2. 确定合作方式
|
|
||||||
3. 确定项目功能需求
|
|
||||||
4. 确定开发周期以及交付时间
|
|
||||||
5. 确定项目设计图或原型图
|
|
||||||
6. 支付费用
|
|
||||||
7. 项目开发
|
|
||||||
8. 项目测试
|
|
||||||
9. 项目上线
|
|
||||||
10. 项目维护
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## 付款方式 💰
|
|
||||||
|
|
||||||
<HighlightBox type="success" title="支付方式">
|
|
||||||
|
|
||||||
- 微信支付
|
|
||||||
- 支付宝支付
|
|
||||||
- 银行转账
|
|
||||||
|
|
||||||
**注:所有项目费用均为442付款制**
|
|
||||||
|
|
||||||
</HighlightBox>
|
|
||||||
|
|
||||||
## 联系方式 📞
|
|
||||||
|
|
||||||
<HighlightBox type="info" title="联系我">
|
|
||||||
|
|
||||||
- QQ: **2770723534**
|
|
||||||
- 微信:**JoyCodeing**
|
|
||||||
- 邮箱:**zhaoguiyang18@gmail.com**
|
- 邮箱:**zhaoguiyang18@gmail.com**
|
||||||
|
- 查看我的[合作](/zh/hire)页面了解合作方式
|
||||||
</HighlightBox>
|
</HighlightBox>
|
||||||
@@ -172,6 +172,7 @@
|
|||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
@apply bg-background text-foreground;
|
@apply bg-background text-foreground;
|
||||||
|
font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", "Inter", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
font-feature-settings: "ss01", "ss02", "cv01", "cv02";
|
font-feature-settings: "ss01", "ss02", "cv01", "cv02";
|
||||||
}
|
}
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
|||||||
Reference in New Issue
Block a user