carch-core 5.4.3

Core library for carch, providing script management and UI components.
Documentation
use ratatui::Frame;
use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect};
use ratatui::style::{Modifier, Style};
use ratatui::text::Text;
use ratatui::widgets::{Block, BorderType, Borders, Clear, Paragraph, Wrap};

use crate::ui::state::App;

pub fn render_termux_warning_popup(f: &mut Frame, app: &App, area: Rect) {
    f.render_widget(Clear, area);

    let popup_block = Block::default()
        .borders(Borders::ALL)
        .border_type(BorderType::Rounded)
        .title("Note")
        .border_style(Style::default().fg(app.theme.warning));

    let inner_area = popup_block.inner(area);

    let detail_text = "carch scripts are not compatible with Termux.\nOnly the Terminal/Termux script can be used.\n\nThe TUI is designed for larger screens and may not\nbe fully compatible with the Termux environment.";

    let visible_width = inner_area.width;
    let detail_line_count: u16 = Text::from(detail_text)
        .lines
        .iter()
        .map(|line| {
            let w = line.width() as u16;
            if w == 0 || visible_width == 0 { 1 } else { w.div_ceil(visible_width) }
        })
        .sum();

    let content_layout = Layout::default()
        .direction(Direction::Vertical)
        .constraints([
            Constraint::Length(2),
            Constraint::Length(detail_line_count),
            Constraint::Length(1),
            Constraint::Length(2),
        ])
        .split(inner_area);

    f.render_widget(popup_block, area);

    let warning_text = "Termux environment detected.";
    let warning_paragraph =
        Paragraph::new(ratatui::text::Line::from(vec![ratatui::text::Span::styled(
            warning_text,
            Style::default().fg(app.theme.warning).add_modifier(Modifier::BOLD),
        )]))
        .alignment(Alignment::Center)
        .wrap(Wrap { trim: true });

    f.render_widget(warning_paragraph, content_layout[0]);

    let detail_paragraph = Paragraph::new(Text::from(detail_text))
        .wrap(Wrap { trim: true })
        .alignment(Alignment::Center);

    f.render_widget(detail_paragraph, content_layout[1]);

    let options_text = Paragraph::new(ratatui::text::Line::from(vec![
        ratatui::text::Span::styled("(O)", Style::default().fg(app.theme.success)),
        ratatui::text::Span::styled("k", Style::default().fg(app.theme.foreground)),
    ]))
    .alignment(Alignment::Center)
    .wrap(Wrap { trim: true });

    f.render_widget(options_text, content_layout[3]);
}