muffintui 0.1.14

A terminal workspace that combines a file tree, editor, shell, and embedded Codex pane
Documentation
use ratatui::{
    style::{Color, Modifier, Style},
    text::Span,
    widgets::{Block, Borders},
};

#[derive(Copy, Clone)]
pub struct Theme {
    pub name: &'static str,
    pub app_bg: Color,
    pub pane_bg: Color,
    pub border: Color,
    pub border_focus: Color,
    pub title: Color,
    pub title_focus_fg: Color,
    pub title_focus_bg: Color,
    pub text: Color,
    pub muted: Color,
    pub list_highlight_bg: Color,
    pub list_highlight_fg: Color,
    pub codex_cursor: Color,
    pub accent_warn: Color,
    pub accent_info: Color,
    pub accent_scroll: Color,
}

pub const THEMES: [Theme; 3] = [
    Theme {
        name: "Teal Night",
        app_bg: Color::Rgb(8, 11, 15),
        pane_bg: Color::Rgb(11, 14, 18),
        border: Color::Rgb(92, 104, 118),
        border_focus: Color::Rgb(95, 211, 188),
        title: Color::Rgb(180, 188, 196),
        title_focus_fg: Color::Black,
        title_focus_bg: Color::Rgb(95, 211, 188),
        text: Color::Rgb(232, 238, 242),
        muted: Color::Rgb(130, 145, 160),
        list_highlight_bg: Color::Rgb(39, 47, 58),
        list_highlight_fg: Color::Rgb(255, 224, 102),
        codex_cursor: Color::Rgb(95, 211, 188),
        accent_warn: Color::Rgb(241, 196, 15),
        accent_info: Color::Rgb(80, 227, 194),
        accent_scroll: Color::Rgb(137, 180, 250),
    },
    Theme {
        name: "Amber Graphite",
        app_bg: Color::Rgb(18, 15, 12),
        pane_bg: Color::Rgb(24, 21, 17),
        border: Color::Rgb(122, 104, 90),
        border_focus: Color::Rgb(255, 176, 90),
        title: Color::Rgb(205, 190, 174),
        title_focus_fg: Color::Black,
        title_focus_bg: Color::Rgb(255, 176, 90),
        text: Color::Rgb(244, 235, 225),
        muted: Color::Rgb(169, 152, 136),
        list_highlight_bg: Color::Rgb(58, 44, 31),
        list_highlight_fg: Color::Rgb(255, 220, 160),
        codex_cursor: Color::Rgb(255, 176, 90),
        accent_warn: Color::Rgb(255, 213, 79),
        accent_info: Color::Rgb(255, 142, 83),
        accent_scroll: Color::Rgb(186, 230, 126),
    },
    Theme {
        name: "Ice Blue",
        app_bg: Color::Rgb(232, 238, 245),
        pane_bg: Color::Rgb(244, 248, 252),
        border: Color::Rgb(132, 151, 170),
        border_focus: Color::Rgb(50, 127, 191),
        title: Color::Rgb(82, 100, 119),
        title_focus_fg: Color::White,
        title_focus_bg: Color::Rgb(50, 127, 191),
        text: Color::Rgb(20, 35, 48),
        muted: Color::Rgb(96, 116, 136),
        list_highlight_bg: Color::Rgb(205, 223, 240),
        list_highlight_fg: Color::Rgb(16, 57, 95),
        codex_cursor: Color::Rgb(50, 127, 191),
        accent_warn: Color::Rgb(232, 180, 44),
        accent_info: Color::Rgb(95, 168, 211),
        accent_scroll: Color::Rgb(117, 197, 143),
    },
];

pub fn pane_block(title: &str, focused: bool, theme: Theme) -> Block<'static> {
    let border_style = if focused {
        Style::default()
            .fg(theme.border_focus)
            .add_modifier(Modifier::BOLD)
    } else {
        Style::default().fg(theme.border)
    };

    let title_style = if focused {
        Style::default()
            .fg(theme.title_focus_fg)
            .bg(theme.title_focus_bg)
            .add_modifier(Modifier::BOLD)
    } else {
        Style::default().fg(theme.title).bg(theme.pane_bg)
    };

    Block::default()
        .borders(Borders::ALL)
        .border_style(border_style)
        .style(Style::default().bg(theme.pane_bg).fg(theme.text))
        .title(Span::styled(title.to_string(), title_style))
}