diff --git a/src/ui/material/draw_helpers.h b/src/ui/material/draw_helpers.h index d323d1e..6e3a83e 100644 --- a/src/ui/material/draw_helpers.h +++ b/src/ui/material/draw_helpers.h @@ -1135,6 +1135,16 @@ inline std::string g_overlayCurrentKey; // so every overlay shares one backdrop tone. `opacity` is the alpha (dialogs vary it per call). inline ImVec4 OverlayScrimColor(float opacity) { return ImVec4(0.04f, 0.04f, 0.06f, opacity); } +// True when the active theme is light (app background luminance is high). Used to add extra +// separation where light-on-light would otherwise be low-contrast. +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; +} + // Style of an overlay dialog. GlassCard = the classic scrim + glass card + boxed title bar. // BlurFloat = the "Manage Portfolio" look: live-blur backdrop + floating content + plain heading. enum class OverlayStyle { GlassCard, BlurFloat }; @@ -1263,6 +1273,12 @@ inline bool BeginOverlayDialog(const OverlayDialogSpec& spec) GlassPanelSpec cardGlass; cardGlass.rounding = 16.0f; cardGlass.fillAlpha = 35; cardGlass.borderAlpha = 50; cardGlass.borderWidth = 1.0f; DrawGlassPanel(dl, cardMin, cardMax, cardGlass); + } else if (IsLightTheme()) { + // Floating content has no card, so in a LIGHT theme it sits light-on-light with almost no + // separation. Give it a faint elevated sheet + a defining edge for contrast (kept translucent + // to preserve the airy "floating" feel; dark themes already read fine, so they're unchanged). + dl->AddRectFilled(cardMin, cardMax, WithAlpha(Surface(), 60), 20.0f); + dl->AddRect(cardMin, cardMax, WithAlpha(OnSurface(), 55), 20.0f, 0, 1.5f); } // Click outside the card dismisses — but not on the appearing frame (the opening click) or while