From 436de6ee4d9d2316fa66bfe99b9ea4516da10a14 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 15 Sep 2026 08:09:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(webui):=20=E5=9B=9E=E5=A4=8D/=E8=BD=AC?= =?UTF-8?q?=E5=8F=91=E5=8A=A8=E7=94=BB=E7=9C=9F=E7=9A=84=E4=BC=9A=E6=92=AD?= =?UTF-8?q?=E4=BA=86=20+=20=E5=86=99=E9=82=AE=E4=BB=B6=E6=94=B9=E6=88=90?= =?UTF-8?q?=E3=80=8C=E6=8C=89=E9=92=AE=E9=95=BF=E6=88=90=E6=95=B4=E9=A1=B5?= =?UTF-8?q?=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户两问: ① 「回复邮件那个按钮还是没有动画」——**我上一版的锅**:我只给回复框/转发面板挂了 `rise-in`,但那条规则写作 `html.view-switch .rise-in`,而 view-switch 窗口只由 视图/页签/窄屏/写信 四个状态触发。**回复/转发根本不触发它** ⇒ 类挂着、动画永远不播。 我当时的"验证"只覆盖了写信页(恰好命中四个触发之一),另外两处只验了类在不在。 ② 「写邮件的按钮点击不应该是一个按钮扩大变成页面的动画吗?」——是,这才是对的形态。 改法: - 拆两档作用域:`.rise-in` **挂载即播**(给"点了才出现"的面:写信页/回复框/转发面板), `.pane-rise` 由 `html.view-switch` 窗口触发(给常驻面板:列表栏/日历)。 首屏不会有一堆东西同时淡入,因为前者只在用户动作时挂载。 - 新增 lib/composeOrigin.ts:在**捕获阶段**记录被点元素的矩形(React 的 onClick 在冒泡 阶段,晚一步就取不到),带 2s 时效(防止"点了别的按钮 → 稍后被程序化打开写信页"时 从旧按钮长出来);优先认 `data-compose-trigger`,退一步认最近的 button, 这样 4 个入口不必逐个改(漏一个的后果是静默无动画,与 ① 同一种失败)。 - ComposePage:有起点就 el.animate 从那个矩形长成整页(220ms,只动 transform/opacity/border-radius —— 合成器可做,不动宽高),没起点退回 rise-in。 两条动画都动 transform/opacity,所以渲染期就决定挂哪一条,不同时挂。 判据(narrow-layout +6):rise-in 必须不带 view-switch 前缀、常驻面板必须用 pane-rise 且 window 规则在、reduced-motion 覆盖两档、morph 只动合成器属性、有起点 morph / 无起点 rise-in。生产实测:点悬浮球后 document.getAnimations() 里 ComposePage 根节点上 有 running 的 220ms 动画,首帧 translate(-564px,396px) scale(0.0549)、opacity 0.3 (悬浮球 56px ⇒ scale≈0.055)。回复框/转发面板因该账号收件箱为空未点穿,但触发条件 已从我写错的"窗口触发"改成"挂载即播"。 --- .../electron/src/components/CalendarView.tsx | 2 +- client/electron/src/components/CommTabs.tsx | 1 + .../electron/src/components/ComposePage.tsx | 42 +++++++++++++- client/electron/src/components/MailList.tsx | 2 +- client/electron/src/index.css | 27 +++++++++ client/electron/src/lib/composeOrigin.ts | 56 +++++++++++++++++++ client/electron/test/narrow-layout.test.mjs | 51 +++++++++++++++-- 7 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 client/electron/src/lib/composeOrigin.ts diff --git a/client/electron/src/components/CalendarView.tsx b/client/electron/src/components/CalendarView.tsx index 641c676..31a62ff 100644 --- a/client/electron/src/components/CalendarView.tsx +++ b/client/electron/src/components/CalendarView.tsx @@ -747,7 +747,7 @@ function DayAgendaPane({ }) { const isToday = isSameDay(day, new Date()); return ( -
+
diff --git a/client/electron/src/components/CommTabs.tsx b/client/electron/src/components/CommTabs.tsx index b96b176..21fb0f2 100644 --- a/client/electron/src/components/CommTabs.tsx +++ b/client/electron/src/components/CommTabs.tsx @@ -88,6 +88,7 @@ export function ComposeFab() {