fix(web): 进度 dock 展开遮挡最新内容——task_progress 后补触底(bump 0.38.1)

#task-progress-dock 是 #chat-stream 上方的 flex 兄弟(flex-shrink:0),dock 一涨高就
从顶部挤掉 chat-stream 的可视高度,scrollTop 据置不变 → 原本贴底的最新内容被推到视口
折线以下看不见。直播态 task_progress 事件重渲 dock(=涨高)后早 return,跳过了末尾的
贴底兜底,故底部不自动回滚。修:在 task_progress 分支重渲 dock 后补一句
if (nearBottom) stream.scrollTop = stream.scrollHeight(与其余事件分支同款)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-07-03 13:59:34 +08:00
parent 346930449a
commit dc721ba8a3
3 changed files with 9 additions and 2 deletions

View File

@ -2,7 +2,7 @@
> 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9` > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`
最后更新:2026-07-03(seedream size 面积钳制:修 1920x1080 被 ARK 400 打回,bump 0.37.1) 最后更新:2026-07-03(web 进度 dock 展开遮挡最新内容:贴底时补触底,bump 0.38.1)
--- ---
@ -21,6 +21,9 @@
## 已完成关键能力 ## 已完成关键能力
### 2026-07-03 / web 进度 dock 展开遮挡最新内容(贴底时补触底,bump 0.38.1)
用户报:对话「拉到底部但仍有内容被遮挡看不到」。根因:`#task-progress-dock` 是 `#chat-stream` 上方的 flex 兄弟(`flex-shrink:0`),dock 一展开/长高,`chat-stream` 可视高度就被从顶部挤掉那么多——`scrollTop` 据置不变,原本贴底的内容被推到视口折线以下看不见。而 `chat.js` 直播态 `task_progress` 事件在重渲 dock(=长高)后**早 return,跳过了末尾第 1684 行的贴底兜底**,所以底部不会自动回滚。修:在 `task_progress` 分支 `setTaskProgress` 后补一句 `if (nearBottom) stream.scrollTop = stream.scrollHeight`(与其余事件分支同款贴底逻辑),dock 涨高时把最新内容重新钉到底。只动 `web/static/js/chat.js` 直播路径一处,历史渲染/其他事件不受影响。
### 2026-07-03 / ppt 反纯文字页+图表落地硬门(7aa49195 二代陶瓷 deck 复盘,bump 0.38.0) ### 2026-07-03 / ppt 反纯文字页+图表落地硬门(7aa49195 二代陶瓷 deck 复盘,bump 0.38.0)
0.37 网格锁上线后同题重做(task 7aa49195),对齐/标题/节奏大幅好转,但用户复评两点成立:①**两栏裸文字页 ×4**(S8/S9/S16/S21 同为"图标小标题+下划线+文字堆 ×2 栏"零图形)——该形态无卡片、仅 2 图标,0.37 的 icon-grid/card-grid 指纹完全看不见,单调门盲区;②**全本零数据图表**(素材全是数字:100万→500万条/能耗降10-20%/碳排26%),"历程"类内容也退化成文字列表。另有两硬缺陷:S18 第 5 条描述被页脚裁掉(内容超出内容区)、S19 红色大字直接叠压灰色说明文字。修:**A 指纹加 text-columns 原型**(0 卡片+≤3 图标+≤2 图形基元+左对齐文本聚 ≥2 列)堵盲区,4 页同指纹→error;**B spec 指派图表落空检测**——spec_lock page_charts 指派了图表但该页 <3 图形基元且 <4 卡片error("图表被退化成文字"), executor 硬规则"不许把指派图表降级为文字/大字 KPI";**C CJK 叠压升级 error** run 70% CJK(表意字宽 1.0em 估宽近精确)且互叠 50%error(其余情形保持 warning+渲图过目);**D layout_grid 加可选 content_bottom**非页脚文本 baseline 越过它error(S18 ),executor "写页前垂直空间预算"纪律;**E 策略层数据图表下限**素材含 3 组可比数值全本至少 1-2 页真数据图表,零图表需在 spec 写理由;两栏裸文字列表计入"原型 2 "上限测试 +9(30 )全过,全量 162 ;71 charts 模板 + 中汽研 deck 模板回归零新增噪音已知边界:S19 类叠压若文字带 rotate/scale transform 仍不可测(子树跳过);数据图表下限是策略纪律,机器只能验"指派了没画",验不了"该指派没指派" 0.37 网格锁上线后同题重做(task 7aa49195),对齐/标题/节奏大幅好转,但用户复评两点成立:①**两栏裸文字页 ×4**(S8/S9/S16/S21 同为"图标小标题+下划线+文字堆 ×2 栏"零图形)——该形态无卡片、仅 2 图标,0.37 的 icon-grid/card-grid 指纹完全看不见,单调门盲区;②**全本零数据图表**(素材全是数字:100万→500万条/能耗降10-20%/碳排26%),"历程"类内容也退化成文字列表。另有两硬缺陷:S18 第 5 条描述被页脚裁掉(内容超出内容区)、S19 红色大字直接叠压灰色说明文字。修:**A 指纹加 text-columns 原型**(0 卡片+≤3 图标+≤2 图形基元+左对齐文本聚 ≥2 列)堵盲区,4 页同指纹→error;**B spec 指派图表落空检测**——spec_lock page_charts 指派了图表但该页 <3 图形基元且 <4 卡片error("图表被退化成文字"), executor 硬规则"不许把指派图表降级为文字/大字 KPI";**C CJK 叠压升级 error** run 70% CJK(表意字宽 1.0em 估宽近精确)且互叠 50%error(其余情形保持 warning+渲图过目);**D layout_grid 加可选 content_bottom**非页脚文本 baseline 越过它error(S18 ),executor "写页前垂直空间预算"纪律;**E 策略层数据图表下限**素材含 3 组可比数值全本至少 1-2 页真数据图表,零图表需在 spec 写理由;两栏裸文字列表计入"原型 2 "上限测试 +9(30 )全过,全量 162 ;71 charts 模板 + 中汽研 deck 模板回归零新增噪音已知边界:S19 类叠压若文字带 rotate/scale transform 仍不可测(子树跳过);数据图表下限是策略纪律,机器只能验"指派了没画",验不了"该指派没指派"

