use ratatui::{ layout::{Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, text::{Line, Span}, widgets::{Block, Borders, Paragraph}, Frame, }; use crate::app::App; use super::{chat_list, messages, footer}; pub fn render(f: &mut Frame, app: &mut App) { let chunks = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Length(3), // Folders/tabs Constraint::Min(0), // Main content Constraint::Length(1), // Commands footer ]) .split(f.area()); render_folders(f, chunks[0], app); let main_chunks = Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Percentage(30), // Chat list Constraint::Percentage(70), // Messages area ]) .split(chunks[1]); chat_list::render(f, main_chunks[0], app); messages::render(f, main_chunks[1], app); footer::render(f, chunks[2], app); } fn render_folders(f: &mut Frame, area: Rect, app: &App) { let mut spans = vec![]; for (i, folder) in app.folders.iter().enumerate() { let style = if i == app.selected_folder { Style::default() .fg(Color::Cyan) .add_modifier(Modifier::BOLD) } else { Style::default().fg(Color::White) }; spans.push(Span::styled(format!(" {}:{} ", i + 1, folder), style)); if i < app.folders.len() - 1 { spans.push(Span::raw("│")); } } let folders_line = Line::from(spans); let folders_widget = Paragraph::new(folders_line).block( Block::default() .title(" TTUI ") .borders(Borders::ALL), ); f.render_widget(folders_widget, area); }