pub mod colors {
use ratatui::style::Color;
pub const CRAIL: Color = Color::Rgb(193, 95, 60);
pub const CLOUDY: Color = Color::Rgb(177, 173, 161);
pub const PAMPAS: Color = Color::Rgb(244, 243, 238);
pub const THINKING: Color = Color::DarkGray;
pub const TOOL_CALL: Color = Color::Yellow;
pub const TOOL_RESULT: Color = Color::Cyan;
pub const ASSISTANT: Color = CRAIL;
pub const USER: Color = Color::Cyan;
pub const SYSTEM: Color = CLOUDY;
}
pub mod symbols {
pub const TIER_HIGH: &str = "\u{25c6}";
pub const TIER_MID: &str = "\u{25c7}";
pub const TIER_LOW: &str = "\u{25cb}";
pub fn model_tier_indicator(model_name: &str) -> &'static str {
let name_lower = model_name.to_lowercase();
if name_lower.contains("opus") {
TIER_HIGH
} else if name_lower.contains("sonnet") {
TIER_MID
} else {
TIER_LOW
}
}
}
pub mod styles {
use super::colors;
use ratatui::style::{Modifier, Style};
pub fn assistant() -> Style {
Style::default().fg(colors::ASSISTANT)
}
pub fn thinking() -> Style {
Style::default()
.fg(colors::THINKING)
.add_modifier(Modifier::ITALIC)
}
pub fn tool_header() -> Style {
Style::default()
.fg(colors::TOOL_CALL)
.add_modifier(Modifier::BOLD)
}
pub fn tool_result() -> Style {
Style::default().fg(colors::TOOL_RESULT)
}
pub fn system() -> Style {
Style::default().fg(colors::SYSTEM)
}
pub fn user() -> Style {
Style::default()
.fg(colors::USER)
.add_modifier(Modifier::BOLD)
}
}
#[cfg(test)]
mod tests {
use super::*;
use ratatui::style::Modifier;
#[test]
fn test_model_tier_indicator_opus() {
assert_eq!(
symbols::model_tier_indicator("claude-opus-4"),
symbols::TIER_HIGH
);
assert_eq!(
symbols::model_tier_indicator("claude-opus-4-5"),
symbols::TIER_HIGH
);
assert_eq!(symbols::model_tier_indicator("OPUS"), symbols::TIER_HIGH);
}
#[test]
fn test_model_tier_indicator_sonnet() {
assert_eq!(
symbols::model_tier_indicator("claude-sonnet-3"),
symbols::TIER_MID
);
assert_eq!(
symbols::model_tier_indicator("claude-sonnet-4"),
symbols::TIER_MID
);
assert_eq!(symbols::model_tier_indicator("SONNET"), symbols::TIER_MID);
}
#[test]
fn test_model_tier_indicator_haiku_and_unknown() {
assert_eq!(
symbols::model_tier_indicator("claude-haiku-3"),
symbols::TIER_LOW
);
assert_eq!(symbols::model_tier_indicator("haiku"), symbols::TIER_LOW);
assert_eq!(
symbols::model_tier_indicator("unknown-model"),
symbols::TIER_LOW
);
assert_eq!(symbols::model_tier_indicator(""), symbols::TIER_LOW);
}
#[test]
fn test_styles_are_configured() {
let assistant_style = styles::assistant();
assert!(assistant_style.fg.is_some());
let thinking_style = styles::thinking();
assert!(thinking_style.fg.is_some());
assert!(thinking_style.add_modifier.contains(Modifier::ITALIC));
let tool_header_style = styles::tool_header();
assert!(tool_header_style.fg.is_some());
assert!(tool_header_style.add_modifier.contains(Modifier::BOLD));
let user_style = styles::user();
assert!(user_style.fg.is_some());
assert!(user_style.add_modifier.contains(Modifier::BOLD));
}
}