fix(web): 无用户行钉顶、闲置不上留白,并修会话列表 tsc 两错
Independent Staging Quality Gate / validate (push) Failing after 6m27s
Independent Staging Quality Gate / publish (push) Skipped

This commit is contained in:
jesse-ux
2026-09-17 22:25:53 +08:00
parent b5e16b96f4
commit cc1a89802e
8 changed files with 135 additions and 16 deletions
+34 -2
View File
@@ -12143,8 +12143,40 @@
- 触发条件:主会话或生时校正发出一轮,模型输出超过一屏。
- 根因:跟随语义是「贴底」。`anchored` 初值为真,`ResizeObserver` 在内容变高时把 `scrollTop` 设到 `scrollHeight``send()` 还会 `anchorToLatest()`。对短回答两者等价,对长回答则把开头推出视口。
- 修复:同一 hook 改为新一轮把本轮开头(用户行,或没有用户行时的新助手行)钉在滚动容器顶部,流式期间不再跟随。回答长出视口时用已有的「跳到最新」贴底并恢复跟随。末尾动态留白让短回答也能把开头留在顶部。切换会话仍先落底。取代 BUG-041 / BUG-048 的贴底语义。
- 验证:`chat-notice-and-scroll-contract.test.ts` 源码合同与行为测试;校正面 `pinLatestTurn` 三处源码断言。
- 验证:`chat-notice-and-scroll-contract.test.ts` 源码合同与行为测试;校正面 `pinLatestTurn` 三处源码断言。验收方用 Chrome 真实布局骨架页跑过 S1–S4(长历史发问钉顶、短历史留白、先上滑再发问、切会话落底)。S5/S6 见 BUG-931 / BUG-932。
- 防复发:跟随只经 `useConversationScrollAnchor`,跳到最新只经 `JumpToLatestButton``send()` 必须调 `pinLatestTurn`;校正面新轮只在提交文字、点选项、开场/无用户行助手到达时各 pin 一次。
- 相关记录:BUG-478、BUG-041、BUG-048
- 相关记录:BUG-478、BUG-041、BUG-048、BUG-931、BUG-932
- 复发自:无
- 修复版本:待发布
## BUG-931 | 无用户行的一轮钉不住,随后退回贴底跟随
- 状态:resolved
- 首次发现:2026-09-17
- 最近更新:2026-09-17
- 影响面:`useConversationScrollAnchor` `applyTurnSpacer` / `pinLatestTurn`;生时校正点选项、开场、自动续轮
- 用户现象:点选项或开场后新助手行不在顶部;流式一开始视口又钉到最后一个字。
- 触发条件:本轮没有 `.message-user``pinLatestTurn()` 钉的是最后一条 `.message-assistant`
- 根因:最后一条助手行同时是 turn head 和留白承载。`applyTurnSpacer``head.offsetHeight``--latest-turn-head-height`,量到的是「内容 + 上一帧留白」,公式自指后 `min-height` 坍成 0`scrollTo` 被夹住。随后 `distance ≤ 96` 解除 `holdUnpin``anchored` 翻回真。
- 修复:head 与 `lastTurnTail` 是同一元素时 `--latest-turn-head-height``0px`,该行 `min-height` 等于整个视口。选这一路而不是先 `clearTurnSpacer` 再量,是因为清变量后仍要等一次布局,`offsetHeight` 在同一帧里不可靠。
- 验证:`chat-notice-and-scroll-contract.test.ts`「a turn with no user row…」。
- 防复发:无用户行时 spacer 头高必须是 0;pin 后增高不得把 `anchored` 翻回真。
- 相关记录:BUG-930
- 复发自:无
- 修复版本:待发布
## BUG-932 | 闲置会话上滑后子元素尺寸变化被写留白
- 状态:resolved
- 首次发现:2026-09-17
- 最近更新:2026-09-17
- 影响面:`useConversationScrollAnchor` `follow()` 非贴底分支
- 用户现象:在旧会话里上滑阅读时,窗口变宽、图片加载或思考块折叠会把最后一条助手行撑出一段空白,「跳到最新」也可能被顶出来。
- 触发条件:`anchored = false` 且本轮没有 `pinLatestTurn`,滚动容器子元素高度变化。
- 根因:`follow()` 在未贴底时无条件 `applyTurnSpacer`,把闲置上滑和「本轮已钉住」当成同一件事。
- 修复:只在 `pinnedHeadRef.current` 非空时写留白。`anchorToLatest()``resetKey` 变化时清 ref 和 CSS 变量。
- 验证:`chat-notice-and-scroll-contract.test.ts`「idle history does not write a spacer…」。
- 防复发:未 pin 的上滑不得写 `--conversation-viewport``latestBelowFold` 仍按尾部超出 96px 判定。
- 相关记录:BUG-930
- 复发自:无
- 修复版本:待发布