carch-core 5.4.1

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;

fn mode_info(app: &App) -> (&'static str, Color) {
    match app.mode {
        AppMode::Normal if app.multi_select.enabled => ("Multi-select", app.theme.accent),
        AppMode::Normal => ("Normal", app.theme.success),
        AppMode::Preview => ("Preview", app.theme.primary),
        AppMode::Search => ("Search", app.theme.warning),
        AppMode::Confirm => ("Confirm", app.theme.error),
        AppMode::Help => ("Help", app.theme.primary),
        AppMode::Description => ("Description", app.theme.primary),
        AppMode::RunScript => ("Running", app.theme.warning),
        AppMode::RootWarning => ("Root Warning", app.theme.error),
    }
}

pub fn render_status_bar(f: &mut Frame, app: &App, area: Rect) {
    let (mode_text, mode_color) = mode_info(app);

    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 mut spans = 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 {
        spans.push(Span::styled(
            selected_count,
            Style::default()
                .bg(app.theme.warning)
                .fg(app.theme.background)
                .add_modifier(Modifier::BOLD),
        ));
        spans.push(Span::raw(" "));
    }
    spans.extend([
        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 = Line::from(spans);
    let status_widget = Paragraph::new(status).style(Style::default().bg(Color::Reset));

    f.render_widget(status_widget, area);
}