bbc_news_cli/
theme.rs

1use ratatui::style::Color;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
5#[serde(rename_all = "lowercase")]
6pub enum ThemeName {
7    Light,
8    Dark,
9}
10
11impl Default for ThemeName {
12    fn default() -> Self {
13        ThemeName::Light
14    }
15}
16
17#[derive(Debug, Clone)]
18pub struct Theme {
19    pub name: String,
20    pub bg_primary: Color,      // Main background
21    pub bg_secondary: Color,    // Alternate background (for list items)
22    pub bg_accent: Color,       // Header/footer background
23    pub fg_primary: Color,      // Main text
24    pub fg_secondary: Color,    // Secondary/muted text
25    pub accent: Color,          // BBC red / selection color
26    pub accent_fg: Color,       // Text color on accent background
27}
28
29impl Theme {
30    pub fn light() -> Self {
31        Self {
32            name: "Light".to_string(),
33            bg_primary: Color::Rgb(255, 254, 252),  // Off-white
34            bg_secondary: Color::Rgb(255, 254, 252), // Same as primary
35            bg_accent: Color::Rgb(230, 230, 227),    // Light gray for footer
36            fg_primary: Color::Rgb(0, 0, 0),         // Black text
37            fg_secondary: Color::Rgb(148, 148, 148), // Gray text
38            accent: Color::Rgb(234, 68, 57),         // BBC red
39            accent_fg: Color::Rgb(255, 255, 255),    // White on red
40        }
41    }
42
43    pub fn dark() -> Self {
44        Self {
45            name: "Dark".to_string(),
46            bg_primary: Color::Rgb(0, 0, 0),         // Pure black
47            bg_secondary: Color::Rgb(20, 20, 20),    // Slightly lighter black
48            bg_accent: Color::Rgb(40, 40, 40),       // Dark gray for footer
49            fg_primary: Color::Rgb(255, 255, 255),   // White text
50            fg_secondary: Color::Rgb(150, 150, 150), // Light gray text
51            accent: Color::Rgb(234, 68, 57),         // BBC red (same)
52            accent_fg: Color::Rgb(255, 255, 255),    // White on red (same)
53        }
54    }
55
56    pub fn from_name(name: &ThemeName) -> Self {
57        match name {
58            ThemeName::Light => Self::light(),
59            ThemeName::Dark => Self::dark(),
60        }
61    }
62}