diff --git a/Cargo.lock b/Cargo.lock
index aa3ba82..2af66ae 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-skeleton",
]
[[package]]
@@ -3522,6 +3523,16 @@ dependencies = [
"tailwind_fuse",
]
+[[package]]
+name = "shadcn-ui-leptos-skeleton"
+version = "0.0.1"
+dependencies = [
+ "leptos 0.7.2",
+ "leptos-node-ref",
+ "leptos-style",
+ "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..c0a386f 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-skeleton = { path = "../../packages/leptos/skeleton", optional = true }
[features]
default = [
@@ -28,6 +29,7 @@ default = [
"badge",
"button",
"card",
+ "skeleton",
]
alert = [
"dep:lucide-leptos",
@@ -45,3 +47,4 @@ card = [
"dep:shadcn-ui-leptos-button",
"dep:shadcn-ui-leptos-card",
]
+skeleton = ["dep:shadcn-ui-leptos-skeleton"]
diff --git a/book-examples/leptos/src/default.rs b/book-examples/leptos/src/default.rs
index a3148f2..2c9f816 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 = "skeleton")]
+mod skeleton;
use leptos::prelude::*;
use leptos_router::{
@@ -34,6 +36,10 @@ pub fn Default() -> impl MatchNestedRoutes + Clone {
{
component_view(self::card::CardRoutes, ())
},
+ #[cfg(feature = "skeleton")]
+ {
+ component_view(self::skeleton::SkeletonRoutes, ())
+ },
);
view! {
diff --git a/book-examples/leptos/src/default/components/ui.rs b/book-examples/leptos/src/default/components/ui.rs
index a95ce66..1676d69 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 = "skeleton")]
+pub use shadcn_ui_leptos_skeleton::default as skeleton;
diff --git a/book-examples/leptos/src/default/skeleton.rs b/book-examples/leptos/src/default/skeleton.rs
new file mode 100644
index 0000000..dca9594
--- /dev/null
+++ b/book-examples/leptos/src/default/skeleton.rs
@@ -0,0 +1,20 @@
+#[allow(clippy::module_inception)]
+mod skeleton;
+mod skeleton_card;
+
+use leptos::prelude::*;
+use leptos_router::{
+ components::{Outlet, ParentRoute, Route},
+ path, MatchNestedRoutes,
+};
+
+#[component(transparent)]
+pub fn SkeletonRoutes() -> impl MatchNestedRoutes + Clone {
+ view! {
+
+
+
+
+ }
+ .into_inner()
+}
diff --git a/book-examples/leptos/src/default/skeleton/skeleton.rs b/book-examples/leptos/src/default/skeleton/skeleton.rs
new file mode 100644
index 0000000..f93ab71
--- /dev/null
+++ b/book-examples/leptos/src/default/skeleton/skeleton.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::skeleton::Skeleton;
+
+#[component]
+pub fn SkeletonDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/default/skeleton/skeleton_card.rs b/book-examples/leptos/src/default/skeleton/skeleton_card.rs
new file mode 100644
index 0000000..ec007dd
--- /dev/null
+++ b/book-examples/leptos/src/default/skeleton/skeleton_card.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::default::components::ui::skeleton::Skeleton;
+
+#[component]
+pub fn SkeletonCardDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york.rs b/book-examples/leptos/src/new_york.rs
index 90e0fac..c5efc27 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 = "skeleton")]
+mod skeleton;
use leptos::prelude::*;
use leptos_router::{
@@ -34,6 +36,10 @@ pub fn NewYork() -> impl MatchNestedRoutes + Clone {
{
component_view(self::card::CardRoutes, ())
},
+ #[cfg(feature = "skeleton")]
+ {
+ component_view(self::skeleton::SkeletonRoutes, ())
+ },
);
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..bb7279a 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 = "skeleton")]
+pub use shadcn_ui_leptos_skeleton::new_york as skeleton;
diff --git a/book-examples/leptos/src/new_york/skeleton.rs b/book-examples/leptos/src/new_york/skeleton.rs
new file mode 100644
index 0000000..dca9594
--- /dev/null
+++ b/book-examples/leptos/src/new_york/skeleton.rs
@@ -0,0 +1,20 @@
+#[allow(clippy::module_inception)]
+mod skeleton;
+mod skeleton_card;
+
+use leptos::prelude::*;
+use leptos_router::{
+ components::{Outlet, ParentRoute, Route},
+ path, MatchNestedRoutes,
+};
+
+#[component(transparent)]
+pub fn SkeletonRoutes() -> impl MatchNestedRoutes + Clone {
+ view! {
+
+
+
+
+ }
+ .into_inner()
+}
diff --git a/book-examples/leptos/src/new_york/skeleton/skeleton.rs b/book-examples/leptos/src/new_york/skeleton/skeleton.rs
new file mode 100644
index 0000000..d104c34
--- /dev/null
+++ b/book-examples/leptos/src/new_york/skeleton/skeleton.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::skeleton::Skeleton;
+
+#[component]
+pub fn SkeletonDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/book-examples/leptos/src/new_york/skeleton/skeleton_card.rs b/book-examples/leptos/src/new_york/skeleton/skeleton_card.rs
new file mode 100644
index 0000000..963fb59
--- /dev/null
+++ b/book-examples/leptos/src/new_york/skeleton/skeleton_card.rs
@@ -0,0 +1,16 @@
+use leptos::prelude::*;
+
+use crate::new_york::components::ui::skeleton::Skeleton;
+
+#[component]
+pub fn SkeletonCardDemo() -> impl IntoView {
+ view! {
+
+ }
+}
diff --git a/packages/leptos/skeleton/Cargo.toml b/packages/leptos/skeleton/Cargo.toml
new file mode 100644
index 0000000..f1641b4
--- /dev/null
+++ b/packages/leptos/skeleton/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "shadcn-ui-leptos-skeleton"
+description = "Leptos port of shadcn/ui Skeleton."
+homepage = "https://shadcn-ui.rustforweb.org/components/skeleton.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
diff --git a/packages/leptos/skeleton/README.md b/packages/leptos/skeleton/README.md
new file mode 100644
index 0000000..f34feea
--- /dev/null
+++ b/packages/leptos/skeleton/README.md
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+shadcn-ui-leptos-skeleton
+
+Use to show a placeholder while content is loading.
+
+[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/skeleton/src/default.rs b/packages/leptos/skeleton/src/default.rs
new file mode 100644
index 0000000..1fa7ce1
--- /dev/null
+++ b/packages/leptos/skeleton/src/default.rs
@@ -0,0 +1,24 @@
+use leptos::prelude::*;
+use leptos_node_ref::AnyNodeRef;
+use leptos_style::Style;
+use tailwind_fuse::*;
+
+#[component]
+pub fn Skeleton(
+ // Global attributes
+ #[prop(into, optional)] class: MaybeProp,
+ #[prop(into, optional)] id: MaybeProp,
+ #[prop(into, optional)] style: Signal