dioxus_bootstrap/
toast.rs1use dioxus::prelude::*;
2
3#[derive(Clone, Props, PartialEq)]
4pub struct ToastProps {
5 #[props(optional)]
6 id: String,
7 #[props(optional, default = "".to_string())]
8 class: String,
9 #[props(optional, default = false)]
10 fade: bool,
11 #[props(optional, default = false)]
12 show: bool,
13 children: Element,
14}
15
16#[component]
17pub fn Toast(props: ToastProps) -> Element {
18 let mut class_list = vec!["toast".to_string()];
19
20 if props.fade {
21 class_list.push("fade".to_string());
22 }
23
24 if props.show {
25 class_list.push("show".to_string());
26 }
27
28 if !props.class.is_empty() {
29 class_list.push(props.class.clone());
30 }
31
32 let class_list = class_list.join(" ");
33
34 rsx! {
35 div {
36 id: props.id,
37 class: class_list,
38 role: "alert",
39 "aria-live": "assertive",
40 "aria-atomic": "true",
41 {props.children}
42 }
43 }
44}
45
46#[derive(Clone, Props, PartialEq)]
47pub struct ToastHeaderProps {
48 #[props(optional)]
49 id: String,
50 #[props(optional, default = "".to_string())]
51 class: String,
52 #[props(optional, default = true)]
53 close_button: bool,
54 children: Element,
55}
56
57#[component]
58pub fn ToastHeader(props: ToastHeaderProps) -> Element {
59 let mut class_list = vec!["toast-header".to_string()];
60
61 if !props.class.is_empty() {
62 class_list.push(props.class.clone());
63 }
64
65 let class_list = class_list.join(" ");
66
67 rsx! {
68 div {
69 id: props.id,
70 class: class_list,
71 {props.children}
72 if props.close_button {
73 button {
74 r#type: "button",
75 class: "btn-close",
76 "data-bs-dismiss": "toast",
77 "aria-label": "Close",
78 }
79 }
80 }
81 }
82}
83
84#[derive(Clone, Props, PartialEq)]
85pub struct ToastBodyProps {
86 #[props(optional)]
87 id: String,
88 #[props(optional, default = "".to_string())]
89 class: String,
90 children: Element,
91}
92
93#[component]
94pub fn ToastBody(props: ToastBodyProps) -> Element {
95 let mut class_list = vec!["toast-body".to_string()];
96
97 if !props.class.is_empty() {
98 class_list.push(props.class.clone());
99 }
100
101 let class_list = class_list.join(" ");
102
103 rsx! {
104 div {
105 id: props.id,
106 class: class_list,
107 {props.children}
108 }
109 }
110}
111
112#[derive(Clone, Props, PartialEq)]
113pub struct ToastContainerProps {
114 #[props(optional)]
115 id: String,
116 #[props(optional, default = "".to_string())]
117 class: String,
118 children: Element,
119}
120
121#[component]
122pub fn ToastContainer(props: ToastContainerProps) -> Element {
123 let mut class_list = vec!["toast-container".to_string()];
124
125 if !props.class.is_empty() {
126 class_list.push(props.class.clone());
127 }
128
129 let class_list = class_list.join(" ");
130
131 rsx! {
132 div {
133 id: props.id,
134 class: class_list,
135 {props.children}
136 }
137 }
138}