//! **反馈类家族**:Progress(§12)/ Snackbar(§14)/ Dialog(§7)/ EmptyState(§15)。 //! //! ## 接口(契约 §2 + §8:官方名的小写形式,对消息类型泛型,不 import `app::Message`) //! //! | 组件 | 入口 | 消息要求 | //! |---|---|---| //! | 线性进度 | [`linear(ui, Progress::determinate(0.5))`](linear) | **无消息**(进度不可点) | //! | 环形进度 | [`circular(ui, Progress::indeterminate(phase))`](circular) | **无消息** | //! | 提示条 | [`snackbar(ui, Snackbar::new("…").action("撤销", msg))`](snackbar) | 有动作/关闭时才要 `M` | //! | 对话框 | [`dialog(ui, Dialog::new("标题", "正文").double(..))`](dialog) | 有动作时要 `M` | //! | 空态 | [`empty_state(ui, EmptyState::new(icon, "标题", "说明"))`](empty_state) | 有 CTA 时要 `M` | //! //! 全部 `M: Clone + 'a`(与按钮家族同一口径),`Ui` 一律 `&'a Ui` 传入、组件内不 `Ui::new`。 //! //! ## 三条硬口径(每个组件文件开头各有一套细则表) //! //! 1. **数值来自哪里**:颜色/字级/圆角/内距走令牌(`Role` / `TypeRole` / `ShapeScale` / `Space`), //! 进度厚度、Snackbar 宽高、Dialog 宽、空态块这四组令牌层没有 → 登记 **G17**([`geometry`])。 //! 2. **状态层只有一处**:hover/pressed 的叠色一律经 [`interaction::overlay_color`], //! 禁用内容一律经 [`interaction::disabled_content_over_role`]; //! 禁用是**状态**(`on_press: Option` 为 `None`),不是另一个构造器(M77 之前 Chip 踩过)。 //! 3. **精确尺寸经 `layout`**:图标/几何图元一律 `layout::fixed` / `layout::centered_fixed`(Q9), //! 居中一律父级 `align_x/align_y`(Q8,不许 `center_*`)。 //! //! ## CPU 降级(D27)与「不画阴影」 //! //! 本家族零模糊、零运行时半透明:进度条是实色、Dialog 的 scrim 是**预合成实色** //! ([`scrim`]),两个浮层都不画阴影(`ShadowSpec` 还是 M63 占位值 + D27 禁模糊)。 //! 三条偏离逐条登记在报告里(D-1 无阴影 / D-2 scrim 预合成 / D-3 波浪未实现)。 //! //! ## 逐项偏离登记(提交报告里同一份表) //! //! | 编号 | 参考 | 我们 | 理由 | 可修 | //! |---|---|---|---|---| //! | D-1 | Dialog L3 阴影 | 无阴影 | D27 CPU 禁模糊 + `ShadowSpec` 为 M63 占位 | 是(等 M63 阴影表 + 双档渲染) | //! | D-2 | scrim 真半透明 @0.32 | 预合成实色 | D27 CPU 零半透明;遮罩下是底色时逐像素等价 | 是(GPU 档可切真 α) | //! | D-3 | 线性波浪 3/40、环形 1.6/15 | 直线段 / 等弧长 | `12b §12.4` 明确允许,登记后用匀速替代 | 是 | //! | D-4 | Snackbar L3 阴影 | 无阴影 | 同 D-1 | 是 | //! | G17-d | Snackbar 最小宽 344 | 组件不强制(宿主保证) | iced `Length` 无 min-width(同按钮 G15) | 是(自定义 Widget) | //! //! ## 文件地图 //! //! ```text //! geometry.rs G17 常量 + 五组几何(含不定态 keyframes) //! keyframes.rs 相位 → 进度 的纯函数求值器(组件不计时) //! progress.rs linear / circular(含环形 SVG 图元) //! snackbar.rs 提示条 + 贴顶/贴底 //! dialog.rs 对话框 + scrim //! empty_state.rs 空态(项目自定,全部 [估]) //! action.rs 文字动作 / 图标动作(Dialog 与 Snackbar 共用) //! gallery_parts.rs 家族自己的 gallery 段落开关(`ULL_FEEDBACK_PART`) //! probe.rs 渲染层像素断言(对着 gallery 截图量,见其模块文档) //! ``` //! //! ## 桩期的 `demo()` 已删除(不是签名被改) //! //! M75 的占位 `demo()` 只画一行「pending」文字,没有任何验收价值;真组件的验收画面就是 //! `gallery/feedback.rs` 的四段矩阵。契约 §9.3「家族 `demo()` 签名是共享契约」约束的是 //! **别改别人的调用点**——`feedback::demo` 自始至终只有 `gallery/feedback.rs` 一个调用点, //! 而那个文件就在本 mission 的 scope 内,所以这里连同调用点一起换成了真组件(不留死代码: //! 一个没人调用的 `pub fn` 会直接触发 `dead_code`,`-D warnings` 门禁会红)。 mod action; pub mod dialog; pub mod empty_state; pub mod gallery_parts; pub mod geometry; pub mod keyframes; pub mod panel; pub mod progress; pub mod snackbar; #[cfg(test)] mod pixel; #[cfg(test)] mod probe; #[cfg(test)] mod tests; pub use dialog::{dialog, scrimmed, Dialog}; pub use empty_state::{empty_state, EmptyState}; pub use progress::{circular, linear, Progress}; pub use snackbar::{snackbar, Placement, Snackbar};