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(),