Kampagnen-Kacheln: gegliederte Texte, Geschenke mit Preis, aufklappbar

Filipe, mit einem Bildschirmfoto des Regelblocks: "man soll die titel
in den texten besser erkennen und sehen was zu was passt. ich will
auch dass man sieht welche geschenke bei dem event zaehlen und so.
ich will alle informationen die moeglich sind wenn man den link
hochlaedt. ... auch wenn man teilt soll es einfach perfekt sein. man
soll alle infos sehen die man braucht. die kacheln von den events
soll auch nicht so lang sein, die soll man aufklappen koennen. genau
wie eine trennung fuer heute, letzte woche letzten monat und so."

DER FEHLER LAG NICHT IM TEXT, SONDERN IN SEINER ANZEIGE. Im Feld
stand die ganze Zeit eine Gliederung -- Hinweise mit "* ", eine
Ueberschrift mit Untertitel hinter einem Gedankenstrich, Absaetze
ohne Zeichen, Aufzaehlungen mit "- ". Die Kachel hat daraus mit
punkteAusText() EINE flache Liste gemacht: jede Zeile derselbe
Strich, alle gleich gross.

  gliederung()      liest die Gliederung, die schon dasteht, statt
                    den Text umzuschreiben. Die beiden Kampagnen, die
                    heute in der Datenbank liegen, sehen dadurch
                    sofort richtig aus -- ohne Umstellung.
  Geschenke         kommen aus der gelesenen LISTE, nicht aus dem
                    Text, und stehen OHNE Aufklappen auf der Kachel.
  Aufklappen        alles Uebrige hinter einem Druck: gemessen 555 px
                    weniger je Kachel bei Gipfelstuermer.
  Gruppen           je Spalte laeuft / kommt / vorbei, Vergangenes
                    nach diese Woche, dieser Monat, aelter.

NEU GELESEN (stand in allen vier gespeicherten Seiten und wurde nie
angesehen): die Rangliste mit ihren Gruppen ("Superstars" bis
"5. Liga", bei Glow Up "Team Glow"/"Team Shine"), die Beschreibung je
Missionsgruppe, der Steckbrief (Kurznummer, Markt, Sprache, Zone),
der zweite Bildbaustein, und Ueberschriften INNERHALB der Klapptexte
-- "WELCHE LIGA BIN ICH?" hat jetzt sechs eingerueckte Unterpunkte
statt zwoelf gleichrangiger Zeilen.

EVENT_TEXT_MAX 6000 -> 20000. Der Regeltext von Gipfelstuermer ist
7679 Zeichen lang; es fielen bisher jedes Mal rund 1600 Zeichen
echter Inhalt weg. Die Zahl steht jetzt an EINER Stelle.

TEILEN: Was die KAMPAGNE sagt, geht hinaus (Aufgaben, Geschenke,
Regeln) -- wer WIR sind, nicht (Name, Rolle, Haus, Kampagnennummer,
Steckbrief). Und keine Hinweiszeile: "Die Preise konnten nicht
gelesen werden -- bitte nachtragen" ist eine Notiz an DogFather und
hat auf einer Seite, die er in Discord postet, nichts zu suchen.

BERICHTIGT, WEIL NACHGEMESSEN:
  - Number(null) ist 0 und 0 ist endlich -- "Feuerwerk" bekam an drei
    Stellen "0 Coins" angeschrieben, also eine falsche Preisangabe.
  - Ein Kommentar im Leser behauptete, der Wertungszeitraum weiche
    vom Kampagnenzeitraum ab. Nachgemessen ist er in allen drei
    Seiten mit Rangliste auf die Millisekunde gleich; ich hatte zwei
    verschiedene Kampagnen verglichen.
  - bild-kampagne.mjs verlangte "jede Kachel traegt den Ton ihrer
    Seite" und war damit seit dem 07.10. rot, weil an dem Tag bewusst
    das Gegenteil entschieden wurde (Zustandston, Seitenkante). Nicht
    aufgefallen, weil nach dem Lauf nur die Zahl der MESSUNGEN notiert
    wurde, nicht die der FEHLER.
  - .kv-seite > .eintrag-karte wird .kv-seite .eintrag-karte: Die
    Karten haengen durch die Gruppen eine Ebene tiefer. Das waere der
    fuenfte Direktkind-Selektor gewesen, der nach einem Umbau still
    ausfaellt -- diesmal vorher gesehen.

