From 2ee90a4b3bfd91a06ad1d224090d9bb14ad0f642 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Mon, 27 Apr 2026 19:29:00 +0000 Subject: [PATCH 1/4] Fix: Blur greift sofort beim Anlegen einer neuen Lage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Im Create-Flow wurde .blurred in selectIncident() erst entfernt und gleich darauf via _showPopupProgress wieder gesetzt. CSS filter:blur greift in der Kombination (frischer isFirst-State + selectIncident im selben Tick + viel vorausgehende DOM-Manipulation durch Modal-Close + renderSidebar) nicht zuverlaessig im selben Frame — der Fall war bis zum Wegklicken/Zurueckklicken unblurred. selectIncident: remove("blurred") wird uebersprungen, wenn der zustaendige Progress-State isFirst=true und nicht minimiert ist (Blur soll bestehen bleiben statt remove+add im selben Tick). createIncident: zusaetzlich requestAnimationFrame mit grid.classList.add im naechsten Frame, falls der Browser den ersten add-Aufruf in selectIncident nicht visuell uebernommen hat. Doppeltes Setzen ist idempotent. dashboard.html: cache-bust app.js auf v=20260427a. --- src/static/dashboard.html | 2 +- src/static/js/app.js | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/static/dashboard.html b/src/static/dashboard.html index 70c9cee..f88d6b0 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -628,7 +628,7 @@ - + diff --git a/src/static/js/app.js b/src/static/js/app.js index 2f0dc71..36936e7 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -736,7 +736,12 @@ const App = { const prevMini = document.getElementById('progress-mini'); if (prevMini) prevMini.style.display = 'none'; const grid = document.querySelector('.tab-panels'); - if (grid) grid.classList.remove('blurred'); + // Blur nur entfernen, wenn er nicht direkt danach wieder gesetzt wird. + // Beim Create-Flow (frischer isFirst-State + selectIncident im selben + // Tick) greift CSS filter:blur sonst nicht im selben Frame. + const _restState = isRefreshing ? UI._progressState[id] : null; + const _willReBlur = _restState && _restState.isFirst && !_restState.minimized; + if (grid && !_willReBlur) grid.classList.remove('blurred'); if (isRefreshing) { const state = UI._progressState[id]; @@ -1778,6 +1783,14 @@ const App = { await this.selectIncident(incident.id); + // Im Create-Flow greift CSS filter:blur nach dem viel DOM-Reshuffle + // (Modal-Close, renderSidebar, Tab-Wechsel) im selben Frame nicht + // zuverlaessig. Im naechsten Frame nochmal setzen — Aufwand minimal. + requestAnimationFrame(() => { + const _grid = document.querySelector('.tab-panels'); + if (_grid) _grid.classList.add('blurred'); + }); + this._updateRefreshButton(true); await API.refreshIncident(incident.id); UI.showToast(`Lage "${incident.title}" angelegt. Recherche gestartet.`, 'success'); -- 2.49.1 From 14d106258344382d83fd41eb7601792796dc21e9 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Mon, 27 Apr 2026 19:43:18 +0000 Subject: [PATCH 2/4] Fix: Blur greift bei jedem ersten Durchlauf der ausgewaehlten Lage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vorheriger Patch hatte den rAF nur im Create-Flow gesetzt. Damit funktionierte zwar das Anlegen, aber das Auswaehlen einer existierenden Lage, deren erste Recherche gerade laeuft (oder nach einem manuellen ersten Refresh), blieb unblurred. Loesung: rAF mit add("blurred") jetzt zentral in selectIncident, sobald der Progress-State isFirst=true und nicht minimiert ist. Damit greift der Blur in allen Pfaden (Anlegen, manueller Refresh, Auswahl einer laufenden Lage, Wechsel zwischen Faellen, Initial-Load via savedId). Der zusaetzliche rAF in createIncident von 2ee90a4 ist damit redundant und wieder entfernt — der zentrale Hook in selectIncident deckt den Fall mit ab. cache-bust app.js auf v=20260427b. --- src/static/dashboard.html | 2 +- src/static/js/app.js | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/static/dashboard.html b/src/static/dashboard.html index f88d6b0..0ce9484 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -628,7 +628,7 @@ - + diff --git a/src/static/js/app.js b/src/static/js/app.js index 36936e7..95dcf4e 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -736,9 +736,8 @@ const App = { const prevMini = document.getElementById('progress-mini'); if (prevMini) prevMini.style.display = 'none'; const grid = document.querySelector('.tab-panels'); - // Blur nur entfernen, wenn er nicht direkt danach wieder gesetzt wird. - // Beim Create-Flow (frischer isFirst-State + selectIncident im selben - // Tick) greift CSS filter:blur sonst nicht im selben Frame. + // Wenn gerade ein erster Refresh laeuft, Blur stehen lassen statt + // remove+add im selben Tick — CSS filter:blur greift sonst nicht. const _restState = isRefreshing ? UI._progressState[id] : null; const _willReBlur = _restState && _restState.isFirst && !_restState.minimized; if (grid && !_willReBlur) grid.classList.remove('blurred'); @@ -753,6 +752,14 @@ const App = { UI._showPopupProgress(state.step, {}, state); } 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 { // No state yet — show popup (first status update will refine) UI.showProgress('researching', {}, id, false); @@ -1783,14 +1790,6 @@ const App = { await this.selectIncident(incident.id); - // Im Create-Flow greift CSS filter:blur nach dem viel DOM-Reshuffle - // (Modal-Close, renderSidebar, Tab-Wechsel) im selben Frame nicht - // zuverlaessig. Im naechsten Frame nochmal setzen — Aufwand minimal. - requestAnimationFrame(() => { - const _grid = document.querySelector('.tab-panels'); - if (_grid) _grid.classList.add('blurred'); - }); - this._updateRefreshButton(true); await API.refreshIncident(incident.id); UI.showToast(`Lage "${incident.title}" angelegt. Recherche gestartet.`, 'success'); -- 2.49.1 From 059395393c438c17367bc8bc4e103f155260f1e4 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Mon, 27 Apr 2026 20:52:39 +0000 Subject: [PATCH 3/4] Fix: rAF-Sicherheitsnetz fuer Blur zentral in _showPopupProgress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/static/dashboard.html | 4 ++-- src/static/js/app.js | 8 -------- src/static/js/components.js | 11 ++++++++++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/static/dashboard.html b/src/static/dashboard.html index 0ce9484..0ad8ebb 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -626,9 +626,9 @@ - + - + diff --git a/src/static/js/app.js b/src/static/js/app.js index 95dcf4e..1d94dfa 100644 --- a/src/static/js/app.js +++ b/src/static/js/app.js @@ -752,14 +752,6 @@ const App = { UI._showPopupProgress(state.step, {}, state); } 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 { // No state yet — show popup (first status update will refine) UI.showProgress('researching', {}, id, false); diff --git a/src/static/js/components.js b/src/static/js/components.js index a58fb21..5a05c8c 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -336,7 +336,16 @@ const UI = { overlay.classList.add('blocking'); // Apply blur to grid 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 { overlay.classList.remove('blocking'); } -- 2.49.1 From ac5160010de141591d2f0ddac0f086e4377bf9a7 Mon Sep 17 00:00:00 2001 From: IntelSight_Admin Date: Wed, 29 Apr 2026 22:10:55 +0200 Subject: [PATCH 4/4] Release-Notes: Blur versucht zu fixen --- RELEASES.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/RELEASES.json b/RELEASES.json index d506d87..deee288 100644 --- a/RELEASES.json +++ b/RELEASES.json @@ -1,4 +1,12 @@ [ + { + "version": "2026-04-29T20:10Z", + "date": "2026-04-29", + "title": "Blur versucht zu fixen", + "items": [ + "war nix..." + ] + }, { "version": "2026-04-26T21:10Z", "date": "2026-04-26", -- 2.49.1