aura-gui 0.2.2

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Sistema de diseño semántico: las vistas piden tokens, no colores sueltos.
//!
//! Los pares de tokens (`Surface`/`Text`, `Accent`/`AccentText`) están
//! elegidos con contraste suficiente, así cualquier vista armada solo con
//! tokens se ve armónica sin que la IA tenga que elegir colores.

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,
    /// Estado de git: archivo nuevo, modificado, borrado o en conflicto.
    Created,
    Modified,
    Deleted,
    Conflict,
    Hover,
    Active,
    Selection,
}

/// Un color puede ser literal o un token que se resuelve con el tema vigente.
#[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)
    }
}

/// Colores de resaltado de sintaxis (uno por clase de captura).
#[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,
    /// Paleta ANSI de 16 colores para la terminal integrada.
    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()
    }
}