mirror of
https://github.com/adoyle0/thaw.git
synced 2025-03-13 05:59:49 -04:00
feat: theme
This commit is contained in:
parent
fee54b3a70
commit
0a2e035b75
9 changed files with 88 additions and 17 deletions
|
@ -24,12 +24,12 @@ impl ThemeMethod for AlertTheme {
|
||||||
|
|
||||||
fn dark() -> Self {
|
fn dark() -> Self {
|
||||||
Self {
|
Self {
|
||||||
success_background_color: "#edf7f2".into(),
|
success_background_color: "#2a947d40".into(),
|
||||||
success_border_color: "#c5e7d5".into(),
|
success_border_color: "#2a947d59".into(),
|
||||||
warning_background_color: "#fef7ed".into(),
|
warning_background_color: "#f08a0040".into(),
|
||||||
warning_border_color: "#fae0b5".into(),
|
warning_border_color: "#f08a0059".into(),
|
||||||
error_background_color: "#fbeef1".into(),
|
error_background_color: "#d03a5240".into(),
|
||||||
error_border_color: "#f3cbd3".into(),
|
error_border_color: "#d03a5259".into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
.melt-avatar {
|
.melt-avatar {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: var(--size);
|
width: var(--melt-size);
|
||||||
height: var(--size);
|
height: var(--melt-size);
|
||||||
background-color: #f7f7f7;
|
background-color: var(--melt-background-color);
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--melt-border-radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
.melt-avatar img {
|
.melt-avatar img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--melt-border-radius);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
use crate::mount_style;
|
mod theme;
|
||||||
|
|
||||||
|
use crate::{mount_style, use_theme, Theme};
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
|
pub use theme::AvatarTheme;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn Avatar(
|
pub fn Avatar(
|
||||||
|
@ -7,13 +10,20 @@ pub fn Avatar(
|
||||||
#[prop(optional, into)] circle: MaybeSignal<bool>,
|
#[prop(optional, into)] circle: MaybeSignal<bool>,
|
||||||
#[prop(default = MaybeSignal::Static(30), into)] size: MaybeSignal<i32>,
|
#[prop(default = MaybeSignal::Static(30), into)] size: MaybeSignal<i32>,
|
||||||
) -> impl IntoView {
|
) -> impl IntoView {
|
||||||
|
let theme = use_theme(Theme::light);
|
||||||
let css_vars = create_memo(move |_| {
|
let css_vars = create_memo(move |_| {
|
||||||
let mut css_vars = String::new();
|
let mut css_vars = String::new();
|
||||||
css_vars.push_str(&format!("--size: {}px;", size.get()));
|
css_vars.push_str(&format!("--melt-size: {}px;", size.get()));
|
||||||
css_vars.push_str(&format!(
|
css_vars.push_str(&format!(
|
||||||
"--border-radius: {};",
|
"--melt-border-radius: {};",
|
||||||
if circle.get() { "50%" } else { "3px" }
|
if circle.get() { "50%" } else { "3px" }
|
||||||
));
|
));
|
||||||
|
theme.with(|theme| {
|
||||||
|
css_vars.push_str(&format!(
|
||||||
|
"--melt-background-color: {}",
|
||||||
|
theme.avatar.background_color
|
||||||
|
));
|
||||||
|
});
|
||||||
css_vars
|
css_vars
|
||||||
});
|
});
|
||||||
mount_style("avatar", include_str!("./avatar.css"));
|
mount_style("avatar", include_str!("./avatar.css"));
|
||||||
|
|
20
src/avatar/theme.rs
Normal file
20
src/avatar/theme.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
use crate::theme::ThemeMethod;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct AvatarTheme {
|
||||||
|
pub background_color: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ThemeMethod for AvatarTheme {
|
||||||
|
fn light() -> Self {
|
||||||
|
Self {
|
||||||
|
background_color: "#f7f7f7".into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dark() -> Self {
|
||||||
|
Self {
|
||||||
|
background_color: "#424245".into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
max-width: 75vh;
|
max-width: 75vh;
|
||||||
background: #fff;
|
background: var(--melt-background-color);
|
||||||
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
|
|
@ -30,10 +30,20 @@ impl MessageVariant {
|
||||||
#[component]
|
#[component]
|
||||||
pub(crate) fn Message(variant: MessageVariant, content: String) -> impl IntoView {
|
pub(crate) fn Message(variant: MessageVariant, content: String) -> impl IntoView {
|
||||||
let theme = use_theme(Theme::light);
|
let theme = use_theme(Theme::light);
|
||||||
|
let css_vars = create_memo(move |_| {
|
||||||
|
let mut css_vars = String::new();
|
||||||
|
theme.with(|theme| {
|
||||||
|
css_vars.push_str(&format!(
|
||||||
|
"--melt-background-color: {}",
|
||||||
|
theme.message.background_color
|
||||||
|
))
|
||||||
|
});
|
||||||
|
css_vars
|
||||||
|
});
|
||||||
let style = theme.with_untracked(|theme| format!("color: {};", variant.theme_color(theme)));
|
let style = theme.with_untracked(|theme| format!("color: {};", variant.theme_color(theme)));
|
||||||
view! {
|
view! {
|
||||||
<div class="melt-message-wrapper">
|
<div class="melt-message-wrapper">
|
||||||
<div class="melt-message">
|
<div class="melt-message" style=move || css_vars.get()>
|
||||||
<div class="melt-message__icon">
|
<div class="melt-message__icon">
|
||||||
<Icon icon=variant.icon() style/>
|
<Icon icon=variant.icon() style/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
mod message;
|
mod message;
|
||||||
mod message_environment;
|
mod message_environment;
|
||||||
mod message_provider;
|
mod message_provider;
|
||||||
|
mod theme;
|
||||||
|
|
||||||
pub use message::*;
|
pub use message::*;
|
||||||
pub use message_provider::*;
|
pub use message_provider::*;
|
||||||
|
pub use theme::MessageTheme;
|
||||||
|
|
20
src/message/theme.rs
Normal file
20
src/message/theme.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
use crate::theme::ThemeMethod;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct MessageTheme {
|
||||||
|
pub background_color: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ThemeMethod for MessageTheme {
|
||||||
|
fn light() -> Self {
|
||||||
|
Self {
|
||||||
|
background_color: "#fff".into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dark() -> Self {
|
||||||
|
Self {
|
||||||
|
background_color: "#48484e".into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,10 @@
|
||||||
mod common;
|
mod common;
|
||||||
|
|
||||||
use self::common::CommonTheme;
|
use self::common::CommonTheme;
|
||||||
use crate::{AlertTheme, ButtonTheme, InputTheme, MenuTheme, SkeletionTheme, TableTheme, TagTheme};
|
use crate::{
|
||||||
|
AlertTheme, AvatarTheme, ButtonTheme, InputTheme, MenuTheme, MessageTheme, SkeletionTheme,
|
||||||
|
TableTheme, TagTheme,
|
||||||
|
};
|
||||||
use leptos::*;
|
use leptos::*;
|
||||||
|
|
||||||
pub trait ThemeMethod {
|
pub trait ThemeMethod {
|
||||||
|
@ -20,6 +23,8 @@ pub struct Theme {
|
||||||
pub alert: AlertTheme,
|
pub alert: AlertTheme,
|
||||||
pub skeletion: SkeletionTheme,
|
pub skeletion: SkeletionTheme,
|
||||||
pub tag: TagTheme,
|
pub tag: TagTheme,
|
||||||
|
pub avatar: AvatarTheme,
|
||||||
|
pub message: MessageTheme,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Theme {
|
impl Theme {
|
||||||
|
@ -34,6 +39,8 @@ impl Theme {
|
||||||
alert: AlertTheme::light(),
|
alert: AlertTheme::light(),
|
||||||
skeletion: SkeletionTheme::light(),
|
skeletion: SkeletionTheme::light(),
|
||||||
tag: TagTheme::light(),
|
tag: TagTheme::light(),
|
||||||
|
avatar: AvatarTheme::light(),
|
||||||
|
message: MessageTheme::light(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn dark() -> Self {
|
pub fn dark() -> Self {
|
||||||
|
@ -47,6 +54,8 @@ impl Theme {
|
||||||
alert: AlertTheme::dark(),
|
alert: AlertTheme::dark(),
|
||||||
skeletion: SkeletionTheme::dark(),
|
skeletion: SkeletionTheme::dark(),
|
||||||
tag: TagTheme::dark(),
|
tag: TagTheme::dark(),
|
||||||
|
avatar: AvatarTheme::dark(),
|
||||||
|
message: MessageTheme::dark(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue