docs(memory): test01 排查结论(窄屏全藏 / themeName 回退)

This commit is contained in:
tamakyi
2026-10-20 18:24:21 +08:00
parent 6c014b3ad2
commit 2d4609dc0e
2 changed files with 32 additions and 0 deletions
+26
View File
@@ -262,3 +262,29 @@ box 页 inherit 时 `addDisabled/bgDisabled` 都 false;在 box 加层后本页
UI 踩坑:面板仅 ~240px,`input[type=range]` 有固有宽度 → 必须 `flex:1 1 0;width:0;min-width:0`, UI 踩坑:面板仅 ~240px,`input[type=range]` 有固有宽度 → 必须 `flex:1 1 0;width:0;min-width:0`,
且质量数值要放进 label 里(作第三个 flex 项会被顶出可视区,表现为"滑块没有数字")。 且质量数值要放进 label 里(作第三个 flex 项会被顶出可视区,表现为"滑块没有数字")。
## 18:2x 排查用户部署的 test01:窄屏素材消失 + 主题名显示成 key
用户自己导出 test01 部署到 box-dev-api(admin6),报两个问题。**两个都复现了,都不是"环境坏了"。**
**测试环境体检(都正常)**:`/_/admin6` 200、`test01.css` 200 且与本地 md5 一致、
`base.css?v=20261020f`(新版,含 `--tb-page-position`)、`<html data-theme-style="test01" data-page-scope="box">`。
部署本身是干净的。
**问题 1:窄屏素材消失** = 工程里「窄屏隐藏全部装饰层」勾着 → 导出 CSS 的 `@media` 把 10 槽全写 `none`。
桌面完全不受影响,所以只看桌面发现不了。定位过程绕了两步弯路,记下来:
- 先怀疑 CSS 表达式非法(`clamp(min(calc(...)),…)`)→ 最小复现页证明**表达式没问题**,图能显示。
- 再怀疑层级:其实素材位置 `calc(50% - 0.67vh)` 正好在**卡片正下方**,卡片 `rgba(255,255,255,0.86)`
只剩 14% 可见,本来就非常淡。
- ⚠️ **本地 preview 快照没有 `data-page-scope`**(TestGenPreview 不走 Contexter),所以
`[data-page-scope="question"]` 覆盖块在快照里根本不生效,读到的是 global 的 `--tb-deco: none`。
本地验证主题必须手动给 `<html>` 补 `data-page-scope`,否则会误判成"主题没生效"。
- 修:删掉 test01.css 的 @media 段(装饰是 fit 单位,浏览器自己会缩)。390 截图确认素材回来了。
- 生成器侧:勾选时橙色警告(几层会消失)+ 图层行标「窄屏隐藏」+ 加层/导出提醒 +
「窄屏」下拉被覆盖时标注;新增 `?narrow=hide` 复现。
**问题 2:设置页显示 `theme.name.test01`** = 模板直接 `{{t .LangCode (printf "theme.name.%s" .Slug)}}`,
`i18n.T` 缺词条返回 key。修:`theme.DisplayName(lang, slug)` 缺词条回退 slug,模板函数 `themeName`。
加了 `TestDisplayName`(自建主题必须回退 slug,不能返回 key)。这样自建主题依旧零改代码。
StaticVersion → `20261020g`(主题 css 内容变了,不换缓存键浏览器 1 天内还是旧文件)。
+6
View File
@@ -97,6 +97,9 @@
按发布者 `owner.Theme`。都看箱主/发布者,不看访客。全站页(`/`、`/explore`、`/login`)不主题化。 按发布者 `owner.Theme`。都看箱主/发布者,不看访客。全站页(`/`、`/explore`、`/login`)不主题化。
- 投票页**语言**也跟发布者:`applyOwnerLocale(data, owner)`(与主题同一函数),必须在任何 i18n 取词之前调用。 - 投票页**语言**也跟发布者:`applyOwnerLocale(data, owner)`(与主题同一函数),必须在任何 i18n 取词之前调用。
- 一套主题 = `static/css/themes/<slug>.css`,**只覆盖令牌**,不碰布局。`static/fs.go` 已嵌整个 `themes/` 目录。 - 一套主题 = `static/css/themes/<slug>.css`,**只覆盖令牌**,不碰布局。`static/fs.go` 已嵌整个 `themes/` 目录。
- 主题显示名:模板用 `{{ themeName .LangCode .Slug }}` → `theme.DisplayName`,i18n 没登记
`theme.name.<slug>` 时**回退成 slug**。⚠️ 别在模板里直接 `{{t .LangCode (printf "theme.name.%s" .Slug)}}`:
`i18n.T` 缺词条返回 key 本身,设置页就会显示 `theme.name.test01`(用户报过)。
- ⚠️ **`[theme] available` 是硬白名单,启动时读一次**:css 发布了但没登记,设置页看不到,现象同「部署没生效」。 - ⚠️ **`[theme] available` 是硬白名单,启动时读一次**:css 发布了但没登记,设置页看不到,现象同「部署没生效」。
排查:`curl /static/css/themes/<slug>.css` 200 = 文件在(没登记);404 = 旧二进制。 排查:`curl /static/css/themes/<slug>.css` 200 = 文件在(没登记);404 = 旧二进制。
- ⚠️ 主题 css **必须成对写**:`html[data-theme-style="x"]`(0,1,1) + `html[data-theme="dark"][data-theme-style="x"]`(0,2,1)。 - ⚠️ 主题 css **必须成对写**:`html[data-theme-style="x"]`(0,1,1) + `html[data-theme="dark"][data-theme-style="x"]`(0,2,1)。
@@ -144,6 +147,9 @@
- 视口预设**带高度**(1512×900 / 1280×800 / 1024×768 / 820×1180 / 390×844):裁切几乎全由高度决定, - 视口预设**带高度**(1512×900 / 1280×800 / 1024×768 / 820×1180 / 390×844):裁切几乎全由高度决定,
只改宽度模拟不出来。`fitStage()` 按预设高渲染 iframe。 只改宽度模拟不出来。`fitStage()` 按预设高渲染 iframe。
- 窄屏:全局 `hideDeco`(急停)> 每层 `mob`(inherit/scale/hide)> 尺寸单位(fit/fitw 自己就缩)。 - 窄屏:全局 `hideDeco`(急停)> 每层 `mob`(inherit/scale/hide)> 尺寸单位(fit/fitw 自己就缩)。
⚠️ **`hideDeco` 会把 @media 里 10 槽全写 none** —— 桌面完全正常、手机上素材全没了,
这是「素材在窄屏消失」的头号来源(test01 就是这么中招的)。UI 已在勾选时给橙色警告、
图层行标「窄屏隐藏」、加层/导出再提醒;`?narrow=hide` 可一键复现。
⚠️ `@media` 里**每个独立配置的 scope 都要写一条** `[data-page-scope="x"]`:页面覆盖块特异性 (0,2,1), ⚠️ `@media` 里**每个独立配置的 scope 都要写一条** `[data-page-scope="x"]`:页面覆盖块特异性 (0,2,1),
只写 `html[data-theme-style]`(0,1,1) 的话独立配置页在手机上完全不生效。 只写 `html[data-theme-style]`(0,1,1) 的话独立配置页在手机上完全不生效。
⚠️ 竖版图只替换**本来有背景图**的页面(`cfg.bg` 非空),否则等于给纯色页塞了张图。 ⚠️ 竖版图只替换**本来有背景图**的页面(`cfg.bg` 非空),否则等于给纯色页塞了张图。