use crate::{App, Global, Rgba, Window, WindowAppearance, rgb}; use std::ops::Deref; use std::sync::Arc; /// The default set of colors for gpui. /// /// These are used for styling base components, examples and more. #[derive(Clone, Debug)] pub struct Colors { /// Text color pub text: Rgba, /// Selected text color pub selected_text: Rgba, /// Background color pub background: Rgba, /// Disabled color pub disabled: Rgba, /// Selected color pub selected: Rgba, /// Border color pub border: Rgba, /// Separator color pub separator: Rgba, /// Container color pub container: Rgba, } impl Default for Colors { fn default() -> Self { Self::light() } } impl Colors { /// Returns the default colors for the given window appearance. pub fn for_appearance(window: &Window) -> Self { match window.appearance() { WindowAppearance::Light | WindowAppearance::VibrantLight => Self::light(), WindowAppearance::Dark | WindowAppearance::VibrantDark => Self::dark(), } } /// Returns the default dark colors. pub fn dark() -> Self { Self { text: rgb(0xffffff), selected_text: rgb(0xffffff), disabled: rgb(0x565656), selected: rgb(0x2457ca), background: rgb(0x222222), border: rgb(0x000000), separator: rgb(0xd9d9d9), container: rgb(0x262626), } } /// Returns the default light colors. pub fn light() -> Self { Self { text: rgb(0x252525), selected_text: rgb(0xffffff), background: rgb(0xffffff), disabled: rgb(0xb0b0b0), selected: rgb(0x2a63d9), border: rgb(0xd9d9d9), separator: rgb(0xe6e6e6), container: rgb(0xf4f5f5), } } /// Get [Colors] from the global state pub fn get_global(cx: &App) -> &Arc { &cx.global::().0 } } /// Get [Colors] from the global state #[derive(Clone, Debug)] pub struct GlobalColors(pub Arc); impl Deref for GlobalColors { type Target = Arc; fn deref(&self) -> &Self::Target { &self.0 } } impl Global for GlobalColors {} /// Implement this trait to allow global [Color] access via `cx.default_colors()`. pub trait DefaultColors { /// Returns the default [`gpui::Colors`] fn default_colors(&self) -> &Arc; } impl DefaultColors for App { fn default_colors(&self) -> &Arc { &self.global::().0 } } /// The appearance of the base GPUI colors, used to style GPUI elements /// /// Varies based on the system's current [`WindowAppearance`]. #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub enum DefaultAppearance { /// Use the set of colors for light appearances. #[default] Light, /// Use the set of colors for dark appearances. Dark, } impl From for DefaultAppearance { fn from(appearance: WindowAppearance) -> Self { match appearance { WindowAppearance::Light | WindowAppearance::VibrantLight => Self::Light, WindowAppearance::Dark | WindowAppearance::VibrantDark => Self::Dark, } } }