test(预设): 钉住两端预设清单的 id 与顺序;更正"模糊只由壁纸层负责"这条被撤回的口径
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 报。
This commit is contained in:
@ -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` +
|
||||
'顺序也是契约:顺序不同会让两端的选择界面看起来"选错了"。');
|
||||
});
|
||||
|
||||
@ -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],
|
||||
|
||||
Reference in New Issue
Block a user