From a52361177904a9f5fd9f5190af9add2c45a3d8ea Mon Sep 17 00:00:00 2001 From: DanS Date: Sat, 4 Jul 2026 17:16:22 -0500 Subject: [PATCH] feat(theme): flat light-theme buttons (match the portfolio modal) Per the request for a flatter look like the Manage-portfolio modal's plain buttons, render TactileButton FLAT on light themes: DrawButtonGlassOverlay now early-returns in light themes with just a subtle defining edge (--rim-light), skipping the white glass sheen (--glass-fill) and the tactile 3D depth (bright top edge + the hardcoded bottom shadow that couldn't be removed via TOML). ImGui::Button still draws the fill/hover/active (the darkened ImGuiCol_Button overlays), so the button reads as a flat, defined element. Dark themes keep the raised glass/tactile look. Re-adds the IsLightTheme() luminance helper (early in the header so the overlay can use it). Applies to all TactileButtons app-wide in light themes, not just Settings. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/ui/material/draw_helpers.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/ui/material/draw_helpers.h b/src/ui/material/draw_helpers.h index d323d1e..dfabaaa 100644 --- a/src/ui/material/draw_helpers.h +++ b/src/ui/material/draw_helpers.h @@ -35,6 +35,15 @@ inline ImU32 ScaleAlpha(ImU32 col, float scale) { return (col & ~IM_COL32_A_MASK) | (static_cast(a) << IM_COL32_A_SHIFT); } +// True when the active theme is light (app background luminance is high). +inline bool IsLightTheme() { + ImU32 bg = Background(); + float r = ((bg >> IM_COL32_R_SHIFT) & 0xFF) / 255.0f; + float g = ((bg >> IM_COL32_G_SHIFT) & 0xFF) / 255.0f; + float b = ((bg >> IM_COL32_B_SHIFT) & 0xFF) / 255.0f; + return (0.299f * r + 0.587f * g + 0.114f * b) > 0.5f; +} + // Animated "loading" ellipsis: "", ".", "..", "..." cycling on a ~3Hz phase. inline const char* LoadingDots() { int n = ((int)(ImGui::GetTime() * 3.0f)) % 4; @@ -227,6 +236,14 @@ inline void DrawButtonGlassOverlay(ImDrawList* dl, const ImVec2& bMin, const ImVec2& bMax, float rounding, bool active, bool hovered) { + // Light themes: flat buttons (like the Manage-portfolio modal's plain buttons). Skip the glass + // sheen + tactile 3D — ImGui::Button already draws the fill/hover/active — and add just a subtle + // defining edge, which reads cleaner on light surfaces than the raised glass look. + if (IsLightTheme()) { + ImU32 rim = schema::UI().resolveColor("var(--rim-light)", IM_COL32(0, 0, 0, 50)); + dl->AddRect(bMin, bMax, active ? ScaleAlpha(rim, 0.6f) : rim, rounding, 0, 1.0f); + return; + } // Frosted glass highlight — subtle fill on top if (!active) { ImU32 col = hovered