use dioxus::prelude::*;
use crate::types::Color;
#[derive(Clone, PartialEq, Props)]
pub struct ProgressProps {
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn Progress(props: ProgressProps) -> Element {
let full_class = if props.class.is_empty() {
"progress".to_string()
} else {
format!("progress {}", props.class)
};
rsx! {
div { class: "{full_class}", ..props.attributes, {props.children} }
}
}
#[derive(Clone, PartialEq, Props)]
pub struct ProgressBarProps {
#[props(default)]
pub value: f64,
#[props(default)]
pub color: Option<Color>,
#[props(default)]
pub striped: bool,
#[props(default)]
pub animated: bool,
#[props(default)]
pub show_label: bool,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
}
#[component]
pub fn ProgressBar(props: ProgressBarProps) -> Element {
let color_class = match &props.color {
Some(c) => format!(" bg-{c}"),
None => String::new(),
};
let striped = if props.striped || props.animated {
" progress-bar-striped"
} else {
""
};
let animated = if props.animated {
" progress-bar-animated"
} else {
""
};
let full_class = if props.class.is_empty() {
format!("progress-bar{color_class}{striped}{animated}")
} else {
format!(
"progress-bar{color_class}{striped}{animated} {}",
props.class
)
};
let width = format!("width: {}%", props.value);
let label = if props.show_label {
format!("{}%", props.value as u32)
} else {
String::new()
};
rsx! {
div {
class: "{full_class}",
role: "progressbar",
style: "{width}",
"aria-valuenow": "{props.value}",
"aria-valuemin": "0",
"aria-valuemax": "100",
..props.attributes,
"{label}"
}
}
}