dioxus_tw_components/components/
toggle.rs1use dioxus::prelude::*;
2
3#[derive(Clone, PartialEq, Props)]
4pub struct ToggleProps {
5 #[props(extends = button, extends = GlobalAttributes)]
6 attributes: Vec<Attribute>,
7 #[props(optional)]
8 checked: Option<bool>,
9
10 #[props(optional)]
11 onclick: EventHandler<MouseEvent>,
12
13 children: Element,
14}
15
16#[component]
17pub fn Toggle(mut props: ToggleProps) -> Element {
18 let default_classes = "toggle";
19 crate::setup_class_attribute(&mut props.attributes, default_classes);
20
21 let mut interior_sig = use_signal(|| props.checked.unwrap_or_default());
22
23 let onclick = move |event| {
24 interior_sig.toggle();
25 props.onclick.call(event);
26 };
27
28 rsx! {
29 button {
30 "data-state": if interior_sig() { "checked" } else { "unchecked" },
31 r#type: "button",
32 onclick,
33 ..props.attributes,
34 span { class: "toggle-thumb" }
35 {props.children}
36 }
37 }
38}