Skip to main content

dioxus_bulma/components/
field.rs

1use dioxus::prelude::*;
2use crate::utils::build_class;
3
4#[derive(Props, Clone, PartialEq)]
5pub struct FieldProps {
6    #[props(default)]
7    pub grouped: Option<bool>,
8    #[props(default)]
9    pub addons: Option<bool>,
10    #[props(default)]
11    pub horizontal: Option<bool>,
12    #[props(default)]
13    pub id: Option<String>,
14    #[props(default)]
15    pub class: Option<String>,
16    #[props(default)]
17    pub style: Option<String>,
18    pub children: Element,
19}
20
21#[component]
22pub fn Field(props: FieldProps) -> Element {
23    let grouped = props.grouped.unwrap_or(false);
24    let addons = props.addons.unwrap_or(false);
25    let horizontal = props.horizontal.unwrap_or(false);
26    
27    let base_classes = vec!["field"];
28    let optional_classes = vec![
29        if grouped { Some("is-grouped".to_string()) } else { None },
30        if addons { Some("has-addons".to_string()) } else { None },
31        if horizontal { Some("is-horizontal".to_string()) } else { None },
32        props.class.clone(),
33    ];
34    
35    let final_class = build_class(&base_classes, &optional_classes);
36    let field_style = props.style.as_deref().unwrap_or("");
37
38    rsx! {
39        div {
40            class: "{final_class}",
41            style: "{field_style}",
42            id: props.id.clone(),
43            {props.children}
44        }
45    }
46}
47
48#[derive(Props, Clone, PartialEq)]
49pub struct LabelProps {
50    #[props(default)]
51    pub id: Option<String>,
52    #[props(default)]
53    pub class: Option<String>,
54    #[props(default)]
55    pub style: Option<String>,
56    pub children: Element,
57}
58
59#[component]
60pub fn Label(props: LabelProps) -> Element {
61    let base_classes = vec!["label"];
62    let optional_classes = vec![props.class.clone()];
63    let final_class = build_class(&base_classes, &optional_classes);
64    let label_style = props.style.as_deref().unwrap_or("");
65
66    rsx! {
67        label {
68            class: "{final_class}",
69            style: "{label_style}",
70            id: props.id.clone(),
71            {props.children}
72        }
73    }
74}
75
76#[derive(Props, Clone, PartialEq)]
77pub struct HelpProps {
78    #[props(default)]
79    pub color: Option<crate::theme::BulmaColor>,
80    #[props(default)]
81    pub id: Option<String>,
82    #[props(default)]
83    pub class: Option<String>,
84    #[props(default)]
85    pub style: Option<String>,
86    pub children: Element,
87}
88
89#[component]
90pub fn Help(props: HelpProps) -> Element {
91    let base_classes = vec!["help"];
92    let optional_classes = vec![
93        props.color.map(|c| format!("is-{}", c.as_str())),
94        props.class.clone(),
95    ];
96    
97    let final_class = build_class(&base_classes, &optional_classes);
98    let help_style = props.style.as_deref().unwrap_or("");
99
100    rsx! {
101        p {
102            class: "{final_class}",
103            style: "{help_style}",
104            id: props.id.clone(),
105            {props.children}
106        }
107    }
108}