vtcode_ui/theme/
scheme.rs1use vtcode_commons::ansi_capabilities::{ColorScheme, detect_color_scheme};
2
3use crate::theme::color_math::relative_luminance;
4use crate::theme::registry::{available_theme_suites, theme_definition, theme_suite_id};
5use crate::theme::types::DEFAULT_THEME_ID;
6
7pub fn theme_matches_terminal_scheme(theme_id: &str) -> bool {
9 let scheme = detect_color_scheme();
10 let theme_is_light = is_light_theme(theme_id);
11
12 match scheme {
13 ColorScheme::Light => theme_is_light,
14 ColorScheme::Dark | ColorScheme::Unknown => !theme_is_light,
15 }
16}
17
18pub fn is_light_theme(theme_id: &str) -> bool {
20 theme_definition(theme_id)
21 .map(|theme| relative_luminance(theme.palette.background) > 0.5)
22 .unwrap_or(false)
23}
24
25pub fn suggest_theme_for_terminal() -> &'static str {
27 match detect_color_scheme() {
28 ColorScheme::Light => "vitesse-light",
29 ColorScheme::Dark | ColorScheme::Unknown => DEFAULT_THEME_ID,
30 }
31}
32
33pub fn theme_for_terminal_scheme_change(current_theme_id: &str, dark: bool) -> &'static str {
39 if let Some(suite_id) = theme_suite_id(current_theme_id)
40 && let Some(suite) = available_theme_suites().into_iter().find(|suite| suite.id == suite_id)
41 {
42 for theme_id in suite.theme_ids {
43 if is_light_theme(theme_id) != dark {
44 return theme_id;
45 }
46 }
47 }
48 suggest_theme_for_terminal()
49}