Sechs Wuensche: Hintergruende, Knopfverteilung, Universum, Uhrkoepfe, Knallrot

--- screen3 + screen1: die Hintergruende draengeln nicht mehr ---

"die hintergrunde sollen ueberall so sein dass die sich nicht in den
vordergrund draengeln." / "mach den hintergrund von dieser kachel
dunkler, so dass die die kacheln drin viel mehr auffallen."

`--raster` stand auf .26 Deckkraft -- auf dunkler Flaeche kein Hauch
mehr, sondern ein gezeichnetes Gitter. Im Tagdialog lief es sichtbar
durch die Ueberschrift, in den Sammelkacheln stand es VOR den Karten
darin. Jetzt .09: Man sieht eine Struktur, man zaehlt keine Linien.
Eine Zahl fuer das ganze Haus -- sie steht einmal in module.css und
wird an fuenf Stellen benutzt.

Die Anlasskachel im Kalender lag mit rgba(19,26,38,.88) auf demselben
Helligkeitsniveau wie die Karten darin: keine Vitrine, sondern eine
dritte Flaeche gleicher Lautstaerke. Jetzt fast schwarz. An den Karten
musste dafuer nichts geaendert werden -- der Abstand entsteht von
selbst.

--- screen2: ein Knopf wandert nach links ---

"eins von diesen buttons soll links bei dem anderen kreis sein."

Die GLOCKE geht nach links zum Ring, der WECKER bleibt rechts bei der
Uhr. Das ist nicht ausgewuerfelt: Der Wecker ist eine Uhrzeit. Die
Glocke entscheidet, ob man ueberhaupt etwas ueber sein Team erfaehrt --
und der Ring links zeigt genau das.

Die Kachel ist damit spiegelsymmetrisch belegt: 48 px Knopf + 14 px
Abstand + 248 px Instrument auf beiden Seiten. Genau das rechnet
`--spalte`. Die Zentrierung des Rings ist weggefallen -- sie war noetig,
solange er allein in einer fuer Instrument PLUS Knopf bemessenen Spalte
stand. Der reservierte Platz schrumpft von 104 auf 48 px je Seite; die
Begruendung fuer das Reservieren bleibt: Ein Platz, der erst mit der
Antwort entsteht, laesst die Zeile springen.

--- screen4: zwei Chilis und zwei Huskys dazu ---

"setz in den hintergrund noch 1-2 peperonis und dan das logo von
dogfather, also nur den husky."

DER HUSKY IST EINE MASKE, KEIN BILD. Die Datei ist schwarz-weiss und
freigestellt (nachgemessen: 49 % durchsichtig). Als Hintergrundbild bei
15 % verschwaenden die schwarzen Flaechen im dunklen Grund und uebrig
blieben die hellen -- ein zerrissener Umriss, kein Hund. Als Maske
ueber einer Farbflaeche wird daraus eine geschlossene Silhouette in
DogFathers Babyblau. Im Universum schweben jetzt beide Marken in ihren
beiden Farben: sieben Chilis rot, zwei Huskys blau.

--- screen5: die Punkte sind ersetzt, das letzte Glied leuchtet ---

"ich will dass du die punkte ersetzt und immer der letzte soll mehr
strahlen oder so." / "alles ist mega ausser die stunden muss du noch
perfektionnieren."

DIE DREI UMLAUFENDEN PERLEN SIND WEG -- samt 60 Zeilen Rechnung. Sie
waren ein zweites Ding an einer zweiten Stelle: eigene Uhr ab dem
ersten Takt (weil die volle Unixzeit `rotate(1.07333e+10deg)` ergab),
eigener Startwinkel je Bahn, drei Winkel, die die kleineren Einheiten
anteilig mittragen mussten. All das war noetig, WEIL der Kopf neben der
Reihe herlief statt Teil von ihr zu sein. Genau deshalb trugen sie am
08.09. noch die alten Farben, als die Bahnen getauscht wurden.

Jetzt zeichnet eine zweite SVG-Lage genau EIN Glied heller -- dasselbe,
das die Reihe darunter zuletzt gesetzt hat, aus denselben Zahlen. Sie
kann gar nicht danebenstehen. Heller statt groesser: Waere der Kopf
groesser, waere er ein Fremdkoerper in der Reihe.

DIE STUNDEN WAREN BREITER ALS LANG -- 5,5 lang bei 7 breit, also 0,79:1.
Ein Segment, das breiter ist als lang, liest sich als Klotz quer auf
der Bahn statt als Balken entlang. Und weil die Kantenlage nur 0,4
versetzt ist, lief der 0,9 breite Lichtstrich MITTEN DURCH jeden Balken
statt an seiner Kante. Jetzt 10 lang bei 5,8 breit (1,7:1), und der
Kantenversatz ist nach Bandbreite gestaffelt: (Breite - 0,9) / 2, also
0,75 / 1,65 / 2,05 zusaetzlich zur Gruppe.

