layoutcss_parser/components/
icon.rs

1use indoc::formatdoc;
2use std::collections::HashSet;
3
4use crate::harmonic::get_harmonic;
5
6const ICON_STYLE: &str = r#"
7icon-l{
8    display: inline-block;
9    width: fit-content;
10    vertical-align: middle;
11}
12
13icon-l > :nth-child(1) {
14    height: 0.75em;
15    width: auto;
16}
17"#;
18
19fn icon_scale_style(value: &str, harmonic: String) -> String {
20    formatdoc!(
21        r#"
22        icon-l[layout*="scale:{value}"] >:nth-child(1){{
23            height: {harmonic};
24        }}
25        "#,
26    )
27}
28
29fn icon_align_style(value: &str) -> String {
30    formatdoc!(
31        r#"
32        icon-l[layout~="align:{value}"]{{
33            vertical-align: {value};
34        }}
35        "#,
36    )
37}
38
39fn icon_group_style(
40    value: &str,
41    gap_dir_selector: &str,
42    gap_dir: &str,
43    opposite_dir: &str,
44    harmonic: String,
45) -> String {
46    formatdoc!(
47        r#"
48        icon-l{gap_dir_selector}[layout*="gap:{value}"] >:nth-child(1){{
49            margin-inline-{gap_dir}: {harmonic};
50            margin-inline-{opposite_dir}: initial;
51        }}
52        "#,
53    )
54}
55
56pub fn icon_css(
57    scale: Option<&str>,
58    align: Option<&str>,
59    gap_dir: Option<&str>,
60    gap: Option<&str>,
61    harmonic_ratio: f64,
62    set: &mut HashSet<String>,
63) {
64    set.insert(ICON_STYLE.to_string());
65    if let Some(value) = scale {
66        let harmonic_value = get_harmonic(&value, harmonic_ratio);
67        set.insert(icon_scale_style(value, harmonic_value));
68    }
69    if let Some(value) = align {
70        set.insert(icon_align_style(value));
71    }
72    if let Some(value) = gap {
73        let harmonic_value = get_harmonic(value, harmonic_ratio);
74        let gap_dir = match gap_dir {
75            Some("end") => "end",
76            _ => "start",
77        };
78        let gap_dir_selector = if gap_dir == "end" {
79            r#"[layout*="gap-dir:end"]"#
80        } else {
81            ""
82        };
83        let opposite_dir = if gap_dir == "end" { "start" } else { "end" };
84        set.insert(icon_group_style(
85            value,
86            gap_dir_selector,
87            gap_dir,
88            opposite_dir,
89            harmonic_value,
90        ));
91    }
92}