layoutcss_parser/components/
icon.rs1use 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}