zest-theme 0.1.1

Theme types for zest, following libcosmic's grouped Container/Component/Palette structure.
Documentation
//! Tokyo Night Light — folke/tokyonight.nvim 'day' variant (verified against day extras).
//!
//! Light theme: bg #e1e2e7 with dark-blue fg #3760bf. Accents use the
//! contrast-adjusted 'day' palette (blue #2e7de9, green #587539,
//! red #f52a65, yellow #8c6c3e). Hover/pressed are hand-derived by
//! darkening ~10% so they read against the light background.

use crate::{Component, Container, CornerRadii, Palette, Spacing, Theme};
use embedded_graphics::{mono_font::MonoFont, pixelcolor::Rgb888};

const BG: Rgb888 = Rgb888::new(0xe1, 0xe2, 0xe7);
const SURFACE: Rgb888 = Rgb888::new(0xd0, 0xd5, 0xe3);
const ELEVATED: Rgb888 = Rgb888::new(0xc4, 0xc8, 0xda);
const TEXT: Rgb888 = Rgb888::new(0x37, 0x60, 0xbf);
const TEXT_MUTED: Rgb888 = Rgb888::new(0x61, 0x72, 0xb0);
const TEXT_FAINT: Rgb888 = Rgb888::new(0x84, 0x8c, 0xb5);
const BORDER: Rgb888 = Rgb888::new(0xb4, 0xb5, 0xb9);
const BORDER_LIGHT: Rgb888 = Rgb888::new(0xd0, 0xd5, 0xe3);
const ACCENT: Rgb888 = Rgb888::new(0x2e, 0x7d, 0xe9);
const ACCENT_PRESSED: Rgb888 = Rgb888::new(0x24, 0x62, 0xb6);
const SUCCESS: Rgb888 = Rgb888::new(0x58, 0x75, 0x39);
const SUCCESS_HOVER: Rgb888 = Rgb888::new(0x47, 0x5f, 0x2e);
const DESTRUCTIVE: Rgb888 = Rgb888::new(0xf5, 0x2a, 0x65);
const DESTRUCTIVE_HOVER: Rgb888 = Rgb888::new(0xd2, 0x22, 0x55);
const WARNING: Rgb888 = Rgb888::new(0x8c, 0x6c, 0x3e);
const WARNING_HOVER: Rgb888 = Rgb888::new(0x73, 0x59, 0x33);
const BLUE: Rgb888 = Rgb888::new(0x2e, 0x7d, 0xe9);
const GREEN: Rgb888 = Rgb888::new(0x58, 0x75, 0x39);
const RED: Rgb888 = Rgb888::new(0xf5, 0x2a, 0x65);
const YELLOW: Rgb888 = Rgb888::new(0x8c, 0x6c, 0x3e);

const DEFAULT_FONT: &MonoFont<'static> = &crate::font::FONT_ZEST_MONO;

/// Tokyo Night Light theme.
pub const THEME: Theme<'static, Rgb888> = Theme {
    background: Container {
        base: BG,
        on_base: TEXT,
        divider: BORDER_LIGHT,
    },
    primary: Container {
        base: SURFACE,
        on_base: TEXT,
        divider: BORDER,
    },
    secondary: Container {
        base: ELEVATED,
        on_base: TEXT,
        divider: BORDER,
    },
    accent: Component {
        base: ACCENT,
        pressed: ACCENT_PRESSED,
        disabled: TEXT_FAINT,
        on_base: BG,
        border: ACCENT,
    },
    button: Component {
        base: ELEVATED,
        pressed: SURFACE,
        disabled: SURFACE,
        on_base: TEXT,
        border: BORDER,
    },
    destructive: Component {
        base: DESTRUCTIVE,
        pressed: DESTRUCTIVE_HOVER,
        disabled: TEXT_FAINT,
        on_base: BG,
        border: DESTRUCTIVE,
    },
    success: Component {
        base: SUCCESS,
        pressed: SUCCESS_HOVER,
        disabled: TEXT_FAINT,
        on_base: BG,
        border: SUCCESS,
    },
    warning: Component {
        base: WARNING,
        pressed: WARNING_HOVER,
        disabled: TEXT_FAINT,
        on_base: BG,
        border: WARNING,
    },
    text_button: Component {
        base: BG,
        pressed: ELEVATED,
        disabled: BG,
        on_base: ACCENT,
        border: BG,
    },
    icon_button: Component {
        base: BG,
        pressed: ELEVATED,
        disabled: BG,
        on_base: TEXT_MUTED,
        border: BG,
    },
    palette: Palette {
        neutral_0: TEXT,
        neutral_2: TEXT_MUTED,
        neutral_4: TEXT_MUTED,
        neutral_5: TEXT_FAINT,
        neutral_6: TEXT_FAINT,
        neutral_8: BORDER,
        neutral_10: BG,
        accent_blue: BLUE,
        accent_green: GREEN,
        accent_red: RED,
        accent_yellow: YELLOW,
        black: Rgb888::new(0x00, 0x00, 0x00),
        white: Rgb888::new(0xff, 0xff, 0xff),
    },
    spacing: Spacing::default_small(),
    corner_radii: CornerRadii::default_small(),
    typography: crate::Typography::new(
        &crate::font::FONT_ZEST_MONO_DISPLAY,
        &crate::font::FONT_ZEST_MONO_HEADING,
        DEFAULT_FONT,
        &crate::font::FONT_ZEST_MONO_CAPTION,
    ),
    is_dark: false,
    is_high_contrast: false,
};