1pub mod colors;
24pub mod config;
25pub mod derive;
26pub mod icons;
27
28use gpui_component::theme::{Theme, ThemeMode};
29use native_theme::{NativeTheme, ThemeVariant};
30
31#[deprecated(since = "0.3.2", note = "Use NativeTheme::pick_variant() instead")]
36#[allow(deprecated)]
37pub fn pick_variant(theme: &NativeTheme, is_dark: bool) -> Option<&ThemeVariant> {
38 theme.pick_variant(is_dark)
39}
40
41pub fn to_theme(variant: &ThemeVariant, name: &str, is_dark: bool) -> Theme {
48 let theme_color = colors::to_theme_color(variant);
49 let mode = if is_dark {
50 ThemeMode::Dark
51 } else {
52 ThemeMode::Light
53 };
54 let theme_config = config::to_theme_config(variant, name, mode);
55
56 let mut theme = Theme::from(&theme_color);
63 theme.apply_config(&theme_config.into());
64 theme.colors = theme_color;
65 theme
66}
67
68#[cfg(test)]
69#[allow(deprecated)]
70mod tests {
71 use super::*;
72 use native_theme::Rgba;
73
74 #[test]
75 fn pick_variant_light_first() {
76 let mut theme = NativeTheme::new("Test");
77 let mut light = ThemeVariant::default();
78 light.colors.background = Some(Rgba::rgb(255, 255, 255));
79 theme.light = Some(light);
80
81 let picked = pick_variant(&theme, false);
82 assert!(picked.is_some());
83 assert_eq!(
84 picked.unwrap().colors.background,
85 Some(Rgba::rgb(255, 255, 255))
86 );
87 }
88
89 #[test]
90 fn pick_variant_dark_first() {
91 let mut theme = NativeTheme::new("Test");
92 let mut dark = ThemeVariant::default();
93 dark.colors.background = Some(Rgba::rgb(30, 30, 30));
94 theme.dark = Some(dark);
95
96 let picked = pick_variant(&theme, true);
97 assert!(picked.is_some());
98 assert_eq!(
99 picked.unwrap().colors.background,
100 Some(Rgba::rgb(30, 30, 30))
101 );
102 }
103
104 #[test]
105 fn pick_variant_fallback() {
106 let mut theme = NativeTheme::new("Test");
107 let mut light = ThemeVariant::default();
108 light.colors.background = Some(Rgba::rgb(255, 255, 255));
109 theme.light = Some(light);
110 let picked = pick_variant(&theme, true);
112 assert!(picked.is_some());
113 }
114
115 #[test]
116 fn pick_variant_empty_returns_none() {
117 let theme = NativeTheme::new("Empty");
118 assert!(pick_variant(&theme, false).is_none());
119 assert!(pick_variant(&theme, true).is_none());
120 }
121
122 #[test]
123 fn to_theme_produces_valid_theme() {
124 let mut variant = ThemeVariant::default();
125 variant.colors.background = Some(Rgba::rgb(255, 255, 255));
126 variant.colors.foreground = Some(Rgba::rgb(0, 0, 0));
127 variant.colors.accent = Some(Rgba::rgb(0, 120, 215));
128 variant.fonts.family = Some("Inter".into());
129 variant.fonts.size = Some(14.0);
130 variant.geometry.radius = Some(4.0);
131
132 let theme = to_theme(&variant, "Test", false);
133
134 assert!(!theme.is_dark());
136 }
137}