#![allow(dead_code)]
use ratatui::layout::{Alignment, Rect};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span, Text};
use ratatui::widgets::Paragraph;
use ratatui::Frame;
use super::super::theme::{self, Theme};
const LOGO_LINES: [&str; 5] = [
" ███████╗██████╗ ██████╗ ",
" ██╔════╝██╔══██╗██╔══██╗",
" ███████╗██║ ██║██║ ██║",
" ╚════██║██║ ██║██║ ██║",
" ███████║██████╔╝██████╔╝",
];
pub fn render(frame: &mut Frame, area: Rect, version: &str, model_line: &str, theme: &Theme) {
if area.height == 0 {
return;
}
let widget = if area.width >= 48 {
build_wide(version, model_line, theme)
} else {
build_compact(version, theme)
};
frame.render_widget(widget, area);
}
fn build_wide<'a>(version: &str, model_line: &str, theme: &Theme) -> Paragraph<'a> {
let n_logo_lines = LOGO_LINES.len();
let colors = theme::gradient(&[theme.primary, theme.section_header], n_logo_lines);
let mut lines: Vec<Line<'a>> = LOGO_LINES
.iter()
.enumerate()
.map(|(i, &texto)| {
let cor: Color = colors.get(i).copied().unwrap_or(theme.primary);
Line::from(Span::styled(
texto,
Style::default().fg(cor).add_modifier(Modifier::BOLD),
))
})
.collect();
lines.push(Line::from(""));
let mut meta = vec![Span::styled(
version.to_owned(),
Style::default().fg(theme.text_muted),
)];
if !model_line.is_empty() {
meta.push(Span::styled(" · ", Style::default().fg(theme.text_muted)));
meta.push(Span::styled(
model_line.to_owned(),
Style::default()
.fg(theme.text_strong)
.add_modifier(Modifier::BOLD),
));
}
lines.push(Line::from(meta));
Paragraph::new(Text::from(lines)).alignment(Alignment::Center)
}
fn build_compact<'a>(version: &str, theme: &Theme) -> Paragraph<'a> {
let line = Line::from(vec![
Span::styled(
" SDD",
Style::default()
.fg(theme.primary)
.add_modifier(Modifier::BOLD),
),
Span::styled(
format!(" · {version}"),
Style::default().fg(theme.text_muted),
),
]);
Paragraph::new(Text::from(vec![line]))
}
#[cfg(test)]
mod tests {
use super::*;
use ratatui::backend::TestBackend;
use ratatui::layout::Rect;
use ratatui::Terminal;
use crate::tui::theme::{self as ttheme, ColorDepth};
fn make_terminal(cols: u16, rows: u16) -> Terminal<TestBackend> {
Terminal::new(TestBackend::new(cols, rows)).unwrap()
}
#[test]
fn render_wide_sem_panic() {
let mut terminal = make_terminal(80, 20);
let theme = ttheme::theme(ColorDepth::TrueColor);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 80, 20);
render(f, area, "v0.4.3", "claude-sonnet-4-5", &theme);
})
.unwrap();
}
#[test]
fn render_compact_sem_panic() {
let mut terminal = make_terminal(40, 5);
let theme = ttheme::theme(ColorDepth::Ansi16);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 40, 5);
render(f, area, "v0.4.3", "claude-sonnet-4-5", &theme);
})
.unwrap();
}
#[test]
fn render_area_zero_sem_panic() {
let mut terminal = make_terminal(10, 1);
let theme = ttheme::theme(ColorDepth::Ansi256);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 10, 0);
render(f, area, "v0.0.0", "", &theme);
})
.unwrap();
}
#[test]
fn render_boundary_48_sem_panic() {
let mut terminal = make_terminal(48, 12);
let theme = ttheme::theme(ColorDepth::TrueColor);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 48, 12);
render(f, area, "v0.4.3", "gpt-4o", &theme);
})
.unwrap();
}
#[test]
fn render_boundary_47_sem_panic() {
let mut terminal = make_terminal(47, 3);
let theme = ttheme::theme(ColorDepth::TrueColor);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 47, 3);
render(f, area, "v0.4.3", "gpt-4o", &theme);
})
.unwrap();
}
#[test]
fn build_wide_tem_linhas_suficientes() {
let theme = ttheme::theme(ColorDepth::TrueColor);
let para = build_wide("v0.4.3", "modelo-x", &theme);
let _ = para;
}
#[test]
fn render_wide_ansi256_sem_panic() {
let mut terminal = make_terminal(80, 20);
let theme = ttheme::theme(ColorDepth::Ansi256);
terminal
.draw(|f| {
let area = Rect::new(0, 0, 80, 20);
render(f, area, "v0.4.3", "claude-sonnet-4-5", &theme);
})
.unwrap();
}
}