carch-core 5.4.3

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

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

pub fn render_description_popup(f: &mut Frame, app: &mut App, area: Rect) {
    let Some(description) = app.description.content.as_deref() else {
        return;
    };

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

    f.render_widget(Clear, area);
    f.render_widget(popup_block, area);

    let chunks = Layout::default()
        .direction(Direction::Vertical)
        .margin(1)
        .constraints([Constraint::Min(1)])
        .split(area);

    let text = Text::from(description);
    let paragraph =
        Paragraph::new(text).wrap(Wrap { trim: true }).scroll((app.description.scroll, 0));

    let visible_width = chunks[0].width;
    let visible_height = chunks[0].height;
    let text_for_width = Text::from(description);
    let total_lines = text_for_width
        .lines
        .iter()
        .map(|line| {
            let width = line.width() as u16;
            if width == 0 || visible_width == 0 { 1 } else { width.div_ceil(visible_width) }
        })
        .sum::<u16>();
    app.description.max_scroll = total_lines.saturating_sub(visible_height);

    f.render_widget(paragraph, chunks[0]);
}