carch-core 5.3.3

Core library for carch, providing script management and UI components.
Documentation
use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;

use crate::ui::state::{App, AppMode};
use crate::version;

pub fn render_status_bar(f: &mut Frame, app: &App, area: Rect) {
    let mode_text = match app.mode {
        AppMode::Normal => {
            if app.multi_select.enabled {
                "Multi-select"
            } else {
                "Normal"
            }
        }
        AppMode::Preview => "Preview",
        AppMode::Search => "Search",
        AppMode::Confirm => "Confirm",
        AppMode::Help => "Help",
        AppMode::Description => "Description",
        AppMode::RunScript => "Running",
        AppMode::RootWarning => "Root Warning",
    };

    let mode_color = match app.mode {
        AppMode::Normal => {
            if app.multi_select.enabled {
                app.theme.accent
            } else {
                app.theme.success
            }
        }
        AppMode::Preview => app.theme.primary,
        AppMode::Search => app.theme.warning,
        AppMode::Confirm => app.theme.error,
        AppMode::Help => app.theme.primary,
        AppMode::Description => app.theme.primary,
        AppMode::RunScript => app.theme.warning,
        AppMode::RootWarning => app.theme.error,
    };

    let selected_count = if app.multi_select.enabled {
        format!(" {} selected ", app.multi_select.scripts.len())
    } else {
        String::new()
    };

    let has_selected = !selected_count.is_empty();
    let version = version::get_current_version();

    let status = Line::from(vec![
        Span::styled(
            format!(" Mode: {mode_text} "),
            Style::default().bg(mode_color).fg(app.theme.background).add_modifier(Modifier::BOLD),
        ),
        Span::raw(" "),
        if has_selected {
            Span::styled(
                selected_count,
                Style::default()
                    .bg(app.theme.warning)
                    .fg(app.theme.background)
                    .add_modifier(Modifier::BOLD),
            )
        } else {
            Span::raw("")
        },
        if has_selected { Span::raw(" ") } else { Span::raw("") },
        Span::styled(
            format!(" Theme: {} ", app.theme.name),
            Style::default().bg(app.theme.secondary).fg(app.theme.background),
        ),
        Span::raw(" "),
        Span::styled(
            " ?: Help | q: Quit | h/l: Switch panels",
            Style::default().bg(app.theme.accent).fg(app.theme.background),
        ),
        Span::raw(" "),
        Span::styled(
            format!(" {version} "),
            Style::default()
                .bg(app.theme.primary)
                .fg(app.theme.background)
                .add_modifier(Modifier::BOLD),
        ),
    ]);

    let status_widget = Paragraph::new(status).style(Style::default().bg(Color::Reset));

    f.render_widget(status_widget, area);
}