feat(market): bump the portfolio backdrop blur radius (64) via sole-consumer isolation

Raising the backdrop radius alone would thrash the shared radius-keyed blur cache (the
glass panels blur at ~30). Instead, while a full-window blur overlay is active, glass
panels use their opaque fallback (IsFullWindowBlurOverlayActive) — they're covered by the
backdrop anyway — so the backdrop is the SOLE applyBlur caller and can use a strong custom
radius (64) with the cache staying coherent and frozen. The flag is toggled alongside the
theme-effect suppression by a RAII guard in App::render().

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-03 21:15:12 -05:00
parent 4dc6b2ef8f
commit fe18628216
2 changed files with 29 additions and 13 deletions

View File

@@ -1243,16 +1243,24 @@ void App::render()
// Process deferred encryption from wizard (runs in background)
processDeferredEncryption();
// While the full-window portfolio modal is open, suppress panel theme-effects for the whole
// frame so their foreground-draw-list borders (sidebar included) don't bleed over the overlay.
// While the full-window portfolio modal is open: (1) suppress panel theme-effects for the whole
// frame so their foreground-draw-list borders (sidebar included) don't bleed over the overlay;
// (2) mark a full-window blur overlay active so glass panels use their opaque fallback (they're
// covered by the overlay backdrop, and this leaves the backdrop as the sole acrylic blur caller).
// RAII-restored to the prior state on any return path.
struct FxSuppressGuard {
bool active;
explicit FxSuppressGuard(bool on) : active(on) {
if (active) ui::effects::ThemeEffects::instance().setEnabled(false);
struct ModalRenderGuard {
bool fxOn, wasEffects;
explicit ModalRenderGuard(bool modalOpen) {
wasEffects = ui::effects::ThemeEffects::instance().isEnabled();
fxOn = modalOpen && wasEffects;
if (fxOn) ui::effects::ThemeEffects::instance().setEnabled(false);
ui::material::SetFullWindowBlurOverlayActive(modalOpen);
}
~FxSuppressGuard() { if (active) ui::effects::ThemeEffects::instance().setEnabled(true); }
} fxGuard(ui::PortfolioEditorActive() && ui::effects::ThemeEffects::instance().isEnabled());
~ModalRenderGuard() {
if (fxOn) ui::effects::ThemeEffects::instance().setEnabled(true);
ui::material::SetFullWindowBlurOverlayActive(false);
}
} modalGuard(ui::PortfolioEditorActive());
// Main content area - use full window (no menu bar)
ImGuiViewport* viewport = ImGui::GetMainViewport();