# CHANGELOG — 项目变更日志
> 记录每次请求/变更,**倒序排列(最新在上)**。
> 与 `docs/PROJECT_STATE.md` 配合使用:本文件回答「改了什么」,状态文档回答「现在是什么样」。
---
## 2026-09-14 第六批:视觉重设计 + 中英日韩四语言 + 昼夜主题 + 服务端接口对接
> 依据 `design-taste-frontend` 技能(BRIEF INFERENCE / 单一强调色 / 形状一致性 / 反 AI-slop 清单)重建全站视觉体系,
> 并一次性补齐多语言、主题切换与 5 个已上线服务端接口的对接。构建通过(`vue-tsc --noEmit` + `vite build`,33.88s)。
### 🎨 视觉体系重建(令牌 → TDesign 桥接,60+ 页面自动生效)
- 新增 `src/assets/styles/tokens.scss`:全站唯一视觉真相源。冷调石板灰中性色阶 + **青玉 Jade 单一强调色**
(浅色 `#0c7c59` 对比 5.19:1 / 深色 `#3fc79b` 对比 8.85:1,均过 WCAG AA);统一圆角规范
(xs4/sm6/md8/lg10/xl14/2xl20/pill999)、8px 间距节奏、字号阶梯、z-index 分层规范、动效曲线与时长;
按语言切换的字体栈(`html[lang^='zh'|'ja'|'ko'|'en']`,注意必须前缀匹配,`lang` 写的是完整标签)。
- 新增 `src/assets/styles/tdesign-theme.scss`:把 `--tk-*` 映射到 `--td-*`,重定义品牌色阶、语义色阶、
**完整冷调灰阶**(`--td-gray-color-1..14`,浅深共用)、圆角、阴影、滚动条。**收益:60+ 未改动的工具页
零成本继承新配色与圆角**,这是本次能低风险铺开全站的关键。
- 重写 `index.scss`:每页只过渡颜色(不碰 transform/布局)、统一 `:focus-visible` 焦点环、
`.skip-to-content`、滚动条 `background-clip: content-box`、标题字重 650 + `letter-spacing:-0.02em`、
`prefers-reduced-motion` 降级。
- 新增 `src/directives/reveal.ts`:`v-reveal` 滚动进入动效(全局单例 IntersectionObserver,传数字做错峰)。
- `unocss.config.ts` shortcuts 全部改为令牌驱动,`panel` 补上内边距(此前 ApiStatus/RandomString/Hash 等
新建页出现内容贴边)——注意页面 scoped 样式(`.block[data-v-*]`)权重高于该快捷类。
### 🧭 布局外壳重构
- `MainLayout.vue` 完全重写:毛玻璃 sticky 顶栏(`backdrop-filter: blur(14px) saturate(180%)`)+ 三区布局,
品牌区改用 TDesign `AppIcon` 而非手绘 SVG,全站**唯一**一处渐变(青玉 → `#2fb98d`)。
- 新增 `CommandPalette.vue` 命令面板(⌘K / Ctrl+K,按 UA 显示对应提示):Teleport 到 body、
扁平结果列表 + 分类标签、↑↓/Enter/Esc 键盘导航、鼠标 hover 同步高亮、打开时锁 body 滚动。
- `SideNav.vue` 重写:内联筛选框、可折叠分组(`tool-nav-collapsed` 持久化)、活动态青玉底纹 + 左侧 2px
指示条、`nav-dot` 标记需联网工具。
- 新增 `LocaleSwitch.vue`(显示 `ZH/EN/JA/KO` **而非国旗**,避免语言与国家绑定歧义)、
`ThemeSwitch.vue`(三态,图标显示实际生效的 `mode`、菜单勾选用户偏好 `preference`)。
### 🌏 多语言(中/英/日/韩)
- 引入 vue-i18n 11.4.10(`legacy: false` + `globalInjection: true`),基线语言 zh-CN。
- 新增 `src/i18n/index.ts`(`SUPPORTED_LOCALES` / `normalizeLocale()` / `resolveInitialLocale()` /
`applyLocaleToDocument()` / `setAppLocale()`)、`src/i18n/helpers.ts`(`toolName/toolDesc/categoryLabel/tOr`
等**带中文兜底**的取词助手)、`src/stores/locale.ts`。
- 四份完整语言包 `src/i18n/locales/{zh-CN,en-US,ja-JP,ko-KR}.ts`:app / nav / palette / theme / locale /
home / category / **tool(58 个工具名与描述全译)** / page / pending / common。
- 新增 `src/components/common/BackendPending.vue`:用中性信息态(非 `t-alert` 错误色)如实说明
「前端已就绪、后端接口尚未上线」,**不伪装成可用**。
- `index.html` 重写防闪烁内联脚本(同步执行,解析主题 `auto` + 语言归一化),与 theme store、i18n index
**三处逻辑必须同步**;`theme-mode` 属性 + 明暗两套 `theme-color` meta。
### 🔌 服务端接口对接(service.xpcool.com `/api/service/open/tools/*`)
- 新增 `src/api/openTools.ts`:接口元数据(`OPEN_TOOL_ENDPOINTS`,供「接口状态」页探测)与调用函数
共用同一份路径定义,避免改路径忘了改探测列表。5 个接口实测线上 **全部 HTTP 200**。
- `src/api/client.ts` 重写:`BASE_URL` 回落到 `https://service.xpcool.com`(**不建 .env 也能用**);
新增 AbortController 超时(10s)、`describeStatus()` 状态码中文翻译(404 → 「接口尚未上线」)、
区分超时与网络不可达。
- 改造 6 个页面接入真实后端(均为「本机 / 服务端」双模式,**默认本机、不自动打网络请求**):
- `ip-info`:服务端识别的来源 IP + 内网判定,另附本机环境(时区/语言/平台/屏幕/UA)。
**后端不返回归属地,界面如实说明,不做前端猜测。**
- `uuid`:本机 RFC 4122 v4 / 服务端 GoFrame guid,服务端模式并发 n 次(接口一次只返一个)。
- `random-string`(新工具):本机 Web Crypto(已注明取模偏置量级约 2^-26)/ 服务端 `crypto/rand`,
长度 1-128,服务端模式数量上限压到 10。
- `api-status`(新工具):**串行**探测 5 个接口(并发会干扰延迟读数),
`performance.now()` 计时、500ms 封顶刻度条、状态点承载真实语义、窄屏表格转卡片。
- `hash`:新增「同时用服务端计算 MD5」开关(默认关闭——算哈希是高频纯本地动作,
不该每次点击都多一次网络往返),做**两端口径对比**,比对统一折小写。
- `timestamp`:新增服务端时钟卡片,偏移量基于 Unix 秒(**与时区无关**)并补偿半个往返耗时,
误差上界 `rtt/2`;偏差 > 2s 提示本机时钟可能不准。
- 未实现接口的工具页(exchange-rate / express-query / phone-locate / network-test / speed-test)
统一改用 ``,去掉「后端未就绪就禁用按钮」的旧逻辑。
### 🧹 修复
- **空分类渲染缺陷**:health / study / travel 三个分类无任何工具,却仍渲染出空区块与空标题。
现分类精简为 6 个(work / dev / design / life / fun / online),`groupedTools()` 过滤空分组。
- `SideNav.vue` 在 `