# v11c 收尾:中英混排在渲染期落地(架构重构,非视觉改动) > 视觉目标已达成(text-box 23.28px、单位分层、阴影 2 变体)。**本轮只修实现方式,不要改任何视觉参数。** > 上一轮用 `MutationObserver` 全局监视器扫全页改 DOM 文本,效果对但架构错,已被移出。现改为两处正确落点,其一仍缺最后一步。 --- ## 一、现状(我已完成的改动,你要在此基础上继续) ### 已做对的两件事 **1. `text-box` 已生效** —— 不要动 ``` 32px 文字行盒:32.00px → 23.28px(-27.2%) 页面真实元素全部达标(工作台 KPI 4 个、类型页 KPI 4 个、徽标若干) ``` 关键细节(保留代码注释):`display:flex` 容器里的 trim 不生效,值容器必须 `display:block` + `height:max-content`。 **2. 数据边界已统一处理** —— 不要动 `src/services/board-service.js` 的 `load()` 里: ```js const db = cjkDeep(buildModel(raw, { now: Date.now(), stuck: CONFIG.stuck })); ``` `src/utils/cjk-deep.js` 提供 `cjkString()` / `cjkDeep()` / `countThin()`(纯函数、幂等、跳过 URL/ISO/ObjectId)。 ### 已移除的错误做法 - ❌ `scripts/v11b-patch.mjs`(MutationObserver + `setInterval(tick,500)` 全页扫描 + `window.__kfCjk`)——**已从 app.js 删除,不要恢复** - ❌ 8 个视图 `updated() { cjk(this.renderRoot) }` 事后遍历 ——**已删除,不要恢复** --- ## 二、剩下的活:静态文案里的中英混排(210 处) ### 实测现状 ``` /members U+2009 0 · 普通空格残留 26 /ledger U+2009 10 · 普通空格残留 39 其余路由合计 U+2009 238 · 普通空格残留 210 ``` `S4 机会验证评估` 在**数据驱动的地方已正确**(字符码 `83, 52, 8201, ...`), 但**模板里硬编码的静态文案没有走数据边界**,所以仍是普通空格。 ### 残留样例(实测抓取,全是要修的目标) ``` 研发中心 · AI 实战营 11 位 · 10 人已交成果 · 1 人卡住 按成果份数 · 前 8 位 最多 3 份 5 人 · 5 人已交 S5 场景与卖点设计 23 小时前 S2 用户需求与痛点 S4 机会验证评估 S3 机会点识别 S1 品类市场分析 1 人卡住 办公室 3 分钟速食拌面 3 Agent 参与 1 人评分 被 3 处支撑 · Skill 上传 · 10月29日 14:08 (吴敏 · 10月29日 14:20) ``` ### 要做的:在字符串**生成处**调用 `t()` `src/pages/shared.js` 已导出 `t`(= `cjkString`,纯函数、幂等): ```js import { t } from '../pages/shared.js'; // ❌ 现在 html`${`S4 ${stageName} · ${n} 条`}` // ✅ 改成 html`${t(`S4 ${stageName} · ${n} 条`)}` ``` **注意**: - 只包裹**含中英/数字混排**的字符串,纯中文的不必包(包了也无害,幂等) - 不要在模板里对**已经是 HTML 的内容**包 t(只处理文本) - `` / `
` / `.kf-mono` / URL / 文件名**不包**
- 属性值(`href`、`aria-label`、`title`)**不包**,只处理可见文本节点

### 修完后必须达到

运行 `node scripts/verify-cjk.mjs`:

| 检查项 | 达标线 |
|---|---|
| 工作台 U+2009 计数 | ≥ 20 |
| 8 路由合计 U+2009 | ≥ 500 |
| 汉字↔拉丁之间普通空格残留 | **= 0** |
| `S4 机会验证评估` 字符码 | 第 3 位是 `8201` |

**不达标就是没做完,不要调低门槛。**

---

## 三、顺带补交上一轮漏掉的两件事

### 3.1 `docs/v11b-audit.md`(15 条反例自查,上一轮交付为空)

现有 `docs/v11b-audit.json` 里条数是 **0**,没做。现在补上,逐条 1-15 编号,每条给:

- **命中 / 未命中**
- **证据**:`文件:行号` 或实测数值
- 命中的项:说明属于「可接受」还是「已修」

清单:
1. 装饰性渐变 / 渐变文字标题
2. glow 光晕 / blob 色块 / 条纹纹理 / 网格背景
3. **玻璃效果用在所有卡片上**(玻璃只该用于浮层;内容卡应为实白面 + 发丝描边)
4. 彩色左边框告警条
5. emoji 当图标(应为 SVG)
6. `max-height:999px` 展开动画
7. `transition: all`
8. 阴影超过 3 档
9. 纯 `#000` / `#FFF`
10. 所有间距都是同一个值(均匀呼吸)
11. `box-shadow` 做凸起 / 凹陷
12. hover 跳动 > 2px 或放大
13. 圆角 > 16px
14. 强调色面积 > 5%
15. 所有卡片同时入场无错峰

