Files
SpineWallpaper/.scratch/build-pipeline/issues/09-panel-matches-official.md
T
Shuery 3f11426964 feat: TS 构建管线、Spine 抓取器与 wallpapers/ 唯一真相来源
把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。

- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
  (.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
  抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)

同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
  且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
  目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)

pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
2026-10-02 01:27:02 +08:00

67 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 09 — 模拟器设置面板还原 Wallpaper Engine 官方面板
Status: resolved
Type: task
## 需求(用户原话)
> wallpaper engine模拟设置面板严格还原官方面板
附官方面板截图(WE 2.8 里本项目这档壁纸的 Wallpaper Settings)。
## 官方面板的结构(从截图读出)
- 标题栏:`Wallpaper Settings` + 右侧 `⟳ 重置`
- 属性一行一个:**图标 + 标签 + 右侧控件**
- `type:"text"` 的属性渲染成**富文本说明块**(`<ul><li>` 列表 + `<a>` 链接),缩进在相关行下方
- 颜色属性之后有一条分隔线
- 底部:`确认` / `取消`
## 改了什么
| 官方特征 | 旧实现 | 现在 |
| --- | --- | --- |
| 标题 `Wallpaper Settings` + `重置` | 无标题栏,右上角一个「WE 模拟器」开关 | 照官方 |
| 图标 + 标签 + 右侧控件 | 两栏 grid,无图标 | 照官方(`text` 开头的 emoji 当图标) |
| 按 `order` 排序 | 按对象键序(属性表不按 order 写就错位) | 按 `order`,回退 `index` |
| `type:"text"` 富文本说明块 | 截断成 90 字的一行提示,列表和链接全丢 | 白名单复制 `<ul>/<li>/<a>/<small>/<br>` |
| `condition` 生效 | 完全忽略 | `键.value == 字面量` 求值 |
| 颜色属性 = 色块 + 「显示颜色选项」 | 一个裸文本框 | 色块;勾选后换成取色器 |
| 底部 确认 / 取消 | 无 | 确认 = 立新基线;取消 = 回滚到基线 |
| `重置` | 无 | 恢复 `project.json` 默认值 |
`fps` / `setPaused` / 替身清单是 WE 面板里没有的调试开关,收进底部可折叠的「模拟器调试」,默认收起——不干扰"像不像官方"的判断。
顶部「⚠ 模拟环境」横幅**保留**:ADR 0006 要求做不到的 API 必须显式标记为替身。这是刻意不像官方的三处之一(另两处:折叠的调试区、面板只是贴右边缘的抽屉而非 WE 主窗口)。
## 三个只有真跑起来才会发现的问题
1. **`schemecolor` 的 `text` 是 i18n 键,不是文案**。它是 `ui_browse_properties_scheme_color`,官方面板显示「主题配色」。直接当标签用,面板上会赫然出现一串下划线键名。加了 `WE_I18N` 映射 + 去前缀的兜底。
2. **`condition` 必须求值,否则面板会多出不该有的行**。`author_info` 的 `condition` 是 `show_author_info.value == true`;不求值就永远显示,关掉开关也赖着不走。认不出来的表达式**返回 true**(宁可多一行,也不要莫名少一行)。
3. **`<script>` 不能进活文档**。说明块是作者写的 HTML,用 `DOMParser` 解析到惰性文档再按白名单复制,而不是 `innerHTML`;`<a>` 只放行 `http(s)`。
## 验证
`tools/checks/verify-panel.mts`(真实 CDP)断言的是**官方面板的可观察特征**,不是我们的实现细节:
- 标题就是 `Wallpaper Settings`、有「重置」、横幅仍在
- 七行顺序逐字比对:主题配色 / 显示颜色选项 / 显示作者信息 / 壁纸预设切换 / 音频音量调整 / 音频文件路径 / 背景音乐选择
- 控件类型:color→色块、bool→checkbox、combo→select、slider→range
- 五个说明块都有 `<ul><li>`;作者信息的 bilibili 链接被保留且只放行 http(s)
- condition:关掉「显示作者信息」→ 作者信息块消失、开关本身还在
- 重置恢复默认 1;取消回滚;确认保留
- 0 异常、0 控制台报错
`tools/checks/shot-panel.mts` 负责出图(把指针移到右边缘让面板滑出再截),产物 `.scratch/shots/panel-official-look.png`。
## 与截图对不上的两处(不是 bug)
截图的属性集与当前源码**不一致**,说明它来自另一个版本:
- 截图有「**翻转**」,当前 `project.json` 的属性表里没有这一项。它可能是 WE 的内置行,也可能是旧版本作者自己声明的属性。
- 截图**没有**「背景音乐选择」(`bgm`),而当前属性表里有——`bgm` 是后加的。
面板是按**当前属性表**渲染的,所以它以属性表为准。