主题
正文即界面:交互重设计(2026-08-17)
P1(单栏主场 + 段落气泡 + 目录抽屉 + 章首状态卡 + 章尾下一章卡)已于 2026-08-17 实施。 P2(AI 窄栏 AiDock:随便聊/这章整体不满意双通道 + ③④档意见清单 + 整章优化对照卡; ReviseCard/PolishPanel/ReviseChat 退场)已于同日实施。 P3(②档多处批注改:AnnotatedReviseCard 逐条字符级 diff 接受/拒绝,paraEdit 段号+快照守卫写回; 选段/整章统一走 charDiff/DiffText 验收)已于同日实施。 P4(移动端壳收尾 + 章首交稿单 + 书房入口:ChapterStatusCard 升级为一句话自检交稿单—— 校对快照 + 一致性冲突计数,要修的一键带进 diff 验收流;移动端全屏正文 + 顶栏目录/任务中心、 废除 FAB/动作扇;书房经全书区页签进入;features/README 文档更新,官网截图待手动刷新) 已于同日实施。
本文档取代 docs/07 的 write 区设计(StageBar/动作条/动作卡族/参考抽屉那一套), setup 开书向导、book 全书区、settings 的功能保持不变,只改出场方式。 方向来源:用户是「AI 生成,我审改」的主编式创作者;上一版失败在——七个动词、 状态机词汇、卡片堆叠、正文被动。本轮换一个交互隐喻:书本身就是 app。
0. 设计纲领
- 正文即界面:打开 app 就是这本书的正文。阅读即审改,选中一段即可操作, 没有"工作台"和"功能页面"之分。
- 对话即遥控器:AI 是住在正文边上的合著者。一条可收起的对话窄栏常驻, 它永远知道你在看哪章、选中了哪段——你说人话,它干活。
- 修改按四级梯度,永远先花最少的 token:
档位 场景 手段 ① 选段定点改 某几句/段不行 选中 → 说一句 → 只改这段 ② 多处批注改 问题分散在好几处,都是局部 边读边批注 → 一次性定点改 ③ 整章优化 情节对,文风/节奏/结构整体不行 对话梳理意见清单 → 锁情节整章重润 ④ 整章重生成 情节本身不对 对话梳理意见清单 → 推倒重跑 - 默认落在最低档;升档永远由用户确认,不由 AI 自行扩大。
- ③④档动手前,AI 必须先输出修改意见清单(什么问题/涉及哪里/怎么改/ 建议哪档),用户可增删改,确认后才执行——token 花在刀刃上,动手前永远 知道它要干嘛。
- ③档强制锁情节(沿用现有润色事实校验);情节要动必须走④档。
- 验收即 diff:AI 改完不直接覆盖。选段改→段内 inline diff 逐条接受/拒绝; 整章改→变动段落高亮+段内 diff,可整收可回退。旧版永远留快照(已有)。
- 说人话:界面不出现 quarantined/放行/门禁/pending_review。章状态只有三种 用户语言:「在写」「写好了,等你过目」「有问题,等你拍板」(外加修饰徽标 「大纲已变」)。
chapterStage.ts的六阶段推断保留为内部实现,对外映射到三态。 - 功能一个不少:圣经/伏笔/级联更新/版本/连写/投稿导出全部保留,换出场方式。
1. 信息架构
/project/:id/setup 开书向导(现状保留)
/project/:id/write 主场=正文(本文档全部焦点)?ch=N
/project/:id/book 书房=全书管理层(看板/人物/圣经/伏笔/投稿/体检/翻新,现状保留)
/project/:id/settings 书级设置(现状保留)
/project/:id/read 只读对照窗(现状保留)- 主场没有左栏章节轨。目录是可唤出的抽屉(点章题/Ctrl+K/移动端顶栏), 含搜索与状态点;连写入口收进目录底部(「让 AI 连续写 N 章」)。
- 书房是第二层级,从主场顶栏一个入口进入;它不参与日常审改循环, 沿用现有 book 区组件,本轮不重做。
- URL 只保留
?ch=N;act=/ctx=两个参数族随动作卡与参考抽屉一起废除。
2. 主场布局(桌面)
┌────────────────────────────────────────────────────┐
│ 顶栏:← 书名 · 第 N 章《标题》(点=目录) 状态一句話 ⚙︎ ▶│
├──────────────────────────────────────────┬─────────┤
│ │ AI 窄栏 │
│ 正 文(居中,~760px) │ (可收成 │
│ │ 细条) │
│ [章首] 交稿单(仅生成后/有问题时出现) │ │
│ [章首] 本章蓝图(默认收起一行) │ 对话流 │
│ │ │
│ 正文段落……(点选段落→气泡) │ │
│ │ ┌─────┐ │
│ │ │输入框│ │
│ [章尾] 下一章卡:「第 N+1 章 — 让 AI 写」 │ └─────┘ │
└──────────────────────────────────────────┴─────────┘- 单栏正文是视觉重心,不再有永久三栏。无底部动作条、无 StageBar。
- 章首两张轻卡:交稿单(见 §5)、本章蓝图(一行可展开)。两者都可永久收掉, 收了不再主动出现。
- 章尾下一章卡:唯一常驻的"推进"入口。章写完了显示「让 AI 写下一章」; 全部写完显示「写完了,去书房导出/投稿」。
- AI 窄栏(右侧,默认 320px,可收成 40px 细条):唯一的对话入口,身兼三职—— ①档的"说一句就改"、③④档的意见梳理、随便问("这章沈眠的动机站得住吗")。 收窄条时新消息来了有圆点提示。
- 快捷键与 Ctrl+K 命令面板保留(动作改为新体系下的等价物:生成下一章/ 打开目录/AI 栏聚焦/验收通过)。
3. 正文交互:段落气泡(①档与手改)
把现有全屏 Reader 的选段三件套(Reader.tsx 点选段落→para-tools 气泡) 上移为主场正文的默认能力:
- 点选段落(桌面点击/移动端轻点)→ 段落左侧出现气泡:
- 💬 改这段:气泡内小输入框,说一句("对话太端着"/"扩写打戏")→ 走选段对话端点(
chapters/{n}/discuss,可返回 suggestion)或polish-fragment→ 段落就地变成 diff 卡(见 §6),接受/拒绝/再改。 - ✍️ 手改:该段就地变为自适应高度编辑框(不再是整章 textarea 切换), 保存走
nthParaSpan定位 +PUT content整章写回(现有链路),带原文 比对守卫防串段。
- 💬 改这段:气泡内小输入框,说一句("对话太端着"/"扩写打戏")→ 走选段对话端点(
- 划词(任意文本区间)选择:本轮不做,选择粒度=整段。中文段落短, 整段粒度已覆盖绝大多数"这段不行"的场景;留作后续增强。
4. 多处批注改(②档)
- 阅读中对某段点「批注」(气泡第三项/段落长按菜单),挂一句话; 批注以段落左侧标记呈现,同时汇聚到 AI 窄栏的「待处理批注」列表。
- 批注数据 =
{paraIdx, 原文快照, 意见};正文若已变动,用快照比对判定失效 (复用nthParaSpan守卫思想),失效批注标灰提示重新指认。 - 批注攒够后点「按批注改」→ 新端点
POST /chapters/{n}/revise-annotated-async(job):把批注清单+蓝图+上下文发给 LLM,只改写被指认的段落,返回逐段 旧/新对 → 前端逐段 diff 验收(逐条接受/拒绝),接受的段落一次性PUT content写回并留快照。 - 此端点是本设计唯一需要新增的后端能力;①③④档端点全部现成 (polish-fragment / polish chapter 锁情节 / generate-async revision)。
4·五、跨章标记 + 全书批修(2026-09 增补,治「批注跨不了章」)
- 原版批注是内存状态,切章/刷新即丢;现批注落库(
chapter_marks表, 身份仍是para_idx + 原文快照),边读边攒、跨章不丢,失效判定不变。 - 全书批修:攒下的标记跨章生效——AI 窄栏写一句总描述(如「所有铁锈玫瑰 的描写全部换成全新意象」)→
POST /marks/revise-async(job):逐标记复用 polish_fragment(总描述叠加该标记自己的意见),只产出待验收替换对、不落库; 结果按章分组出验收卡(复用 AnnotatedReviseCard),逐条 diff 验收、接受走 paraEdit 快照守卫写回并销账对应标记;快照失配的标记自动跳过并计入 stale。 与按批注改的关系:后者仍是「当场、单章」的快捷路径,前者是「攒着、跨章」的批量路径。
5. 章首交稿单(AI 自检)
- 生成/重生成完成后,章首出现一张轻卡,一句话结论开头: 「第 12 章写好了——校对 2 处小错,AI 味正常,和设定没冲突。」
- 数据全部来自现有信号,不新增自动 job:生成时自动校对的快照 (GET
/proofread)、一致性门禁结果(quarantined)、AI 味分数。 可展开看明细;「按建议修复」把校对问题带进 diff 验收流。 - 门禁拦下(quarantined)时不说"放行",说:「这章有 N 处和设定冲突, 等你拍板」→ 展开看问题 → 每条「按建议改」(现有 apply-revision)或 「就这样吧」(现有 gate-release,确认制保留)。
- 评分(主审四维)保持手动,入口在 AI 栏(「给这章打个分」)与交稿单 展开区;不打分不挡路。
6. 验收与 diff
- 新增轻量 diff:不引第三方库,手写字符级 LCS diff(中文按字切粒度合适, 3000 字一章性能无压力)。视觉沿用校对卡的
.diff-old/.diff-new(删除线红/绿字)基调。 - 段内 diff 卡:①②档的验收单元——该段原地显示删增高亮, 按钮=接受/拒绝/「再改改」(带原意见回到对话)。
- 整章验收(③④档):默认显示新版正文,变动段落左侧带标记; 点「看改动」切换为 diff 模式(逐段删增);「整收」「回退到旧版」 (现有 versions 快照)兜底。
- 任何接受/写回都走现有快照机制,错了永远能回。
7. 移动端
移动端不是桌面的压缩,是这套交互的天然形态:
- 全屏正文,顶栏只有:←、章题(点=目录抽屉)、状态点。
- 底部一条输入条(不是动作栏):「和 AI 说点什么…」——点开=AI 对话 全屏 sheet;有选中段落时输入条自动带上「第 N 段」引用。
- 段落轻点选中出气泡(改这段/批注/手改),手势与桌面一致。
- diff 卡、交稿单、目录、书房全部为全屏 sheet(复用现有 m-sheet 族)。
- FAB、底部四键栏、动作扇全部废除;左右滑切章保留。
- 任务中心入口留在顶栏(生成是长任务,需要看得见)。
8. 组件迁移映射(什么死、什么活)
| 现有 | 去向 |
|---|---|
| StageBar / chapterStage | 死(外壳);deriveStage 纯函数保留,改输出三态人话 |
| 底部动作条 / FAB / 动作扇 | 死 |
| 动作卡族(act=revise/polish/proofread/review) | 死;能力分别由①③档、交稿单、AI 栏吸收 |
| ChapterRail 章节轨 | 改名目录抽屉,删行内操作(生成/重写框),保留搜索/状态点/连写入口 |
| RefDrawer 参考抽屉 | 拆:蓝图→章首卡;审核/版本→交稿单+diff 模式;人物/伏笔/圣经→书房(现状已有) |
| ReviseChat 重写研讨 | 升级为常驻 AI 窄栏,不再绑死"重写"一个目的 |
| Reader 选段三件套 | 上移为主场正文默认能力;全屏 Reader 保留为纯阅读+对照窗 |
| PolishPanel / ProofreadCard / ReviewCard | 死(外壳);端点与逻辑被①③档/交稿单复用 |
| VersionCompare 左右对照 | 保留为「版本」查看,增补 diff 模式 |
| WritePanel(1121 行状态中枢) | 拆:主场页壳 / 正文交互 / AI 栏 / 批注与验收 四个模块 |
9. 技术要点与风险
- 段落寻址:
splitParas+nthParaSpan现成;段落身份=下标+原文快照守卫, 不引入新 id 体系(多处批注并存靠快照比对兜底失效)。 - diff:手写字符级 LCS,无新依赖。
- 对话:接受现状非流式(全量 messages POST + spinner);窄栏输入框本地 乐观追加。流式留作后续。
- 新端点只有一个:
revise-annotated-async(②档批量定点改),job 模式, 复用 pollJob/useJob 基建。 - 风险:① 段内 diff 的字符级算法需测试覆盖(纯函数,好测); ② AI 窄栏上下文组装(当前章+选中段+批注)的 prompt 设计需后端配合, 第一版先用现有 discuss/revise-discuss 端点的注入逻辑,不重写后端 prompt; ③ WritePanel 拆分是本轮最大工程量,拆分时状态下沉到各模块,URL 仍是 ch 的唯一来源。
- 暗色主题:全部新样式只用现有 CSS 令牌,
[data-theme="dark"]已整组 覆写,新增组件不得引入硬编码颜色。
10. 分期
- P1 正文活起来:单栏布局+目录抽屉+段落气泡(①档+手改)+章尾下一章卡; StageBar/动作条/动作卡/RefDrawer 退场。
- P2 AI 窄栏:常驻对话栏(①档入口+自由问答),③④档意见清单卡 (梳理→档位建议→确认→执行)。
- P3 ②档批注+统一 diff 验收:新端点、批注流、段内/整章 diff 模式。
- P4 移动端壳+交稿单+书房入口收尾,文档(features/README/官网截图)更新。
每期门禁不变:npx tsc -b、npx eslint <改动文件>、npx vitest run 全绿。