docs(memory): 页面作用域机制、10 槽位约束与生成器重做的坑
This commit is contained in:
@@ -75,3 +75,43 @@
|
||||
④ 无头 Chrome 下 `canvas.toBlob` 的回调在 `--dump-dom` 前不触发 → 全部改 `toDataURL` 同步化,
|
||||
自检才能跑(`?selftest=1` 输出 CSS/zip 字节,`?demo=1` 载入示例素材)。
|
||||
- ⚠️ 预览里深色必须走「暗色渐变 + deco none」,否则会拿白天场景图压深底(和导出结果不一致)。
|
||||
|
||||
## 11:05 主题生成器重做:真实页面画布 + 按页面作用域
|
||||
|
||||
用户原话:旧生成器「只针对当前遇到的问题,需要更通用」「示例页面和我的项目完全不一样」
|
||||
「想针对箱主页面、问题页面、问题列表、设置页面分别配置」。
|
||||
|
||||
**机制层(新)**
|
||||
- `internal/context.pageScope()` 按路径归类,`<html data-page-scope>`:
|
||||
`box`(/_/{domain}) / `question`(/_/{domain}/{id}) / `admin`(/user/questions,/user/votes*)
|
||||
/ `profile`(/user/*) / `vote`(/vote/{token})。首页与 `/explore` 返回了值但**不加载主题 css**,
|
||||
所以生成器里不列它们(列了就是骗人)。
|
||||
- ⚠️ 深色覆盖必须是**三重选择器** `html[data-theme="dark"][data-theme-style][data-page-scope]`:
|
||||
浅色作用域块特异性 0,2,1 与深色块相同、且写在后面,二重选择器会被它盖掉。
|
||||
- 装饰槽位 **6 → 10**(base.css 背景 8 → 12 层 = pattern1 + deco10 + image1)。
|
||||
`TestDecoSlotCount` 逐文件逐声明检查,变异验证有效(写 6 个会 FAIL)。
|
||||
|
||||
**生成器(重写)**
|
||||
- 画板 = iframe 加载 `outputs/preview-*.html`(真模板渲染)。**必须起本地服务**:
|
||||
file:// 下父页面读不到 iframe 的 DOM(即使同目录),预览只能退回示意图。
|
||||
`dev/theme-builder/serve.py` 把项目根当静态目录(只读)。
|
||||
- 每个作用域独立「整页背景 + 最多 10 层装饰」,默认跟随全局;不产覆盖块就自动回退。
|
||||
- 图层 = 图片 / 径向光斑 / 线性光;9 宫格锚点 + 像素偏移;图片层可在画板上直接拖。
|
||||
- ⚠️ 位置统一 `calc(0%|50%|100% ± Npx)` 两值:百分比是相对 (容器 − 图片)。
|
||||
**不要** `left/bottom` 关键字混搭 —— 「水平居中 + 垂直贴底」是三值语法,非法时整条声明作废
|
||||
→ 图层静默掉到左上角(这是之前踩过的坑,这次直接规避)。
|
||||
- ⚠️ 配色只让填 6 个基础色,另 4 个必需令牌派生:`surface-2` 往 **text** 混(浅色下变深、
|
||||
深色下变亮,方向自动对),`text-secondary/muted` 往 bg 混,`primary-weak` 加 alpha。
|
||||
漏了 `--tb-primary-weak` 时 `TestThemeCSSComplete` 只报「缺少」,页面看着没问题,很容易混过去。
|
||||
- 自检钩子:`?dump=css` / `?dump=zip`(写进 `<pre id="dump">`),配合 `--dump-dom` 回归。
|
||||
|
||||
**验证**(都是实测,不是推断)
|
||||
- 生成器导出的 CSS 放进 `static/css/themes/` → `TestThemeCSSComplete` + `TestDecoSlotCount` 双绿;
|
||||
删掉深色块做变异 → FAIL,说明测试真的在查。
|
||||
- 真实箱主页计算样式:image/size/position/repeat/attachment **各 12 层**,前几层尺寸与 shiroko 一致
|
||||
(auto 400 / 96x13 / auto 259 / 100%×3),确认扩槽没打乱顺序。
|
||||
- 临时主题 `zztest` 验证:box 页有人物、question 页 `--tb-deco: none×10` 后人物消失;
|
||||
不写覆盖块时回退全局(人物仍在)。
|
||||
|
||||
**顺手发现**:`.gitignore` 写的是 `./outputs`(无效写法),导致 247 个 outputs 文件被跟踪,
|
||||
每次跑 `TestGenPreview` 都会产生一堆 M。没擅自改(会让人以为要清理历史产物),留待用户决定。
|
||||
|
||||
@@ -104,6 +104,19 @@
|
||||
按发布者 `owner.Theme`。都看箱主/发布者,不看访客。全站页(`/`、`/explore`、`/login`)不主题化。
|
||||
- 投票页**语言**也跟发布者:`applyOwnerLocale(data map[string]interface{}, owner)`(与主题同一个函数),
|
||||
必须在任何 i18n 取词之前调用;箱主未配语言才回退访客/站点默认。签名收 map 是为了能纯内存单测。
|
||||
- **按页面作用域**:`internal/context.pageScope()` 输出 `<html data-page-scope>`,取值
|
||||
`box`/`question`/`admin`(/user/questions,/user/votes*)/`profile`/`vote`。主题用
|
||||
`html[data-theme-style="x"][data-page-scope="y"]` 覆盖整页背景与装饰。⚠️ 深色覆盖必须写
|
||||
**三重选择器**(加 `[data-theme="dark"]`),否则被浅色作用域块盖掉(同特异性、写在后面)。
|
||||
没写覆盖块的页面自动回退全局。首页/`/explore` 不加载主题 css。
|
||||
- ⚠️ **装饰层固定 10 槽**(base.css 12 层 = pattern1 + deco10 + image1),`--tb-deco`/
|
||||
`-size`/`-position` 三组必须等长。`TestDecoSlotCount` 逐文件逐声明检查;少写一个不报错,
|
||||
只会让图层与 size/position 错位(整页重复同一张图 / 人物跑到左上角)。
|
||||
- 位置一律写两值 `calc(0%|50%|100% ± Npx)`(百分比相对「容器 − 图片」)。**别用 left/bottom
|
||||
关键字混搭**:「水平居中 + 垂直贴底」是三值语法,非法时整条声明作废、图层静默回左上。
|
||||
- 可视化编辑走 `dev/theme-builder/`(`serve.py` 起服务 + iframe 加载真实页面快照)。
|
||||
file:// 下父页面读不到 iframe 的 DOM,所以必须走 HTTP;预览快照由
|
||||
`TEST_PREVIEW=1 go test ./templates -run TestGenPreview` 生成。
|
||||
- 一套主题 = `static/css/themes/<slug>.css`,**只覆盖令牌**,不碰布局。`static/fs.go` 已嵌整个 `themes/` 目录,
|
||||
新增主题只需放文件 + 登记 `[theme] available`(底稿 `_scaffold.css`)。
|
||||
- ⚠️ **`[theme] available` 是硬白名单,启动时读一次**:css 发布了但没登记,设置页就是看不到,现象和「部署没生效」一样。
|
||||
|
||||
Reference in New Issue
Block a user