From 05e9583fe5b397d4b785684a30fe063daa57262a Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 14 Sep 2026 16:59:16 +0800 Subject: [PATCH] =?UTF-8?q?test(=E9=A2=84=E8=AE=BE):=20=E9=92=89=E4=BD=8F?= =?UTF-8?q?=E4=B8=A4=E7=AB=AF=E9=A2=84=E8=AE=BE=E6=B8=85=E5=8D=95=E7=9A=84?= =?UTF-8?q?=20id=20=E4=B8=8E=E9=A1=BA=E5=BA=8F=EF=BC=9B=E6=9B=B4=E6=AD=A3"?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A=E5=8F=AA=E7=94=B1=E5=A3=81=E7=BA=B8=E5=B1=82?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3"=E8=BF=99=E6=9D=A1=E8=A2=AB=E6=92=A4?= =?UTF-8?q?=E5=9B=9E=E7=9A=84=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi 2026-09-14 的三处答复,逐条处理: 1. **§1 预设渲染(他担心的信息对等缺口)实际不存在**:鸿蒙侧 `model/Wallpaper.ts` 已有 `PRESET_IDS = ['aurora','dusk','mint','sand','ink','mesh']` + 标签 + 归一化 + `layersFor`, 计划文档 §P4 行也早写着"预设 6 档都能画出来 ✅"。所以 P4c(上传入口)不必让位。 **但缺口在判据上**:原先只钉了"服务端默认预设要在鸿蒙清单里"与"预设色板的值两边相同", **id 集合与顺序没钉**。新增判据:`PRESET_IDS` 必须与 WebUI `PRESETS` 的 id **与顺序**逐项一致 (顺序也是契约:顺序不同会让两端的选择界面看起来"选错了")。变异验证:把 aurora/dusk 对调 → 红。 2. **§3 模糊口径**:他说判据"现在是后者"(只有导航必须有材质)—— 实际**两条都在** (`harmony-appearance.test.mjs`:壁纸层不许有 `backgroundBlurStyle`、也不许有任何 `blur(`; 导航条必须有 `.backgroundBlurStyle(Theme.navMaterial)`)。所以这里不需要改代码。 需要改的是**文档里的规则原文**:`docs/HARMONY-ALIGN-PLAN.md` 第 9 行那句 "模糊只由壁纸层负责"是**被撤回的原话**(它其实是 WebUI 的架构结论:WebUI 壁纸自带 `filter: blur()`,所以浮在它上面的面再 `backdrop-filter` 就是糊第二遍),已换成两段式规则 "同一张底只许被模糊一次 / 模糊该出现在背后是可变内容的层",并把撤回本身留痕。 3. **§3 补的第二件(语义转换)**:§7.12 的表里新增一行 —— WebUI 的 `bg_blur` 是**像素半径**、 作用在壁纸图层;鸿蒙**没有对应物**,栏上的系统材质档位是唯一一次模糊,壁纸层不糊。 写清"不是同一个物理量,`bg_blur=8px` 与档位对不上不是 bug",否则以后必被当 bug 报。 --- .../test/appearance-defaults.test.mjs | 23 +++++++++++++++++++ client/electron/test/run-all.mjs | 2 +- docs/HARMONY-ALIGN-PLAN.md | 15 +++++++++--- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/client/electron/test/appearance-defaults.test.mjs b/client/electron/test/appearance-defaults.test.mjs index 9d06721..f5ef982 100644 --- a/client/electron/test/appearance-defaults.test.mjs +++ b/client/electron/test/appearance-defaults.test.mjs @@ -240,3 +240,26 @@ test('★ 切账号的顺序:**先按新账号重读本地**,再拉服务端 const rBlock = store.slice(rAt, store.indexOf('}', store.indexOf('set(next)', rAt))); assert.ok(!/persist\(/.test(rBlock), '重读不许写盘'); }); +/** + * ★ 预设清单的 **id 与顺序** 必须两边一致(pi 2026-09-14 提的跨端耦合)。 + * + * 原先只钉了"服务端默认预设要在鸿蒙清单里"(下面那条)与"预设色板的值两边相同", + * 但**id 集合与顺序**没钉:鸿蒙漏一档 → 用户在那个档上看到的是"无背景"(信息对等缺口, + * 不是入口缺口);顺序不同 → 两端的选图/选预设界面顺序不一致,用户以为选错了。 + * 这与 `WorkCard` 字段集、`TABS` 顺序是同一类耦合:**一边改要同时改另一边**。 + */ +test('★ 预设:鸿蒙 PRESET_IDS 与 WebUI PRESETS 的 id 与顺序逐项一致', () => { + const wp = code(join(ETS, 'model/Wallpaper.ts')); + const listM = /export const PRESET_IDS: string\[\] = \[([^\]]*)\]/.exec(wp); + assert.ok(listM, '找不到 PRESET_IDS(鸿蒙的预设清单)'); + const harmonyIds = [...listM[1].matchAll(/'([^']+)'/g)].map(m => m[1]); + + const store = code(join(ROOT, 'client/electron/src/stores/backgroundStore.ts')); + const presetBlock = /export const PRESETS[^=]*=\s*\[([\s\S]*?)\];/.exec(store); + assert.ok(presetBlock, '找不到 WebUI 的 PRESETS'); + const webIds = [...presetBlock[1].matchAll(/id:\s*'([^']+)'/g)].map(m => m[1]); + + assert.deepEqual(harmonyIds, webIds, + `两端的预设清单不一致。\n 鸿蒙:${harmonyIds.join('、')}\n WebUI:${webIds.join('、')}\n` + + '顺序也是契约:顺序不同会让两端的选择界面看起来"选错了"。'); +}); diff --git a/client/electron/test/run-all.mjs b/client/electron/test/run-all.mjs index 8ec6c7f..c90e67e 100644 --- a/client/electron/test/run-all.mjs +++ b/client/electron/test/run-all.mjs @@ -71,7 +71,7 @@ const SUITE = [ // P5 悬浮玻璃导航:点击配对 / index 决定挂载 / 命中区 ≥44vp / 悬浮与让位 ['test/harmony-nav.test.mjs', ['--experimental-strip-types', '--no-warnings'], 6], // 外观契约:默认值去 Go 源码里读(服务端 DefaultAppearance 是权威)+ 缓存键按账号 - ['test/appearance-defaults.test.mjs', [], 3], + ['test/appearance-defaults.test.mjs', [], 4], ['test/build-stamp.test.mjs', [], 7], ['test/packaging.test.mjs', [], 5], ['test/commit-hygiene.test.mjs', ['--experimental-strip-types', '--no-warnings'], 2], diff --git a/docs/HARMONY-ALIGN-PLAN.md b/docs/HARMONY-ALIGN-PLAN.md index e556ea1..383b8cd 100644 --- a/docs/HARMONY-ALIGN-PLAN.md +++ b/docs/HARMONY-ALIGN-PLAN.md @@ -6,7 +6,7 @@ > **负责人:dsh**(2026-09-14 起由 jianf 指定)。移交信: > 线索 `harmony-ui-alignment`(`dsh@/home/program/agentmail`), > 信里交代了状态、判据纪律与踩过的坑(判据要点"用户真正会点的那一层"、 -> 不许新写死颜色、不要给单个面单独做深色、模糊只由壁纸层负责、 +> 不许新写死颜色、不要给单个面单独做深色、**同一张底只许被模糊一次**、 > 列表项每项一张卡、ArkTS 编译坑、视觉不可验要如实标注)。 > > 我(pi)保留 WebUI/Electron 侧:需要两边一起加令牌之类的配合,回信给 pi。 @@ -160,7 +160,7 @@ WebUI 侧 `npm test` 在 **HEAD 上就是红的**(`test/background.test.mjs` 但深色那套已在 `faacd3c`(修"导航栏还是黑色")里被有意去掉, 现在 `index.css` 只剩 `--nav-bg: 255 255 255 / 0.72`。 - `导航在壁纸模式下仍参与模糊` —— 期望 `html[data-bg='on'] .nav-rail` 里有 - `backdrop-filter: blur(`,而该规则现在**是空的**("模糊由壁纸层负责,这里不叠", + `backdrop-filter: blur(`,而该规则现在**是空的**("同一张底只许被模糊一次", 见 `index.css:892`)。 两条判据编码的都是**已被有意回滚的设计**,判据没跟着改。红成了常态, @@ -239,7 +239,7 @@ ArkUI 只认单值,故用 `Theme.overlay()` 组装。**WebUI 侧不立同名 ### 6.3 那两条红判据的 patch:已落地,且验证过能判红 `test/background.test.mjs` 第 18 组三条按 pi 的 patch 重写:标签改回它真正断言的东西, -两条方向相反的断言取代原两条(`.dark` 不许单独给导航换色 / 模糊只由壁纸层负责)。 +两条方向相反的断言取代原两条(`.dark` 不许单独给导航换色 / 壁纸层不许有模糊)。 变异验证: - 往某个 `.dark { }` 里塞一行 `--nav-bg: 15 23 42 / 0.72;` → **红**; @@ -513,6 +513,7 @@ deb 也不必从 targets 里摘。已写进 `client/electron/BUILD.md`(含排 |---|---|---|---| | 圆角 | 自声明 `--radius-card: 0.875rem` | 系统 `sys.float.ohos_id_corner_radius_card/button` | 系统圆角会随设备/主题/无障碍设置变;跟着系统才是"系统方案" | | 材质(玻璃) | 自声明 `--nav-bg: 255 255 255 / 0.72` + `backdrop-filter` | 系统 `backgroundBlurStyle(BlurStyle.COMPONENT_THICK)` | 系统材质自带深浅两套颜色与模糊半径,手写 alpha 跟不了深色 | +| **壁纸模糊度** | 用户的 `bg_blur`(**像素半径**,初值 4px)作用在壁纸图层上 | **没有对应物**:栏上的系统**材质档位**(`BlurStyle.*`)是唯一一次模糊,壁纸层不糊 | **不是同一个物理量**:`bg_blur=8px` 与"材质档位"对不上**不是 bug**,是映射 —— 不写清就会有人当 bug 报(pi 2026-09-14 指出) | | 动效 | 自定义 transition/时长 | `animateTo` + 系统 `curves` | 动效曲线应跟随系统设置(含"减弱动效") | | 遮罩 | 自声明 `--bg-scrim` + `--bg-dim` 两段式 | 系统 `sys.color.ohos_id_color_mask_regular` | 遮罩要随主题换向(浅色洗白/深色压黑),这件事系统已经做了 | | **品牌色** | `--c-blue-600: 37 99 235` | `Theme.accent = '#2563EB'` | **不允许差异** —— 两个客户端是同一个产品 | @@ -527,6 +528,14 @@ deb 也不必从 targets 里摘。已写进 `client/electron/BUILD.md`(含排 它是自绘弹层唯一还需要引用的那一个令牌;判据钉两件事:值来自系统、且**在 `Theme.ets` 之外确有使用点** (只有声明没有使用 = 死令牌,pi 点过这条)。 +**"模糊归谁"这条规则更正过(pi 2026-09-14 撤回自己的原话)**:原话"模糊只由壁纸层负责"是 +**WebUI 的架构结论,不是通用规则**(WebUI 壁纸自带 `filter: blur()`,所以浮在它上面的面再 +`backdrop-filter` 就是把同一张已糊的底糊第二遍 —— 那条规则在 WebUI 是空的)。正确的判据形式是两条: +**① 同一张底只许被模糊一次;② 模糊该出现在"背后是可变内容"的层**(WebUI 的 `.narrow-nav` 就有 +`backdrop-filter`,因为背后是会滚动的内容)。鸿蒙这边栏上是系统材质、壁纸层不糊 ⇒ 满足"只一次", +而且比原话更符合"能给系统的全给系统"。判据已按**互斥形式**钉:壁纸层不许有 `backgroundBlurStyle`/`blur(`, +导航条必须有 `.backgroundBlurStyle(Theme.navMaterial)`。 + **材质为什么是 `COMPONENT_THICK`**(pi 指出:判据只能钉"来自系统枚举",钉不了"选对没选对", 所以理由要写下来,免得后人以为随便挑的):底部导航栏是**内容之上的一层**,要挡住滚动内容 又不至于把内容糊没 —— `COMPONENT_*` 系列是"组件材质"(作用于一个组件表面),