Files
zesdex/crates/zesdex-backend/src/view/theme.rs
T

104 lines
5.7 KiB
Rust
Raw Normal View History

2026-07-14 12:18:13 +07:00
//! Central color theme for the TUI — Tokyo Night palette.
//!
//! Flow: defines a single `Theme` marker struct with associated `Color`
//! consts, consumed by every `view/*` render function so styling stays
//! consistent and changeable from one place.
//!
2026-07-14 12:18:13 +07:00
//! Design: muted blue-purple dark background with desaturated blue/cyan/
//! purple accents (not neon) — the popular Tokyo Night editor/terminal
//! theme. Chosen for a calmer "professional dev tool" read in place of
//! the previous neon-accented palette.
//!
//! Note: this module has zero runtime logic — it only holds compile-time
//! constant definitions, so there are no function bodies to instrument
//! with tracing calls.
use ratatui::style::Color;
/// Central palette of terminal colors used across all TUI render functions.
///
/// Every view module references colors as `Theme::NAME` instead of
/// hardcoding `ratatui::style::Color` values inline.
pub struct Theme;
impl Theme {
// ── Base surface colors ──────────────────────────────────────────────
/// Deep background — used for the main chat area and overlays.
2026-07-14 12:18:13 +07:00
pub const BG: Color = Color::Rgb(0x1a, 0x1b, 0x26);
/// Slightly lighter surface — for panels, cards, and input bars.
2026-07-14 12:18:13 +07:00
pub const SURFACE: Color = Color::Rgb(0x1f, 0x23, 0x35);
/// Elevated surface — for dropdowns, toasts, and floating elements.
2026-07-14 12:18:13 +07:00
pub const SURFACE_ELEVATED: Color = Color::Rgb(0x29, 0x2e, 0x42);
// ── Text colors ──────────────────────────────────────────────────────
2026-07-14 12:18:13 +07:00
/// Primary text color.
pub const TEXT: Color = Color::Rgb(0xc0, 0xca, 0xf5);
/// Secondary / muted text.
2026-07-14 12:18:13 +07:00
pub const TEXT_MUTED: Color = Color::Rgb(0xa9, 0xb1, 0xd6);
/// Dim / placeholder text.
2026-07-14 12:18:13 +07:00
pub const TEXT_DIM: Color = Color::Rgb(0x56, 0x5f, 0x89);
// ── Accent colors ────────────────────────────────────────────────────
2026-07-14 12:18:13 +07:00
/// Primary accent — blue for borders, titles, selections.
pub const PRIMARY: Color = Color::Rgb(0x7a, 0xa2, 0xf7);
/// Success / positive states — green.
2026-07-14 12:18:13 +07:00
pub const SUCCESS: Color = Color::Rgb(0x9e, 0xce, 0x6a);
/// Warning / in-progress states — yellow.
pub const WARNING: Color = Color::Rgb(0xe0, 0xaf, 0x68);
/// Error / failure states — red.
2026-07-14 12:18:13 +07:00
pub const ERROR: Color = Color::Rgb(0xf7, 0x76, 0x8e);
/// Informational / neutral — cyan.
pub const INFO: Color = Color::Rgb(0x7d, 0xcf, 0xff);
// ── Extended accent palette ──────────────────────────────────────────
/// Purple accent — used for special highlights.
2026-07-14 12:18:13 +07:00
pub const ACCENT_PURPLE: Color = Color::Rgb(0xbb, 0x9a, 0xf7);
/// Orange accent.
2026-07-14 12:18:13 +07:00
pub const ACCENT_ORANGE: Color = Color::Rgb(0xff, 0x9e, 0x64);
/// Teal accent.
2026-07-14 12:18:13 +07:00
pub const ACCENT_TEAL: Color = Color::Rgb(0x73, 0xda, 0xca);
// ── Border colors ────────────────────────────────────────────────────
/// Standard border color.
2026-07-14 12:18:13 +07:00
pub const BORDER: Color = Color::Rgb(0x3b, 0x42, 0x61);
// ── Role badge colors ────────────────────────────────────────────────
pub const ROLE_USER: Color = Color::Rgb(0x9e, 0xce, 0x6a); // green
2026-07-14 12:18:13 +07:00
pub const ROLE_ASSISTANT: Color = Color::Rgb(0x7a, 0xa2, 0xf7); // blue
pub const ROLE_SYSTEM: Color = Color::Rgb(0x7d, 0xcf, 0xff); // cyan
pub const ROLE_TOOL: Color = Color::Rgb(0xe0, 0xaf, 0x68); // yellow
// ── Status colors ────────────────────────────────────────────────────
2026-07-14 12:18:13 +07:00
pub const STATUS_BAR_BG: Color = Color::Rgb(0x16, 0x16, 0x1e);
pub const MODE_AUTO: Color = Color::Rgb(0x9e, 0xce, 0x6a);
pub const MODE_YOLO: Color = Color::Rgb(0xf7, 0x76, 0x8e);
// ── Code / markdown ──────────────────────────────────────────────────
2026-07-14 12:18:13 +07:00
pub const CODE_BG: Color = Color::Rgb(0x16, 0x16, 0x1e);
pub const CODE_BAR: Color = Color::Rgb(0x29, 0x2e, 0x42);
pub const BLOCKQUOTE_BAR: Color = Color::Rgb(0x7d, 0xcf, 0xff);
// ── Misc ─────────────────────────────────────────────────────────────
/// Highlight / selection background.
2026-07-14 12:18:13 +07:00
pub const HIGHLIGHT: Color = Color::Rgb(0x3d, 0x59, 0xa1);
/// Dim highlight (for non-selected items).
2026-07-14 12:18:13 +07:00
pub const HIGHLIGHT_DIM: Color = Color::Rgb(0x29, 0x2e, 0x42);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn palette_matches_tokyo_night_spec() {
assert_eq!(Theme::BG, Color::Rgb(0x1a, 0x1b, 0x26));
assert_eq!(Theme::SURFACE, Color::Rgb(0x1f, 0x23, 0x35));
assert_eq!(Theme::PRIMARY, Color::Rgb(0x7a, 0xa2, 0xf7));
assert_eq!(Theme::SUCCESS, Color::Rgb(0x9e, 0xce, 0x6a));
assert_eq!(Theme::WARNING, Color::Rgb(0xe0, 0xaf, 0x68));
assert_eq!(Theme::ERROR, Color::Rgb(0xf7, 0x76, 0x8e));
assert_eq!(Theme::INFO, Color::Rgb(0x7d, 0xcf, 0xff));
assert_eq!(Theme::ACCENT_PURPLE, Color::Rgb(0xbb, 0x9a, 0xf7));
assert_eq!(Theme::BORDER, Color::Rgb(0x3b, 0x42, 0x61));
}
}