fix(design): Outcome::NotReached / 色相环回绕断言 / LowChroma 口径统一 / 文档指向(复审 r1 p2-4 + 色彩 r1 p2-2/3/4)
- Outcome 新增 NotReached:区分「用户没提供」与「更高级成功所以没轮到」, UI 不会再对着用户已选的卡说「色卡:未选择」;新增 not_reached_is_distinguishable_from_not_provided - cards_are_visually_distinct 补色相环回绕间隔(原来只比排序相邻差,350° 的卡会静默通过) - Failure::LowChroma 的 color 与 chroma 现在永远来自同一个簇(原来一条路径拿 A 簇的色值配 B 簇的彩度); 两条路径的口径写进文档注释,并提醒 UI 别把数字写成「彩度 X < 门槛 8」 - card.rs:测试名指向修正(card_keys_are_stable_and_unique,测试就在本文件)、 「对比度 8.4:1」的假示例换成实测区间(light 6.43~6.49 / dark 7.70~7.75)、 中性彩度那段补上「请求值相同 ≠ 实际表面同冷度」的事实与 D43 去向
This commit is contained in:
1 parent
948a3685cd
commit
f4c48752c2
6 files changed
+122
-28
No files matched your search
@@ -9,13 +9,20 @@
|
||||
//! - 显示名([`Card::name`])可以改、可以本地化,`key` 不许改;
|
||||
//! - 新卡只能**追加**,旧卡永不删除(删了老用户的选择会静默失效 → 见
|
||||
//! [`CardKey::from_key`] 的回落口径);
|
||||
//! - `palette/tests.rs` 里有一条 `card_keys_are_stable` 把 8 个 key 逐字钉住——谁改谁红。
|
||||
//! - `card.rs` 的 `card_keys_are_stable_and_unique` 把 8 个 key 逐字钉住——谁改谁红
|
||||
//! (测试就在本文件末尾的 `tests` 模块里,没有独立的 `palette/tests.rs`)。
|
||||
//!
|
||||
//! ## 每张卡自带中性彩度
|
||||
//!
|
||||
//! 八张卡都取 [`DEFAULT_NEUTRAL_CHROMA`](12,M70 的「浅冷」口径)而不是官方 6:
|
||||
//! 换卡只该换**色相**,不该让窗口底色的「冷度」跟着跳——那种跳变会让用户在设置页里
|
||||
//! 逐张试色时觉得「每张卡都像换了个应用」。要偏离这条得单独论证。
|
||||
//! 逐张试色时觉得「每张卡都像换了个应用」。
|
||||
//!
|
||||
//! ⚠️ **这只是「请求值」相同**:中性调色板的色相目前仍 = 种子色相(`Palettes::from_seed_*`),
|
||||
//! 所以八张卡的实际表面色是逐卡染色的(teal 薄荷白 / forest、olive 偏绿 / amber、rose 暖白),
|
||||
//! 浅色档实测 CAM16 彩度从 1.29(rose)跨到 12.03(teal)——tone 98 处暖相色域装不下
|
||||
//! chroma 12。tower 已定案(D43)改成「色卡固定冷调中性色相、只换强调色」,**不在 M87 做**;
|
||||
//! 在 D43 落地前,别把上面那段当成已经成立的行为。要偏离这条得单独论证。
|
||||
//!
|
||||
//! ## 卡与取色的关系(D38)
|
||||
//!
|
||||
@@ -47,7 +54,12 @@ impl Card {
|
||||
)
|
||||
}
|
||||
|
||||
/// 这张卡的 `on-primary` 对 `primary` 的实测对比度(设置页显示「对比度 8.4:1」用)。
|
||||
/// 这张卡的 `on-primary` 对 `primary` 的实测对比度。
|
||||
///
|
||||
/// 设置页可以直接显示成「对比度 {:.2}:1」。**2026-11 实测(8 张卡)**:
|
||||
/// 浅色档 6.43~6.49、深色档 7.70~7.75(逐张数值见 `every_card_scheme_meets_wcag_aa`
|
||||
/// 的断言上限与 M87 报告表格)——两种模式都远高于 WCAG AA 的 4.5:1。
|
||||
/// 别在文案里写死一个数:卡换种子后它会变,用本方法的返回值。
|
||||
pub fn primary_contrast(self, flavor: SchemeFlavor) -> f32 {
|
||||
let scheme = self.scheme(flavor);
|
||||
scheme.contrast(crate::color::Role::OnPrimary, crate::color::Role::Primary)
|
||||
@@ -277,6 +289,16 @@ mod tests {
|
||||
let gap = pair[1] - pair[0];
|
||||
assert!(gap >= 20.0, "色相挤在一起:{pair:?}");
|
||||
}
|
||||
// 色相是环:排序后「最大 − 最小」不是真实间隔,**回绕那一侧**也要检查。
|
||||
// 漏了这条的话,将来加一张 350° 的卡(与 rose 15.85° 实际只差 25.7°)会被算成
|
||||
// 334.2° 而静默通过。
|
||||
let wrap_gap = 360.0 - (hues[hues.len() - 1] - hues[0]);
|
||||
assert!(
|
||||
wrap_gap >= 20.0,
|
||||
"色相环回绕处挤在一起:{:.2}° ↔ {:.2}°(间隔 {wrap_gap:.2}°)",
|
||||
hues[hues.len() - 1],
|
||||
hues[0]
|
||||
);
|
||||
for card in CARDS {
|
||||
let light = card.scheme(SchemeFlavor::Light);
|
||||
let dark = card.scheme(SchemeFlavor::Dark);
|
||||
|
||||
Reference in new issue
Block a user