feat(app-iced): 强调色接线落地(M250 ACCENTWIRE)

appearance.accent_color 此前是死线:配置键、presenter 往返、预设色板都在,但造 tokens 的
唯一入口恒走 DesignTokens::brand(board),用户填了色界面不变。

- theme.rs:Ui::with_accent + accent_scheme(唯一调用 DesignTokens::with_accent 的地方)
- app/state/theme.rs:rebuild_ui 三选一(显式强调色 > D38 取色方案 > 出厂板),diag 一行说清是谁生效
- pages/appearance:新增 accent 状态(原文/解析结果/方案/结构化错误)+ 设置页输入行与预设色块;
  非法值保持上一次合法值并给出 Short/Long/Digit 三档原因,不静默回退出厂色
- presenter::prefs:AccentChoice::parse 成为唯一解析点,set_accent_checked 交回结构化原因
- app/appearance.rs:persist_appearance 带上 accent_color(此前写不进去),只写上一次合法值
- pages/harness/app.rs:gallery 也能吃 ULL_APPEARANCE_ACCENT,供出图矩阵
- core keys.rs:订正「空 = 出厂 #0078D4;accent 令牌全域生效」这句半真半假的说明
- i18n:强调色 7 条文案(链尾新域,金表只追加)

判据:同一组件(进度条 Primary)在空配置与 #006A5C 下色值不同(App 级 + 令牌级两条);
非法值拿到结构化错误、生效色不回退、不写盘、tokens 仍可构造。
This commit is contained in:
AskaEth committed 2026-11-11 14:56:26 +08:00
1 parent 4cdb46d2e0
commit e6b2200360
18 files changed
+787 -38

No files matched your search

+14 -3
View File
@@ -98,7 +98,12 @@ pub fn run(request: Request) -> Result<(), String> {
// 外观**真状态**(`--appearance=real`):工厂态 + `ULL_APPEARANCE_*` 覆盖。
// 这不是给设置页塞常量:状态从 `State::new` / `apply_env` 来,打日志的是它算出来的生效值。
let appearance = request.real_appearance.then(|| {
//
// M250:**gallery 也要这一份** —— 强调色出图矩阵拍的是组件库(buttons + progress),
// 而 `--appearance=real` 按设计只对设置页生效(`request.rs` 的守卫,别绕过它)。所以判据加
// 一条:设了 `ULL_APPEARANCE_ACCENT` 就造状态,让 `Ui` 按强调色求值(设置页的语义不变)。
let wants_accent = std::env::var_os(appearance::accent::ENV_ACCENT).is_some();
let appearance = (request.real_appearance || wants_accent).then(|| {
let mut state = appearance::State::new(
&AppearancePrefs::factory(),
&AppearanceBase::factory(),
@@ -116,7 +121,7 @@ pub fn run(request: Request) -> Result<(), String> {
}
eprintln!(
"[harness] 外观真状态:window={:.2} panel={:.2}(生效 {:.2})bg={} fill={:?} dim={:.2} \
配色来源={:?} 选中分组={}",
配色来源={:?} accent={} 选中分组={}",
state.window_opacity,
state.panel_alpha,
state.effective_panel_alpha(),
@@ -124,6 +129,7 @@ pub fn run(request: Request) -> Result<(), String> {
state.bg_fill,
state.bg_dim,
state.palette_source,
state.accent.log_token(),
state.selected_group,
);
state
@@ -149,7 +155,12 @@ pub fn run(request: Request) -> Result<(), String> {
}
(
Harness {
ui: Ui::new(boot.flavor, families),
// M250:gallery 出图也要能看见强调色 —— 与产品路径同一条规则(显式强调色 >
// 出厂板),来源是 `ULL_APPEARANCE_ACCENT`(`State::apply_env` 灌进来的)。
ui: match appearance.as_ref().and_then(|state| state.accent.color()) {
Some(accent) => Ui::with_accent(boot.flavor, accent, families),
None => Ui::new(boot.flavor, families),
},
model,
appearance: appearance.clone(),
form: crate::pages::demo_launch_form(),