diff --git a/crates/ui2/src/components/button/button_like.rs b/crates/ui2/src/components/button/button_like.rs index 29864a895d2acdfda6d745bd861314a8a8152f2c..3c48eee37898095ac35f306419d0685a8dcd54c8 100644 --- a/crates/ui2/src/components/button/button_like.rs +++ b/crates/ui2/src/components/button/button_like.rs @@ -5,18 +5,44 @@ use crate::h_stack; use crate::prelude::*; pub trait ButtonCommon: Clickable + Disableable { + /// A unique element id to help identify the button. fn id(&self) -> &ElementId; + /// The visual style of the button. + /// + /// Mosty commonly will be `ButtonStyle::Subtle`, or `ButtonStyle::Filled` + /// for an emphasized button. fn style(self, style: ButtonStyle) -> Self; + /// The size of the button. + /// + /// Most buttons will use the default size. + /// + /// ButtonSize can also be used to help build non-button elements + /// that are consistently sized with buttons. fn size(self, size: ButtonSize) -> Self; + /// The tooltip that shows when a user hovers over the button. + /// + /// Nearly all interactable elements should have a tooltip. Some example + /// exceptions might a scroll bar, or a slider. fn tooltip(self, tooltip: impl Fn(&mut WindowContext) -> AnyView + 'static) -> Self; } #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Default)] pub enum ButtonStyle { - #[default] + /// A filled button with a solid background color. Provides emphasis versus + /// the more common subtle button. Filled, - // Tinted, + /// 🚧 Under construction 🚧 + /// + /// Used to emphasize a button in some way, like a selected state, or a semantic + /// coloring like an error or success button. + Tinted, + /// The default button style, used for most buttons. Has a transparent background, + /// but has a background color to indicate states like hover and active. + #[default] Subtle, + /// Used for buttons that only change forground color on hover and active states. + /// + /// TODO: Better docs for this. Transparent, } @@ -40,6 +66,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::Tinted => ButtonLikeStyles { + background: gpui::red(), + border_color: gpui::red(), + label_color: gpui::red(), + icon_color: gpui::red(), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_background, border_color: transparent_black(), @@ -63,6 +95,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::Tinted => ButtonLikeStyles { + background: gpui::red(), + border_color: gpui::red(), + label_color: gpui::red(), + icon_color: gpui::red(), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_hover, border_color: transparent_black(), @@ -88,6 +126,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::Tinted => ButtonLikeStyles { + background: gpui::red(), + border_color: gpui::red(), + label_color: gpui::red(), + icon_color: gpui::red(), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_active, border_color: transparent_black(), @@ -114,6 +158,12 @@ impl ButtonStyle { label_color: Color::Default.color(cx), icon_color: Color::Default.color(cx), }, + ButtonStyle::Tinted => ButtonLikeStyles { + background: gpui::red(), + border_color: gpui::red(), + label_color: gpui::red(), + icon_color: gpui::red(), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_background, border_color: cx.theme().colors().border_focused, @@ -137,6 +187,12 @@ impl ButtonStyle { label_color: Color::Disabled.color(cx), icon_color: Color::Disabled.color(cx), }, + ButtonStyle::Tinted => ButtonLikeStyles { + background: gpui::red(), + border_color: gpui::red(), + label_color: gpui::red(), + icon_color: gpui::red(), + }, ButtonStyle::Subtle => ButtonLikeStyles { background: cx.theme().colors().ghost_element_disabled, border_color: cx.theme().colors().border_disabled, @@ -153,6 +209,8 @@ impl ButtonStyle { } } +/// ButtonSize can also be used to help build non-button elements +/// that are consistently sized with buttons. #[derive(Default, PartialEq, Clone, Copy)] pub enum ButtonSize { #[default] @@ -171,6 +229,11 @@ impl ButtonSize { } } +/// A button-like element that can be used to create a custom button when +/// prebuilt buttons are not sufficient. Use this sparingly, as it is +/// unconstrained and may make the UI feel less consistent. +/// +/// This is also used to build the prebuilt buttons. #[derive(IntoElement)] pub struct ButtonLike { id: ElementId,