M15-Karte: Pruefkette als Akkordeon in drei Abschnitten

User-Wunsch. Die Karte war auf zehn Zeilen gewachsen und dominierte das
Dashboard; jetzt sind sie in drei aufklappbare Gruppen sortiert:

  ① - ④  Pruefkette                        (offen)   Bias · Kosten · Zone · Reichweite
  ⑤      Kontext - Motor · M5 · RSI        (zu)      Motor/Raum · M5-Zustand · RSI
  ⑥ - ⑦  Selbstmessung · Ausfuehrung · Veto (zu)      Track · Exec · Veto

Das Status-Banner bleibt IMMER sichtbar - es ist die eine Zeile, die eine
Handlungsaussage traegt, und es bestaetigt ausdruecklich auch das Nicht-Handeln.

⚠⚠ NATIVES <details>/<summary>, kein JS fuer das Klappen. Entscheidend ist, dass
die Elemente IM DOM bleiben: der Render schreibt weiter in alle zehn IDs, auch
wenn ein Abschnitt zugeklappt ist. Ein Container, der die Elemente ENTFERNT,
haette den Render abbrechen lassen - genau der Ausfall von gestern Abend, als
ein ReferenceError in renderM15 das halbe Dashboard auf "—" stehen liess.

JS macht nur EINES: den Auf-/Zu-Zustand in localStorage merken. Ohne das waere
jeder Reload ein Rueckschritt - und die Seite wird bei jedem ?v=-Bump neu
geladen. Faellt localStorage aus (privater Modus), greift der Default.

Verifiziert: 10 m15-Items unveraendert vorhanden, keine doppelten IDs,
div 86/86 und details 3/3 ausgeglichen, node --check gruen, Render-Probe
(Stufe B2) gruen. Reine Frontend-Aenderung (v=190), kein Neustart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-20 00:11:17 +02:00
co-authored by Claude Opus 5
parent 5684589878
commit d3d613068c
3 changed files with 62 additions and 24 deletions
+23
View File
@@ -2183,3 +2183,26 @@ async function setMgGlobal() {
if (e.key === "Enter") { e.preventDefault(); e.target.blur(); }
});
});
// --- M15-Akkordeon: Auf-/Zuklappen merken -------------------------------
// ⚠ Das Auf- und Zuklappen macht natives <details> selbst - hier wird NUR der
// Zustand gemerkt, damit die Karte nach jedem Reload so aussieht, wie der
// Nutzer sie zuletzt hatte. Ohne das waere jede Seitenaktualisierung ein
// Rueckschritt, und die Seite wird bei jedem `?v=`-Bump neu geladen.
// ⚠ KEIN Eingriff in den Render: die Elemente bleiben im DOM, auch zugeklappt.
// Ein zugeklapptes <details> ist nur nicht sichtbar - `textContent` wird
// weiter gesetzt, und die naechste Oeffnung zeigt den aktuellen Stand.
{
const KEY = "oil_m15_akk";
let stand = {};
try { stand = JSON.parse(localStorage.getItem(KEY) || "{}"); } catch (e) { stand = {}; }
document.querySelectorAll("details.m15-akk").forEach(el => {
const k = el.dataset.akk;
if (k && Object.prototype.hasOwnProperty.call(stand, k)) el.open = !!stand[k];
el.addEventListener("toggle", () => {
stand[k] = el.open;
try { localStorage.setItem(KEY, JSON.stringify(stand)); } catch (e) { /* privater Modus */ }
});
});
}