diff --git a/gh-pages/src/pages/button/mod.rs b/gh-pages/src/pages/button/mod.rs index 1a6bdac..6162124 100644 --- a/gh-pages/src/pages/button/mod.rs +++ b/gh-pages/src/pages/button/mod.rs @@ -113,24 +113,46 @@ pub fn ButtonPage() -> impl IntoView { #[component] pub fn LoadingButton() -> impl IntoView { let loading = create_rw_signal(false); + let on_click = move |_| { + loading.set(true); + set_timeout( + move || { + loading.set(false); + }, + std::time::Duration::new(2, 0), + ); + }; view! { -

"loading"

+

"Loading"

- - - "ERROR Color Icon" - - + + + + } "#, "rust")> "" diff --git a/src/button/button.css b/src/button/button.css index f0691b3..7e3f764 100644 --- a/src/button/button.css +++ b/src/button/button.css @@ -5,7 +5,6 @@ color: var(--font-color); border: 1px solid var(--border-color); border-radius: 5px; - cursor: pointer; display: inline-flex; align-items: center; @@ -14,12 +13,14 @@ } .melt-button:hover { - transition: all 0.3s; border-color: var(--border-color-hover); background-color: var(--background-color-hover); + cursor: pointer; + + transition: all 0.3s; } -.melt-button:active { +.melt-button:active:not(.melt-button--disabled) { transition: all 0.3s; border-color: var(--border-color-hover); background-color: var(--background-color-active); diff --git a/src/button/mod.rs b/src/button/mod.rs index c6f976e..83e265c 100644 --- a/src/button/mod.rs +++ b/src/button/mod.rs @@ -58,6 +58,8 @@ pub fn Button( #[prop(optional, into)] round: MaybeSignal, #[prop(optional, into)] icon: Option, #[prop(optional, into)] loading: MaybeSignal, + #[prop(optional, into)] disabled: MaybeSignal, + #[prop(optional, into)] on_click: Option>, #[prop(optional)] children: Option, ) -> impl IntoView { let theme = use_theme(Theme::light); @@ -90,13 +92,33 @@ pub fn Button( "" }; + let disabled = create_memo(move |_| { + if loading.get() { + return true; + } + + disabled.get() + }); + + let on_click = move |event| { + if disabled.get() { + return; + } + let Some(callback) = on_click.as_ref() else { + return; + }; + callback.call(event); + }; + view! {class=class_name,