// src/components/handlers/intro.rs use ratatui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, style::Style, text::{Line, Span}, widgets::{Block, BorderType, Borders, Paragraph}, prelude::Margin, Frame, }; use crate::config::colors::themes::Theme; pub struct IntroState { pub selected_option: usize, } impl IntroState { pub fn new() -> Self { Self { selected_option: 0 } } pub fn render(&self, f: &mut Frame, area: Rect, theme: &Theme) { let block = Block::default() .borders(Borders::ALL) .border_type(BorderType::Rounded) .border_style(Style::default().fg(theme.accent)) .style(Style::default().bg(theme.bg)); let inner_area = block.inner(area); f.render_widget(block, area); // Center layout let chunks = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Percentage(35), Constraint::Length(5), Constraint::Percentage(35), ]) .split(inner_area); // Title let title = Line::from(vec![ Span::styled("multieko2", Style::default().fg(theme.highlight)), Span::styled(" v", Style::default().fg(theme.fg)), Span::styled(env!("CARGO_PKG_VERSION"), Style::default().fg(theme.secondary)), ]); let title_para = Paragraph::new(title) .alignment(Alignment::Center); f.render_widget(title_para, chunks[1]); // Buttons let button_area = Layout::default() .direction(Direction::Horizontal) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) .split(chunks[1].inner(Margin { horizontal: 1, vertical: 1 })); self.render_button( f, button_area[0], "Continue", self.selected_option == 0, theme, ); self.render_button( f, button_area[1], "Admin", self.selected_option == 1, theme, ); } fn render_button(&self, f: &mut Frame, area: Rect, text: &str, selected: bool, theme: &Theme) { let button_style = if selected { Style::default() .fg(theme.highlight) .bg(theme.bg) .add_modifier(ratatui::style::Modifier::BOLD) } else { Style::default().fg(theme.fg).bg(theme.bg) }; let button = Paragraph::new(text) .style(button_style) .alignment(Alignment::Center) .block( Block::default() .borders(Borders::ALL) .border_type(BorderType::Double) .border_style(if selected { Style::default().fg(theme.accent) } else { Style::default().fg(theme.border) }), ); f.render_widget(button, area); } pub fn next_option(&mut self) { self.selected_option = (self.selected_option + 1) % 2; } pub fn previous_option(&mut self) { self.selected_option = if self.selected_option == 0 { 1 } else { 0 }; } }