Ein eigenes Haus fuer Team Dogi -- Lila und Babyblau statt Rot
Filipe, screen1: "die leiste da und alles andere was noch rot ist auf
team dogi seite soll lila werden. richtig geiles lila und babyblau
mischung ueberall."
Und screen2: "ich will doch dass der eingang hier getrennt ist von der
workspace seite ... aber es soll trotzdem so bleiben dass ich die daten
hier und da sehe."
GETRENNT WIRD DAS AUSSEHEN, NICHT DER BESTAND. Dieselbe Datenbank,
dieselben Seiten, dasselbe Programm -- und zwei Haeuser, die man nicht
verwechseln kann. Filipe und die rechte Hand sehen ihre Zahlen
weiterhin auf beiden Adressen.
EINE ZEILE JE SEITE, EINE REGEL IM SERVER. Jede Seite laedt als LETZTE
Stilvorlage `haus.css`. Auf der Agenturadresse ist die leer -- das Haus
dort IST der Grundzustand. Auf crew.dogfather-universe.com biegt die
Weiche genau diesen Dateinamen auf `crew-haus.css` um.
Drei Wege habe ich dafuer verworfen, und jeder hat einen Grund:
* `data-haus` per JavaScript -> die Seite laedt erst im falschen Ton
und faerbt sich um. Sichtbar, auf jeder Seite, bei jedem Aufruf.
* dasselbe Attribut serverseitig in den HTML-Text schreiben -> jede
HTML-Antwort muesste durch einen Umschreiber statt als Datei
ausgeliefert zu werden, nur wegen einer Farbe.
* zwanzig zweite <link>-Zeilen -> die muesste jemand bei jeder neuen
Seite mitschreiben, und wer sie vergisst, bekommt eine Seite, die
still zum falschen Haus gehoert.
DAS HAUS SIND FAST NUR VARIABLEN. Wer zwei Dutzend Farbwerte tauscht,
tauscht jede Kachel, jeden Rand, jeden Knopf und jedes Leuchten auf
einmal -- auch an Stellen, die man beim Nachbauen uebersehen wuerde.
Eine Datei, die stattdessen Regel fuer Regel umfaerbt, waere beim
naechsten neuen Bauteil sofort unvollstaendig, ohne dass es auffiele.
WO KEINE VARIABLE STAND, HAT DAS MESSEN SIE GEFUNDEN. Ich habe nicht
im Quelltext gesucht, sondern am fertigen Bildschirm jedes Element nach
Farben abgefragt, bei denen der Rotkanal deutlich ueber den anderen
liegt -- ueber alle Farbquellen, nicht nur `color` und
`background-color`. Erst das brachte die eigentliche Stelle ans Licht:
DIE KOPFLEISTE HAT EINEN ROTEN VERLAUF. Genau die Leiste aus Filipes
Bildschirmfoto. Sie glimmt im Agenturhaus wie Feuer -- sein eigener
Wunsch von screen36, und dort bleibt das auch so. Hier schimmert sie
jetzt lila, in derselben Bauweise: unten waermer, nach oben dunkel,
in der Mitte kraeftiger, alles unter 30 % Deckkraft.
Dazu die Fassung der Zentrale (rot->lila, Silber und Babyblau
unberuehrt, Prozentzahlen auf den Punkt gleich -- sie sind am 08.09.
eigens nachgerechnet worden), die Uhr an vier Stellen, das Universum
dahinter, Glocke und Tagesruf, der Schriftzug, und auf der Zugangswand
Knopf, Kachelreihe, Innenglas und Karte.
ZWEI FEHLER, DIE ERST DER BILDSCHIRM ZEIGTE:
Der Schriftzug wurde zu einem ausgefuellten Balken. `background` ist
eine Kurzschreibweise und setzt `background-clip` mit zurueck -- und
genau darueber wird der Text in die Buchstaben ausgestanzt. Jetzt
`background-image`. Im Quelltext sah die Zeile voellig richtig aus.
Zwei Regeln wurden geladen und taten nichts: Die Originale stehen
unter `.kopfleiste .marke__haupt` und `.willkommen > .zuniversum`.
Wer nur die halbe Kette schreibt, verliert gegen zwei Klassen.
DIE MARKE HAENGT JETZT AN ZWEI DINGEN. `markeFuer()` kannte nur die
Rolle -- und DogFather gehoert nun einmal zur Agentur. Ueber der
Zentrale stand deshalb auch auf der zweiten Adresse gross "SPICY
MEDIA". Jetzt entscheidet auch der Hostname, an EINER Stelle.
WAS WARM BLEIBT, UND WARUM: Warnungen. Eine Warnung ist keine
Verzierung, sondern eine Bedeutung -- faerbt man sie ins Lila der
Seite, sieht "etwas stimmt nicht" aus wie alles andere. Sie wird nur
ins Rosa gezogen, damit sie neben Lila kein Fremdkoerper ist. Ebenso
bleiben die 24 Kachelfarben: dass jede Kachel ihre eigene hat, ist
gepruefte Absicht.
Weisse Schrift auf dem Anmeldeknopf haelt jetzt 6,23 zu 1 statt 5,1 --
an echten Bildpunkten gemessen, nicht an der Farbangabe.
pruef-crew-adresse 123 -> 129 · pruef-crew-wand-bild 45 ·
pruef-css-klassen gruen (prueft ab jetzt das PAAR module.css/haus.css,
nicht mehr eine Datei) · pruef-modi-wortleck 5 · pruef-rollen 274 ·
pruef-start-ansicht gruen · pruef-chat-kanaele 79.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -305,6 +305,37 @@ export function crewWeiche(req, res, next) {
|
||||
return next();
|
||||
}
|
||||
|
||||
/* DAS HAUS (10.09.2026).
|
||||
|
||||
Filipe: "die leiste da und alles andere was noch rot ist auf team
|
||||
dogi seite soll lila werden. richtig geiles lila und babyblau
|
||||
mischung ueberall." Und davor: "ich will doch dass der eingang
|
||||
hier getrennt ist von der workspace seite … aber es soll trotzdem
|
||||
so bleiben dass ich die daten hier und da sehe."
|
||||
|
||||
Getrennt wird also das AUSSEHEN, nicht der Bestand. Dieselbe
|
||||
Datenbank, dieselben Seiten, dasselbe Programm -- und zwei
|
||||
Haeuser, die man nicht verwechseln kann.
|
||||
|
||||
Jede Seite laedt als LETZTE Stilvorlage `haus.css`. Auf der
|
||||
Agenturadresse ist die leer, hier steht dahinter das ganze andere
|
||||
Farbhaus. Warum ueber den Dateinamen und nicht ueber ein Attribut
|
||||
am <html>: Ein Attribut muesste entweder JavaScript setzen (dann
|
||||
laedt die Seite erst im falschen Ton und faerbt sich um -- auf
|
||||
jeder Seite, bei jedem Aufruf) oder der Server muesste jede
|
||||
HTML-Antwort umschreiben statt sie als Datei auszuliefern.
|
||||
|
||||
Der Dateiname reist mit einer Fassungsnummer (`?v=…`); die
|
||||
Bedingung sieht deshalb nur auf den PFAD, nicht auf die ganze
|
||||
Adresse. Genau daran waere sie sonst gescheitert -- lautlos, denn
|
||||
ein nicht umgebogener Pfad liefert weiterhin eine gueltige
|
||||
Datei. */
|
||||
if (req.path === "/workspace/assets/css/haus.css") {
|
||||
req.url = "/workspace/assets/css/crew-haus.css"
|
||||
+ (req.url.includes("?") ? req.url.slice(req.url.indexOf("?")) : "");
|
||||
return next();
|
||||
}
|
||||
|
||||
if (istWorkspacePfad(req.path) || req.path.startsWith("/assets/")) return next();
|
||||
return res.redirect(302, "/workspace/");
|
||||
}
|
||||
|
||||
@@ -550,6 +550,55 @@ console.log("--- Die Buehnen innen ---");
|
||||
+ `${Math.round(a1.text.length / 1024)} KB gegen ${Math.round(a2.text.length / 1024)} KB)`);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DAS HAUS (10.09.2026)
|
||||
|
||||
Filipe: "ich will doch dass der eingang hier getrennt ist von der
|
||||
workspace seite … aber es soll trotzdem so bleiben dass ich die
|
||||
daten hier und da sehe."
|
||||
|
||||
Getrennt wird das AUSSEHEN, nicht der Bestand. Jede Seite laedt als
|
||||
letzte Stilvorlage `haus.css`; auf der Agenturadresse ist die leer,
|
||||
auf crew. biegt die Weiche sie auf `crew-haus.css` um.
|
||||
|
||||
GEPRUEFT WIRD NICHT NUR "beide antworten mit 200". Zwei gueltige
|
||||
Antworten sagen nichts darueber, ob es zwei VERSCHIEDENE Dateien
|
||||
sind -- genau daran waere die Pruefung der Buehnen weiter oben schon
|
||||
einmal fast vorbeigelaufen. Deshalb wird der Inhalt verglichen, und
|
||||
zusaetzlich der Griff `--haus-name` gelesen: Er unterscheidet "die
|
||||
leere Fassung ist angekommen" von "gar nichts ist angekommen".
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("--- Welches Haus kommt an? ---");
|
||||
{
|
||||
const hausCrew = await hole("/workspace/assets/css/haus.css", { host: CREW });
|
||||
const hausWs = await hole("/workspace/assets/css/haus.css", { host: WS });
|
||||
ok(hausCrew.status === 200 && hausWs.status === 200,
|
||||
`beide Adressen liefern ein Haus (${hausCrew.status}/${hausWs.status})`);
|
||||
ok(hausCrew.text !== hausWs.text,
|
||||
`und es sind zwei verschiedene (${hausCrew.text.length} gegen ${hausWs.text.length} Zeichen)`);
|
||||
ok(/--haus-name:\s*"crew"/.test(hausCrew.text),
|
||||
"auf crew. steht das Haus von Team Dogi darin");
|
||||
ok(/--haus-name:\s*"workspace"/.test(hausWs.text),
|
||||
"auf workspace. das der Agentur (Gegenprobe)");
|
||||
|
||||
/* DIE FASSUNGSNUMMER MUSS MITREISEN. Jede Seite ruft die Datei mit
|
||||
`?v=…` auf. Wer beim Umbiegen nur den Pfad setzt, wirft sie weg --
|
||||
und der Browser behaelt die Datei dann laenger, als er soll.
|
||||
Aufgefallen waere das erst beim naechsten Farbwechsel, Wochen
|
||||
spaeter, bei einem einzelnen Menschen. */
|
||||
const mitNummer = await hole("/workspace/assets/css/haus.css?v=202609102225", { host: CREW });
|
||||
ok(mitNummer.status === 200 && /--haus-name:\s*"crew"/.test(mitNummer.text),
|
||||
`mit Fassungsnummer kommt dasselbe an (${mitNummer.status})`);
|
||||
|
||||
/* Und die Datei des anderen Hauses ist auf beiden Adressen direkt
|
||||
abrufbar -- sie ist kein Geheimnis, sie ist nur nicht die
|
||||
Vorgabe. Das steht hier, damit niemand spaeter eine Sperre
|
||||
einbaut, die die Pruefung oben blind machen wuerde. */
|
||||
const direkt = await hole("/workspace/assets/css/crew-haus.css", { host: WS });
|
||||
ok(direkt.status === 200, `crew-haus.css ist auch direkt abrufbar (${direkt.status})`);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE GEGENPROBE
|
||||
|
||||
|
||||
@@ -611,18 +611,59 @@ console.log("\n=== module.css: die Modulliste steht siebenmal — und überall g
|
||||
|
||||
/* Und die Datei muss auf jeder Seite ZULETZT stehen -- sonst
|
||||
überschreiben die Seitendateien die Form wieder, so wie es bis zum
|
||||
07.09.2026 auf vier Seiten der Fall war. */
|
||||
07.09.2026 auf vier Seiten der Fall war.
|
||||
|
||||
SEIT DEM 10.09.2026 STEHT EINE DAHINTER: haus.css.
|
||||
|
||||
Sie entscheidet, ob die Seite das Haus der Agentur oder das von
|
||||
Team Dogi traegt -- auf der Modi-Adresse biegt der Server genau
|
||||
diesen Dateinamen um. Sie enthaelt ausschliesslich Variablen
|
||||
(`:root`), und bei Variablen entscheidet allein die Reihenfolge:
|
||||
Steht sie VOR module.css, gewinnt das Agenturhaus, und zwar
|
||||
lautlos -- die Seite sieht dann einfach normal aus.
|
||||
|
||||
Geprueft wird deshalb ab jetzt das PAAR, nicht eine einzelne
|
||||
Datei: module.css an vorletzter, haus.css an letzter Stelle.
|
||||
Nur "haus.css ist zuletzt" zu pruefen waere zu wenig -- dann
|
||||
koennte module.css irgendwo davor stehen und die Seitendateien
|
||||
wieder ueberschreiben, also genau der Fehler von damals. */
|
||||
let zuletzt = 0, gesamt = 0;
|
||||
const schief = [];
|
||||
for (const seite of readdirSync(join(WURZEL, "workspace")).filter((f) => f.endsWith(".html"))) {
|
||||
if (seite === "index.html") continue; // die Anmeldeseite lädt sie nicht
|
||||
if (seite === "index.html" || seite === "crew-index.html") continue; // Waende laden module.css nicht
|
||||
const html = readFileSync(join(WURZEL, "workspace", seite), "utf8");
|
||||
const bl = [...html.matchAll(/<link[^>]+rel="stylesheet"[^>]*>/g)].map((m) => m[0]);
|
||||
if (!bl.some((z) => z.includes("css/module.css"))) continue;
|
||||
gesamt++;
|
||||
if (bl[bl.length - 1].includes("css/module.css")) zuletzt++;
|
||||
if (bl.length >= 2
|
||||
&& bl[bl.length - 1].includes("css/haus.css")
|
||||
&& bl[bl.length - 2].includes("css/module.css")) zuletzt++;
|
||||
else schief.push(seite);
|
||||
}
|
||||
ok(gesamt >= 15 && zuletzt === gesamt,
|
||||
`module.css steht auf allen ${gesamt} Seiten als letzte Stilvorlage (${zuletzt})`);
|
||||
`module.css und dahinter haus.css auf allen ${gesamt} Seiten (${zuletzt})`
|
||||
+ (schief.length ? ` -- schief: ${schief.join(", ")}` : ""));
|
||||
|
||||
/* GEGENPROBE: Erkennt die Reihenfolge-Pruefung eine falsche
|
||||
Reihenfolge ueberhaupt? Zwei erfundene Listen, eine richtig, eine
|
||||
vertauscht. Ohne sie waere die Zeile darueber gruen, sobald der
|
||||
Selektor nichts mehr findet. */
|
||||
const probeGut = ['<link href="css/module.css">', '<link href="css/haus.css">'];
|
||||
const probeSchlecht = ['<link href="css/haus.css">', '<link href="css/module.css">'];
|
||||
const richtig = (l) => l.length >= 2 && l[l.length - 1].includes("css/haus.css")
|
||||
&& l[l.length - 2].includes("css/module.css");
|
||||
ok(richtig(probeGut) && !richtig(probeSchlecht),
|
||||
"und eine vertauschte Reihenfolge wird als falsch erkannt");
|
||||
|
||||
/* DIE ZWEITE WAND LAEDT IHR HAUS DIREKT.
|
||||
crew-index.html steht nur auf der Modi-Adresse und darf
|
||||
crew-haus.css beim Namen nennen -- sie MUSS es sogar: Eine
|
||||
Zugangswand, die sich erst nach dem Umbiegen faerbt, waere die
|
||||
eine Seite, auf der man das Umfaerben sieht. */
|
||||
const wand = readFileSync(join(WURZEL, "workspace", "crew-index.html"), "utf8");
|
||||
const wandBl = [...wand.matchAll(/<link[^>]+rel="stylesheet"[^>]*>/g)].map((m) => m[0]);
|
||||
ok(wandBl.length >= 2 && wandBl[wandBl.length - 1].includes("css/crew-haus.css"),
|
||||
`die zweite Wand laedt ihr Haus zuletzt (${wandBl.length} Stilvorlagen)`);
|
||||
}
|
||||
|
||||
console.log(`\n${fehler === 0 ? "ALLES IN ORDNUNG" : `${fehler} FEHLER`}`);
|
||||
|
||||
+19
-2
@@ -638,7 +638,24 @@ export function rollentextFuer(person) {
|
||||
return null;
|
||||
}
|
||||
|
||||
export function markeFuer(person) {
|
||||
/* DIE MARKE HAENGT AN ZWEI DINGEN, NICHT AN EINEM (10.09.2026).
|
||||
*
|
||||
* An der ROLLE: Wer zu Team Dogi gehoert, sieht ueberall den Namen
|
||||
* seines Teams -- auch dann, wenn er die Seite ueber eine andere
|
||||
* Adresse aufmacht.
|
||||
*
|
||||
* Und an der ADRESSE: Auf crew.dogfather-universe.com gibt es Spicy
|
||||
* Media nicht. Dort stand ueber der Zentrale trotzdem "SPICY MEDIA" --
|
||||
* gross, mitten im Bild, weil diese Funktion nur die Rolle kannte und
|
||||
* DogFather nun einmal zur Agentur gehoert. Filipe: "ich will doch
|
||||
* dass der eingang hier getrennt ist von der workspace seite."
|
||||
*
|
||||
* Zwei Fragen, EINE Antwortstelle. Wer die Adressbedingung stattdessen
|
||||
* an der Aufrufstelle prueft, hat sie beim naechsten Aufruf nicht --
|
||||
* und diese Funktion wird ueber kurz oder lang ein zweites Mal
|
||||
* gebraucht. */
|
||||
export function markeFuer(person, hostKopfzeile) {
|
||||
if (istCrewAdresse(hostKopfzeile)) return MODI_MARKE;
|
||||
return TEAM_DOGI_ROLLEN.has(person?.rolle) ? MODI_MARKE : null;
|
||||
}
|
||||
|
||||
@@ -3336,7 +3353,7 @@ workspaceRouter.get("/workspace/api/ich", (req, res) => {
|
||||
genau wie meine"). */
|
||||
bereiche: bereicheFuer(angesehen || person),
|
||||
rolle_text: rollentextFuer(angesehen || person),
|
||||
marke: markeFuer(angesehen || person),
|
||||
marke: markeFuer(angesehen || person, req.get("host")),
|
||||
/* Kacheln, die zur eigenen Liste DAZUkommen -- im Gegensatz zu
|
||||
`bereiche`, das sie ersetzt. Leer fuer alle, die keine haben. */
|
||||
bereiche_zusatz: zusatzBereicheFuer(angesehen || person),
|
||||
|
||||
Reference in New Issue
Block a user