dioxus_bootstrap_css/
spinner.rs1use dioxus::prelude::*;
2
3use crate::types::{Color, Size, SpinnerStyle};
4
5#[derive(Clone, PartialEq, Props)]
27pub struct SpinnerProps {
28 #[props(default)]
30 pub color: Option<Color>,
31 #[props(default)]
33 pub size: Size,
34 #[props(default)]
36 pub style: SpinnerStyle,
37 #[props(default)]
39 pub class: String,
40 #[props(extends = GlobalAttributes)]
42 attributes: Vec<Attribute>,
43 #[props(default)]
45 pub children: Element,
46}
47
48#[component]
49pub fn Spinner(props: SpinnerProps) -> Element {
50 let base = match props.style {
51 SpinnerStyle::Border => "spinner-border",
52 SpinnerStyle::Grow => "spinner-grow",
53 };
54
55 let size_class = match props.size {
56 Size::Sm => format!(" {base}-sm"),
57 _ => String::new(),
58 };
59
60 let color_class = match &props.color {
61 Some(c) => format!(" text-{c}"),
62 None => String::new(),
63 };
64
65 let full_class = if props.class.is_empty() {
66 format!("{base}{size_class}{color_class}")
67 } else {
68 format!("{base}{size_class}{color_class} {}", props.class)
69 };
70
71 rsx! {
72 div {
73 class: "{full_class}",
74 role: "status",
75 ..props.attributes,
76 span { class: "visually-hidden", {props.children} }
77 }
78 }
79}