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 @@ +

+ + Rust shadcn/ui Logo + +

+ +

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