diff --git a/business-architecture.md b/business-architecture.md deleted file mode 100644 index 03d2153..0000000 --- a/business-architecture.md +++ /dev/null @@ -1,163 +0,0 @@ -# 巴适伙伴 · 业务体系总纲(业务全景图) - -> 这是"各版块业务"的体系总纲。先定结构,后续产品文案、首页↔业务页衔接、Innovation/Sustainability/Investors 等边缘板块如何收口,都以本文档为据。 -> **骨架已于 2026-08 确认**:第 8 节 6 项关键推断全部拍板(详见第 8 节"已确认的关键决策")。下文凡原标【推断·待确认】者均已转正为定稿;第 5–7 节为"骨架确认后的落地建议",待执行。 -> 关联代码:业务页 [`Business.tsx`](src/components/Business.tsx) · 赛道数据 [`zh.ts`](src/i18n/zh.ts) `business.tracks` · 首页受众 [`Home.tsx`](src/components/Home.tsx) `pillars`。 - ---- - -## 0. 现状诊断:为什么现在还不是"一个完整的体系" - -当前站点存在**两套并行、互不映射**的业务心智模型: -- **业务页** 按「4 条赛道」组织(内容社交/职场服务/数字支付/人工智能)——回答"我们造什么" -- **首页** 按「3 大受众」组织(消费者/企业/未来)——回答"我们为谁" - -两者之间没有桥接,访客看不到"妥哒服务谁""阿布AI算不算未来",等于两个半体系。叠加以下问题,整体未成"体系": -1. 赛道失衡无逻辑支撑:数字支付仅 1 个产品(妥哒)显单薄,职场服务 4 个最重;缺一句"为什么是 4 条、为什么这样配比"。 -2. 产品层信息单薄:每个产品只有"名称 + 一句营销语",无定位/目标用户/核心价值/生态位置。 -3. 定位—赛道—受众之间没有"数字生活生态"结构图:业务页 CTA 写"共建数字生活生态",但生态长什么样从未可视化。 -4. 边缘板块脱节:Innovation 页已重定向到 /business(半废弃悬空);Sustainability 的"数字普惠/绿色低碳/责任运营"是抽象概念,未与产品挂钩;Investors 是孤立 CTA。 -5. 品牌命名待澄清 ~~(原疑点)~~ → **已澄清(2026-08)**:项目文件夹名"巴士伙伴官网"与 Mascot(车形狗)用"巴士",但**品牌名是"巴适伙伴"**(川渝方言"舒服/恰好")。"巴士"仅为文件夹命名遗留 + Mascot 玩梗,**不构成"出行/交通"业务维度**,体系图无需加入出行/交通赛道。 - ---- - -## 1. 一句话定位(L1 · 定位层) - -- **巴适伙伴是**:聚焦数字生活服务的高科技企业,以"温暖科技"连接人、机会、价值与智能,共建数字生活生态。 -- **为谁**:消费者 · 企业 · 未来(前沿) -- **创造什么价值**:让数字生活更**连接、更成长、更可信、更被理解** - -> ✅ 已确认:"温暖科技""数字生活生态"作为长期品牌核心词沿用。 - ---- - -## 2. 数字生活的四个动作(L3 · 赛道逻辑 / "为什么是 4 条") - -4 条赛道 = 数字生活的 4 个基本面,对应 4 个动词,自洽且可对外讲清"为什么是 4 条、为什么这样配比": - -| 赛道 | 动作 | 关系 | 现有产品数 | -|---|---|---|---| -| 内容社交 | **连接** | 人与人 | 3(青核/音酷/蜜恋) | -| 职场服务 | **成长** | 人与机会 | 4(职来/看山/步途/跃升) | -| 数字支付 | **交易** | 人与价值 | 1(妥哒) | -| 人工智能 | **理解** | 人与智能 | 2(阿布AI/听愿) | - -> ✅ 已确认配比解读:职场服务 4 个最重,因为"成长"是巴适当前最厚的能力沉淀;数字支付 1 个是"交易底座",重深度而非数量;人工智能 2 个是未来下注。 - ---- - -## 3. 三大受众(L2 · 受众层) - -| 受众 | 定义 | 核心需求 | -|---|---|---| -| **消费者** | 个体的数字生活 | 社交 / 创作 / 求职 / 支付 / AI 陪伴 | -| **企业** | 组织的效率与增长 | 招聘 / 知识 / 培训 / 收付款 | -| **未来** | 前沿与平台层(长期下注) | 多模态 AI / 意图理解 / 基础设施 | - -> ✅ 已确认:"未来"作为受众定义为"前沿/平台层"而非具体客户——成立。AI 赛道(阿布AI/听愿)即"未来"受众的落点。 - ---- - -## 4. 产品 × 受众矩阵(横切 · 每个产品有家) - -打勾 = 该产品服务该受众。 - -| 产品 | 赛道 | 消费者 | 企业 | 未来 | 价值主张 | 生态角色 | -|---|---|:--:|:--:|:--:|---|---| -| 青核 | 内容社交 | ✓ | | | 让志同道合的人真诚相遇 | 连接引擎 | -| 音酷 | 内容社交 | ✓ | | | 让人人都能创作音乐 | 创作工具 | -| 蜜恋 | 内容社交 | ✓ | | | 理解情感的温暖社交 | 情感连接 | -| 职来 | 职场服务 | ✓ | ✓ | | 人岗智能匹配,成长路径可见 | 双边市场 | -| 看山 | 职场服务 | ✓ | ✓ | | 让知识触手可及 | 知识基础设施 | -| 步途 | 职场服务 | ✓ | | | 个人成长路径规划 | 成长工具 | -| 跃升 | 职场服务 | ✓ | ✓ | | 能力提升引擎,赋能跃迁 | 能力平台 | -| 妥哒 | 数字支付 | ✓ | ✓ | | 场景化支付,安全有温度 | 交易底座 | -| 阿布AI | 人工智能 | ✓ | | ✓ | 多模态生活助手,温暖每一天 | AI 入口/平台 | -| 听愿 | 人工智能 | ✓ | | ✓ | 听懂你的每一个愿望 | 意图理解引擎 | - -> ✅ 已确认企业侧判断:4 个企业侧勾选(**职来 / 看山 / 跃升 / 妥哒**)成立,无需调整。 -> - **职来、妥哒** = 天然双边市场(招聘必有雇主 B 端、支付必有商户 B 端)。 -> - **看山**("知识基础设施")、**跃升**("能力平台/赋能跃迁")——"基础设施/平台"定位意味着既服务个体(C)也服务组织/供给方(B)。 -> - 纯 C(青核/音酷/蜜恋/步途)不勾企业;阿布AI/听愿归"未来/平台层",**平台化后才转 B**,当前不勾企业。 -> ✅ 已确认:每个产品价值主张一句话到位。 - ---- - -## 5. 数字生活生态全景图 - -```mermaid -graph TB - POS["巴适伙伴 · 定位
聚焦数字生活服务 · 温暖科技
共建数字生活生态"] - - subgraph AUD["L2 受众层 · 为谁"] - A1["消费者 · 个体的数字生活"] - A2["企业 · 组织的效率与增长"] - A3["未来 · 前沿与平台层"] - end - - subgraph TRK["L3 赛道层 · 造什么(数字生活四动作)"] - T1["内容社交 · 连接"] - T2["职场服务 · 成长"] - T3["数字支付 · 交易"] - T4["人工智能 · 理解"] - end - - subgraph PROD["产品节点 · 连接点"] - P1["青核 / 音酷 / 蜜恋"] - P2["职来 / 看山 / 步途 / 跃升"] - P3["妥哒"] - P4["阿布AI / 听愿"] - end - - ESG["ESG 责任层 · 环境 / 社会 / 治理(横切贯穿)"] - - POS --> AUD - AUD --> TRK - TRK --> PROD - ESG -. 横切贯穿 .-> TRK -``` - -> 落地建议(待执行):About 页已有交互式中心辐射图 [`OrgNetwork.tsx`](src/components/OrgNetwork.tsx)。骨架既已确认,可在业务页做一张同款"生态全景图"(中心=巴适伙伴,外环=4赛道,节点=产品,受众作为切换视角),把首页3受众与业务页4赛道统一到一张图。 - ---- - -## 6. ESG × 产品挂钩(让 Sustainability 不再空泛)—— 建议待确认 - -把 Sustainability 页的抽象行动换成与具体产品的挂钩(建议,待你确认后执行): - -| ESG 维度 | 现有抽象表述 | 产品挂钩(建议) | -|---|---|---| -| 环境 Environment | 绿色运营、降碳足迹 | 全线数字服务云化;重点阿布AI 的算力能效 | -| 社会 Social | 数字普惠、公益创新 | 妥哒(支付普惠)/ 看山(知识普惠)/ 步途·跃升(职业流动) | -| 治理 Governance | 数据合规、责任运营 | 阿布AI(AI 伦理)/ 妥哒(支付合规与数据安全) | - ---- - -## 7. 边缘板块收口(骨架已确认,待执行) - -- **Innovation 页**:已重定向到 /business。建议二选一——(a) 并入 Business 作为"研发理念 ICIDP"子段彻底删路由;(b) 保留为不可访问但清掉悬空数据。当前是悬空状态。 -- **Sustainability 页**:按上文第 6 节把抽象行动换成产品挂钩。 -- **Investors 页**:初创阶段,保留 IR 联系 CTA,与业务愿景做一句呼应即可,不堆指标。 - ---- - -## 8. 已确认的关键决策(清单) - -> 原 6 项关键推断已于 2026-08 全部拍板。以下为定稿记录。 - -1. **L1 定位措辞** ✅ 沿用:"温暖科技""数字生活生态"作为长期品牌核心词。 -2. **赛道四动作** ✅ 符合战略意图:连接(社交)/ 成长(职场)/ 交易(支付)/ 理解(AI)——这是"为什么是 4 条"的核心论据。 -3. **"未来"受众定义** ✅ 成立:定义为"前沿/平台层"而非具体客户;AI 赛道为其落点。 -4. **产品×受众打勾(企业侧)** ✅ 交助手判断——**确认 4 个企业侧产品**:职来 / 看山 / 跃升 / 妥哒(理由见第 4 节脚注);纯 C 产品不勾企业;阿布AI/听愿归未来/平台层。 -5. **每个产品价值主张一句话** ✅ 准:第 4 节"价值主张"列为定稿。 -6. **品牌名澄清** ✅ 无出行/交通维度:"巴适"=品牌(川渝方言"舒服/恰好");"巴士"仅见于项目文件夹名 + Mascot 车形狗玩梗,不构成业务赛道。体系图无需加入出行/交通。 - ---- - -## 9. 下一步(骨架既定,可推进的落地工作) - -1. ✅ **首页↔业务页桥接(已完成 2026-08)**:构建交互式 [`EcosystemMap`](src/components/EcosystemMap.tsx) 组件,落在业务页 `#ecosystem` 区块。中心=巴适伙伴,双视角切换——「按赛道看」(4 赛道节点:连接/成长/交易/理解)与「按受众看」(3 受众节点:消费者/企业/未来),同一组 10 产品按已确认矩阵重组。含中心心跳、连接线能量流、节点轻浮、受众色点(C蓝/B绿/F紫)。首页 3 受众 pillars 已改为跳转 `/business#ecosystem`,直接落到全景图。浏览器实测通过(切换/节点/面板/控制台均正常)。 -2. **产品层信息补全**:每个产品补定位/目标用户/核心价值/生态位置(第 4 节矩阵已是骨架;EcosystemMap 已展示价值主张一句 + 受众标记 + 状态)。 -3. **边缘板块收口**:Innovation 二选一、Sustainability 按第 6 节挂钩产品、Investors 加一句愿景呼应。 -4. **品牌名落地**:代码全程统一"巴适伙伴 / BaskBuddy";文件夹名"巴士伙伴官网"属遗留,可不改(不影响品牌)。 -``` diff --git a/overview-color-icon-final.md b/overview-color-icon-final.md deleted file mode 100644 index 5619305..0000000 --- a/overview-color-icon-final.md +++ /dev/null @@ -1,45 +0,0 @@ -# bashi-website — 色彩 & 图标 最终决策落地(像素君 / UI Designer) - -用户拍板「听你的」,以下决策已直接执行并验证通过。 - -## 1. 赛道色统一(解决双套定义) -之前:赛道卡片用粉彩 `#E8A0BF/#7EC8E3/#98D8AA/#C9B1FF`,但全局 `--track-*` token 是饱和默认色 `#EF4444/#2563EB/#10B981/#8B5CF6` —— **色相一致,唯独「社交」一边粉、一边红**最扎眼。 - -改为:token 与卡片粉彩**同色相**,并加深以保证 WCAG AA(白底文字 ≥4.5:1;实心按钮白字 ≥4.5:1): - -| 赛道 | 旧 token | 新 token | 对齐的卡片粉彩 | -|------|----------|----------|----------------| -| 社交 Social | `#EF4444` 红 | `#C2416B` 深玫瑰 | `#E8A0BF` 粉 | -| 职场 Career | `#2563EB` | `#1C7AB6` 深天蓝 | `#7EC8E3` 蓝 | -| 支付 Payment | `#10B981` | `#15803D` 深绿 | `#98D8AA` 绿 | -| AI | `#8B5CF6` | `#7C3AED` 深紫 | `#C9B1FF` 紫 | - -- 顺手**删掉 4 个从未引用的 `--track-*-bright` 死 token**,设计系统更干净。 - -## 2. 图标全部统一为 lucide(单一图标源) -设计系统第一原则就是一致性。把所有手写内联 SVG 换成 lucide: -- **Header**:汉堡 ↔ 关闭 → `Menu` / `X` -- **Contact**:`💼`→`Briefcase`、`🤝`→`Handshake`、CTA 箭头→`ArrowRight`、邮件→`Mail` -- **NotFound**:返回箭头→`ArrowLeft`、前往箭头→`ArrowRight` -- **Join**:投递区残留的邮件 SVG → `Mail` - -全站**已无任何 emoji**(上次 Join 福利区已改,本次清掉 Contact 两处 + Join 邮件图标)。 - -## 3. SPA fallback(生产环境深链接不 404) -新增 `public/_redirects`:`/* /index.html 200`(Netlify 及多数静态托管通用,对其它平台无害),已随构建进入 `dist/`。 - -> 若用其它托管,规则如下: -> - **nginx**:`try_files $uri $uri/ /index.html;` -> - **Vercel**:`vercel.json` → `{ "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] }` -> - **GitHub Pages**:需用 `gh-pages` + 404.html 拷贝,或 hash router - -## 验证 -- `npx tsc --noEmit` → 0 错误 -- `npm run build` → 1819 模块,新色已进入 `dist` CSS,`_redirects` 已进 `dist` -- `src/` 内 **0 emoji** -- 开发服务器在线 **http://localhost:4321**:`/` `/business` `/contact` `/join` `/en/contact` `/404` 全部 200,改动模块编译干净,lucide 依赖解析 200 - -## 仍可继续打磨(可选,未动) -- 字体层级/行高 token 化(目前散落在 class 里) -- 暗色主题目前由 `page-enter`/CSS 变量驱动,可补一套更完整的深色 token 校验 -- 赛道卡片粉彩与全局 token 仍有「深浅两档」的语义区分,若想彻底单源,可把卡片色也改从 `--track-*` 派生(需动 i18n 数据) diff --git a/overview-dark-mode-tokens.md b/overview-dark-mode-tokens.md deleted file mode 100644 index ae36e52..0000000 --- a/overview-dark-mode-tokens.md +++ /dev/null @@ -1,38 +0,0 @@ -# bashi-website — 设计系统完善 + 暗色模式落地 - -> 像素君(UI Designer)· 第二轮打磨:把"死"的暗色 token 真正激活,并补全设计系统刻度尺 + 赛道色单源。 - -## 1. 设计令牌补全(`global.css`) -- **字体刻度尺**:在 `:root` 新增模块化 token —— `--fs-xs…4xl`、`--lh-tight/snug/normal/relaxed`、`--fw-regular…bold`、`--ls-tight…widest`。设计系统从此有统一"刻度尺",组件可逐步迁移到令牌而非散值。 -- **主题感知 surface 令牌**:`--surface-card` / `--text-strong` / `--header-bg` / `--accent`,浅色下指向既有值,暗色下自动切换。 - -## 2. 暗色模式(从摆设变成真功能) -之前 `--bg-dark` / `--text-on-dark` / `--shadow-dark-*` 都定义了,却**没有 `data-theme="dark"` 覆盖块、也没有切换开关**——等于死代码。本次: -- 新增 `[data-theme="dark"]` 覆盖块:暖调近黑表面(`--bg-primary:#16110E`、`--surface-card:#1E1813`)、暖白文字(`--text-primary:#F5EFE6`、`--text-strong:#FBF6EC`)、低透明度奶油描边、暗色阴影、`color-scheme: dark`。 -- `body` 加 `background-color/color` 依赖令牌,整页随主题切换。 -- **三态主题开关**:`src/hooks/useTheme.ts`(浅 / 深 / 跟随系统,localStorage 持久化 + 系统偏好实时监听)+ Header 顶栏按钮循环切换 `Sun / Moon / Monitor`(lucide 图标)。 -- `index.html` 内联防闪烁脚本:首屏绘制前就设好 `data-theme` 与 `color-scheme`,**无 FOUC**。 - -## 3. 组件迁移到主题令牌 -- 中性/深色底上的 `text-[var(--brand-black)]` → `text-[var(--text-strong)]`(覆盖 Home/Business/Innovation/Join/Contact/About/Footer/Privacy/NotFound/Header 的全部标题与导航文字)。 -- `bg-white` 卡片 → `bg-[var(--surface-card)]`(Contact/Join/NotFound/Privacy)。 -- 悬停底色 `hover:bg-[var(--brand-cream-light)]` → `hover:bg-[var(--accent)]`;静态奶油色高亮块(About/Join/Innovation 序号徽章、Contact Passion 卡)→ `bg-[var(--accent)]`。 -- 英雄区/区块渐变遮罩:白底遮罩改为 `color-mix(in srgb, var(--bg-primary) NN%, transparent)`,奶油渐变改为 `var(--bg-secondary)`,均随主题淡入背景。 -- Header 吸顶与移动菜单底色 → `var(--header-bg)`。 -- **关键边界**:奶油实心按钮(Home 联系 CTA、Business CTA)保留 `text-[var(--brand-black)]`——浅奶油底配深字在两种主题都可读,若误改成浅字会在暗色下"浅字叠浅底"翻车(已修复一处该回归)。 - -## 4. 赛道色单源(`--track-*` 成为唯一来源) -- 新增 `src/lib/tracks.ts`:`TRACK_TOKEN` 把 social/career/payment/ai 映射到 `var(--track-*)`。 -- `i18n` 的 `business.tracks[]` 加 `key` 字段、**删除**原先写死的粉彩 `color` 字段(即那套双源粉彩)。Home/Business 改用 `TRACK_TOKEN[track.key]`,卡片底色(`color-mix` 深色调)与圆点 accent 现在共享同一 token,永不漂移。 - -## 5. Footer 清理 -- 残留 `📍` emoji → lucide `MapPin`;硬编码 `rgba(26,26,26,0.40)` 的标语文字 → `var(--text-muted)`(暗色下原本会不可见)。 - -## 验证 -- `npx tsc --noEmit` → 0 错误;`npm run build` → 1821 模块;`[data-theme=dark]` 块与 `#16110e` 已进入 `dist` CSS;**全站 0 emoji**;所有路由 200;改动模块编译干净;主题接线(`baskbuddy-theme`、`data-theme`)在产物 JS 中可查。 -- 说明:暗色**视觉**正确性经逐项推演确认(无 headless 浏览器截图);请点击顶栏 Sun/Moon/Monitor 按钮实际体验切换。 - -## 仍可继续打磨的方向(可选) -- 把组件里的 `text-[15px]` 等散值逐步替换成本轮新增的 `--fs-*` 刻度(目前令牌已就位,属渐进式重构)。 -- 补一套更完整的暗色对比度走查清单(针对 `.gradient-mesh` / `.text-gradient-warm` 等渐变类在暗色下的表现)。 -- 部署级:确认托管平台的 SPA fallback(已有 `public/_redirects`,nginx/Vercel 规则可补)。 diff --git a/overview-icon-color-audit.md b/overview-icon-color-audit.md deleted file mode 100644 index 02481ee..0000000 --- a/overview-icon-color-audit.md +++ /dev/null @@ -1,47 +0,0 @@ -# 色彩 & 图标审计与修复 — bashi-website - -> 角色:像素君(UI Designer)|审计依据:Impeccable + UI/UX Pro Max 设计规范 - -## 已修复(明确违规 / 无障碍硬伤) - -### 1. 图标:Emoji → 真实 SVG -- **Join.tsx 福利区** 原用 emoji `⏰🏠💪🎉📚`,违反「禁止 emoji 作图标」规范。 -- 安装 **lucide-react 1.25.0**,替换为 `Clock / Home / Dumbbell / PartyPopper / BookOpen`,置于 `#brand-cream-light` 圆角方块中,与全站图标语言一致。 - -### 2. 图标:唤醒沉睡的 `icon` 数据 -- `i18n/{zh,en}.ts` 中每个产品都带 `icon: 'heart'|'music'|…` 字段,但**从未渲染**。 -- `Business.tsx` 新增 `productIcon` 映射,给每个产品芯片渲染真实 lucide 图标 - (heart/music/sparkles/briefcase/mountain/footprints/rocket/check-circle→CircleCheck/bot/ear)。 - -### 3. 色彩:状态徽章对比度硬伤(WCAG AA 失败) -- `.status-developing` 原为 **奶油色文字 `#F5DEB3` 叠在近透明奶油底** → 白底上约 **1.3:1**,文字几乎不可见。 -- 修复:`color-mix(... cream-deep 20% + bg-primary)` 底 + `#8A6A2F` 文字(≈ **4.9:1**,通过)。 -- `.status-planned` 文字加深到 `#1D4ED8`,留足 AA 余量。 - -### 4. 色彩:暖白微调 -- `--brand-white` 由 `#FFFFFF` → `#FCFBF8`,与奶油暖调主题更协调(纯白在「温暖未来主义」里偏冷)。 - -## 验证 -- `npx tsc --noEmit` → 0 错误 -- `npm run build` → 1819 模块(lucide 已打包) -- 开发服务器 `/business`、`/join` 模块编译通过,全站页面 200 - -## 待你拍板(未改,属品牌级决策) - -### A. 赛道色存在「双套定义」不一致 -| 位置 | 社交 | 职场 | 支付 | AI | -|------|------|------|------|-----| -| 赛道卡片(Home/Business/Innovation) | `#E8A0BF` 粉 | `#7EC8E3` 青 | `#98D8AA` 薄荷 | `#C9B1FF` 薰衣草 | -| 全局强调 token `--track-*` | `#EF4444` 红 | `#2563EB` 蓝 | `#10B981` 翠 | `#8B5CF6` 紫 | - -- 卡片用的是柔和粉彩,强调 token 是 Tailwind 默认饱和色,**色相不一致**(尤其「社交」= 粉 vs 红)。 -- **建议**:统一为一套色相(例如让全局强调 token 与粉彩共享色相,仅提高饱和度用于小面积强调)。 -- 需要你确认方向后我再改——这是品牌视觉基调,不想擅自重绘。 - -### B. 手写内联 SVG -- `Header / Contact / NotFound` 用的是手写 24×24 描边 SVG,风格一致、无问题;可选统一换成 lucide 做单一图标源。 - -## 你需要告诉我的 -1. 赛道色要不要统一?统一到「粉彩色相」还是维持饱和色相? -2. 是否要把手写 SVG 也换成 lucide(单一图标源)? -3. 是否需要我补充一个 **SPA fallback** 部署配置(nginx / vercel / netlify),否则生产环境深链接 404。 diff --git a/overview.md b/overview.md deleted file mode 100644 index a1e5d16..0000000 --- a/overview.md +++ /dev/null @@ -1,25 +0,0 @@ -# bashi-website — Migrated to Pure React (Vite + React Router) - -The site was migrated from **Astro 5** to a **pure React SPA** (Vite + React Router + Tailwind v4), so every page route is now a real `.tsx` file as requested. - -## What changed -- **Removed**: all `.astro` files (`src/pages/*.astro`, `src/pages/en/*.astro`, `src/layouts/BaseLayout.astro`), `astro.config.mjs`, and `scripts/`. Zero Astro dependencies remain in `package.json`. -- **Added**: Vite + React Router toolchain, `src/main.tsx`, `src/App.tsx` (routes), `src/layout/RootLayout.tsx`, `src/hooks/useClientEffects.ts`, `src/seo/Seo.tsx`, and 8 `src/pages/*.tsx` route wrappers. -- **Reused unchanged**: `src/styles/global.css` (full BaskBuddy design system), all existing React components (`Home/About/Business/Contact/Innovation/Join/Privacy/NotFound/Header/Footer/SiteShell`), and the i18n catalogs (`zh.ts`/`en.ts`). - -## Architecture -- `zh` at `/` & `/{page}`, `en` at `/en/{page}`, unknown paths → 404. -- `RootLayout` keeps `Header`/`Footer` mounted across navigations and replays the `page-enter` animation on routed content. -- `useClientEffects(pathname)` ports the interaction logic that previously lived in Astro's `