pub use {leptos, paste, tw_merge};
#[macro_export]
macro_rules! variants {
(
$component:ident {
base: $base_class:literal,
variants: {
variant: {
$first_variant:ident: $first_variant_class:literal
$(, $variant_key:ident: $variant_class:literal)* $(,)?
},
size: {
$first_size:ident: $first_size_class:literal
$(, $size_key:ident: $size_class:literal)* $(,)?
}
},
component: {
element: $element:ident
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub variant: [<$component Variant>],
pub size: [<$component Size>],
}
#[derive(TwVariant)]
pub enum [<$component Variant>] {
#[tw(default, class = $first_variant_class)]
$first_variant,
$(
#[tw(class = $variant_class)]
$variant_key,
)*
}
#[derive(TwVariant)]
pub enum [<$component Size>] {
#[tw(default, class = $first_size_class)]
$first_size,
$(
#[tw(class = $size_class)]
$size_key,
)*
}
#[::leptos::component]
pub fn $component(
#[prop(into, optional)] variant: ::leptos::prelude::Signal<[<$component Variant>]>,
#[prop(into, optional)] size: ::leptos::prelude::Signal<[<$component Size>]>,
#[prop(into, optional)] class: ::leptos::prelude::Signal<String>,
#[prop(into, optional)] data_name: Option<String>,
children: ::leptos::prelude::Children,
) -> impl ::leptos::prelude::IntoView {
use ::leptos::prelude::*;
let computed_class = move || {
let variant = variant.try_get().unwrap_or_default();
let size = size.try_get().unwrap_or_default();
let component_class = [<$component Class>] { variant, size };
component_class.with_class(class.try_get().unwrap_or_default())
};
let data_name = data_name.unwrap_or_else(|| stringify!($component).to_string());
view! {
<$element class=computed_class data-name=data_name>
{children()}
</$element>
}
}
}
};
(
$component:ident {
base: $base_class:literal,
variants: {
variant: {
$first_variant:ident: $first_variant_class:literal
$(, $variant_key:ident: $variant_class:literal)* $(,)?
},
size: {
$first_size:ident: $first_size_class:literal
$(, $size_key:ident: $size_class:literal)* $(,)?
}
},
component: {
element: $element:ident,
support_href: true,
support_aria_current: true
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub variant: [<$component Variant>],
pub size: [<$component Size>],
}
#[derive(TwVariant)]
pub enum [<$component Variant>] {
#[tw(default, class = $first_variant_class)]
$first_variant,
$(#[tw(class = $variant_class)] $variant_key,)*
}
#[derive(TwVariant)]
pub enum [<$component Size>] {
#[tw(default, class = $first_size_class)]
$first_size,
$(#[tw(class = $size_class)] $size_key,)*
}
#[::leptos::component]
pub fn $component(
#[prop(into, optional)] variant: ::leptos::prelude::Signal<[<$component Variant>]>,
#[prop(into, optional)] size: ::leptos::prelude::Signal<[<$component Size>]>,
#[prop(into, optional)] class: ::leptos::prelude::Signal<String>,
#[prop(into, optional)] data_name: Option<String>,
#[prop(into, optional)] href: Option<String>,
children: ::leptos::prelude::Children,
) -> impl ::leptos::prelude::IntoView {
use ::leptos::prelude::*;
let computed_class = move || {
let variant = variant.try_get().unwrap_or_default();
let size = size.try_get().unwrap_or_default();
let component_class = [<$component Class>] { variant, size };
component_class.with_class(class.try_get().unwrap_or_default())
};
let data_name = data_name.unwrap_or_else(|| stringify!($component).to_string());
if href.is_some() {
use ::leptos_router::hooks::use_location;
let location = use_location();
let href_clone = href.clone();
let is_active = move || {
href_clone.as_ref().map_or(false, |h| {
let path = location.pathname.try_get().unwrap_or_default();
path == *h || path.starts_with(&format!("{}/", h))
})
};
let aria_current = move || if is_active() { "page" } else { "false" };
view! {
<a class=computed_class href=href.unwrap() aria-current=aria_current data-name=data_name>
{children()}
</a>
}
.into_any()
} else {
view! {
<$element class=computed_class data-name=data_name>
{children()}
</$element>
}
.into_any()
}
}
}
};
(
$component:ident {
base: $base_class:literal,
variants: {
variant: {
$first_variant:ident: $first_variant_class:literal
$(, $variant_key:ident: $variant_class:literal)* $(,)?
},
size: {
$first_size:ident: $first_size_class:literal
$(, $size_key:ident: $size_class:literal)* $(,)?
}
},
component: {
element: $element:ident,
support_href: true
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub variant: [<$component Variant>],
pub size: [<$component Size>],
}
#[derive(TwVariant)]
pub enum [<$component Variant>] {
#[tw(default, class = $first_variant_class)]
$first_variant,
$(#[tw(class = $variant_class)] $variant_key,)*
}
#[derive(TwVariant)]
pub enum [<$component Size>] {
#[tw(default, class = $first_size_class)]
$first_size,
$(#[tw(class = $size_class)] $size_key,)*
}
#[::leptos::component]
pub fn $component(
#[prop(into, optional)] variant: ::leptos::prelude::Signal<[<$component Variant>]>,
#[prop(into, optional)] size: ::leptos::prelude::Signal<[<$component Size>]>,
#[prop(into, optional)] class: ::leptos::prelude::Signal<String>,
#[prop(into, optional)] data_name: Option<String>,
#[prop(into, optional)] href: Option<String>,
children: ::leptos::prelude::Children,
) -> impl ::leptos::prelude::IntoView {
use ::leptos::prelude::*;
let computed_class = move || {
let variant = variant.try_get().unwrap_or_default();
let size = size.try_get().unwrap_or_default();
let component_class = [<$component Class>] { variant, size };
component_class.with_class(class.try_get().unwrap_or_default())
};
let data_name = data_name.unwrap_or_else(|| stringify!($component).to_string());
if href.is_some() {
view! {
<a class=computed_class href=href.unwrap() data-name=data_name>
{children()}
</a>
}
.into_any()
} else {
view! {
<$element class=computed_class data-name=data_name>
{children()}
</$element>
}
.into_any()
}
}
}
};
(
$component:ident {
base: $base_class:literal,
variants: {
variant: {
$first_variant:ident: $first_variant_class:literal
$(, $variant_key:ident: $variant_class:literal)* $(,)?
},
size: {
$first_size:ident: $first_size_class:literal
$(, $size_key:ident: $size_class:literal)* $(,)?
}
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub variant: [<$component Variant>],
pub size: [<$component Size>],
}
#[derive(TwVariant)]
pub enum [<$component Variant>] {
#[tw(default, class = $first_variant_class)]
$first_variant,
$(
#[tw(class = $variant_class)]
$variant_key,
)*
}
#[derive(TwVariant)]
pub enum [<$component Size>] {
#[tw(default, class = $first_size_class)]
$first_size,
$(
#[tw(class = $size_class)]
$size_key,
)*
}
}
};
(
$component:ident {
base: $base_class:literal,
variants: {
variant: {
$first_variant:ident: $first_variant_class:literal
$(, $variant_key:ident: $variant_class:literal)* $(,)?
}
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub variant: [<$component Variant>],
}
#[derive(TwVariant)]
pub enum [<$component Variant>] {
#[tw(default, class = $first_variant_class)]
$first_variant,
$(
#[tw(class = $variant_class)]
$variant_key,
)*
}
}
};
(
$component:ident {
base: $base_class:literal,
variants: {
size: {
$first_size:ident: $first_size_class:literal
$(, $size_key:ident: $size_class:literal)* $(,)?
}
}
}
) => {
$crate::paste::paste! {
use $crate::tw_merge::*;
#[derive(TwClass, Clone, Copy)]
#[tw(class = $base_class)]
pub struct [<$component Class>] {
pub size: [<$component Size>],
}
#[derive(TwVariant)]
pub enum [<$component Size>] {
#[tw(default, class = $first_size_class)]
$first_size,
$(
#[tw(class = $size_class)]
$size_key,
)*
}
}
};
}