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