视觉复审在 M68 的判词是不能把「全宽单卡」当页面模板(1180 宽下正文单行 712px ≈ 118 字符)。 本 mission 把它落成一套**布局系统**,四个页面只是它的用例: - `pages/layout.rs`:官方 600 / 840 两个档位 → 三种版面(单列 / supporting-pane / list-detail), 阈值由列宽和算出(设置 240+24+320 → 720;实例 336+24+320 → 816 ≤ 840),行宽硬上限 14 × 0.5em × 72 = **504px**,全部是纯函数,`pages/layout/tests.rs` 用绝对值和边界表钉死。 - `pages/frame.rs`:页头(56 / 两行 84)+ 内容列(≤504)+ 两列骨架 + 空态位; `pages/frame/pieces.rs` 是占位控件(卡片 / 分隔线 / 文本按钮 / 图标),令牌驱动、无完整状态机, 待 M75 的 components 家族合入后替换。 - 四页:实例(list-detail,列表列 336 独立滚动,窄窗退化成整页切换)、 设置(supporting-pane,240 分组导航 + ≤504 表单列)、下载 / 日志(单列,两行页头)。 - `pages/harness.rs` + `examples/pages_demo.rs`:自带 `--screen/--width/--screenshot-theme`, 不碰 `cli.rs` / `app.rs`(M75 在改)。 偏离与说明: - 布局用「页边距 16/24」而非 16/24/32,官方 expanded 也是 24(少一条偏离登记); - 实例空详情态一屏会有 5 档字号(22/16/24/12 + 14 的操作按钮),未截图的状态,已知并登记; - `lib.rs` 只加一行 `pub mod pages;`。
50 lines
1.7 KiB
Rust
50 lines
1.7 KiB
Rust
//! `instances` 的断言:演示数据与窄窗退化。
|
|
use super::*;
|
|
|
|
use super::super::layout::{frame_metrics, measure_cap_px, PaneKit, WidthClass};
|
|
|
|
#[test]
|
|
fn demo_rows_overflow_the_visible_list() {
|
|
// 列表列要能滚动:条目数必须让内容高过可视区(760 窗高 − 标题栏 48 − 页头 84 − 页边距)
|
|
let visible = 760.0 - 48.0 - 84.0 - 2.0 * WidthClass::Expanded.gutter();
|
|
let row_height = 44.0 + Space::X3.dp();
|
|
let content = DEMO.len() as f32 * row_height;
|
|
assert!(
|
|
content > visible,
|
|
"列表内容 {content} 不比可视区 {visible} 高,截图里看不到独立滚动条"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn every_demo_entry_has_name_version_and_loader() {
|
|
for entry in &DEMO {
|
|
assert!(!entry.name.is_empty());
|
|
assert!(!entry.version.is_empty());
|
|
assert!(!entry.loader.is_empty());
|
|
}
|
|
assert!(SELECTED < DEMO.len());
|
|
}
|
|
|
|
#[test]
|
|
fn detail_paragraph_is_long_enough_to_wrap() {
|
|
// 行宽上限 ≈ 72 字符/行;写够几行才看得出断行位置
|
|
assert!(NOTE.len() > 200, "正文档太短,看不出行宽上限");
|
|
}
|
|
|
|
#[test]
|
|
fn narrow_widths_switch_the_page_to_one_column() {
|
|
// 1180 / 900 → 两列;700 → 单列(整页切换)
|
|
assert_eq!(
|
|
frame_metrics(PaneKit::ListDetail, 1180.0).layout,
|
|
PageLayout::ListDetail
|
|
);
|
|
assert_eq!(
|
|
frame_metrics(PaneKit::ListDetail, 700.0).layout,
|
|
PageLayout::SingleColumn
|
|
);
|
|
// 窄窗下详情不吃满窗口:正文列仍 ≤ 行宽上限
|
|
let narrow = frame_metrics(PaneKit::ListDetail, 700.0);
|
|
assert!(narrow.column <= measure_cap_px() + f32::EPSILON);
|
|
assert!(narrow.secondary.is_none());
|
|
}
|