Skip to main content

codetether_agent/tui/
color_palette.rs

1use ratatui::style::Color;
2
3/// Centralized semantic color system for consistent theming across TUI components
4#[derive(Debug, Clone, Copy, PartialEq)]
5pub struct ColorPalette {
6    /// Color for user messages
7    pub user_message: Color,
8    /// Color for assistant messages
9    pub assistant_message: Color,
10    /// Color for system messages
11    pub system_message: Color,
12    /// Color for error states
13    pub error: Color,
14    /// Color for timestamps
15    pub timestamp: Color,
16    /// Color for borders and dividers
17    pub border: Color,
18    /// Color for code blocks
19    pub code_block: Color,
20    /// Color for tool messages
21    pub tool_message: Color,
22    /// Default text color
23    pub text: Color,
24    /// Background color
25    pub background: Color,
26}
27
28impl ColorPalette {
29    /// Create a new dark theme color palette with semantic colors
30    pub fn dark() -> Self {
31        Self {
32            user_message: Color::Cyan,
33            assistant_message: Color::Green,
34            system_message: Color::Yellow,
35            error: Color::Red,
36            timestamp: Color::Gray,
37            border: Color::Cyan,
38            code_block: Color::Gray,
39            tool_message: Color::Magenta,
40            text: Color::White,
41            background: Color::Black,
42        }
43    }
44
45    /// Create a new light theme color palette with semantic colors
46    pub fn light() -> Self {
47        Self {
48            user_message: Color::Blue,
49            assistant_message: Color::Green,
50            system_message: Color::Yellow,
51            error: Color::Red,
52            timestamp: Color::Gray,
53            border: Color::Gray,
54            code_block: Color::Gray,
55            tool_message: Color::Magenta,
56            text: Color::Black,
57            background: Color::White,
58        }
59    }
60
61    /// Create a solarized dark theme color palette
62    pub fn solarized_dark() -> Self {
63        Self {
64            user_message: Color::Rgb(133, 153, 0),       // green
65            assistant_message: Color::Rgb(42, 161, 152), // cyan
66            system_message: Color::Rgb(181, 137, 0),     // yellow
67            error: Color::Rgb(220, 50, 47),              // red
68            timestamp: Color::Rgb(101, 123, 131),        // base01
69            border: Color::Rgb(131, 148, 150),           // base1
70            code_block: Color::Rgb(88, 110, 117),        // base03
71            tool_message: Color::Rgb(211, 54, 130),      // magenta
72            text: Color::Rgb(238, 232, 213),             // base2
73            background: Color::Rgb(0, 43, 54),           // base03
74        }
75    }
76
77    /// Create a solarized light theme color palette
78    pub fn solarized_light() -> Self {
79        Self {
80            user_message: Color::Rgb(133, 153, 0),       // green
81            assistant_message: Color::Rgb(42, 161, 152), // cyan
82            system_message: Color::Rgb(181, 137, 0),     // yellow
83            error: Color::Rgb(220, 50, 47),              // red
84            timestamp: Color::Rgb(131, 148, 150),        // base1
85            border: Color::Rgb(88, 110, 117),            // base00
86            code_block: Color::Rgb(147, 161, 161),       // base1
87            tool_message: Color::Rgb(211, 54, 130),      // magenta
88            text: Color::Rgb(88, 110, 117),              // base00
89            background: Color::Rgb(253, 246, 227),       // base3
90        }
91    }
92
93    /// Marketing site inspired theme - dark with cyan accents
94    pub fn marketing() -> Self {
95        Self {
96            user_message: Color::Rgb(6, 182, 212),       // cyan-400
97            assistant_message: Color::Rgb(34, 211, 238), // cyan-300
98            system_message: Color::Rgb(250, 204, 21),    // yellow-400
99            error: Color::Rgb(248, 113, 113),            // red-400
100            timestamp: Color::Rgb(107, 114, 128),        // gray-500
101            border: Color::Rgb(31, 41, 55),              // gray-800
102            code_block: Color::Rgb(75, 85, 99),          // gray-600
103            tool_message: Color::Rgb(232, 121, 249),     // fuchsia-400
104            text: Color::Rgb(229, 231, 235),             // gray-200
105            background: Color::Rgb(3, 7, 18),            // gray-950
106        }
107    }
108
109    /// Get color based on message role
110    pub fn get_message_color(&self, role: &str) -> Color {
111        match role.to_lowercase().as_str() {
112            "user" => self.user_message,
113            "assistant" => self.assistant_message,
114            "system" => self.system_message,
115            "tool" => self.tool_message,
116            "error" => self.error,
117            _ => self.text,
118        }
119    }
120}
121
122impl Default for ColorPalette {
123    fn default() -> Self {
124        Self::marketing()
125    }
126}