Upgrade Ratatui to 0.30.2 (#35959)

## What changed

- Upgrade `ratatui`, `ratatui-macros`, `crossterm`, and `ansi-to-tui`, and adapt the TUI to their updated rendering, backend, color-conversion, and cell APIs.
- Use Ratatui's cell-width and continuation-cell metadata when mapping OSC 8 hyperlinks so links remain aligned across wrapped wide glyphs and halfwidth characters with dakuten.
- Preserve explicit hyperlinks in the sign-in success screen and empty MCP state without embedding escape sequences in the text passed to Ratatui.

## Testing

- Add regression coverage for hyperlink placement across wide glyphs and halfwidth dakuten, hyperlink preservation in onboarding and MCP output, and display-width handling.

GitOrigin-RevId: 8460873e5a266923acd0417bc46264845eab0134
This commit is contained in:
Charlie Marsh authored and copyberry committed 2026-07-29 13:53:15 +00:00
1 parent e1895710ad
commit 00cb5c465b
43 files changed
+1097 -303

No files matched your search

@@ -54,7 +54,6 @@ use ratatui::style::Stylize;
use ratatui::text::Line;
use ratatui::text::Span;
use ratatui::widgets::Paragraph;
use ratatui::widgets::WidgetRef;
use ratatui::widgets::Wrap;
use unicode_width::UnicodeWidthStr;
@@ -309,7 +308,7 @@ impl Renderable for DelayedLoadingHeader {
lines.push(Line::from(note.as_str().dim()));
}
Paragraph::new(lines).render_ref(area, buf);
Paragraph::new(lines).render(area, buf);
}
fn desired_height(&self, _width: u16) -> u16 {
@@ -281,7 +281,6 @@ async fn unified_exec_begin_restores_working_status_snapshot() {
let height = chat.desired_height(width);
let mut terminal = ratatui::Terminal::new(ratatui::backend::TestBackend::new(width, height))
.expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, width, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("draw chatwidget");
@@ -1220,7 +1219,6 @@ async fn approval_modal_exec_without_reason_snapshot() -> anyhow::Result<()> {
let height = chat.desired_height(width);
let mut terminal =
ratatui::Terminal::new(VT100Backend::new(width, height)).expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, width, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("draw approval modal (no reason)");
@@ -1265,7 +1263,6 @@ async fn approval_modal_exec_multiline_prefix_hides_execpolicy_option_snapshot()
let height = chat.desired_height(width);
let mut terminal =
ratatui::Terminal::new(VT100Backend::new(width, height)).expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, width, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("draw approval modal (multiline prefix)");
@@ -1309,7 +1306,6 @@ async fn approval_modal_patch_snapshot() -> anyhow::Result<()> {
let height = chat.desired_height(/*width*/ 80);
let mut terminal =
ratatui::Terminal::new(VT100Backend::new(/*width*/ 80, height)).expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, 80, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("draw patch approval modal");
@@ -635,7 +635,6 @@ async fn approvals_popup_shows_disabled_presets() {
let height = chat.desired_height(width);
let mut terminal =
ratatui::Terminal::new(VT100Backend::new(width, height)).expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, width, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("render approvals popup");
@@ -2542,7 +2542,6 @@ async fn status_widget_and_approval_modal_snapshot() {
let height = chat.desired_height(width);
let mut terminal = ratatui::Terminal::new(ratatui::backend::TestBackend::new(width, height))
.expect("create terminal");
terminal.set_viewport_area(Rect::new(0, 0, width, height));
terminal
.draw(|f| chat.render(f.area(), f.buffer_mut()))
.expect("draw status + approval modal");
@@ -3941,7 +3940,6 @@ async fn reasoning_delta_restores_recreated_status_indicator_header() {
let height = chat.desired_height(width);
let mut terminal = ratatui::Terminal::new(ratatui::backend::TestBackend::new(width, height))
.expect("create terminal");
terminal.set_viewport_area(Rect::new(/*x*/ 0, /*y*/ 0, width, height));
terminal
.draw(|frame| chat.render(frame.area(), frame.buffer_mut()))
.expect("draw restored reasoning status");
@@ -5,7 +5,6 @@
use ratatui::style::Color;
use ratatui::style::Style;
use ratatui::style::Stylize;
use super::TokenActivityView;
use crate::color::blend;