Per-component UI color customization (e.g. user message foreground/background)
Problem
Claude Code's current theming is wholesale — /theme switches the entire palette (dark / light / ansi variants). There is no way to restyle a specific UI component independently.
A concrete pain point: on the default dark theme, the user message block renders with a light background and white/near-white foreground. In scrollback, previously-sent user messages are hard to read because the foreground and background are low-contrast. The rest of the UI is fine — only the user-message bubble needs adjustment.
Switching themes wholesale works around this but is a blunt instrument: it changes everything else too (assistant messages, tool output framing, accents), which may not be desired.
Proposed solution
Add granular component-level color overrides in settings.json, for example:
{
"uiColors": {
"userMessage": {
"foreground": "#1a1a1a",
"background": "#e8f0fe"
},
"assistantMessage": { "foreground": "...", "background": "..." },
"toolCall": { "foreground": "...", "background": "..." }
}
}
Accepted values could be hex, named ANSI colors, or the sentinel "default" / "inherit" to fall back to the active theme.
Why this is worth it
- Accessibility — users with visual sensitivities often need per-element tuning, not a whole palette swap.
- Scrollback readability — the transcript is a primary artifact for review, and the user-message bubble is the most-scanned element when looking back at what was asked.
- Consistency with VS Code / terminal conventions — both expose per-component color tokens (
workbench.colorCustomizations, ANSI slot overrides). Claude Code currently doesn't.
Related
- Feature request for
defaultSessionColor— anthropics/claude-code#50806 (related but different goal: per-session tinting vs. per-component styling)
Current workaround
Only the -ansi themes (dark-ansi, light-ansi) defer colors to the terminal palette, which lets users indirectly re-tint via their iTerm2 / terminal profile — but the terminal-color-to-UI-component mapping isn't documented, so this is guesswork and affects every other element that touches the same ANSI slot.
Environment
- Claude Code CLI
- macOS (iTerm2)
- Default dark theme
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