use ratatui::style::{Color as RatColor, Modifier, Style};
use crate::theme::{Color, Palette};
pub fn to_ratatui(color: Color) -> RatColor {
match color {
Color::Default => RatColor::Reset,
Color::Rgb(red, green, blue) => RatColor::Rgb(red, green, blue),
}
}
pub fn fg(color: Color) -> Style {
Style::default().fg(to_ratatui(color))
}
pub fn bg(color: Color) -> Style {
Style::default().bg(to_ratatui(color))
}
pub fn base(foreground: Color, background: Color) -> Style {
Style::default()
.fg(to_ratatui(foreground))
.bg(to_ratatui(background))
}
pub fn dim() -> Style {
Style::default().add_modifier(Modifier::DIM)
}
pub fn primary(palette: &Palette) -> Style {
fg(palette.foreground)
}
pub fn secondary(palette: &Palette) -> Style {
fg(palette.foreground_dim)
}
pub fn muted(palette: &Palette) -> Style {
fg(palette.foreground_muted)
}
pub fn title(palette: &Palette) -> Style {
fg(palette.foreground).add_modifier(Modifier::BOLD)
}
pub fn accent(palette: &Palette) -> Style {
fg(palette.accent)
}
pub fn accent_dim(palette: &Palette) -> Style {
fg(palette.accent_dim)
}
pub fn accent_vivid(palette: &Palette) -> Style {
fg(palette.accent_vivid)
}
pub fn key(palette: &Palette) -> Style {
fg(palette.accent).add_modifier(Modifier::BOLD)
}
pub fn selected(palette: &Palette) -> Style {
bg(palette.selection)
}
pub fn cursor(palette: &Palette) -> Style {
bg(palette.cursor)
}
pub fn border(palette: &Palette) -> Style {
fg(palette.border)
}
pub fn border_focus(palette: &Palette) -> Style {
fg(palette.border_focus)
}
pub fn disabled(palette: &Palette) -> Style {
fg(palette.foreground_dim)
}
pub fn success(palette: &Palette) -> Style {
fg(palette.success)
}
pub fn warning(palette: &Palette) -> Style {
fg(palette.warning)
}
pub fn error(palette: &Palette) -> Style {
fg(palette.error)
}
pub fn info(palette: &Palette) -> Style {
fg(palette.info)
}
pub fn darken(color: RatColor, factor: f32) -> RatColor {
let scale = |channel: u8| (f32::from(channel) * factor).round() as u8;
match color {
RatColor::Rgb(red, green, blue) => {
RatColor::Rgb(scale(red), scale(green), scale(blue))
}
other => other,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn darken_scales_rgb_channels() {
assert_eq!(
darken(RatColor::Rgb(100, 200, 50), 0.5),
RatColor::Rgb(50, 100, 25),
);
}
#[test]
fn darken_leaves_non_rgb_unchanged() {
assert_eq!(darken(RatColor::Reset, 0.5), RatColor::Reset);
assert_eq!(darken(RatColor::Red, 0.5), RatColor::Red);
}
}