diff --git a/crates/app-iced/src/shell/nav.rs b/crates/app-iced/src/shell/nav.rs index 06f2df5..de96561 100644 --- a/crates/app-iced/src/shell/nav.rs +++ b/crates/app-iced/src/shell/nav.rs @@ -4,7 +4,7 @@ //! //! | 项 | 参考值 | 令牌落点 | //! |---|---|---| -//! | 轨宽 | 5.1 官方 96(narrow 80);本项目 **88** | `LayoutMetrics::DESKTOP.nav_expanded_width` | +//! | 轨宽 | 5.1 官方 96(narrow 80);本项目 **88** | [`nav_rail_width`](`LayoutMetrics` 骨架值,详见该函数文档的 M69 迁移说明) | //! | 轨容器 | 5.3 形状 None / L0 / `Surface` | `MaterialLayer::Canvas` | //! | 选中指示器 | 5.4 **56×32**、圆角 full、`SecondaryContainer` | [`indicator_size`](令牌推导) | //! | 图标 | 5.5 24px | `IconSize::Toolbar` | @@ -88,7 +88,7 @@ pub(super) fn rail<'a>(ui: &'a Ui, selected: NavItem) -> Element<'a, Message> { } container(column(items).spacing(metrics.nav_item_gap)) - .width(metrics.nav_expanded_width) + .width(nav_rail_width(metrics)) .height(Length::Fill) .style(|_theme| filled(ui.layer(MaterialLayer::Canvas))) .into() @@ -138,7 +138,7 @@ fn rail_item<'a>( .height(item_height); button(stack) - .width(ui.metrics().nav_expanded_width) + .width(nav_rail_width(ui.metrics())) .height(item_height) .padding(0) .style(move |_theme: &IcedTheme, status| { @@ -168,13 +168,30 @@ fn rail_item<'a>( .into() } +/// 导航轨宽度(**M69 迁移点**)。 +/// +/// M69(`141e9b1`)把 `LayoutMetrics` 的 nav 字段做了语义纠正: +/// +/// | 旧 | 新 | +/// |---|---| +/// | `nav_expanded_width = 88` | **`nav_rail_width = 88`**(值不变,只是名字从「展开」改成「轨」) | +/// | `nav_collapsed_width = 48` | 删除(48 连 56 宽的选中指示器都放不下) | +/// | —(缺) | 新增 `nav_drawer_width = 240`(D33 的展开态抽屉) | +/// +/// 本 crate 的分支基线(`0aac307`)还没有 M69,所以这里只能写旧字段名;**等 M69 合入后 +/// 把函数体那一行改成 `metrics.nav_rail_width` 即可,其余代码与视觉零变化**。 +/// 把三处调用点收敛到这个函数,就是为了让迁移永远只有一行。 +fn nav_rail_width(metrics: LayoutMetrics) -> f32 { + metrics.nav_expanded_width +} + /// 选中指示器尺寸(12b 5.4 参考 56×32),全部由令牌推导、不写死: /// -/// - 宽 = `nav_expanded_width − 2 × Space::X4` = 88 − 32 = **56**(轨的左右内边距 16) +/// - 宽 = [`nav_rail_width`] − 2 × `Space::X4` = 88 − 32 = **56**(轨的左右内边距 16) /// - 高 = `control_height − Space::X2` = 40 − 8 = **32**(可见高度上下各让 4) pub fn indicator_size(metrics: LayoutMetrics) -> (f32, f32) { ( - metrics.nav_expanded_width - Space::X4.dp() * 2.0, + nav_rail_width(metrics) - Space::X4.dp() * 2.0, metrics.control_height - Space::X2.dp(), ) } diff --git a/crates/app-iced/src/theme.rs b/crates/app-iced/src/theme.rs index 4cc8987..fe3655a 100644 --- a/crates/app-iced/src/theme.rs +++ b/crates/app-iced/src/theme.rs @@ -30,6 +30,11 @@ use unlucky_design::spacing::{LayoutMetrics, Space}; use unlucky_design::typography::{FontFamily, Platform, TypeRole, TypeStyle, Weight}; /// 全站描边宽度(逻辑 px @100% DPI)。rubric G7 要求全站 1px —— 只许这一处定义。 +/// +/// **M69 迁移点**:M69(`141e9b1`)起令牌层有「一像素线单一真源」 +/// `unlucky_design::stroke::HAIRLINE = 1.0`(容器描边/分隔线/聚焦环都用它)。 +/// 本 crate 的分支基线(`0aac307`)还没有这个模块;M69 合入后把这个常量换成 +/// `pub use unlucky_design::stroke::HAIRLINE as STROKE_PX;` 即可(数值与被引用的地方都不动)。 pub const STROKE_PX: f32 = 1.0; /// 已经解析到系统的字体族名(`&'static str` 才能塞进 `iced::Font`)。