379 lines
8.9 KiB
Rust
379 lines
8.9 KiB
Rust
//! 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<ThemeColors> = 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,
|
|
}
|
|
|