Skip to main content

shipd_core/
theme.rs

1use serde::Deserialize;
2
3#[derive(Debug, Clone)]
4pub struct Theme {
5    pub accent: (u8, u8, u8),
6    pub bg: (u8, u8, u8),
7    pub text: (u8, u8, u8),
8    pub muted: (u8, u8, u8),
9    pub dim: (u8, u8, u8),
10    pub green: (u8, u8, u8),
11    pub yellow: (u8, u8, u8),
12    pub red: (u8, u8, u8),
13    pub blue: (u8, u8, u8),
14}
15
16#[derive(Debug, Clone, Deserialize, Default)]
17pub enum ThemeName {
18    #[default]
19    #[serde(rename = "shipd")]
20    Shipd,
21    #[serde(rename = "catppuccin")]
22    Catppuccin,
23    #[serde(rename = "tokyo-night")]
24    TokyoNight,
25}
26
27impl ThemeName {
28    pub fn from_str(s: &str) -> Self {
29        match s {
30            "catppuccin" => ThemeName::Catppuccin,
31            "tokyo-night" => ThemeName::TokyoNight,
32            _ => ThemeName::Shipd,
33        }
34    }
35
36    pub fn to_theme(&self) -> Theme {
37        match self {
38            ThemeName::Shipd => Theme::shipd(),
39            ThemeName::Catppuccin => Theme::catppuccin(),
40            ThemeName::TokyoNight => Theme::tokyo_night(),
41        }
42    }
43}
44
45impl Theme {
46    pub fn shipd() -> Self {
47        Theme {
48            accent: (34, 211, 238),
49            bg: (10, 15, 28),
50            text: (220, 220, 230),
51            muted: (140, 140, 160),
52            dim: (80, 80, 100),
53            green: (80, 220, 120),
54            yellow: (250, 200, 60),
55            red: (250, 80, 80),
56            blue: (100, 160, 255),
57        }
58    }
59
60    pub fn catppuccin() -> Self {
61        // Catppuccin Mocha palette
62        Theme {
63            accent: (148, 226, 213), // teal
64            bg: (30, 30, 46),        // base
65            text: (205, 214, 244),   // text
66            muted: (166, 173, 200),  // subtext0
67            dim: (69, 71, 90),       // surface1
68            green: (166, 227, 161),  // green
69            yellow: (249, 226, 175), // yellow
70            red: (243, 139, 168),    // red
71            blue: (137, 180, 250),   // blue
72        }
73    }
74
75    pub fn tokyo_night() -> Self {
76        Theme {
77            accent: (125, 207, 255), // cyan
78            bg: (26, 27, 38),        // bg
79            text: (192, 202, 245),   // fg
80            muted: (86, 95, 137),    // comment
81            dim: (59, 66, 97),       // dark5
82            green: (158, 206, 106),  // green
83            yellow: (224, 175, 104), // yellow
84            red: (247, 118, 142),    // red
85            blue: (122, 162, 247),   // blue
86        }
87    }
88}