--- screen6: die Scout-Pipeline wird knallrot ---

"die farbe von dieser kategorie soll knall rot sein."

Die anderen zwanzig Kachelfarben sind gerechnet (OKLab, groesstmoeglicher
Abstand). Diese eine ist gewuenscht -- und wurde deshalb GEGEN den Satz
geprueft statt eingetragen: Der engste vorhandene Abstand liegt bei
0,0973. #ff1f2e kommt seinem naechsten Nachbarn auf 0,1228 nahe, ist
also weiter entfernt als das engste vorhandene Paar. Kontrast 5,01:1
(noetig 4,5). Von sechs geprueften Rottoenen der mit dem groessten
Abstand UND genug Kontrast.

tools/kachel-farben.mjs weiss jetzt davon: Ein kuenftiger Lauf wuerde
wieder Rosa vorschlagen, und das waere eine stille Ruecknahme einer
ausdruecklichen Entscheidung.

--- Ein Messfehler, der festgehalten gehoert ---

Beim Pruefen von screen4 meldete meine Foto-Methode vier Beschriftungen
unter 4,5:1 -- bei einem Verlust von 0,00 bis 0,15 durch das Universum.
Dass die Ursache nicht das Universum sein konnte, stand damit schon in
den Zahlen. Exakt gerechnet (Vordergrundfarbe gegen die tatsaechliche
Flaeche darunter) liegen dieselben Texte bei 9,13:1 bis 10,76:1.

Die Foto-Methode mittelt ueber alle helleren Bildpunkte, und bei
duenner Grossbuchstabenschrift ist die Haelfte davon halb
ausgeleuchtete Kantenpunkte. Fuer grosse Schrift taugt sie, fuer kleine
Versalien meldet sie systematisch zu wenig. Haette ich ihr geglaubt,
haette ich vier Farben "repariert", die in Ordnung sind.

