leptos_shadcn_checkbox/
default.rs1use leptos::{ev::Event, prelude::*};
2use leptos_style::Style;
3use leptos::wasm_bindgen::JsCast;
4
5pub const CHECKBOX_CLASS: &str = "h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground";
6
7#[component]
8pub fn Checkbox(
9 #[prop(into, optional)] checked: Signal<bool>,
10 #[prop(into, optional)] on_change: Option<Callback<bool>>,
11 #[prop(into, optional)] disabled: Signal<bool>,
12 #[prop(into, optional)] class: MaybeProp<String>,
13 #[prop(into, optional)] id: MaybeProp<String>,
14 #[prop(into, optional)] style: Signal<Style>,
15) -> impl IntoView {
16 let handle_change = {
17 let on_change = on_change.clone();
18 move |event: Event| {
19 if let Some(callback) = &on_change {
20 let target = event.target().unwrap();
21 let input = target.unchecked_into::<web_sys::HtmlInputElement>();
22 callback.run(input.checked());
23 }
24 }
25 };
26
27 let computed_class = Signal::derive(move || {
28 format!("{} {}", CHECKBOX_CLASS, class.get().unwrap_or_default())
29 });
30
31 view! {
32 <input
33 r#type="checkbox"
34 checked=move || checked.get()
35 disabled=move || disabled.get()
36 class=move || computed_class.get()
37 id=move || id.get().unwrap_or_default()
38 style=move || style.get().to_string()
39 on:change=handle_change
40 />
41 }
42}