use crate::{
ButtonAppearance, ButtonCatalog, ButtonClass, Component, Container, CornerRadii, Palette,
Spacing, Status, Typography,
};
use embedded_graphics::{mono_font::MonoFont, pixelcolor::PixelColor};
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Theme<'a, C: PixelColor> {
pub background: Container<C>,
pub primary: Container<C>,
pub secondary: Container<C>,
pub button: Component<C>,
pub accent: Component<C>,
pub destructive: Component<C>,
pub success: Component<C>,
pub warning: Component<C>,
pub text_button: Component<C>,
pub icon_button: Component<C>,
pub palette: Palette<C>,
pub spacing: Spacing,
pub corner_radii: CornerRadii,
pub typography: Typography<'a>,
pub is_dark: bool,
pub is_high_contrast: bool,
}
impl<'a, C: PixelColor> Theme<'a, C> {
#[must_use]
pub fn default_font(&self) -> &'a MonoFont<'a> {
self.typography.body
}
#[must_use]
fn component_for(&self, class: ButtonClass) -> &Component<C> {
match class {
ButtonClass::Standard => &self.button,
ButtonClass::Suggested => &self.accent,
ButtonClass::Destructive => &self.destructive,
ButtonClass::Success => &self.success,
ButtonClass::Warning => &self.warning,
ButtonClass::Text => &self.text_button,
ButtonClass::Icon => &self.icon_button,
}
}
}
impl<'a, C: PixelColor> ButtonCatalog<C> for Theme<'a, C> {
fn button(&self, class: ButtonClass, status: Status) -> ButtonAppearance<C> {
let comp = self.component_for(class);
let bg = match status {
Status::Active => comp.base,
Status::Focused => comp.base,
Status::Pressed => comp.pressed,
Status::Disabled => comp.disabled,
};
let (background, border) = match class {
ButtonClass::Text | ButtonClass::Icon => (None, None),
_ => {
let border = if status == Status::Focused {
self.accent.base
} else {
comp.border
};
(Some(bg), Some(border))
}
};
ButtonAppearance {
background,
border,
text: comp.on_base,
}
}
}
pub mod catppuccin_frappe;
pub mod catppuccin_latte;
pub mod catppuccin_macchiato;
pub mod catppuccin_mocha;
pub mod custom;
pub mod dark;
pub mod dracula;
pub mod dracula_at_night;
pub mod ferra;
pub mod kanagawa_dragon;
pub mod kanagawa_lotus;
pub mod kanagawa_wave;
pub mod light;
pub mod moonfly;
pub mod nightfly;
pub mod nord;
pub mod oxocarbon;
pub mod tokyo_night;
pub mod tokyo_night_light;
pub mod tokyo_night_storm;