diff --git a/src/js_gate.rs b/src/js_gate.rs index 70e6372..08b84c1 100644 --- a/src/js_gate.rs +++ b/src/js_gate.rs @@ -61,7 +61,7 @@ use std::collections::BTreeSet; /// 声明语料:`ui/js/*.js` —— **只有这里**找声明。 /// `include_str!` 在编译期读入 ⇒ 改任一 `ui/js/*.js` 都会重编并重跑本门禁。 -const JS_SOURCES: &[(&str, &str)] = &[ +pub(crate) const JS_SOURCES: &[(&str, &str)] = &[ ("app.js", include_str!("../ui/js/app.js")), ("api.js", include_str!("../ui/js/api.js")), ("data.js", include_str!("../ui/js/data.js")), diff --git a/src/layout_gate.rs b/src/layout_gate.rs index e0b1dd8..65baf3e 100644 --- a/src/layout_gate.rs +++ b/src/layout_gate.rs @@ -1,5 +1,8 @@ -//! 外观门禁(R128 + R129):**元素的外观由它自己的类声明** —— 泛化的「按元素名」规则 -//! 只服务**没有类**的元素。 +//! 样式表 ↔ 标记的门禁(R128 + R129 + R132):**元素的外观由它自己的类声明**, +//! **每一条选择器都必须落在某个元素上**。 +//! +//! 两条相邻的不变量共用同一对载体(`ui/index.html` 与 `ui/css/style.css`):R128/R129 问 +//! 「谁有权给这个元素定外观」,R132 问「这条选择器到底还有没有人」。下面按起因分述。 //! //! # 起因(R128):`.form label` 把盒子强加给带类的 label //! @@ -24,6 +27,27 @@ //! `

`)。类里的 `margin-bottom:0`(让大数字贴住标签) //! 也因此从没用上。**「整个类一条都没生效」=这个类在 markup 里的存在是一句没有兑现的声明。** //! +//! # 起因(R132):四条选择器谁都不带,而它们**今天仍然生效** +//! +//! 与 R128/R129 同一个家族,但受害者不是「外观被抢」而是**没有主人**:那四条规则的选择器 +//! 在应用里**匹配不到任何元素**,却一条也没被删掉 —— 写一个 `class="wallet-note"` 照样拿到 +//! 12px。它们服务的产品功能早已走掉(`git log -S` 逐条可复现): +//! +//! | 选择器 | 症状 | 历来的主人 | +//! |---|---|---| +//! | `.demo-hint` | 登录页演示账号小字 | #61(`a5595c2`)加,元素随 #90(`35291b3`,v0.6.0 演示数据清理)删除;连它读的键 `login.demo` 都已进不可达日落清单 | +//! | `.login-divider`(3 条) | 登录表单的「或」分隔线 | #7(`d70e032`)的历史名;#159(`f46882c`)把标记改用原型规范名 `.divider` 并给旧名留了句「历史别名」注释 ⇒ 从那一刻起旧名就落了空 | +//! | `.wallet-note` | 钱包页余额下方的说明 | #156(`41bb6d1`)把那个元素改写成 `

`(同一 `data-i18n="wallet.note"`),**旧规则原地留下** | +//! | `.sidebar #toggle-mode-btn` | 窄屏侧栏里被藏起来的按钮 | 原型那次提交(`d70e032`)就有这条 `display:none`,而它要藏的按钮**从来没有进过产品**(那是「切换 企业版/公共版」,提交前就被改写掉了)—— 同一段清单里的 `.sidebar #logout-btn` 却是活的,这条规则只做了一半的活 | +//! +//! `.delta`(3 条)**刻意保留**:原型 `statCard()` 真的会吐出 `

`, +//! 它是设计基线的词汇而不是残留 —— 这正是 R4 把原型语料算进来的原因(实测:全表**只有** +//! 它靠原型语料兜住)。 +//! +//! 竞争修法为什么不够:「下次注意删掉」不是门禁;「把 `.login-divider` 重命名成 `.divider`」 +//! 是错的修法(`#toggle-mode-btn` 若改名成 `#theme-toggle` 会**改变行为** —— 窄屏将看不到 +//! 唯一的主题开关,那是另一个轴的事)。R4 直接把「有没有主人」变成可执行的不变量。 +//! //! # 守的是什么 //! //! 不是那些具体类,而是它们共同的形状: @@ -39,7 +63,12 @@ //! //! R1/R2 说的是「谁有权给 label 定盒子」,R3 说的是「这个类到底有没有留下东西」—— 同一条 //! 不变量的两面。R3 之所以**必须比 R2 更宽**(不限 `label`、不限 `display`),是因为 R129 的 -//! 受害者是 `h3` 上的字号/颜色/下边距:只盯排布会整片漏掉它。 +//! 受害者是 `h3` 上的字号/颜色/下边距:只盯排布会整片漏掉它。R4 换了个方向:不看元素,看 +//! **样式表**那一边 —— 每条选择器都得有个落点。 +//! +//! * **R4(落点,名册从 `ui/css/style.css` 派生)** —— 样式表里每个 `.类` / `#id` token 都必须 +//! 以标识符边界出现在**应用语料**(`ui/index.html` + `ui/js/*.js`)或**设计基线语料** +//! (`docs/prototype/aitokenpool-console.html`,`ui/css/style.css` 文件头自己声明的那个)里。 //! //! 竞争修法为什么不够:在 `.check-line` 上补 `!important`、或给每个受害类补一条 //! `.form label.X`,都只堵**当下这两个洞**;下一个组件类用在 `