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