Geprueft: pruef-start-ansicht, pruef-css-klassen, pruef-kalender,
pruef-buehne, pruef-handy, pruef-workspace-seiten, pruef-tagesruf --
alle in Ordnung. Dazu Ring und Uhr auf 248/248 nachgemessen, die
Kopf-Muster gegen die Uhrzeit nachgerechnet (01:24:59 -> Sekunde bei
281,115, Minute bei 96,76, Stunde bei 16,493) und die Kachelfarbe gegen
alle zwanzig anderen in OKLab geprueft.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-09 01:33:59 +02:00
co-authored by Claude Opus 5
parent ef6bf0d011
commit cccafd2c31
27 changed files with 574 additions and 333 deletions
+20 -2
View File
@@ -189,7 +189,21 @@
einer umgezogen ist, wäre keine Verbesserung. Und weil die
Kopfleiste am 06.09. schon einmal an einem sechsten Element
zerbrochen ist, wird sie hier nebenbei um eines leichter. */
const platz = document.getElementById('glocke-platz');
/* SEIT DEM 09.09.2026 GIBT ES ZWEI PLAETZE (screen2).
Die Glocke geht nach LINKS neben den Ring, der Tagesruf bleibt
rechts neben der Uhr. Welcher wohin, folgt der Bedeutung: Der
Wecker ist eine Uhrzeit und gehoert zur Uhr; die Glocke
entscheidet, ob man ueberhaupt etwas ueber sein Team erfaehrt --
und der Ring links zeigt genau das.
Gibt es den linken Platz nicht (jede Seite ausser der
Startseite), faellt die Glocke wie bisher auf den rechten
zurueck und von dort auf die Kopfleiste. Zwei Rueckfaelle, kein
Sonderfall: Ein Knopf, der auf zwoelf Seiten verschwindet, weil
er auf einer umgezogen ist, waere keine Verbesserung. */
const platzLinks = document.getElementById('glocke-platz-links');
const platz = platzLinks || document.getElementById('glocke-platz');
const kopf = platz || document.querySelector('.kopfleiste__rechts');
if (!kopf || document.getElementById('glocke')) return;
@@ -245,7 +259,11 @@
}
zeichnen();
if (platz) await tagesrufBauen(platz);
/* Der Tagesruf gehoert IMMER an den rechten Platz -- auch wenn die
Glocke links sitzt. `platz` zeigt jetzt auf den linken, deshalb
wird der rechte hier eigens geholt. */
const platzRechts = document.getElementById('glocke-platz');
if (platzRechts) await tagesrufBauen(platzRechts);
}
/* =====================================================================
+64 -60
View File
@@ -375,9 +375,10 @@
`data-ring`; einzeln gepflegte Verweise waeren drei Stellen, an
denen man eine vergessen kann -- und ein Schatten, der stehen
bleibt, sieht sofort kaputt aus. */
const lagen = {};
const lagen = {}, koepfe = {};
for (const welcher of ['sekunde', 'minute', 'stunde']) {
lagen[welcher] = [...document.querySelectorAll(`[data-ring="${welcher}"]`)];
koepfe[welcher] = document.querySelector(`[data-kopf="${welcher}"]`);
}
/* DIE SEKUNDE IST EINE PUNKTREIHE (08.09.2026).
@@ -402,7 +403,26 @@
und Stunde BALKEN -- je langsamer, desto laenger das Glied. So
liest man die drei auch ohne Farbe auseinander. */
const GLIEDER = { sekunde: 60, minute: 60, stunde: 12 };
const GLIED_LAENGE = { sekunde: 0.01, minute: 1.7, stunde: 5.5 };
/* DIE STUNDE WAR BREITER ALS LANG (behoben 09.09.2026, screen5).
Filipe: "alles ist mega ausser die stunden muss du noch
perfektionnieren."
Nachgemessen war das der Grund: Ein Stundenglied war 5,5 lang
und 7 breit. Ein Segment, das breiter ist als lang, liest sich
nicht als Balken auf einer Bahn, sondern als Klotz quer darauf --
und weil die Kantenlage 0,4 nach oben versetzt ist, lief
zusaetzlich ein heller Strich mitten hindurch statt an der
Oberkante entlang.
Jetzt 10 lang bei 5,8 breit. Das Verhaeltnis ist damit 1,7:1
statt 0,79:1 -- aus dem Klotz wird ein Balken, und der helle
Strich sitzt wieder da, wo er hingehoert: auf der Kante.
Die Staffelung bleibt eindeutig: Punkt (0,01), kurzer Balken
(1,7), langer Balken (10). Je langsamer die Bahn, desto laenger
das Glied. */
const GLIED_LAENGE = { sekunde: 0.01, minute: 1.7, stunde: 10 };
const punktMuster = (U, n, gesamt, laenge) => {
const schritt = U / gesamt;
@@ -467,10 +487,32 @@
el.style.strokeDashoffset = '0';
}
};
/* DAS LETZTE GLIED, EINZELN (09.09.2026, screen5).
/* Der Nullpunkt der eigenen Uhr -- siehe unten bei den Koepfen. */
let nullpunkt = null, startWinkel = 0, minStart = 0, stdStart = 0, sekStart = 0;
Filipe: "immer der letzte soll mehr strahlen oder so."
Vorher liefen dafuer drei HTML-Perlen auf eigenen Bahnen -- mit
einer EIGENEN Winkelrechnung. Zwei Rechnungen fuer denselben
Ort sind zwei Gelegenheiten auseinanderzulaufen, und genau das
ist am 08.09. passiert: Die Bahnen tauschten die Farben, die
Perlen nicht.
Jetzt zeichnet eine zweite Lage GENAU EIN Glied, aus denselben
Zahlen wie die Reihe darunter: Laenge unveraendert, alles
andere Luecke, Anfang um (n-1) Schritte verschoben.
`dashoffset` ist NEGATIV, und das ist keine Willkuer: Ein
positiver Wert schiebt das Muster rueckwaerts, der Strich
erschiene frueher. Um ihn bei p BEGINNEN zu lassen, braucht es
-p. */
const kopf = koepfe[welcher];
if (kopf) {
const schritt = U / gesamt;
const laenge = GLIED_LAENGE[welcher];
kopf.style.strokeDasharray = `${laenge} ${(U - laenge).toFixed(3)}`;
kopf.style.strokeDashoffset = `-${((n - 1) * schritt).toFixed(3)}`;
}
};
const takt = () => {
const j = new Date();
@@ -490,65 +532,27 @@
Die Stunde ueber ZWOELF, nicht ueber 24: Ein Zifferblatt hat
zwoelf Stunden, und der Ring soll sich wie eines lesen. */
setze('sekunde', sk / 60);
/* Die Perle sitzt auf dem Kopf des Sekundenbogens. Sechs Grad je
Sekunde, im selben Takt wie die Anzeige -- sie springt also
mit, statt weich zu gleiten. Das ist ehrlicher (die Anzeige ist
digital) und kostet EINE Bildberechnung je Sekunde statt
sechzig. Auf einer Seite, die stundenlang offen steht, ist das
der Unterschied zwischen einem warmen und einem kalten
Rechner. */
/* DIE KOEPFE ZAEHLEN WEITER, STATT ZURUECKZUSPRINGEN.
Sie gleiten jetzt (Ueberblendung in heim.css) statt zu
springen. Damit das funktioniert, darf der Winkel bei 59 -> 0
Sekunden NICHT von 354 auf 0 fallen -- die Ueberblendung liefe
sonst einmal je Minute rueckwaerts durch das ganze
Zifferblatt. Gerechnet wird deshalb mit der fortlaufenden Zeit:
Der Winkel waechst immer weiter, und 366 Grad sieht genauso aus
wie 6, nur dass der Weg dorthin vorwaerts fuehrt.
/* HIER STAND DIE PERLENRECHNUNG -- 60 Zeilen, und sie ist mit den
Perlen zusammen weggefallen (09.09.2026, screen5).
Die Anzeige selbst rechnet weiterhin nur einmal je Sekunde --
die Bewegung dazwischen macht der Browser, nicht das Skript. */
/* SEIT DEM ERSTEN TAKT, NICHT SEIT 1970.
Sie war ein Lehrstueck fuer sich: eine eigene Uhr ab dem ersten
Takt, weil die volle Unixzeit `rotate(1.07333e+10deg)` ergab und
die Nachkommastellen verlor; ein Startwinkel je Bahn; drei
Winkel, die die kleineren Einheiten anteilig mittragen mussten,
damit kein Kopf neben dem Ende seines Bogens steht.
Der erste Versuch rechnete mit der vollen Unixzeit. Ergebnis im
Bildschirmfoto: `rotate(1.07333e+10deg)` -- eine Zahl in
Exponentialschreibweise, bei der die Nachkommastellen laengst
weg sind. Die Perlen standen sichtbar NEBEN dem Ende ihrer
Boegen, die rote sogar auf der anderen Seite des Zifferblatts.
Gerechnet war es richtig, darstellbar nicht.
All das war noetig, WEIL der Kopf ein zweites Ding an einer
zweiten Stelle war. Er ist jetzt das letzte Glied der Bahn
selbst und wird von derselben Funktion aus denselben Zahlen
gesetzt (siehe `setze`). Damit kann er gar nicht mehr
danebenstehen -- nicht weil die Rechnung besser ist, sondern
weil es nur noch eine gibt.
Jetzt zaehlt eine eigene Uhr ab dem ersten Takt: Startwinkel ist
der echte Stand beim Laden, danach kommen 6 Grad je Sekunde
dazu. Die Zahl bleibt klein (ein Tag sind 518 400 Grad), waechst
aber weiter -- und nur das braucht die Ueberblendung, damit sie
nie rueckwaerts laeuft. */
if (nullpunkt === null) {
nullpunkt = Math.floor(j.getTime() / 1000);
startWinkel = sk * 6;
minStart = min; stdStart = std; sekStart = sk;
}
const seit = Math.floor(j.getTime() / 1000) - nullpunkt;
const winkelSek = startWinkel + seit * 6;
const perle = $('uhr-perle');
if (perle) perle.style.transform = `rotate(${winkelSek.toFixed(2)}deg)`;
/* Die beiden anderen Koepfe laufen mit IHREN Ringen -- die Minute
nimmt die Sekunden anteilig mit, die Stunde die Minuten. Sonst
staende der Kopf neben dem Ende seines Bogens, und genau das
sieht man sofort. */
/* Minute und Stunde ebenso: Startstand plus das, was seither
vergangen ist. Sie tragen die kleineren Einheiten anteilig mit,
damit ihr Kopf nie neben dem Ende ihres Bogens steht. */
const perleMin = $('uhr-perle-minute');
if (perleMin) {
const start = (minStart + sekStart / 60) * 6;
perleMin.style.transform = `rotate(${(start + seit * 0.1).toFixed(3)}deg)`;
}
const perleStd = $('uhr-perle-stunde');
if (perleStd) {
const start = ((stdStart % 12) + minStart / 60) * 30;
perleStd.style.transform = `rotate(${(start + seit / 120).toFixed(4)}deg)`;
}
Der Rest, der hier stand (nullpunkt, startWinkel, minStart,
stdStart, sekStart), wird nirgends sonst gebraucht und ist
ebenfalls weg. Eine Variable, die nur noch gepflegt wird, ist
eine Falle fuer den naechsten Leser. */
setze('minute', (min + sk / 60) / 60);
setze('stunde', ((std % 12) + min / 60) / 12);