Skip to main content

zero_tui/
layout.rs

1//! Responsive layout per spec ยง4.4.
2//!
3//! Width bands:
4//!   - `>=120` full status bar, live-stream pane visible
5//!   - `80..120` compact status bar, live-stream toggleable
6//!   - `60..80` minimal status bar, live-stream off
7//!   - `<60` degraded warning
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum Width {
11    Full,
12    Compact,
13    Minimal,
14    Degraded,
15}
16
17impl Width {
18    #[must_use]
19    pub const fn classify(cols: u16) -> Self {
20        if cols >= 120 {
21            Self::Full
22        } else if cols >= 80 {
23            Self::Compact
24        } else if cols >= 60 {
25            Self::Minimal
26        } else {
27            Self::Degraded
28        }
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::Width;
35
36    #[test]
37    fn bands() {
38        assert_eq!(Width::classify(200), Width::Full);
39        assert_eq!(Width::classify(120), Width::Full);
40        assert_eq!(Width::classify(119), Width::Compact);
41        assert_eq!(Width::classify(80), Width::Compact);
42        assert_eq!(Width::classify(79), Width::Minimal);
43        assert_eq!(Width::classify(60), Width::Minimal);
44        assert_eq!(Width::classify(59), Width::Degraded);
45    }
46}