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;
|
||||
|
||||
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 leptos::*;
|
||||
pub use theme::AlertTheme;
|
||||
|
@ -79,9 +85,12 @@ pub fn Alert(
|
|||
}
|
||||
.into()
|
||||
});
|
||||
|
||||
let ssr_class = ssr_class(&class);
|
||||
view! {
|
||||
<div
|
||||
class=move || class.get()
|
||||
<div
|
||||
class=ssr_class
|
||||
use:dyn_classes=class
|
||||
class:thaw-alert=true
|
||||
style=move || css_vars.get()>
|
||||
<Icon icon class="thaw-alert__icon"/>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
mod theme;
|
||||
|
||||
use crate::utils::{dyn_classes, ssr_class};
|
||||
use crate::{
|
||||
components::{Binder, Follower, FollowerPlacement, FollowerWidth},
|
||||
use_theme,
|
||||
|
@ -108,9 +109,10 @@ pub fn AutoComplete(
|
|||
}
|
||||
};
|
||||
|
||||
let ssr_class = ssr_class(&class);
|
||||
view! {
|
||||
<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
|
||||
value
|
||||
placeholder
|
||||
|
@ -194,5 +196,3 @@ pub fn AutoComplete(
|
|||
</Binder>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
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::*;
|
||||
pub use theme::AvatarTheme;
|
||||
|
||||
|
@ -28,8 +34,10 @@ pub fn Avatar(
|
|||
css_vars
|
||||
});
|
||||
mount_style("avatar", include_str!("./avatar.css"));
|
||||
|
||||
let ssr_class = ssr_class(&class);
|
||||
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 || {
|
||||
let src = src.get();
|
||||
(!src.is_empty()).then(|| view! { <img src=src/> })
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
mod button_group;
|
||||
mod theme;
|
||||
|
||||
#[cfg(not(feature = "ssr"))]
|
||||
use crate::utils::dyn_classes;
|
||||
use crate::{
|
||||
components::{OptionComp, Wave, WaveRef},
|
||||
icon::*,
|
||||
theme::*,
|
||||
utils::{mount_style, ComponentRef},
|
||||
utils::{mount_style, ssr_class, ComponentRef},
|
||||
};
|
||||
pub use button_group::ButtonGroup;
|
||||
use leptos::*;
|
||||
|
@ -219,10 +221,12 @@ pub fn Button(
|
|||
};
|
||||
callback.call(event);
|
||||
};
|
||||
|
||||
|
||||
let ssr_class = ssr_class(&class);
|
||||
view! {
|
||||
<button
|
||||
class=move || class.get()
|
||||
class=ssr_class
|
||||
use:dyn_classes=class
|
||||
class:thaw-button=true
|
||||
class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid)
|
||||
class=("thaw-button--text", move || variant.get() == ButtonVariant::Text)
|
||||
|
|
|
@ -158,6 +158,7 @@ fn Panel(
|
|||
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
|
||||
{
|
||||
_ = time_picker_ref;
|
||||
_ = panel_ref;
|
||||
}
|
||||
|
||||
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 component_ref;
|
||||
mod dyn_classes;
|
||||
mod event_listener;
|
||||
mod mount_style;
|
||||
mod signal;
|
||||
|
@ -7,6 +8,7 @@ mod stored_maybe_signal;
|
|||
|
||||
// pub use callback::AsyncCallback;
|
||||
pub(crate) use component_ref::ComponentRef;
|
||||
pub(crate) use dyn_classes::*;
|
||||
pub(crate) use event_listener::*;
|
||||
pub(crate) use mount_style::mount_style;
|
||||
pub use signal::SignalWatch;
|
||||
|
|
Loading…
Add table
Reference in a new issue