feat: skip animations on small terminals (#3647)

Changes:
- skip the welcome animation when the terminal area is below 60x21
- skip the model upgrade animation when the terminal area is below 60x24
to avoid clipping

---------

Co-authored-by: Michael Bolin <mbolin@openai.com>
This commit is contained in:
Thibault Sottiaux
2025-09-15 08:30:32 -07:00
committed by GitHub
parent f037b2fd56
commit 934d728946
2 changed files with 24 additions and 10 deletions

View File

@@ -22,6 +22,8 @@ use std::time::Duration;
use tokio_stream::StreamExt;
const FRAME_TICK: Duration = FRAME_TICK_DEFAULT;
const MIN_ANIMATION_HEIGHT: u16 = 24;
const MIN_ANIMATION_WIDTH: u16 = 60;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum ModelUpgradeDecision {
@@ -121,13 +123,17 @@ impl WidgetRef for &ModelUpgradePopup {
fn render_ref(&self, area: Rect, buf: &mut Buffer) {
Clear.render(area, buf);
let mut lines: Vec<Line> = self.frames()[self.frame_idx]
.lines()
.map(|l| l.to_string().into())
.collect();
// Skip the animation entirely when the viewport is too small so we don't clip frames.
let show_animation =
area.height >= MIN_ANIMATION_HEIGHT && area.width >= MIN_ANIMATION_WIDTH;
// Spacer between animation and text content.
lines.push("".into());
let mut lines: Vec<Line> = Vec::new();
if show_animation {
let frame = self.frames()[self.frame_idx];
lines.extend(frame.lines().map(|l| l.into()));
// Spacer between animation and text content.
lines.push("".into());
}
lines.push(
format!(" Codex is now powered by {GPT_5_CODEX_DISPLAY_NAME}, a new model that is")

View File

@@ -17,6 +17,8 @@ use std::time::Duration;
use std::time::Instant;
const FRAME_TICK: Duration = FRAME_TICK_DEFAULT;
const MIN_ANIMATION_HEIGHT: u16 = 21;
const MIN_ANIMATION_WIDTH: u16 = 60;
pub(crate) struct WelcomeWidget {
pub is_logged_in: bool,
@@ -44,11 +46,17 @@ impl WidgetRef for &WelcomeWidget {
let frames = &FRAMES_DEFAULT;
let idx = ((elapsed_ms / FRAME_TICK.as_millis()) % frames.len() as u128) as usize;
// Skip the animation entirely when the viewport is too small so we don't clip frames.
let show_animation =
area.height >= MIN_ANIMATION_HEIGHT && area.width >= MIN_ANIMATION_WIDTH;
let mut lines: Vec<Line> = Vec::with_capacity(frames.len() + 2);
lines.extend(frames[idx].lines().map(|l| l.into()));
lines.push("".into());
let mut lines: Vec<Line> = Vec::new();
if show_animation {
let frame_line_count = frames[idx].lines().count();
lines.reserve(frame_line_count + 2);
lines.extend(frames[idx].lines().map(|l| l.into()));
lines.push("".into());
}
lines.push(Line::from(vec![
" ".into(),
"Welcome to ".into(),