diff --git a/server/pruef-teamlage-karten.mjs b/server/pruef-teamlage-karten.mjs index 3a58dcf2..1aa4cb2e 100644 --- a/server/pruef-teamlage-karten.mjs +++ b/server/pruef-teamlage-karten.mjs @@ -406,6 +406,130 @@ ok(schmal.karten > 0 && schmal.ueber.length === 0, ok(schmal.karten > 0 && schmal.breiteste <= schmal.sichtbar, `die breiteste Karte passt (${schmal.breiteste} von ${schmal.sichtbar})`); +/* ======================================================================= + DIE BEIDEN HAENDE TRAGEN IHRE FARBE (23.09.2026) + + Filipe, mit dem Bildschirmfoto: „die farbe der kachel soll die + gleiche sein wie die farbe die der text linke hand hat, aber mach es + richtig knallig so wie die farben bei den modis und linke hand. + soll schoen auffallen bitte." + + DREI FRAGEN, UND KEINE DAVON LAESST SICH AM QUELLTEXT BEANTWORTEN: + + 1. Hat die Karte DIESELBE Farbe wie ihre Marke? („die gleiche") + 2. Ist sie kraeftig genug, um aufzufallen? („richtig knallig") + 3. Kann man den Text darauf noch lesen? -- das ist die Bedingung, + unter der 1 und 2 ueberhaupt gelten duerfen. + + GEMESSEN WIRD AM BILDPUNKT, nicht an der Stilvorlage. Eine Regel + kann richtig dastehen und von einer spaeteren ueberschrieben sein; + was am Ende leuchtet, sagt nur der gezeichnete Bildschirm. + + DIE ERSTE FASSUNG DIESER MESSUNG WAR FALSCH, und das gehoert + hierhin: Sie las `rgb(13, 8, 23)` und `color(srgb 0.87 0.71 0.96)` + mit derselben Rechnung. Die zweite Schreibweise zaehlt aber in + 0..1, nicht in 0..255 -- die helle Rollenmarke kam damit auf einen + Kontrast von 1,09. Eine Zahl, die aussieht wie ein Befund und keiner + ist. Deshalb steht die Umrechnung hier ausgeschrieben. + ======================================================================= */ +{ + await seite.setViewportSize({ width: 1280, height: 1200 }); + await seite.waitForTimeout(400); + const farben = await seite.evaluate(() => { + const zahl = (c) => { const x = c / 255; return x <= 0.04045 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; }; + const leucht = (r) => 0.2126 * zahl(r[0]) + 0.7152 * zahl(r[1]) + 0.0722 * zahl(r[2]); + /* ZWEI SCHREIBWEISEN, ZWEI ZAHLENBEREICHE -- siehe oben. */ + const lies = (t) => { + const roh = (String(t).match(/[\d.]+/g) || []).slice(0, 3).map(Number); + if (roh.length < 3) return [0, 0, 0]; + return /color\(/.test(String(t)) ? roh.map((x) => x * 255) : roh; + }; + const kontrast = (a2, b2) => { + const la = leucht(lies(a2)), lb = leucht(lies(b2)); + return Math.round(((Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05)) * 100) / 100; + }; + /* Der DECKENDE Grund unter einem Element -- eine durchsichtige + Toenung daraufzurechnen waere geraten. */ + const grundVon = (el) => { + let e = el; + while (e) { + const f = getComputedStyle(e).backgroundColor; + const teile = (String(f).match(/[\d.]+/g) || []); + if (teile.length >= 3 && (teile[3] === undefined || Number(teile[3]) > 0.85)) return f; + e = e.parentElement; + } + return "rgb(0,0,0)"; + }; + const mess = (rolle) => { + const k = [...document.querySelectorAll(".tperson")].find((x) => x.dataset.rolle === rolle); + if (!k) return null; + const name = k.querySelector(".tperson__name"); + const leise = k.querySelector(".tperson__zuletzt"); + const marke = k.querySelector(".tmerkmal--rolle"); + const grund = grundVon(k); + const stil = getComputedStyle(k); + return { + /* Der Ton, den die Karte fuehrt, und der Ton ihrer Marke -- + die Frage "die gleiche Farbe?" ist genau dieser Vergleich. */ + kartenton: stil.getPropertyValue("--kartenton").trim(), + markenton: marke ? getComputedStyle(marke).getPropertyValue("--rm").trim() : "", + /* Traegt die FLAECHE Farbe, oder nur die Kante? "knallig" + heisst genau das: Der Verlauf muss im Bild ankommen. */ + schichten: (stil.backgroundImage.match(/gradient/g) || []).length, + toenung: stil.backgroundImage.includes("34%") || /oklab|color\(/.test(stil.backgroundImage), + leiste: getComputedStyle(k, "::before").width, + nameKontrast: name ? kontrast(getComputedStyle(name).color, grund) : null, + leiseKontrast: leise ? kontrast(getComputedStyle(leise).color, grund) : null, + markeKontrast: marke + ? kontrast(getComputedStyle(marke).color, getComputedStyle(marke).backgroundColor) : null, + grund, + }; + }; + return { hand: mess("hand"), linke: mess("linke"), modi: mess("modi") }; + }); + + /* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Faende der Wahlausdruck keine + Karte, waere `farben.linke` null -- und jede Aussage darueber + waere gruen, ohne etwas angesehen zu haben. */ + ok(!!farben.hand && !!farben.linke, + "beide Haende haben eine Karte auf dem Bildschirm"); + + /* ---- 1. „die gleiche Farbe wie der Text Linke Hand" ------------- */ + ok(!!farben.linke && farben.linke.kartenton !== "" + && farben.linke.kartenton === farben.linke.markenton, + `die Karte der linken Hand fuehrt den Ton ihrer Marke (${farben.linke?.kartenton} = ${farben.linke?.markenton})`); + ok(!!farben.hand && farben.hand.kartenton === farben.hand.markenton, + `dasselbe bei der rechten Hand (${farben.hand?.kartenton})`); + /* Und es sind ZWEI Toene, nicht einer. Waeren beide gleich, waere + die Zeile darueber trotzdem gruen -- und die Unterscheidung weg. */ + ok(!!farben.hand && !!farben.linke + && farben.hand.kartenton !== farben.linke.kartenton, + "und es sind zwei verschiedene Toene — Gold und Lila"); + + /* ---- 2. „richtig knallig" --------------------------------------- */ + ok(!!farben.linke && farben.linke.schichten >= 2, + `die Farbe liegt in der FLAECHE, nicht nur an der Kante (${farben.linke?.schichten} Verlaeufe)`); + ok(!!farben.hand && !!farben.linke + && farben.hand.schichten === farben.linke.schichten, + "beide Haende gleich stark — der Unterschied ist der Ton, nicht die Wirkung"); + ok(farben.linke?.leiste === "3px" && farben.hand?.leiste === "3px", + `beide tragen die Leiste an der linken Kante (${farben.linke?.leiste} / ${farben.hand?.leiste})`); + /* GEGENPROBE: Eine Modi-Karte hat das NICHT. Ohne sie bewiese alles + oben nur, dass jede Karte so aussieht -- und dann faellt keine auf. */ + ok(!!farben.modi && farben.modi.leiste !== "3px", + `Gegenprobe: eine Modi-Karte traegt die Leiste nicht (${farben.modi?.leiste})`); + + /* ---- 3. Und man kann es lesen ----------------------------------- */ + for (const [wer, m] of [["linke Hand", farben.linke], ["rechte Hand", farben.hand]]) { + ok(!!m && m.nameKontrast >= 4.5, + `${wer}: der Name steht mit ${m?.nameKontrast}:1 auf der Flaeche (verlangt 4,5)`); + ok(!!m && m.leiseKontrast >= 4.5, + `${wer}: auch das Kleingedruckte (${m?.leiseKontrast}:1)`); + ok(!!m && m.markeKontrast >= 4.5, + `${wer}: und die Rollenmarke auf ihrem eigenen Grund (${m?.markeKontrast}:1)`); + } +} + ok(meckern.length === 0, `der Browser meldet nichts (${meckern.slice(0, 2).join(" | ") || "still"})`); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 8b4e088f..f3869d62 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,15 +16,15 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - +