dioxus-bootstrap 0.7.1

A set of Bootstrap-based components for Dioxus.
Documentation
use dioxus::prelude::*;

#[derive(Clone, Props, PartialEq)]
pub struct ToastProps {
    #[props(optional)]
    id: String,
    #[props(optional, default = "".to_string())]
    class: String,
    #[props(optional, default = false)]
    fade: bool,
    #[props(optional, default = false)]
    show: bool,
    children: Element,
}

#[component]
pub fn Toast(props: ToastProps) -> Element {
    let mut class_list = vec!["toast".to_string()];
    
    if props.fade {
        class_list.push("fade".to_string());
    }
    
    if props.show {
        class_list.push("show".to_string());
    }
    
    if !props.class.is_empty() {
        class_list.push(props.class.clone());
    }
    
    let class_list = class_list.join(" ");
    
    rsx! {
        div {
            id: props.id,
            class: class_list,
            role: "alert",
            "aria-live": "assertive",
            "aria-atomic": "true",
            {props.children}
        }
    }
}

#[derive(Clone, Props, PartialEq)]
pub struct ToastHeaderProps {
    #[props(optional)]
    id: String,
    #[props(optional, default = "".to_string())]
    class: String,
    #[props(optional, default = true)]
    close_button: bool,
    children: Element,
}

#[component]
pub fn ToastHeader(props: ToastHeaderProps) -> Element {
    let mut class_list = vec!["toast-header".to_string()];
    
    if !props.class.is_empty() {
        class_list.push(props.class.clone());
    }
    
    let class_list = class_list.join(" ");
    
    rsx! {
        div {
            id: props.id,
            class: class_list,
            {props.children}
            if props.close_button {
                button {
                    r#type: "button",
                    class: "btn-close",
                    "data-bs-dismiss": "toast",
                    "aria-label": "Close",
                }
            }
        }
    }
}

#[derive(Clone, Props, PartialEq)]
pub struct ToastBodyProps {
    #[props(optional)]
    id: String,
    #[props(optional, default = "".to_string())]
    class: String,
    children: Element,
}

#[component]
pub fn ToastBody(props: ToastBodyProps) -> Element {
    let mut class_list = vec!["toast-body".to_string()];
    
    if !props.class.is_empty() {
        class_list.push(props.class.clone());
    }
    
    let class_list = class_list.join(" ");
    
    rsx! {
        div {
            id: props.id,
            class: class_list,
            {props.children}
        }
    }
}

#[derive(Clone, Props, PartialEq)]
pub struct ToastContainerProps {
    #[props(optional)]
    id: String,
    #[props(optional, default = "".to_string())]
    class: String,
    children: Element,
}

#[component]
pub fn ToastContainer(props: ToastContainerProps) -> Element {
    let mut class_list = vec!["toast-container".to_string()];
    
    if !props.class.is_empty() {
        class_list.push(props.class.clone());
    }
    
    let class_list = class_list.join(" ");
    
    rsx! {
        div {
            id: props.id,
            class: class_list,
            {props.children}
        }
    }
}