//! Overlay: inline editor mode — shows the current input buffer with cursor //! position and save/dismiss key hints. //! //! Flow: reads `state.input.buffer` and `state.input.cursor` every frame to //! display a live preview of what the user is editing. use ratatui::style::{Modifier, Style}; use ratatui::text::{Line, Span}; use ratatui::widgets::{Block, Paragraph}; use ratatui::Frame; use crate::view::theme::Theme; use tracing; /// Render the Editor overlay — buffer preview with cursor position. pub fn render( frame: &mut Frame, area: ratatui::layout::Rect, block: Block<'static>, state: &crate::app::state::rest::AppStateRest, ) { tracing::debug!("overlay: Editor (buffer_len={}, cursor={})", state.input.buffer.len(), state.input.cursor); let block = block .title(Span::styled( " Editor ", Style::default() .fg(Theme::PRIMARY) .add_modifier(Modifier::BOLD), )) .border_style(Style::default().fg(Theme::PRIMARY)); let lines = vec![ Line::from(Span::styled( " Editor Mode — Ctrl+S save, Esc dismiss", Style::default() .fg(Theme::TEXT_MUTED) .add_modifier(Modifier::ITALIC), )), Line::from(Span::raw("")), Line::from(Span::styled( " Buffer:", Style::default().fg(Theme::TEXT_DIM), )), Line::from(Span::styled( format!(" {}", state.input.buffer), Style::default().fg(Theme::TEXT), )), Line::from(Span::raw("")), Line::from(Span::styled( format!( " Cursor: pos {} / {}", state.input.cursor, state.input.buffer.len() ), Style::default().fg(Theme::TEXT_DIM), )), ]; let paragraph = Paragraph::new(lines).block(block); frame.render_widget(paragraph, area); }