View File

@ -1,3 +1,3 @@
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
# 改版本只动这一行。 # 改版本只动这一行。
__version__ = "0.38.0" __version__ = "0.38.1"

View File

@ -1624,6 +1624,10 @@ function handleSseEvent(ev, asstCard, ctx) {
if (fn === "task_progress") { if (fn === "task_progress") {
ctx.progressSteps = applyProgressAction(ctx.progressSteps || [], args); ctx.progressSteps = applyProgressAction(ctx.progressSteps || [], args);
setTaskProgress(ctx.taskId, ctx.progressSteps); setTaskProgress(ctx.taskId, ctx.progressSteps);
// dock 是 chat-stream 上方的 flex 兄弟:它一涨,chat-stream 可视高度就缩,
// 原本贴底的内容被挤到视口下方看不见。进度是隐形动作会早 return 跳过末尾的
// 触底兜底,所以这里补一次:贴底时重新钉到底,别让 dock 展开遮住最新内容。
if (nearBottom) stream.scrollTop = stream.scrollHeight;
return; // 进度是隐形动作,不落可见卡 → 不打断当前文字段 return; // 进度是隐形动作,不落可见卡 → 不打断当前文字段
} }
closeTextSeg(ctx); // 关闭当前文字段:工具/选项卡追加到其下方,之后新文字另起底部段 closeTextSeg(ctx); // 关闭当前文字段:工具/选项卡追加到其下方,之后新文字另起底部段