Skip to main content

tui/theme/
defaults.rs

1use super::{Color, Theme, darken_color, lighten_color};
2
3impl Theme {
4    /// Catppuccin Mocha theme (dark, high contrast).
5    ///
6    /// This is the default theme and is always available without any
7    /// additional dependencies.
8    pub fn catppuccin_mocha() -> Self {
9        // Catppuccin Mocha palette
10        const TEXT: Color = Color::Rgb { r: 0xCD, g: 0xD6, b: 0xF4 };
11        const BASE: Color = Color::Rgb { r: 0x1E, g: 0x1E, b: 0x2E };
12        const ROSEWATER: Color = Color::Rgb { r: 0xF5, g: 0xE0, b: 0xDC };
13        const YELLOW: Color = Color::Rgb { r: 0xF9, g: 0xE2, b: 0xAF };
14        const BLUE: Color = Color::Rgb { r: 0x89, g: 0xB4, b: 0xFA };
15        const PINK: Color = Color::Rgb { r: 0xF5, g: 0xC2, b: 0xE7 };
16        const TEAL: Color = Color::Rgb { r: 0x94, g: 0xE2, b: 0xD5 };
17        const GREEN: Color = Color::Rgb { r: 0xA6, g: 0xE3, b: 0xA1 };
18        const PEACH: Color = Color::Rgb { r: 0xFA, g: 0xB3, b: 0x87 };
19        const RED: Color = Color::Rgb { r: 0xF3, g: 0x8B, b: 0xA8 };
20        const MAUVE: Color = Color::Rgb { r: 0xCB, g: 0xA6, b: 0xF7 };
21        const SURFACE1: Color = Color::Rgb { r: 0x45, g: 0x45, b: 0x45 };
22        const OVERLAY0: Color = Color::Rgb { r: 0x6C, g: 0x70, b: 0x85 };
23
24        Theme::builder()
25            .fg(TEXT)
26            .bg(BASE)
27            .accent(ROSEWATER)
28            .highlight_bg(Color::Rgb { r: 0x31, g: 0x4A, b: 0x56 })
29            .highlight_fg(TEXT)
30            .text_secondary(OVERLAY0)
31            .code_fg(GREEN)
32            .code_bg(SURFACE1)
33            .heading(YELLOW)
34            .link(BLUE)
35            .blockquote(PINK)
36            .muted(TEAL)
37            .success(GREEN)
38            .warning(PEACH)
39            .error(RED)
40            .info(BLUE)
41            .secondary(MAUVE)
42            .sidebar_bg(Color::Rgb { r: 0x24, g: 0x24, b: 0x36 })
43            .diff_added_fg(GREEN)
44            .diff_removed_fg(RED)
45            .diff_added_bg(darken_color(GREEN))
46            .diff_removed_bg(darken_color(RED))
47            .build()
48            .expect("built-in catppuccin_mocha theme has all fields")
49    }
50
51    /// A minimal light theme.
52    #[allow(dead_code)]
53    pub fn light() -> Self {
54        const FG: Color = Color::Rgb { r: 0x22, g: 0x22, b: 0x22 };
55        const BG: Color = Color::Rgb { r: 0xFA, g: 0xFA, b: 0xFA };
56        const ACCENT: Color = Color::Rgb { r: 0x00, g: 0x66, b: 0xCC };
57        const GREEN: Color = Color::Rgb { r: 0x22, g: 0x88, b: 0x22 };
58        const RED: Color = Color::Rgb { r: 0xCC, g: 0x22, b: 0x22 };
59        const ORANGE: Color = Color::Rgb { r: 0xCC, g: 0x66, b: 0x00 };
60
61        Theme::builder()
62            .fg(FG)
63            .bg(BG)
64            .accent(ACCENT)
65            .highlight_bg(Color::Rgb { r: 0xDD, g: 0xDD, b: 0xDD })
66            .highlight_fg(FG)
67            .text_secondary(Color::Rgb { r: 0x66, g: 0x66, b: 0x66 })
68            .code_fg(Color::Rgb { r: 0x33, g: 0x66, b: 0x33 })
69            .code_bg(Color::Rgb { r: 0xF0, g: 0xF0, b: 0xF0 })
70            .heading(ACCENT)
71            .link(Color::Rgb { r: 0x00, g: 0x44, b: 0xAA })
72            .blockquote(Color::Rgb { r: 0x66, g: 0x44, b: 0x88 })
73            .muted(Color::Rgb { r: 0x88, g: 0x88, b: 0x88 })
74            .success(GREEN)
75            .warning(ORANGE)
76            .error(RED)
77            .info(ACCENT)
78            .secondary(Color::Rgb { r: 0x66, g: 0x33, b: 0x99 })
79            .sidebar_bg(Color::Rgb { r: 0xF4, g: 0xF4, b: 0xF8 })
80            .diff_added_fg(GREEN)
81            .diff_removed_fg(RED)
82            .diff_added_bg(lighten_color(GREEN))
83            .diff_removed_bg(lighten_color(RED))
84            .build()
85            .expect("built-in light theme has all fields")
86    }
87}
88
89impl Default for Theme {
90    fn default() -> Self {
91        Self::catppuccin_mocha()
92    }
93}