layoutcss_parser/components/
switcher.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use indoc::formatdoc;
use crate::harmonic::get_harmonic;

use std::collections::HashSet;
const SWITCHER_STYLE: &str = r#"
 switcher-l{
    display: flex;
    flex-wrap: wrap;
  }

  switcher-l > *:not(outsider-l){
      flex-grow: 1;
  }
"#;

const SWITCHER_REVERSE_STYLE: &str = r#"
  switcher-l[layout~="reverse"]{
    flex-wrap: wrap-reverse;
  }
"#;

fn switcher_threshold_style(value: &str) -> String {
    formatdoc!(
        r#"
        switcher-l[layout~="threshold:{value}"] > *:not(outsider-l) {{
            flex-basis: calc(({value} - 100%) * 999);
        }}
        "#,
    )
}

fn switcher_limit_style(value: &str) -> String {
    formatdoc!(
        r#"
        switcher-l[layout~="limit:{value}"] > :nth-last-child(n+{value}):not(outsider-l),
        switcher-l[layout~="limit:{value}"] > :nth-last-child(n+{value}) ~ *:not(outsider-l){{
            flex-basis: 100%;
        }}
        "#,
    )
}

fn switcher_gap_style(value: &str, harmonic: f64) -> String {
    formatdoc!(
        r#"
        switcher-l[layout~="gap:{value}"]{{
            gap: {harmonic:.2}rem;
        }}
        "#,
    )
}

fn switcher_gap_x_style(value: &str, harmonic: f64) -> String {
    formatdoc!(
        r#"
        switcher-l[layout~="gap-x:{value}"]{{
            column-gap: {harmonic:.2}rem;
        }}
        "#,
    )
}

fn switcher_gap_y_style(value: &str, harmonic: f64) -> String {
    formatdoc!(
        r#"
        switcher-l[layout~="gap-y:{value}"]{{
            row-gap: {harmonic:.2}rem;
        }}
        "#,
    )
}

pub fn switcher_css(
    threshold: Option<&str>,
    limit: Option<&str>,
    reverse: bool,
    gap: Option<&str>,
    gap_x: Option<&str>,
    gap_y: Option<&str>,
    harmonic_ratio: f64,
    set: &mut HashSet<String>,
) {
    set.insert(SWITCHER_STYLE.to_string());
    if let Some(value) = threshold {
        set.insert(switcher_threshold_style(value));
    }
    if let Some(value) = limit {
        set.insert(switcher_limit_style(value));
    }
    if reverse {
        set.insert(SWITCHER_REVERSE_STYLE.to_string());
    }
    if let Some(value) = gap {
        let harmonic_value = get_harmonic(value, harmonic_ratio);
        set.insert(switcher_gap_style(value, harmonic_value));
    }
    if let Some(ref value) = gap_x {
        let harmonic_value = get_harmonic(value, harmonic_ratio);
        set.insert(switcher_gap_x_style(value, harmonic_value));
    }
    if let Some(ref value) = gap_y {
        let harmonic_value = get_harmonic(value, harmonic_ratio);
        set.insert(switcher_gap_y_style(value, harmonic_value));
    }
}