GEPRUEFT: 186 (lesen, +58), 148 (Route/Teilen, +25), 158 (Kachel,
+64), 67 (Agentur, +5), 67 Messungen (Bild, +14), dazu struktur,
css-klassen, zeichen, deutsche-texte, tippziele, lesbarkeit und
haus-trennung (107, unveraendert). Sechs Gegenproben: alle sechs
Sabotagen werden bemerkt, alle Dateien byte-gleich wiederhergestellt.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-07 22:39:03 +02:00
co-authored by Claude Opus 5
parent d7720a3687
commit cadab24a5f
58 changed files with 3950 additions and 798 deletions
+67 -3
View File
@@ -726,7 +726,33 @@ melde("\n=== Die Kachel ===");
marke: k.querySelector(".ev-noch")?.textContent.trim(),
spanne: k.querySelector(".ev-spanne")?.textContent.trim(),
schilder: [...k.querySelectorAll(".ev-block__schild")].map((s) => s.textContent.trim()),
/* `.ev-punkt__text` SIND DIE AUFGABEN, `.ev-zeile__text` DIE
REGELN (07.10.2026). Bis dahin war beides dieselbe flache
Liste; seit der Gliederung sind es zwei Sorten Zeile, und
die Regeln haben kein Kästchen mehr davor. Gelesen werden
beide -- und getrennt, damit die Prüfung unten sagen kann,
WELCHE Sorte fehlt, statt nur „einer von zweien fehlt". */
texte: [...k.querySelectorAll(".ev-punkt__text")].map((s) => s.textContent.trim()),
/* ZEILEN **UND** ABSAETZE. Eine Regelzeile MIT
Aufzaehlungszeichen wird ein `.ev-zeile`, eine OHNE ein
`.ev-absatz` -- und das ist richtig so: Sonst wuerden die
Prosa-Absaetze einer Kampagnenseite („LIVE Glow Up ist
eine exklusive 4-woechige Challenge ...") alle zu
Aufzaehlungspunkten, also wieder zu der flachen Liste, die
am 07.10.2026 abgeschafft wurde.
Dieses Testevent wird ueber die Schnittstelle angelegt,
ohne Zeichen davor. Der Zeileneditor im Formular setzt sie
sonst selbst (geprueft in pruef-eventkarte.mjs:
„gleichmaessig gesetzte Zeichen"), im echten Betrieb ist
also meist die erste Form zu sehen. Gemessen werden beide,
getrennt -- so sagt die Prüfung, WELCHE Form herauskam. */
regelzeilen: [...k.querySelectorAll(".ev-zeile__text")].map((s) => s.textContent.trim()),
regelabsaetze: [...k.querySelectorAll(".ev-absatz")].map((s) => s.textContent.trim()),
/* Und ob die Regeln hinter dem Aufklappen liegen -- das ist
der Grund, warum die Kachel kürzer geworden ist. */
klappZu: k.querySelector(".ev-mehr__inhalt")?.hidden ?? null,
klappWort: k.querySelector(".ev-mehr__wort")?.textContent.trim() || null,
};
});
ok(!!event, "die Event-Karte Sommer-Aktion steht auf der Seite");
@@ -736,10 +762,48 @@ melde("\n=== Die Kachel ===");
ok(/^(noch \d+ Tage?|heute ist der letzte Tag)$/.test(event?.marke || ""),
`der Zustand steht als WORT da, nicht nur als Farbe ("${event?.marke}")`);
ok(/–/.test(event?.spanne || ""), `und der Zeitraum als Spanne ("${event?.spanne}")`);
ok(event?.schilder.join(",") === "Aufgaben,Regeln",
/* „Regeln & Infos" SEIT DEM 07.10.2026. Der Block trägt nicht
mehr nur die Regeln, sondern die ganze Gliederung der
Kampagnenseite -- Zeitplan, Rangliste, Teilnahme. „Regeln"
allein wäre dafür zu wenig gesagt. */
ok(event?.schilder.join(",") === "Aufgaben,Regeln & Infos",
`beide Bloecke sind beschriftet (${event?.schilder.join(", ")})`);
ok(event?.texte.includes("1 Punkt je Live-Stunde") && event?.texte.includes("Nur eigenes Konto"),
`und tragen wirklich ihren Inhalt (${JSON.stringify(event?.texte)})`);
ok(event?.texte.includes("1 Punkt je Live-Stunde"),
`die Aufgabe steht als abhakbarer Punkt da (${JSON.stringify(event?.texte)})`);
/* OHNE AUFZAEHLUNGSZEICHEN GETIPPT -> ABSATZ. Begruendung oben
bei der Messung. Geprueft wird, dass die Regel ANKOMMT, und
daneben, in welcher Form -- ein „irgendwo steht es" waere
auch dann gruen, wenn die Gliederung alles in einen Topf
wirft. */
ok(event?.regelabsaetze.includes("Nur eigenes Konto")
|| event?.regelzeilen.includes("Nur eigenes Konto"),
`die Regel kommt in der Gliederung an (Zeilen `
+ `${JSON.stringify(event?.regelzeilen)}, Absaetze `
+ `${JSON.stringify(event?.regelabsaetze)})`);
ok(event?.regelabsaetze.includes("Nur eigenes Konto"),
" und zwar als Absatz, weil kein Aufzaehlungszeichen davorstand");
/* GEGENPROBE: Sie steht NICHT zwischen den Aufgaben. Ohne sie
waere unbelegt, dass Aufgaben und Regeln getrennt bleiben --
und genau das war der Mangel im Bildschirmfoto vom
07.10.2026. */
ok(!event?.texte.includes("Nur eigenes Konto"),
"und nicht zwischen den abhakbaren Aufgaben");
/* ---- UND DIE REGELN LIEGEN HINTER EINEM DRUCK (07.10.2026) --
Filipe: „die kacheln von den events soll auch nicht so lang
sein, die soll man aufklappen koennen." Hier wird nur geprüft,
DASS es so ist; wie viel Höhe das spart, misst
pruef-eventkarte.mjs in Abschnitt 4b.
DIE ZEILE DARÜBER BLEIBT TROTZDEM GÜLTIG: `hidden` nimmt ein
Element nicht aus dem Baum, der Inhalt ist also vorhanden und
nur zugeklappt. Genau das soll es sein -- verborgen, nicht
verloren. */
ok(event?.klappZu === true,
`die Gliederung steht zugeklappt da (${event?.klappZu})`);
ok(event?.klappWort === "Alle Infos",
`und der Knopf dazu ist beschriftet ("${event?.klappWort}")`);
/* GEGENPROBE dazu: Eine Karte, die KEIN Event ist, darf nichts davon
haben. Sonst bewiese der Block oben nur, dass die Elemente