fix(theme): per-skin legibility polish from the sweep review

Address the high-severity, systemic legibility issues found in the per-skin
screenshot review (verified across all 9 skins):

- Status pills (history): "Confirmed" text was 55%-alpha (dim); make it full
  opacity, and give status/shield pills a visible tinted fill (a48) + 1px border
  (a90) so they stop vanishing on dark-red / near-white / gradient skins.
- Console light theming: light skins now use a near-white terminal surface, and
  the log text/JsonBrace colors switch to the dark defaults in light themes (the
  schema colors are dark-terminal-authored — honor them only in dark themes) so
  text isn't pale-on-white.
- Dark-skin muted text: bump --on-surface-medium 0.85 / --on-surface-disabled
  0.58 on dragonx/dark/color-pop-dark/obsidian (obsidian addresses were ~1.1:1).
- Disabled Send button: the disabled fill was hardcoded white (invisible on
  light skins) — use a dark overlay in light themes.
- Light-skin inputs: stronger frame fill + border color and a 1px frame border
  for light themes so fields (and buttons) have defined boundaries on white/
  pastel surfaces.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-04 23:33:48 -05:00
parent dfca9bbd92
commit 1c5bc0d4d6
8 changed files with 53 additions and 32 deletions

View File

@@ -372,7 +372,7 @@ void ApplyColorThemeToImGui(const ColorTheme& theme)
colors[ImGuiCol_Border] = ImVec4(1.0f, 1.0f, 1.0f, 0.15f);
colors[ImGuiCol_BorderShadow] = ImVec4(0, 0, 0, 0.08f);
} else {
colors[ImGuiCol_Border] = ImVec4(0, 0, 0, 0.12f);
colors[ImGuiCol_Border] = ImVec4(0, 0, 0, 0.22f);
colors[ImGuiCol_BorderShadow] = ImVec4(0, 0, 0, 0.04f);
}
@@ -383,10 +383,11 @@ void ApplyColorThemeToImGui(const ColorTheme& theme)
colors[ImGuiCol_FrameBgActive] = ImVec4(1.0f, 1.0f, 1.0f, 0.15f);
} else {
// Light themes: the old 4/7/10% black fills were nearly invisible on a white surface (input
// fields blended in). Darker fills so inputs/dropdowns read as defined boxes.
colors[ImGuiCol_FrameBg] = ImVec4(0, 0, 0, 0.09f);
colors[ImGuiCol_FrameBgHovered] = ImVec4(0, 0, 0, 0.14f);
colors[ImGuiCol_FrameBgActive] = ImVec4(0, 0, 0, 0.18f);
// fields blended in). Darker fills + a 1px frame border (below) so inputs/dropdowns read as
// defined boxes even on the pastel/gradient light skins (iridescent, color-pop-light).
colors[ImGuiCol_FrameBg] = ImVec4(0, 0, 0, 0.11f);
colors[ImGuiCol_FrameBgHovered] = ImVec4(0, 0, 0, 0.16f);
colors[ImGuiCol_FrameBgActive] = ImVec4(0, 0, 0, 0.20f);
}
// Title bar
@@ -508,7 +509,10 @@ void ApplyColorThemeToImGui(const ColorTheme& theme)
style.WindowBorderSize = bwElem.extraFloats.count("window") ? bwElem.extraFloats.at("window") : 1.0f;
style.ChildBorderSize = bwElem.extraFloats.count("child") ? bwElem.extraFloats.at("child") : 1.0f;
style.PopupBorderSize = bwElem.extraFloats.count("popup") ? bwElem.extraFloats.at("popup") : 1.0f;
style.FrameBorderSize = bwElem.extraFloats.count("frame") ? bwElem.extraFloats.at("frame") : 0.0f;
// Light themes get a 1px frame border so inputs have a defined boundary on white/pastel surfaces;
// dark themes stay borderless (their translucent glass FrameBg is enough). Schema can override.
style.FrameBorderSize = bwElem.extraFloats.count("frame") ? bwElem.extraFloats.at("frame")
: (s_isDarkTheme ? 0.0f : 1.0f);
style.TabBorderSize = 0.0f;
style.AntiAliasedLines = true;