mirror of
https://github.com/adoyle0/thaw.git
synced 2025-02-02 08:34:15 -05:00
fix: class overwrites class when updating signal values (#46)
* fix: class overwrites class when updating signal values * fix: class rendering of ssr mode
This commit is contained in:
parent
69dd0c5086
commit
5fa0929cbf
7 changed files with 72 additions and 11 deletions
|
@ -1,6 +1,12 @@
|
||||||
mod theme;
|
mod theme;
|
||||||
|
|
||||||
use crate::{theme::use_theme, utils::mount_style, Icon, Theme};
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use crate::utils::dyn_classes;
|
||||||
|
use crate::{
|
||||||
|
theme::use_theme,
|
||||||
|
utils::{mount_style, ssr_class},
|
||||||
|
Icon, Theme,
|
||||||
|
};
|
||||||
use icondata::AiIcon;
|
use icondata::AiIcon;
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
pub use theme::AlertTheme;
|
pub use theme::AlertTheme;
|
||||||
|
@ -79,9 +85,12 @@ pub fn Alert(
|
||||||
}
|
}
|
||||||
.into()
|
.into()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let ssr_class = ssr_class(&class);
|
||||||
view! {
|
view! {
|
||||||
<div
|
<div
|
||||||
class=move || class.get()
|
class=ssr_class
|
||||||
|
use:dyn_classes=class
|
||||||
class:thaw-alert=true
|
class:thaw-alert=true
|
||||||
style=move || css_vars.get()>
|
style=move || css_vars.get()>
|
||||||
<Icon icon class="thaw-alert__icon"/>
|
<Icon icon class="thaw-alert__icon"/>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
mod theme;
|
mod theme;
|
||||||
|
|
||||||
|
use crate::utils::{dyn_classes, ssr_class};
|
||||||
use crate::{
|
use crate::{
|
||||||
components::{Binder, Follower, FollowerPlacement, FollowerWidth},
|
components::{Binder, Follower, FollowerPlacement, FollowerWidth},
|
||||||
use_theme,
|
use_theme,
|
||||||
|
@ -108,9 +109,10 @@ pub fn AutoComplete(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let ssr_class = ssr_class(&class);
|
||||||
view! {
|
view! {
|
||||||
<Binder target_ref=auto_complete_ref>
|
<Binder target_ref=auto_complete_ref>
|
||||||
<div class=move || class.get() class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown>
|
<div class=ssr_class use:dyn_classes=class class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown>
|
||||||
<Input
|
<Input
|
||||||
value
|
value
|
||||||
placeholder
|
placeholder
|
||||||
|
@ -194,5 +196,3 @@ pub fn AutoComplete(
|
||||||
</Binder>
|
</Binder>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
mod theme;
|
mod theme;
|
||||||
|
|
||||||
use crate::{use_theme, utils::mount_style, Theme};
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use crate::utils::dyn_classes;
|
||||||
|
use crate::{
|
||||||
|
use_theme,
|
||||||
|
utils::{mount_style, ssr_class},
|
||||||
|
Theme,
|
||||||
|
};
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
pub use theme::AvatarTheme;
|
pub use theme::AvatarTheme;
|
||||||
|
|
||||||
|
@ -28,8 +34,10 @@ pub fn Avatar(
|
||||||
css_vars
|
css_vars
|
||||||
});
|
});
|
||||||
mount_style("avatar", include_str!("./avatar.css"));
|
mount_style("avatar", include_str!("./avatar.css"));
|
||||||
|
|
||||||
|
let ssr_class = ssr_class(&class);
|
||||||
view! {
|
view! {
|
||||||
<span class=move || class.get() class:thaw-avatar=true style=move || css_vars.get()>
|
<span class=ssr_class use:dyn_classes=class class:thaw-avatar=true style=move || css_vars.get()>
|
||||||
{move || {
|
{move || {
|
||||||
let src = src.get();
|
let src = src.get();
|
||||||
(!src.is_empty()).then(|| view! { <img src=src/> })
|
(!src.is_empty()).then(|| view! { <img src=src/> })
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
mod button_group;
|
mod button_group;
|
||||||
mod theme;
|
mod theme;
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use crate::utils::dyn_classes;
|
||||||
use crate::{
|
use crate::{
|
||||||
components::{OptionComp, Wave, WaveRef},
|
components::{OptionComp, Wave, WaveRef},
|
||||||
icon::*,
|
icon::*,
|
||||||
theme::*,
|
theme::*,
|
||||||
utils::{mount_style, ComponentRef},
|
utils::{mount_style, ssr_class, ComponentRef},
|
||||||
};
|
};
|
||||||
pub use button_group::ButtonGroup;
|
pub use button_group::ButtonGroup;
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
|
@ -219,10 +221,12 @@ pub fn Button(
|
||||||
};
|
};
|
||||||
callback.call(event);
|
callback.call(event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let ssr_class = ssr_class(&class);
|
||||||
view! {
|
view! {
|
||||||
<button
|
<button
|
||||||
class=move || class.get()
|
class=ssr_class
|
||||||
|
use:dyn_classes=class
|
||||||
class:thaw-button=true
|
class:thaw-button=true
|
||||||
class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid)
|
class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid)
|
||||||
class=("thaw-button--text", move || variant.get() == ButtonVariant::Text)
|
class=("thaw-button--text", move || variant.get() == ButtonVariant::Text)
|
||||||
|
|
|
@ -158,6 +158,7 @@ fn Panel(
|
||||||
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
|
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
|
||||||
{
|
{
|
||||||
_ = time_picker_ref;
|
_ = time_picker_ref;
|
||||||
|
_ = panel_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
let hour_ref = create_node_ref::<html::Div>();
|
let hour_ref = create_node_ref::<html::Div>();
|
||||||
|
|
37
src/utils/dyn_classes.rs
Normal file
37
src/utils/dyn_classes.rs
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
use cfg_if::cfg_if;
|
||||||
|
use leptos::{html::AnyElement, HtmlElement, MaybeSignal};
|
||||||
|
|
||||||
|
pub fn dyn_classes(el: HtmlElement<AnyElement>, classes_signal: MaybeSignal<String>) {
|
||||||
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "ssr")] {
|
||||||
|
let _ = el;
|
||||||
|
let _ = classes_signal;
|
||||||
|
} else {
|
||||||
|
use leptos::SignalGet;
|
||||||
|
let _ = el.dyn_classes(move || {
|
||||||
|
let classes = classes_signal.get();
|
||||||
|
if classes.is_empty() {
|
||||||
|
return vec![];
|
||||||
|
}
|
||||||
|
classes
|
||||||
|
.split_ascii_whitespace()
|
||||||
|
.map(|class| class.to_string())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn ssr_class(class: &MaybeSignal<String>) -> String {
|
||||||
|
let ssr_class;
|
||||||
|
cfg_if! {
|
||||||
|
if #[cfg(feature = "ssr")] {
|
||||||
|
use leptos::SignalGetUntracked;
|
||||||
|
ssr_class = class.get_untracked();
|
||||||
|
} else {
|
||||||
|
let _ = class;
|
||||||
|
ssr_class = String::new();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ssr_class
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
// mod callback;
|
// mod callback;
|
||||||
mod component_ref;
|
mod component_ref;
|
||||||
|
mod dyn_classes;
|
||||||
mod event_listener;
|
mod event_listener;
|
||||||
mod mount_style;
|
mod mount_style;
|
||||||
mod signal;
|
mod signal;
|
||||||
|
@ -7,6 +8,7 @@ mod stored_maybe_signal;
|
||||||
|
|
||||||
// pub use callback::AsyncCallback;
|
// pub use callback::AsyncCallback;
|
||||||
pub(crate) use component_ref::ComponentRef;
|
pub(crate) use component_ref::ComponentRef;
|
||||||
|
pub(crate) use dyn_classes::*;
|
||||||
pub(crate) use event_listener::*;
|
pub(crate) use event_listener::*;
|
||||||
pub(crate) use mount_style::mount_style;
|
pub(crate) use mount_style::mount_style;
|
||||||
pub use signal::SignalWatch;
|
pub use signal::SignalWatch;
|
||||||
|
|
Loading…
Add table
Reference in a new issue