leptos_components/
input.rs

1use 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}