Der Erklaerkasten auf jeder Seite ist weg

Filipe, mit dem Kasten im Bild: "das muss sofort weg. ueberall das ist
scheisse."

Entfernt, nicht ausgeblendet:
  - workspace/assets/js/erklaerung.js
  - server/workspace-erklaerung.js samt Router-Einbindung in index.js
  - server/pruef-erklaerung.mjs
  - der Stilblock in start.css
  - die Skript-Zeile auf allen 25 Seiten

AUSGEBLENDET WAERE KEIN ENTFERNEN. Der Weg haette weiter geantwortet,
das Skript waere weiter geladen worden, und beim naechsten Umbau waere
der Kasten irgendwo wieder aufgetaucht. Was weg soll, wird weggenommen.

NACHGEMESSEN STATT ANGENOMMEN:
  - kein Verweis auf die geloeschten Dateien mehr im Repo,
  - der Server startet ohne Fehler (frische Datenbank, Protokoll leer),
  - keine Reste (erkl__, erklaerung.js) in Seiten oder Stilvorlagen.

Vier andere Pruefungen nennen ebenfalls "Erklaerung" -- sie meinen
ANDERE: den Satz im Neu-Fenster des Chats, die Stufen-Seite, die
Rollenkarten. Die bleiben unberuehrt; nachgesehen, nicht vermutet.

pruef-workspace-seiten, pruef-css-klassen und pruef-lesbarkeit laufen
gruen. Die Zahl der Pruefungen sinkt um die der geloeschten Datei --
das ist hier richtig: Sie prueften etwas, das es nicht mehr gibt.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-15 12:52:13 +02:00
co-authored by Claude Opus 5
parent d76d9aa5da
commit d2210fdd77
36 changed files with 435 additions and 1236 deletions
-86
View File
@@ -1,86 +0,0 @@
/* =====================================================================
Die kurze Erklärung auf jeder Seite (14.09.2026)
Filipe: „ich will in jeder seite auch eine kleine detaillierte aber
schnelle erklärung kurz und knapps noch zu jeder seite."
---------------------------------------------------------------------
WARUM SIE OFFEN DASTEHT UND NICHT HINTER EINEM KLICK
„Schnell" war seine Bedingung. Eine Erklärung, die man erst
aufklappen muss, ist genau dann nicht da, wenn man sie braucht —
nämlich beim ersten Mal, wenn man noch nicht weiß, dass es sie gibt.
Drei kurze Zeilen kosten weniger Platz als ein Aufklapper kostet:
Aufmerksamkeit.
---------------------------------------------------------------------
WO SIE HINGEHÄNGT WIRD
Nach der Kopfzeile, wenn es eine gibt — sonst als erstes Element im
Inhalt. Fünf Seiten haben keine `.kopf-zeile` (Chat, Kalender,
Start, Team, Teamlage); ohne den zweiten Fall hätten ausgerechnet
die am häufigsten benutzten Seiten keine Erklärung bekommen, und
zwar lautlos.
---------------------------------------------------------------------
SIE BAUT NICHTS UM, WENN NICHTS DA IST
Kein Text zur Seite, keine Antwort, nicht angemeldet: dann entsteht
auch kein Kasten. Ein leerer Rahmen mit drei Überschriften wäre
schlechter als gar keiner — er sieht aus wie ein Fehler.
===================================================================== */
(() => {
const datei = (location.pathname.split('/').pop() || '').toLowerCase();
if (!/^[a-z0-9-]+\.html$/.test(datei)) return; // Anmeldeseiten u. ä.
const el = (t, k, text) => {
const n = document.createElement(t);
if (k) n.className = k;
if (text !== undefined) n.textContent = text;
return n;
};
/** Eine Zeile: Schild links, Satz rechts. */
function zeile(schild, satz) {
const z = el('div', 'erkl__zeile');
z.append(el('span', 'erkl__schild', schild));
z.append(el('span', 'erkl__satz', satz));
return z;
}
function zeichne(d) {
const kasten = el('section', 'erkl');
/* Ein Bereich mit Namen: Ein Vorleseprogramm sagt dadurch an, was
das hier ist, statt drei Wortpaare vorzulesen. */
kasten.setAttribute('aria-label', 'Kurze Erklärung zu dieser Seite');
kasten.append(zeile('Wofür', d.wofuer));
kasten.append(zeile('Du tust', d.tun));
if (d.merke) {
const z = zeile('Merke', d.merke);
z.dataset.merke = 'ja';
kasten.append(z);
}
if (Array.isArray(d.sichtbar) && d.sichtbar.length) {
/* DIESE ZEILE IST GERECHNET, NICHT GESCHRIEBEN -- sie kommt aus
derselben Rechtetafel wie die Schranke selbst. Deshalb darf
sie hier so bestimmt dastehen. */
kasten.append(zeile('Sieht', d.sichtbar.join(' · ')));
}
const kopf = document.querySelector('main .kopf-zeile');
if (kopf) { kopf.insertAdjacentElement('afterend', kasten); return; }
const inhalt = document.querySelector('main');
if (inhalt) inhalt.insertBefore(kasten, inhalt.firstElementChild);
}
(async () => {
try {
const a = await fetch('/workspace/api/erklaerung?seite=' + encodeURIComponent(datei),
{ credentials: 'same-origin' });
if (!a.ok) return; // 401/404: dann eben nicht
const d = await a.json();
if (d?.hat_text) zeichne(d);
} catch { /* ohne Erklärung ist die Seite vollständig benutzbar */ }
})();
})();