.txt` 做三步(登记 `[theme] available`、`StaticVersion` +1、重新编译)。
## 它做了什么
- 用**和线上同一套机制**渲染预览:`background-image: pattern, deco(6 层), page-image`,
`background-size` / `background-position` 一一对应,不是另画一张示意图。
- 位置数学和 CSS 一致:`background-position` 的百分比是相对 **(容器宽 − 图宽)**,
所以工具里拖出来的「左沿像素」会被反解成 `calc(50% - Npx)`,换视口不会跑位。
- 图片全部转 WebP 并按目标尺寸重采样,导出前就能看到 KB 数。
- 生成的 CSS 同时写浅色/深色两块(项目测试 `TestThemeCSSComplete` 要求),
10 个必需令牌齐全。
## 它不做什么
- **不抠图**。人物/道具必须是透明底;白底图导出的主题会带一块白。
- **不做调色**。想统一"雾度"(人物压白 16%、场景 30~38%)得在生成端做,
或用 `docs/theme-shiroko-assets-spec.md` 里的公式自己处理。
- **不写 `[theme] available`**。配置在 `conf/app.ini`,导出包里只给了要粘贴的那一行。
- **不改代码**。素材是编译期 embed,必须重新 `go build` 才会生效。
## 自检
```
chrome --headless=old --dump-dom "file:///.../dev/theme-builder/index.html?selftest=1"
```
会把生成的 CSS 与 zip 字节以 JSON 塞进 ``,可用于回归:
把 `css` 写成 `static/css/themes/.css`,跑 `go test ./internal/theme -run TestThemeCSSComplete`。
`?demo=1` 会直接载入示例素材(纯 canvas 画的渐变背景 + 一个剪影),没有图也能先看布局。