Ein Husky statt der Krone -- und Spicy sieht DogFather, aber nur ihn

DER HUSKY (screen 1)

Filipe: "die krone bei dogfather durch einen husky ersetzen, wie mein
logo." Bei 24 Pixeln entscheidet die SILHOUETTE, nicht das Detail. Ein
Husky erkennt man an dreierlei, und mehr passt auch nicht hinein: den
spitzen aufrechten Ohren, dem breiten Kopf, der nach unten schmal
zulaeuft, und der Gesichtsmaske. Fell oder Zunge waeren bei dieser
Groesse Matsch -- genau deshalb hat die Krone davor funktioniert.

UND ALLE ROLLENSYMBOLE SIND JETZT KOERPER

Sie waren reine Konturen in einer Farbe -- daneben auf derselben Seite
die Kachelzeichen mit drei Lichtern. Jetzt tragen sie eine gefuellte
Flaeche in ihrer Rollenfarbe, die Zeichnung hell darauf, und Augen und
Nase eigens gesetzt. Beim gewaehlten Knopf leuchtet die Flaeche
staerker -- der einzige Unterschied, den es braucht: mehr Licht auf
demselben Gegenstand.

SPICY SIEHT DOGFATHER, ABER NICHT DEN ZWEITEN ADMIN (screen 2)

Filipe: "die rolle spicy soll auch die rolle dogfather sehen, aber nur
dogfather und nicht vanvan."

NACHGEMESSEN AM ECHTEN SYSTEM, nicht angenommen: In der Datenbank
tragen BEIDE die Rolle `admin` -- id 1 "Dogfather", id 4 "VanVan". Es
gibt kein Feld, das den einen vom anderen unterscheidet.

Der Unterschied, den es wirklich gibt, ist das Alter: DogFather ist der
erste Zugang des Hauses. Deshalb zaehlt die kleinste Nummer unter den
Admins -- eine Eigenschaft, die feststeht und nicht am Namen haengt.
Die Schwachstelle steht im Code, damit sie niemand sucht: Wuerde Zugang
1 je geloescht, rueckte der naechste nach; dann gehoert ein
ausdrueckliches Merkmal in die Tabelle.

Die Entscheidung faellt im SERVER, nicht in der Oberflaeche. Dort stand
vorher ein Filter, der den ganzen Abschnitt wegnahm -- zwei Regeln fuer
dieselbe Frage laufen auseinander, und eine ausgeblendete Zeile hat
noch nie etwas geschuetzt.

MEINE EIGENEN PRUEFUNGEN VON HEUTE MITTAG FIELEN DABEI

Richtig so: Sie pruefen "DogFather steht NICHT darin", und das gilt
nicht mehr. Umgeschrieben -- und dabei kam der eigentliche Prueffall
dazu: ein ZWEITER Admin-Zugang im Testbestand. Ohne ihn waere die Regel
gar nicht pruefbar, bei einem einzigen Admin ist jede Antwort richtig.
pruef-spicy von 57 auf 60.

