Files
codex/codex-rs/tui/styles.md
T
Eric Traut 132c2be239 Improve TUI contrast, keyboard hints, and picker layouts (#46680)
## Why

Theme colors and dimmed text can lose contrast against terminal and shaded backgrounds. Pickers also need to keep controls and the selected result visible when space is limited.

## What changed

- Add shared blue accents and contrast-aware foregrounds that account for painted backgrounds and terminal color depth, with terminal-default fallbacks for limited palettes.
- Apply readable colors to footer text, status lines, prompt attachment labels, and diff content. Remove dimming from syntax-highlighted diff text so it does not undo contrast correction.
- Use compact shortcut labels such as `ctrl+c`, emphasize complete key combinations, and separate composer footer actions with ` · `.
- Add an opt-in picker presentation with full-width selection, filled tabs, separate overflow indicators, and navigation based on visible rows. Enable it for `/keymap`, reserving result space to keep controls stable across filtering and tab changes.

## Testing

Add regression tests and snapshots for contrast after palette conversion, shaded diff backgrounds, shortcut typography, picker resizing and pagination, Unicode tab truncation, and stable `/keymap` geometry.

GitOrigin-RevId: f3c71879d3bcc4e3b29d70e63cf377dea5914916
2026-09-19 17:46:43 +00:00

2.2 KiB

Headers, primary, and secondary text

  • Headers: Use bold. For markdown with various header levels, leave in the # signs.

  • Primary text: Default.

  • Secondary text: Use style::secondary_text_style() for shared footer descriptions and status lines. It resolves a readable muted foreground when the terminal palette is known and clears inherited dim/bold modifiers. Other secondary surfaces may still use dim.

  • Keyboard hints: Use key_hint span helpers for compact, uniformly bold shortcut labels and readable secondary descriptions. Include +, /, and chord separators in the label's emphasis. The ? shortcut reference uses readable accent-colored keys without bold. Separate composer footer actions with ·.

Foreground colors

  • Default: Most of the time, just use the default foreground color. reset can help get it back.
  • Active controls and input emphasis: Use style::accent_style() or style::accent_color_on(background) for text on a painted surface.
  • Semantic statuses: Use style::status_style(StatusTone); terminal-owned ANSI colors remain the fallback for limited palettes.
  • Success and additions: Use ANSI green.
  • Errors, failures and deletions: Use ANSI red.
  • Codex: Use ANSI magenta.

Avoid

  • Avoid unchecked custom foreground colors. Use style::readable_color_on(color, background) for theme-derived text, passing the background actually painted behind it. None means the terminal background; color reduction is included in the contrast check. When the background is unknown, supported theme colors are preserved rather than guessed. Generic code renderers preserve configured syntax foregrounds; diff rendering resolves them against its add/delete fills.
  • Avoid ANSI black & white as foreground colors because the default terminal theme color will do a better job. (Use reset if you need to in order to get those.) The exception is if you need contrast rendering over a manually colored background.
  • Avoid ANSI blue and yellow because for now the style guide doesn't use them. Prefer a foreground color mentioned above.

(There are some rules to try to catch this in clippy.toml.)