Skip to main content

gitkraft_core/features/theme/
presets.rs

1//! All 43 preset themes — the **single source of truth** for every colour
2//! used by both the GUI and TUI front-ends.
3//!
4//! Each public function returns a fully-populated [`AppTheme`] with concrete
5//! RGB values. The [`theme_by_index`] dispatcher maps a `0..=42` index to the
6//! matching constructor; out-of-range indices silently fall back to `default()`.
7
8use super::types::{AppTheme, Rgb};
9
10// ── Theme catalogue ───────────────────────────────────────────────────────────
11
12/// Ordered theme names. The position in this slice **is** the canonical index.
13pub const THEME_NAMES: &[&str] = &[
14    "Default",
15    "Default Light",
16    "Grape",
17    "Ocean",
18    "Sunset",
19    "Forest",
20    "Rose",
21    "Mono",
22    "Neon",
23    "Dracula",
24    "Nord",
25    "Solarized Dark",
26    "Solarized Light",
27    "Gruvbox Dark",
28    "Gruvbox Light",
29    "Catppuccin Latte",
30    "Catppuccin Frappé",
31    "Catppuccin Macchiato",
32    "Catppuccin Mocha",
33    "Tokyo Night",
34    "Tokyo Night Storm",
35    "Tokyo Night Light",
36    "Kanagawa Wave",
37    "Kanagawa Dragon",
38    "Kanagawa Lotus",
39    "Moonfly",
40    "Nightfly",
41    "Oxocarbon",
42    "Cyberpunk",
43    "Rose Pine",
44    "Rose Pine Moon",
45    "Rose Pine Dawn",
46    "Ayu Mirage",
47    "Everforest Dark",
48    "Atom One Dark",
49    "Atom One Light",
50    "Night Owl",
51    "Poimandres",
52    "Flexoki Dark",
53    "Flexoki Light",
54    "Carbonfox",
55    "Andromeda",
56    "Synthwave",
57];
58
59/// Total number of themes.
60pub const THEME_COUNT: usize = 43;
61
62/// Get a theme by index (0-based). Returns `default()` for out-of-range.
63pub fn theme_by_index(index: usize) -> AppTheme {
64    match index {
65        0 => default(),
66        1 => default_light(),
67        2 => grape(),
68        3 => ocean(),
69        4 => sunset(),
70        5 => forest(),
71        6 => rose(),
72        7 => mono(),
73        8 => neon(),
74        9 => dracula(),
75        10 => nord(),
76        11 => solarized_dark(),
77        12 => solarized_light(),
78        13 => gruvbox_dark(),
79        14 => gruvbox_light(),
80        15 => catppuccin_latte(),
81        16 => catppuccin_frappe(),
82        17 => catppuccin_macchiato(),
83        18 => catppuccin_mocha(),
84        19 => tokyo_night(),
85        20 => tokyo_night_storm(),
86        21 => tokyo_night_light(),
87        22 => kanagawa_wave(),
88        23 => kanagawa_dragon(),
89        24 => kanagawa_lotus(),
90        25 => moonfly(),
91        26 => nightfly(),
92        27 => oxocarbon(),
93        28 => cyberpunk(),
94        29 => rose_pine(),
95        30 => rose_pine_moon(),
96        31 => rose_pine_dawn(),
97        32 => ayu_mirage(),
98        33 => everforest_dark(),
99        34 => atom_one_dark(),
100        35 => atom_one_light(),
101        36 => night_owl(),
102        37 => poimandres(),
103        38 => flexoki_dark(),
104        39 => flexoki_light(),
105        40 => carbonfox(),
106        41 => andromeda(),
107        42 => synthwave(),
108        _ => default(),
109    }
110}
111
112/// Find theme index by name (case-insensitive ASCII). Returns `0` (Default) if
113/// no match is found.
114pub fn theme_index_by_name(name: &str) -> usize {
115    THEME_NAMES
116        .iter()
117        .position(|n| n.eq_ignore_ascii_case(name))
118        .unwrap_or(0)
119}
120
121// ── Theme definitions ─────────────────────────────────────────────────────────
122
123pub fn default() -> AppTheme {
124    AppTheme {
125        is_dark: true,
126        background: Rgb::new(18, 18, 26),
127        surface: Rgb::new(28, 28, 40),
128        border: Rgb::new(60, 80, 100),
129        selection: Rgb::new(40, 60, 80),
130        text_primary: Rgb::new(255, 255, 255),
131        text_secondary: Rgb::new(255, 100, 30),
132        text_muted: Rgb::new(120, 120, 130),
133        accent: Rgb::new(80, 200, 255),
134        success: Rgb::new(80, 220, 120),
135        warning: Rgb::new(255, 200, 50),
136        error: Rgb::new(255, 80, 80),
137        diff_add: Rgb::new(80, 220, 120),
138        diff_del: Rgb::new(255, 80, 80),
139        diff_context: Rgb::new(120, 120, 130),
140        diff_hunk: Rgb::new(255, 100, 30),
141        graph_colors: [
142            Rgb::new(80, 200, 255),
143            Rgb::new(80, 220, 120),
144            Rgb::new(255, 80, 80),
145            Rgb::new(255, 200, 50),
146            Rgb::new(255, 100, 30),
147            Rgb::new(180, 140, 255),
148            Rgb::new(0, 200, 180),
149            Rgb::new(255, 130, 160),
150        ],
151    }
152}
153
154pub fn default_light() -> AppTheme {
155    AppTheme {
156        is_dark: false,
157        background: Rgb::new(250, 250, 255),
158        surface: Rgb::new(235, 238, 248),
159        border: Rgb::new(180, 195, 220),
160        selection: Rgb::new(200, 220, 255),
161        text_primary: Rgb::new(30, 35, 50),
162        text_secondary: Rgb::new(255, 100, 30),
163        text_muted: Rgb::new(130, 140, 160),
164        accent: Rgb::new(0, 140, 220),
165        success: Rgb::new(30, 160, 80),
166        warning: Rgb::new(200, 140, 0),
167        error: Rgb::new(210, 50, 50),
168        diff_add: Rgb::new(30, 160, 80),
169        diff_del: Rgb::new(210, 50, 50),
170        diff_context: Rgb::new(130, 140, 160),
171        diff_hunk: Rgb::new(255, 100, 30),
172        graph_colors: [
173            Rgb::new(0, 140, 220),
174            Rgb::new(30, 160, 80),
175            Rgb::new(210, 50, 50),
176            Rgb::new(200, 140, 0),
177            Rgb::new(255, 100, 30),
178            Rgb::new(140, 80, 200),
179            Rgb::new(0, 150, 150),
180            Rgb::new(190, 60, 120),
181        ],
182    }
183}
184
185pub fn grape() -> AppTheme {
186    AppTheme {
187        is_dark: true,
188        background: Rgb::new(18, 12, 30),
189        surface: Rgb::new(30, 20, 50),
190        border: Rgb::new(100, 70, 150),
191        selection: Rgb::new(50, 35, 80),
192        text_primary: Rgb::new(230, 220, 255),
193        text_secondary: Rgb::new(130, 180, 255),
194        text_muted: Rgb::new(110, 100, 130),
195        accent: Rgb::new(200, 120, 255),
196        success: Rgb::new(160, 110, 255),
197        warning: Rgb::new(210, 170, 255),
198        error: Rgb::new(255, 80, 150),
199        diff_add: Rgb::new(160, 110, 255),
200        diff_del: Rgb::new(255, 80, 150),
201        diff_context: Rgb::new(110, 100, 130),
202        diff_hunk: Rgb::new(130, 180, 255),
203        graph_colors: [
204            Rgb::new(200, 120, 255),
205            Rgb::new(160, 110, 255),
206            Rgb::new(255, 80, 150),
207            Rgb::new(210, 170, 255),
208            Rgb::new(130, 180, 255),
209            Rgb::new(80, 220, 200),
210            Rgb::new(255, 180, 100),
211            Rgb::new(120, 255, 160),
212        ],
213    }
214}
215
216pub fn ocean() -> AppTheme {
217    AppTheme {
218        is_dark: true,
219        background: Rgb::new(0, 20, 35),
220        surface: Rgb::new(0, 35, 55),
221        border: Rgb::new(0, 100, 130),
222        selection: Rgb::new(0, 50, 70),
223        text_primary: Rgb::new(200, 240, 245),
224        text_secondary: Rgb::new(0, 175, 210),
225        text_muted: Rgb::new(80, 120, 130),
226        accent: Rgb::new(0, 200, 180),
227        success: Rgb::new(80, 230, 200),
228        warning: Rgb::new(255, 220, 80),
229        error: Rgb::new(255, 100, 100),
230        diff_add: Rgb::new(80, 230, 200),
231        diff_del: Rgb::new(255, 100, 100),
232        diff_context: Rgb::new(80, 120, 130),
233        diff_hunk: Rgb::new(0, 175, 210),
234        graph_colors: [
235            Rgb::new(0, 200, 180),
236            Rgb::new(80, 230, 200),
237            Rgb::new(255, 100, 100),
238            Rgb::new(255, 220, 80),
239            Rgb::new(0, 175, 210),
240            Rgb::new(180, 130, 255),
241            Rgb::new(255, 160, 100),
242            Rgb::new(220, 120, 200),
243        ],
244    }
245}
246
247pub fn sunset() -> AppTheme {
248    AppTheme {
249        is_dark: true,
250        background: Rgb::new(22, 8, 6),
251        surface: Rgb::new(40, 15, 10),
252        border: Rgb::new(130, 60, 30),
253        selection: Rgb::new(80, 30, 20),
254        text_primary: Rgb::new(255, 235, 210),
255        text_secondary: Rgb::new(255, 150, 50),
256        text_muted: Rgb::new(140, 100, 80),
257        accent: Rgb::new(255, 80, 80),
258        success: Rgb::new(255, 180, 80),
259        warning: Rgb::new(255, 230, 80),
260        error: Rgb::new(255, 50, 50),
261        diff_add: Rgb::new(255, 180, 80),
262        diff_del: Rgb::new(255, 50, 50),
263        diff_context: Rgb::new(140, 100, 80),
264        diff_hunk: Rgb::new(255, 150, 50),
265        graph_colors: [
266            Rgb::new(255, 80, 80),
267            Rgb::new(255, 180, 80),
268            Rgb::new(255, 50, 50),
269            Rgb::new(255, 230, 80),
270            Rgb::new(255, 150, 50),
271            Rgb::new(100, 180, 255),
272            Rgb::new(180, 120, 255),
273            Rgb::new(80, 220, 200),
274        ],
275    }
276}
277
278pub fn forest() -> AppTheme {
279    AppTheme {
280        is_dark: true,
281        background: Rgb::new(8, 18, 8),
282        surface: Rgb::new(15, 30, 15),
283        border: Rgb::new(50, 100, 50),
284        selection: Rgb::new(20, 50, 20),
285        text_primary: Rgb::new(210, 235, 200),
286        text_secondary: Rgb::new(80, 160, 80),
287        text_muted: Rgb::new(90, 120, 80),
288        accent: Rgb::new(100, 200, 80),
289        success: Rgb::new(120, 210, 90),
290        warning: Rgb::new(220, 200, 80),
291        error: Rgb::new(210, 80, 80),
292        diff_add: Rgb::new(120, 210, 90),
293        diff_del: Rgb::new(210, 80, 80),
294        diff_context: Rgb::new(90, 120, 80),
295        diff_hunk: Rgb::new(80, 160, 80),
296        graph_colors: [
297            Rgb::new(100, 200, 80),
298            Rgb::new(120, 210, 90),
299            Rgb::new(210, 80, 80),
300            Rgb::new(220, 200, 80),
301            Rgb::new(80, 160, 80),
302            Rgb::new(130, 160, 255),
303            Rgb::new(200, 130, 180),
304            Rgb::new(200, 180, 100),
305        ],
306    }
307}
308
309pub fn rose() -> AppTheme {
310    AppTheme {
311        is_dark: true,
312        background: Rgb::new(28, 6, 16),
313        surface: Rgb::new(50, 12, 30),
314        border: Rgb::new(140, 60, 100),
315        selection: Rgb::new(80, 20, 40),
316        text_primary: Rgb::new(255, 230, 235),
317        text_secondary: Rgb::new(255, 140, 180),
318        text_muted: Rgb::new(140, 90, 110),
319        accent: Rgb::new(255, 100, 150),
320        success: Rgb::new(255, 160, 190),
321        warning: Rgb::new(255, 220, 180),
322        error: Rgb::new(220, 60, 100),
323        diff_add: Rgb::new(255, 160, 190),
324        diff_del: Rgb::new(220, 60, 100),
325        diff_context: Rgb::new(140, 90, 110),
326        diff_hunk: Rgb::new(255, 140, 180),
327        graph_colors: [
328            Rgb::new(255, 100, 150),
329            Rgb::new(255, 160, 190),
330            Rgb::new(220, 60, 100),
331            Rgb::new(255, 220, 180),
332            Rgb::new(255, 140, 180),
333            Rgb::new(100, 180, 255),
334            Rgb::new(120, 220, 200),
335            Rgb::new(200, 180, 100),
336        ],
337    }
338}
339
340pub fn mono() -> AppTheme {
341    AppTheme {
342        is_dark: true,
343        background: Rgb::new(8, 8, 10),
344        surface: Rgb::new(20, 20, 22),
345        border: Rgb::new(80, 80, 85),
346        selection: Rgb::new(50, 50, 55),
347        text_primary: Rgb::new(210, 210, 210),
348        text_secondary: Rgb::new(180, 180, 180),
349        text_muted: Rgb::new(110, 110, 115),
350        accent: Rgb::new(200, 200, 200),
351        success: Rgb::new(200, 200, 200),
352        warning: Rgb::new(200, 200, 200),
353        error: Rgb::new(160, 160, 160),
354        diff_add: Rgb::new(200, 200, 200),
355        diff_del: Rgb::new(160, 160, 160),
356        diff_context: Rgb::new(110, 110, 115),
357        diff_hunk: Rgb::new(180, 180, 180),
358        graph_colors: [
359            Rgb::new(230, 230, 230),
360            Rgb::new(200, 200, 200),
361            Rgb::new(160, 160, 160),
362            Rgb::new(215, 210, 205),
363            Rgb::new(180, 180, 180),
364            Rgb::new(145, 150, 155),
365            Rgb::new(195, 190, 200),
366            Rgb::new(170, 175, 170),
367        ],
368    }
369}
370
371pub fn neon() -> AppTheme {
372    AppTheme {
373        is_dark: true,
374        background: Rgb::new(6, 0, 14),
375        surface: Rgb::new(15, 0, 30),
376        border: Rgb::new(100, 0, 140),
377        selection: Rgb::new(30, 0, 50),
378        text_primary: Rgb::new(230, 230, 255),
379        text_secondary: Rgb::new(0, 255, 200),
380        text_muted: Rgb::new(100, 80, 120),
381        accent: Rgb::new(255, 0, 200),
382        success: Rgb::new(0, 255, 130),
383        warning: Rgb::new(255, 220, 0),
384        error: Rgb::new(255, 30, 80),
385        diff_add: Rgb::new(0, 255, 130),
386        diff_del: Rgb::new(255, 30, 80),
387        diff_context: Rgb::new(100, 80, 120),
388        diff_hunk: Rgb::new(0, 255, 200),
389        graph_colors: [
390            Rgb::new(255, 0, 200),
391            Rgb::new(0, 255, 130),
392            Rgb::new(255, 30, 80),
393            Rgb::new(255, 220, 0),
394            Rgb::new(0, 255, 200),
395            Rgb::new(100, 80, 255),
396            Rgb::new(255, 120, 0),
397            Rgb::new(0, 180, 255),
398        ],
399    }
400}
401
402pub fn dracula() -> AppTheme {
403    AppTheme {
404        is_dark: true,
405        background: Rgb::new(40, 42, 54),
406        surface: Rgb::new(68, 71, 90),
407        border: Rgb::new(98, 114, 164),
408        selection: Rgb::new(68, 71, 90),
409        text_primary: Rgb::new(248, 248, 242),
410        text_secondary: Rgb::new(139, 233, 253),
411        text_muted: Rgb::new(98, 114, 164),
412        accent: Rgb::new(255, 121, 198),
413        success: Rgb::new(80, 250, 123),
414        warning: Rgb::new(241, 250, 140),
415        error: Rgb::new(255, 85, 85),
416        diff_add: Rgb::new(80, 250, 123),
417        diff_del: Rgb::new(255, 85, 85),
418        diff_context: Rgb::new(98, 114, 164),
419        diff_hunk: Rgb::new(139, 233, 253),
420        graph_colors: [
421            Rgb::new(255, 121, 198),
422            Rgb::new(80, 250, 123),
423            Rgb::new(255, 85, 85),
424            Rgb::new(241, 250, 140),
425            Rgb::new(139, 233, 253),
426            Rgb::new(189, 147, 249),
427            Rgb::new(255, 184, 108),
428            Rgb::new(98, 114, 164),
429        ],
430    }
431}
432
433pub fn nord() -> AppTheme {
434    AppTheme {
435        is_dark: true,
436        background: Rgb::new(29, 35, 42),
437        surface: Rgb::new(59, 66, 82),
438        border: Rgb::new(76, 86, 106),
439        selection: Rgb::new(59, 66, 82),
440        text_primary: Rgb::new(216, 222, 233),
441        text_secondary: Rgb::new(129, 161, 193),
442        text_muted: Rgb::new(76, 86, 106),
443        accent: Rgb::new(136, 192, 208),
444        success: Rgb::new(163, 190, 140),
445        warning: Rgb::new(235, 203, 139),
446        error: Rgb::new(191, 97, 106),
447        diff_add: Rgb::new(163, 190, 140),
448        diff_del: Rgb::new(191, 97, 106),
449        diff_context: Rgb::new(76, 86, 106),
450        diff_hunk: Rgb::new(129, 161, 193),
451        graph_colors: [
452            Rgb::new(136, 192, 208),
453            Rgb::new(163, 190, 140),
454            Rgb::new(191, 97, 106),
455            Rgb::new(235, 203, 139),
456            Rgb::new(129, 161, 193),
457            Rgb::new(180, 142, 173),
458            Rgb::new(208, 135, 112),
459            Rgb::new(143, 188, 187),
460        ],
461    }
462}
463
464pub fn solarized_dark() -> AppTheme {
465    AppTheme {
466        is_dark: true,
467        background: Rgb::new(0, 43, 54),
468        surface: Rgb::new(7, 54, 66),
469        border: Rgb::new(88, 110, 117),
470        selection: Rgb::new(7, 54, 66),
471        text_primary: Rgb::new(131, 148, 150),
472        text_secondary: Rgb::new(42, 161, 152),
473        text_muted: Rgb::new(88, 110, 117),
474        accent: Rgb::new(38, 139, 210),
475        success: Rgb::new(133, 153, 0),
476        warning: Rgb::new(181, 137, 0),
477        error: Rgb::new(220, 50, 47),
478        diff_add: Rgb::new(133, 153, 0),
479        diff_del: Rgb::new(220, 50, 47),
480        diff_context: Rgb::new(88, 110, 117),
481        diff_hunk: Rgb::new(42, 161, 152),
482        graph_colors: [
483            Rgb::new(38, 139, 210),
484            Rgb::new(133, 153, 0),
485            Rgb::new(220, 50, 47),
486            Rgb::new(181, 137, 0),
487            Rgb::new(42, 161, 152),
488            Rgb::new(108, 113, 196),
489            Rgb::new(203, 75, 22),
490            Rgb::new(211, 54, 130),
491        ],
492    }
493}
494
495pub fn solarized_light() -> AppTheme {
496    AppTheme {
497        is_dark: false,
498        background: Rgb::new(253, 246, 227),
499        surface: Rgb::new(238, 232, 213),
500        border: Rgb::new(147, 161, 161),
501        selection: Rgb::new(238, 232, 213),
502        text_primary: Rgb::new(101, 123, 131),
503        text_secondary: Rgb::new(42, 161, 152),
504        text_muted: Rgb::new(147, 161, 161),
505        accent: Rgb::new(38, 139, 210),
506        success: Rgb::new(133, 153, 0),
507        warning: Rgb::new(181, 137, 0),
508        error: Rgb::new(220, 50, 47),
509        diff_add: Rgb::new(133, 153, 0),
510        diff_del: Rgb::new(220, 50, 47),
511        diff_context: Rgb::new(147, 161, 161),
512        diff_hunk: Rgb::new(42, 161, 152),
513        graph_colors: [
514            Rgb::new(38, 139, 210),
515            Rgb::new(133, 153, 0),
516            Rgb::new(220, 50, 47),
517            Rgb::new(181, 137, 0),
518            Rgb::new(42, 161, 152),
519            Rgb::new(108, 113, 196),
520            Rgb::new(203, 75, 22),
521            Rgb::new(211, 54, 130),
522        ],
523    }
524}
525
526pub fn gruvbox_dark() -> AppTheme {
527    AppTheme {
528        is_dark: true,
529        background: Rgb::new(29, 28, 27),
530        surface: Rgb::new(60, 56, 54),
531        border: Rgb::new(146, 131, 116),
532        selection: Rgb::new(60, 56, 54),
533        text_primary: Rgb::new(235, 219, 178),
534        text_secondary: Rgb::new(250, 189, 47),
535        text_muted: Rgb::new(146, 131, 116),
536        accent: Rgb::new(254, 128, 25),
537        success: Rgb::new(184, 187, 38),
538        warning: Rgb::new(250, 189, 47),
539        error: Rgb::new(251, 73, 52),
540        diff_add: Rgb::new(184, 187, 38),
541        diff_del: Rgb::new(251, 73, 52),
542        diff_context: Rgb::new(146, 131, 116),
543        diff_hunk: Rgb::new(250, 189, 47),
544        graph_colors: [
545            Rgb::new(254, 128, 25),
546            Rgb::new(184, 187, 38),
547            Rgb::new(251, 73, 52),
548            Rgb::new(250, 189, 47),
549            Rgb::new(131, 165, 152),
550            Rgb::new(211, 134, 155),
551            Rgb::new(142, 192, 124),
552            Rgb::new(69, 133, 136),
553        ],
554    }
555}
556
557pub fn gruvbox_light() -> AppTheme {
558    AppTheme {
559        is_dark: false,
560        background: Rgb::new(251, 241, 199),
561        surface: Rgb::new(213, 196, 161),
562        border: Rgb::new(146, 131, 116),
563        selection: Rgb::new(213, 196, 161),
564        text_primary: Rgb::new(60, 56, 54),
565        text_secondary: Rgb::new(215, 153, 33),
566        text_muted: Rgb::new(146, 131, 116),
567        accent: Rgb::new(214, 93, 14),
568        success: Rgb::new(121, 116, 14),
569        warning: Rgb::new(215, 153, 33),
570        error: Rgb::new(214, 93, 14),
571        diff_add: Rgb::new(121, 116, 14),
572        diff_del: Rgb::new(214, 93, 14),
573        diff_context: Rgb::new(146, 131, 116),
574        diff_hunk: Rgb::new(215, 153, 33),
575        graph_colors: [
576            Rgb::new(214, 93, 14),
577            Rgb::new(121, 116, 14),
578            Rgb::new(204, 36, 29),
579            Rgb::new(215, 153, 33),
580            Rgb::new(69, 133, 136),
581            Rgb::new(177, 98, 134),
582            Rgb::new(104, 157, 106),
583            Rgb::new(7, 102, 120),
584        ],
585    }
586}
587
588pub fn catppuccin_latte() -> AppTheme {
589    AppTheme {
590        is_dark: false,
591        background: Rgb::new(239, 241, 245),
592        surface: Rgb::new(204, 208, 218),
593        border: Rgb::new(156, 160, 176),
594        selection: Rgb::new(204, 208, 218),
595        text_primary: Rgb::new(76, 79, 105),
596        text_secondary: Rgb::new(30, 102, 245),
597        text_muted: Rgb::new(156, 160, 176),
598        accent: Rgb::new(136, 57, 239),
599        success: Rgb::new(64, 160, 43),
600        warning: Rgb::new(223, 142, 29),
601        error: Rgb::new(210, 15, 57),
602        diff_add: Rgb::new(64, 160, 43),
603        diff_del: Rgb::new(210, 15, 57),
604        diff_context: Rgb::new(156, 160, 176),
605        diff_hunk: Rgb::new(30, 102, 245),
606        graph_colors: [
607            Rgb::new(136, 57, 239),
608            Rgb::new(64, 160, 43),
609            Rgb::new(210, 15, 57),
610            Rgb::new(223, 142, 29),
611            Rgb::new(30, 102, 245),
612            Rgb::new(23, 146, 153),
613            Rgb::new(234, 118, 203),
614            Rgb::new(254, 100, 11),
615        ],
616    }
617}
618
619pub fn catppuccin_frappe() -> AppTheme {
620    AppTheme {
621        is_dark: true,
622        background: Rgb::new(48, 52, 70),
623        surface: Rgb::new(65, 69, 89),
624        border: Rgb::new(115, 121, 148),
625        selection: Rgb::new(65, 69, 89),
626        text_primary: Rgb::new(198, 208, 245),
627        text_secondary: Rgb::new(140, 170, 238),
628        text_muted: Rgb::new(115, 121, 148),
629        accent: Rgb::new(202, 158, 230),
630        success: Rgb::new(166, 209, 137),
631        warning: Rgb::new(229, 200, 144),
632        error: Rgb::new(231, 130, 132),
633        diff_add: Rgb::new(166, 209, 137),
634        diff_del: Rgb::new(231, 130, 132),
635        diff_context: Rgb::new(115, 121, 148),
636        diff_hunk: Rgb::new(140, 170, 238),
637        graph_colors: [
638            Rgb::new(202, 158, 230),
639            Rgb::new(166, 209, 137),
640            Rgb::new(231, 130, 132),
641            Rgb::new(229, 200, 144),
642            Rgb::new(140, 170, 238),
643            Rgb::new(129, 200, 190),
644            Rgb::new(244, 184, 228),
645            Rgb::new(239, 159, 118),
646        ],
647    }
648}
649
650pub fn catppuccin_macchiato() -> AppTheme {
651    AppTheme {
652        is_dark: true,
653        background: Rgb::new(36, 39, 58),
654        surface: Rgb::new(54, 58, 79),
655        border: Rgb::new(110, 115, 141),
656        selection: Rgb::new(54, 58, 79),
657        text_primary: Rgb::new(202, 211, 245),
658        text_secondary: Rgb::new(138, 173, 244),
659        text_muted: Rgb::new(110, 115, 141),
660        accent: Rgb::new(198, 160, 246),
661        success: Rgb::new(166, 218, 149),
662        warning: Rgb::new(238, 212, 159),
663        error: Rgb::new(237, 135, 150),
664        diff_add: Rgb::new(166, 218, 149),
665        diff_del: Rgb::new(237, 135, 150),
666        diff_context: Rgb::new(110, 115, 141),
667        diff_hunk: Rgb::new(138, 173, 244),
668        graph_colors: [
669            Rgb::new(198, 160, 246),
670            Rgb::new(166, 218, 149),
671            Rgb::new(237, 135, 150),
672            Rgb::new(238, 212, 159),
673            Rgb::new(138, 173, 244),
674            Rgb::new(139, 213, 202),
675            Rgb::new(245, 189, 230),
676            Rgb::new(240, 168, 128),
677        ],
678    }
679}
680
681pub fn catppuccin_mocha() -> AppTheme {
682    AppTheme {
683        is_dark: true,
684        background: Rgb::new(30, 30, 46),
685        surface: Rgb::new(49, 50, 68),
686        border: Rgb::new(108, 112, 134),
687        selection: Rgb::new(49, 50, 68),
688        text_primary: Rgb::new(205, 214, 244),
689        text_secondary: Rgb::new(137, 180, 250),
690        text_muted: Rgb::new(108, 112, 134),
691        accent: Rgb::new(203, 166, 247),
692        success: Rgb::new(166, 227, 161),
693        warning: Rgb::new(249, 226, 175),
694        error: Rgb::new(243, 139, 168),
695        diff_add: Rgb::new(166, 227, 161),
696        diff_del: Rgb::new(243, 139, 168),
697        diff_context: Rgb::new(108, 112, 134),
698        diff_hunk: Rgb::new(137, 180, 250),
699        graph_colors: [
700            Rgb::new(203, 166, 247),
701            Rgb::new(166, 227, 161),
702            Rgb::new(243, 139, 168),
703            Rgb::new(249, 226, 175),
704            Rgb::new(137, 180, 250),
705            Rgb::new(148, 226, 213),
706            Rgb::new(245, 194, 231),
707            Rgb::new(250, 179, 135),
708        ],
709    }
710}
711
712pub fn tokyo_night() -> AppTheme {
713    AppTheme {
714        is_dark: true,
715        background: Rgb::new(26, 27, 38),
716        surface: Rgb::new(41, 46, 66),
717        border: Rgb::new(86, 95, 137),
718        selection: Rgb::new(41, 46, 66),
719        text_primary: Rgb::new(192, 202, 245),
720        text_secondary: Rgb::new(122, 162, 247),
721        text_muted: Rgb::new(86, 95, 137),
722        accent: Rgb::new(187, 154, 247),
723        success: Rgb::new(158, 206, 106),
724        warning: Rgb::new(224, 175, 104),
725        error: Rgb::new(247, 118, 142),
726        diff_add: Rgb::new(158, 206, 106),
727        diff_del: Rgb::new(247, 118, 142),
728        diff_context: Rgb::new(86, 95, 137),
729        diff_hunk: Rgb::new(122, 162, 247),
730        graph_colors: [
731            Rgb::new(187, 154, 247),
732            Rgb::new(158, 206, 106),
733            Rgb::new(247, 118, 142),
734            Rgb::new(224, 175, 104),
735            Rgb::new(122, 162, 247),
736            Rgb::new(125, 207, 255),
737            Rgb::new(255, 158, 100),
738            Rgb::new(115, 218, 202),
739        ],
740    }
741}
742
743pub fn tokyo_night_storm() -> AppTheme {
744    AppTheme {
745        is_dark: true,
746        background: Rgb::new(36, 40, 59),
747        surface: Rgb::new(45, 49, 75),
748        border: Rgb::new(86, 95, 137),
749        selection: Rgb::new(45, 49, 75),
750        text_primary: Rgb::new(192, 202, 245),
751        text_secondary: Rgb::new(122, 162, 247),
752        text_muted: Rgb::new(86, 95, 137),
753        accent: Rgb::new(187, 154, 247),
754        success: Rgb::new(158, 206, 106),
755        warning: Rgb::new(224, 175, 104),
756        error: Rgb::new(247, 118, 142),
757        diff_add: Rgb::new(158, 206, 106),
758        diff_del: Rgb::new(247, 118, 142),
759        diff_context: Rgb::new(86, 95, 137),
760        diff_hunk: Rgb::new(122, 162, 247),
761        graph_colors: [
762            Rgb::new(187, 154, 247),
763            Rgb::new(158, 206, 106),
764            Rgb::new(247, 118, 142),
765            Rgb::new(224, 175, 104),
766            Rgb::new(122, 162, 247),
767            Rgb::new(125, 207, 255),
768            Rgb::new(255, 158, 100),
769            Rgb::new(115, 218, 202),
770        ],
771    }
772}
773
774pub fn tokyo_night_light() -> AppTheme {
775    AppTheme {
776        is_dark: false,
777        background: Rgb::new(213, 214, 219),
778        surface: Rgb::new(208, 213, 227),
779        border: Rgb::new(132, 140, 176),
780        selection: Rgb::new(208, 213, 227),
781        text_primary: Rgb::new(52, 59, 88),
782        text_secondary: Rgb::new(46, 126, 233),
783        text_muted: Rgb::new(132, 140, 176),
784        accent: Rgb::new(90, 74, 120),
785        success: Rgb::new(72, 94, 48),
786        warning: Rgb::new(140, 108, 62),
787        error: Rgb::new(210, 15, 57),
788        diff_add: Rgb::new(72, 94, 48),
789        diff_del: Rgb::new(210, 15, 57),
790        diff_context: Rgb::new(132, 140, 176),
791        diff_hunk: Rgb::new(46, 126, 233),
792        graph_colors: [
793            Rgb::new(90, 74, 120),
794            Rgb::new(72, 94, 48),
795            Rgb::new(210, 15, 57),
796            Rgb::new(140, 108, 62),
797            Rgb::new(46, 126, 233),
798            Rgb::new(56, 140, 150),
799            Rgb::new(166, 82, 140),
800            Rgb::new(180, 100, 50),
801        ],
802    }
803}
804
805pub fn kanagawa_wave() -> AppTheme {
806    AppTheme {
807        is_dark: true,
808        background: Rgb::new(22, 22, 30),
809        surface: Rgb::new(42, 42, 55),
810        border: Rgb::new(114, 113, 105),
811        selection: Rgb::new(42, 42, 55),
812        text_primary: Rgb::new(220, 215, 186),
813        text_secondary: Rgb::new(126, 156, 216),
814        text_muted: Rgb::new(114, 113, 105),
815        accent: Rgb::new(210, 126, 153),
816        success: Rgb::new(118, 148, 106),
817        warning: Rgb::new(220, 165, 97),
818        error: Rgb::new(210, 126, 153),
819        diff_add: Rgb::new(118, 148, 106),
820        diff_del: Rgb::new(210, 126, 153),
821        diff_context: Rgb::new(114, 113, 105),
822        diff_hunk: Rgb::new(126, 156, 216),
823        graph_colors: [
824            Rgb::new(210, 126, 153),
825            Rgb::new(118, 148, 106),
826            Rgb::new(255, 90, 100),
827            Rgb::new(220, 165, 97),
828            Rgb::new(126, 156, 216),
829            Rgb::new(106, 149, 137),
830            Rgb::new(228, 104, 118),
831            Rgb::new(149, 127, 184),
832        ],
833    }
834}
835
836pub fn kanagawa_dragon() -> AppTheme {
837    AppTheme {
838        is_dark: true,
839        background: Rgb::new(20, 20, 20),
840        surface: Rgb::new(40, 39, 39),
841        border: Rgb::new(166, 166, 156),
842        selection: Rgb::new(40, 39, 39),
843        text_primary: Rgb::new(197, 201, 197),
844        text_secondary: Rgb::new(139, 164, 176),
845        text_muted: Rgb::new(166, 166, 156),
846        accent: Rgb::new(210, 126, 153),
847        success: Rgb::new(135, 169, 135),
848        warning: Rgb::new(200, 170, 109),
849        error: Rgb::new(210, 126, 153),
850        diff_add: Rgb::new(135, 169, 135),
851        diff_del: Rgb::new(210, 126, 153),
852        diff_context: Rgb::new(166, 166, 156),
853        diff_hunk: Rgb::new(139, 164, 176),
854        graph_colors: [
855            Rgb::new(210, 126, 153),
856            Rgb::new(135, 169, 135),
857            Rgb::new(227, 100, 100),
858            Rgb::new(200, 170, 109),
859            Rgb::new(139, 164, 176),
860            Rgb::new(106, 149, 137),
861            Rgb::new(196, 108, 124),
862            Rgb::new(165, 145, 196),
863        ],
864    }
865}
866
867pub fn kanagawa_lotus() -> AppTheme {
868    AppTheme {
869        is_dark: false,
870        background: Rgb::new(246, 243, 228),
871        surface: Rgb::new(231, 219, 160),
872        border: Rgb::new(196, 178, 138),
873        selection: Rgb::new(231, 219, 160),
874        text_primary: Rgb::new(84, 84, 100),
875        text_secondary: Rgb::new(77, 105, 155),
876        text_muted: Rgb::new(196, 178, 138),
877        accent: Rgb::new(160, 154, 190),
878        success: Rgb::new(111, 137, 78),
879        warning: Rgb::new(119, 113, 63),
880        error: Rgb::new(192, 71, 71),
881        diff_add: Rgb::new(111, 137, 78),
882        diff_del: Rgb::new(192, 71, 71),
883        diff_context: Rgb::new(196, 178, 138),
884        diff_hunk: Rgb::new(77, 105, 155),
885        graph_colors: [
886            Rgb::new(160, 154, 190),
887            Rgb::new(111, 137, 78),
888            Rgb::new(192, 71, 71),
889            Rgb::new(119, 113, 63),
890            Rgb::new(77, 105, 155),
891            Rgb::new(100, 140, 130),
892            Rgb::new(180, 100, 120),
893            Rgb::new(140, 120, 170),
894        ],
895    }
896}
897
898pub fn moonfly() -> AppTheme {
899    AppTheme {
900        is_dark: true,
901        background: Rgb::new(8, 8, 8),
902        surface: Rgb::new(28, 28, 28),
903        border: Rgb::new(78, 78, 78),
904        selection: Rgb::new(28, 28, 28),
905        text_primary: Rgb::new(178, 178, 178),
906        text_secondary: Rgb::new(128, 160, 255),
907        text_muted: Rgb::new(78, 78, 78),
908        accent: Rgb::new(174, 129, 255),
909        success: Rgb::new(140, 200, 95),
910        warning: Rgb::new(226, 164, 120),
911        error: Rgb::new(255, 115, 131),
912        diff_add: Rgb::new(140, 200, 95),
913        diff_del: Rgb::new(255, 115, 131),
914        diff_context: Rgb::new(78, 78, 78),
915        diff_hunk: Rgb::new(128, 160, 255),
916        graph_colors: [
917            Rgb::new(174, 129, 255),
918            Rgb::new(140, 200, 95),
919            Rgb::new(255, 115, 131),
920            Rgb::new(226, 164, 120),
921            Rgb::new(128, 160, 255),
922            Rgb::new(116, 180, 187),
923            Rgb::new(255, 192, 120),
924            Rgb::new(200, 140, 255),
925        ],
926    }
927}
928
929pub fn nightfly() -> AppTheme {
930    AppTheme {
931        is_dark: true,
932        background: Rgb::new(1, 22, 38),
933        surface: Rgb::new(11, 41, 66),
934        border: Rgb::new(75, 100, 121),
935        selection: Rgb::new(11, 41, 66),
936        text_primary: Rgb::new(172, 187, 203),
937        text_secondary: Rgb::new(130, 170, 255),
938        text_muted: Rgb::new(75, 100, 121),
939        accent: Rgb::new(199, 146, 234),
940        success: Rgb::new(161, 205, 94),
941        warning: Rgb::new(243, 218, 11),
942        error: Rgb::new(252, 87, 73),
943        diff_add: Rgb::new(161, 205, 94),
944        diff_del: Rgb::new(252, 87, 73),
945        diff_context: Rgb::new(75, 100, 121),
946        diff_hunk: Rgb::new(130, 170, 255),
947        graph_colors: [
948            Rgb::new(199, 146, 234),
949            Rgb::new(161, 205, 94),
950            Rgb::new(252, 87, 73),
951            Rgb::new(243, 218, 11),
952            Rgb::new(130, 170, 255),
953            Rgb::new(33, 200, 215),
954            Rgb::new(238, 130, 98),
955            Rgb::new(174, 200, 255),
956        ],
957    }
958}
959
960pub fn oxocarbon() -> AppTheme {
961    AppTheme {
962        is_dark: true,
963        background: Rgb::new(22, 22, 22),
964        surface: Rgb::new(38, 38, 38),
965        border: Rgb::new(82, 82, 82),
966        selection: Rgb::new(38, 38, 38),
967        text_primary: Rgb::new(242, 244, 248),
968        text_secondary: Rgb::new(120, 169, 255),
969        text_muted: Rgb::new(82, 82, 82),
970        accent: Rgb::new(255, 126, 182),
971        success: Rgb::new(66, 190, 101),
972        warning: Rgb::new(250, 204, 55),
973        error: Rgb::new(255, 97, 101),
974        diff_add: Rgb::new(66, 190, 101),
975        diff_del: Rgb::new(255, 97, 101),
976        diff_context: Rgb::new(82, 82, 82),
977        diff_hunk: Rgb::new(120, 169, 255),
978        graph_colors: [
979            Rgb::new(255, 126, 182),
980            Rgb::new(66, 190, 101),
981            Rgb::new(255, 97, 101),
982            Rgb::new(250, 204, 55),
983            Rgb::new(120, 169, 255),
984            Rgb::new(8, 189, 186),
985            Rgb::new(190, 149, 255),
986            Rgb::new(255, 170, 120),
987        ],
988    }
989}
990
991pub fn cyberpunk() -> AppTheme {
992    AppTheme {
993        is_dark: true,
994        background: Rgb::new(10, 10, 16),
995        surface: Rgb::new(20, 20, 30),
996        border: Rgb::new(45, 45, 55),
997        selection: Rgb::new(50, 48, 20),
998        text_primary: Rgb::new(230, 230, 220),
999        text_secondary: Rgb::new(0, 210, 235),
1000        text_muted: Rgb::new(90, 90, 100),
1001        accent: Rgb::new(252, 238, 10),
1002        success: Rgb::new(0, 220, 180),
1003        warning: Rgb::new(255, 150, 0),
1004        error: Rgb::new(255, 50, 70),
1005        diff_add: Rgb::new(0, 220, 180),
1006        diff_del: Rgb::new(255, 50, 70),
1007        diff_context: Rgb::new(90, 90, 100),
1008        diff_hunk: Rgb::new(0, 210, 235),
1009        graph_colors: [
1010            Rgb::new(252, 238, 10),
1011            Rgb::new(0, 220, 180),
1012            Rgb::new(255, 50, 70),
1013            Rgb::new(255, 150, 0),
1014            Rgb::new(0, 210, 235),
1015            Rgb::new(180, 0, 255),
1016            Rgb::new(255, 0, 150),
1017            Rgb::new(0, 255, 100),
1018        ],
1019    }
1020}
1021
1022pub fn rose_pine() -> AppTheme {
1023    AppTheme {
1024        is_dark: true,
1025        background: Rgb::new(25, 23, 36),
1026        surface: Rgb::new(38, 35, 55),
1027        border: Rgb::new(110, 106, 134),
1028        selection: Rgb::new(64, 61, 82),
1029        text_primary: Rgb::new(224, 222, 244),
1030        text_secondary: Rgb::new(156, 207, 216),
1031        text_muted: Rgb::new(110, 106, 134),
1032        accent: Rgb::new(196, 167, 231),
1033        success: Rgb::new(49, 116, 143),
1034        warning: Rgb::new(246, 193, 119),
1035        error: Rgb::new(235, 111, 146),
1036        diff_add: Rgb::new(49, 116, 143),
1037        diff_del: Rgb::new(235, 111, 146),
1038        diff_context: Rgb::new(110, 106, 134),
1039        diff_hunk: Rgb::new(156, 207, 216),
1040        graph_colors: [
1041            Rgb::new(196, 167, 231),
1042            Rgb::new(49, 116, 143),
1043            Rgb::new(235, 111, 146),
1044            Rgb::new(246, 193, 119),
1045            Rgb::new(156, 207, 216),
1046            Rgb::new(234, 154, 151),
1047            Rgb::new(156, 207, 216),
1048            Rgb::new(224, 222, 244),
1049        ],
1050    }
1051}
1052
1053pub fn rose_pine_moon() -> AppTheme {
1054    AppTheme {
1055        is_dark: true,
1056        background: Rgb::new(35, 33, 54),
1057        surface: Rgb::new(48, 46, 70),
1058        border: Rgb::new(110, 106, 134),
1059        selection: Rgb::new(68, 65, 90),
1060        text_primary: Rgb::new(224, 222, 244),
1061        text_secondary: Rgb::new(156, 207, 216),
1062        text_muted: Rgb::new(110, 106, 134),
1063        accent: Rgb::new(196, 167, 231),
1064        success: Rgb::new(62, 143, 176),
1065        warning: Rgb::new(246, 193, 119),
1066        error: Rgb::new(235, 111, 146),
1067        diff_add: Rgb::new(62, 143, 176),
1068        diff_del: Rgb::new(235, 111, 146),
1069        diff_context: Rgb::new(110, 106, 134),
1070        diff_hunk: Rgb::new(156, 207, 216),
1071        graph_colors: [
1072            Rgb::new(196, 167, 231),
1073            Rgb::new(62, 143, 176),
1074            Rgb::new(235, 111, 146),
1075            Rgb::new(246, 193, 119),
1076            Rgb::new(156, 207, 216),
1077            Rgb::new(234, 154, 151),
1078            Rgb::new(156, 207, 216),
1079            Rgb::new(224, 222, 244),
1080        ],
1081    }
1082}
1083
1084pub fn rose_pine_dawn() -> AppTheme {
1085    AppTheme {
1086        is_dark: false,
1087        background: Rgb::new(250, 244, 237),
1088        surface: Rgb::new(242, 233, 221),
1089        border: Rgb::new(152, 147, 165),
1090        selection: Rgb::new(223, 218, 217),
1091        text_primary: Rgb::new(87, 82, 121),
1092        text_secondary: Rgb::new(86, 148, 159),
1093        text_muted: Rgb::new(152, 147, 165),
1094        accent: Rgb::new(144, 122, 169),
1095        success: Rgb::new(40, 105, 131),
1096        warning: Rgb::new(234, 157, 52),
1097        error: Rgb::new(180, 99, 122),
1098        diff_add: Rgb::new(40, 105, 131),
1099        diff_del: Rgb::new(180, 99, 122),
1100        diff_context: Rgb::new(152, 147, 165),
1101        diff_hunk: Rgb::new(86, 148, 159),
1102        graph_colors: [
1103            Rgb::new(144, 122, 169),
1104            Rgb::new(40, 105, 131),
1105            Rgb::new(180, 99, 122),
1106            Rgb::new(234, 157, 52),
1107            Rgb::new(86, 148, 159),
1108            Rgb::new(215, 130, 126),
1109            Rgb::new(87, 82, 121),
1110            Rgb::new(152, 147, 165),
1111        ],
1112    }
1113}
1114
1115pub fn ayu_mirage() -> AppTheme {
1116    AppTheme {
1117        is_dark: true,
1118        background: Rgb::new(31, 36, 48),
1119        surface: Rgb::new(42, 48, 62),
1120        border: Rgb::new(104, 104, 104),
1121        selection: Rgb::new(64, 159, 255),
1122        text_primary: Rgb::new(204, 202, 194),
1123        text_secondary: Rgb::new(115, 208, 255),
1124        text_muted: Rgb::new(104, 104, 104),
1125        accent: Rgb::new(115, 208, 255),
1126        success: Rgb::new(135, 217, 108),
1127        warning: Rgb::new(250, 204, 110),
1128        error: Rgb::new(237, 130, 116),
1129        diff_add: Rgb::new(135, 217, 108),
1130        diff_del: Rgb::new(237, 130, 116),
1131        diff_context: Rgb::new(104, 104, 104),
1132        diff_hunk: Rgb::new(115, 208, 255),
1133        graph_colors: [
1134            Rgb::new(115, 208, 255),
1135            Rgb::new(135, 217, 108),
1136            Rgb::new(237, 130, 116),
1137            Rgb::new(250, 204, 110),
1138            Rgb::new(64, 159, 255),
1139            Rgb::new(217, 191, 255),
1140            Rgb::new(255, 170, 108),
1141            Rgb::new(204, 202, 194),
1142        ],
1143    }
1144}
1145
1146pub fn everforest_dark() -> AppTheme {
1147    AppTheme {
1148        is_dark: true,
1149        background: Rgb::new(30, 35, 38),
1150        surface: Rgb::new(42, 48, 50),
1151        border: Rgb::new(166, 176, 160),
1152        selection: Rgb::new(76, 55, 67),
1153        text_primary: Rgb::new(211, 198, 170),
1154        text_secondary: Rgb::new(127, 187, 179),
1155        text_muted: Rgb::new(122, 132, 120),
1156        accent: Rgb::new(167, 192, 128),
1157        success: Rgb::new(167, 192, 128),
1158        warning: Rgb::new(219, 188, 127),
1159        error: Rgb::new(230, 126, 128),
1160        diff_add: Rgb::new(167, 192, 128),
1161        diff_del: Rgb::new(230, 126, 128),
1162        diff_context: Rgb::new(122, 132, 120),
1163        diff_hunk: Rgb::new(127, 187, 179),
1164        graph_colors: [
1165            Rgb::new(167, 192, 128),
1166            Rgb::new(127, 187, 179),
1167            Rgb::new(230, 126, 128),
1168            Rgb::new(219, 188, 127),
1169            Rgb::new(214, 153, 182),
1170            Rgb::new(211, 198, 170),
1171            Rgb::new(166, 176, 160),
1172            Rgb::new(122, 132, 120),
1173        ],
1174    }
1175}
1176
1177pub fn atom_one_dark() -> AppTheme {
1178    AppTheme {
1179        is_dark: true,
1180        background: Rgb::new(33, 37, 43),
1181        surface: Rgb::new(45, 50, 58),
1182        border: Rgb::new(118, 118, 118),
1183        selection: Rgb::new(50, 56, 68),
1184        text_primary: Rgb::new(171, 178, 191),
1185        text_secondary: Rgb::new(97, 175, 239),
1186        text_muted: Rgb::new(118, 118, 118),
1187        accent: Rgb::new(97, 175, 239),
1188        success: Rgb::new(152, 195, 121),
1189        warning: Rgb::new(229, 192, 123),
1190        error: Rgb::new(224, 108, 117),
1191        diff_add: Rgb::new(152, 195, 121),
1192        diff_del: Rgb::new(224, 108, 117),
1193        diff_context: Rgb::new(118, 118, 118),
1194        diff_hunk: Rgb::new(97, 175, 239),
1195        graph_colors: [
1196            Rgb::new(97, 175, 239),
1197            Rgb::new(152, 195, 121),
1198            Rgb::new(224, 108, 117),
1199            Rgb::new(229, 192, 123),
1200            Rgb::new(198, 120, 221),
1201            Rgb::new(86, 182, 194),
1202            Rgb::new(171, 178, 191),
1203            Rgb::new(118, 118, 118),
1204        ],
1205    }
1206}
1207
1208pub fn atom_one_light() -> AppTheme {
1209    AppTheme {
1210        is_dark: false,
1211        background: Rgb::new(249, 249, 249),
1212        surface: Rgb::new(237, 237, 237),
1213        border: Rgb::new(180, 180, 180),
1214        selection: Rgb::new(237, 237, 237),
1215        text_primary: Rgb::new(42, 44, 51),
1216        text_secondary: Rgb::new(47, 90, 243),
1217        text_muted: Rgb::new(118, 118, 118),
1218        accent: Rgb::new(47, 90, 243),
1219        success: Rgb::new(63, 149, 58),
1220        warning: Rgb::new(210, 182, 124),
1221        error: Rgb::new(222, 62, 53),
1222        diff_add: Rgb::new(63, 149, 58),
1223        diff_del: Rgb::new(222, 62, 53),
1224        diff_context: Rgb::new(118, 118, 118),
1225        diff_hunk: Rgb::new(47, 90, 243),
1226        graph_colors: [
1227            Rgb::new(47, 90, 243),
1228            Rgb::new(63, 149, 58),
1229            Rgb::new(222, 62, 53),
1230            Rgb::new(210, 182, 124),
1231            Rgb::new(166, 38, 164),
1232            Rgb::new(1, 132, 188),
1233            Rgb::new(42, 44, 51),
1234            Rgb::new(180, 180, 180),
1235        ],
1236    }
1237}
1238
1239pub fn night_owl() -> AppTheme {
1240    AppTheme {
1241        is_dark: true,
1242        background: Rgb::new(1, 22, 39),
1243        surface: Rgb::new(12, 35, 55),
1244        border: Rgb::new(87, 86, 86),
1245        selection: Rgb::new(95, 126, 151),
1246        text_primary: Rgb::new(214, 222, 235),
1247        text_secondary: Rgb::new(130, 170, 255),
1248        text_muted: Rgb::new(87, 86, 86),
1249        accent: Rgb::new(130, 170, 255),
1250        success: Rgb::new(34, 218, 110),
1251        warning: Rgb::new(173, 219, 103),
1252        error: Rgb::new(239, 83, 80),
1253        diff_add: Rgb::new(34, 218, 110),
1254        diff_del: Rgb::new(239, 83, 80),
1255        diff_context: Rgb::new(87, 86, 86),
1256        diff_hunk: Rgb::new(130, 170, 255),
1257        graph_colors: [
1258            Rgb::new(130, 170, 255),
1259            Rgb::new(34, 218, 110),
1260            Rgb::new(239, 83, 80),
1261            Rgb::new(173, 219, 103),
1262            Rgb::new(199, 146, 234),
1263            Rgb::new(127, 219, 202),
1264            Rgb::new(214, 222, 235),
1265            Rgb::new(255, 203, 139),
1266        ],
1267    }
1268}
1269
1270pub fn poimandres() -> AppTheme {
1271    AppTheme {
1272        is_dark: true,
1273        background: Rgb::new(26, 30, 40),
1274        surface: Rgb::new(38, 42, 55),
1275        border: Rgb::new(100, 106, 130),
1276        selection: Rgb::new(50, 55, 75),
1277        text_primary: Rgb::new(166, 172, 205),
1278        text_secondary: Rgb::new(137, 221, 255),
1279        text_muted: Rgb::new(100, 106, 130),
1280        accent: Rgb::new(93, 228, 199),
1281        success: Rgb::new(93, 228, 199),
1282        warning: Rgb::new(255, 250, 194),
1283        error: Rgb::new(208, 103, 157),
1284        diff_add: Rgb::new(93, 228, 199),
1285        diff_del: Rgb::new(208, 103, 157),
1286        diff_context: Rgb::new(100, 106, 130),
1287        diff_hunk: Rgb::new(137, 221, 255),
1288        graph_colors: [
1289            Rgb::new(93, 228, 199),
1290            Rgb::new(137, 221, 255),
1291            Rgb::new(208, 103, 157),
1292            Rgb::new(255, 250, 194),
1293            Rgb::new(166, 172, 205),
1294            Rgb::new(173, 219, 103),
1295            Rgb::new(100, 106, 130),
1296            Rgb::new(255, 180, 120),
1297        ],
1298    }
1299}
1300
1301pub fn flexoki_dark() -> AppTheme {
1302    AppTheme {
1303        is_dark: true,
1304        background: Rgb::new(16, 15, 15),
1305        surface: Rgb::new(30, 28, 28),
1306        border: Rgb::new(87, 86, 83),
1307        selection: Rgb::new(64, 62, 60),
1308        text_primary: Rgb::new(206, 205, 195),
1309        text_secondary: Rgb::new(67, 133, 190),
1310        text_muted: Rgb::new(87, 86, 83),
1311        accent: Rgb::new(67, 133, 190),
1312        success: Rgb::new(135, 154, 57),
1313        warning: Rgb::new(208, 162, 21),
1314        error: Rgb::new(209, 77, 65),
1315        diff_add: Rgb::new(135, 154, 57),
1316        diff_del: Rgb::new(209, 77, 65),
1317        diff_context: Rgb::new(87, 86, 83),
1318        diff_hunk: Rgb::new(67, 133, 190),
1319        graph_colors: [
1320            Rgb::new(67, 133, 190),
1321            Rgb::new(135, 154, 57),
1322            Rgb::new(209, 77, 65),
1323            Rgb::new(208, 162, 21),
1324            Rgb::new(206, 93, 151),
1325            Rgb::new(58, 169, 159),
1326            Rgb::new(206, 205, 195),
1327            Rgb::new(171, 141, 72),
1328        ],
1329    }
1330}
1331
1332pub fn flexoki_light() -> AppTheme {
1333    AppTheme {
1334        is_dark: false,
1335        background: Rgb::new(255, 252, 240),
1336        surface: Rgb::new(242, 238, 222),
1337        border: Rgb::new(183, 181, 172),
1338        selection: Rgb::new(206, 205, 195),
1339        text_primary: Rgb::new(16, 15, 15),
1340        text_secondary: Rgb::new(32, 94, 166),
1341        text_muted: Rgb::new(111, 110, 105),
1342        accent: Rgb::new(32, 94, 166),
1343        success: Rgb::new(102, 128, 11),
1344        warning: Rgb::new(173, 131, 1),
1345        error: Rgb::new(175, 48, 41),
1346        diff_add: Rgb::new(102, 128, 11),
1347        diff_del: Rgb::new(175, 48, 41),
1348        diff_context: Rgb::new(111, 110, 105),
1349        diff_hunk: Rgb::new(32, 94, 166),
1350        graph_colors: [
1351            Rgb::new(32, 94, 166),
1352            Rgb::new(102, 128, 11),
1353            Rgb::new(175, 48, 41),
1354            Rgb::new(173, 131, 1),
1355            Rgb::new(163, 64, 119),
1356            Rgb::new(36, 131, 123),
1357            Rgb::new(16, 15, 15),
1358            Rgb::new(133, 104, 46),
1359        ],
1360    }
1361}
1362
1363pub fn carbonfox() -> AppTheme {
1364    AppTheme {
1365        is_dark: true,
1366        background: Rgb::new(22, 22, 22),
1367        surface: Rgb::new(35, 35, 35),
1368        border: Rgb::new(72, 72, 72),
1369        selection: Rgb::new(42, 42, 42),
1370        text_primary: Rgb::new(242, 244, 248),
1371        text_secondary: Rgb::new(120, 169, 255),
1372        text_muted: Rgb::new(100, 100, 110),
1373        accent: Rgb::new(120, 169, 255),
1374        success: Rgb::new(37, 190, 106),
1375        warning: Rgb::new(8, 189, 186),
1376        error: Rgb::new(238, 83, 150),
1377        diff_add: Rgb::new(37, 190, 106),
1378        diff_del: Rgb::new(238, 83, 150),
1379        diff_context: Rgb::new(100, 100, 110),
1380        diff_hunk: Rgb::new(120, 169, 255),
1381        graph_colors: [
1382            Rgb::new(120, 169, 255),
1383            Rgb::new(37, 190, 106),
1384            Rgb::new(238, 83, 150),
1385            Rgb::new(8, 189, 186),
1386            Rgb::new(190, 149, 255),
1387            Rgb::new(255, 126, 182),
1388            Rgb::new(242, 244, 248),
1389            Rgb::new(255, 170, 120),
1390        ],
1391    }
1392}
1393
1394pub fn andromeda() -> AppTheme {
1395    AppTheme {
1396        is_dark: true,
1397        background: Rgb::new(38, 42, 51),
1398        surface: Rgb::new(50, 55, 66),
1399        border: Rgb::new(102, 102, 102),
1400        selection: Rgb::new(90, 92, 98),
1401        text_primary: Rgb::new(229, 229, 229),
1402        text_secondary: Rgb::new(15, 168, 205),
1403        text_muted: Rgb::new(102, 102, 102),
1404        accent: Rgb::new(5, 188, 121),
1405        success: Rgb::new(5, 188, 121),
1406        warning: Rgb::new(229, 229, 18),
1407        error: Rgb::new(205, 49, 49),
1408        diff_add: Rgb::new(5, 188, 121),
1409        diff_del: Rgb::new(205, 49, 49),
1410        diff_context: Rgb::new(102, 102, 102),
1411        diff_hunk: Rgb::new(15, 168, 205),
1412        graph_colors: [
1413            Rgb::new(5, 188, 121),
1414            Rgb::new(15, 168, 205),
1415            Rgb::new(205, 49, 49),
1416            Rgb::new(229, 229, 18),
1417            Rgb::new(190, 149, 255),
1418            Rgb::new(255, 126, 182),
1419            Rgb::new(229, 229, 229),
1420            Rgb::new(102, 102, 102),
1421        ],
1422    }
1423}
1424
1425pub fn synthwave() -> AppTheme {
1426    AppTheme {
1427        is_dark: true,
1428        background: Rgb::new(10, 8, 16),
1429        surface: Rgb::new(20, 16, 30),
1430        border: Rgb::new(127, 112, 148),
1431        selection: Rgb::new(25, 50, 60),
1432        text_primary: Rgb::new(218, 217, 199),
1433        text_secondary: Rgb::new(18, 195, 226),
1434        text_muted: Rgb::new(127, 112, 148),
1435        accent: Rgb::new(246, 24, 143),
1436        success: Rgb::new(30, 187, 43),
1437        warning: Rgb::new(253, 248, 52),
1438        error: Rgb::new(246, 24, 143),
1439        diff_add: Rgb::new(30, 187, 43),
1440        diff_del: Rgb::new(246, 24, 143),
1441        diff_context: Rgb::new(127, 112, 148),
1442        diff_hunk: Rgb::new(18, 195, 226),
1443        graph_colors: [
1444            Rgb::new(246, 24, 143),
1445            Rgb::new(30, 187, 43),
1446            Rgb::new(18, 195, 226),
1447            Rgb::new(253, 248, 52),
1448            Rgb::new(190, 149, 255),
1449            Rgb::new(255, 126, 182),
1450            Rgb::new(218, 217, 199),
1451            Rgb::new(127, 112, 148),
1452        ],
1453    }
1454}
1455
1456#[cfg(test)]
1457mod tests {
1458    use super::*;
1459
1460    #[test]
1461    fn theme_count_matches_names() {
1462        assert_eq!(THEME_NAMES.len(), THEME_COUNT);
1463    }
1464
1465    #[test]
1466    fn all_themes_resolve() {
1467        for i in 0..THEME_COUNT {
1468            let t = theme_by_index(i);
1469            let has_colour = t.text_primary.r > 0 || t.text_primary.g > 0 || t.text_primary.b > 0;
1470            assert!(has_colour, "theme index {i} has zero text_primary");
1471        }
1472    }
1473
1474    #[test]
1475    fn out_of_range_returns_default() {
1476        let d = theme_by_index(0);
1477        let oob = theme_by_index(999);
1478        assert_eq!(d.background.r, oob.background.r);
1479        assert_eq!(d.background.g, oob.background.g);
1480        assert_eq!(d.background.b, oob.background.b);
1481    }
1482
1483    #[test]
1484    fn theme_index_by_name_known() {
1485        assert_eq!(theme_index_by_name("Default"), 0);
1486        assert_eq!(theme_index_by_name("Cyberpunk"), 28);
1487        assert_eq!(theme_index_by_name("Synthwave"), 42);
1488    }
1489
1490    #[test]
1491    fn theme_index_by_name_unknown_returns_zero() {
1492        assert_eq!(theme_index_by_name("NonExistent"), 0);
1493    }
1494
1495    #[test]
1496    fn light_themes_are_light() {
1497        assert!(!default_light().is_dark);
1498        assert!(!solarized_light().is_dark);
1499        assert!(!gruvbox_light().is_dark);
1500        assert!(!catppuccin_latte().is_dark);
1501        assert!(!tokyo_night_light().is_dark);
1502        assert!(!kanagawa_lotus().is_dark);
1503        assert!(!rose_pine_dawn().is_dark);
1504        assert!(!atom_one_light().is_dark);
1505        assert!(!flexoki_light().is_dark);
1506    }
1507
1508    #[test]
1509    fn cyberpunk_accent_is_yellow() {
1510        let t = cyberpunk();
1511        assert!(t.accent.r > 240 && t.accent.g > 220 && t.accent.b < 30);
1512    }
1513}