fix(app-iced): 必修2 元信息卡最小宽改由内容推(136 → 160),1180 下网格 2 列

视觉 r2 抓到的回归:上一轮为塞进三列把 `META_CARD_MIN_WIDTH` 收到 136,只算外框、忘了
`card_padding = 20`,卡内只剩 96px —— demo 里 `NeoForge 20.4.237`(实测 118px)与
`NeoForge 21.1.72`(110px)都会按词折成两行,同排另两张卡仍一行 → **卡底不齐**。

- 最小宽改由**卡内最长内容**反推:118(Segoe UI 14px 实测)+ 2×20(令牌 `card_padding`)= 158
  → 取 4px 栅格 **160**(值上等于最初的 160,但这次是内容推出来的,不是凑上限凑出来的)。
- 于是元信息网格在 1180 宽落到 **2 列**(2×160 + 12 = 332;3 列要 504 > 行宽上限),
  卡内可排 **166px** ≥ 118,所有值单行放下;6 格 = 3 行 2 列。
- 新增单测 `meta_card_is_wide_enough_for_the_longest_value`(此前 39 条 pages 测试没有一条覆盖它):
  ① 夹具 `NeoForge 20.4.237` 必须仍在 DEMO 里(数据变了就红,提醒重新量);
  ② `META_CARD_MIN_WIDTH − 2×card_padding ≥ 118`;③ 实际两列布局下每卡内宽也 ≥ 118。
- `meta_grid_drops_columns_as_the_detail_narrows` 跟着改成「上限处 2 列」(1180 与 900 同为 2 列,
  差别落在详情列宽 435 vs 404)。
This commit is contained in:
AskaEth committed 2026-11-02 02:04:04 +08:00
1 parent dc67be529d
commit a650f8184b
3 files changed
+53 -13

No files matched your search

@@ -15,6 +15,41 @@ fn demo_rows_overflow_the_visible_list() {
);
}
/// 元信息卡必须装得下**卡内最长的那条值**(视觉 r2:136 漏算 padding,版本串折行让卡底不齐)。
#[test]
fn meta_card_is_wide_enough_for_the_longest_value() {
use super::super::layout::{measure_cap_px, META_CARD_MIN_WIDTH, META_GAP};
use unlucky_design::spacing::LayoutMetrics;
// 实测(Segoe UI 14px):demo 数据里最宽的元信息值是加载器版本串
const LONGEST_VALUE: &str = "NeoForge 20.4.237";
const LONGEST_VALUE_PX: f32 = 118.0;
let padding = LayoutMetrics::DESKTOP.card_padding;
assert_eq!(padding, 20.0, "卡内边距来自令牌");
// 夹具与 demo 数据不许脱节:这个值必须真在 DEMO 里
assert!(
DEMO.iter().any(|entry| entry.loader == LONGEST_VALUE),
"夹具 {LONGEST_VALUE:?} 已经不在 DEMO 里了,请重新量最长值"
);
// ① 单卡外框减掉两侧内边距,必须放得下这条值(否则 text 会按词折行 → 卡底不齐)
let inner = META_CARD_MIN_WIDTH - 2.0 * padding;
assert!(
inner >= LONGEST_VALUE_PX,
"卡内可用 {inner}px 装不下 {LONGEST_VALUE_PX}px 的 {LONGEST_VALUE:?}(外框 {META_CARD_MIN_WIDTH} − 2×{padding})"
);
// ② 实际版面里每张卡的内宽(2 列时)也要够
let two_columns = (measure_cap_px() - META_GAP) / 2.0;
assert!(
two_columns - 2.0 * padding >= LONGEST_VALUE_PX,
"两列布局下卡内可用 {}px 装不下 {LONGEST_VALUE_PX}px",
two_columns - 2.0 * padding
);
}
#[test]
fn every_demo_entry_has_name_version_and_loader() {
for entry in &DEMO {