use crate::core::Rgba;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Token {
Canvas,
Surface,
ElevatedSurface,
Border,
BorderSubtle,
BorderFocused,
Text,
TextMuted,
Accent,
AccentHover,
AccentText,
Danger,
DangerHover,
DangerText,
Warning,
Success,
Created,
Modified,
Deleted,
Conflict,
Hover,
Active,
Selection,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ColorSpec {
Literal(Rgba),
Token(Token),
}
impl From<Rgba> for ColorSpec {
fn from(color: Rgba) -> Self {
ColorSpec::Literal(color)
}
}
impl From<Token> for ColorSpec {
fn from(token: Token) -> Self {
ColorSpec::Token(token)
}
}
#[derive(Clone, Debug)]
pub struct SyntaxTheme {
pub keyword: Rgba,
pub function: Rgba,
pub type_name: Rgba,
pub string: Rgba,
pub comment: Rgba,
pub constant: Rgba,
pub attribute: Rgba,
pub operator: Rgba,
pub property: Rgba,
pub tag: Rgba,
pub title: Rgba,
pub link: Rgba,
}
#[derive(Clone, Debug)]
pub struct Theme {
pub name: String,
pub is_dark: bool,
pub canvas: Rgba,
pub surface: Rgba,
pub elevated_surface: Rgba,
pub border: Rgba,
pub border_subtle: Rgba,
pub border_focused: Rgba,
pub text: Rgba,
pub text_muted: Rgba,
pub accent: Rgba,
pub accent_hover: Rgba,
pub accent_text: Rgba,
pub danger: Rgba,
pub danger_hover: Rgba,
pub danger_text: Rgba,
pub warning: Rgba,
pub success: Rgba,
pub created: Rgba,
pub modified: Rgba,
pub deleted: Rgba,
pub conflict: Rgba,
pub hover: Rgba,
pub active: Rgba,
pub selection: Rgba,
pub shadow: Rgba,
pub syntax: SyntaxTheme,
pub ansi: [Rgba; 16],
}
impl Theme {
pub fn dark() -> Self {
crate::view::themes::aura_dark()
}
pub fn light() -> Self {
crate::view::themes::aura_light()
}
pub fn color(&self, token: Token) -> Rgba {
match token {
Token::Canvas => self.canvas,
Token::Surface => self.surface,
Token::ElevatedSurface => self.elevated_surface,
Token::Border => self.border,
Token::BorderSubtle => self.border_subtle,
Token::BorderFocused => self.border_focused,
Token::Text => self.text,
Token::TextMuted => self.text_muted,
Token::Accent => self.accent,
Token::AccentHover => self.accent_hover,
Token::AccentText => self.accent_text,
Token::Danger => self.danger,
Token::DangerHover => self.danger_hover,
Token::DangerText => self.danger_text,
Token::Warning => self.warning,
Token::Success => self.success,
Token::Created => self.created,
Token::Modified => self.modified,
Token::Deleted => self.deleted,
Token::Conflict => self.conflict,
Token::Hover => self.hover,
Token::Active => self.active,
Token::Selection => self.selection,
}
}
pub fn resolve(&self, spec: ColorSpec) -> Rgba {
match spec {
ColorSpec::Literal(color) => color,
ColorSpec::Token(token) => self.color(token),
}
}
}
impl Default for Theme {
fn default() -> Self {
Self::dark()
}
}