Skip to main content

j_cli/command/chat/
theme.rs

1use ratatui::style::Color;
2use serde::{Deserialize, Serialize};
3
4/// 主题名称枚举
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub enum ThemeName {
7    #[serde(rename = "dark")]
8    Dark,
9    #[serde(rename = "light")]
10    Light,
11    #[serde(rename = "midnight")]
12    Midnight,
13    #[serde(rename = "nord")]
14    Nord,
15    #[serde(rename = "monokai")]
16    Monokai,
17}
18
19impl Default for ThemeName {
20    fn default() -> Self {
21        ThemeName::Midnight
22    }
23}
24
25#[allow(dead_code)]
26impl ThemeName {
27    /// 获取所有主题名称列表(用于配置界面循环切换)
28    pub fn all() -> &'static [ThemeName] {
29        &[
30            ThemeName::Dark,
31            ThemeName::Light,
32            ThemeName::Midnight,
33            ThemeName::Nord,
34            ThemeName::Monokai,
35        ]
36    }
37
38    /// 切换到下一个主题
39    pub fn next(&self) -> ThemeName {
40        match self {
41            ThemeName::Dark => ThemeName::Light,
42            ThemeName::Light => ThemeName::Midnight,
43            ThemeName::Midnight => ThemeName::Nord,
44            ThemeName::Nord => ThemeName::Monokai,
45            ThemeName::Monokai => ThemeName::Dark,
46        }
47    }
48
49    /// 显示名称
50    pub fn display_name(&self) -> &'static str {
51        match self {
52            ThemeName::Dark => "Dark",
53            ThemeName::Light => "Light",
54            ThemeName::Midnight => "Midnight(默认)",
55            ThemeName::Nord => "Nord",
56            ThemeName::Monokai => "Monokai",
57        }
58    }
59
60    /// 从字符串解析
61    pub fn from_str(s: &str) -> ThemeName {
62        match s.to_lowercase().as_str() {
63            "dark" => ThemeName::Dark,
64            "light" => ThemeName::Light,
65            "midnight" => ThemeName::Midnight,
66            "nord" => ThemeName::Nord,
67            "monokai" => ThemeName::Monokai,
68            _ => ThemeName::default(),
69        }
70    }
71
72    /// 转为字符串
73    pub fn to_str(&self) -> &'static str {
74        match self {
75            ThemeName::Dark => "dark",
76            ThemeName::Light => "light",
77            ThemeName::Midnight => "midnight",
78            ThemeName::Nord => "nord",
79            ThemeName::Monokai => "monokai",
80        }
81    }
82}
83
84/// 主题配色方案
85/// 将所有 UI 颜色归类为语义化字段,方便统一管理
86#[derive(Debug, Clone)]
87#[allow(dead_code)]
88pub struct Theme {
89    // ===== 全局背景 =====
90    /// 主背景色
91    pub bg_primary: Color,
92    /// 标题栏背景
93    pub bg_title: Color,
94    /// 输入区背景
95    pub bg_input: Color,
96    /// 帮助/配置界面背景
97    pub bg_panel: Color,
98
99    // ===== 边框 =====
100    /// 标题栏边框
101    pub border_title: Color,
102    /// 消息区边框
103    pub border_message: Color,
104    /// 输入区边框(正常)
105    pub border_input: Color,
106    /// 输入区边框(加载中)
107    pub border_input_loading: Color,
108    /// 配置界面边框
109    pub border_config: Color,
110    /// 分隔线
111    pub separator: Color,
112
113    // ===== 气泡 =====
114    /// AI 气泡背景
115    pub bubble_ai: Color,
116    /// AI 气泡背景(选中时)
117    pub bubble_ai_selected: Color,
118    /// 用户气泡背景
119    pub bubble_user: Color,
120    /// 用户气泡背景(选中时)
121    pub bubble_user_selected: Color,
122
123    // ===== 标签 =====
124    /// AI 标签颜色
125    pub label_ai: Color,
126    /// 用户标签颜色
127    pub label_user: Color,
128    /// 选中标签颜色
129    pub label_selected: Color,
130
131    // ===== 文字 =====
132    /// 正文颜色
133    pub text_normal: Color,
134    /// 强调色(加粗文本)
135    pub text_bold: Color,
136    /// 弱化文字
137    pub text_dim: Color,
138    /// 非常弱化的文字
139    pub text_very_dim: Color,
140    /// 白色文字(用于输入区等)
141    pub text_white: Color,
142    /// 系统消息颜色
143    pub text_system: Color,
144
145    // ===== 标题栏元素 =====
146    /// 标题栏图标色
147    pub title_icon: Color,
148    /// 标题栏分隔符
149    pub title_separator: Color,
150    /// 模型名称颜色
151    pub title_model: Color,
152    /// 消息计数颜色
153    pub title_count: Color,
154    /// 加载中文字颜色
155    pub title_loading: Color,
156
157    // ===== 输入区 =====
158    /// 输入提示符颜色
159    pub input_prompt: Color,
160    /// 输入提示符(加载中)颜色
161    pub input_prompt_loading: Color,
162    /// 光标前景
163    pub cursor_fg: Color,
164    /// 光标背景
165    pub cursor_bg: Color,
166
167    // ===== 提示栏 =====
168    /// 键位标签前景
169    pub hint_key_fg: Color,
170    /// 键位标签背景
171    pub hint_key_bg: Color,
172    /// 键位描述文字
173    pub hint_desc: Color,
174    /// 提示栏分隔符
175    pub hint_separator: Color,
176
177    // ===== Toast =====
178    /// 成功 Toast 边框
179    pub toast_success_border: Color,
180    /// 成功 Toast 背景
181    pub toast_success_bg: Color,
182    /// 成功 Toast 文字
183    pub toast_success_text: Color,
184    /// 错误 Toast 边框
185    pub toast_error_border: Color,
186    /// 错误 Toast 背景
187    pub toast_error_bg: Color,
188    /// 错误 Toast 文字
189    pub toast_error_text: Color,
190
191    // ===== 工具确认区 =====
192    /// 工具确认区边框
193    pub tool_confirm_border: Color,
194    /// 工具确认区背景
195    pub tool_confirm_bg: Color,
196    /// 工具确认区标题颜色
197    pub tool_confirm_title: Color,
198    /// 工具确认区工具名颜色
199    pub tool_confirm_name: Color,
200    /// 工具确认区消息文字颜色
201    pub tool_confirm_text: Color,
202    /// 工具确认区标签颜色(如"工具:")
203    pub tool_confirm_label: Color,
204    /// 工具确认区提示文字颜色
205    pub tool_confirm_hint: Color,
206
207    // ===== 欢迎界面 =====
208    /// 欢迎框边框
209    pub welcome_border: Color,
210    /// 欢迎文字
211    pub welcome_text: Color,
212    /// 欢迎提示文字
213    pub welcome_hint: Color,
214
215    // ===== 模型选择 =====
216    /// 模型选择框边框
217    pub model_sel_border: Color,
218    /// 模型选择框标题
219    pub model_sel_title: Color,
220    /// 活跃模型颜色
221    pub model_sel_active: Color,
222    /// 非活跃模型颜色
223    pub model_sel_inactive: Color,
224    /// 选中高亮背景
225    pub model_sel_highlight_bg: Color,
226
227    // ===== 配置界面 =====
228    /// 配置标题颜色
229    pub config_title: Color,
230    /// 配置分类标题颜色
231    pub config_section: Color,
232    /// 配置选中指针颜色
233    pub config_pointer: Color,
234    /// 配置选中标签颜色
235    pub config_label_selected: Color,
236    /// 配置普通标签颜色
237    pub config_label: Color,
238    /// 配置值颜色
239    pub config_value: Color,
240    /// 配置编辑背景
241    pub config_edit_bg: Color,
242    /// 配置 tab 选中背景
243    pub config_tab_active_bg: Color,
244    /// 配置 tab 选中前景
245    pub config_tab_active_fg: Color,
246    /// 配置 tab 非选中颜色
247    pub config_tab_inactive: Color,
248    /// 配置键位说明颜色
249    pub config_hint_key: Color,
250    /// 配置描述颜色
251    pub config_hint_desc: Color,
252    /// 配置 toggle 开启颜色
253    pub config_toggle_on: Color,
254    /// 配置 toggle 关闭颜色
255    pub config_toggle_off: Color,
256    /// 配置弱化文字
257    pub config_dim: Color,
258    /// API Key 隐藏颜色
259    pub config_api_key: Color,
260
261    // ===== Markdown 渲染 =====
262    /// 标题 h1 颜色
263    pub md_h1: Color,
264    /// 标题 h2 颜色
265    pub md_h2: Color,
266    /// 标题 h3 颜色
267    pub md_h3: Color,
268    /// 标题 h4+ 颜色
269    pub md_h4: Color,
270    /// 标题分隔线
271    pub md_heading_sep: Color,
272    /// 行内代码前景
273    pub md_inline_code_fg: Color,
274    /// 行内代码背景
275    pub md_inline_code_bg: Color,
276    /// 列表符号颜色
277    pub md_list_bullet: Color,
278    /// 引用块竖线颜色
279    pub md_blockquote_bar: Color,
280    /// 引用块文字颜色
281    pub md_blockquote_text: Color,
282    /// 分隔线颜色
283    pub md_rule: Color,
284
285    // ===== 代码块 =====
286    /// 代码块边框颜色
287    pub code_border: Color,
288    /// 代码块背景
289    pub code_bg: Color,
290    /// 代码默认文字颜色
291    pub code_default: Color,
292    /// 关键字颜色
293    pub code_keyword: Color,
294    /// 字符串颜色
295    pub code_string: Color,
296    /// 注释颜色
297    pub code_comment: Color,
298    /// 数字颜色
299    pub code_number: Color,
300    /// 类型名颜色
301    pub code_type: Color,
302    /// 原始类型颜色
303    pub code_primitive: Color,
304    /// 宏调用颜色
305    pub code_macro: Color,
306    /// 属性/装饰器颜色
307    pub code_attribute: Color,
308    /// 生命周期颜色
309    pub code_lifetime: Color,
310    /// Shell 变量颜色
311    pub code_shell_var: Color,
312
313    // ===== 表格 =====
314    /// 表格边框颜色
315    pub table_border: Color,
316    /// 表格表头颜色
317    pub table_header: Color,
318    /// 表格内容颜色
319    pub table_body: Color,
320
321    // ===== 帮助界面 =====
322    /// 帮助标题颜色
323    pub help_title: Color,
324    /// 帮助按键颜色
325    pub help_key: Color,
326    /// 帮助描述颜色
327    pub help_desc: Color,
328    /// 帮助文件路径颜色
329    pub help_path: Color,
330    /// 帮助背景颜色
331    pub help_bg: Color,
332}
333
334impl Theme {
335    /// 根据主题名称创建对应的主题
336    pub fn from_name(name: &ThemeName) -> Self {
337        match name {
338            ThemeName::Dark => Self::dark(),
339            ThemeName::Light => Self::light(),
340            ThemeName::Midnight => Self::midnight(),
341            ThemeName::Nord => Self::nord(),
342            ThemeName::Monokai => Self::monokai(),
343        }
344    }
345
346    /// Midnight 主题(原始深色主题 - 默认)
347    pub fn midnight() -> Self {
348        Self {
349            // 全局背景
350            bg_primary: Color::Rgb(22, 22, 30),
351            bg_title: Color::Rgb(28, 28, 40),
352            bg_input: Color::Rgb(26, 26, 38),
353            bg_panel: Color::Rgb(24, 24, 34),
354
355            // 边框
356            border_title: Color::Rgb(80, 100, 140),
357            border_message: Color::Rgb(50, 55, 70),
358            border_input: Color::Rgb(60, 100, 80),
359            border_input_loading: Color::Rgb(120, 100, 50),
360            border_config: Color::Rgb(80, 80, 110),
361            separator: Color::Rgb(50, 55, 70),
362
363            // 气泡
364            bubble_ai: Color::Rgb(28, 28, 38),
365            bubble_ai_selected: Color::Rgb(255, 255, 255),
366            bubble_user: Color::Rgb(40, 70, 120),
367            bubble_user_selected: Color::Rgb(255, 255, 255),
368
369            // 标签
370            label_ai: Color::Rgb(120, 220, 160),
371            label_user: Color::Rgb(100, 160, 255),
372            label_selected: Color::Rgb(255, 200, 80),
373
374            // 文字
375            text_normal: Color::Rgb(220, 220, 230),
376            text_bold: Color::Rgb(220, 245, 230),
377            text_dim: Color::Rgb(140, 140, 170),
378            text_very_dim: Color::Rgb(80, 80, 100),
379            text_white: Color::White,
380            text_system: Color::Rgb(100, 100, 120),
381
382            // 标题栏
383            title_icon: Color::Rgb(120, 180, 255),
384            title_separator: Color::Rgb(60, 60, 80),
385            title_model: Color::Rgb(160, 220, 160),
386            title_count: Color::Rgb(180, 180, 200),
387            title_loading: Color::Rgb(255, 200, 80),
388
389            // 输入区
390            input_prompt: Color::Rgb(100, 200, 130),
391            input_prompt_loading: Color::Rgb(255, 200, 80),
392            cursor_fg: Color::Rgb(22, 22, 30),
393            cursor_bg: Color::Rgb(200, 210, 240),
394
395            // 提示栏
396            hint_key_fg: Color::Rgb(22, 22, 30),
397            hint_key_bg: Color::Rgb(100, 110, 140),
398            hint_desc: Color::Rgb(120, 120, 150),
399            hint_separator: Color::Rgb(50, 50, 65),
400
401            // Toast
402            toast_success_border: Color::Rgb(60, 160, 80),
403            toast_success_bg: Color::Rgb(18, 40, 25),
404            toast_success_text: Color::Rgb(140, 230, 160),
405            toast_error_border: Color::Rgb(200, 70, 70),
406            toast_error_bg: Color::Rgb(50, 18, 18),
407            toast_error_text: Color::Rgb(255, 130, 130),
408
409            // 工具确认区
410            tool_confirm_border: Color::Rgb(200, 180, 80),
411            tool_confirm_bg: Color::Rgb(35, 30, 15),
412            tool_confirm_title: Color::Rgb(255, 220, 100),
413            tool_confirm_name: Color::Rgb(255, 220, 100),
414            tool_confirm_text: Color::Rgb(220, 220, 230),
415            tool_confirm_label: Color::Rgb(140, 140, 160),
416            tool_confirm_hint: Color::Rgb(180, 180, 200),
417
418            // 欢迎界面
419            welcome_border: Color::Rgb(60, 70, 90),
420            welcome_text: Color::Rgb(120, 140, 180),
421            welcome_hint: Color::Rgb(80, 90, 110),
422
423            // 模型选择
424            model_sel_border: Color::Rgb(180, 160, 80),
425            model_sel_title: Color::Rgb(230, 210, 120),
426            model_sel_active: Color::Rgb(120, 220, 160),
427            model_sel_inactive: Color::Rgb(180, 180, 200),
428            model_sel_highlight_bg: Color::Rgb(50, 55, 80),
429
430            // 配置界面
431            config_title: Color::Rgb(120, 180, 255),
432            config_section: Color::Rgb(160, 220, 160),
433            config_pointer: Color::Rgb(255, 200, 80),
434            config_label_selected: Color::Rgb(230, 210, 120),
435            config_label: Color::Rgb(140, 140, 160),
436            config_value: Color::Rgb(180, 180, 200),
437            config_edit_bg: Color::Rgb(50, 55, 80),
438            config_tab_active_bg: Color::Rgb(120, 180, 255),
439            config_tab_active_fg: Color::Rgb(22, 22, 30),
440            config_tab_inactive: Color::Rgb(150, 150, 170),
441            config_hint_key: Color::Rgb(230, 210, 120),
442            config_hint_desc: Color::Rgb(120, 120, 150),
443            config_toggle_on: Color::Rgb(120, 220, 160),
444            config_toggle_off: Color::Rgb(200, 100, 100),
445            config_dim: Color::Rgb(80, 80, 100),
446            config_api_key: Color::Rgb(100, 100, 120),
447
448            // Markdown
449            md_h1: Color::Rgb(100, 180, 255),
450            md_h2: Color::Rgb(130, 190, 255),
451            md_h3: Color::Rgb(160, 200, 255),
452            md_h4: Color::Rgb(180, 210, 255),
453            md_heading_sep: Color::Rgb(60, 70, 100),
454            md_inline_code_fg: Color::Rgb(230, 190, 120),
455            md_inline_code_bg: Color::Rgb(45, 45, 60),
456            md_list_bullet: Color::Rgb(100, 160, 255),
457            md_blockquote_bar: Color::Rgb(80, 100, 140),
458            md_blockquote_text: Color::Rgb(150, 160, 180),
459            md_rule: Color::Rgb(70, 75, 90),
460
461            // 代码块
462            code_border: Color::Rgb(80, 90, 110),
463            code_bg: Color::Rgb(30, 30, 42),
464            code_default: Color::Rgb(171, 178, 191),
465            code_keyword: Color::Rgb(198, 120, 221),
466            code_string: Color::Rgb(152, 195, 121),
467            code_comment: Color::Rgb(92, 99, 112),
468            code_number: Color::Rgb(209, 154, 102),
469            code_type: Color::Rgb(229, 192, 123),
470            code_primitive: Color::Rgb(86, 182, 194),
471            code_macro: Color::Rgb(97, 175, 239),
472            code_attribute: Color::Rgb(86, 182, 194),
473            code_lifetime: Color::Rgb(229, 192, 123),
474            code_shell_var: Color::Rgb(86, 182, 194),
475
476            // 表格
477            table_border: Color::Rgb(60, 70, 100),
478            table_header: Color::Rgb(120, 180, 255),
479            table_body: Color::Rgb(180, 180, 200),
480
481            // 帮助界面
482            help_title: Color::Rgb(120, 180, 255),
483            help_key: Color::Rgb(230, 210, 120),
484            help_desc: Color::Rgb(200, 200, 220),
485            help_path: Color::Rgb(100, 100, 130),
486            help_bg: Color::Rgb(24, 24, 34),
487        }
488    }
489
490    /// Dark 主题(偏灰暗的深色主题,类似 VS Code Dark+)
491    pub fn dark() -> Self {
492        Self {
493            // 全局背景
494            bg_primary: Color::Rgb(30, 30, 30),
495            bg_title: Color::Rgb(37, 37, 38),
496            bg_input: Color::Rgb(37, 37, 38),
497            bg_panel: Color::Rgb(37, 37, 38),
498
499            // 边框
500            border_title: Color::Rgb(70, 70, 70),
501            border_message: Color::Rgb(55, 55, 55),
502            border_input: Color::Rgb(55, 80, 55),
503            border_input_loading: Color::Rgb(120, 100, 50),
504            border_config: Color::Rgb(70, 70, 70),
505            separator: Color::Rgb(55, 55, 55),
506
507            // 气泡
508            bubble_ai: Color::Rgb(34, 34, 34),
509            bubble_ai_selected: Color::Rgb(255, 255, 255),
510            bubble_user: Color::Rgb(38, 65, 110),
511            bubble_user_selected: Color::Rgb(255, 255, 255),
512
513            // 标签
514            label_ai: Color::Rgb(80, 200, 120),
515            label_user: Color::Rgb(80, 150, 240),
516            label_selected: Color::Rgb(255, 200, 80),
517
518            // 文字
519            text_normal: Color::Rgb(212, 212, 212),
520            text_bold: Color::Rgb(210, 240, 220),
521            text_dim: Color::Rgb(128, 128, 128),
522            text_very_dim: Color::Rgb(80, 80, 80),
523            text_white: Color::White,
524            text_system: Color::Rgb(100, 100, 100),
525
526            // 标题栏
527            title_icon: Color::Rgb(100, 160, 240),
528            title_separator: Color::Rgb(60, 60, 60),
529            title_model: Color::Rgb(140, 200, 140),
530            title_count: Color::Rgb(170, 170, 170),
531            title_loading: Color::Rgb(255, 200, 80),
532
533            // 输入区
534            input_prompt: Color::Rgb(80, 180, 100),
535            input_prompt_loading: Color::Rgb(255, 200, 80),
536            cursor_fg: Color::Rgb(30, 30, 30),
537            cursor_bg: Color::Rgb(200, 200, 200),
538
539            // 提示栏
540            hint_key_fg: Color::Rgb(30, 30, 30),
541            hint_key_bg: Color::Rgb(100, 100, 100),
542            hint_desc: Color::Rgb(128, 128, 128),
543            hint_separator: Color::Rgb(50, 50, 50),
544
545            // Toast
546            toast_success_border: Color::Rgb(60, 160, 80),
547            toast_success_bg: Color::Rgb(20, 40, 25),
548            toast_success_text: Color::Rgb(140, 230, 160),
549            toast_error_border: Color::Rgb(200, 70, 70),
550            toast_error_bg: Color::Rgb(50, 20, 20),
551            toast_error_text: Color::Rgb(255, 130, 130),
552
553            // 工具确认区
554            tool_confirm_border: Color::Rgb(200, 180, 80),
555            tool_confirm_bg: Color::Rgb(40, 35, 20),
556            tool_confirm_title: Color::Rgb(255, 220, 100),
557            tool_confirm_name: Color::Rgb(255, 220, 100),
558            tool_confirm_text: Color::Rgb(212, 212, 212),
559            tool_confirm_label: Color::Rgb(128, 128, 128),
560            tool_confirm_hint: Color::Rgb(170, 170, 170),
561
562            // 欢迎界面
563            welcome_border: Color::Rgb(60, 60, 60),
564            welcome_text: Color::Rgb(120, 140, 180),
565            welcome_hint: Color::Rgb(80, 80, 80),
566
567            // 模型选择
568            model_sel_border: Color::Rgb(180, 160, 80),
569            model_sel_title: Color::Rgb(230, 210, 120),
570            model_sel_active: Color::Rgb(80, 200, 120),
571            model_sel_inactive: Color::Rgb(170, 170, 170),
572            model_sel_highlight_bg: Color::Rgb(50, 50, 60),
573
574            // 配置界面
575            config_title: Color::Rgb(100, 160, 240),
576            config_section: Color::Rgb(140, 200, 140),
577            config_pointer: Color::Rgb(255, 200, 80),
578            config_label_selected: Color::Rgb(230, 210, 120),
579            config_label: Color::Rgb(128, 128, 128),
580            config_value: Color::Rgb(170, 170, 170),
581            config_edit_bg: Color::Rgb(50, 50, 60),
582            config_tab_active_bg: Color::Rgb(100, 160, 240),
583            config_tab_active_fg: Color::Rgb(30, 30, 30),
584            config_tab_inactive: Color::Rgb(140, 140, 140),
585            config_hint_key: Color::Rgb(230, 210, 120),
586            config_hint_desc: Color::Rgb(128, 128, 128),
587            config_toggle_on: Color::Rgb(80, 200, 120),
588            config_toggle_off: Color::Rgb(200, 100, 100),
589            config_dim: Color::Rgb(80, 80, 80),
590            config_api_key: Color::Rgb(100, 100, 100),
591
592            // Markdown
593            md_h1: Color::Rgb(80, 160, 240),
594            md_h2: Color::Rgb(100, 170, 240),
595            md_h3: Color::Rgb(120, 180, 240),
596            md_h4: Color::Rgb(140, 190, 240),
597            md_heading_sep: Color::Rgb(60, 60, 80),
598            md_inline_code_fg: Color::Rgb(220, 180, 110),
599            md_inline_code_bg: Color::Rgb(50, 50, 60),
600            md_list_bullet: Color::Rgb(80, 150, 240),
601            md_blockquote_bar: Color::Rgb(70, 90, 130),
602            md_blockquote_text: Color::Rgb(150, 150, 170),
603            md_rule: Color::Rgb(70, 70, 80),
604
605            // 代码块
606            code_border: Color::Rgb(70, 70, 80),
607            code_bg: Color::Rgb(35, 35, 38),
608            code_default: Color::Rgb(212, 212, 212),
609            code_keyword: Color::Rgb(198, 120, 221),
610            code_string: Color::Rgb(152, 195, 121),
611            code_comment: Color::Rgb(106, 115, 125),
612            code_number: Color::Rgb(209, 154, 102),
613            code_type: Color::Rgb(229, 192, 123),
614            code_primitive: Color::Rgb(86, 182, 194),
615            code_macro: Color::Rgb(97, 175, 239),
616            code_attribute: Color::Rgb(86, 182, 194),
617            code_lifetime: Color::Rgb(229, 192, 123),
618            code_shell_var: Color::Rgb(86, 182, 194),
619
620            // 表格
621            table_border: Color::Rgb(60, 60, 80),
622            table_header: Color::Rgb(80, 160, 240),
623            table_body: Color::Rgb(170, 170, 170),
624
625            // 帮助界面
626            help_title: Color::Rgb(100, 160, 240),
627            help_key: Color::Rgb(230, 210, 120),
628            help_desc: Color::Rgb(200, 200, 200),
629            help_path: Color::Rgb(100, 100, 100),
630            help_bg: Color::Rgb(37, 37, 38),
631        }
632    }
633
634    /// Light 主题(浅色主题,类似 VS Code Light+)
635    pub fn light() -> Self {
636        Self {
637            // 全局背景
638            bg_primary: Color::Rgb(255, 255, 255),
639            bg_title: Color::Rgb(243, 243, 243),
640            bg_input: Color::Rgb(248, 248, 248),
641            bg_panel: Color::Rgb(248, 248, 248),
642
643            // 边框
644            border_title: Color::Rgb(190, 190, 200),
645            border_message: Color::Rgb(210, 210, 220),
646            border_input: Color::Rgb(160, 200, 160),
647            border_input_loading: Color::Rgb(180, 150, 50),
648            border_config: Color::Rgb(190, 190, 200),
649            separator: Color::Rgb(210, 210, 220),
650
651            // 气泡
652            bubble_ai: Color::Rgb(244, 244, 248),
653            bubble_ai_selected: Color::Rgb(255, 255, 255),
654            bubble_user: Color::Rgb(210, 230, 255),
655            bubble_user_selected: Color::Rgb(255, 255, 255),
656
657            // 标签
658            label_ai: Color::Rgb(40, 140, 80),
659            label_user: Color::Rgb(30, 100, 200),
660            label_selected: Color::Rgb(180, 130, 20),
661
662            // 文字
663            text_normal: Color::Rgb(40, 40, 50),
664            text_bold: Color::Rgb(30, 100, 60),
665            text_dim: Color::Rgb(120, 120, 140),
666            text_very_dim: Color::Rgb(170, 170, 180),
667            text_white: Color::Rgb(40, 40, 50),
668            text_system: Color::Rgb(140, 140, 160),
669
670            // 标题栏
671            title_icon: Color::Rgb(40, 100, 200),
672            title_separator: Color::Rgb(200, 200, 210),
673            title_model: Color::Rgb(40, 140, 80),
674            title_count: Color::Rgb(100, 100, 120),
675            title_loading: Color::Rgb(180, 130, 20),
676
677            // 输入区
678            input_prompt: Color::Rgb(40, 140, 80),
679            input_prompt_loading: Color::Rgb(180, 130, 20),
680            cursor_fg: Color::Rgb(255, 255, 255),
681            cursor_bg: Color::Rgb(50, 100, 200),
682
683            // 提示栏
684            hint_key_fg: Color::Rgb(255, 255, 255),
685            hint_key_bg: Color::Rgb(100, 110, 130),
686            hint_desc: Color::Rgb(120, 120, 140),
687            hint_separator: Color::Rgb(210, 210, 220),
688
689            // Toast
690            toast_success_border: Color::Rgb(60, 160, 80),
691            toast_success_bg: Color::Rgb(230, 250, 235),
692            toast_success_text: Color::Rgb(30, 100, 50),
693            toast_error_border: Color::Rgb(200, 70, 70),
694            toast_error_bg: Color::Rgb(255, 235, 235),
695            toast_error_text: Color::Rgb(160, 30, 30),
696
697            // 工具确认区
698            tool_confirm_border: Color::Rgb(180, 140, 40),
699            tool_confirm_bg: Color::Rgb(255, 250, 235),
700            tool_confirm_title: Color::Rgb(160, 120, 20),
701            tool_confirm_name: Color::Rgb(160, 120, 20),
702            tool_confirm_text: Color::Rgb(40, 40, 50),
703            tool_confirm_label: Color::Rgb(120, 120, 140),
704            tool_confirm_hint: Color::Rgb(80, 80, 100),
705
706            // 欢迎界面
707            welcome_border: Color::Rgb(180, 190, 210),
708            welcome_text: Color::Rgb(60, 80, 130),
709            welcome_hint: Color::Rgb(140, 150, 170),
710
711            // 模型选择
712            model_sel_border: Color::Rgb(180, 160, 80),
713            model_sel_title: Color::Rgb(140, 110, 30),
714            model_sel_active: Color::Rgb(40, 140, 80),
715            model_sel_inactive: Color::Rgb(100, 100, 120),
716            model_sel_highlight_bg: Color::Rgb(225, 230, 245),
717
718            // 配置界面
719            config_title: Color::Rgb(40, 100, 200),
720            config_section: Color::Rgb(40, 140, 80),
721            config_pointer: Color::Rgb(180, 130, 20),
722            config_label_selected: Color::Rgb(140, 110, 30),
723            config_label: Color::Rgb(120, 120, 140),
724            config_value: Color::Rgb(60, 60, 80),
725            config_edit_bg: Color::Rgb(225, 230, 245),
726            config_tab_active_bg: Color::Rgb(40, 100, 200),
727            config_tab_active_fg: Color::Rgb(255, 255, 255),
728            config_tab_inactive: Color::Rgb(120, 120, 140),
729            config_hint_key: Color::Rgb(140, 110, 30),
730            config_hint_desc: Color::Rgb(120, 120, 140),
731            config_toggle_on: Color::Rgb(40, 140, 80),
732            config_toggle_off: Color::Rgb(200, 80, 80),
733            config_dim: Color::Rgb(170, 170, 180),
734            config_api_key: Color::Rgb(160, 160, 170),
735
736            // Markdown
737            md_h1: Color::Rgb(30, 80, 180),
738            md_h2: Color::Rgb(40, 100, 200),
739            md_h3: Color::Rgb(50, 110, 210),
740            md_h4: Color::Rgb(60, 120, 220),
741            md_heading_sep: Color::Rgb(180, 190, 210),
742            md_inline_code_fg: Color::Rgb(160, 80, 30),
743            md_inline_code_bg: Color::Rgb(240, 235, 225),
744            md_list_bullet: Color::Rgb(30, 100, 200),
745            md_blockquote_bar: Color::Rgb(100, 130, 180),
746            md_blockquote_text: Color::Rgb(80, 90, 110),
747            md_rule: Color::Rgb(190, 195, 210),
748
749            // 代码块(VS Code Light+ 风格)
750            code_border: Color::Rgb(190, 195, 210),
751            code_bg: Color::Rgb(245, 245, 248),
752            code_default: Color::Rgb(40, 40, 50),
753            code_keyword: Color::Rgb(175, 0, 219),
754            code_string: Color::Rgb(163, 21, 21),
755            code_comment: Color::Rgb(0, 128, 0),
756            code_number: Color::Rgb(9, 134, 88),
757            code_type: Color::Rgb(38, 127, 153),
758            code_primitive: Color::Rgb(0, 112, 193),
759            code_macro: Color::Rgb(121, 94, 38),
760            code_attribute: Color::Rgb(0, 112, 193),
761            code_lifetime: Color::Rgb(38, 127, 153),
762            code_shell_var: Color::Rgb(0, 112, 193),
763
764            // 表格
765            table_border: Color::Rgb(180, 190, 210),
766            table_header: Color::Rgb(30, 80, 180),
767            table_body: Color::Rgb(60, 60, 80),
768
769            // 帮助界面
770            help_title: Color::Rgb(40, 100, 200),
771            help_key: Color::Rgb(140, 110, 30),
772            help_desc: Color::Rgb(50, 50, 60),
773            help_path: Color::Rgb(120, 120, 140),
774            help_bg: Color::Rgb(248, 248, 248),
775        }
776    }
777
778    /// Nord 主题(基于 Nord 配色方案 - 极地冰蓝色调)
779    pub fn nord() -> Self {
780        Self {
781            // 全局背景 — Polar Night
782            bg_primary: Color::Rgb(46, 52, 64), // nord0
783            bg_title: Color::Rgb(59, 66, 82),   // nord1
784            bg_input: Color::Rgb(59, 66, 82),   // nord1
785            bg_panel: Color::Rgb(59, 66, 82),   // nord1
786
787            // 边框 — Polar Night / Snow Storm
788            border_title: Color::Rgb(76, 86, 106),  // nord3
789            border_message: Color::Rgb(67, 76, 94), // nord2
790            border_input: Color::Rgb(76, 86, 106),  // nord3
791            border_input_loading: Color::Rgb(235, 203, 139), // nord13
792            border_config: Color::Rgb(76, 86, 106), // nord3
793            separator: Color::Rgb(67, 76, 94),      // nord2
794
795            // 气泡
796            bubble_ai: Color::Rgb(50, 56, 68),
797            bubble_ai_selected: Color::Rgb(255, 255, 255),
798            bubble_user: Color::Rgb(52, 75, 110),
799            bubble_user_selected: Color::Rgb(255, 255, 255),
800
801            // 标签 — Frost / Aurora
802            label_ai: Color::Rgb(163, 190, 140),       // nord14
803            label_user: Color::Rgb(129, 161, 193),     // nord9
804            label_selected: Color::Rgb(235, 203, 139), // nord13
805
806            // 文字
807            text_normal: Color::Rgb(216, 222, 233), // nord4
808            text_bold: Color::Rgb(210, 235, 220),
809            text_dim: Color::Rgb(128, 140, 160),
810            text_very_dim: Color::Rgb(76, 86, 106), // nord3
811            text_white: Color::Rgb(236, 239, 244),  // nord6
812            text_system: Color::Rgb(100, 112, 130),
813
814            // 标题栏
815            title_icon: Color::Rgb(136, 192, 208),   // nord8
816            title_separator: Color::Rgb(67, 76, 94), // nord2
817            title_model: Color::Rgb(163, 190, 140),  // nord14
818            title_count: Color::Rgb(178, 186, 202),
819            title_loading: Color::Rgb(235, 203, 139), // nord13
820
821            // 输入区
822            input_prompt: Color::Rgb(163, 190, 140), // nord14
823            input_prompt_loading: Color::Rgb(235, 203, 139), // nord13
824            cursor_fg: Color::Rgb(46, 52, 64),       // nord0
825            cursor_bg: Color::Rgb(216, 222, 233),    // nord4
826
827            // 提示栏
828            hint_key_fg: Color::Rgb(46, 52, 64),  // nord0
829            hint_key_bg: Color::Rgb(76, 86, 106), // nord3
830            hint_desc: Color::Rgb(128, 140, 160),
831            hint_separator: Color::Rgb(59, 66, 82), // nord1
832
833            // Toast
834            toast_success_border: Color::Rgb(163, 190, 140), // nord14
835            toast_success_bg: Color::Rgb(50, 60, 55),
836            toast_success_text: Color::Rgb(163, 190, 140),
837            toast_error_border: Color::Rgb(191, 97, 106), // nord11
838            toast_error_bg: Color::Rgb(60, 50, 52),
839            toast_error_text: Color::Rgb(191, 97, 106),
840
841            // 工具确认区
842            tool_confirm_border: Color::Rgb(235, 203, 139), // nord13
843            tool_confirm_bg: Color::Rgb(52, 58, 70),
844            tool_confirm_title: Color::Rgb(235, 203, 139),
845            tool_confirm_name: Color::Rgb(235, 203, 139),
846            tool_confirm_text: Color::Rgb(216, 222, 233), // nord4
847            tool_confirm_label: Color::Rgb(128, 140, 160),
848            tool_confirm_hint: Color::Rgb(178, 186, 202),
849
850            // 欢迎界面
851            welcome_border: Color::Rgb(76, 86, 106), // nord3
852            welcome_text: Color::Rgb(136, 192, 208), // nord8
853            welcome_hint: Color::Rgb(100, 112, 130),
854
855            // 模型选择
856            model_sel_border: Color::Rgb(235, 203, 139), // nord13
857            model_sel_title: Color::Rgb(235, 203, 139),
858            model_sel_active: Color::Rgb(163, 190, 140), // nord14
859            model_sel_inactive: Color::Rgb(178, 186, 202),
860            model_sel_highlight_bg: Color::Rgb(67, 76, 94), // nord2
861
862            // 配置界面
863            config_title: Color::Rgb(129, 161, 193), // nord9
864            config_section: Color::Rgb(163, 190, 140), // nord14
865            config_pointer: Color::Rgb(235, 203, 139), // nord13
866            config_label_selected: Color::Rgb(235, 203, 139),
867            config_label: Color::Rgb(128, 140, 160),
868            config_value: Color::Rgb(178, 186, 202),
869            config_edit_bg: Color::Rgb(67, 76, 94), // nord2
870            config_tab_active_bg: Color::Rgb(129, 161, 193), // nord9
871            config_tab_active_fg: Color::Rgb(46, 52, 64), // nord0
872            config_tab_inactive: Color::Rgb(128, 140, 160),
873            config_hint_key: Color::Rgb(235, 203, 139),
874            config_hint_desc: Color::Rgb(128, 140, 160),
875            config_toggle_on: Color::Rgb(163, 190, 140), // nord14
876            config_toggle_off: Color::Rgb(191, 97, 106), // nord11
877            config_dim: Color::Rgb(76, 86, 106),         // nord3
878            config_api_key: Color::Rgb(100, 112, 130),
879
880            // Markdown — Frost colors
881            md_h1: Color::Rgb(136, 192, 208), // nord8
882            md_h2: Color::Rgb(129, 161, 193), // nord9
883            md_h3: Color::Rgb(143, 188, 187), // nord7
884            md_h4: Color::Rgb(178, 186, 202),
885            md_heading_sep: Color::Rgb(67, 76, 94), // nord2
886            md_inline_code_fg: Color::Rgb(235, 203, 139), // nord13
887            md_inline_code_bg: Color::Rgb(59, 66, 82), // nord1
888            md_list_bullet: Color::Rgb(129, 161, 193), // nord9
889            md_blockquote_bar: Color::Rgb(76, 86, 106), // nord3
890            md_blockquote_text: Color::Rgb(160, 170, 185),
891            md_rule: Color::Rgb(67, 76, 94), // nord2
892
893            // 代码块 — Nord 风格语法高亮
894            code_border: Color::Rgb(76, 86, 106),    // nord3
895            code_bg: Color::Rgb(46, 52, 64),         // nord0
896            code_default: Color::Rgb(216, 222, 233), // nord4
897            code_keyword: Color::Rgb(180, 142, 173), // nord15
898            code_string: Color::Rgb(163, 190, 140),  // nord14
899            code_comment: Color::Rgb(97, 110, 128),
900            code_number: Color::Rgb(208, 135, 112), // nord12
901            code_type: Color::Rgb(235, 203, 139),   // nord13
902            code_primitive: Color::Rgb(143, 188, 187), // nord7
903            code_macro: Color::Rgb(136, 192, 208),  // nord8
904            code_attribute: Color::Rgb(143, 188, 187), // nord7
905            code_lifetime: Color::Rgb(235, 203, 139), // nord13
906            code_shell_var: Color::Rgb(143, 188, 187), // nord7
907
908            // 表格
909            table_border: Color::Rgb(67, 76, 94),    // nord2
910            table_header: Color::Rgb(136, 192, 208), // nord8
911            table_body: Color::Rgb(178, 186, 202),
912
913            // 帮助界面
914            help_title: Color::Rgb(136, 192, 208), // nord8
915            help_key: Color::Rgb(235, 203, 139),   // nord13
916            help_desc: Color::Rgb(216, 222, 233),  // nord4
917            help_path: Color::Rgb(100, 112, 130),
918            help_bg: Color::Rgb(59, 66, 82), // nord1
919        }
920    }
921
922    /// Monokai 主题(经典 Monokai 配色 - 暖色调高对比度)
923    pub fn monokai() -> Self {
924        Self {
925            // 全局背景
926            bg_primary: Color::Rgb(39, 40, 34),
927            bg_title: Color::Rgb(49, 50, 44),
928            bg_input: Color::Rgb(49, 50, 44),
929            bg_panel: Color::Rgb(49, 50, 44),
930
931            // 边框
932            border_title: Color::Rgb(80, 80, 70),
933            border_message: Color::Rgb(65, 65, 55),
934            border_input: Color::Rgb(80, 80, 70),
935            border_input_loading: Color::Rgb(230, 219, 116), // monokai yellow
936            border_config: Color::Rgb(80, 80, 70),
937            separator: Color::Rgb(65, 65, 55),
938
939            // 气泡
940            bubble_ai: Color::Rgb(43, 44, 38),
941            bubble_ai_selected: Color::Rgb(255, 255, 255),
942            bubble_user: Color::Rgb(55, 65, 90),
943            bubble_user_selected: Color::Rgb(255, 255, 255),
944
945            // 标签
946            label_ai: Color::Rgb(166, 226, 46),    // monokai green
947            label_user: Color::Rgb(102, 217, 239), // monokai cyan
948            label_selected: Color::Rgb(230, 219, 116), // monokai yellow
949
950            // 文字
951            text_normal: Color::Rgb(248, 248, 242), // monokai foreground
952            text_bold: Color::Rgb(215, 245, 225),
953            text_dim: Color::Rgb(140, 140, 130),
954            text_very_dim: Color::Rgb(90, 90, 80),
955            text_white: Color::Rgb(248, 248, 242),
956            text_system: Color::Rgb(117, 113, 94), // monokai comment color
957
958            // 标题栏
959            title_icon: Color::Rgb(102, 217, 239), // monokai cyan
960            title_separator: Color::Rgb(65, 65, 55),
961            title_model: Color::Rgb(166, 226, 46), // monokai green
962            title_count: Color::Rgb(190, 190, 180),
963            title_loading: Color::Rgb(230, 219, 116), // monokai yellow
964
965            // 输入区
966            input_prompt: Color::Rgb(166, 226, 46), // monokai green
967            input_prompt_loading: Color::Rgb(230, 219, 116),
968            cursor_fg: Color::Rgb(39, 40, 34),
969            cursor_bg: Color::Rgb(248, 248, 242),
970
971            // 提示栏
972            hint_key_fg: Color::Rgb(39, 40, 34),
973            hint_key_bg: Color::Rgb(117, 113, 94),
974            hint_desc: Color::Rgb(140, 140, 130),
975            hint_separator: Color::Rgb(55, 55, 45),
976
977            // Toast
978            toast_success_border: Color::Rgb(166, 226, 46),
979            toast_success_bg: Color::Rgb(45, 55, 38),
980            toast_success_text: Color::Rgb(166, 226, 46),
981            toast_error_border: Color::Rgb(249, 38, 114), // monokai pink
982            toast_error_bg: Color::Rgb(60, 38, 42),
983            toast_error_text: Color::Rgb(249, 38, 114),
984
985            // 工具确认区
986            tool_confirm_border: Color::Rgb(230, 219, 116), // monokai yellow
987            tool_confirm_bg: Color::Rgb(50, 48, 38),
988            tool_confirm_title: Color::Rgb(230, 219, 116),
989            tool_confirm_name: Color::Rgb(230, 219, 116),
990            tool_confirm_text: Color::Rgb(248, 248, 242),
991            tool_confirm_label: Color::Rgb(140, 140, 130),
992            tool_confirm_hint: Color::Rgb(190, 190, 180),
993
994            // 欢迎界面
995            welcome_border: Color::Rgb(80, 80, 70),
996            welcome_text: Color::Rgb(102, 217, 239), // monokai cyan
997            welcome_hint: Color::Rgb(100, 100, 90),
998
999            // 模型选择
1000            model_sel_border: Color::Rgb(230, 219, 116),
1001            model_sel_title: Color::Rgb(230, 219, 116),
1002            model_sel_active: Color::Rgb(166, 226, 46),
1003            model_sel_inactive: Color::Rgb(190, 190, 180),
1004            model_sel_highlight_bg: Color::Rgb(60, 62, 54),
1005
1006            // 配置界面
1007            config_title: Color::Rgb(102, 217, 239),
1008            config_section: Color::Rgb(166, 226, 46),
1009            config_pointer: Color::Rgb(230, 219, 116),
1010            config_label_selected: Color::Rgb(230, 219, 116),
1011            config_label: Color::Rgb(140, 140, 130),
1012            config_value: Color::Rgb(190, 190, 180),
1013            config_edit_bg: Color::Rgb(60, 62, 54),
1014            config_tab_active_bg: Color::Rgb(102, 217, 239),
1015            config_tab_active_fg: Color::Rgb(39, 40, 34),
1016            config_tab_inactive: Color::Rgb(140, 140, 130),
1017            config_hint_key: Color::Rgb(230, 219, 116),
1018            config_hint_desc: Color::Rgb(140, 140, 130),
1019            config_toggle_on: Color::Rgb(166, 226, 46),
1020            config_toggle_off: Color::Rgb(249, 38, 114),
1021            config_dim: Color::Rgb(90, 90, 80),
1022            config_api_key: Color::Rgb(100, 100, 90),
1023
1024            // Markdown
1025            md_h1: Color::Rgb(249, 38, 114),  // monokai pink
1026            md_h2: Color::Rgb(102, 217, 239), // monokai cyan
1027            md_h3: Color::Rgb(166, 226, 46),  // monokai green
1028            md_h4: Color::Rgb(230, 219, 116), // monokai yellow
1029            md_heading_sep: Color::Rgb(80, 80, 70),
1030            md_inline_code_fg: Color::Rgb(230, 219, 116), // monokai yellow
1031            md_inline_code_bg: Color::Rgb(55, 55, 45),
1032            md_list_bullet: Color::Rgb(249, 38, 114), // monokai pink
1033            md_blockquote_bar: Color::Rgb(117, 113, 94),
1034            md_blockquote_text: Color::Rgb(170, 170, 160),
1035            md_rule: Color::Rgb(80, 80, 70),
1036
1037            // 代码块 — Monokai 经典语法高亮
1038            code_border: Color::Rgb(80, 80, 70),
1039            code_bg: Color::Rgb(39, 40, 34),
1040            code_default: Color::Rgb(248, 248, 242), // monokai foreground
1041            code_keyword: Color::Rgb(249, 38, 114),  // monokai pink
1042            code_string: Color::Rgb(230, 219, 116),  // monokai yellow
1043            code_comment: Color::Rgb(117, 113, 94),  // monokai comment
1044            code_number: Color::Rgb(174, 129, 255),  // monokai purple
1045            code_type: Color::Rgb(166, 226, 46),     // monokai green
1046            code_primitive: Color::Rgb(102, 217, 239), // monokai cyan
1047            code_macro: Color::Rgb(102, 217, 239),   // monokai cyan
1048            code_attribute: Color::Rgb(166, 226, 46), // monokai green
1049            code_lifetime: Color::Rgb(174, 129, 255), // monokai purple
1050            code_shell_var: Color::Rgb(102, 217, 239), // monokai cyan
1051
1052            // 表格
1053            table_border: Color::Rgb(80, 80, 70),
1054            table_header: Color::Rgb(102, 217, 239),
1055            table_body: Color::Rgb(190, 190, 180),
1056
1057            // 帮助界面
1058            help_title: Color::Rgb(102, 217, 239),
1059            help_key: Color::Rgb(230, 219, 116),
1060            help_desc: Color::Rgb(248, 248, 242),
1061            help_path: Color::Rgb(117, 113, 94),
1062            help_bg: Color::Rgb(49, 50, 44),
1063        }
1064    }
1065}