Skip to main content

dioxus_bulma/components/
buttons.rs

1use dioxus::prelude::*;
2use crate::theme::BulmaSize;
3use crate::utils::build_class;
4
5#[derive(Debug, Clone, Copy, PartialEq)]
6pub enum ButtonsAlignment {
7    Left,
8    Centered,
9    Right,
10}
11
12impl ButtonsAlignment {
13    pub fn as_class(&self) -> &'static str {
14        match self {
15            ButtonsAlignment::Left => "",
16            ButtonsAlignment::Centered => "is-centered",
17            ButtonsAlignment::Right => "is-right",
18        }
19    }
20}
21
22#[derive(Props, Clone, PartialEq)]
23pub struct ButtonsProps {
24    #[props(default)]
25    pub size: Option<BulmaSize>,
26    #[props(default)]
27    pub alignment: Option<ButtonsAlignment>,
28    #[props(default)]
29    pub addons: Option<bool>,
30    #[props(default)]
31    pub id: Option<String>,
32    #[props(default)]
33    pub class: Option<String>,
34    #[props(default)]
35    pub style: Option<String>,
36    pub children: Element,
37}
38
39#[component]
40pub fn Buttons(props: ButtonsProps) -> Element {
41    let size = props.size.unwrap_or_default();
42    let alignment = props.alignment.unwrap_or(ButtonsAlignment::Left);
43    let addons = props.addons.unwrap_or(false);
44
45    let base_classes = vec!["buttons"];
46
47    let optional_classes = vec![
48        if size != BulmaSize::Normal { Some(size.as_class().to_string()) } else { None },
49        if alignment != ButtonsAlignment::Left { Some(alignment.as_class().to_string()) } else { None },
50        if addons { Some("has-addons".to_string()) } else { None },
51        props.class.clone(),
52    ];
53
54    let final_class = build_class(&base_classes, &optional_classes);
55    let buttons_style = props.style.as_deref().unwrap_or("");
56
57    rsx! {
58        div {
59            class: "{final_class}",
60            style: "{buttons_style}",
61            id: props.id.clone(),
62            {props.children}
63        }
64    }
65}