diff --git a/poc-agent/src/tui.rs b/poc-agent/src/tui.rs index 5616c26..13861a5 100644 --- a/poc-agent/src/tui.rs +++ b/poc-agent/src/tui.rs @@ -249,8 +249,9 @@ fn wrapped_height(line: &str, width: usize) -> usize { if width == 0 || line.is_empty() { return 1; } - let chars = line.chars().count(); - ((chars + width - 1) / width).max(1) + // Use unicode display width to match ratatui's Wrap behavior + let w = ratatui::text::Line::raw(line).width(); + ((w + width - 1) / width).max(1) } /// How many visual lines a ratatui Line occupies at a given width. @@ -824,9 +825,10 @@ impl App { for line in &cursor_lines[..n - 1] { visual_row += wrapped_height(line, w) as u16; } - let last_chars = cursor_lines[n - 1].chars().count(); - let col = if w > 0 { last_chars % w } else { last_chars }; - visual_row += if w > 0 { (last_chars / w) as u16 } else { 0 }; + // Use unicode display width to match ratatui's wrapping + let last_width = ratatui::text::Line::raw(cursor_lines[n - 1]).width(); + let col = if w > 0 { last_width % w } else { last_width }; + visual_row += if w > 0 { (last_width / w) as u16 } else { 0 }; let cursor_x = col as u16 + input_area.x; let cursor_y = visual_row + input_area.y; if cursor_y < input_area.y + input_area.height {