Promote develop → main (2026-04-30 23:12 UTC)

This commit was merged in pull request #6.
Dieser Commit ist enthalten in:
2026-05-01 01:12:48 +02:00
Commit dc75b89618
4 geänderte Dateien mit 30 neuen und 15 gelöschten Zeilen

Datei anzeigen

@@ -1,4 +1,13 @@
[ [
{
"version": "2026-04-30T23:12Z",
"date": "2026-04-30",
"title": "Hintergrundbild-Unschärfe zuverlässiger und vollständiger",
"items": [
"Der Weichzeichner-Effekt wird jetzt stabiler angezeigt und aktualisiert sich korrekt",
"Der Header-Bereich wird nun ebenfalls korrekt mit dem Unschärfe-Effekt versehen"
]
},
{ {
"version": "2026-04-29T22:30Z", "version": "2026-04-29T22:30Z",
"date": "2026-04-29", "date": "2026-04-29",

Datei anzeigen

@@ -2133,12 +2133,19 @@ a.dev-source-pill:hover {
font-size: 12px; color: var(--accent); font-weight: 600; font-size: 12px; color: var(--accent); font-weight: 600;
} }
/* === Blur for First Refresh === */ /* === Blur for First Refresh ===
.tab-panels.blurred .tab-panel { * Liegt auf #incident-view, damit Header (Titel/Aktionen/Beschreibung) und
* Tab-Panels gemeinsam unscharf werden. will-change + translateZ erzwingen
* einen persistenten GPU-Composite-Layer, sodass der Effekt bei Window-Resize
* und Reflow nicht zerschossen wird. Keine Transition: Blur soll schlagartig
* kommen und schlagartig gehen, sonst sieht man waehrend des Reflows einen
* lesbaren Zwischenzustand. */
#incident-view.refresh-blurred {
filter: blur(8px); filter: blur(8px);
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
transition: filter 0.4s ease; will-change: filter;
transform: translateZ(0);
} }
/* === Disabled Actions During First Refresh === */ /* === Disabled Actions During First Refresh === */
@@ -4035,7 +4042,6 @@ a.dev-source-pill:hover {
.tab-panel .ht-timeline-container { .tab-panel .ht-timeline-container {
min-height: 200px; min-height: 200px;
} }
.tab-panels.blurred { filter: blur(4px); pointer-events: none; }
.grid-stack .card-header:active { .grid-stack .card-header:active {
cursor: grabbing; cursor: grabbing;

Datei anzeigen

@@ -735,12 +735,12 @@ const App = {
if (prevOverlay) prevOverlay.style.display = 'none'; if (prevOverlay) prevOverlay.style.display = 'none';
const prevMini = document.getElementById('progress-mini'); const prevMini = document.getElementById('progress-mini');
if (prevMini) prevMini.style.display = 'none'; if (prevMini) prevMini.style.display = 'none';
const grid = document.querySelector('.tab-panels'); const blurTarget = document.getElementById('incident-view');
// Wenn gerade ein erster Refresh laeuft, Blur stehen lassen statt // Wenn gerade ein erster Refresh laeuft, Blur stehen lassen statt
// remove+add im selben Tick — CSS filter:blur greift sonst nicht. // remove+add im selben Tick — CSS filter:blur greift sonst nicht.
const _restState = isRefreshing ? UI._progressState[id] : null; const _restState = isRefreshing ? UI._progressState[id] : null;
const _willReBlur = _restState && _restState.isFirst && !_restState.minimized; const _willReBlur = _restState && _restState.isFirst && !_restState.minimized;
if (grid && !_willReBlur) grid.classList.remove('blurred'); if (blurTarget && !_willReBlur) blurTarget.classList.remove('refresh-blurred');
if (isRefreshing) { if (isRefreshing) {
const state = UI._progressState[id]; const state = UI._progressState[id];

Datei anzeigen

@@ -334,16 +334,16 @@ const UI = {
// Blocking (no close) for first refresh // Blocking (no close) for first refresh
if (state.isFirst) { if (state.isFirst) {
overlay.classList.add('blocking'); overlay.classList.add('blocking');
// Apply blur to grid // Apply blur to incident-view (Header + Tab-Panels gemeinsam).
const grid = document.querySelector('.tab-panels'); const blurTarget = document.getElementById('incident-view');
if (grid) { if (blurTarget) {
grid.classList.add('blurred'); blurTarget.classList.add('refresh-blurred');
// Sicherheitsnetz: bei viel DOM-Reshuffle im selben Tick // Sicherheitsnetz: bei viel DOM-Reshuffle im selben Tick
// (Display-Wechsel, renderSidebar, leere innerHTML) greift // (Display-Wechsel, renderSidebar, leere innerHTML) greift
// CSS filter:blur erst beim naechsten Layout-Pass. Im // CSS filter:blur erst beim naechsten Layout-Pass. Im
// naechsten Frame nochmal setzen — idempotent. // naechsten Frame nochmal setzen — idempotent.
requestAnimationFrame(() => { requestAnimationFrame(() => {
if (state && state.isFirst) grid.classList.add('blurred'); if (state && state.isFirst) blurTarget.classList.add('refresh-blurred');
}); });
} }
} else { } else {
@@ -474,8 +474,8 @@ const UI = {
if (incidentId === App.currentIncidentId) { if (incidentId === App.currentIncidentId) {
// Remove blur // Remove blur
const grid = document.querySelector('.tab-panels'); const blurTarget = document.getElementById('incident-view');
if (grid) grid.classList.remove('blurred'); if (blurTarget) blurTarget.classList.remove('refresh-blurred');
const overlay = document.getElementById('progress-overlay'); const overlay = document.getElementById('progress-overlay');
if (overlay) { if (overlay) {
@@ -568,8 +568,8 @@ const UI = {
if (!incidentId) incidentId = App.currentIncidentId; if (!incidentId) incidentId = App.currentIncidentId;
// Remove blur // Remove blur
const grid = document.querySelector('.tab-panels'); const blurTarget = document.getElementById('incident-view');
if (grid) grid.classList.remove('blurred'); if (blurTarget) blurTarget.classList.remove('refresh-blurred');
if (incidentId === App.currentIncidentId) { if (incidentId === App.currentIncidentId) {
const overlay = document.getElementById('progress-overlay'); const overlay = document.getElementById('progress-overlay');