feat(ui): light-theme contrast for floating modals
Floating (BlurFloat) modals draw no card, so in a light theme the light content sits on a light frosted backdrop with almost no separation (washed out — the Manage-portfolio modal being the clearest case). Add a faint elevated sheet (translucent Surface) + a defining edge (OnSurface) behind floating content in LIGHT themes only, gated on a new IsLightTheme() (background luminance) helper. Dark themes are unchanged (they already read fine). Kept translucent to preserve the airy floating feel; respects "no dark backdrop in light theme". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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).
|
// 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); }
|
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.
|
// 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.
|
// BlurFloat = the "Manage Portfolio" look: live-blur backdrop + floating content + plain heading.
|
||||||
enum class OverlayStyle { GlassCard, BlurFloat };
|
enum class OverlayStyle { GlassCard, BlurFloat };
|
||||||
@@ -1263,6 +1273,12 @@ inline bool BeginOverlayDialog(const OverlayDialogSpec& spec)
|
|||||||
GlassPanelSpec cardGlass;
|
GlassPanelSpec cardGlass;
|
||||||
cardGlass.rounding = 16.0f; cardGlass.fillAlpha = 35; cardGlass.borderAlpha = 50; cardGlass.borderWidth = 1.0f;
|
cardGlass.rounding = 16.0f; cardGlass.fillAlpha = 35; cardGlass.borderAlpha = 50; cardGlass.borderWidth = 1.0f;
|
||||||
DrawGlassPanel(dl, cardMin, cardMax, cardGlass);
|
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
|
// Click outside the card dismisses — but not on the appearing frame (the opening click) or while
|
||||||
|
|||||||
Reference in New Issue
Block a user