|
|
7ef3ea7306
|
fix(webui): 宽屏也同步折叠策略 —— 头部与回复框默认收起(正文 48% → 90%)
用户(2026-09-14):「我发现宽屏布局也有邮件内容显示区域过小的问题,
宽屏也同步窄屏的折叠策略吧」。
上一版是「窄屏默认收起 / 宽屏恒展开」,理由是「宽屏横向空间够、不该引入多余
点击」。那条理由只看了**横向**:实测 1280x800 下详情栏里头部 139px(17%)、
回复框 246px(31%),留给正文的只剩 385px(48%)—— 竖向一样不够用。
改法:两种宽度用同一套默认值(收起),点标题行 / 悬浮球展开。
- CollapsibleHeader:useState(false),toggle 不再以 narrow 为条件,展开箭头常显;
- ReplyBar:收起态恒为悬浮球(原来只有窄屏才收),「收起」按钮宽窄都有,
autoFocus 不再以 narrow 为条件;
- MailView 两个根节点补 relative —— 否则宽屏下 `absolute` 会一路找到视口,
悬浮球会挂到窗口右下角而不是这块详情栏里。
实测(真浏览器量盒子,1280x800,同一封正文撑满的长信):
头部 139 → 48px,回复框 246 → 0(收起为球),正文 385 → 722px(占视口 48% → 90%);
点标题展开 / 点球开输入框(带焦点)/「收起」收回,三条都通。
窄屏 390x844 同项通过,横向溢出 0。
判据:narrow-layout 里三条旧判据钉的是「窄屏专属」,已改成钉「宽窄同一套」,
并新增两条(折叠分支里不得再有 `narrow &&`;悬浮球必须锚在详情栏内)。
wide-regression 补 6 条宽屏实测 —— 此前宽屏的折叠行为**一条判据都没有**,
这正是它坏掉而没人发现的原因。
已知遗留(另行报告,本次未改):窄屏上回复框展开后,第一次点它上面的按钮
(抄送 / 回复全部 / 收起)会被吞掉 —— 焦点离开 textarea 会让 .form-editing
失效、底部导航重新占位 71px,按钮在 mousedown 与 mouseup 之间从指针下移走,
click 目标退化成公共祖先。HEAD 上已存在,与本次改动无关。
|
2026-09-14 15:38:49 +08:00 |
|
|
|
ec90cba129
|
test(criteria): 抽出共享 check/finish(marker 不再靠记性)+ 失败信息自带修法
pi 的三条增量,前两条落地:
1. **错误信息自带修法**:受众不只是读过规范的人 —— 并发写 WebUI 的 agent 新加判据时不会打开
CRITERIA.md,看到红的第一反应可能是"套件坏了"。所以把可照抄的修法写进那条错误本身
(共享 helper 的用法 + 样板文件路径),并说明 node:test 的判据不用管。
**red 是 ta 一定会看到的,文档不一定被打开。**
2. **marker 由共享 helper 打印**:新增 test/lib/checks.mjs(导出 check/finish),
计数只可能在该模块内发生 → "漏打 marker"与"计数写错位置"这两类在新文件上不可能发生。
为避免"写了没人用"(本仓踩过的坑),同时把两个手工计数的判据改用它:
narrow-layout(原来只有 failed 计数)与 markdown-xss(原来根本没有计数器)——
条数不变(52 / 9),套件仍全绿。
未回改其余 10 个文件:run-all 的 marker 检查已经覆盖它们。
|
2026-09-14 15:11:47 +08:00 |
|
|
|
a8ac2fc28b
|
test(criteria): 闭环——判据自报条数 + 每文件期望条数(只增不减的棘轮)
pi 指出的残余缺口:我上一轮加的自检 4 是**文本证据**(文件里有 `test(` / `check(` /
`process.exit(1)`),只能证明"**有能红的路径**",不能证明"**它跑过**"。反例很短:
```js
const check = () => {}; // 实现被换空(现实形态:合并冲突改坏实现)
check('a', false); // 存在、也执行了,但什么都不会红
console.log('主题:通过'); // 有输出
```
## 落地(pi 给的闭环形状)
1. 自定义 `check()` 的判据结尾打一行机器可读汇总 `RESULT pass=<条数> fail=<失败数>`
(`node:test` 的判据不用改,已有 `# pass N`);
2. `run-all.mjs` **只解析这个固定 marker**(不猜口语汇总——「窄屏布局:全部通过」里没有数字,
按数字猜会误报,这一点我上轮已经实测过);
3. 与清单里登记的**期望条数**比对,**低于 → 红**。
关键细节:**计数写在 `check()` 内部**(theme/background 原本就在内部 ++;
narrow-layout 只有 failed 计数,补了 passed;markdown-xss 按 payload 条数算)。
写在调用点或靠扫源码的话,"实现被换空"就看不见了。
棘轮"只增不减":加判据**不用**改那个数,只有"条数掉了"才红。期望值按**实测**回填
(9/52/8/30/42/15/28/5/23/5/3/2)。
附带的可见性收益:这几轮我一直用"13→14""19→28""34→42"当信号,现在它成了判据 ——
某次改动顺手删掉两条判据、或某条被跳过,会立刻红。
## 变异
- pi 那个反例(`check` 换成空函数)→ 红(`自报 0 条 < 登记的 30 条`);
- 删掉 5 条 `check(` 调用 → 红(`自报 47 条 < 登记的 52 条`)。
## 规范
§6.5 新增"涉及运行时行为的结论必须实测过才能写进规范/判据"——同一个错这轮犯了两次
(我从"报告 0 个测试、退出 0"推断"退出码被吞",实测是照传;pi 拿我这个结论又建了一个洞)。
规则:**一次观察只支撑你看到的那一层**。
§6.6 记闭环形状与代价(故意删判据要同步改数字,属于一次可复核的显式编辑)。
⚠️ 并且如实记下一次**我自己违反规范**的事:写 §3 那条"变异后别用 `git checkout` 还原"的人
(就是我)在这次变异验证里又用了 `git checkout -- <文件>`,把刚加、尚未提交的 marker 抹掉了。
规矩写下来不等于会遵守 —— 已把这条实例写进规范,让人知道它是活人踩的坑。
## 验证
`npm test` 退出码 0(12 个判据文件全绿 + vitest 258/258);`run-all` 单独跑也 exit 0。
|
2026-09-14 15:06:14 +08:00 |
|
|
|
9aa702b8cc
|
fix(webui): 导航改"按主题的玻璃"(浅色白玻璃+深字)+ 去掉整屏闪的入场动画
用户两句话:
「那你为什么不把白字换成黑字或者自动反色或者描边呢?」
「部分动画十分不合理,会导致页面大范围的闪动,且不能让人自然的把注意力集中在
将要出现的页面上」
## ① 导航:他说得对,我之前是用错误的方式解决对比度
这个应用是**浅色底 + 深字**,导航却是全页唯一一块黑的 —— 那才是"割裂"。我上一轮
为了"白字对比度"把它做成深玻璃,等于**把一块地方永久压黑**来回避问题。
现在导航底色/文字全部走令牌,按主题切换:
浅色:白玻璃 rgb(255 255 255 / .72) + 深字 #475569 → 对比度 7.48:1
深色:深玻璃 rgb(15 23 42 / .72) + 亮字 #94a3b8 → 自动反色
组件侧改成 `.nav-rail` / `.nav-item[data-active]` 令牌类(Sidebar 与 NarrowNav 同一套)。
同时删掉壁纸模式里写死的深玻璃规则 —— 那条正是"为什么还是黑色"。
## ② 动画:整面板入场删掉
先是从"所有面板一起动"改成"只动主内容区",试下来仍然不对:页面级淡入会把
**已经在那儿的框架**也一起暗一下,观感还是闪。所以这一档整体删掉,只保留局部、
有明确语义的动效(日历翻页、菜单展开)。实测切视图时 `animatedOnSwitch = 0`。
骨架不动,注意力自然落在变化的那块内容上。
## ③ 一条我自己的误判(值得记下)
深色主题下我量到导航文字对比度只有 2.36,一度以为是变量/级联的问题,还写死了一份
深色字面值。**那是误判**:`.nav-item` 有 `transition: color .15s`,我在切主题后
**立刻**读 computed color,拿到的是过渡的**起点**(浅色值)。决定性证据是连内联
`style.color` 都"改不动"它 —— 级联不可能这样,只可能是还在过渡中。等 400ms 再量就正常。
写死的那份已撤掉,并在 CSS 里留下说明;新判据 `test/manual/nav-contrast-verify.mjs`
用 WCAG 比值量对比度(不是"颜色是不是黑的"),每次读之前等 400ms。
背景套件 32 条全绿(含"导航走令牌 + 两套令牌都在")。
|
2026-09-14 11:57:41 +08:00 |
|
|
|
f9d757b5e5
|
chore: directory migration - gateway→server, web→client/electron
|
2026-09-08 19:16:35 +08:00 |
|