Skip to main content

vtcode_tui/core_tui/
style.rs

1use anstyle::{Color as AnsiColorEnum, Style as AnsiStyle};
2use ratatui::style::{Color, Modifier, Style};
3use unicode_width::UnicodeWidthStr;
4
5use crate::ui::theme;
6
7// Re-export from commons so existing consumers don't break.
8pub use vtcode_commons::ui_protocol::{convert_style, theme_from_color_fields};
9
10use super::types::{InlineTextStyle, InlineTheme};
11
12pub fn theme_from_styles(styles: &theme::ThemeStyles) -> InlineTheme {
13    theme_from_color_fields(
14        styles.foreground,
15        styles.background,
16        styles.primary,
17        styles.secondary,
18        styles.tool,
19        styles.tool_detail,
20        styles.pty_output,
21    )
22}
23
24pub fn measure_text_width(text: &str) -> u16 {
25    UnicodeWidthStr::width(text) as u16
26}
27
28/// Convert anstyle Color to ratatui Color.
29///
30/// Delegates to `vtcode_design::color::anstyle_to_ratatui_color` which
31/// provides the correct mapping (fixing the Magenta bug).
32pub fn ratatui_color_from_ansi(color: AnsiColorEnum) -> Color {
33    vtcode_design::color::anstyle_to_ratatui_color(color)
34}
35
36pub fn ratatui_style_from_inline(
37    style: &InlineTextStyle,
38    fallback: Option<AnsiColorEnum>,
39) -> Style {
40    vtcode_design::style::inline_text_style_to_ratatui(
41        style.color,
42        style.bg_color,
43        style.effects,
44        fallback,
45    )
46}
47
48/// PTY output style helper: keep configured color, suppress bold, enforce dimmed output.
49pub fn ratatui_pty_style_from_inline(
50    style: &InlineTextStyle,
51    fallback: Option<AnsiColorEnum>,
52) -> Style {
53    ratatui_style_from_inline(style, fallback)
54        .remove_modifier(Modifier::BOLD)
55        .add_modifier(Modifier::DIM)
56}
57
58/// Convert an `anstyle::Style` directly to a `ratatui::style::Style`.
59pub fn ratatui_style_from_ansi(style: AnsiStyle) -> Style {
60    vtcode_design::style::anstyle_to_ratatui_style(style)
61}