Das Licht folgt dem Zeiger - auf jeder Karte, und der Rand mit
Auf der Startseite gab es einen Lichtfleck unter dem Zeiger. Jetzt auf
JEDER Karte im ganzen Workspace -- und mit zwei Schichten statt einer:
der FLECK ein weicher Schein unter dem Zeiger, in der Farbe des
Bereichs (--ton). Eine Aufgabenkarte leuchtet orange, eine
Kalenderkarte tuerkis.
der RAND eine helle Stelle, die auf der KANTE mitwandert.
Der Rand ist der Teil, der den Unterschied macht. Er entsteht aus einem
Farbverlauf, von dem eine Maske nur den ein Pixel breiten Saum stehen
laesst: zwei Ebenen, eine ueber die Innenflaeche, eine ueber den ganzen
Kasten, und mask-composite: exclude laesst genau die Differenz uebrig --
den Rahmen. Dadurch leuchtet wirklich die Kante an der Stelle, an der
der Zeiger steht, statt eines Rechtecks, das so tut als ob.
Beides steckt in einem eingefuegten <span class="licht">. Ein eigenes
Element statt ::before/::after am Kasten selbst, weil die bei fast
allen Karten schon belegt sind (Akzentstreifen, Wasserzeichen) -- ein
Pseudo-Element doppelt zu benutzen geht nicht, und der Fehler faellt
erst auf, wenn eines von beiden verschwindet.
Kosten: EIN Zuhoerer fuer das ganze Dokument, gedrosselt auf einen
Bildaufbau, passiv angemeldet. Das Licht-Element wird beim ersten
Ueberfahren eingesetzt, nicht beim Laden -- Karten entstehen laufend
neu, wenn Listen sich aktualisieren. Ohne feinen Zeiger (Handy) und bei
"weniger Bewegung" laeuft gar nichts und es wird auch nichts eingefuegt.
pointerout feuert auch beim Wechsel zwischen Kindern INNERHALB einer
Karte. Ohne die Pruefung auf relatedTarget haette das Licht bei jeder
Bewegung ueber ein Wort hinweg geflackert.
DIE ALTE FASSUNG IN start.js IST WEG. Sie stehen zu lassen haette zwei
Zuhoerer auf denselben Bewegungen bedeutet -- doppelte Arbeit bei jedem
Zeigerzucken, und der Fehler waere erst aufgefallen, wenn jemand die
eine geaendert haette und sich nichts tat.
GEPRUEFT AN ECHTEN BILDPUNKTEN, nicht am Quelltext: Der Zeiger wird in
die Mitte einer Kachel gesetzt, dann wird die Helligkeit der Kante
direkt darueber gegen dieselbe Kante an der fernen Ecke gemessen.
Ergebnis 50 gegen 17. Geht die Maske jemals verloren, waere die ganze
Karte eingefaerbt und der Text unlesbar -- das faellt damit sofort auf.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -405,6 +405,50 @@ console.log("\n=== Das Licht folgt dem Zeiger");
|
||||
const kasten = await kachel.boundingBox();
|
||||
|
||||
const ruhe = await kachel.evaluate((k) => k.style.getPropertyValue("--mx") || "(Ruhelage)");
|
||||
|
||||
/* Seit dem 01.09.2026 gibt es zum Fleck auch einen RAND, der auf der
|
||||
Kante mitwandert. Er entsteht aus einem Verlauf, von dem eine Maske
|
||||
nur den Saum stehen laesst -- geht die Maske verloren, waere die
|
||||
ganze Karte eingefaerbt und der Text unlesbar. Deshalb wird hier
|
||||
nicht "sieht gut aus" geprueft, sondern an ECHTEN Bildpunkten
|
||||
gemessen, ob die Kante heller ist als die Mitte. */
|
||||
{
|
||||
await seite.mouse.move(kasten.x + kasten.width * 0.5, kasten.y + kasten.height * 0.5);
|
||||
await seite.waitForTimeout(450);
|
||||
const bild = await seite.screenshot({ type: "png" });
|
||||
const r = await seite.evaluate(async ({ b64, kasten }) => {
|
||||
const bild = new Image();
|
||||
bild.src = "data:image/png;base64," + b64;
|
||||
await bild.decode();
|
||||
const c = document.createElement("canvas");
|
||||
c.width = bild.width; c.height = bild.height;
|
||||
const g = c.getContext("2d");
|
||||
g.drawImage(bild, 0, 0);
|
||||
const skala = bild.width / window.innerWidth;
|
||||
const hell = (x, y) => {
|
||||
const p = g.getImageData(Math.round(x * skala), Math.round(y * skala), 1, 1).data;
|
||||
return 0.2126 * p[0] + 0.7152 * p[1] + 0.0722 * p[2];
|
||||
};
|
||||
/* Der Zeiger steht in der Mitte. Gemessen wird die Kante direkt
|
||||
darueber (dort muss der Rand leuchten) gegen dieselbe Kante an
|
||||
der weit entfernten Ecke (dort nicht). */
|
||||
return {
|
||||
licht: !!document.querySelector(".kachel .licht"),
|
||||
kanteNah: hell(kasten.x + kasten.width * 0.5, kasten.y + 1.5),
|
||||
kanteFern: hell(kasten.x + 3, kasten.y + kasten.height - 2),
|
||||
};
|
||||
}, { b64: bild.toString("base64"), kasten });
|
||||
|
||||
ok(r.licht, "die Karten haben ein Licht-Element bekommen");
|
||||
/* Die nahe Kante muss spuerbar heller sein als die ferne. Ohne die
|
||||
Maske waere die ganze Karte gleich hell -- der Unterschied ist
|
||||
genau der Nachweis, dass der Rand wirklich der Maus folgt. */
|
||||
ok(r.kanteNah > r.kanteFern + 8,
|
||||
`der Rand leuchtet dort, wo der Zeiger ist `
|
||||
+ `(nah ${r.kanteNah.toFixed(0)} gegen fern ${r.kanteFern.toFixed(0)})`);
|
||||
await seite.mouse.move(5, 5);
|
||||
await seite.waitForTimeout(400);
|
||||
}
|
||||
ok(ruhe === "(Ruhelage)", `ruhend keine eigene Position gesetzt (${ruhe})`);
|
||||
|
||||
await seite.mouse.move(kasten.x + kasten.width * 0.2, kasten.y + kasten.height * 0.3);
|
||||
|
||||
Reference in New Issue
Block a user