1use crate::{App, Global, Rgba, Window, WindowAppearance, rgb};
2use std::ops::Deref;
3use std::sync::Arc;
4
5/// The default set of colors for gpui.
6///
7/// These are used for styling base components, examples and more.
8#[derive(Clone, Debug)]
9pub struct Colors {
10 /// Text color
11 pub text: Rgba,
12 /// Selected text color
13 pub selected_text: Rgba,
14 /// Background color
15 pub background: Rgba,
16 /// Disabled color
17 pub disabled: Rgba,
18 /// Selected color
19 pub selected: Rgba,
20 /// Border color
21 pub border: Rgba,
22 /// Separator color
23 pub separator: Rgba,
24 /// Container color
25 pub container: Rgba,
26}
27
28impl Default for Colors {
29 fn default() -> Self {
30 Self::light()
31 }
32}
33
34impl Colors {
35 /// Returns the default colors for the given window appearance.
36 pub fn for_appearance(window: &Window) -> Self {
37 match window.appearance() {
38 WindowAppearance::Light | WindowAppearance::VibrantLight => Self::light(),
39 WindowAppearance::Dark | WindowAppearance::VibrantDark => Self::dark(),
40 }
41 }
42
43 /// Returns the default dark colors.
44 pub fn dark() -> Self {
45 Self {
46 text: rgb(0xffffff),
47 selected_text: rgb(0xffffff),
48 disabled: rgb(0x565656),
49 selected: rgb(0x2457ca),
50 background: rgb(0x222222),
51 border: rgb(0x000000),
52 separator: rgb(0xd9d9d9),
53 container: rgb(0x262626),
54 }
55 }
56
57 /// Returns the default light colors.
58 pub fn light() -> Self {
59 Self {
60 text: rgb(0x252525),
61 selected_text: rgb(0xffffff),
62 background: rgb(0xffffff),
63 disabled: rgb(0xb0b0b0),
64 selected: rgb(0x2a63d9),
65 border: rgb(0xd9d9d9),
66 separator: rgb(0xe6e6e6),
67 container: rgb(0xf4f5f5),
68 }
69 }
70
71 /// Get [Colors] from the global state
72 pub fn get_global(cx: &App) -> &Arc<Colors> {
73 &cx.global::<GlobalColors>().0
74 }
75}
76
77/// Get [Colors] from the global state
78#[derive(Clone, Debug)]
79pub struct GlobalColors(pub Arc<Colors>);
80
81impl Deref for GlobalColors {
82 type Target = Arc<Colors>;
83
84 fn deref(&self) -> &Self::Target {
85 &self.0
86 }
87}
88
89impl Global for GlobalColors {}
90
91/// Implement this trait to allow global [Colors] access via `cx.default_colors()`.
92pub trait DefaultColors {
93 /// Returns the default [`Colors`]
94 fn default_colors(&self) -> &Arc<Colors>;
95}
96
97impl DefaultColors for App {
98 fn default_colors(&self) -> &Arc<Colors> {
99 &self.global::<GlobalColors>().0
100 }
101}
102
103/// The appearance of the base GPUI colors, used to style GPUI elements
104///
105/// Varies based on the system's current [`WindowAppearance`].
106#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
107pub enum DefaultAppearance {
108 /// Use the set of colors for light appearances.
109 #[default]
110 Light,
111 /// Use the set of colors for dark appearances.
112 Dark,
113}
114
115impl From<WindowAppearance> for DefaultAppearance {
116 fn from(appearance: WindowAppearance) -> Self {
117 match appearance {
118 WindowAppearance::Light | WindowAppearance::VibrantLight => Self::Light,
119 WindowAppearance::Dark | WindowAppearance::VibrantDark => Self::Dark,
120 }
121 }
122}