feat(maestro): graphite TUI default + five accent presets

Replaces the army-green dark/light palettes with neutral graphite and
adds ice-cyan, periwinkle, amber-phosphor, ember and orchid presets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Miguel Palhas
2026-09-02 16:06:31 +01:00
co-authored by Claude Fable 5
parent f89be4a716
commit bff0eddc12
4 changed files with 271 additions and 54 deletions
+16 -1
View File
@@ -174,10 +174,20 @@ pub struct TuiSection {
/// Palette presets supported by the TUI's `[tui].theme` setting.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TuiTheme {
/// The terminal-native dark palette and the default.
/// The graphite dark palette and the default.
Dark,
/// A high-contrast light palette.
Light,
/// Ice Cyan — cyan accent on the graphite base.
IceCyan,
/// Periwinkle — indigo base, blue-violet accent.
Periwinkle,
/// Amber Phosphor — CRT amber on warm graphite.
AmberPhosphor,
/// Ember — warm orange-red accent.
Ember,
/// Orchid — muted violet accent.
Orchid,
/// Named ANSI colours, allowing the terminal to provide the colour set.
Ansi,
/// Solarized Dark.
@@ -204,6 +214,11 @@ pub enum TuiTheme {
pub const TUI_THEMES: &[(&str, TuiTheme)] = &[
("dark", TuiTheme::Dark),
("light", TuiTheme::Light),
("ice-cyan", TuiTheme::IceCyan),
("periwinkle", TuiTheme::Periwinkle),
("amber-phosphor", TuiTheme::AmberPhosphor),
("ember", TuiTheme::Ember),
("orchid", TuiTheme::Orchid),
("ansi", TuiTheme::Ansi),
("solarized-dark", TuiTheme::SolarizedDark),
("solarized-light", TuiTheme::SolarizedLight),
+10
View File
@@ -80,6 +80,11 @@ impl TuiConfig {
let palette = match section.theme.unwrap_or(TuiTheme::Dark) {
TuiTheme::Dark => Palette::DARK,
TuiTheme::Light => Palette::LIGHT,
TuiTheme::IceCyan => Palette::ICE_CYAN,
TuiTheme::Periwinkle => Palette::PERIWINKLE,
TuiTheme::AmberPhosphor => Palette::AMBER_PHOSPHOR,
TuiTheme::Ember => Palette::EMBER,
TuiTheme::Orchid => Palette::ORCHID,
TuiTheme::Ansi => Palette::ANSI,
TuiTheme::SolarizedDark => Palette::SOLARIZED_DARK,
TuiTheme::SolarizedLight => Palette::SOLARIZED_LIGHT,
@@ -172,6 +177,11 @@ mod tests {
for (theme, expected) in [
(TuiTheme::Dark, Palette::DARK),
(TuiTheme::Light, Palette::LIGHT),
(TuiTheme::IceCyan, Palette::ICE_CYAN),
(TuiTheme::Periwinkle, Palette::PERIWINKLE),
(TuiTheme::AmberPhosphor, Palette::AMBER_PHOSPHOR),
(TuiTheme::Ember, Palette::EMBER),
(TuiTheme::Orchid, Palette::ORCHID),
(TuiTheme::Ansi, Palette::ANSI),
(TuiTheme::SolarizedDark, Palette::SOLARIZED_DARK),
(TuiTheme::SolarizedLight, Palette::SOLARIZED_LIGHT),
+232 -47
View File
@@ -16,12 +16,14 @@
//! the selected card uses the selection surface's own state colours; the dot
//! keeps carrying the state either way (docs/SIDEBAR.md).
//!
//! [`Palette::DARK`] is the default. [`Palette::LIGHT`] is its light peer and
//! [`Palette::ANSI`] uses terminal-provided ANSI colours. The remaining
//! presets ([`Palette::presets`]) adapt well-known editor themes — Solarized,
//! Catppuccin, GitHub, Tokyo Night, Gruvbox, Nord, Dracula — with individual
//! colours lifted or darkened where the originals fall short of the contrast
//! floors asserted below.
//! [`Palette::DARK`] — graphite, no accent hue — is the default.
//! [`Palette::LIGHT`] is its light peer and [`Palette::ANSI`] uses
//! terminal-provided ANSI colours. Five house presets recolour the graphite
//! base with an accent (Ice Cyan, Periwinkle, Amber Phosphor, Ember, Orchid);
//! the remaining presets ([`Palette::presets`]) adapt well-known editor
//! themes — Solarized, Catppuccin, GitHub, Tokyo Night, Gruvbox, Nord,
//! Dracula — with individual colours lifted or darkened where the originals
//! fall short of the contrast floors asserted below.
//!
//! Out of scope: PTY cell colours. Those belong to the program running in the
//! pane and pass through `pane::translate_color` verbatim.
@@ -135,73 +137,75 @@ pub struct Palette {
}
impl Palette {
/// The dark terminal-native palette and the default preset.
/// The graphite dark palette and the default preset: pure near-neutral
/// chrome with an ink-coloured accent, so activity colours are the only
/// hue on screen.
pub const DARK: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x1f, 0x23, 0x2b),
fg: Color::Rgb(0xe5, 0xe7, 0xeb),
muted: Color::Rgb(0xae, 0xb7, 0xc4),
dim: Color::Rgb(0x85, 0x8f, 0x9e),
bg: Color::Rgb(0x1d, 0x1f, 0x22),
fg: Color::Rgb(0xe6, 0xe8, 0xeb),
muted: Color::Rgb(0xb1, 0xb4, 0xb9),
dim: Color::Rgb(0x86, 0x89, 0x8e),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xae, 0xb7, 0xc4),
idle: Color::Rgb(0xb1, 0xb4, 0xb9),
awaiting: Color::Rgb(0xf2, 0xc9, 0x5c),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x3d, 0x51, 0x44),
fg: Color::Rgb(0xf3, 0xf7, 0xf4),
muted: Color::Rgb(0xd0, 0xd9, 0xd3),
dim: Color::Rgb(0xa1, 0xb0, 0xa6),
bg: Color::Rgb(0x3f, 0x43, 0x48),
fg: Color::Rgb(0xf0, 0xf2, 0xf5),
muted: Color::Rgb(0xce, 0xd1, 0xd5),
dim: Color::Rgb(0xa5, 0xa8, 0xab),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xc4, 0xcf, 0xc7),
idle: Color::Rgb(0xd5, 0xd8, 0xdb),
awaiting: Color::Rgb(0xf6, 0xd9, 0x78),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x1f, 0x23, 0x2b),
sidebar_focus_bg: Color::Rgb(0x28, 0x30, 0x2a),
border_focused: Color::Rgb(0x72, 0xd6, 0x87),
border_unfocused: Color::Rgb(0x68, 0x73, 0x84),
focus_accent: Color::Rgb(0x72, 0xd6, 0x87),
group_row: Color::Rgb(0xb6, 0xc1, 0xd3),
mode_normal_bg: Color::Rgb(0x72, 0xd6, 0x87),
mode_normal_fg: Color::Rgb(0x1f, 0x23, 0x2b),
chrome_bg: Color::Rgb(0x1d, 0x1f, 0x22),
sidebar_focus_bg: Color::Rgb(0x28, 0x2a, 0x2d),
border_focused: Color::Rgb(0xe2, 0xe5, 0xe8),
border_unfocused: Color::Rgb(0x72, 0x75, 0x79),
focus_accent: Color::Rgb(0xe2, 0xe5, 0xe8),
group_row: Color::Rgb(0xba, 0xbe, 0xc3),
mode_normal_bg: Color::Rgb(0xe2, 0xe5, 0xe8),
mode_normal_fg: Color::Rgb(0x17, 0x1b, 0x20),
mode_insert_bg: Color::Rgb(0xf2, 0xc9, 0x5c),
mode_insert_fg: Color::Rgb(0x1f, 0x23, 0x2b),
mode_insert_fg: Color::Rgb(0x1d, 0x1f, 0x22),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// A high-contrast light peer to [`Self::DARK`].
/// A high-contrast light peer to [`Self::DARK`]: ink-on-paper graphite.
pub const LIGHT: Palette = Palette {
card: Surface {
bg: Color::Rgb(0xff, 0xff, 0xff),
fg: Color::Rgb(0x27, 0x31, 0x3d),
muted: Color::Rgb(0x4c, 0x5b, 0x6b),
dim: Color::Rgb(0x68, 0x78, 0x8a),
fg: Color::Rgb(0x20, 0x24, 0x2a),
muted: Color::Rgb(0x56, 0x5b, 0x63),
dim: Color::Rgb(0x7b, 0x81, 0x89),
active: Color::Rgb(0x21, 0x7a, 0x3c),
idle: Color::Rgb(0x4c, 0x5b, 0x6b),
idle: Color::Rgb(0x56, 0x5b, 0x63),
awaiting: Color::Rgb(0x8f, 0x63, 0x00),
error: Color::Rgb(0xb4, 0x23, 0x18),
},
selection: Surface {
bg: Color::Rgb(0xb5, 0xcf, 0xba),
fg: Color::Rgb(0x1d, 0x2a, 0x24),
muted: Color::Rgb(0x3f, 0x55, 0x45),
dim: Color::Rgb(0x52, 0x68, 0x5a),
bg: Color::Rgb(0xc5, 0xc7, 0xca),
fg: Color::Rgb(0x15, 0x19, 0x1e),
muted: Color::Rgb(0x43, 0x48, 0x4f),
dim: Color::Rgb(0x5e, 0x64, 0x6b),
active: Color::Rgb(0x15, 0x5b, 0x2e),
idle: Color::Rgb(0x3f, 0x55, 0x45),
idle: Color::Rgb(0x38, 0x3e, 0x45),
awaiting: Color::Rgb(0x69, 0x46, 0x00),
error: Color::Rgb(0xa5, 0x1d, 0x14),
error: Color::Rgb(0x99, 0x1a, 0x12),
},
chrome_bg: Color::Rgb(0xff, 0xff, 0xff),
sidebar_focus_bg: Color::Rgb(0xee, 0xf5, 0xef),
border_focused: Color::Rgb(0x21, 0x7a, 0x3c),
border_unfocused: Color::Rgb(0x65, 0x73, 0x6b),
focus_accent: Color::Rgb(0x21, 0x7a, 0x3c),
group_row: Color::Rgb(0x3f, 0x55, 0x45),
mode_normal_bg: Color::Rgb(0x21, 0x7a, 0x3c),
mode_normal_fg: Color::Rgb(0xff, 0xff, 0xff),
mode_insert_bg: Color::Rgb(0xb6, 0x81, 0x08),
mode_insert_fg: Color::Rgb(0x0b, 0x12, 0x0e),
sidebar_focus_bg: Color::Rgb(0xef, 0xf0, 0xf2),
border_focused: Color::Rgb(0x36, 0x3b, 0x41),
border_unfocused: Color::Rgb(0x76, 0x7b, 0x82),
focus_accent: Color::Rgb(0x36, 0x3b, 0x41),
group_row: Color::Rgb(0x4e, 0x53, 0x5a),
mode_normal_bg: Color::Rgb(0x23, 0x27, 0x2c),
mode_normal_fg: Color::Rgb(0xf9, 0xfa, 0xfb),
mode_insert_bg: Color::Rgb(0x8f, 0x63, 0x00),
mode_insert_fg: Color::Rgb(0xff, 0xff, 0xff),
error_text: Color::Rgb(0xb4, 0x23, 0x18),
};
@@ -556,14 +560,195 @@ impl Palette {
error_text: Color::Rgb(0xff, 0x59, 0x59),
};
/// Ice Cyan — signal-cyan accent on the graphite slate base.
pub const ICE_CYAN: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x1c, 0x20, 0x25),
fg: Color::Rgb(0xe4, 0xe8, 0xed),
muted: Color::Rgb(0xaf, 0xb5, 0xbc),
dim: Color::Rgb(0x84, 0x8a, 0x91),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xaf, 0xb5, 0xbc),
awaiting: Color::Rgb(0xf2, 0xc9, 0x5c),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x24, 0x4d, 0x59),
fg: Color::Rgb(0xee, 0xf2, 0xf7),
muted: Color::Rgb(0xcd, 0xd1, 0xd7),
dim: Color::Rgb(0xa4, 0xa8, 0xae),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xd3, 0xd8, 0xde),
awaiting: Color::Rgb(0xf6, 0xd9, 0x78),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x1c, 0x20, 0x25),
sidebar_focus_bg: Color::Rgb(0x26, 0x2a, 0x30),
border_focused: Color::Rgb(0x61, 0xe3, 0xf1),
border_unfocused: Color::Rgb(0x70, 0x75, 0x7b),
focus_accent: Color::Rgb(0x61, 0xe3, 0xf1),
group_row: Color::Rgb(0xb8, 0xbe, 0xc6),
mode_normal_bg: Color::Rgb(0x61, 0xe3, 0xf1),
mode_normal_fg: Color::Rgb(0x0f, 0x22, 0x2b),
mode_insert_bg: Color::Rgb(0xf2, 0xc9, 0x5c),
mode_insert_fg: Color::Rgb(0x1c, 0x20, 0x25),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// Periwinkle — indigo-tinted base with a soft blue-violet accent.
pub const PERIWINKLE: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x1d, 0x1e, 0x29),
fg: Color::Rgb(0xe5, 0xe7, 0xf1),
muted: Color::Rgb(0xb1, 0xb3, 0xc2),
dim: Color::Rgb(0x86, 0x88, 0x96),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xb1, 0xb3, 0xc2),
awaiting: Color::Rgb(0xf2, 0xc9, 0x5c),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x3b, 0x43, 0x6c),
fg: Color::Rgb(0xef, 0xf1, 0xfb),
muted: Color::Rgb(0xce, 0xd0, 0xdc),
dim: Color::Rgb(0xa5, 0xa7, 0xb2),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xd4, 0xd7, 0xe3),
awaiting: Color::Rgb(0xf6, 0xd9, 0x78),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x1d, 0x1e, 0x29),
sidebar_focus_bg: Color::Rgb(0x27, 0x29, 0x35),
border_focused: Color::Rgb(0x97, 0xa7, 0xfd),
border_unfocused: Color::Rgb(0x71, 0x74, 0x80),
focus_accent: Color::Rgb(0x97, 0xa7, 0xfd),
group_row: Color::Rgb(0xba, 0xbd, 0xcc),
mode_normal_bg: Color::Rgb(0x97, 0xa7, 0xfd),
mode_normal_fg: Color::Rgb(0x12, 0x14, 0x28),
mode_insert_bg: Color::Rgb(0xf2, 0xc9, 0x5c),
mode_insert_fg: Color::Rgb(0x1d, 0x1e, 0x29),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// Amber Phosphor — CRT amber on warm graphite. The awaiting colour
/// shifts orange so it stays distinct from the amber accent.
pub const AMBER_PHOSPHOR: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x22, 0x1f, 0x1a),
fg: Color::Rgb(0xec, 0xe7, 0xe1),
muted: Color::Rgb(0xba, 0xb3, 0xaa),
dim: Color::Rgb(0x8f, 0x88, 0x7f),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xba, 0xb3, 0xaa),
awaiting: Color::Rgb(0xff, 0x9b, 0x50),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x55, 0x43, 0x26),
fg: Color::Rgb(0xf6, 0xf1, 0xeb),
muted: Color::Rgb(0xd6, 0xd0, 0xc9),
dim: Color::Rgb(0xad, 0xa7, 0xa0),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xdd, 0xd6, 0xcf),
awaiting: Color::Rgb(0xff, 0xb9, 0x72),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x22, 0x1f, 0x1a),
sidebar_focus_bg: Color::Rgb(0x2d, 0x29, 0x25),
border_focused: Color::Rgb(0xf9, 0xbb, 0x51),
border_unfocused: Color::Rgb(0x7a, 0x73, 0x6c),
focus_accent: Color::Rgb(0xf9, 0xbb, 0x51),
group_row: Color::Rgb(0xc4, 0xbc, 0xb3),
mode_normal_bg: Color::Rgb(0xf9, 0xbb, 0x51),
mode_normal_fg: Color::Rgb(0x2f, 0x1e, 0x01),
mode_insert_bg: Color::Rgb(0xff, 0x9b, 0x50),
mode_insert_fg: Color::Rgb(0x22, 0x1f, 0x1a),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// Ember — warm orange-red accent on a cleaner warm neutral.
pub const EMBER: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x23, 0x1e, 0x1b),
fg: Color::Rgb(0xed, 0xe6, 0xe3),
muted: Color::Rgb(0xbc, 0xb2, 0xad),
dim: Color::Rgb(0x90, 0x87, 0x82),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xbc, 0xb2, 0xad),
awaiting: Color::Rgb(0xf2, 0xc9, 0x5c),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x5d, 0x3e, 0x30),
fg: Color::Rgb(0xf7, 0xf0, 0xed),
muted: Color::Rgb(0xd7, 0xcf, 0xcb),
dim: Color::Rgb(0xae, 0xa6, 0xa2),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xde, 0xd5, 0xd1),
awaiting: Color::Rgb(0xf6, 0xd9, 0x78),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x23, 0x1e, 0x1b),
sidebar_focus_bg: Color::Rgb(0x2e, 0x29, 0x26),
border_focused: Color::Rgb(0xf7, 0x89, 0x55),
border_unfocused: Color::Rgb(0x7b, 0x72, 0x6e),
focus_accent: Color::Rgb(0xf7, 0x89, 0x55),
group_row: Color::Rgb(0xc6, 0xbb, 0xb6),
mode_normal_bg: Color::Rgb(0xf7, 0x89, 0x55),
mode_normal_fg: Color::Rgb(0x2a, 0x14, 0x0a),
mode_insert_bg: Color::Rgb(0xf2, 0xc9, 0x5c),
mode_insert_fg: Color::Rgb(0x23, 0x1e, 0x1b),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// Orchid — muted violet accent on a faintly violet base.
pub const ORCHID: Palette = Palette {
card: Surface {
bg: Color::Rgb(0x21, 0x1e, 0x25),
fg: Color::Rgb(0xe9, 0xe6, 0xee),
muted: Color::Rgb(0xb6, 0xb2, 0xbd),
dim: Color::Rgb(0x8b, 0x87, 0x91),
active: Color::Rgb(0x72, 0xd6, 0x87),
idle: Color::Rgb(0xb6, 0xb2, 0xbd),
awaiting: Color::Rgb(0xf2, 0xc9, 0x5c),
error: Color::Rgb(0xff, 0x82, 0x7a),
},
selection: Surface {
bg: Color::Rgb(0x51, 0x3c, 0x63),
fg: Color::Rgb(0xf3, 0xf0, 0xf8),
muted: Color::Rgb(0xd3, 0xcf, 0xd8),
dim: Color::Rgb(0xa9, 0xa6, 0xaf),
active: Color::Rgb(0x9a, 0xf0, 0xa6),
idle: Color::Rgb(0xd9, 0xd5, 0xdf),
awaiting: Color::Rgb(0xf6, 0xd9, 0x78),
error: Color::Rgb(0xff, 0xa8, 0xa3),
},
chrome_bg: Color::Rgb(0x21, 0x1e, 0x25),
sidebar_focus_bg: Color::Rgb(0x2c, 0x28, 0x30),
border_focused: Color::Rgb(0xd1, 0x9f, 0xf5),
border_unfocused: Color::Rgb(0x76, 0x72, 0x7c),
focus_accent: Color::Rgb(0xd1, 0x9f, 0xf5),
group_row: Color::Rgb(0xc0, 0xbb, 0xc7),
mode_normal_bg: Color::Rgb(0xd1, 0x9f, 0xf5),
mode_normal_fg: Color::Rgb(0x22, 0x13, 0x2c),
mode_insert_bg: Color::Rgb(0xf2, 0xc9, 0x5c),
mode_insert_fg: Color::Rgb(0x21, 0x1e, 0x25),
error_text: Color::Rgb(0xff, 0x82, 0x7a),
};
/// The default preset, retained as a named compatibility constant.
pub const DEFAULT: Palette = Self::DARK;
/// All preset names and their complete palettes.
pub fn presets() -> [(&'static str, Palette); 12] {
pub fn presets() -> [(&'static str, Palette); 17] {
[
("dark", Self::DARK),
("light", Self::LIGHT),
("ice-cyan", Self::ICE_CYAN),
("periwinkle", Self::PERIWINKLE),
("amber-phosphor", Self::AMBER_PHOSPHOR),
("ember", Self::EMBER),
("orchid", Self::ORCHID),
("ansi", Self::ANSI),
("solarized-dark", Self::SOLARIZED_DARK),
("solarized-light", Self::SOLARIZED_LIGHT),
+13 -6
View File
@@ -154,15 +154,22 @@ chord_timeout_ms = 1000 # how long to hold a partial chord like `ctrl-w`
# want extra Insert-mode bindings)
```
`theme` selects the complete TUI palette. `dark` is the default and follows
Maestro's terminal-native dark product palette; `light` is its light peer;
`ansi` uses the terminal's named ANSI colours for terminals without truecolour.
The remaining presets adapt well-known editor themes, with individual colours
lifted or darkened where the originals fall short of the WCAG AA contrast
floors the palette tests assert:
`theme` selects the complete TUI palette. `dark` is the default: Maestro's
graphite palette, near-neutral chrome where the activity colours are the only
hue on screen; `light` is its light peer; `ansi` uses the terminal's named
ANSI colours for terminals without truecolour. Five house presets recolour
the graphite base with an accent, and the remaining presets adapt well-known
editor themes — in both groups individual colours are lifted or darkened
where they would fall short of the WCAG AA contrast floors the palette tests
assert:
| name | based on |
|-------------------|------------------|
| `ice-cyan` | graphite base, signal-cyan accent |
| `periwinkle` | indigo base, blue-violet accent |
| `amber-phosphor` | warm graphite, CRT-amber accent |
| `ember` | warm graphite, orange-red accent |
| `orchid` | violet base, muted violet accent |
| `solarized-dark` | Solarized Dark |
| `solarized-light` | Solarized Light |
| `catppuccin` | Catppuccin Mocha |