update composer + user message styling (#4240)
Changes: - the composer and user messages now have a colored background that stretches the entire width of the terminal. - the prompt character was changed from a cyan `▌` to a bold `›`. - the "working" shimmer now follows the "dark gray" color of the terminal, better matching the terminal's color scheme | Terminal + Background | Screenshot | |------------------------------|------------| | iTerm with dark bg | <img width="810" height="641" alt="Screenshot 2025-09-25 at 11 44 52 AM" src="https://github.com/user-attachments/assets/1317e579-64a9-4785-93e6-98b0258f5d92" /> | | iTerm with light bg | <img width="845" height="540" alt="Screenshot 2025-09-25 at 11 46 29 AM" src="https://github.com/user-attachments/assets/e671d490-c747-4460-af0b-3f8d7f7a6b8e" /> | | iTerm with color bg | <img width="825" height="564" alt="Screenshot 2025-09-25 at 11 47 12 AM" src="https://github.com/user-attachments/assets/141cda1b-1164-41d5-87da-3be11e6a3063" /> | | Terminal.app with dark bg | <img width="577" height="367" alt="Screenshot 2025-09-25 at 11 45 22 AM" src="https://github.com/user-attachments/assets/93fc4781-99f7-4ee7-9c8e-3db3cd854fe5" /> | | Terminal.app with light bg | <img width="577" height="367" alt="Screenshot 2025-09-25 at 11 46 04 AM" src="https://github.com/user-attachments/assets/19bf6a3c-91e0-447b-9667-b8033f512219" /> | | Terminal.app with color bg | <img width="577" height="367" alt="Screenshot 2025-09-25 at 11 45 50 AM" src="https://github.com/user-attachments/assets/dd7c4b5b-342e-4028-8140-f4e65752bd0b" /> |
This commit is contained in:
@@ -9,9 +9,8 @@ use crate::exec_command::strip_bash_lc_and_escape;
|
||||
use crate::markdown::append_markdown;
|
||||
use crate::render::line_utils::line_to_static;
|
||||
use crate::render::line_utils::prefix_lines;
|
||||
pub(crate) use crate::status::RateLimitSnapshotDisplay;
|
||||
pub(crate) use crate::status::new_status_output;
|
||||
pub(crate) use crate::status::rate_limit_snapshot_display;
|
||||
use crate::style::user_message_style;
|
||||
use crate::terminal_palette::default_bg;
|
||||
use crate::text_formatting::format_and_truncate_tool_result;
|
||||
use crate::ui_consts::LIVE_PREFIX_COLS;
|
||||
use crate::wrapping::RtOptions;
|
||||
@@ -97,17 +96,24 @@ impl HistoryCell for UserHistoryCell {
|
||||
fn display_lines(&self, width: u16) -> Vec<Line<'static>> {
|
||||
let mut lines: Vec<Line<'static>> = Vec::new();
|
||||
|
||||
// Wrap the content first, then prefix each wrapped line with the marker.
|
||||
// Use ratatui-aware word wrapping and prefixing to avoid lifetime issues.
|
||||
let wrap_width = width.saturating_sub(LIVE_PREFIX_COLS); // account for the ▌ prefix and trailing space
|
||||
let wrapped = textwrap::wrap(
|
||||
&self.message,
|
||||
textwrap::Options::new(wrap_width as usize)
|
||||
.wrap_algorithm(textwrap::WrapAlgorithm::FirstFit), // Match textarea wrap
|
||||
|
||||
let style = user_message_style(default_bg());
|
||||
|
||||
// Use our ratatui wrapping helpers for correct styling and lifetimes.
|
||||
let wrapped = word_wrap_lines(
|
||||
&self
|
||||
.message
|
||||
.lines()
|
||||
.map(|l| Line::from(l).style(style))
|
||||
.collect::<Vec<_>>(),
|
||||
RtOptions::new(wrap_width as usize),
|
||||
);
|
||||
|
||||
for line in wrapped {
|
||||
lines.push(vec!["▌ ".cyan().dim(), line.to_string().dim()].into());
|
||||
}
|
||||
lines.push(Line::from("").style(style));
|
||||
lines.extend(prefix_lines(wrapped, "› ".bold().dim(), " ".into()));
|
||||
lines.push(Line::from("").style(style));
|
||||
lines
|
||||
}
|
||||
|
||||
@@ -139,7 +145,21 @@ impl HistoryCell for ReasoningSummaryCell {
|
||||
let summary_lines = self
|
||||
.content
|
||||
.iter()
|
||||
.map(|l| l.clone().dim().italic())
|
||||
.map(|line| {
|
||||
Line::from(
|
||||
line.spans
|
||||
.iter()
|
||||
.map(|span| {
|
||||
Span::styled(
|
||||
span.content.clone().into_owned(),
|
||||
span.style
|
||||
.add_modifier(Modifier::ITALIC)
|
||||
.add_modifier(Modifier::DIM),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
word_wrap_lines(
|
||||
@@ -179,7 +199,7 @@ impl HistoryCell for AgentMessageCell {
|
||||
&self.lines,
|
||||
RtOptions::new(width as usize)
|
||||
.initial_indent(if self.is_first_line {
|
||||
"> ".into()
|
||||
"• ".into()
|
||||
} else {
|
||||
" ".into()
|
||||
})
|
||||
@@ -866,7 +886,7 @@ pub(crate) fn new_mcp_tools_output(
|
||||
}
|
||||
|
||||
pub(crate) fn new_info_event(message: String, hint: Option<String>) -> PlainHistoryCell {
|
||||
let mut line = vec!["> ".into(), message.into()];
|
||||
let mut line = vec!["• ".into(), message.into()];
|
||||
if let Some(hint) = hint {
|
||||
line.push(" ".into());
|
||||
line.push(hint.dark_gray());
|
||||
|
||||
Reference in New Issue
Block a user