Skip to main content

dioxus_bulma/components/
progress.rs

1use dioxus::prelude::*;
2use crate::theme::{BulmaColor, BulmaSize};
3use crate::utils::build_class;
4
5#[derive(Props, Clone, PartialEq)]
6pub struct ProgressProps {
7    #[props(default)]
8    pub value: Option<f32>,
9    #[props(default = 100.0)]
10    pub max: f32,
11    #[props(default)]
12    pub color: Option<BulmaColor>,
13    #[props(default)]
14    pub size: Option<BulmaSize>,
15    #[props(default)]
16    pub id: Option<String>,
17    #[props(default)]
18    pub class: Option<String>,
19    #[props(default)]
20    pub style: Option<String>,
21    pub children: Element,
22}
23
24#[component]
25pub fn Progress(props: ProgressProps) -> Element {
26    let size = props.size.unwrap_or_default();
27
28    let base_classes = vec!["progress"];
29    let optional_classes = vec![
30        props.color.map(|c| format!("is-{}", c.as_str())),
31        if size != BulmaSize::Normal { Some(size.as_class().to_string()) } else { None },
32        props.class.clone(),
33    ];
34
35    let final_class = build_class(&base_classes, &optional_classes);
36    let progress_style = props.style.as_deref().unwrap_or("");
37    let value_str = props.value.map(|v| v.to_string());
38    let max_str = props.max.to_string();
39
40    rsx! {
41        progress {
42            class: "{final_class}",
43            style: "{progress_style}",
44            id: props.id.clone(),
45            value: value_str.as_deref(),
46            max: "{max_str}",
47            if props.value.is_some() {
48                {props.children}
49            } else if let Some(value) = props.value {
50                "{value}%"
51            }
52        }
53    }
54}