NOCH OFFEN aus derselben Nachricht: die Terminarten (BigMatch,
Turniere, Special-Live) und der Umbau der Begruessungskachel nach dem
Vorbild von VanVans Werktisch.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-07 18:14:54 +02:00
co-authored by Claude Opus 5
parent 09a0c17237
commit 28a260fab2
23 changed files with 326 additions and 206 deletions
+48 -2
View File
@@ -206,10 +206,56 @@
box-shadow: 0 4px 16px -10px var(--r);
}
/* =====================================================================
DIE ROLLENSYMBOLE SIND KOERPER, KEINE UMRISSE (07.09.2026)
Filipe: "alle diese symbole von den rollen sollen auch viel
realistischer, geiler aussehen, auch mit farben befuellt sein."
Sie waren reine Konturen in einer Farbe -- daneben auf derselben
Seite die Kachelzeichen mit drei Lichtern. Sie bekommen jetzt
dieselbe Behandlung, nur einfacher gebaut (die Rollensymbole stehen
als <use> im HTML, nicht aus dem Bauer):
FLAECHE ein Verlauf in der Rollenfarbe -- oben satt, unten
warm auslaufend. Dasselbe Prinzip wie bei den
Kachelzeichen: kaltes Spitzlicht, Eigenfarbe, warmes
Streulicht.
ZEICHNUNG die Linien darauf, hell -- sie tragen die Form.
AUGEN hell gefuellt, damit ein Gesicht auch ein Gesicht ist.
`--r` ist die Farbe der Rolle und kommt aus der Liste darueber. */
.rollenwahl__symbol {
width: 22px; height: 22px; flex: none; margin-top: 1px;
fill: none; stroke: var(--r); stroke-width: 1.6;
width: 24px; height: 24px; flex: none; margin-top: 1px;
fill: none; stroke: var(--r); stroke-width: 1.55;
stroke-linecap: round; stroke-linejoin: round;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .6));
}
.rollenwahl__symbol .fuell {
stroke: none;
fill: color-mix(in srgb, var(--r) 58%, transparent);
}
.rollenwahl__symbol .linie { stroke: color-mix(in srgb, var(--r) 92%, #ffffff); }
.rollenwahl__symbol .auge {
stroke: none;
fill: color-mix(in srgb, var(--r) 30%, #ffffff);
}
/* Der Haken im Schutzschild ist die AUSSAGE des Zeichens -- er bleibt
hell und duenn, damit er auf der gefuellten Flaeche steht statt in
ihr zu verschwinden. */
.rollenwahl__symbol .hell {
stroke: color-mix(in srgb, var(--r) 18%, #ffffff);
stroke-width: 1.9;
}
.rollenwahl__symbol .nase {
stroke: none;
fill: color-mix(in srgb, var(--r) 45%, #06090f);
}
/* Beim gewaehlten Knopf leuchtet die Flaeche etwas staerker -- das ist
der einzige Unterschied, den es braucht: mehr Licht auf demselben
Gegenstand. */
.rollenwahl__knopf[data-an="ja"] .rollenwahl__symbol .fuell {
fill: color-mix(in srgb, var(--r) 78%, transparent);
}
.rollenwahl__text { display: grid; gap: 2px; min-width: 0; }
.rollenwahl__name { font-size: .92rem; font-weight: 650; }
+13 -2
View File
@@ -31,7 +31,7 @@
const ROLLEN = [
{ wert: 'spicy', name: 'Spicy Media', symbol: 'chili',
text: 'Überblick über alle – ohne Automationen, ohne fremde Chats. Legt Leute an.' },
{ wert: 'admin', name: 'DogFather', symbol: 'krone',
{ wert: 'admin', name: 'DogFather', symbol: 'husky',
text: 'Alle Rechte, endgültig. Nur DogFather legt DogFather, Spicy Media und Manager an.' },
/* Der Satz stimmte bis zum 07.09.2026 -- seither legen Manager
Creator an, und ein Text, der etwas anderes verspricht als die
@@ -579,8 +579,19 @@
DAS IST KEINE SICHERUNG, sondern Aufraeumen: Der Server liefert
ihr die Liste ohnehin nur, wenn sie sie sehen darf. Eine
ausgeblendete Zeile hat noch nie etwas geschuetzt. */
/* DER ABSCHNITT DOGFATHER WIRD NICHT MEHR AUSGEBLENDET (07.09.2026,
zweite Praezisierung). Filipe: "die rolle spicy soll auch die
rolle dogfather sehen, aber nur dogfather und nicht vanvan."
Hier stand ein Filter, der den ganzen Abschnitt wegnahm. Jetzt
entscheidet der SERVER, wer darin steht -- er liefert Spicy Media
nur den ersten Admin-Zugang. Das ist auch die richtige Stelle
dafuer: Eine ausgeblendete Zeile hat noch nie etwas geschuetzt,
und zwei Regeln fuer dieselbe Frage laufen auseinander.
`filter((a) => a.drin.length)` erledigt den Rest von selbst: Ist
niemand darin, gibt es den Abschnitt auch nicht. */
const vorhanden = ROLLEN_ABSCHNITTE
.filter((a) => !(a.rolle === 'admin' && ich?.rolle === 'spicy'))
.map((a) => ({ ...a, drin: alle.filter((p) => p.rolle === a.rolle) }))
.filter((a) => a.drin.length);