Fix: rAF-Sicherheitsnetz fuer Blur zentral in _showPopupProgress

Vorheriger Fix in selectIncident griff nicht beim handleRefresh-Pfad
(manueller Aktualisieren-Klick), weil dieser direkt UI.showProgress aufruft
ohne selectIncident zu durchlaufen. Damit blieb eine Lage, deren erster
Refresh per Klick angestossen wurde, unblurred.

rAF mit add("blurred") jetzt direkt in _showPopupProgress (components.js),
sobald state.isFirst gesetzt ist. Damit greift der Blur in jedem Pfad, der
durch _showPopupProgress laeuft — selectIncident, handleRefresh,
handleStatusUpdate (WebSocket), Initial-Restore.

Der zentrale rAF in selectIncident ist redundant und wieder entfernt.
Der _willReBlur-Skip von remove("blurred") in selectIncident bleibt
erhalten — verhindert ueberfluessiges remove+add im selben Tick.

cache-bust components.js auf v=20260427a, app.js auf v=20260427c.
Dieser Commit ist enthalten in:
Claude Code
2026-04-27 20:52:39 +00:00
Ursprung 14d1062583
Commit 059395393c
3 geänderte Dateien mit 12 neuen und 11 gelöschten Zeilen

Datei anzeigen

@@ -626,9 +626,9 @@
<script src="/static/vendor/leaflet.markercluster.js"></script> <script src="/static/vendor/leaflet.markercluster.js"></script>
<script src="/static/js/api.js?v=20260423a"></script> <script src="/static/js/api.js?v=20260423a"></script>
<script src="/static/js/ws.js?v=20260316b"></script> <script src="/static/js/ws.js?v=20260316b"></script>
<script src="/static/js/components.js?v=20260316d"></script> <script src="/static/js/components.js?v=20260427a"></script>
<script src="/static/js/layout.js?v=20260316b"></script> <script src="/static/js/layout.js?v=20260316b"></script>
<script src="/static/js/app.js?v=20260427b"></script> <script src="/static/js/app.js?v=20260427c"></script>
<script src="/static/js/cluster-data.js?v=20260322f"></script> <script src="/static/js/cluster-data.js?v=20260322f"></script>
<script src="/static/js/tutorial.js?v=20260316z"></script> <script src="/static/js/tutorial.js?v=20260316z"></script>
<script src="/static/js/chat.js?v=20260422a"></script> <script src="/static/js/chat.js?v=20260422a"></script>

Datei anzeigen

@@ -752,14 +752,6 @@ const App = {
UI._showPopupProgress(state.step, {}, state); UI._showPopupProgress(state.step, {}, state);
} }
UI._lockActionsIfFirst(state.isFirst); UI._lockActionsIfFirst(state.isFirst);
// _showPopupProgress setzt .blurred bereits, aber CSS filter
// greift nach dem grossen DOM-Reshuffle (Display-Toggle,
// renderSidebar, leerge innerHTML) im selben Frame nicht
// zuverlaessig. Im naechsten Frame nochmal setzen —
// idempotent, falls schon gesetzt.
if (state.isFirst && grid && !state.minimized) {
requestAnimationFrame(() => grid.classList.add('blurred'));
}
} else { } else {
// No state yet — show popup (first status update will refine) // No state yet — show popup (first status update will refine)
UI.showProgress('researching', {}, id, false); UI.showProgress('researching', {}, id, false);

Datei anzeigen

@@ -336,7 +336,16 @@ const UI = {
overlay.classList.add('blocking'); overlay.classList.add('blocking');
// Apply blur to grid // Apply blur to grid
const grid = document.querySelector('.tab-panels'); const grid = document.querySelector('.tab-panels');
if (grid) grid.classList.add('blurred'); if (grid) {
grid.classList.add('blurred');
// Sicherheitsnetz: bei viel DOM-Reshuffle im selben Tick
// (Display-Wechsel, renderSidebar, leere innerHTML) greift
// CSS filter:blur erst beim naechsten Layout-Pass. Im
// naechsten Frame nochmal setzen — idempotent.
requestAnimationFrame(() => {
if (state && state.isFirst) grid.classList.add('blurred');
});
}
} else { } else {
overlay.classList.remove('blocking'); overlay.classList.remove('blocking');
} }