//! Centralized color definitions for Cagire TUI. //! Supports multiple color schemes with runtime switching. mod catppuccin_latte; mod catppuccin_mocha; mod dracula; mod fairyfloss; mod gruvbox_dark; mod hot_dog_stand; mod kanagawa; mod monochrome_black; mod monochrome_white; mod monokai; mod nord; mod pitch_black; mod rose_pine; mod tokyo_night; pub mod transform; use ratatui::style::Color; use std::cell::RefCell; pub struct ThemeEntry { pub id: &'static str, pub label: &'static str, pub colors: fn() -> ThemeColors, } pub const THEMES: &[ThemeEntry] = &[ ThemeEntry { id: "CatppuccinMocha", label: "Catppuccin Mocha", colors: catppuccin_mocha::theme }, ThemeEntry { id: "CatppuccinLatte", label: "Catppuccin Latte", colors: catppuccin_latte::theme }, ThemeEntry { id: "Nord", label: "Nord", colors: nord::theme }, ThemeEntry { id: "Dracula", label: "Dracula", colors: dracula::theme }, ThemeEntry { id: "GruvboxDark", label: "Gruvbox Dark", colors: gruvbox_dark::theme }, ThemeEntry { id: "Monokai", label: "Monokai", colors: monokai::theme }, ThemeEntry { id: "MonochromeBlack", label: "Monochrome (Black)", colors: monochrome_black::theme }, ThemeEntry { id: "MonochromeWhite", label: "Monochrome (White)", colors: monochrome_white::theme }, ThemeEntry { id: "PitchBlack", label: "Pitch Black", colors: pitch_black::theme }, ThemeEntry { id: "TokyoNight", label: "Tokyo Night", colors: tokyo_night::theme }, ThemeEntry { id: "RosePine", label: "Rosé Pine", colors: rose_pine::theme }, ThemeEntry { id: "Kanagawa", label: "Kanagawa", colors: kanagawa::theme }, ThemeEntry { id: "Fairyfloss", label: "Fairyfloss", colors: fairyfloss::theme }, ThemeEntry { id: "HotDogStand", label: "Hot Dog Stand", colors: hot_dog_stand::theme }, ]; thread_local! { static CURRENT_THEME: RefCell = RefCell::new((THEMES[0].colors)()); } pub fn get() -> ThemeColors { CURRENT_THEME.with(|t| t.borrow().clone()) } pub fn set(theme: ThemeColors) { CURRENT_THEME.with(|t| *t.borrow_mut() = theme); } #[derive(Clone)] pub struct ThemeColors { pub ui: UiColors, pub status: StatusColors, pub selection: SelectionColors, pub tile: TileColors, pub header: HeaderColors, pub modal: ModalColors, pub flash: FlashColors, pub list: ListColors, pub link_status: LinkStatusColors, pub syntax: SyntaxColors, pub table: TableColors, pub values: ValuesColors, pub hint: HintColors, pub view_badge: ViewBadgeColors, pub nav: NavColors, pub editor_widget: EditorWidgetColors, pub browser: BrowserColors, pub input: InputColors, pub search: SearchColors, pub markdown: MarkdownColors, pub engine: EngineColors, pub dict: DictColors, pub title: TitleColors, pub meter: MeterColors, pub sparkle: SparkleColors, pub confirm: ConfirmColors, } #[derive(Clone)] pub struct UiColors { pub bg: Color, pub bg_rgb: (u8, u8, u8), pub text_primary: Color, pub text_muted: Color, pub text_dim: Color, pub border: Color, pub header: Color, pub unfocused: Color, pub accent: Color, pub surface: Color, } #[derive(Clone)] pub struct StatusColors { pub playing_bg: Color, pub playing_fg: Color, pub stopped_bg: Color, pub stopped_fg: Color, pub fill_on: Color, pub fill_off: Color, pub fill_bg: Color, } #[derive(Clone)] pub struct SelectionColors { pub cursor_bg: Color, pub cursor_fg: Color, pub selected_bg: Color, pub selected_fg: Color, pub in_range_bg: Color, pub in_range_fg: Color, pub cursor: Color, pub selected: Color, pub in_range: Color, } #[derive(Clone)] pub struct TileColors { pub playing_active_bg: Color, pub playing_active_fg: Color, pub playing_inactive_bg: Color, pub playing_inactive_fg: Color, pub active_bg: Color, pub active_fg: Color, pub inactive_bg: Color, pub inactive_fg: Color, pub active_selected_bg: Color, pub active_in_range_bg: Color, pub link_bright: [(u8, u8, u8); 5], pub link_dim: [(u8, u8, u8); 5], } #[derive(Clone)] pub struct HeaderColors { pub tempo_bg: Color, pub tempo_fg: Color, pub bank_bg: Color, pub bank_fg: Color, pub pattern_bg: Color, pub pattern_fg: Color, pub stats_bg: Color, pub stats_fg: Color, } #[derive(Clone)] pub struct ModalColors { pub border: Color, pub border_accent: Color, pub border_warn: Color, pub border_dim: Color, pub confirm: Color, pub rename: Color, pub input: Color, pub editor: Color, pub preview: Color, } #[derive(Clone)] pub struct FlashColors { pub error_bg: Color, pub error_fg: Color, pub success_bg: Color, pub success_fg: Color, pub info_bg: Color, pub info_fg: Color, pub event_rgb: (u8, u8, u8), } #[derive(Clone)] pub struct ListColors { pub playing_bg: Color, pub playing_fg: Color, pub staged_play_bg: Color, pub staged_play_fg: Color, pub staged_stop_bg: Color, pub staged_stop_fg: Color, pub edit_bg: Color, pub edit_fg: Color, pub hover_bg: Color, pub hover_fg: Color, } #[derive(Clone)] pub struct LinkStatusColors { pub disabled: Color, pub connected: Color, pub listening: Color, } #[derive(Clone)] pub struct SyntaxColors { pub gap_bg: Color, pub executed_bg: Color, pub selected_bg: Color, pub emit: (Color, Color), pub number: (Color, Color), pub string: (Color, Color), pub comment: (Color, Color), pub keyword: (Color, Color), pub stack_op: (Color, Color), pub operator: (Color, Color), pub sound: (Color, Color), pub param: (Color, Color), pub context: (Color, Color), pub note: (Color, Color), pub interval: (Color, Color), pub variable: (Color, Color), pub vary: (Color, Color), pub generator: (Color, Color), pub default: (Color, Color), } #[derive(Clone)] pub struct TableColors { pub row_even: Color, pub row_odd: Color, } #[derive(Clone)] pub struct ValuesColors { pub tempo: Color, pub value: Color, } #[derive(Clone)] pub struct HintColors { pub key: Color, pub text: Color, } #[derive(Clone)] pub struct ViewBadgeColors { pub bg: Color, pub fg: Color, } #[derive(Clone)] pub struct NavColors { pub selected_bg: Color, pub selected_fg: Color, pub unselected_bg: Color, pub unselected_fg: Color, } #[derive(Clone)] pub struct EditorWidgetColors { pub cursor_bg: Color, pub cursor_fg: Color, pub selection_bg: Color, pub completion_bg: Color, pub completion_fg: Color, pub completion_selected: Color, pub completion_example: Color, } #[derive(Clone)] pub struct BrowserColors { pub directory: Color, pub project_file: Color, pub selected: Color, pub file: Color, pub focused_border: Color, pub unfocused_border: Color, pub root: Color, pub file_icon: Color, pub folder_icon: Color, pub empty_text: Color, } #[derive(Clone)] pub struct InputColors { pub text: Color, pub cursor: Color, pub hint: Color, } #[derive(Clone)] pub struct SearchColors { pub active: Color, pub inactive: Color, pub match_bg: Color, pub match_fg: Color, } #[derive(Clone)] pub struct MarkdownColors { pub h1: Color, pub h2: Color, pub h3: Color, pub code: Color, pub code_border: Color, pub link: Color, pub link_url: Color, pub quote: Color, pub text: Color, pub list: Color, } #[derive(Clone)] pub struct EngineColors { pub header: Color, pub header_focused: Color, pub divider: Color, pub scroll_indicator: Color, pub label: Color, pub label_focused: Color, pub label_dim: Color, pub value: Color, pub focused: Color, pub normal: Color, pub dim: Color, pub path: Color, pub border_magenta: Color, pub border_green: Color, pub border_cyan: Color, pub separator: Color, pub hint_active: Color, pub hint_inactive: Color, } #[derive(Clone)] pub struct DictColors { pub word_name: Color, pub word_bg: Color, pub alias: Color, pub stack_sig: Color, pub description: Color, pub example: Color, pub category_focused: Color, pub category_selected: Color, pub category_normal: Color, pub category_dimmed: Color, pub border_focused: Color, pub border_normal: Color, pub header_desc: Color, } #[derive(Clone)] pub struct TitleColors { pub big_title: Color, pub author: Color, pub link: Color, pub license: Color, pub prompt: Color, pub subtitle: Color, } #[derive(Clone)] pub struct MeterColors { pub low: Color, pub mid: Color, pub high: Color, pub low_rgb: (u8, u8, u8), pub mid_rgb: (u8, u8, u8), pub high_rgb: (u8, u8, u8), } #[derive(Clone)] pub struct SparkleColors { pub colors: [(u8, u8, u8); 5], } #[derive(Clone)] pub struct ConfirmColors { pub border: Color, pub button_selected_bg: Color, pub button_selected_fg: Color, }