Zwei Befunde aus dem Handy-Lauf -- und eine Regel, die ihre eigene Ausnahme nicht kannte
Filipe hat die beiden breiten Sichtpruefungen freigegeben. pruef-handy
meldete vier Fehlschlaege, pruef-lesbarkeit war gruen.
BEIDE BEFUNDE WAREN NICHT VON MEINER AENDERUNG -- gemessen, nicht
vermutet: crew-index.html laedt weder kopf.js noch erklaerung.js, und
mein Commit hat dort nur die Versionsnummer angefasst. Die betroffene
Regel steht seit dem 27.08.2026 so da.
1. ZU KLEINE SCHRIFT AUF DER ZUGANGSWAND VON TEAM DOGI
`.marke` stand auf schmalen Bildschirmen auf .68rem = 10,88 px und
damit unter der Hausuntergrenze von 11,5 px -- betroffen waren die
Woerter "DogFather" und "Team Dogi". Das ist die erste Seite, die ein
neuer Modi ueberhaupt sieht, und sie wird mit dem Daumen bedient.
Jetzt .72rem = 11,52 px, dieselbe Hebung wie seinerzeit in heim.css.
Die Grundlinie in pruef-css-klassen wird MITGEZOGEN (43 -> 42):
Sonst duerfte der Fortschritt lautlos wieder verlorengehen, und eine
Grundlinie, die nur nach oben nachgibt, ist keine.
2. DIE BERUEHRZIEL-REGEL ZITIERTE WCAG 2.5.8, ABER NICHT IHRE AUSNAHME
Gemeldet wurden die zwei Verweise im Fliesstext der Treff-Regeln
("Der Treff", "Regeln & Hilfe", je 20 px hoch). 2.5.8 nimmt genau das
aber ausdruecklich aus: "Inline: The target is in a sentence or its
size is otherwise constrained by the line-height of non-target text."
Sie auf 24 px zu bringen hiesse, die Zeilenhoehe eines Absatzes zu
sprengen -- also einen Text kaputtzumachen, um eine Regel zu
erfuellen, die diesen Text gar nicht meint. Die Ausnahme ist eng
gefasst: nur <a>, nur wirklich inline, und nur wenn im selben Absatz
auch Text steht, der nicht zum Link gehoert. Ein allein stehender
Link bleibt ein Beruehrziel.
UND DIESE DATEI HATTE BIS HEUTE GAR KEINE GEGENPROBE. Sie konnte
also nie zeigen, dass sie ein zu kleines Ziel ueberhaupt bemerkt --
erst recht nicht, seit die Regel eine Ausnahme hat. Jetzt in beide
Richtungen: ein allein stehendes 20x20-Ziel MUSS auffallen, ein
gleich grosser Verweis im Satz darf es NICHT.
PRUEFUNGEN: pruef-handy 136 -> 138 (vier Fehlschlaege behoben, zwei
Gegenproben dazu), keine einzige weniger. pruef-lesbarkeit gruen
(12 s). pruef-css-klassen, pruef-erklaerung und pruef-neue-seiten nach
der gate.css-Aenderung noch einmal gelaufen, alle gruen.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+71
-3
@@ -221,13 +221,43 @@ const messen = () => ({
|
||||
/* 3. Beruehrziele. 24x24 CSS-Pixel ist das Mindestmass nach WCAG 2.2
|
||||
(2.5.8). Gemessen wird das Ziel selbst ODER sein umschliessender
|
||||
Bereich -- ein 16 px grosses Symbol in einem 44 px grossen Knopf
|
||||
ist in Ordnung. */
|
||||
klein: [...document.querySelectorAll("button, a[href], input, select, textarea, [role=button]")]
|
||||
ist in Ordnung.
|
||||
|
||||
LINKS IN EINEM SATZ SIND AUSGENOMMEN -- und zwar nicht, weil es
|
||||
bequemer ist, sondern weil 2.5.8 das selbst so sagt: "Inline: The
|
||||
target is in a sentence or its size is otherwise constrained by
|
||||
the line-height of non-target text."
|
||||
|
||||
Die Pruefung zitierte bis zum 14.09.2026 die Regel, aber nicht
|
||||
ihre Ausnahme. Gemeldet wurden dadurch die zwei Verweise im
|
||||
Fliesstext der Treff-Regeln ("Der Treff", "Regeln & Hilfe", je
|
||||
20 px hoch). Sie auf 24 px zu bringen hiesse, die Zeilenhoehe des
|
||||
Absatzes zu sprengen -- man wuerde also einen Text kaputtmachen,
|
||||
um eine Regel zu erfuellen, die diesen Text ausdruecklich nicht
|
||||
meint.
|
||||
|
||||
ENG GEFASST: Nur <a>, nur wirklich inline dargestellt, und nur
|
||||
wenn im selben Absatz auch Text steht, der NICHT zum Link gehoert.
|
||||
Ein allein stehender Link bleibt ein Beruehrziel. */
|
||||
klein: (() => {
|
||||
const imSatz = (e) => {
|
||||
if (e.tagName !== "A") return false;
|
||||
if (!getComputedStyle(e).display.startsWith("inline")) return false;
|
||||
const eltern = e.parentElement;
|
||||
if (!eltern) return false;
|
||||
const daneben = [...eltern.childNodes]
|
||||
.filter((n) => n !== e)
|
||||
.map((n) => (n.textContent || "").trim())
|
||||
.join(" ").trim();
|
||||
return daneben.length >= 10; // das ist der Satz drumherum
|
||||
};
|
||||
return [...document.querySelectorAll("button, a[href], input, select, textarea, [role=button]")]
|
||||
.filter((e) => {
|
||||
const r = e.getBoundingClientRect();
|
||||
if (r.width < 1 || r.height < 1) return false;
|
||||
const st = getComputedStyle(e);
|
||||
if (st.display === "none" || st.visibility === "hidden") return false;
|
||||
if (imSatz(e)) return false;
|
||||
return r.width < 24 || r.height < 24;
|
||||
})
|
||||
.map((e) => {
|
||||
@@ -235,7 +265,8 @@ const messen = () => ({
|
||||
return `${e.tagName}"${(e.textContent || e.getAttribute("aria-label") || "").trim().slice(0, 14)}" `
|
||||
+ `${Math.round(r.width)}x${Math.round(r.height)}`;
|
||||
})
|
||||
.slice(0, 5),
|
||||
.slice(0, 5);
|
||||
})(),
|
||||
|
||||
/* 4. Ueberlappende Bedienelemente. Zwei Knoepfe, die sich decken,
|
||||
heissen: Man trifft den falschen. Geprueft wird der Mittelpunkt --
|
||||
@@ -620,6 +651,43 @@ ok(mitUmschalter.size >= 1 && fremdGeprueft === KOPF_GERAETE.length * mitUmschal
|
||||
ok(weckerGeprueft >= KOPF_GERAETE.length,
|
||||
`das Weckerfeld wurde ${weckerGeprueft}-mal wirklich gemessen`);
|
||||
|
||||
/* =====================================================================
|
||||
GEGENPROBE ZUR BERUEHRZIEL-REGEL (14.09.2026)
|
||||
|
||||
Seit heute hat die Regel eine Ausnahme (Links im Satz, WCAG 2.5.8).
|
||||
Eine Regel mit Ausnahme braucht den Beweis in BEIDE Richtungen --
|
||||
sonst laesst sich nicht unterscheiden, ob sie nichts findet, weil
|
||||
nichts da ist, oder weil die Ausnahme alles verschluckt.
|
||||
|
||||
Diese Datei hatte bis heute ueberhaupt keine Gegenprobe. Sie konnte
|
||||
also nie zeigen, dass sie ein zu kleines Ziel ueberhaupt bemerkt.
|
||||
===================================================================== */
|
||||
console.log("\n=== Gegenprobe zur Beruehrziel-Regel ===");
|
||||
{
|
||||
const kontext = await browser.newContext({
|
||||
viewport: { width: 390, height: 844 }, isMobile: true, hasTouch: true });
|
||||
const seite = await kontext.newPage();
|
||||
await seite.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
|
||||
await seite.evaluate(() => {
|
||||
const k = document.createElement("div");
|
||||
k.id = "gegenprobe";
|
||||
/* Zweimal dieselbe Hoehe: einmal allein stehend, einmal im Satz. */
|
||||
k.innerHTML =
|
||||
"<a href='#a' id='g-allein' style='display:block;width:20px;height:20px'>xx</a>"
|
||||
+ "<p>Das hier ist ein ganz normaler Satz mit einem "
|
||||
+ "<a href='#b' id='g-satz' style='font-size:13px;line-height:20px'>Verweis darin</a>"
|
||||
+ " und noch etwas Text dahinter.</p>";
|
||||
document.body.append(k);
|
||||
});
|
||||
const r = await seite.evaluate(messen);
|
||||
const namen = r.klein.join(" | ");
|
||||
ok(/20x20/.test(namen),
|
||||
`ein allein stehendes 20x20-Ziel wird erkannt (${namen || "nichts gefunden"})`);
|
||||
ok(!/Verweis darin/.test(namen),
|
||||
"ein gleich grosser Verweis IM SATZ wird zu Recht nicht gemeldet (WCAG 2.5.8)");
|
||||
await seite.evaluate(() => document.getElementById("gegenprobe")?.remove());
|
||||
await kontext.close();
|
||||
}
|
||||
await browser.close();
|
||||
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||
console.log(fehler ? `\n${fehler} Prüfung(en) fehlgeschlagen.` : "\nAlles in Ordnung.");
|
||||
|
||||
Reference in New Issue
Block a user