use crate::color::Brightness;
use peniko::Color;
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct StatusColors {
pub success: Color,
pub on_success: Color,
pub success_container: Color,
pub on_success_container: Color,
pub warning: Color,
pub on_warning: Color,
pub warning_container: Color,
pub on_warning_container: Color,
pub info: Color,
pub on_info: Color,
pub info_container: Color,
pub on_info_container: Color,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct StatusPalette {
pub light: StatusColors,
pub dark: StatusColors,
}
impl StatusPalette {
pub fn colors(&self, brightness: Brightness) -> &StatusColors {
match brightness {
Brightness::Light => &self.light,
Brightness::Dark => &self.dark,
}
}
pub const fn neutral() -> Self {
Self {
light: StatusColors {
success: Color::from_rgb8(0x2E, 0x7D, 0x32),
on_success: Color::from_rgb8(0xFF, 0xFF, 0xFF),
success_container: Color::from_rgb8(0xC8, 0xE6, 0xC9),
on_success_container: Color::from_rgb8(0x1B, 0x5E, 0x20),
warning: Color::from_rgb8(0x8A, 0x53, 0x00),
on_warning: Color::from_rgb8(0xFF, 0xFF, 0xFF),
warning_container: Color::from_rgb8(0xFF, 0xDD, 0xB0),
on_warning_container: Color::from_rgb8(0x2B, 0x17, 0x00),
info: Color::from_rgb8(0x00, 0x61, 0xA4),
on_info: Color::from_rgb8(0xFF, 0xFF, 0xFF),
info_container: Color::from_rgb8(0xD1, 0xE4, 0xFF),
on_info_container: Color::from_rgb8(0x00, 0x1D, 0x36),
},
dark: StatusColors {
success: Color::from_rgb8(0xA6, 0xF1, 0xA1),
on_success: Color::from_rgb8(0x00, 0x39, 0x0F),
success_container: Color::from_rgb8(0x20, 0x57, 0x23),
on_success_container: Color::from_rgb8(0xC8, 0xE6, 0xC9),
warning: Color::from_rgb8(0xFF, 0xC4, 0x6B),
on_warning: Color::from_rgb8(0x45, 0x2B, 0x00),
warning_container: Color::from_rgb8(0x6F, 0x49, 0x00),
on_warning_container: Color::from_rgb8(0xFF, 0xDD, 0xB0),
info: Color::from_rgb8(0x9F, 0xCA, 0xFF),
on_info: Color::from_rgb8(0x00, 0x32, 0x50),
info_container: Color::from_rgb8(0x00, 0x4A, 0x76),
on_info_container: Color::from_rgb8(0xD1, 0xE4, 0xFF),
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn neutral_colors_selects_by_brightness() {
let palette = StatusPalette::neutral();
assert_eq!(palette.colors(Brightness::Light), &palette.light);
assert_eq!(palette.colors(Brightness::Dark), &palette.dark);
}
#[test]
fn neutral_light_and_dark_are_distinct() {
let palette = StatusPalette::neutral();
assert_ne!(palette.light.success, palette.dark.success);
assert_ne!(palette.light.warning, palette.dark.warning);
assert_ne!(palette.light.info, palette.dark.info);
}
#[test]
fn neutral_spot_check() {
let palette = StatusPalette::neutral();
assert_eq!(palette.light.success, Color::from_rgb8(0x2E, 0x7D, 0x32));
assert_eq!(palette.light.on_success, Color::from_rgb8(0xFF, 0xFF, 0xFF));
assert_eq!(palette.dark.warning, Color::from_rgb8(0xFF, 0xC4, 0x6B));
assert_eq!(palette.dark.info, Color::from_rgb8(0x9F, 0xCA, 0xFF));
}
#[test]
fn neutral_is_const_constructible() {
const PALETTE: StatusPalette = StatusPalette::neutral();
assert_eq!(PALETTE.light.success, Color::from_rgb8(0x2E, 0x7D, 0x32));
}
}