From 05e2e0911cff70a9f0a1cc8d707f952ce9f75845 Mon Sep 17 00:00:00 2001 From: Reed Krantz Date: Mon, 12 Jan 2026 19:31:57 -0600 Subject: [PATCH] feat(components): add the Input component --- src/components/input/component.rs | 54 +++++++++++++++++++++++++++++++ src/components/input/mod.rs | 2 ++ src/components/input/style.css | 39 ++++++++++++++++++++++ src/components/mod.rs | 3 ++ 4 files changed, 98 insertions(+) create mode 100644 src/components/input/component.rs create mode 100644 src/components/input/mod.rs create mode 100644 src/components/input/style.css diff --git a/src/components/input/component.rs b/src/components/input/component.rs new file mode 100644 index 0000000..5a1807e --- /dev/null +++ b/src/components/input/component.rs @@ -0,0 +1,54 @@ +use dioxus::prelude::*; + +#[component] +pub fn Input( + oninput: Option>, + onchange: Option>, + oninvalid: Option>, + onselect: Option>, + onselectionchange: Option>, + onfocus: Option>, + onblur: Option>, + onfocusin: Option>, + onfocusout: Option>, + onkeydown: Option>, + onkeypress: Option>, + onkeyup: Option>, + oncompositionstart: Option>, + oncompositionupdate: Option>, + oncompositionend: Option>, + oncopy: Option>, + oncut: Option>, + onpaste: Option>, + #[props(extends=GlobalAttributes)] + #[props(extends=input)] + attributes: Vec, + children: Element, +) -> Element { + rsx! { + document::Link { rel: "stylesheet", href: asset!("./style.css") } + input { + class: "input", + oninput: move |e| _ = oninput.map(|callback| callback(e)), + onchange: move |e| _ = onchange.map(|callback| callback(e)), + oninvalid: move |e| _ = oninvalid.map(|callback| callback(e)), + onselect: move |e| _ = onselect.map(|callback| callback(e)), + onselectionchange: move |e| _ = onselectionchange.map(|callback| callback(e)), + onfocus: move |e| _ = onfocus.map(|callback| callback(e)), + onblur: move |e| _ = onblur.map(|callback| callback(e)), + onfocusin: move |e| _ = onfocusin.map(|callback| callback(e)), + onfocusout: move |e| _ = onfocusout.map(|callback| callback(e)), + onkeydown: move |e| _ = onkeydown.map(|callback| callback(e)), + onkeypress: move |e| _ = onkeypress.map(|callback| callback(e)), + onkeyup: move |e| _ = onkeyup.map(|callback| callback(e)), + oncompositionstart: move |e| _ = oncompositionstart.map(|callback| callback(e)), + oncompositionupdate: move |e| _ = oncompositionupdate.map(|callback| callback(e)), + oncompositionend: move |e| _ = oncompositionend.map(|callback| callback(e)), + oncopy: move |e| _ = oncopy.map(|callback| callback(e)), + oncut: move |e| _ = oncut.map(|callback| callback(e)), + onpaste: move |e| _ = onpaste.map(|callback| callback(e)), + ..attributes, + {children} + } + } +} diff --git a/src/components/input/mod.rs b/src/components/input/mod.rs new file mode 100644 index 0000000..2590c01 --- /dev/null +++ b/src/components/input/mod.rs @@ -0,0 +1,2 @@ +mod component; +pub use component::*; diff --git a/src/components/input/style.css b/src/components/input/style.css new file mode 100644 index 0000000..9faf0c9 --- /dev/null +++ b/src/components/input/style.css @@ -0,0 +1,39 @@ +/* Input Styles */ +.input { + position: relative; + display: flex; + box-sizing: border-box; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding: 0.25rem; + padding: 8px 12px; + border: none; + border-radius: 0.5rem; + border-radius: calc(0.5rem); + background: none; + background-color: var(--light, var(--primary-color)) var(--dark, color-mix(in oklab, #FFFFFF26 30%, transparent)); + box-shadow: inset 0 0 0 1px var(--light, var(--primary-color-6)) + var(--dark, var(--primary-color-7)); + color: var(--secondary-color-4); + cursor: pointer; + gap: 0.25rem; + transition: background-color 100ms ease-out; +} + +.input::placeholder { + color: var(--secondary-color-5); +} + +.input:disabled { + color: var(--secondary-color-5); + cursor: not-allowed; +} + +.input:hover:not(:disabled), +.input:focus-visible { + background: var(--light, var(--primary-color-4)) + var(--dark, color-mix(in oklab, #FFFFFF26 50%, transparent)); + color: var(--secondary-color-1); + outline: none; +} diff --git a/src/components/mod.rs b/src/components/mod.rs index 57bc3b9..cdb5110 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -5,5 +5,8 @@ mod hero; pub use hero::Hero; +mod input; +pub use input::Input; + mod echo; pub use echo::Echo;