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" /> |
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
use crate::color::blend;
|
|
use crate::color::is_light;
|
|
use crate::color::perceptual_distance;
|
|
use crate::terminal_palette::terminal_palette;
|
|
use ratatui::style::Color;
|
|
use ratatui::style::Style;
|
|
|
|
/// Returns the style for a user-authored message using the provided terminal background.
|
|
pub fn user_message_style(terminal_bg: Option<(u8, u8, u8)>) -> Style {
|
|
match terminal_bg {
|
|
Some(bg) => Style::default().bg(user_message_bg(bg)),
|
|
None => Style::default(),
|
|
}
|
|
}
|
|
|
|
#[allow(clippy::disallowed_methods)]
|
|
pub fn user_message_bg(terminal_bg: (u8, u8, u8)) -> Color {
|
|
let top = if is_light(terminal_bg) {
|
|
(0, 0, 0)
|
|
} else {
|
|
(255, 255, 255)
|
|
};
|
|
let bottom = terminal_bg;
|
|
let Some(color_level) = supports_color::on_cached(supports_color::Stream::Stdout) else {
|
|
return Color::default();
|
|
};
|
|
|
|
let target = blend(top, bottom, 0.1);
|
|
if color_level.has_16m {
|
|
let (r, g, b) = target;
|
|
Color::Rgb(r, g, b)
|
|
} else if color_level.has_256
|
|
&& let Some(palette) = terminal_palette()
|
|
&& let Some((i, _)) = palette.into_iter().enumerate().min_by(|(_, a), (_, b)| {
|
|
perceptual_distance(*a, target)
|
|
.partial_cmp(&perceptual_distance(*b, target))
|
|
.unwrap_or(std::cmp::Ordering::Equal)
|
|
})
|
|
{
|
|
Color::Indexed(i as u8)
|
|
} else {
|
|
Color::default()
|
|
}
|
|
}
|