eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
//! Conflicts popup rendering.

use crate::app::AppState;
use crate::ui::style::{self, Emphasis};
use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui::widgets::{Clear, List, ListItem};
use super::utils;

/// Render the conflicts popup (simple list view).
pub fn render(frame: &mut Frame, area: Rect, state: &AppState) {
    let conflicts: Vec<&crate::git::parsers::status::StatusEntry> = state
        .status_entries
        .iter()
        .filter(|e| e.conflict)
        .collect();
    let max_idx = conflicts.len().saturating_sub(1);
    let selected = state.conflicts_popup_selected.min(max_idx);

    let items: Vec<ListItem> = if conflicts.is_empty() {
        vec![ListItem::new("No conflicts found").style(style::text(&state.theme, Emphasis::Muted))]
    } else {
        conflicts
            .iter()
            .enumerate()
            .map(|(i, entry)| {
                let style_item = if i == selected {
                    style::selection(&state.theme)
                } else {
                    style::body_style(&state.theme)
                };
                ListItem::new(entry.path.clone()).style(style_item)
            })
            .collect()
    };

    let title = format!(
        "Conflicts [{} / {}] (Enter=jump, o=open, Esc=close)",
        selected.saturating_add(1),
        conflicts.len().max(1)
    );
    let popup = utils::center_rect(50, 40, area);
    frame.render_widget(Clear, popup);

    let list = List::new(items)
        .style(style::body_style(&state.theme))
        .block(style::pane_block(&state.theme, title, true));

    frame.render_widget(list, popup);
}