作品集网站 — 维护技能
这是 Mitchell Palmer 的个人作品集:一个 Next.js 16(App Router)重建的网站,原先基于 Webflow 构建。内容以纯 TypeScript/JSON/MDX 文件的形式存储在 src/content/ 下,而非 CMS。在做出更改之前请阅读本文档,以确保遵循现有约定,而不是引入新模式。
心智模型
src/content/ → 数据 (要说的内容——几乎所有编辑都修改这里)
src/app/ → 页面 (路由——一个文件夹 = 一个 URL,App Router 约定)
src/components/ → UI 组件 (可复用的组件——Header、Footer、ProjectCard、PhotoGallery、MDX 嵌入组件)
public/images/ → 静态资源,按部分组织(site/、projects/、projects/hero/、photography/、icons/)
如果任务是“添加/编辑内容”(项目、工作经历、个人简介行、照片),几乎肯定只修改 src/content/。纯内容更改时不要触碰 src/app/ 或 src/components/。
内容文件参考
| 文件 | 控制的内容 |
|---|---|
src/content/site.ts | 姓名、标签行、邮箱、导航链接、社交链接 |
src/content/about.ts | 个人简介段落、“旅程”故事、使命声明、状态 |
src/content/experience.ts | 工作经历(experience[])、教育背景、技能列表、服务卡片 |
src/content/photography.json | { src, season, location, type } 数组——/photography 页面上的过滤按钮会根据此文件中出现的值自动生成 |
src/content/projects.ts | 仅包含逻辑(读取 projects/ 下的 .mdx 文件)——除非更改项目的加载/排序方式,否则不要编辑 |
src/content/projects/*.mdx | 每个项目一个文件。frontmatter + Markdown/MDX 正文。文件名 = URL slug。 |
项目 MDX frontmatter 结构
---
title: "项目标题"
description: "1-2 句话,显示在卡片和详情页顶部。"
image: "/images/projects/thumbnail.jpg"
heroImage: "/images/projects/hero/banner.jpg" # 可选,默认回退到 `image`
featured: true # 在首页显示
link: { label: "GitHub 仓库", href: "https://..." }
skills: ["技能一", "技能二"]
tools: ["Python", "PostgreSQL"]
# 或者对于包含多种技术的项目,使用 techGroups 替代 skills/tools:
techGroups:
语言与库: ["Python", "pandas"]
统计方法: ["CUSUM", "Z-Score 分析"]
---
注意:ProjectCard.tsx 显示 project.tools ?? project.skills(如果两者都存在,tools 优先)。techGroups 与 skills/tools 在显示上是互斥的——详情页的侧边栏只显示其中之一,不会同时显示。
在任何项目正文中都可以使用两个自定义 MDX 组件:
<DashboardEmbed src="https://your-app.streamlit.app/" title="我的仪表板" />
<PdfEmbed src="/path/to/summary.pdf" />
样式约定
- Tailwind v4,CSS 变量定义在
src/app/globals.css的:root中(例如--color-brand: #486161)。在那里更改调色板,而不是在组件中硬编码十六进制值。 - 两种字体:
--font-serif(Merriweather,标题)和--font-sans(Inter Tight,正文)——都在layout.tsx中通过next/font/google加载。在构建时需要互联网访问——在离线/沙盒环境中会失败。 .container-page工具类用于跨页面保持一致的最大宽度和内边距。
不要触碰
node_modules/— 被 gitignore 忽略,通过npm install重新生成。切勿重新添加到 git。- 仓库根目录中的
AGENTS.md— 由next dev自动重新生成,向 AI 代理介绍此 Next.js 版本的具体约定。不要手动编辑;它会被覆盖。 - 仓库根目录中的
CLAUDE.md— 目前仅包含@AGENTS.md(一个导入)。如果需要添加持久的自定义指令,请将其放在新文件中并单独引用,不要覆盖 AGENTS.md 的导入。 next-env.d.ts— 自动生成,被 gitignore 忽略。
常见任务快速参考
新项目 → 将缩略图放入 public/images/projects/(可选英雄横幅)→ 在 src/content/projects/ 中创建一个新的 .mdx 文件 → 完成,无需路由代码。
新照片 → 将文件放入 public/images/photography/ → 在 photography.json 中添加匹配条目。
编辑个人简介/使命 → src/content/about.ts,纯字符串编辑。
新工作经历条目 → src/content/experience.ts,前置添加到 experience[] 数组中(按数组顺序渲染,因此最新的在前)。
导航/社交链接更改 → src/content/site.ts。
构建与验证
npm install # 在拉取更改触及 package.json 后执行
npm run dev # 本地开发服务器,热重载
npm run build # 生产构建——在推送结构性更改之前运行此命令
npm run lint # eslint 检查
npm run build 在没有互联网访问时会失败(Google Fonts 拉取)——这在完全离线环境中是预期行为,而非代码错误。