diff --git a/local/recipes/tui/tlc/source/src/widget/input.rs b/local/recipes/tui/tlc/source/src/widget/input.rs index 18f9382956..0195dfe8ad 100644 --- a/local/recipes/tui/tlc/source/src/widget/input.rs +++ b/local/recipes/tui/tlc/source/src/widget/input.rs @@ -67,9 +67,13 @@ impl Input { placeholder: None, candidates: Vec::new(), ac_index: None, - fg: Color::White, - bg: Color::Blue, - cursor_color: Color::Yellow, + // Defaults are `Color::Reset` so render() falls back to + // theme tokens (theme.foreground / theme.background / + // theme.warning for the cursor). Callers can still + // override with .fg() / .bg() / .cursor_color(). + fg: Color::Reset, + bg: Color::Reset, + cursor_color: Color::Reset, } } @@ -123,6 +127,13 @@ impl Input { self } + /// Set the cursor marker color. + #[must_use] + pub fn cursor_color(mut self, c: Color) -> Self { + self.cursor_color = c; + self + } + /// Current text. #[must_use] pub fn value(&self) -> &str { @@ -305,8 +316,14 @@ impl Input { } else { self.text.clone() }; + // Apply theme defaults when the Input was not customized via + // the builder methods. `Color::Reset` is the sentinel meaning + // "use the theme token". + let fg = if self.fg == Color::Reset { theme.foreground } else { self.fg }; + let bg = if self.bg == Color::Reset { theme.background } else { self.bg }; + let cursor_color = if self.cursor_color == Color::Reset { theme.warning } else { self.cursor_color }; let style = if self.focused { - Style::default().fg(self.fg).bg(self.bg) + Style::default().fg(fg).bg(bg) } else { Style::default().fg(theme.hidden) }; @@ -320,7 +337,7 @@ impl Input { .border_style(style) .title(Span::styled( title, - Style::default().fg(self.fg).add_modifier(Modifier::BOLD), + Style::default().fg(fg).add_modifier(Modifier::BOLD), )); let p = Paragraph::new(display).style(style).block(block); frame.render_widget(p, area); @@ -332,7 +349,7 @@ impl Input { let marker = Paragraph::new(Span::styled( "|", Style::default() - .fg(self.cursor_color) + .fg(cursor_color) .add_modifier(Modifier::SLOW_BLINK), )); frame.render_widget(marker, Rect::new(cursor_x, inner.y, 1, 1)); @@ -508,4 +525,24 @@ mod tests { assert!(i.handle_key(Key::ctrl('d'))); assert_eq!(i.value(), "bc"); } + + #[test] + fn default_colors_are_reset_sentinel() { + // The default fg/bg/cursor_color fields are Color::Reset so + // render() can fall back to theme tokens. Callers that + // explicitly set colors via .fg() / .bg() / .cursor_color() + // override the sentinel. + let i = Input::new(); + assert_eq!(i.fg, Color::Reset); + assert_eq!(i.bg, Color::Reset); + assert_eq!(i.cursor_color, Color::Reset); + } + + #[test] + fn explicit_color_overrides_reset_sentinel() { + let i = Input::new().fg(Color::Red).bg(Color::Green).cursor_color(Color::Magenta); + assert_eq!(i.fg, Color::Red); + assert_eq!(i.bg, Color::Green); + assert_eq!(i.cursor_color, Color::Magenta); + } }