From ef18d91920cf239e2dc343f4f83a04acc71795fb Mon Sep 17 00:00:00 2001 From: tamakyi Date: Tue, 20 Oct 2026 10:54:34 +0800 Subject: [PATCH] =?UTF-8?q?docs(memory):=20=E9=A1=B5=E9=9D=A2=E4=BD=9C?= =?UTF-8?q?=E7=94=A8=E5=9F=9F=E6=9C=BA=E5=88=B6=E3=80=8110=20=E6=A7=BD?= =?UTF-8?q?=E4=BD=8D=E7=BA=A6=E6=9D=9F=E4=B8=8E=E7=94=9F=E6=88=90=E5=99=A8?= =?UTF-8?q?=E9=87=8D=E5=81=9A=E7=9A=84=E5=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .workbuddy/memory/2026-10-20.md | 40 +++++++++++++++++++++++++++++++++ .workbuddy/memory/MEMORY.md | 13 +++++++++++ 2 files changed, 53 insertions(+) diff --git a/.workbuddy/memory/2026-10-20.md b/.workbuddy/memory/2026-10-20.md index ce8a913..9ee5e79 100644 --- a/.workbuddy/memory/2026-10-20.md +++ b/.workbuddy/memory/2026-10-20.md @@ -75,3 +75,43 @@ ④ 无头 Chrome 下 `canvas.toBlob` 的回调在 `--dump-dom` 前不触发 → 全部改 `toDataURL` 同步化, 自检才能跑(`?selftest=1` 输出 CSS/zip 字节,`?demo=1` 载入示例素材)。 - ⚠️ 预览里深色必须走「暗色渐变 + deco none」,否则会拿白天场景图压深底(和导出结果不一致)。 + +## 11:05 主题生成器重做:真实页面画布 + 按页面作用域 + +用户原话:旧生成器「只针对当前遇到的问题,需要更通用」「示例页面和我的项目完全不一样」 +「想针对箱主页面、问题页面、问题列表、设置页面分别配置」。 + +**机制层(新)** +- `internal/context.pageScope()` 按路径归类,``: + `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`(写进 `
`),配合 `--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。没擅自改(会让人以为要清理历史产物),留待用户决定。
diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md
index bf7c249..03634d0 100644
--- a/.workbuddy/memory/MEMORY.md
+++ b/.workbuddy/memory/MEMORY.md
@@ -104,6 +104,19 @@
   按发布者 `owner.Theme`。都看箱主/发布者,不看访客。全站页(`/`、`/explore`、`/login`)不主题化。
 - 投票页**语言**也跟发布者:`applyOwnerLocale(data map[string]interface{}, owner)`(与主题同一个函数),
   必须在任何 i18n 取词之前调用;箱主未配语言才回退访客/站点默认。签名收 map 是为了能纯内存单测。
+- **按页面作用域**:`internal/context.pageScope()` 输出 ``,取值
+  `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/.css`,**只覆盖令牌**,不碰布局。`static/fs.go` 已嵌整个 `themes/` 目录,
   新增主题只需放文件 + 登记 `[theme] available`(底稿 `_scaffold.css`)。
 - ⚠️ **`[theme] available` 是硬白名单,启动时读一次**:css 发布了但没登记,设置页就是看不到,现象和「部署没生效」一样。