From e37b452345f3a81e25b68fc0ff0517a2947939ef Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sun, 1 Nov 2026 17:55:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(design):=20M70=20r2=20=E2=80=94=E2=80=94?= =?UTF-8?q?=20=E5=87=BA=E5=8E=82=E9=BB=98=E8=AE=A4=E5=AE=9A=E4=B8=BA=20?= =?UTF-8?q?=E2=91=A3=20=E5=A4=A9=E8=93=9D=20`#3C8DBC`=EF=BC=88=E7=94=A8?= =?UTF-8?q?=E6=88=B7=202026-11-01=20=E6=8B=8D=E6=9D=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `palettes::DEFAULT_SEED`:`#87CEEB`(③ 浅冷蓝)→ `#3C8DBC`(④ 天蓝,主色 `#236488`); `DEFAULT_NEUTRAL_CHROMA` 保持 12 - `tests/skyseed_candidates.rs`:`product_default_is_the_recommended_candidate` → `product_default_is_the_adopted_candidate`,绑定 `CANDIDATES[3]`(④);四档 pin 不变 - 文档:`color/mod.rs` / `palettes.rs` 的「临时默认 ③ / 待用户确认」全部换成 「出厂默认 ④(用户 2026-11-01 拍板)」,③ 标注为备选(值仍 pin 住,可一行换回) - 文档新增定位(D38):这两个常量只定义「**莫奈关闭时的出厂预选色卡**」(配色来源第三级), 不再代表唯一配色来源;背景图/壁纸取色与内置色卡库都不在本 crate、尚未实现 --- crates/design/src/color/mod.rs | 15 ++++++++++---- crates/design/src/color/palettes.rs | 19 +++++++++++------ crates/design/tests/skyseed_candidates.rs | 25 +++++++++++------------ 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/crates/design/src/color/mod.rs b/crates/design/src/color/mod.rs index 2d89cca..4e14e9d 100644 --- a/crates/design/src/color/mod.rs +++ b/crates/design/src/color/mod.rs @@ -53,13 +53,20 @@ //! //! ## 出厂默认色(M70:浅冷天蓝)——含一处**有意偏离** //! -//! 产品默认不走官方紫,而是「浅冷天蓝」。默认值收在两个常量里,**换默认只改这两行**: +//! 产品默认不走官方紫,而是「浅冷天蓝」。默认值收在两个常量里,**换默认只改这两行** +//! (用户 2026-11-01 拍板采用候选 **④ 天蓝**;③ 浅冷天蓝 `#87CEEB` 留作备选,值仍 pin 在 +//! `tests/skyseed_candidates.rs`): //! //! | 常量 | 当前值 | 官方值 | 说明 | //! |---|---|---|---| -//! | [`palettes::DEFAULT_SEED`] | `#87CEEB`(CSS `skyblue`) | `#6750A4`([`palettes::BASELINE_SEED`]) | 种子只贡献**色相**(CAM16 ≈ 226°);种子彩度会被 Tonal Spot 丢掉 | +//! | [`palettes::DEFAULT_SEED`] | `#3C8DBC`(CAM16 hue ≈ 240°) | `#6750A4`([`palettes::BASELINE_SEED`]) | 种子只贡献**色相**(CAM16 240°);种子彩度会被 Tonal Spot 丢掉 | //! | [`palettes::DEFAULT_NEUTRAL_CHROMA`] | `12` | `6` | 让 surface / surface-container-* 带淡蓝调 | //! +//! **定位(D38)**:这套默认只是「**莫奈关闭时的出厂预选色卡**」(首次启动、用户还没选过色卡时 +//! 用的那一套),**不是唯一的配色来源**。用户的配色来源有三级优先:① 启动器背景图取色(Monet) +//! → ② 桌面壁纸取色 → ③ 莫奈关闭(默认)时从内置多套色卡里选。取色与「内置色卡库」都不在本 crate, +//! 也还没实现;本模块只负责「给定一个种子 + 中性彩度,派生出 49 个角色」。 +//! //! > ⚠️ **有意偏离登记**:中性彩度 6 → 12 是对官方 Tonal Spot 的偏离,理由=产品要「浅冷」的冷调表面。 //! > 官方 6 的表面几乎无色,单靠换种子做不到「浅」——因为 primary 的 tone 被官方钉在 40, //! > 种子再浅主色也还是中蓝;**「浅」只能落在中性色上**。除这一处外全部走官方常数 @@ -71,8 +78,8 @@ //! `tests/skyseed_candidates.rs` 把四档候选(保守蓝 / 冷调蓝 / 浅冷蓝 / 天蓝)的色值逐个 pin 住, //! 换默认时它会指着要改的行。 //! -//! ⚠️ 当前默认色是「待用户确认」的**临时默认**(③ 浅冷蓝 `#87CEEB`)。用户看过四档色卡后若选 -//! ④ 天蓝(`#3C8DBC`,主色 `#236488`,比 ③ 更偏蓝),只需改 [`palettes::DEFAULT_SEED`] 一行。 +//! ✅ 默认色已由用户 2026-11-01 拍板:**④ 天蓝 `#3C8DBC`**。备选 ③ 浅冷蓝 `#87CEEB` +//! (主色偏青 `#0C6780`)仍在候选表里,换回去只需改 [`palettes::DEFAULT_SEED`] 一行。 //! //! ## 对比度纪律(WCAG AA) //! diff --git a/crates/design/src/color/palettes.rs b/crates/design/src/color/palettes.rs index 445772a..818da50 100644 --- a/crates/design/src/color/palettes.rs +++ b/crates/design/src/color/palettes.rs @@ -31,14 +31,18 @@ use super::Color; /// **不是**产品默认色——产品默认见 [`DEFAULT_SEED`]。 pub const BASELINE_SEED: Color = Color::rgb(0x67, 0x50, 0xA4); -/// 产品出厂默认种子色(M70 候选③「浅冷蓝」,**待用户确认**)。 +/// 产品出厂默认种子色 —— M70 候选④「天蓝」,**用户 2026-11-01 拍板采用**。 /// -/// `#87CEEB` 就是 CSS 的 `skyblue`。注意它的彩度(36)会被 Tonal Spot 丢掉—— -/// 主色板的彩度恒为 36,种子只贡献**色相**(这里 CAM16 hue ≈ 226°,偏 cyanish 的蓝)。 +/// `#3C8DBC`(CAM16 hue ≈ 239.5°,主色 `#236488`)。注意种子的彩度(42.6)会被 Tonal Spot +/// 丢掉——主色板的彩度恒为 36,种子只贡献**色相**。 /// -/// 第 4 档 ④「天蓝」`#3C8DBC`(CAM16 hue 239.5°,主色 `#236488`)在 -/// `tests/skyseed_candidates.rs` 里有完整 pin 与 WCAG 覆盖;用户若选 ④,改这一行常量的值即可。 -pub const DEFAULT_SEED: Color = Color::rgb(0x87, 0xCE, 0xEB); +/// ## 定位(D38):这是「莫奈关闭时的出厂预选色卡」,不是唯一的配色来源 +/// +/// 用户定了三级优先的配色来源:① 启动器背景图取色(Monet)→ ② 桌面壁纸取色 → ③ 莫奈关闭 +/// (默认)时用户从内置多套色卡里选。本常量 + [`DEFAULT_NEUTRAL_CHROMA`] 只定义**第三级里 +/// 出厂预选的那一套**(首次启动、用户没选过色卡时的那一套)。取色(Monet / 壁纸 / +/// `QuantizerCelebi`)与「内置多色卡库」都不在本 crate,也还没实现。 +pub const DEFAULT_SEED: Color = Color::rgb(0x3C, 0x8D, 0xBC); /// 产品出厂默认的中性调色板彩度(官方 Tonal Spot 是 6,这里 12 = **有意偏离**)。 /// @@ -46,6 +50,9 @@ pub const DEFAULT_SEED: Color = Color::rgb(0x87, 0xCE, 0xEB); /// 这是「浅冷天蓝」唯一能落在表面上的手段(primary 的 tone 被官方钉在 40, /// 种子再浅也变不成浅蓝)。安全区间 6..=12:neutral-variant = neutral + 2, /// 超过 13 会顶到 secondary 的 16,破坏「neutral < neutral-variant < secondary」。 +/// +/// 同样只服务于「出厂预选色卡」(D38 第三级),不约束将来的取色结果。将来若做「内置多套色卡」, +/// 每套色卡各带自己的中性彩度更合适——本常量到时候会退化成「默认那套的取值」。 pub const DEFAULT_NEUTRAL_CHROMA: f64 = 12.0; /// 调色板槽位(M3 的六条 tonal palette)。 diff --git a/crates/design/tests/skyseed_candidates.rs b/crates/design/tests/skyseed_candidates.rs index 51f429f..4c78944 100644 --- a/crates/design/tests/skyseed_candidates.rs +++ b/crates/design/tests/skyseed_candidates.rs @@ -9,8 +9,8 @@ //! |---|---|---|---|---|---| //! | ① 保守蓝 | `#2196F3` | 253.7° | 6(官方) | 近白/近黑,几乎无色 | 钢蓝 | //! | ② 冷调蓝 | `#2196F3` | 253.7° | 12 | 冷白/冷黑,带淡蓝调 | 钢蓝 | -//! | ③ 浅冷蓝 | `#87CEEB`(CSS `skyblue`) | 225.7° | 12 | 浅天蓝 | 偏青(teal) | -//! | ④ 天蓝 | `#3C8DBC` | 239.5° | 12 | 浅天蓝 | 偏蓝的天蓝 | +//! | ③ 浅冷蓝(备选) | `#87CEEB`(CSS `skyblue`) | 225.7° | 12 | 浅天蓝 | 偏青(teal) | +//! | ④ 天蓝(**出厂默认,用户 2026-11-01 拍板**) | `#3C8DBC` | 239.5° | 12 | 浅天蓝 | 偏蓝的天蓝 | //! //! ③ 与 ④ 是同一件事的两种「蓝」:色相越低越偏青(teal),越高越偏钢蓝; //! 239.5° 正好夹在中间,主色从 ③ 的 `#0C6780` 变成 `#236488`。 @@ -243,23 +243,22 @@ fn the_candidates_are_actually_distinguishable() { } #[test] -fn product_default_is_the_recommended_candidate() { - // ③ 是 M70 的**临时默认**(待用户确认)。第 4 档 ④ 加进来之后默认**故意不动**—— - // 由用户看完四档再拍。拍板后改 `DEFAULT_SEED`/`DEFAULT_NEUTRAL_CHROMA` 这里会立刻红, - // 那条红就是在提醒你同步 pin 表(本用例就是那个提醒器)。 - let recommended = &CANDIDATES[2]; +fn product_default_is_the_adopted_candidate() { + // 用户 2026-11-01 拍板采用 **④ 天蓝**。这条用例就是「默认值 ↔ 候选表」的绑定器: + // 谁改了 `DEFAULT_SEED`/`DEFAULT_NEUTRAL_CHROMA` 却没同步这里(或反过来),它会立刻红。 + let adopted = &CANDIDATES[3]; assert_eq!( DEFAULT_SEED, - Color::from_hex(recommended.seed_hex).expect("合法 hex"), - "DEFAULT_SEED 与推荐档 {}", - recommended.tag + Color::from_hex(adopted.seed_hex).expect("合法 hex"), + "DEFAULT_SEED 与已采用的档 {}", + adopted.tag ); - assert_eq!(DEFAULT_NEUTRAL_CHROMA, recommended.neutral_chroma); + assert_eq!(DEFAULT_NEUTRAL_CHROMA, adopted.neutral_chroma); for flavor in [SchemeFlavor::Light, SchemeFlavor::Dark] { assert_eq!( Scheme::baseline(flavor), - scheme(recommended, flavor), - "产品默认(Scheme::baseline)必须等于推荐档的派生结果({})", + scheme(adopted, flavor), + "产品默认(Scheme::baseline)必须等于已采用档的派生结果({})", flavor.name() ); }