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(extends = GlobalAttributes)]
38 attributes: Vec<Attribute>,
39 #[props(default)]
41 pub children: Element,
42}
43
44#[component]
45pub fn Spinner(props: SpinnerProps) -> Element {
46 let base = match props.style {
47 SpinnerStyle::Border => "spinner-border",
48 SpinnerStyle::Grow => "spinner-grow",
49 };
50
51 let size_class = match props.size {
52 Size::Sm => format!(" {base}-sm"),
53 _ => String::new(),
54 };
55
56 let color_class = match &props.color {
57 Some(c) => format!(" text-{c}"),
58 None => String::new(),
59 };
60
61 let full_class = if props.class.is_empty() {
62 format!("{base}{size_class}{color_class}")
63 } else {
64 format!("{base}{size_class}{color_class} {}", props.class)
65 };
66
67 rsx! {
68 div {
69 class: "{full_class}",
70 role: "status",
71 ..props.attributes,
72 span { class: "visually-hidden", {props.children} }
73 }
74 }
75}