leptos_components/
input.rs1use components_core::{BASE_CLASS, concat};
2use leptos::prelude::*;
3use leptos::{IntoView, component, view};
4
5mod search;
6
7pub use search::{Filter, InputSearch};
8
9#[component]
10pub fn Input(
11 #[prop(into)] has_error: ReadSignal<bool>,
12 #[prop(into)] disabled: ReadSignal<bool>,
13 #[prop(into, optional)] class: String,
14 #[prop(into, optional)] error_message: String,
15 #[prop(into)] icon: Option<Children>,
16) -> impl IntoView {
17 let input_class = crate::tw!(
18 concat!(BASE_CLASS, "-input"),
19 has_error
20 .get()
21 .then_some(concat!(BASE_CLASS, "-input--error")),
22 class
23 );
24
25 view! {
26 <div class={concat!(BASE_CLASS, "-input__container")}>
27 <div class=input_class>
28 {icon.map(|icon| view! { <span class={concat!(BASE_CLASS, "-input__icon")}>{icon()}</span> })}
29 <input
30 class={concat!(BASE_CLASS, "-input__inner")}
31 disabled=disabled.get()
32 />
33 </div>
34 {has_error.get().then_some(
35 view! { <span class={concat!(BASE_CLASS, "-input__error")}>{error_message}</span> }
36 )}
37 </div>
38 }
39}