JianFeeeee
506f207c64
跨端: 修「输入框打开时回复球还在上面」——正是 morph 缺掉的那半截
用户:「你的图标变成输入框,图标变成邮件的动画呢?」
## 真 bug:球没有 `if`,一直挂在树上
实测证据(宽屏 3184,点球打开回复条后抓图):
底层面板已展开(「回复给 pi@root.realtext」+ 输入框 + 取消/发送),
而**蓝球仍然浮在它上方** —— 测得蓝块 `x 2948..3104 y 1500..1628`,
1008 个蓝像素。球不但与「发送」抢同一块地方,还压住输入框右端。
WebUI 是 `if (!open) return <button ... />`(`MailView.tsx:990`)——
**收起态才渲染球**。点开时球从 DOM 消失,才有"球长成输入框"。
## 讽刺的是:注释写的就是对的,代码没跟上
我 2026-09-21 加 morph 时在那段注释里写的是:
`follow: true` 是给"if 范式下**始终在组件树上**的组件"用的;
我们这两端是 `if/else` 互斥出现(一端在树上时另一端不在),
所以用默认 `follow: false`。
——「互斥出现」。可球那一端**根本没有 `if`**。
⇒ `geometryTransition` 的 out 端从未消失:
· 视觉上:球压在展开的面板上(上面的截图);
· 动画上:没有"球这个形态结束"的那一刻,morph 只剩 in 端在动,
用户看到的就不是"图标变成输入框",而是"球还在,下面忽然多了个框"。
★ 教训:`geometryTransition` 的契约是"**两个**组件、一个 in 一个 out"。
我按契约写了注释,却没按契约写代码 —— 而注释不会报错。
这类"文档与实现分叉"只有**在设备上看一眼**才抓得到。
修:`if (!this.showReplyBox && !this.showForwardBox) { ... }`
(转发条也占底部同一块地方,所以两个条件都要)。
## 验证
✓ 设备实测:打开回复条后**蓝球已消失**(同一段像素扫描,0 个蓝像素)
✓ 探针复测 morph 中间帧:把 `Motion.durMorph` 临时改成 6000ms 后连拍 5 帧,
面板顶边 y = **2201 → 1707 → 1679 → 1679 → 1679**
⇒ 中间帧真实存在,不是"瞬移"(改回 220ms 后重新编译安装)
✓ 编译通过、无新 jscrash
✗ 未验证:220ms 原始时长下的**观感**——抓图往返 1.5-3s,探针比被测对象
慢一个数量级(同 `harmony-morph-unverified-middleframes`)。
只能说"动画在播且播的是几何形变",不能说"220ms 手感对"。
2026-09-21 20:39:44 +08:00
..
2026-09-21 18:46:19 +08:00
2026-09-21 20:39:44 +08:00