fix(ui): 文件预览背景撤回毛玻璃、改回半透明压暗遮罩(bump 0.58.46)
用户反馈 0.58.44 的毛玻璃虚化(rgba(20,22,28,.22) + blur(6px))"不行", 要求还是变暗、且背景仍看得到、注意度适中。改回半透明深色遮罩 rgba(0,0,0,0.45)(比 0.58.43 的 .5 略透、背景内容仍隐约可辨,不挡死), 去掉 backdrop-filter,chat-form 悬浮阴影恢复 0 -10px 28px/.22。 因 0.58.44 之上已叠 0.58.45(工具修复),不走 git revert(会冲突 版本/CHANGELOG),改为前向修复。只动 web/static/dev.html。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a02d1aa5d8
commit
ab55be4cde
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
## 0.58.43 — 2026-07-19
|
## 0.58.43 — 2026-07-19
|
||||||
|
|
||||||
- 优化文件预览的观感:打开预览时整个页面背景改为柔和的毛玻璃虚化(而非硬生生压黑),聚焦到预览内容又不刺眼,不再出现"上半屏变暗、底部输入区一条通亮"的割裂感;底部输入框依然悬浮可用,可以边看文件边打字。
|
- 优化文件预览的观感:打开预览时整个页面背景统一压暗(半透明,背景内容仍隐约可辨、不挡死),聚焦到预览内容,不再出现"上半屏变暗、底部输入区一条通亮"的割裂感;底部输入框依然悬浮可用,可以边看文件边打字。
|
||||||
|
|
||||||
## 0.58.42 — 2026-07-19
|
## 0.58.42 — 2026-07-19
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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-20(工具失败聚集巡检:修 glob 绝对路径崩溃 + PPT 页脚漂移治本 A+C,bump 0.58.45)
|
最后更新:2026-07-20(文件预览背景撤回毛玻璃、改回半透明压暗遮罩,bump 0.58.46)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -26,7 +26,8 @@
|
||||||
- **07-20 / 0.58.45 / glob 绝对路径崩溃(工具失败聚集 #2)**:巡检近7天工具失败聚集,`glob` 排第2(3次/3task/3用户、近24h 仍在发)。根因:`tools/fs.py` GlobTool 直接 `base.glob(pattern)`,模型传绝对 pattern(沙箱 cwd 就是 `/workspace`,自然写 `/workspace/**/*.py`)时 pathlib 抛 `NotImplementedError: Non-relative patterns are unsupported`,整个调用崩返 `[Error executing glob]`。改:绝对 pattern 先 `_split_abs_glob` 拆成「存在的静态前缀目录 + 相对 glob 串」(左起吃掉不含 `*?[` 的组件当 base)再匹配;补首字符 `/`\`\\` 判定(POSIX 前导斜杠在 Windows 宿主 `is_absolute()` 为 False,沙箱是 Linux,两处对齐)。顺手删掉原 `if "**"`/`else` 两分支代码完全相同的死重构。`/sandbox/tools/` 是 Dockerfile `COPY tools/` 拷贝,**需重建沙箱镜像**才生效。
|
- **07-20 / 0.58.45 / glob 绝对路径崩溃(工具失败聚集 #2)**:巡检近7天工具失败聚集,`glob` 排第2(3次/3task/3用户、近24h 仍在发)。根因:`tools/fs.py` GlobTool 直接 `base.glob(pattern)`,模型传绝对 pattern(沙箱 cwd 就是 `/workspace`,自然写 `/workspace/**/*.py`)时 pathlib 抛 `NotImplementedError: Non-relative patterns are unsupported`,整个调用崩返 `[Error executing glob]`。改:绝对 pattern 先 `_split_abs_glob` 拆成「存在的静态前缀目录 + 相对 glob 串」(左起吃掉不含 `*?[` 的组件当 base)再匹配;补首字符 `/`\`\\` 判定(POSIX 前导斜杠在 Windows 宿主 `is_absolute()` 为 False,沙箱是 Linux,两处对齐)。顺手删掉原 `if "**"`/`else` 两分支代码完全相同的死重构。`/sandbox/tools/` 是 Dockerfile `COPY tools/` 拷贝,**需重建沙箱镜像**才生效。
|
||||||
- **07-20 / 0.58.45 / PPT 页脚漂移治本(工具失败聚集 #1,A+C)**:`shell/exit` 排第1(近7天16条 exit-1、近24h 6条,9task/7用户),实测拆解 15/16 是**逐页手写绝对坐标偏离 `spec_lock.layout_grid` 锁定值 2–16px 的「想对齐没对齐」**(footer_y 近失 27行为最大头,margin_x/content_top 各7行,content_bottom 溢出12行),字体/spec_lock 只是 WARN 不 fail。关键发现:`executor-base.md §180-185` 早有「HARD—checker-enforced」的 snap 纪律却仍被漂移,加 prose 无用,治本须机械化。**A**:spec_lock_reference 新增 `## footer` 锁定片段——x/y 用 `margin_x`/`footer_y` 预填好、页码 `text-anchor="end"` 在 `canvas_w−margin_x`、留 `{PAGE}` 占位,executor 每页**逐字粘贴只换页码**,把 footer_y 这个跨页漂移第一大头从「每页手算」收敛成「一次编写」(executor-base 加对应硬规则,SKILL.md 同步);冒烟验证锁定片段过质检 errors=0、无 footer_y/margin_x 报错。**C**:`svg_quality_checker._ALIGN_TOL` 2→3px(2px 对手写实测过严),同步刷 SKILL/spec_lock_reference/executor-base 的「2–15px/2–12px」表述与测试值(margin drift 用例 60/63/66→60/64/68,30 测试全绿)。content_bottom 溢出(装太多项,另一性质)与 grid-snap 后处理(B)本轮未做。
|
- **07-20 / 0.58.45 / PPT 页脚漂移治本(工具失败聚集 #1,A+C)**:`shell/exit` 排第1(近7天16条 exit-1、近24h 6条,9task/7用户),实测拆解 15/16 是**逐页手写绝对坐标偏离 `spec_lock.layout_grid` 锁定值 2–16px 的「想对齐没对齐」**(footer_y 近失 27行为最大头,margin_x/content_top 各7行,content_bottom 溢出12行),字体/spec_lock 只是 WARN 不 fail。关键发现:`executor-base.md §180-185` 早有「HARD—checker-enforced」的 snap 纪律却仍被漂移,加 prose 无用,治本须机械化。**A**:spec_lock_reference 新增 `## footer` 锁定片段——x/y 用 `margin_x`/`footer_y` 预填好、页码 `text-anchor="end"` 在 `canvas_w−margin_x`、留 `{PAGE}` 占位,executor 每页**逐字粘贴只换页码**,把 footer_y 这个跨页漂移第一大头从「每页手算」收敛成「一次编写」(executor-base 加对应硬规则,SKILL.md 同步);冒烟验证锁定片段过质检 errors=0、无 footer_y/margin_x 报错。**C**:`svg_quality_checker._ALIGN_TOL` 2→3px(2px 对手写实测过严),同步刷 SKILL/spec_lock_reference/executor-base 的「2–15px/2–12px」表述与测试值(margin drift 用例 60/63/66→60/64/68,30 测试全绿)。content_bottom 溢出(装太多项,另一性质)与 grid-snap 后处理(B)本轮未做。
|
||||||
- **07-19 / 0.58.43**:文件预览遮罩改整屏、消除"上暗下亮"割裂——旧实现用 `#file-preview-modal { bottom: var(--preview-bottom-inset) }` 把遮罩顶到 chat-form 之上,好让预览时能边看边打字,代价是底部整条(输入区+左栏入口+右栏+状态)全不压暗,与上方压暗区形成一条硬边界的通亮带,很割裂。改为遮罩铺满整屏(`bottom`→`padding-bottom`,仍让居中卡片停在输入区之上不遮挡),底部随整屏统一压暗;仅 chat-form 由新 `body.fp-open` 类 `position:relative;z-index:95`(压过遮罩 z90,层叠上下文已核:`#app`/`#pane-mid` 均不建 context)+ 上向阴影,上浮成"悬浮活动条",继续可打字。预览时左栏/右栏/状态点击落到遮罩=关预览(符合"背景不可用"预期)。改 `web/static/dev.html` + `web/static/js/preview.js`(open/close 加/去 `fp-open`)。
|
- **07-19 / 0.58.43**:文件预览遮罩改整屏、消除"上暗下亮"割裂——旧实现用 `#file-preview-modal { bottom: var(--preview-bottom-inset) }` 把遮罩顶到 chat-form 之上,好让预览时能边看边打字,代价是底部整条(输入区+左栏入口+右栏+状态)全不压暗,与上方压暗区形成一条硬边界的通亮带,很割裂。改为遮罩铺满整屏(`bottom`→`padding-bottom`,仍让居中卡片停在输入区之上不遮挡),底部随整屏统一压暗;仅 chat-form 由新 `body.fp-open` 类 `position:relative;z-index:95`(压过遮罩 z90,层叠上下文已核:`#app`/`#pane-mid` 均不建 context)+ 上向阴影,上浮成"悬浮活动条",继续可打字。预览时左栏/右栏/状态点击落到遮罩=关预览(符合"背景不可用"预期)。改 `web/static/dev.html` + `web/static/js/preview.js`(open/close 加/去 `fp-open`)。
|
||||||
- **07-19 / 0.58.44**:文件预览背景再细化——0.58.43 的整屏纯深色遮罩(`rgba(0,0,0,.5)`)仍偏硬,悬浮输入条亮在深黑上略突兀。改为**毛玻璃**:浅压暗 `rgba(20,22,28,.22)` + `backdrop-filter: blur(6px)`(带 `-webkit-` 前缀,老浏览器不支持则退化为纯浅压暗、不崩),背景虚化推远聚焦到卡片又不刺眼;chat-form 悬浮阴影同步调柔(`0 -10px 28px/.22`→`0 -6px 20px/.12`)。只动 `web/static/dev.html`。
|
- **07-20 / 0.58.46**:文件预览背景撤回毛玻璃、改回压暗遮罩——用户反馈 0.58.44 的毛玻璃虚化(`rgba(20,22,28,.22)` + `blur(6px)`)"不行",要求变暗且背景仍看得到、注意度适中。改回半透明深色遮罩 `rgba(0,0,0,0.45)`(比 0.58.43 的 `.5` 略透、背景内容仍隐约可辨),去掉 `backdrop-filter`,chat-form 悬浮阴影恢复 `0 -10px 28px/.22`。因 0.58.44 之上已叠 0.58.45(工具修复),不走 `git revert`(会冲突版本/CHANGELOG),改为前向修复。只动 `web/static/dev.html`。
|
||||||
|
- **07-19 / 0.58.44**(已被 0.58.46 撤回):文件预览背景一度改毛玻璃虚化,用户反馈观感"不行",0.58.46 改回压暗遮罩。
|
||||||
- **07-19 / 0.58.42**:页内弹框替代原生 alert/confirm/prompt——用户反馈原生浏览器弹框(顶部丑框)应改成页内样式,且区分两类(对标 Element `dialog`/`message`)。新增 `web/static/js/dialog.js`:`dialogConfirm`/`dialogPrompt`(遮罩+卡片 modal,复用改密码那套头/体/脚布局,Promise 化以一比一替换同步的 `confirm`/`prompt`,Esc/点遮罩=取消、Enter=确认、danger 变体红键)+ `message`(顶部居中轻量 toast,success/error/info 三态,自动消失、点即消)。dev.html 加 `#app-dialog` 容器 + `#app-messages` toast + 对应 CSS。全量替换主应用 8 文件调用点(chat/files/crons/procs/wechat/skills/media/auth,共 30 处);`admin.js`(独立 admin-only 页、独立 `<style>`、无 CSS 变量)刻意保留原生 alert 避免缺样式。纯前端加法,不动后端/接口。
|
- **07-19 / 0.58.42**:页内弹框替代原生 alert/confirm/prompt——用户反馈原生浏览器弹框(顶部丑框)应改成页内样式,且区分两类(对标 Element `dialog`/`message`)。新增 `web/static/js/dialog.js`:`dialogConfirm`/`dialogPrompt`(遮罩+卡片 modal,复用改密码那套头/体/脚布局,Promise 化以一比一替换同步的 `confirm`/`prompt`,Esc/点遮罩=取消、Enter=确认、danger 变体红键)+ `message`(顶部居中轻量 toast,success/error/info 三态,自动消失、点即消)。dev.html 加 `#app-dialog` 容器 + `#app-messages` toast + 对应 CSS。全量替换主应用 8 文件调用点(chat/files/crons/procs/wechat/skills/media/auth,共 30 处);`admin.js`(独立 admin-only 页、独立 `<style>`、无 CSS 变量)刻意保留原生 alert 避免缺样式。纯前端加法,不动后端/接口。
|
||||||
- **07-18 / 0.58.41**:任务改名 UI——后端 `PATCH /v1/tasks/{id}` 早支持 `name`(validate_task_name 校验)但前端无入口;`taskMenuItems` 加「重命名」项(列表行 ⋯ 与顶栏 ⋯ 共用此菜单,一处插入两处生效),`renameTask()` 走 prompt→PATCH→更 `state.tasksById`/`taskMeta.name` + `renderChatMeta()` + `loadTaskList()` 全同步。刻意只改 DB 显示名,不动 working_dir/磁盘宪法文件(定位锚是 task_id/short_id,name 设计为自由可变标签)。仅改 `web/static/js/chat.js`。
|
- **07-18 / 0.58.41**:任务改名 UI——后端 `PATCH /v1/tasks/{id}` 早支持 `name`(validate_task_name 校验)但前端无入口;`taskMenuItems` 加「重命名」项(列表行 ⋯ 与顶栏 ⋯ 共用此菜单,一处插入两处生效),`renameTask()` 走 prompt→PATCH→更 `state.tasksById`/`taskMeta.name` + `renderChatMeta()` + `loadTaskList()` 全同步。刻意只改 DB 显示名,不动 working_dir/磁盘宪法文件(定位锚是 task_id/short_id,name 设计为自由可变标签)。仅改 `web/static/js/chat.js`。
|
||||||
- **07-18 / 0.58.39**:JWT 滑动续签——活跃用户临期(剩余寿命 < TTL 1/4,env `ZCBOT_JWT_REFRESH_THRESHOLD_SECONDS` 可调、0 关)由 `_authenticate` 中间件就地重签发新 token 走响应头 `X-Refreshed-Token`/`X-Token-Expires-At`,前端 `api()` 无感吸收换 `state.token`,不再因 7d TTL 掉线。additive 惠及 platform 层 + SPA(不认退回原重登行为);CORS 加 `expose_headers`。
|
- **07-18 / 0.58.39**:JWT 滑动续签——活跃用户临期(剩余寿命 < TTL 1/4,env `ZCBOT_JWT_REFRESH_THRESHOLD_SECONDS` 可调、0 关)由 `_authenticate` 中间件就地重签发新 token 走响应头 `X-Refreshed-Token`/`X-Token-Expires-At`,前端 `api()` 无感吸收换 `state.token`,不再因 7d TTL 掉线。additive 惠及 platform 层 + SPA(不认退回原重登行为);CORS 加 `expose_headers`。
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
||||||
# 改版本只动这一行。
|
# 改版本只动这一行。
|
||||||
__version__ = "0.58.45"
|
__version__ = "0.58.46"
|
||||||
|
|
|
||||||
|
|
@ -1145,22 +1145,20 @@
|
||||||
#new-task-modal .err { color: var(--accent); font-size: 12px; margin-top: 8px; min-height: 1em; }
|
#new-task-modal .err { color: var(--accent); font-size: 12px; margin-top: 8px; min-height: 1em; }
|
||||||
#new-task-modal .actions { margin-top: 14px; display: flex; gap: 8px; justify-content: flex-end; }
|
#new-task-modal .actions { margin-top: 14px; display: flex; gap: 8px; justify-content: flex-end; }
|
||||||
|
|
||||||
/* ───── file preview modal(略深的遮罩 0.5 + 更重阴影) ─────
|
/* ───── file preview modal(整屏压暗遮罩 + 更重阴影) ─────
|
||||||
背景改为毛玻璃(浅压暗 + 虚化)而非硬深色遮罩:虚化把背景推远聚焦到卡片,
|
背景用半透明深色遮罩压暗(不虚化):压暗聚焦到预览卡片,又保持半透明——
|
||||||
浅压暗避免"上暗下亮"的硬割裂,亮着的悬浮输入条浮在浅虚化背景上也不再突兀。
|
背景内容仍隐约可辨,不是纯黑挡死。整屏铺满(含底部)避免"上暗下亮"的硬割裂。
|
||||||
backdrop-filter 老浏览器不支持会自动退化为纯浅色压暗(不崩)。
|
|
||||||
padding-bottom 让出 chat-form 高度(--preview-bottom-inset 由 JS 按需写),
|
padding-bottom 让出 chat-form 高度(--preview-bottom-inset 由 JS 按需写),
|
||||||
使居中卡片停在输入区之上、不遮挡;输入区本身由 body.fp-open 抬到背景之上继续可用。 */
|
使居中卡片停在输入区之上、不遮挡;输入区本身由 body.fp-open 抬到遮罩之上继续可用。 */
|
||||||
#file-preview-modal {
|
#file-preview-modal {
|
||||||
background: rgba(20,22,28,0.22); z-index: 90;
|
background: rgba(0,0,0,0.45); z-index: 90;
|
||||||
-webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
|
|
||||||
padding-bottom: var(--preview-bottom-inset, 0);
|
padding-bottom: var(--preview-bottom-inset, 0);
|
||||||
}
|
}
|
||||||
/* 预览开启时:把输入区上浮成背景之上的"悬浮活动条"(实底 + 轻上向阴影),
|
/* 预览开启时:仅把输入区上浮成遮罩之上的"悬浮活动条"(实底 + 上向阴影),
|
||||||
其余底部区域(左栏入口 / 右栏 / 状态)随整屏背景统一虚化压暗,不再是一条通亮的带。 */
|
其余底部区域(左栏入口 / 右栏 / 状态)随整屏遮罩统一压暗,不再是一条通亮的带。 */
|
||||||
body.fp-open #chat-form {
|
body.fp-open #chat-form {
|
||||||
position: relative; z-index: 95;
|
position: relative; z-index: 95;
|
||||||
box-shadow: 0 -6px 20px rgba(0,0,0,.12);
|
box-shadow: 0 -10px 28px rgba(0,0,0,.22);
|
||||||
}
|
}
|
||||||
#file-preview-modal .card {
|
#file-preview-modal .card {
|
||||||
width: 90vw; height: 90vh; max-width: 1200px;
|
width: 90vw; height: 90vh; max-width: 1200px;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue