dioxus_bulma/components/
field.rs1use 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}