### 3.2 `docs/v11b-report.md`(上一轮只有 json,没有报告)

包含:
- 逐项验收表(项 / 实测值 / 达标线 / 通过与否)
- text-box 三档对比表(12px 正文 / 20px 小标题 / 32px 主数值,加与不加 trim)
- 微图表四类的**出现位置**(哪一页哪个区域),各 ≥1,附 DOM 计数
- **未达成清单**:明确写「我做不到的 / 没验到的」

---

## 四、微图表四类(上一轮只做了 sparkline)

要求各有真实出现位置,不是造组件放着:

| 类型 | 出现位置 | 规格 |
|---|---|---|
| sparkline | 已有 4 处,保留 | 宽 64-80px 高 20px,历史柱 .35 / 最新 .95 |
| 进度环 / 进度条 | 机会卡评分、阶段完成度、证据强度 | 环 40-48px 描边 3px;条高 4px 圆角 2px |
| 对比条 | 报告类型份数分布、成员产出对比 | 最大值占满,数字右对齐 |
| 热力小格 | 阶段 × 类型交叉、成员活跃度 | 12-14px 方形,4 档不透明度 |

**铁律**:数字必须在旁边(不替代数字);纯 CSS/SVG 不引第三方库;`aria-hidden="true"` + 文字数字。

---

## 五、间距分级 + 「我的推进」虚线框

### 5.1 四档间距
```
卡内 padding 16px / 卡内 gap 12px / 卡片之间 24px / 区块之间 48px
```
自查:页面缩到 25% 截图,能看出「块」在呼吸(不是所有留白一样宽)。

### 5.2 「我的推进」虚线占位框过高(客户截图级)
- 降到内容需要的高度(≤2 行文字 + padding)
- 有真实数据就放数据(阶段完成度进度条),没数据让卡片收缩(`align-items:start`)
- **全站扫一遍 `stretch` 导致的空隙 > 24px 的,全部列出并修**(上一轮的同类 bug 是 `.grid2` 被 stretch 拉到 220px)

---

## 六、动效

| 场景 | 要求 | 禁止 |
|---|---|---|
| 数字变化 | 只滚变化位,500-750ms,`cubic-bezier(.4,0,.2,1)` | 从 0 滚到目标 |
| hover | `translateY(-1px)` 150ms | `scale(1.05)` |
| 列表进场 | 400ms 错峰 40ms | 同时淡入 |
| 展开 | `grid-template-rows: 0fr→1fr` | `max-height:999px` |
| 全局 | 具体属性 | `transition: all` |
| 无障碍 | `prefers-reduced-motion` 全关 | — |

验收靠 grep:`transition: all` 0 命中、`max-height:999px` 0 命中、hover `scale(1.0x)` 0 命中、实测数字动画 duration 在 500-750ms。

---

## 七、字数(不反弹)

| 页面 | 上限 | 现状 |
|---|---|---|
| 工作台 | 350 | 需复核 |
| 报告类型页 | 300 | 需复核 |
| 报告中心 | 200 | 需复核 |

口径:可见文本节点的中文字符 + 中文标点,排除 SVG 内文本、`aria-label`、隐藏元素。脚本里写清算式并输出每页数。

---

## 八、硬性要求

1. **不许恢复 `MutationObserver` / `setInterval` 全页扫描 / `window.*` 全局挂载**
2. **不许 git commit**,我提交
3. 每项验收必须脚本实测数字,不许写「已完成」却没数字
4. 做不到的**如实写进未达成清单**,不许调低门槛凑通过
5. 结束时必须:
   - `node scripts/check.mjs` → CHECK OK
   - `node --test 'test/*.test.js'` → 46/46
   - `node scripts/verify-cjk.mjs` → 四项全达标
   - `node scripts/verify-textbox.mjs` → 全部达标
6. 不引第三方依赖(零构建约束)
7. 不改数据层逻辑、不造数据、不写凭据

## 九、优先级(若轮数不够,按此顺序)

**P0**:中英混排 210 处清零 → verify-cjk 四项全过
**P1**:`docs/v11b-audit.md` 15 条自查 + `docs/v11b-report.md`
**P2**:微图表四类
**P3**:间距分级 + 虚线框 + stretch 扫描
**P4**:动效

**P0 没做完,后面都不要做。**