fix(download): 窄档面板加专属预算,首屏露出 head+六枚 chip+说明、实例名回到 56px(M227)

720×760(chips 档)原先走 `TailShare::Shared`:面板与列表各吃 Fill 的一半,面板钉死区
(说明 + 菜单 + 实例名 ≈180px)把它吃穿 ⇒ 滚动区视口 0,head(版本 id + 安装按钮)、
六枚加载器 chip、说明一个像素都不在屏,实例名被挤成 35px 且降部被自身边框裁掉
(M222 D30 五审 `artifacts/m222/visual-verdict-r5-hold.md`)。

改法(把 M222 在 1180 档验证过的「面板先保预算、列表吃整行」落到窄档):

- `TailShare` 拆出第三支 `Narrow`(chips 档 + 面板占高度),`of()` 的三条 arm 与
  `Shared` 的机制注释按 r8 finding 重写(旧文档只写 M125 那一条条件);
- 新增 `CHIPS_STACK` 121 / `CHIPS_LIST_CHROME` 119 / `CHIPS_PANEL_BUDGET` 192 与
  `narrow_rows()`:720/760 下面板先拿预算,列表 = **132px = 3 整行**(M125 像素守门的下限);
- `options::section` 三分支:窄档钉死区**只留实例名**,head / 六枚 chip / 说明 / 版本菜单
  进滚动区(滚动区 120px ≥ 首屏 104,菜单露容器上沿 + 滚动条可见);
- `TailShare::list_height()` 把「列表吃多少」收到一处,两个装配点共用(三栏档行为不变)。

取舍:窄档列表 4 整行 → 3 整行;菜单从钉死改为可滚。理由(459px 里「钉住菜单」+「3 整行
列表」互斥)写在 `rows/tail.rs::CHIPS_PANEL_BUDGET`。

实测(tiny-skia 出图 + 自写 measure.py,DevDocs/artifacts/m227/):
720×760 分隔线 559→514、滚动区 0→120、head 539–578、chips 583–614(32px)、说明 623–634
(8.98:1 浅 / 10.83:1 深)、实例名 668–723 = 56px(inset 12/9/17);
700×760(options-fabric)实例名从「完全不在屏」回到 56px;四条像素守门全绿;
1180×760 浅/深/中 与 1180×900 **逐像素零变化**。
This commit is contained in:
AskaEth committed 2026-11-10 23:07:19 +08:00
1 parent 6c060a09e2
commit a70d5f8010
9 files changed
+331 -159

No files matched your search

@@ -146,7 +146,7 @@ fn the_demo_data_is_sane() {
assert!(demo.rows.iter().all(|row| !row.supporting.contains('版')));
}
/// 列表与尾部面板怎么分高:**档位 × 面板形态**两个条件同时成立才对半分。
/// 列表与尾部面板怎么分高:**档位 + 面板形态** → 三档之一(`Pinned` / `Shared` / `Narrow`)。
///
/// 修前(M123):面板一律按内容高钉在底部,700×760 的 chips 档里列表只剩 18px(0.4 行)。
/// M125 r1 修法只判档位,又踩出另一条回归:chips 档「刚进页面还没选版本」(`Hint`,面板只有
@@ -154,12 +154,14 @@ fn the_demo_data_is_sane() {
/// (复审 P2-1 实测;main 那一态是 **7 整行**——不是 8:第 8 条墨迹其实是
/// `Pick a version, then install` 那句 hint,横向范围对不上版本号。r2 修回 7 整行)。
///
/// 现在的判据:`Chips` **且**面板真占高度(`Options` / `Install`)才 `Shared`;
/// `Hint` 在任何档位都 `Pinned`。
/// 现在的判据(M227 重写,旧文档只写了 M125 那一条条件 —— r8 复审 improve finding):
/// ① `Chips` **且**面板真占高度(`Options` / `Install`)⇒ `Narrow`;
/// ② **任何档位**的 `Options` 只要带加载器版本列表 ⇒ `Shared`(三栏档只走这条);
/// ③ 其余(含 `Hint`)⇒ `Pinned`。
///
/// 抓得住:①chips 档改回「只判档位」(`Hint` 跟着对半分 ⇒ 列表掉到 4 行,像素守门
/// `ready::a_ready_shot_keeps_the_whole_visible_list` 立刻红);②三栏档也改成 `Shared`
/// (1180 下选项面板被切成一半,`an_options_shot_…` 会红)。
/// 抓得住:①chips 档改回「Pinned」(面板把列表压成缝 ⇒ 像素守门
/// `ready::a_ready_shot_keeps_the_whole_visible_list` / `chips::a_chips_tier_shot_…` 立刻红);
/// ②三栏档也改成 `Narrow`(1180 下钉死区少了菜单与说明,`an_options_shot_…` 的量测会红)。
/// 抓不住:**实际分到多少像素**(`iced` 的 `Element` 没有几何内省,那只能出图量)。
#[test]
fn the_chips_tier_shares_the_height_only_when_the_panel_takes_room() {
@@ -207,8 +209,8 @@ fn the_chips_tier_shares_the_height_only_when_the_panel_takes_room() {
assert_eq!(
TailShare::of(VersionRailTier::Chips, &panel_state(&options)),
TailShare::Shared,
"chips 档 + 选项区展开:对半分(列表 4 整行、面板自己可滚)"
TailShare::Narrow,
"chips 档 + 选项区展开:窄档预算(面板只钉实例名,列表 3 整行)"
);
assert_eq!(
TailShare::of(VersionRailTier::Chips, &panel_state(&hint)),