diff --git a/Cargo.lock b/Cargo.lock
index aa3ba82..1f7e0f4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3498,6 +3498,7 @@ dependencies = [
"shadcn-ui-leptos-badge",
"shadcn-ui-leptos-button",
"shadcn-ui-leptos-card",
+ "shadcn-ui-leptos-textarea",
]
[[package]]
@@ -3522,6 +3523,17 @@ dependencies = [
"tailwind_fuse",
]
+[[package]]
+name = "shadcn-ui-leptos-textarea"
+version = "0.0.1"
+dependencies = [
+ "leptos 0.7.2",
+ "leptos-node-ref",
+ "leptos-style",
+ "shadcn-ui-leptos-utils",
+ "tailwind_fuse",
+]
+
[[package]]
name = "shadcn-ui-leptos-utils"
version = "0.0.1"
diff --git a/book-examples/leptos/Cargo.toml b/book-examples/leptos/Cargo.toml
index d93efac..59c5ab0 100644
--- a/book-examples/leptos/Cargo.toml
+++ b/book-examples/leptos/Cargo.toml
@@ -21,6 +21,7 @@ shadcn-ui-leptos-alert = { path = "../../packages/leptos/alert" , optional = tru
shadcn-ui-leptos-badge = { path = "../../packages/leptos/badge", optional = true }
shadcn-ui-leptos-button = { path = "../../packages/leptos/button", optional = true }
shadcn-ui-leptos-card = { path = "../../packages/leptos/card", optional = true }
+shadcn-ui-leptos-textarea = { path = "../../packages/leptos/textarea", optional = true }
[features]
default = [
@@ -28,6 +29,7 @@ default = [
"badge",
"button",
"card",
+ "textarea",
]
alert = [
"dep:lucide-leptos",
@@ -45,3 +47,7 @@ card = [
"dep:shadcn-ui-leptos-button",
"dep:shadcn-ui-leptos-card",
]
+textarea = [
+ "dep:shadcn-ui-leptos-button",
+ "dep:shadcn-ui-leptos-textarea",
+]
\ No newline at end of file
diff --git a/book-examples/leptos/src/default.rs b/book-examples/leptos/src/default.rs
index a3148f2..5609981 100644
--- a/book-examples/leptos/src/default.rs
+++ b/book-examples/leptos/src/default.rs
@@ -8,6 +8,8 @@ mod badge;
mod button;
#[cfg(feature = "card")]
mod card;
+#[cfg(feature = "textarea")]
+mod textarea;
use leptos::prelude::*;
use leptos_router::{
@@ -34,6 +36,10 @@ pub fn Default() -> impl MatchNestedRoutes + Clone {
{
component_view(self::card::CardRoutes, ())
},
+ #[cfg(feature = "textarea")]
+ {
+ component_view(self::textarea::TextareaRoutes, ())
+ },
);
view! {
diff --git a/book-examples/leptos/src/default/components/ui.rs b/book-examples/leptos/src/default/components/ui.rs
index a95ce66..d2ba243 100644
--- a/book-examples/leptos/src/default/components/ui.rs
+++ b/book-examples/leptos/src/default/components/ui.rs
@@ -8,3 +8,5 @@ pub use shadcn_ui_leptos_badge::default as badge;
pub use shadcn_ui_leptos_button::default as button;
#[cfg(feature = "card")]
pub use shadcn_ui_leptos_card::default as card;
+#[cfg(feature = "textarea")]
+pub use shadcn_ui_leptos_textarea::default as textarea;
diff --git a/book-examples/leptos/src/default/textarea.rs b/book-examples/leptos/src/default/textarea.rs
new file mode 100644
index 0000000..7c43f89
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea.rs
@@ -0,0 +1,28 @@
+#[allow(clippy::module_inception)]
+mod textarea;
+mod textarea_disabled;
+mod textarea_form;
+mod textarea_with_button;
+mod textarea_with_label;
+mod textarea_with_text;
+
+use leptos::prelude::*;
+use leptos_router::{
+ components::{Outlet, ParentRoute, Route},
+ path, MatchNestedRoutes,
+};
+
+#[component(transparent)]
+pub fn TextareaRoutes() -> impl MatchNestedRoutes + Clone {
+ view! {
+
+
+
+
+
+
+
+
+ }
+ .into_inner()
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea.rs b/book-examples/leptos/src/default/textarea/textarea.rs
new file mode 100644
index 0000000..21a7227
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea_disabled.rs b/book-examples/leptos/src/default/textarea/textarea_disabled.rs
new file mode 100644
index 0000000..2e98d8e
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea_disabled.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaDisabledDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea_form.rs b/book-examples/leptos/src/default/textarea/textarea_form.rs
new file mode 100644
index 0000000..6939638
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea_form.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaFormDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea_with_button.rs b/book-examples/leptos/src/default/textarea/textarea_with_button.rs
new file mode 100644
index 0000000..d97dd6b
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea_with_button.rs
@@ -0,0 +1,18 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::{button::Button, textarea::Textarea};
+
+#[component]
+pub fn TextareaWithButtonDemo() -> impl IntoView {
+ let text = RwSignal::new("".to_string());
+ view! {
+
+
+ "Send message"
+
+ }
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea_with_label.rs b/book-examples/leptos/src/default/textarea/textarea_with_label.rs
new file mode 100644
index 0000000..f90df3f
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea_with_label.rs
@@ -0,0 +1,13 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaWithLabelDemo() -> impl IntoView {
+ view! {
+
+ "Your message"
+
+
+ }
+}
diff --git a/book-examples/leptos/src/default/textarea/textarea_with_text.rs b/book-examples/leptos/src/default/textarea/textarea_with_text.rs
new file mode 100644
index 0000000..81eac3a
--- /dev/null
+++ b/book-examples/leptos/src/default/textarea/textarea_with_text.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaWithTextDemo() -> impl IntoView {
+ view! {
+
+
"Your Message"
+
+
+ {"Your message will be copied to the support team."}
+
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york.rs b/book-examples/leptos/src/new_york.rs
index 90e0fac..a520014 100644
--- a/book-examples/leptos/src/new_york.rs
+++ b/book-examples/leptos/src/new_york.rs
@@ -8,6 +8,8 @@ mod badge;
mod button;
#[cfg(feature = "card")]
mod card;
+#[cfg(feature = "textarea")]
+mod textarea;
use leptos::prelude::*;
use leptos_router::{
@@ -34,6 +36,10 @@ pub fn NewYork() -> impl MatchNestedRoutes + Clone {
{
component_view(self::card::CardRoutes, ())
},
+ #[cfg(feature = "textarea")]
+ {
+ component_view(self::textarea::TextareaRoutes, ())
+ },
);
view! {
diff --git a/book-examples/leptos/src/new_york/components/ui.rs b/book-examples/leptos/src/new_york/components/ui.rs
index 92b7a22..95fcdd2 100644
--- a/book-examples/leptos/src/new_york/components/ui.rs
+++ b/book-examples/leptos/src/new_york/components/ui.rs
@@ -8,3 +8,5 @@ pub use shadcn_ui_leptos_badge::new_york as badge;
pub use shadcn_ui_leptos_button::new_york as button;
#[cfg(feature = "card")]
pub use shadcn_ui_leptos_card::new_york as card;
+#[cfg(feature = "textarea")]
+pub use shadcn_ui_leptos_textarea::new_york as textarea;
diff --git a/book-examples/leptos/src/new_york/textarea.rs b/book-examples/leptos/src/new_york/textarea.rs
new file mode 100644
index 0000000..7c43f89
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea.rs
@@ -0,0 +1,28 @@
+#[allow(clippy::module_inception)]
+mod textarea;
+mod textarea_disabled;
+mod textarea_form;
+mod textarea_with_button;
+mod textarea_with_label;
+mod textarea_with_text;
+
+use leptos::prelude::*;
+use leptos_router::{
+ components::{Outlet, ParentRoute, Route},
+ path, MatchNestedRoutes,
+};
+
+#[component(transparent)]
+pub fn TextareaRoutes() -> impl MatchNestedRoutes + Clone {
+ view! {
+
+
+
+
+
+
+
+
+ }
+ .into_inner()
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea.rs b/book-examples/leptos/src/new_york/textarea/textarea.rs
new file mode 100644
index 0000000..2f506e7
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea_disabled.rs b/book-examples/leptos/src/new_york/textarea/textarea_disabled.rs
new file mode 100644
index 0000000..747b0a6
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea_disabled.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaDisabledDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea_form.rs b/book-examples/leptos/src/new_york/textarea/textarea_form.rs
new file mode 100644
index 0000000..e6d61c3
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea_form.rs
@@ -0,0 +1,10 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaFormDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea_with_button.rs b/book-examples/leptos/src/new_york/textarea/textarea_with_button.rs
new file mode 100644
index 0000000..190d20d
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea_with_button.rs
@@ -0,0 +1,18 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::{button::Button, textarea::Textarea};
+
+#[component]
+pub fn TextareaWithButtonDemo() -> impl IntoView {
+ let text = RwSignal::new("".to_string());
+ view! {
+
+
+ "Send message"
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea_with_label.rs b/book-examples/leptos/src/new_york/textarea/textarea_with_label.rs
new file mode 100644
index 0000000..4260b3e
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea_with_label.rs
@@ -0,0 +1,13 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaWithLabelDemo() -> impl IntoView {
+ view! {
+
+ "Your message"
+
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/textarea/textarea_with_text.rs b/book-examples/leptos/src/new_york/textarea/textarea_with_text.rs
new file mode 100644
index 0000000..fd2b3be
--- /dev/null
+++ b/book-examples/leptos/src/new_york/textarea/textarea_with_text.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::textarea::Textarea;
+
+#[component]
+pub fn TextareaWithTextDemo() -> impl IntoView {
+ view! {
+
+
"Your Message"
+
+
+ {"Your message will be copied to the support team."}
+
+
+ }
+}
diff --git a/packages/leptos/textarea/Cargo.toml b/packages/leptos/textarea/Cargo.toml
new file mode 100644
index 0000000..9c09273
--- /dev/null
+++ b/packages/leptos/textarea/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "shadcn-ui-leptos-textarea"
+description = "Leptos port of shadcn/ui Textarea."
+homepage = "https://shadcn-ui.rustforweb.org/components/textarea.html"
+publish = false
+
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+repository.workspace = true
+version.workspace = true
+
+[dependencies]
+tailwind_fuse.workspace = true
+leptos.workspace = true
+leptos-style.workspace = true
+leptos-node-ref.workspace = true
+shadcn-ui-leptos-utils = { path = "../utils" }
+
diff --git a/packages/leptos/textarea/README.md b/packages/leptos/textarea/README.md
new file mode 100644
index 0000000..8fd28b2
--- /dev/null
+++ b/packages/leptos/textarea/README.md
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+shadcn-ui-leptos-textarea
+
+Displays a form textarea or a component that looks like a textarea.
+
+[Rust shadcn/ui](https://github.com/RustForWeb/shadcn-ui) is a Rust port of [shadcn/ui](https://ui.shadcn.com/).
+
+## Documentation
+
+See [the Rust shadcn/ui book](https://shadcn-ui.rustforweb.org/) for documentation.
+
+## Rust For Web
+
+The Rust shadcn/ui project is part of the [Rust For Web](https://github.com/RustForWeb).
+
+[Rust For Web](https://github.com/RustForWeb) creates and ports web UI libraries for Rust. All projects are free and open source.
diff --git a/packages/leptos/textarea/src/default.rs b/packages/leptos/textarea/src/default.rs
new file mode 100644
index 0000000..64aaeb0
--- /dev/null
+++ b/packages/leptos/textarea/src/default.rs
@@ -0,0 +1,56 @@
+use leptos::{
+ ev::{Event, FocusEvent},
+ prelude::*,
+};
+use leptos_node_ref::AnyNodeRef;
+use leptos_style::Style;
+use shadcn_ui_leptos_utils::handlers::*;
+use tailwind_fuse::*;
+
+#[component]
+pub fn Textarea(
+ // Global attributes
+ #[prop(into, optional)] class: MaybeProp,
+ #[prop(into, optional)] id: MaybeProp,
+ #[prop(into, optional)] style: Signal