fix(web): 无用户行钉顶、闲置不上留白,并修会话列表 tsc 两错
This commit is contained in:
+34
-2
@@ -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
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
Reference in New Issue
Block a user