From bff0eddc122d6345f768cae91b2199322e4a0f94 Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Wed, 2 Sep 2026 16:06:31 +0100 Subject: [PATCH] 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 --- crates/maestro-config/src/lib.rs | 17 +- crates/maestro-tui/src/config.rs | 10 ++ crates/maestro-tui/src/palette.rs | 279 +++++++++++++++++++++++++----- docs/INSTALL.md | 19 +- 4 files changed, 271 insertions(+), 54 deletions(-) diff --git a/crates/maestro-config/src/lib.rs b/crates/maestro-config/src/lib.rs index a4e6e3b..bfa9b1b 100644 --- a/crates/maestro-config/src/lib.rs +++ b/crates/maestro-config/src/lib.rs @@ -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), diff --git a/crates/maestro-tui/src/config.rs b/crates/maestro-tui/src/config.rs index 7983d26..db75b8c 100644 --- a/crates/maestro-tui/src/config.rs +++ b/crates/maestro-tui/src/config.rs @@ -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), diff --git a/crates/maestro-tui/src/palette.rs b/crates/maestro-tui/src/palette.rs index 8f688d5..b21bdde 100644 --- a/crates/maestro-tui/src/palette.rs +++ b/crates/maestro-tui/src/palette.rs @@ -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), diff --git a/docs/INSTALL.md b/docs/INSTALL.md index acf9a4e..e375ec9 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -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 |