fix(app-iced): M75 r5 —— 禁用内容角色按变体(A1)+ 删 probe 重复块 + 逐行护栏

1) A1 逐变体(AAR javap):Filled/Elevated/Outlined/Text = OnSurfaceVariant@0.38;
   FilledTonal = OnSurface@0.38(FilledTonalButtonTokens.DisabledLabelTextColor);
   Standard/Filled IconButton = OnSurface@0.38(*IconButtonTokens.DisabledColor)。
   新增 Variant::disabled_content() / IconVariant::disabled_content(),
   interaction::disabled_content_over_role(ui, role, on_container) 成唯一入口。
2) probe.rs 删掉被两个 reviewer 点名的重复块(disabled_colors 调用两次、
   disabled_container 绑定两次),并补 grep 证据。
3) 护栏改成**逐行**:矩阵 7 个有内容的变体行各自断言 disabled 列的 38% 墨迹 > 40 px
   (浅/深同一套阈值,单行回退就会红),取代原来按浅色标定的全局 500 阈值。
6) 删掉 interaction/mod.rs 里挂在 mod tests 头上的悬挂文档。
This commit is contained in:
AskaEth committed 2026-11-02 04:51:03 +08:00
1 parent b31a758cda
commit eed1c9d3f7
5 files changed
+99 -51

No files matched your search

@@ -125,20 +125,31 @@ pub fn overlay_color(ui: &Ui, state: Interaction, content: Role, container: Role
.map(|layer| ui.state_over(layer, content, container))
}
/// 禁用态内容色:`OnSurfaceVariant` @ 38% 叠在 **`base` 角色**上(不经过 12% 容器)。
/// 禁用态内容色(**按角色、按有没有容器**求值)——A1 口径的唯一入口。
///
/// 给**不画容器**的三式(Text / Outlined / standard IconButton)用:错用 [`disabled_colors`]
/// 的内容值(叠在 12% 容器上)会比令牌口径深 21/255。
pub fn disabled_content_over(ui: &Ui, base: Role) -> Color {
/// - `role`:由变体决定(Filled/Outlined/Text/Elevated = `OnSurfaceVariant`;
/// FilledTonal 与三式 IconButton = `OnSurface`,见 `Variant::disabled_content`);
/// - `on_container = true`:叠在 **12% 容器**上(有容器的三式);
/// `false`:直接叠在 **surface** 上(Text / Outlined / standard IconButton)。
///
/// 之前这里写死 `OnSurfaceVariant` 且只有一个「底」,导致 FilledTonal 与 IconButton 两族偏浅
/// 15/255(视觉 r3 用像素量的)。
pub fn disabled_content_over_role(ui: &Ui, role: Role, on_container: bool) -> Color {
let scheme = Scheme::baseline(ui.flavor());
// A1(AAR `FilledButtonTokens` javap):DisabledLabelTextColor/DisabledIconColor 都是
// `OnSurfaceVariant`、Opacity 0.38f。设计层的 `disabled_content()` 用 OnSurface(与 A1 不符),
// 令牌线修好前这里按 A1 用角色 + 令牌 α 直接求值(不引入字面量)。
let base = if on_container {
scheme
.get(Role::OnSurface)
.with_alpha(DISABLED_CONTAINER_ALPHA)
.over(scheme.get(Role::Surface))
} else {
scheme.get(Role::Surface)
};
to_iced(
scheme
.get(Role::OnSurfaceVariant)
.get(role)
.with_alpha(DISABLED_CONTENT_ALPHA)
.over(scheme.get(base)),
.over(base),
)
}
@@ -159,7 +170,8 @@ pub fn disabled_colors(ui: &Ui, surface: Role) -> (Color, Color) {
.get(Role::OnSurface)
.with_alpha(DISABLED_CONTAINER_ALPHA)
.over(base);
// 内容角色按 A1 用 `OnSurfaceVariant`(见 `disabled_content_over` 的说明)
// 这里是**默认口径**(OnSurfaceVariant);按变体取值请走 [`disabled_content_over_role`]
// ——FilledTonal 与三式 IconButton 的禁用内容是 `OnSurface`(A1)。
let content = scheme
.get(Role::OnSurfaceVariant)
.with_alpha(DISABLED_CONTENT_ALPHA)
@@ -168,8 +180,6 @@ pub fn disabled_colors(ui: &Ui, surface: Role) -> (Color, Color) {
(to_iced(container), to_iced(content))
}
/// 自定义 `Widget` 的状态机:把 iced 事件折成 [`Interaction`]。
///
#[cfg(test)]
mod tests {
use super::*;