From a0abd12fea0a97049e62d1a1ff5fd5b87d376d5b Mon Sep 17 00:00:00 2001 From: luoxiaozero <48741584+luoxiaozero@users.noreply.github.com> Date: Sun, 10 Dec 2023 13:54:10 +0800 Subject: [PATCH] feat: button component add size (#43) --- demo/src/pages/button/mod.rs | 56 ++++++++++++++++++++++++++++++++++-- src/button/button.css | 5 ++-- src/button/mod.rs | 51 ++++++++++++++++++++++++++++++++ src/button/theme.rs | 15 ++++++++++ src/theme/common.rs | 31 ++++++++++++++------ 5 files changed, 146 insertions(+), 12 deletions(-) diff --git a/demo/src/pages/button/mod.rs b/demo/src/pages/button/mod.rs index 8387e62..dc4543a 100644 --- a/demo/src/pages/button/mod.rs +++ b/demo/src/pages/button/mod.rs @@ -133,6 +133,46 @@ pub fn ButtonPage() -> impl IntoView { +

"Size"

+ + + + + + + + + + {highlight_str!( + r#" + + + + + + + "#, + "rust" + )} + + +

"Button group"

@@ -292,6 +332,16 @@ pub fn ButtonPage() -> impl IntoView { "Whether the button is disabled." + + "size" + + "MaybeSignal" + + + "ButtonSize::Medium" + + "Button size." + "on_click" @@ -305,9 +355,11 @@ pub fn ButtonPage() -> impl IntoView { "children" - "Children" + "Option" + + + "None" - "Button's content." diff --git a/src/button/button.css b/src/button/button.css index 8bf5e7a..7559ab3 100644 --- a/src/button/button.css +++ b/src/button/button.css @@ -1,6 +1,7 @@ .thaw-button { - height: 34px; - padding: 0 16px; + height: var(--thaw-height); + padding: var(--thaw-padding); + font-size: var(--thaw-font-color); background-color: var(--thaw-background-color); color: var(--thaw-font-color); border: 1px solid var(--thaw-border-color); diff --git a/src/button/mod.rs b/src/button/mod.rs index d1ce9d7..cd4f343 100644 --- a/src/button/mod.rs +++ b/src/button/mod.rs @@ -57,11 +57,50 @@ impl ButtonColor { } } +#[derive(Default, Clone)] +pub enum ButtonSize { + Tiny, + Small, + #[default] + Medium, + Large, +} + +impl ButtonSize { + fn theme_font_size(&self, theme: &Theme) -> String { + match self { + ButtonSize::Tiny => theme.common.font_size_tiny.clone(), + ButtonSize::Small => theme.common.font_size_small.clone(), + ButtonSize::Medium => theme.common.font_size_medium.clone(), + ButtonSize::Large => theme.common.font_size_large.clone(), + } + } + + fn theme_height(&self, theme: &Theme) -> String { + match self { + ButtonSize::Tiny => theme.common.height_tiny.clone(), + ButtonSize::Small => theme.common.height_small.clone(), + ButtonSize::Medium => theme.common.height_medium.clone(), + ButtonSize::Large => theme.common.height_large.clone(), + } + } + + fn theme_padding(&self, theme: &Theme) -> String { + match self { + ButtonSize::Tiny => theme.button.padding_tiny.clone(), + ButtonSize::Small => theme.button.padding_small.clone(), + ButtonSize::Medium => theme.button.padding_medium.clone(), + ButtonSize::Large => theme.button.padding_large.clone(), + } + } +} + #[component] pub fn Button( #[prop(optional, into)] style: MaybeSignal, #[prop(optional, into)] variant: MaybeSignal, #[prop(optional, into)] color: MaybeSignal, + #[prop(optional, into)] size: MaybeSignal, #[prop(optional, into)] round: MaybeSignal, #[prop(optional, into)] icon: Option, #[prop(optional, into)] loading: MaybeSignal, @@ -78,6 +117,18 @@ pub fn Button( "--thaw-font-color-disabled: {};", theme.button.color_text_disabled )); + css_vars.push_str(&format!( + "--thaw-font-size: {};", + size.get().theme_font_size(theme) + )); + css_vars.push_str(&format!( + "--thaw-height: {};", + size.get().theme_height(theme) + )); + css_vars.push_str(&format!( + "--thaw-padding: {};", + size.get().theme_padding(theme) + )); match variant.get() { ButtonVariant::Primary => { diff --git a/src/button/theme.rs b/src/button/theme.rs index 000c0bf..0bbe235 100644 --- a/src/button/theme.rs +++ b/src/button/theme.rs @@ -2,6 +2,11 @@ use crate::theme::ThemeMethod; #[derive(Clone)] pub struct ButtonTheme { + pub padding_tiny: String, + pub padding_small: String, + pub padding_medium: String, + pub padding_large: String, + pub border_color_solid: String, pub color_text_hover: String, pub color_text_active: String, @@ -13,6 +18,11 @@ pub struct ButtonTheme { impl ThemeMethod for ButtonTheme { fn light() -> Self { Self { + padding_tiny: "0 6px".into(), + padding_small: "0 10px".into(), + padding_medium: "0 14px".into(), + padding_large: "0 18px".into(), + border_color_solid: "#e0e0e6".into(), color_text_hover: "#f1f3f5".into(), color_text_active: "#eceef0".into(), @@ -24,6 +34,11 @@ impl ThemeMethod for ButtonTheme { fn dark() -> Self { Self { + padding_tiny: "0 6px".into(), + padding_small: "0 10px".into(), + padding_medium: "0 14px".into(), + padding_large: "0 18px".into(), + border_color_solid: "#ffffff3d".into(), color_text_hover: "#ffffff1a".into(), color_text_active: "#ffffff26".into(), diff --git a/src/theme/common.rs b/src/theme/common.rs index e288414..a10a92a 100644 --- a/src/theme/common.rs +++ b/src/theme/common.rs @@ -22,11 +22,17 @@ pub struct CommonTheme { pub color_error_active: String, pub font_size: String, + pub font_size_tiny: String, pub font_size_small: String, pub font_size_medium: String, pub font_size_large: String, pub font_size_huge: String, + pub height_tiny: String, + pub height_small: String, + pub height_medium: String, + pub height_large: String, + pub line_height: String, pub line_height_small: String, pub line_height_medium: String, @@ -59,16 +65,25 @@ impl CommonTheme { color_error: "".into(), color_error_hover: "".into(), color_error_active: "".into(), + font_size: "14px".into(), - font_size_small: "12px".into(), - font_size_medium: "16px".into(), - font_size_large: "20px".into(), - font_size_huge: "24px".into(), + font_size_tiny: "12px".into(), + font_size_small: "14px".into(), + font_size_medium: "14px".into(), + font_size_large: "15px".into(), + font_size_huge: "16px".into(), + + height_tiny: "22px".into(), + height_small: "28px".into(), + height_medium: "34px".into(), + height_large: "40px".into(), + line_height: "22px".into(), - line_height_small: "20px".into(), - line_height_medium: "24px".into(), - line_height_large: "28px".into(), - line_height_huge: "32px".into(), + line_height_small: "22px".into(), + line_height_medium: "22px".into(), + line_height_large: "23px".into(), + line_height_huge: "24px".into(), + border_radius: "3px".into(), border_radius_small: "2px".into(), border_radius_medium: "4px".into(),