stynx-code-tui 3.6.2

Terminal user interface with ratatui for interactive sessions
Documentation
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::{Modifier, Style},
    text::{Line, Span},
    widgets::{Block, Borders, List, ListItem, Widget},
};

use crate::theme;

pub struct AutocompleteDropdown<'a> {
    pub options: &'a [String],
    pub selected: usize,
}

impl<'a> AutocompleteDropdown<'a> {
    pub fn new(options: &'a [String], selected: usize) -> Self {
        Self { options, selected }
    }
}

impl<'a> Widget for AutocompleteDropdown<'a> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let items: Vec<ListItem<'_>> = self.options.iter().enumerate().map(|(i, opt)| {
            let style = if i == self.selected {
                Style::default().fg(theme::BASE()).bg(theme::PINE()).add_modifier(Modifier::BOLD)
            } else {
                Style::default().fg(theme::TEXT())
            };
            ListItem::new(Line::from(Span::styled(opt.as_str(), style)))
        }).collect();

        let block = Block::default()
            .borders(Borders::ALL)
            .border_style(Style::default().fg(theme::OVERLAY()))
            .style(Style::default().bg(theme::SURFACE()));

        List::new(items).block(block).render(area, buf);
    }
}