Compare commits

...
3 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 b0e7542507 Der Anrufkasten zeigt, WER dran ist -- nicht dreimal "Verbunden"
Filipe, zu Screen 1: "wenn ich anrufe soll das auch viel besser geiler
und spezieller aussehen aber es soll nicht raushaengen."

Erst gemessen: Es haengt nichts raus. Der Kasten ist 374 px am Handy,
340 am Rechner, 72 Teile geprueft, kein einziges ueber dem Rand. Die
Optik war also gar nicht der Mangel -- zwei andere Dinge waren es.

1. DER NAME DES ANRUFERS GING IMMER VERLOREN.
   `wer(raumName || "Anruf")` lief VOR `kastenBauen()`. Das Element
   #anruf-wer gab es zu dem Zeitpunkt noch nicht, die Zuweisung lief
   ins Leere, und oben stand bei jedem Anruf das Wort "Anruf". Die
   Reihenfolge ist umgedreht: erst bauen, dann beschriften.

2. IN EINEM ANRUF OHNE VIDEO STAND JE PERSON DAS WORT "Verbunden".
   Bei dreien dreimal dasselbe Wort -- und man sah nicht, WER dabei
   war. In einer Gruppe ist genau das die Frage: Ist Kessi schon
   drin? Jetzt steht dort ein Kreis mit den Anfangsbuchstaben und der
   echte Name; waehrend es klingelt ein wartendes Gesicht mit dem
   Namen dessen, den man anruft. Vorher war die Flaeche in dieser
   Sekunde leer, und ein leerer Kasten mit "Es klingelt ..." sieht
   aus wie einer, der haengt -- ausgerechnet im unsichersten Moment.

Der Name kommt NICHT aus einer Abfrage. Wer anruft, bekannt beim
Start nur sich selbst; alle weiteren kommen ausschliesslich ueber das
Ereignis "dabei", und genau dort fehlte das Einsammeln. Deshalb sah
der ANRUFER unter jedem Kreis "Jemand" -- die Angerufenen nicht.

UND DIE PRUEFUNG WAR ZU NACHSICHTIG. Sie verlangte einen Namen
"laenger als ein Zeichen"; der Rueckfalltext "Jemand" ist sechs
Zeichen lang und kam damit durch. Gruen, waehrend der Hauptfall
kaputt war. Die zweite Fassung verglich gegen eine abgeschriebene
Namensliste -- die nannte "Jonas, Luna, Mara, Pat", angelegt werden
aber "Filipe, Rieke, Kessi, Tili", und der Kommentar daneben
behauptete schon da, sie sei abgeleitet. Jetzt ist sie es wirklich:
Die Namen werden beim Anlegen eingesammelt, und geprueft wird, dass
jeder GENAU DIE BEIDEN ANDEREN sieht -- nicht "irgendeinen echten
Namen", denn der eigene Name im eigenen Kasten waere auch einer.

pruef-anruf: 127 Pruefungen, 0 Fehler.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 22:25:45 +02:00
DogFatherGitandClaude Opus 5 9d086eccaf Chat: das Buehnenbild scheint durch, jeder Account bekommt seine Kachel
Hinter jeder Seite steht ohnehin eine Buehne (neun Szenen, fuer den
Chat die Lounge). Sie lag bisher hinter einer deckenden Flaeche --
vorhanden, geladen, unsichtbar. Sie durchscheinen zu lassen kostet
keine einzige Datei mehr, und auf der Adresse von Team Dogi kommt
damit von selbst deren eigene Fassung.

Das geht aber NUR, wenn der Text auf einer deckenden Kachel steht.
Sonst liegt Schrift auf einem Foto: an der dunklen Stelle lesbar, an
der hellen nicht, und beim Scrollen wechselt es. Filipes zweiter Satz
("die texte sollen immer in einer kachel sein") ist deshalb kein
Zusatzwunsch, sondern die Bedingung fuer den ersten.

Und jeder Account waehlt seinen Ton. Zwoelf Stueck, alle gleich
dunkel und gleich gesaettigt -- sie unterscheiden sich im Farbton und
in sonst nichts. Ein freier Farbwaehler klingt grosszuegiger und ist
die schlechtere Loesung: Mit ihm laesst sich Schwarz auf Schwarz
einstellen oder Neongelb, das allen anderen in die Augen sticht. Die
Kachel gehoert einem selbst, GESEHEN wird sie von allen anderen.
Gemessen: der schlechteste Kontrast liegt bei 13,9:1 (noetig 7).

Drei eigene Fehler beim Bauen, alle von der Pruefung gefunden:

1. Es gibt ZWEI Regeln fuer dieselbe Kachel (Grundform und
   Feinschliff). Ich hatte nur die erste umgestellt, die zweite gewann
   -- die eigene Kachel waere durchsichtig geblieben.
2. Die Pruefung las backgroundColor und pruefte den Alphawert. Eine
   Kachel mit einem VERLAUF hat dort rgba(0,0,0,0); sie meldete
   "durchsichtig" bei einer Kachel, die voellig deckt. Jetzt werden
   zwei Bildpunkte verglichen, einmal mit und einmal ohne Buehnenbild
   -- das misst die Sache selbst, nicht ihren Stellvertreter.
3. Dieselbe Pruefung suchte nur die rgba-Schreibweise. Chrome gibt
   das Ergebnis von color-mix als color(srgb r g b / a) zurueck; der
   Rueckfall war "Alpha 1", und sie meldete "deckt" bei einer
   Flaeche, die durchscheint. Genau das Gegenteil.

pruef-chatkachel.mjs: 27 Pruefungen, mit eingebauter Gegenprobe (auf
der freien Flaeche MUSS sich etwas aendern, sonst misst der Vergleich
nichts). pruef-chat-optik und pruef-erwaehnung unveraendert gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:58:50 +02:00
DogFatherGitandClaude Opus 5 9c96612321 Am Handy lag Text auf Text -- im Satz ueber Vertraulichkeit
Auf der Befindens-Seite ueberlagerten sich bei 430 px zwei Absaetze
um 18 Pixel. Betroffen war ausgerechnet "Deine Antworten liest
niemand ausser dir" -- also der Satz, in dem das Vertrauen entsteht,
das die ganze Seite braucht.

Ursache war eine feste Zahl: -18px Abstand, gerechnet gegen die
26 px, die das Element darueber mitbringt. In einer Kopfzeile setzt
start.css dieses margin-bottom aber auf 0. Aus 26 minus 18 wurde
0 minus 18. Zwei fuer sich richtige Regeln, und dazwischen ein
Schaden, den keine von beiden verursacht.

Die Lehre ist nicht "-18 auf -8 aendern" -- das waere dieselbe Zahl
mit anderem Wert und beim naechsten Zusammentreffen wieder falsch.
Jetzt bestimmt der Absatz davor seinen Abstand selbst, und nur dann,
wenn der Zusatz wirklich folgt (:has). Acht Pixel, in jeder Umgebung.

Gefunden hat es ein Bildschirmfoto, nicht das Lesen: Beide Regeln
sehen einzeln vernuenftig aus. Die Messung steht jetzt fest in
pruef-befinden.mjs (113/0), mit Gegenprobe: Mit dem alten Wert wird
sie rot, ohne ihn gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:48:46 +02:00
46 changed files with 1674 additions and 519 deletions
+85
View File
@@ -68,7 +68,15 @@ const anrufModul = await import("./workspace-anruf.js");
/* ---- Leute anlegen ---- */
const d = new DatabaseSync(process.env.WORKSPACE_DB);
/* Die Namen der Konten, die diese Pruefung anlegt -- gesammelt an der
Stelle, an der sie entstehen. Eine zweite Liste weiter unten waere
beim naechsten umbenannten Konto die veraltete: Genau das ist hier
passiert (die Liste nannte „Jonas, Luna, Mara, Pat", angelegt wurden
„Filipe, Rieke, Kessi, Tili"), und der Kommentar daneben behauptete
schon damals, sie sei abgeleitet. Jetzt ist sie es. */
const ANGELEGTE_NAMEN = [];
function person(name, rolle, code) {
ANGELEGTE_NAMEN.push(name);
const salt = randomBytes(16).toString("hex");
const hash = scryptSync(code, salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
@@ -996,6 +1004,83 @@ melde("=== 8. Zu dritt ===");
`${wer} hoert BEIDE anderen (${z.stroeme} Stroeme, „${z.lage}")`);
}
/* ---- WER IST DRAN (20.09.2026) -----------------------------
Filipe: „die soll auch viel besser geiler und spezieller
aussehen, aber nicht so raushaengen."
DER MANGEL WAR KEIN SCHOENHEITSFEHLER: In einem Anruf ohne
Video stand unter dem Kasten je Person das Wort „Verbunden"
-- bei dreien dreimal dasselbe Wort, und man sah nicht, WER
verbunden war. In einer Gruppe ist genau das die Frage.
Gemessen wird deshalb, dass NAMEN dastehen, nicht Kacheln:
Ein Gesichtsfeld ohne Namen bestuende jede Pruefung, die nur
zaehlt. */
/* WER MUSS WEN SEHEN. Nicht „irgendein echter Name", sondern
genau die beiden ANDEREN: Stuende bei DogFather sein eigener
Name im Kasten, waere das ein Fehler, den eine Pruefung auf
„ist ein echter Name" durchliesse. Die Namen kommen aus
`ANGELEGTE_NAMEN` -- sie werden beim Anlegen eingesammelt und
hier nur noch verteilt. */
const NAME = { [idDogi]: ANGELEGTE_NAMEN[0], [idHand]: ANGELEGTE_NAMEN[1],
[idModi]: ANGELEGTE_NAMEN[2] };
const ERWARTET = {
DogFather: [NAME[idHand], NAME[idModi]],
"die rechte Hand": [NAME[idDogi], NAME[idModi]],
"der Modi": [NAME[idDogi], NAME[idHand]],
};
for (const [wen, x] of [["DogFather", a], ["die rechte Hand", b], ["der Modi", c]]) {
const g = await x.se.evaluate(() => ({
felder: document.querySelectorAll("#anruf-leute .anruf__gesicht").length,
namen: [...document.querySelectorAll("#anruf-leute .anruf__gesicht .anruf__name")]
.map((e) => e.textContent.trim()).filter(Boolean),
verbunden: /Verbunden/.test(document.getElementById("anruf-leute")?.textContent || ""),
}));
ok(g.felder === 2,
`${wen} sieht die beiden anderen als Gesichtsfeld (${g.felder})`);
/* NICHT „laenger als ein Zeichen" -- der Rueckfalltext
„Jemand" ist sechs Zeichen lang und kam damit durch. Die
Pruefung war gruen, waehrend ausgerechnet der ANRUFER unter
jedem Kreis „Jemand" stehen sah. Verglichen wird deshalb
gegen die Namen, die es wirklich gibt. */
const soll = [...ERWARTET[wen]].sort().join(", ");
const ist = [...g.namen].sort().join(", ");
ok(g.namen.length === 2 && ist === soll,
` und zwar genau die beiden anderen (${ist || "keine"}, erwartet: ${soll})`);
ok(!g.verbunden,
" statt dreimal dem Wort „Verbunden“, das nichts unterscheidet");
}
/* ---- UND NICHTS HAENGT RAUS --------------------------------
„nicht so raushaengen" ist die schaerfere der beiden Vorgaben:
Der Kasten ist 340 px breit und liegt in der Ecke. Bei DREI
Gesichtsfeldern plus Knopfreihe ist das die engste Lage, die
im Betrieb vorkommt -- also die, in der gemessen wird. */
for (const [wen, x] of [["am Rechner", a]]) {
const raus = await x.se.evaluate(() => {
const k = document.querySelector(".anruf");
if (!k) return null;
const r = k.getBoundingClientRect();
const treffer = [];
for (const e of k.querySelectorAll("*")) {
const b2 = e.getBoundingClientRect();
if (b2.width < 1 || b2.height < 1) continue;
if (b2.right > r.right + 1 || b2.left < r.left - 1 || b2.bottom > r.bottom + 1) {
treffer.push((e.className.baseVal ?? e.className).toString().split(" ")[0]);
}
}
return { geprueft: k.querySelectorAll("*").length, treffer };
});
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Faende der Wahlausdruck
nichts, waere die Liste leer und die Pruefung gruen, ohne
etwas angesehen zu haben. */
ok(raus && raus.geprueft > 10 && raus.treffer.length === 0,
raus?.treffer.length
? `es haengt etwas raus: ${raus.treffer.slice(0, 3).join(", ")}`
: `nichts haengt aus dem Kasten (${raus?.geprueft} Teile geprueft, ${wen})`);
}
/* ---- DER LAUTSPRECHER (18.09.2026) -------------------------
Filipe: „die funktion lautsprecher fehlt."
+50
View File
@@ -880,6 +880,56 @@ melde("=== 8. Die Analyse im Browser ===");
ok(g.schluss.length > 20, `und einem Schlusssatz („${g.schluss.slice(0, 46)}…")`);
ok(/\d+ Fragen aus \d+ Feldern/.test(g.zahlen),
`die Belegzahlen stehen darunter („${g.zahlen}")`);
/* ---- KEIN TEXT AUF TEXT, AUCH AM HANDY (20.09.2026) --------------
Gefunden hat das ein Bildschirmfoto bei 430 px: Die Unterzeile
„Deine Antworten liest niemand ausser dir" lag 18 px UNTER dem
Absatz darunter -- Buchstaben in Buchstaben, ausgerechnet in dem
Satz, in dem Vertrauen entsteht.
Ursache war eine feste Zahl: `-18px` Abstand, gerechnet gegen die
26 px, die das Element darueber mitbrachte. In der Kopfzeile sind
es aber 0 px. Zwei fuer sich richtige Regeln, und dazwischen ein
Schaden, den keine von beiden verursacht.
Warum das hier stehen bleibt: Es ist kein Fehler, den man beim
Lesen sieht -- beide Regeln wirken einzeln vernuenftig. Nur eine
Messung findet ihn wieder, wenn jemand an einem der beiden
Abstaende dreht. */
const enge = await seite.setViewportSize({ width: 430, height: 900 })
.then(() => seite.waitForTimeout(500))
.then(() => seite.evaluate(() => {
const kandidaten = [...document.querySelectorAll("body *")].filter((e) => {
const r = e.getBoundingClientRect();
return r.width > 20 && r.height > 6
&& /P|H1|H2|H3|LI/.test(e.tagName)
&& e.textContent.trim().length > 12;
});
const treffer = [];
for (let i = 0; i < kandidaten.length; i++) {
for (let j = i + 1; j < kandidaten.length; j++) {
const x = kandidaten[i], y = kandidaten[j];
if (x.contains(y) || y.contains(x)) continue;
const a2 = x.getBoundingClientRect(), b2 = y.getBoundingClientRect();
const ux = Math.min(a2.right, b2.right) - Math.max(a2.left, b2.left);
const uy = Math.min(a2.bottom, b2.bottom) - Math.max(a2.top, b2.top);
if (ux > 8 && uy > 6) {
treffer.push(`${x.className.split(" ")[0]} über ${y.className.split(" ")[0]} (${Math.round(uy)} px)`);
}
}
}
return { treffer, geprueft: kandidaten.length };
}));
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Faende der Wahlausdruck nichts,
waere `treffer` leer und die Pruefung gruen, ohne etwas angesehen
zu haben -- genau der Fehler vom 01.09. mit `every()` auf einer
leeren Liste. */
ok(enge.geprueft > 20 && enge.treffer.length === 0,
enge.treffer.length
? `Text liegt auf Text: ${enge.treffer.slice(0, 2).join("; ")}`
: `bei 430 px liegt kein Text auf Text (${enge.geprueft} Absätze verglichen)`);
await seite.setViewportSize({ width: 1280, height: 1000 });
if (process.env.SCHIRM) {
await seite.locator("#analyse-block").screenshot(
{ path: "C:/Users/qciga/Documents/Obelix/DogiHompage/blick.png" });
+337
View File
@@ -0,0 +1,337 @@
/* =====================================================================
pruef-chatkachel.mjs — Bild hinter dem Chat, Kachel für jeden Account
Filipe, 20.09.2026: „ich will auch ein krasses hintergrundbild für
den treff chat. und die texte sollen immer in einer kachel sein. und
jeder account soll seine kachel personalisieren können."
---------------------------------------------------------------------
DIE EINE FRAGE, AN DER SO ETWAS SCHEITERT: LESBARKEIT
Ein Bild hinter einem Chat geht nur, WENN der Text auf einer
deckenden Kachel steht. Sonst liegt Schrift auf einem Foto — an der
dunklen Stelle lesbar, an der hellen nicht, und beim Scrollen
wechselt es. Deshalb wird hier nicht geprüft, ob ein Bild da ist,
sondern ob die Kachel DECKT: gemessen am Alphawert, nicht geschätzt.
Und alle zwölf Töne müssen gleich gut tragen. Ein freier Farbwähler
hätte genau hier sein Problem: Mit ihm kann sich jemand unlesbar
machen, und sehen müssen es die anderen.
AUFRUF: node server/pruef-chatkachel.mjs
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4442, "pruef-chatkachel");
const ordner = mkdtempSync(join(tmpdir(), "ws-kachel-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const express = (await import("express")).default;
const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js");
notbremse(250_000, "pruef-chatkachel");
await new Promise((r) => setTimeout(r, 900));
const BASIS = `http://127.0.0.1:${PORT}`;
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
process.on("unhandledRejection", (f) => { console.error("ABSTURZ (Versprechen):", f); process.exit(7); });
let fehler = 0, geprueft = 0;
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
console.log("\n=== Chat: Bild dahinter, Kachel davor ===\n");
/* ---- 1. Die Töne, ohne Browser ----------------------------------- */
const { CHAT_KACHELN, kachelPruefen } = await import("./workspace-chat.js");
ok(CHAT_KACHELN.length >= 8, `es gibt genug Töne zur Auswahl (${CHAT_KACHELN.length})`);
/* ALLE GLEICH DUNKEL. Nur dann ist der Kontrast zur Schrift bei jedem
gleich, und niemand kann sich unlesbar machen. Gerechnet wird die
relative Helligkeit nach WCAG — nicht der Augenschein. */
const helligkeit = (hex) => {
const z = hex.replace("#", "");
const teil = [0, 2, 4].map((i) => parseInt(z.slice(i, i + 2), 16) / 255);
const lin = teil.map((c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4));
return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2];
};
const kontrast = (a, b) => {
const [h, d] = [helligkeit(a), helligkeit(b)].sort((x, y) => y - x);
return (h + 0.05) / (d + 0.05);
};
const SCHRIFT = "#e8f1fa"; /* die Textfarbe des Hauses */
let schlechtester = 99, schlechtesterName = "";
for (const k of CHAT_KACHELN) {
const c = kontrast(SCHRIFT, k.farbe);
if (c < schlechtester) { schlechtester = c; schlechtesterName = k.name; }
}
/* 7:1 ist die strengere WCAG-Stufe (AAA für Fließtext). Ein Chat ist
die Seite, auf der am längsten gelesen wird — hier die niedrigere
Schwelle zu nehmen wäre am falschen Ende gespart. */
ok(schlechtester >= 7,
`auch der hellste Ton trägt die Schrift noch (${schlechtesterName}: ${schlechtester.toFixed(1)}:1, nötig 7)`);
const spanne = Math.max(...CHAT_KACHELN.map((k) => helligkeit(k.farbe)))
/ Math.max(1e-6, Math.min(...CHAT_KACHELN.map((k) => helligkeit(k.farbe))));
ok(spanne < 6,
`die Töne liegen nah beieinander (Faktor ${spanne.toFixed(1)}) — keiner sticht heraus`);
/* KEINE DOPPELTE FARBE. Zwei gleiche Töne wären zwei Namen für
dieselbe Kachel — man wählt den zweiten und sieht keinen Unterschied. */
const farben = new Set(CHAT_KACHELN.map((k) => k.farbe.toLowerCase()));
ok(farben.size === CHAT_KACHELN.length,
`kein Ton doppelt (${farben.size} von ${CHAT_KACHELN.length})`);
/* Die Prüfung am Wert selbst — sie ist der Riegel gegen alles, was
nicht aus der Liste kommt. */
ok(kachelPruefen("moos") === "moos", "ein bekannter Ton kommt durch");
ok(kachelPruefen("rgb(255,0,0)") === null,
"Gegenprobe: ein erfundener Wert nicht — sonst stünde CSS aus der Datenbank in der Seite");
ok(kachelPruefen(null) === null, "und 'nichts eingestellt' ist ein gültiger Zustand");
/* ---- 2. Am echten Bildschirm ------------------------------------- */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const mach = (name, rolle, code) => {
const s = randomBytes(16).toString("hex");
const h = scryptSync(code, s, 64, { N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
return d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)").run(name, rolle, h, s, 32768, new Date().toISOString()).lastInsertRowid;
};
mach("Filipe", "admin", "CODE-DOGI-0001");
const idLuna = mach("Luna", "manager", "CODE-LUNA-0002");
d.close();
const anmelden = async (rolle, code) => {
const a = await fetch(BASIS + "/workspace/api/anmelden", {
method: "POST", headers: { "Content-Type": "application/json", Origin: BASIS },
body: JSON.stringify({ rolle, code }),
});
return (a.headers.getSetCookie?.() || []).map((z) => z.split(";")[0]).join("; ");
};
const kFilipe = await anmelden("admin", "CODE-DOGI-0001");
const kLuna = await anmelden("manager", "CODE-LUNA-0002");
ok(!!kFilipe && !!kLuna, "beide angemeldet");
/* Ein Gespräch und zwei Nachrichten. */
const raumA = await fetch(BASIS + "/workspace/api/chat/direkt", {
method: "POST", headers: { "Content-Type": "application/json", Cookie: kFilipe, Origin: BASIS },
body: JSON.stringify({ mit: idLuna }),
});
const raum = (await raumA.json()).raum_id;
ok(!!raum, `ein Gespräch steht (${raum})`);
const schreib = async (keks, text) => fetch(BASIS + `/workspace/api/chat/raeume/${raum}/nachrichten`, {
method: "POST", headers: { "Content-Type": "application/json", Cookie: keks, Origin: BASIS },
body: JSON.stringify({ text }),
});
await schreib(kFilipe, "Servus, hier ist Filipe.");
await schreib(kLuna, "Und hier Luna.");
/* Luna stellt eine Farbe ein. */
const setzen = await fetch(BASIS + "/workspace/api/chat/kachel", {
method: "PUT", headers: { "Content-Type": "application/json", Cookie: kLuna, Origin: BASIS },
body: JSON.stringify({ kachel: "moos" }),
});
ok(setzen.ok, `Luna stellt ihre Kachel ein (${setzen.status})`);
const boese = await fetch(BASIS + "/workspace/api/chat/kachel", {
method: "PUT", headers: { "Content-Type": "application/json", Cookie: kLuna, Origin: BASIS },
body: JSON.stringify({ kachel: "url(javascript:0)" }),
});
ok(boese.status === 400,
`Gegenprobe: ein erfundener Wert wird abgelehnt (${boese.status}) — eine Regel, die nur im Formular steht, ist keine Regel`);
/* FILIPE SIEHT LUNAS FARBE — das ist der Sinn der Sache. */
const verlauf = await (await fetch(BASIS + `/workspace/api/chat/raeume/${raum}/nachrichten`,
{ headers: { Cookie: kFilipe } })).json();
const vonLuna = (verlauf.nachrichten || []).find((n) => n.von === "Luna");
ok(vonLuna?.von_kachel === "moos",
`Filipe bekommt Lunas Kachel mitgeliefert (${vonLuna?.von_kachel})`);
const vonFilipe = (verlauf.nachrichten || []).find((n) => n.von === "Filipe");
ok(!vonFilipe?.von_kachel,
"und seine eigene bleibt Standard, solange er nichts einstellt");
const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
const browser = await pw.chromium.launch();
try {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
await ctx.addCookies(kFilipe.split("; ").filter(Boolean).map((t) => {
const [name, ...rest] = t.split("=");
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
}));
const s = await ctx.newPage();
const konsole = [];
s.on("console", (m) => { if (m.type() === "error" && !/favicon|ERR_/i.test(m.text())) konsole.push(m.text()); });
s.on("pageerror", (e) => konsole.push("Absturz: " + e.message));
await s.goto(BASIS + "/workspace/chat.html", { waitUntil: "networkidle" });
await s.waitForTimeout(1400);
await s.click(".chat-raum");
await s.waitForTimeout(1200);
/* ==== DIE EIGENTLICHE MESSUNG: SCHEINT DAS BILD DURCH? ===========
Der erste Anlauf las `backgroundColor` und pruefte den Alphawert.
Das war falsch, und zwar auf eine Art, die fast durchgegangen
waere: Eine Kachel mit einem VERLAUF hat `backgroundColor:
rgba(0,0,0,0)` -- der Verlauf steht in `background-image`. Die
Pruefung meldete „durchsichtig" bei einer Kachel, die voellig
deckt, und haette umgekehrt eine halbtransparente Verlaufskachel
durchgelassen.
GEMESSEN WIRD JETZT DIE SACHE SELBST: zweimal dasselbe Bildpunkt-
feld, einmal mit und einmal ohne Buehnenbild. Deckt die Kachel,
sind beide Aufnahmen an dieser Stelle identisch. Scheint das Bild
durch, unterscheiden sie sich.
DIE GEGENPROBE IST EINGEBAUT und kostet nichts: An der Flaeche
ZWISCHEN den Kacheln MUSS sich etwas aendern. Tut sie das nicht,
misst der Vergleich gar nichts -- etwa weil das Bild in dieser
Umgebung nie geladen wurde. Genau die Sorte stiller Erfolg, vor
der die Hausregel zum dritten Ausgang warnt. */
const punkte = await s.evaluate(() => {
const b = document.querySelector('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase')
|| document.querySelector(".chat-nachricht__blase");
const v = document.querySelector(".chat__verlauf");
if (!b || !v) return null;
const rb = b.getBoundingClientRect(), rv = v.getBoundingClientRect();
return {
/* Mitten in der Kachel -- nicht am Rand, dort liegen Kante und
abgerundete Ecke. */
kachel: { x: Math.round(rb.left + rb.width / 2), y: Math.round(rb.top + rb.height / 2) },
/* Und ein Fleck im Verlauf, auf dem sicher keine Kachel liegt:
ganz rechts aussen, wo die eigenen Nachrichten nicht hinreichen. */
frei: { x: Math.round(rv.right - 6), y: Math.round(rv.top + rv.height / 2) },
};
});
ok(!!punkte, "Kachel und freie Fläche gefunden");
/* Playwright kann einen Ausschnitt aufnehmen -- ein Bildpunkt reicht. */
const punktFarbe = async (pkt) => {
const bild = await s.screenshot({
clip: { x: pkt.x, y: pkt.y, width: 1, height: 1 }, type: "png",
});
/* Der Farbwert steckt im PNG. Statt es zu entpacken, wird die
AUFNAHME selbst verglichen: Zwei Aufnahmen desselben Bildpunkts
sind byteweise gleich, wenn die Farbe gleich ist. Das ist genau
die Frage, und sie braucht keinen Decoder. */
return bild.toString("base64");
};
const mitBild = { kachel: await punktFarbe(punkte.kachel), frei: await punktFarbe(punkte.frei) };
await s.addStyleTag({ content: "body.start::before { display: none !important; }" });
await s.waitForTimeout(350);
const ohneBild = { kachel: await punktFarbe(punkte.kachel), frei: await punktFarbe(punkte.frei) };
/* ZUERST DIE GEGENPROBE. Ohne sie waere die Hauptmessung wertlos. */
ok(mitBild.frei !== ohneBild.frei,
"Gegenprobe: auf der freien Fläche ändert sich etwas, wenn das Bild weg ist — es ist also wirklich da");
ok(mitBild.kachel === ohneBild.kachel,
mitBild.kachel === ohneBild.kachel
? "auf der Kachel ändert sich NICHTS — sie deckt, das Bild kommt nicht durch die Schrift"
: "das Bühnenbild scheint durch die Kachel — dort läge Schrift auf einem Foto");
/* Die Fläche darum MUSS durchlassen, sonst gäbe es gar kein Bild zu
sehen -- das ist die Hälfte des Wunsches. */
const flaeche = await s.evaluate(() => {
const c = getComputedStyle(document.querySelector(".chat")).backgroundColor;
/* ZWEI SCHREIBWEISEN, NICHT EINE (20.09.2026).
Der erste Anlauf suchte nur `rgba(...)`. Chrome gibt das
Ergebnis von `color-mix()` aber als `color(srgb r g b / a)`
zurueck -- die Suche fand nichts, der Rueckfall war „Alpha 1",
und die Pruefung meldete „deckt" bei einer Flaeche, die
durchscheint. Ein Messfehler, der genau das Gegenteil behauptet. */
const alphaVon = (farbe) => {
const rgba = farbe.match(/rgba?\(([^)]+)\)/);
if (rgba) {
const t = rgba[1].split(",").map((x) => parseFloat(x));
return t.length > 3 ? t[3] : 1;
}
const srgb = farbe.match(/color\([^/)]*\/\s*([\d.]+)\s*\)/);
if (srgb) return parseFloat(srgb[1]);
return farbe === "transparent" ? 0 : 1;
};
return { alpha: alphaVon(c), roh: c,
buehne: getComputedStyle(document.body, "::before").backgroundImage };
});
ok(flaeche.alpha < 0.98,
`die Fläche um die Kacheln lässt durch (Alpha ${flaeche.alpha.toFixed(2)}, ${flaeche.roh})`);
ok(/\.webp|\.png|\.jpg/i.test(flaeche.buehne || ""),
`und dahinter steht wirklich ein Bild (…${(flaeche.buehne || "").slice(-30)}`);
const lage = await s.evaluate(() => ({
blasen: document.querySelectorAll(".chat-nachricht__blase").length,
knopf: !!document.querySelector(".chat__kachelknopf:not([hidden])"),
}));
ok(lage.blasen >= 2, `die Nachrichten stehen in Kacheln (${lage.blasen})`);
ok(lage.knopf, "der Knopf für die eigene Kachel steht da");
/* Und er lässt sich bedienen. */
await s.click(".chat__kachelknopf");
await s.waitForTimeout(400);
const wahl = await s.evaluate(() => {
const dlg = document.querySelector("#kachel-wahl[open]");
const toene = [...document.querySelectorAll(".chat-kachelwahl__ton")];
return {
offen: !!dlg,
toene: toene.length,
mitNamen: toene.filter((t) => (t.getAttribute("aria-label") || "").length > 2).length,
hoch: toene.length ? Math.round(toene[0].getBoundingClientRect().height) : 0,
};
});
ok(wahl.offen, "die Auswahl geht auf");
ok(wahl.toene === CHAT_KACHELN.length,
`mit allen ${CHAT_KACHELN.length} Tönen (${wahl.toene})`);
ok(wahl.mitNamen === wahl.toene,
`jeder trägt seinen Namen (${wahl.mitNamen}) — wer Farben schlecht unterscheidet, wählt sonst blind`);
ok(wahl.hoch >= 44, `und ist am Finger treffbar (${wahl.hoch} px)`);
/* Eine andere wählen und nachsehen, ob die eigenen Kacheln sofort
umspringen -- ohne Neuladen. */
/* DIE FARBE STECKT IM VERLAUF, nicht in `backgroundColor`.
Auch das war erst falsch: Eine Kachel mit `background:
linear-gradient(...)` hat `backgroundColor: rgba(0,0,0,0)` -- der
Vergleich lieferte zweimal „durchsichtig" und meldete „springt
nicht um" bei einer Kachel, die sehr wohl umsprang. Beides wird
gelesen und aneinandergehaengt; dann ist es egal, welche der
beiden Stellen die Farbe traegt. */
const kachelBild = () => s.evaluate(() => {
const b = document.querySelector('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase');
const c = getComputedStyle(b);
return c.backgroundColor + " | " + c.backgroundImage;
});
const vorher = await kachelBild();
await s.click('.chat-kachelwahl__ton[data-wert="wein"]');
await s.waitForTimeout(600);
const nachher = await kachelBild();
ok(vorher !== nachher,
`die eigenen Kacheln springen sofort um (${vorher.slice(0, 46)} → ${nachher.slice(0, 46)})`);
/* UND ES IST GESPEICHERT, nicht nur gemalt. */
const nachSetzen = await (await fetch(BASIS + "/workspace/api/chat/kacheln",
{ headers: { Cookie: kFilipe } })).json();
ok(nachSetzen.meine === "wein",
`und die Wahl ist gespeichert, nicht nur gemalt (${nachSetzen.meine})`);
ok(konsole.length === 0,
konsole.length ? "Fehler im Browser: " + konsole[0].slice(0, 80) : "keine Fehler im Browser");
await ctx.close();
} finally {
await browser.close();
}
console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`);
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
process.exit(fehler ? 1 : 0);
+123 -1
View File
@@ -174,6 +174,65 @@ function bildWegFuer(personId) {
} catch { return null; }
}
/* =====================================================================
JEDER ACCOUNT SEINE EIGENE KACHEL (20.09.2026)
Filipe: „jeder account soll seine kachel personalisieren koennen."
---------------------------------------------------------------------
EINE AUSWAHL, KEIN FARBWAEHLER
Ein freier Farbwaehler klingt grosszuegiger und ist die schlechtere
Loesung: Mit ihm laesst sich Schwarz auf Schwarz einstellen, oder
Neongelb, das jedem anderen im Gespraech in die Augen sticht. Die
Kachel gehoert einem selbst, GESEHEN wird sie von allen anderen --
deshalb ist sie kein Platz fuer etwas, das man nicht abschalten kann.
Die zwoelf Toene hier sind alle gleich dunkel und gleich gesaettigt.
Sie unterscheiden sich im Farbton und in sonst nichts. Damit ist der
Kontrast zur Schrift bei jedem gleich -- er muss nicht bei jedem
einzeln geprueft werden, und niemand kann sich unlesbar machen.
Augenschonend ist hier keine Geschmacksfrage: Ein Chat ist die
Seite, auf der am laengsten gelesen wird.
KEINE der zwoelf ist hell. Das ist Absicht und nicht Sparsamkeit --
die Schrift ist hell, und eine helle Kachel waere fuer die Person,
die sie waehlt, hübsch und fuer alle anderen unlesbar.
===================================================================== */
export const CHAT_KACHELN = [
{ wert: "grund", name: "Standard", farbe: "#131a25" },
{ wert: "tinte", name: "Tinte", farbe: "#141c2e" },
{ wert: "veilchen", name: "Veilchen", farbe: "#1d1730" },
{ wert: "pflaume", name: "Pflaume", farbe: "#251729" },
{ wert: "wein", name: "Wein", farbe: "#2a1620" },
{ wert: "ziegel", name: "Ziegel", farbe: "#2a1a17" },
{ wert: "bernstein", name: "Bernstein", farbe: "#271f14" },
{ wert: "moos", name: "Moos", farbe: "#16251b" },
{ wert: "tanne", name: "Tanne", farbe: "#132622" },
{ wert: "lagune", name: "Lagune", farbe: "#122429" },
{ wert: "stahl", name: "Stahl", farbe: "#1b2128" },
{ wert: "schiefer", name: "Schiefer", farbe: "#20201f" },
];
/** Nur ein Ton aus der Liste kommt durch -- sonst nichts.
*
* DIE PRUEFUNG STEHT HIER UND NICHT NUR IM FORMULAR. Was aus der
* Datenbank kommt, koennte aus einer aelteren Fassung stammen oder
* von einem Aufruf an der Oberflaeche vorbei; ein unbekannter Wert
* wanderte sonst als CSS-Farbe in die Seite. `null` heisst
* „Standard", und das ist ein gueltiger Zustand. */
export function kachelPruefen(wert) {
if (!wert) return null;
return CHAT_KACHELN.some((k) => k.wert === String(wert)) ? String(wert) : null;
}
function kachelFuer(personId) {
try {
return kachelPruefen(db().prepare(
"SELECT chat_kachel FROM personen WHERE id = ?").get(personId)?.chat_kachel);
} catch { return null; }
}
function teilnehmerVon(raumId) {
return db().prepare(`
SELECT t.person_id AS id, p.name, p.rolle, p.bild, t.leitung, t.gelesen_bis
@@ -465,6 +524,54 @@ chatRouter.get("/workspace/api/chat/partner", (req, res) => {
});
/** Meine Gespräche, das jüngste zuerst. */
/* =====================================================================
DIE EIGENE KACHEL EINSTELLEN (20.09.2026)
Filipe: „jeder account soll seine kachel personalisieren koennen."
ZWEI WEGE, WEIL ES ZWEI FRAGEN SIND: „welche gibt es" und „das will
ich". Die Liste kommt vom Server, damit im Browser keine zweite
Fassung der zwoelf Toene steht -- die waere beim dreizehnten die
vergessene.
NUR FUER SICH SELBST. Es gibt keinen Weg, die Kachel eines anderen
zu setzen, und das ist keine Luecke: Die Kachel ist das Einzige auf
dieser Seite, das einem selbst gehoert. Ein Recht der Leitung darauf
waere ein Recht, jemandem seine Farbe wegzunehmen.
===================================================================== */
chatRouter.get("/workspace/api/chat/kacheln", (req, res) => {
try {
res.json({
kacheln: CHAT_KACHELN,
meine: kachelFuer(req.person.id),
});
} catch (f) {
console.error("[chat] Kacheln:", f?.message);
res.status(503).json({ fehler: "nicht_verfuegbar" });
}
});
chatRouter.put("/workspace/api/chat/kachel", express.json({ limit: "2kb" }),
gleicheHerkunft, (req, res) => {
try {
const roh = req.body?.kachel;
/* LEER IST GUELTIG und heisst "Standard". Wer sich umentscheidet,
braucht einen Weg zurueck -- eine Einstellung ohne Rueckweg ist
eine Falle, keine Einstellung. */
const wert = (roh === null || roh === "" || roh === "grund")
? null : kachelPruefen(roh);
if (roh && roh !== "grund" && wert === null) {
return res.status(400).json({ fehler: "unbekannte_kachel" });
}
db().prepare("UPDATE personen SET chat_kachel = ? WHERE id = ?")
.run(wert, req.person.id);
res.json({ kachel: wert });
} catch (f) {
console.error("[chat] Kachel setzen:", f?.message);
res.status(503).json({ fehler: "nicht_verfuegbar" });
}
});
chatRouter.get("/workspace/api/chat/raeume", (req, res) => {
try {
/* WEGGERÄUMTE GESPRÄCHE STEHEN NICHT IN DER LISTE.
@@ -888,7 +995,7 @@ chatRouter.get("/workspace/api/chat/raeume/:id/nachrichten", (req, res) => {
const weg = geloeschtBis(raumId, req.person.id);
const reihen = db().prepare(`
SELECT n.id, n.person_id, n.text, n.erstellt, n.weg_am, p.name AS von, p.rolle,
p.bild AS von_bild,
p.bild AS von_bild, p.chat_kachel AS von_kachel,
n.antwort_auf, n.angeheftet_am,
n.anhang_name, n.anhang_art, n.anhang_typ, n.anhang_groesse,
n.anhang_breite, n.anhang_hoehe,
@@ -974,6 +1081,17 @@ chatRouter.get("/workspace/api/chat/raeume/:id/nachrichten", (req, res) => {
reaktionen: reakt.get(n.id) || [],
id: n.id, von_id: n.person_id, von: n.von || "Gelöscht", rolle: n.rolle,
von_bild: n.von_bild ? `/workspace/api/steckbrief/bild/${n.von_bild}` : null,
/* DIE EIGENE KACHELFARBE (20.09.2026).
Filipe: "jeder account soll seine kachel personalisieren
koennen."
Sie kommt aus `personen`, nicht aus der Nachricht: Wer seine
Farbe aendert, aendert sie fuer ALLE seine Nachrichten,
auch die von gestern. Die Farbe an jede Zeile zu schreiben
waere eine zweite Wahrheit -- und nach der ersten Aenderung
haette dieselbe Person zwei Farben im selben Gespraech. */
von_kachel: kachelPruefen(n.von_kachel),
text: n.weg_am ? null : n.text,
zurueckgenommen: !!n.weg_am,
erstellt: n.erstellt,
@@ -1093,6 +1211,10 @@ chatRouter.post("/workspace/api/chat/raeume/:id/nachrichten", gleicheHerkunft,
laedt, ein Gesicht. Derselbe Mensch, zwei Darstellungen, und
der Unterschied haengt nur daran, wann man geschaut hat. */
von_bild: bildWegFuer(req.person.id),
/* Auch hier -- sonst kaeme die frisch gesendete Nachricht ohne
Farbe bei den anderen an und faerbte sich erst beim naechsten
Laden. Derselbe Fehler wie beim Bild eine Zeile darueber. */
von_kachel: kachelFuer(req.person.id),
rolle: req.person.rolle, text, erstellt: n, zurueckgenommen: false,
antwort: zitat ? {
id: antwortAuf, von: zitat.von || "Gelöscht",
+7
View File
@@ -2491,6 +2491,13 @@ function umstellungen(d) {
["personen", "instagram", "TEXT"],
["personen", "youtube", "TEXT"],
["personen", "twitch", "TEXT"],
/* Die eigene Kachelfarbe im Chat (20.09.2026). Ein Schluessel aus
CHAT_KACHELN, nicht die Farbe selbst: Sonst stuende in der
Datenbank ein CSS-Wert, und eine Aenderung am Farbton hiesse,
jede Zeile anzufassen. NULL heisst "Standard" und ist der
Normalfall -- ein Pflichtwert waere eine Entscheidung, die
niemand treffen wollte. */
["personen", "chat_kachel", "TEXT"],
/* ---- Wiederkehrende Termine (02.09.2026) ----
Drei Spalten an `termine`, damit eine Ausprägung weiss, woher sie
+4 -4
View File
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
<link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -125,6 +125,6 @@
</main>
␍␍
<script src="assets/js/anruf-probe.js?v=202609201909" defer></script>
<script src="assets/js/anruf-probe.js?v=202609202225" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609201909",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609202225",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609201909",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609202225",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609201909",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609202225",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609201909",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609202225",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+230 -5
View File
@@ -61,9 +61,33 @@
gap: 0;
border: 1px solid var(--rand);
border-radius: var(--radius);
/* ==== DAS BUEHNENBILD SCHEINT DURCH (20.09.2026) ==================
Filipe: „ich will auch ein krasses hintergrundbild fuer den treff
chat. und die texte sollen immer in einer kachel sein."
BEIDES ZUSAMMEN, und in dieser Reihenfolge -- sie bedingen
einander: Ein Bild hinter dem Chat geht nur, WENN der Text auf
einer deckenden Kachel steht. Sonst liegt Schrift auf einem Foto,
und das ist an der hellsten Stelle unlesbar. Genau deshalb ist der
zweite Satz kein Zusatzwunsch, sondern die Bedingung fuer den
ersten.
WARUM KEIN EIGENES BILD, SONDERN DAS DER SEITE: Hinter jeder Seite
steht ohnehin eine Buehne (start.css, neun Szenen, fuer den Chat
die Lounge). Sie lag bisher hinter einer deckenden Flaeche --
vorhanden, geladen, unsichtbar. Sie durchscheinen zu lassen kostet
KEINE einzige Datei mehr, und auf der Adresse von Team Dogi kommt
damit von selbst deren eigene Fassung (crew-buehne-lounge), ohne
dass hier eine zweite Liste von neun Bildern stuende. Eine solche
Liste waere die, die beim zehnten Motiv vergessen wird.
DER SCHLEIER IST NICHT DEKORATION. Ohne ihn waere die Liste links
(Namen, Vorschauzeilen) Text direkt auf dem Foto. Er ist deshalb
kraeftig und wird gemessen, nicht geschaetzt. */
background:
radial-gradient(120% 90% at 0% 0%, rgba(255, 255, 255, .03), transparent 55%),
var(--flaeche);
color-mix(in srgb, var(--flaeche) 88%, transparent);
overflow: hidden;
}
@@ -250,6 +274,16 @@
overflow-y: auto;
padding: 18px 18px 8px;
display: flex; flex-direction: column; gap: 3px;
/* IM VERLAUF DARF MEHR DURCHKOMMEN als in der Liste links: Hier steht
jede Zeile auf einer eigenen, deckenden Kachel -- dazwischen ist
Luft, und durch die Luft sieht man den Raum. Links stehen Namen
ohne Kachel, dort bleibt es dichter.
Ein eigener Schleier statt einer Aenderung am Grund darueber: So
hat jede der beiden Spalten ihren Wert, und eine Aenderung an der
einen verstellt die andere nicht. */
background: linear-gradient(180deg,
color-mix(in srgb, var(--grund) 58%, transparent),
color-mix(in srgb, var(--grund) 34%, transparent));
/* Ein weicher Schleier am oberen Rand: Der Verlauf scrollt unter den
Kopf, statt an einer harten Kante abgeschnitten zu wirken. */
mask-image: linear-gradient(180deg, transparent, #000 14px);
@@ -323,7 +357,19 @@
padding: 10px 13px 7px;
border: 1px solid var(--rand);
border-radius: 14px 14px 14px 4px;
background: rgba(255, 255, 255, .045);
/* DECKEND, NICHT DURCHSCHEINEND (20.09.2026).
Hier stand `rgba(255,255,255,.045)` -- praktisch durchsichtig. Das
war richtig, solange dahinter eine ruhige Flaeche lag. Seit das
Buehnenbild durchscheint, waere es Schrift auf einem Foto: an der
dunklen Stelle lesbar, an der hellen nicht, und beim Scrollen
wechselt es.
`--kachel` statt einer festen Farbe: Darueber personalisiert jeder
Account seine eigene Kachel (siehe weiter unten). Der Rueckfall
ist die Hausfarbe -- wer nichts einstellt, bekommt das, was vorher
auch da war, nur deckend. */
background: var(--kachel, #131a25);
min-width: 0;
}
.chat-nachricht[data-folge="ja"] .chat-nachricht__blase { border-radius: 14px 14px 14px 8px; }
@@ -333,7 +379,10 @@
.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase {
grid-column: 1;
border-radius: 14px 14px 4px 14px;
background: color-mix(in srgb, var(--akzent) 16%, transparent);
/* Auch die eigene deckt jetzt. `color-mix` auf `transparent` liesse
das Foto durch -- gemischt wird deshalb auf die Hausflaeche. */
background: var(--kachel,
color-mix(in srgb, var(--akzent) 16%, #131a25));
border-color: color-mix(in srgb, var(--akzent) 30%, transparent);
}
.chat-nachricht[data-selbst="ja"][data-folge="ja"] .chat-nachricht__blase {
@@ -666,9 +715,25 @@
}
.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase {
border-radius: 16px 16px 5px 16px;
/* DIESE REGEL IST DIE ZWEITE FÜR DIESELBE KACHEL (20.09.2026).
Weiter oben steht schon eine -- und genau daran wäre die eigene
Kachel beinahe transparent geblieben: Dort wurde `--kachel`
eingebaut, hier gewinnt der Verlauf, und der kannte die Farbe
nicht. Gemessen am Bildschirm: rgba(0,0,0,0), also nichts.
Dass es zwei Stellen gibt, ist gewachsen (Grundform oben,
Feinschliff hier). Sie zusammenzulegen wäre ein größerer Umbau an
einer Datei, die heute schon viel abbekommen hat -- deshalb
stattdessen: BEIDE kennen `--kachel`, und diese Zeile hier sagt
es dazu.
.95 ist zu .99 geworden: Seit das Bühnenbild durchscheint, sind
fünf Prozent Foto in der Schriftfläche sichtbar -- und zwar
wandernd, weil das Bild fest steht und die Kachel scrollt. */
background: linear-gradient(160deg,
color-mix(in srgb, var(--akzent) 26%, rgba(17, 24, 37, .95)),
color-mix(in srgb, var(--akzent) 12%, rgba(12, 17, 27, .95)));
color-mix(in srgb, var(--akzent) 26%, var(--kachel, rgba(17, 24, 37, .99))),
color-mix(in srgb, var(--akzent) 12%, var(--kachel, rgba(12, 17, 27, .99))));
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .10),
0 2px 8px -3px color-mix(in srgb, var(--akzent) 45%, transparent);
@@ -1637,6 +1702,89 @@
.anruf__bild--ich { max-width: 88px; }
.anruf__name { font-size: .8rem; color: var(--text-leise); }
/* =====================================================================
WER IST DRAN (20.09.2026)
Filipe: „die soll auch viel besser geiler und spezieller aussehen,
aber nicht so raushängen."
„Nicht raushängen" ist dabei die schärfere der beiden Vorgaben, und
sie steht hier zuerst: Der Kasten ist 340 px breit und liegt in der
Ecke. Alles darin muss mit dieser Breite auskommen — bei einem
Gruppenanruf mit drei Leuten genauso wie bei einem Gespräch zu
zweit. Deshalb ein Raster mit `auto-fit`, das misst statt zu
rechnen, und ein Name, der umbricht statt zu schieben.
Vorher stand hier je Person das Wort „Verbunden" — bei dreien
dreimal dasselbe Wort, ohne Namen.
===================================================================== */
.anruf__leute:has(.anruf__gesicht) {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(84px, 1fr));
gap: 10px;
justify-items: center;
}
.anruf__gesicht {
display: flex; flex-direction: column; align-items: center; gap: 5px;
min-width: 0; max-width: 100%;
text-align: center;
}
.anruf__kreis {
display: grid; place-items: center;
width: 46px; height: 46px;
border-radius: 50%;
border: 1px solid color-mix(in srgb, var(--gut, #79d1a2) 45%, var(--rand));
background: color-mix(in srgb, var(--gut, #79d1a2) 14%, #0b1018);
color: color-mix(in srgb, var(--gut, #79d1a2) 35%, #ffffff);
font-size: .95rem; font-weight: 700;
letter-spacing: .02em;
}
/* Der Name darf umbrechen und wird notfalls gekürzt -- er ist das
Einzige hier, dessen Länge wir nicht kennen. */
.anruf__gesicht .anruf__name {
max-width: 100%;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
font-weight: 600; color: var(--text);
}
.anruf__stand { font-size: .72rem; color: var(--text-still); }
/* ---- Es klingelt noch -------------------------------------------------
EIN RUHIGER PULS, kein Blinken. Augenschonend ist hier keine
Geschmacksfrage: Der Kasten steht am Bildrand und läuft, solange das
Gespräch läuft. Ein Blinken dort wäre nach zwei Minuten
unerträglich. Deshalb ein weicher Ring, der nach außen ausläuft --
dieselbe Bewegung wie beim Punkt in der Kopfzeile. */
.anruf__gesicht[data-lage="wartet"] .anruf__kreis {
border-color: color-mix(in srgb, var(--akzent) 45%, var(--rand));
background: color-mix(in srgb, var(--akzent) 12%, #0b1018);
color: color-mix(in srgb, var(--akzent) 30%, #ffffff);
position: relative;
}
.anruf__gesicht[data-lage="wartet"] .anruf__kreis::after {
content: "";
position: absolute; inset: -5px;
border-radius: 50%;
border: 1px solid color-mix(in srgb, var(--akzent) 40%, transparent);
animation: anruf-ring 2.4s ease-out infinite;
}
@keyframes anruf-ring {
0% { transform: scale(.88); opacity: .75; }
70% { transform: scale(1.18); opacity: 0; }
100% { transform: scale(1.18); opacity: 0; }
}
/* Während es klingelt ist das Gesicht größer -- es ist in diesem
Moment das Einzige, worauf man schaut. */
.anruf__gesicht[data-lage="wartet"] .anruf__kreis { width: 58px; height: 58px; font-size: 1.1rem; }
@media (prefers-reduced-motion: reduce) {
.anruf__gesicht[data-lage="wartet"] .anruf__kreis::after { animation: none; opacity: .5; }
}
@media (forced-colors: active) {
.anruf__kreis { border: 2px solid CanvasText; }
.anruf__gesicht[data-lage="wartet"] .anruf__kreis { border-color: Highlight; }
.anruf__gesicht[data-lage="wartet"] .anruf__kreis::after { display: none; }
}
.anruf__knoepfe { display: flex; flex-wrap: wrap; gap: 8px; }
.anruf__knopf {
min-height: 40px;
@@ -2208,3 +2356,80 @@
@media (forced-colors: active) {
.anruf__stumm { border: 2px solid CanvasText; animation: none; }
}
/* =====================================================================
MEINE KACHEL (20.09.2026)
Filipe: „jeder account soll seine kachel personalisieren können."
Der Knopf ist ein FARBFLECK, kein Wort. Er zeigt, was eingestellt
ist — ein Knopf mit der Aufschrift „Kachel" müsste erst geöffnet
werden, damit man sieht, was gerade gilt.
===================================================================== */
.chat__kachelknopf {
flex: 0 0 auto;
margin-left: auto;
width: 30px; height: 30px;
padding: 3px;
border: 1px solid var(--rand-hell);
border-radius: 9px;
background: transparent;
cursor: pointer;
display: inline-flex; align-items: center; justify-content: center;
}
.chat__kachelknopf:hover { border-color: var(--akzent); }
.chat__kachelknopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
.chat__kachelknopf-probe {
display: block; width: 100%; height: 100%;
border-radius: 6px;
/* Eine feine Innenkante, damit ein sehr dunkler Ton nicht aussieht
wie ein Loch im Knopf. */
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .10);
}
/* „Neu" steht danach und schiebt sich nicht mehr selbst -- der
Farbfleck hat den auto-Rand übernommen. Zwei auto-Ränder
nebeneinander teilen sich den Platz und reißen die Knöpfe
auseinander; derselbe Fehler stand am 11.09. schon im Verlaufskopf. */
.chat__kopf #neu-oeffnen { flex: 0 0 auto; margin-left: 8px; }
.chat-kachelwahl__gitter {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(62px, 1fr));
gap: 8px;
margin: 14px 0 4px;
}
.chat-kachelwahl__ton {
position: relative;
min-height: 48px; /* am Finger treffbar */
border: 1px solid var(--rand);
border-radius: 12px;
cursor: pointer;
display: flex; align-items: center; justify-content: center;
color: var(--text);
font: inherit; font-size: .84rem;
}
.chat-kachelwahl__wort { opacity: .9; }
.chat-kachelwahl__ton:hover { border-color: var(--rand-hell); }
.chat-kachelwahl__ton:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
/* DIE WAHL WIRD MIT EINEM HAKEN ANGEZEIGT, nicht nur mit einem
helleren Rahmen: Auf zwölf dunklen Feldern ist ein Rahmen mehr der
Unterschied, den man sucht — ein Haken ist der, den man sieht. */
.chat-kachelwahl__ton[aria-checked="true"] {
border-color: var(--akzent);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--akzent) 45%, transparent);
}
.chat-kachelwahl__ton[aria-checked="true"]::after {
content: "¹3";
position: absolute; top: 3px; right: 6px;
font-size: .8rem; font-weight: 700;
color: var(--akzent);
}
@media (forced-colors: active) {
.chat-kachelwahl__ton[aria-checked="true"] { border: 3px solid Highlight; }
.chat__kachelknopf { border: 1px solid CanvasText; }
/* Im Kontrastmodus gibt es keine Farbflächen -- dann sind die zwölf
Töne ununterscheidbar, und nur der Name trägt. Er steht ohnehin
im aria-label und im title. */
}
+28 -1
View File
@@ -439,8 +439,35 @@ body.gate {
vervollständigt ihn. Deshalb tritt sie zurück, statt zu warnen —
augenschonend heißt hier ausdrücklich auch: keine Signalfarbe für
etwas, das keine Warnung ist. */
/* ---- DER ABSTAND IST EINE REGEL, KEINE ZAHL (korrigiert 20.09.2026) --
Hier stand `margin: -18px 0 26px`. Die -18 waren gegen die 26 px
gerechnet, die `.unterzeile` darueber mitbringt -- Netto acht Pixel
Abstand, und auf der Torseite sah das richtig aus.
AUF DER BEFINDENS-SEITE UEBERLAGERTEN SICH DIE BEIDEN ABSAETZE UM
GENAU 18 PIXEL. Dort steht die Unterzeile in einer Kopfzeile, und
`start.css` setzt deren `margin-bottom` auf 0. Aus 26 minus 18 wurde
0 minus 18. Zwei fuer sich richtige Regeln, und dazwischen Text ueber
Text -- ausgerechnet im Satz „Deine Antworten liest niemand ausser
dir", also dort, wo Vertrauen entsteht.
Gefunden hat es ein Bildschirmfoto, nicht das Lesen: Beide Regeln
sehen einzeln vernuenftig aus.
DIE LEHRE IST NICHT „-18 auf -8 aendern" -- das waere dieselbe Zahl
mit einem anderen Wert und beim naechsten Zusammentreffen wieder
falsch. Stattdessen bestimmt der Absatz DAVOR seinen Abstand selbst,
und zwar nur dann, wenn der Zusatz wirklich folgt (`:has`). Damit
sind es IMMER acht Pixel, egal in welcher Umgebung.
Die Klasse steht doppelt (`.unterzeile.unterzeile`), um dieselbe
Staerke wie `.willkommen .unterzeile` zu uebertreffen -- sonst
entschiede die Ladereihenfolge, und gate.css laedt zuerst. */
.unterzeile.unterzeile:has(+ .unterzeile--zusatz) { margin-bottom: 8px; }
.unterzeile--zusatz {
margin: -18px 0 26px;
margin: 0 0 26px;
padding-left: 11px;
border-left: 2px solid var(--rand);
max-width: 62ch;
+139 -7
View File
@@ -251,6 +251,82 @@
* klingelt …" -- man sah nicht, wen man anruft. */
const wer = (text) => { const w = $('anruf-wer'); if (w) w.textContent = text; };
/* =====================================================================
WER IST DRAN -- MIT NAMEN UND GESICHT (20.09.2026)
Filipe, zur Anrufbox: „die soll auch viel besser geiler und
spezieller aussehen, aber nicht so raushaengen."
DER GROESSTE MANGEL WAR KEIN SCHOENHEITSFEHLER. In einem Anruf
ohne Video stand unter dem Kasten das Wort „Verbunden" -- einmal
je Person. Bei dreien stand es dreimal, und man sah nicht, WER
verbunden war. In einer Gruppe ist genau das die Frage: Ist Luna
schon drin? Hoert der Modi mit?
Es gibt keine Profilbilder im Anruf -- die Sitzung liefert sie
nicht mit, und sie dafuer durch eine Abfrage zu holen, die auf
JEDER Seite laeuft, waere an der falschen Stelle gespart und an
der falschen teuer. Stattdessen dasselbe Mittel wie im Chat: der
Anfangsbuchstabe in einem Kreis. Er ist sofort da, kostet nichts
und unterscheidet in einer Gruppe von drei bis fuenf Leuten
zuverlaessig.
WAEHREND ES KLINGELT steht dort, WEN man anruft -- gross, mit
einem ruhigen Puls. Vorher war die Flaeche in diesem Moment leer,
und ein leerer Kasten mit „Es klingelt ..." sieht aus wie einer,
der haengt. Es ist die Sekunde, in der man am unsichersten ist.
===================================================================== */
/** Die Namen aller, die im Anruf sind -- id -> Name.
*
* Auf dem Anruf selbst und nicht daneben: Endet er, ist die Karte
* mit ihm weg. Eine Karte, die einen Anruf ueberlebt, zeigt beim
* naechsten Namen von gestern. */
function namenMerken(liste) {
if (!anruf || !Array.isArray(liste)) return;
if (!anruf.namen) anruf.namen = new Map();
for (const w of liste) if (w && w.id != null) anruf.namen.set(w.id, w.name || '');
}
/** Ein bis zwei Buchstaben aus einem Namen -- dieselbe Regel wie im
* Chat: bei zwei Wörtern die Anfangsbuchstaben beider, sonst der
* erste. „Luna Sanchez" -> LS, „Dogi" -> D. */
function zeichenVon(name) {
const teile = String(name || '').trim().split(/\s+/).filter(Boolean);
if (!teile.length) return '?';
if (teile.length === 1) return teile[0][0].toUpperCase();
return (teile[0][0] + teile[teile.length - 1][0]).toUpperCase();
}
/** Ein Gesichtsfeld: Kreis mit Buchstaben, Name darunter.
*
* `lage` ist 'da' (verbunden) oder 'wartet' (klingelt noch) -- das
* Stilblatt macht daraus den Unterschied zwischen ruhig und
* pulsierend. Der Zustand steht auch im Text darunter: Ein Puls
* allein ist nichts, was ein Vorleseprogramm ansagen kann. */
function gesichtsfeld(name, lage, stumm) {
const k = el('div', 'anruf__gesicht');
k.dataset.lage = lage;
const kreis = el('span', 'anruf__kreis', zeichenVon(name));
/* Der Kreis traegt zwei Buchstaben -- als Bild, nicht als Text.
Ein Vorleseprogramm soll „Luna Sanchez, klingelt" sagen und
nicht „L S". */
kreis.setAttribute('aria-hidden', 'true');
k.append(kreis);
if (stumm) {
/* KEINE WIEDERHOLUNG DESSEN, WAS DIREKT DARUEBER STEHT.
Beim Anruf zu zweit sagt die Kopfzeile schon „Luna Sanchez" und
„Es klingelt ..." -- beides zwei Zeilen tiefer noch einmal
hinzuschreiben macht den Kasten hoeher und sagt nichts dazu.
Fuer Vorleseprogramme bleibt der Name trotzdem am Element. */
k.setAttribute('aria-label', `${name || 'Jemand'} – klingelt`);
return k;
}
k.append(el('span', 'anruf__name', name || 'Jemand'));
k.append(el('span', 'anruf__stand', lage === 'da' ? 'ist dabei' : 'klingelt …'));
return k;
}
/** Einen Schalter auf an/aus stellen.
*
* Die Aufschrift bleibt IMMER dieselbe (die Sache), der Zustand
@@ -408,13 +484,30 @@
}
async function starten(raumId, mitVideo, raumName) {
/* WEN RUFE ICH AN? Der Chat weiss es und gibt es mit. Faellt
der Name aus (aelterer Aufruf), bleibt es bei „Anruf" --
das ist immer noch richtig, nur weniger. */
wer(raumName || 'Anruf');
if (anruf) return;
kastenBauen();
$('anruf').hidden = false;
/* WEN RUFE ICH AN? Der Chat weiss es und gibt es mit. Faellt
der Name aus (aelterer Aufruf), bleibt es bei „Anruf" --
das ist immer noch richtig, nur weniger.
NACH `kastenBauen()`, UND DAS IST DER PUNKT (20.09.2026):
Vorher stand diese Zeile DAVOR. Da gibt es das Element
`#anruf-wer` noch gar nicht -- `wer()` fand nichts, tat nichts,
und der Name war weg. Oben stand deshalb bei JEDEM ersten Anruf
„Anruf" statt „Luna Sanchez", obwohl der Chat ihn korrekt
mitgab. Der Kommentar daneben beschrieb die Absicht und nicht,
was passierte -- ein Kommentar, der eine Absicht beschreibt,
erfuellt sie nicht.
Gefunden hat es ein Bildschirmfoto, nicht das Lesen: Der Code
liest sich richtig, und der Rueckfall „Anruf" ist plausibel
genug, um nicht aufzufallen.
Der frueher hier stehende `if (anruf) return;` ist mit nach oben
gewandert. Das ist auch sachlich besser: Laeuft schon ein
Gespraech, soll ein zweiter Aufruf es nicht umbenennen. */
wer(raumName || 'Anruf');
/* JEDES GESPRAECH FAENGT LEISE AN (20.09.2026) -- an BEIDEN
Wegen, Anrufen und Rangehen. Einer allein waere die
Haelfte, und die andere Haelfte faellt niemandem auf,
@@ -449,6 +542,10 @@
$('anruf-video').hidden = !mitVideo;
if (mitVideo) $('anruf-video').setAttribute('aria-pressed', 'true');
lage('Es klingelt …');
/* JETZT ZEICHNEN, nicht erst wenn jemand rangeht: Dies ist der
Moment, in dem die Flaeche bisher leer war -- und ein leerer
Kasten mit „Es klingelt ..." sieht aus wie einer, der haengt. */
leuteZeichnen();
/* DAS FREIZEICHEN. Ein stiller Kasten mit laufender Uhr sagt nur,
dass etwas passiert -- nicht, was. */
freiTon();
@@ -528,6 +625,7 @@
/* Mit allen, die schon dabei sind, eine Verbindung aufbauen --
aber das ANGEBOT macht nur, wer die kleinere Nummer hat. */
namenMerken(d.wer);
for (const p of d.wer || []) {
if (p.id === ichId) continue;
if (ichId < p.id) angebotMachen(p.id);
@@ -580,20 +678,38 @@
eigen.srcObject = anruf.eigener;
ziel.append(eigen);
}
for (const [wer, strom] of anruf.stroeme) {
for (const [werId, strom] of anruf.stroeme) {
if (anruf.video) {
const v = el('video', 'anruf__bild');
v.autoplay = true; v.playsInline = true;
v.srcObject = strom;
ziel.append(v);
} else {
/* Der Ton muss abgespielt werden -- das Element bleibt, nur
unsichtbar. Es traegt die Verbindung, nicht die Anzeige. */
const t = el('audio');
t.autoplay = true;
t.srcObject = strom;
ziel.append(t);
ziel.append(el('span', 'anruf__name', 'Verbunden'));
/* HIER STAND „Verbunden" -- einmal je Person, ohne Namen.
Bei dreien dreimal dasselbe Wort, und man sah nicht, wer. */
ziel.append(gesichtsfeld(anruf.namen?.get(werId), 'da'));
}
}
/* ---- NOCH NIEMAND DRAN: zeigen, WEN man anruft ----------------
Die Flaeche war in diesem Moment leer, und ein leerer Kasten mit
„Es klingelt ..." sieht aus wie einer, der haengt -- ausgerechnet
in der Sekunde, in der man am unsichersten ist. */
if (!anruf.video && !anruf.stroeme.size) {
const gegenueber = $('anruf-wer')?.textContent?.trim();
/* „Anruf" ist der Rueckfalltext, kein Name -- dann lieber gar
kein Gesicht als ein Kreis mit „A" darin. */
if (gegenueber && gegenueber !== 'Anruf') {
/* `true`: Name und Zustand stehen schon in der Kopfzeile --
siehe die Begruendung in `gesichtsfeld`. */
ziel.append(gesichtsfeld(gegenueber, 'wartet', true));
}
void wer;
}
/* Der Zustand gilt auch fuer die Elemente, die es gerade eben noch
nicht gab -- und die Geraeteauswahl kann erst hier entstehen,
@@ -975,6 +1091,7 @@
if (!d.laeuft) { nachfrageStoppen(); tonAus(); lage('Der Anruf ist vorbei.');
setTimeout(() => { if (anruf) auflegen(); }, 1500); return; }
namenMerken(d.wer);
const andere = (d.wer || []).filter((w) => w.id !== ichId);
if (!andere.length) return; /* es klingelt weiter, alles richtig */
@@ -1048,6 +1165,21 @@
Den richtigen Zeitpunkt kennt nur die Verbindung selbst --
`onconnectionstatechange` meldet ihn (siehe oben). */
lage('Baut auf …');
/* DEN NAMEN MITNEHMEN (20.09.2026).
Hier fehlte er, und das Loch war genau umgekehrt zu dem, was
man erwartet: Wer ANGERUFEN wird, erfaehrt die Namen ueber
`dazustossen` (die Antwort des Servers enthaelt alle). Wer
ANRUFT, bekommt beim Start nur sich selbst -- alle weiteren
kommen ausschliesslich ueber dieses Ereignis. Ohne diese Zeile
stand bei ihm unter jedem Kreis „Jemand", und ausgerechnet der
Anrufer sah als Einziger keine Namen.
Gefunden hat es die Pruefung, aber erst, nachdem sie
verschaerft wurde: Der erste Anlauf verlangte nur „Name laenger
als ein Zeichen" -- und „Jemand" ist sechs Zeichen lang. Eine
Pruefung, die den Rueckfalltext durchlaesst, prueft nichts. */
namenMerken([d.person]);
/* Der Neue: Angebot macht, wer die kleinere Nummer hat. */
if (ichId < d.person.id) angebotMachen(d.person.id);
else verbindungFuer(d.person.id);
+140
View File
@@ -30,6 +30,124 @@
'use strict';
const $ = (id) => document.getElementById(id);
/* =====================================================================
MEINE KACHEL (20.09.2026)
Filipe: „jeder account soll seine kachel personalisieren koennen."
DIE TABELLE IST LEER UND WIRD GEFUELLT. Sie steht nicht als feste
Liste hier: Die zwoelf Toene gehoeren dem Server (CHAT_KACHELN in
workspace-chat.js), und eine zweite Fassung im Browser waere beim
dreizehnten die vergessene -- dieselbe Krankheit wie bei KANAL_WORT
auf dem Highlight-Brett, die heute behoben wurde.
WOZU SIE HIER GEBRAUCHT WIRD: Die Nachricht bringt einen
SCHLUESSEL mit („moos"), keine Farbe. Waere die Farbe selbst in der
Nachricht, stuende ein CSS-Wert aus der Datenbank in der Seite --
und ein vertippter oder boeswilliger Eintrag koennte faerben, was
er will. So kommt nur durch, was in der Tabelle steht. */
const KACHEL_FARBE = Object.create(null);
let kachelListe = [];
let meineKachel = null;
async function kachelnLaden() {
try {
const a2 = await fetch('/workspace/api/chat/kacheln', { credentials: 'same-origin' });
if (!a2.ok) return;
const d = await a2.json();
kachelListe = Array.isArray(d.kacheln) ? d.kacheln : [];
meineKachel = d.meine || null;
for (const k of kachelListe) KACHEL_FARBE[k.wert] = k.farbe;
kachelKnopfZeigen();
} catch { /* ohne die Liste bleibt alles beim Standard -- kein Grund
zu scheitern, der Chat funktioniert weiter */ }
}
function kachelKnopfZeigen() {
const knopf = $('kachel-oeffnen');
if (!knopf) return;
/* OHNE LISTE KEIN KNOPF. Ein Knopf, der eine leere Auswahl oeffnet,
ist schlimmer als keiner -- man drueckt ihn und sucht den Fehler
bei sich. */
knopf.hidden = kachelListe.length === 0;
const probe = knopf.querySelector('.chat__kachelknopf-probe');
if (probe) {
probe.style.background = KACHEL_FARBE[meineKachel] || KACHEL_FARBE.grund || '#131a25';
}
}
function kachelwahlBauen() {
const gitter = $('kachel-gitter');
if (!gitter) return;
gitter.textContent = '';
for (const k of kachelListe) {
const b = el('button', 'chat-kachelwahl__ton');
b.type = 'button';
b.dataset.wert = k.wert;
b.style.background = k.farbe;
b.setAttribute('role', 'radio');
/* DER NAME GEHOERT DAZU, nicht nur die Farbe. Wer Farben schlecht
unterscheidet, waehlt sonst zwoelf Mal dasselbe Kaestchen --
und ein Vorleseprogramm saehe zwoelf namenlose Knoepfe. */
b.setAttribute('aria-label', k.name);
b.title = k.name;
b.setAttribute('aria-checked', String((meineKachel || 'grund') === k.wert));
/* EINE VORSCHAU MIT ECHTEM TEXT, nicht nur ein Farbfleck: Gewaehlt
wird ja nicht die Farbe, sondern wie die eigene Nachricht
aussieht. */
b.append(el('span', 'chat-kachelwahl__wort', 'Aa'));
b.addEventListener('click', () => kachelSetzen(k.wert, b));
gitter.append(b);
}
}
async function kachelSetzen(wert, knopf) {
const vorher = meineKachel;
/* SOFORT UMSTELLEN, dann speichern. Wer eine Farbe antippt und eine
halbe Sekunde nichts sieht, tippt noch einmal. Geht es schief,
wird es zurueckgenommen -- und zwar sichtbar. */
meineKachel = (wert === 'grund') ? null : wert;
for (const b of knopf.parentElement.querySelectorAll('.chat-kachelwahl__ton')) {
b.setAttribute('aria-checked', String(b === knopf));
}
kachelKnopfZeigen();
eigeneKachelnFaerben();
try {
const a2 = await hole('/workspace/api/chat/kachel', {
method: 'PUT', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ kachel: wert }),
});
if (!a2.ok) throw new Error('abgelehnt');
} catch {
meineKachel = vorher;
kachelKnopfZeigen();
eigeneKachelnFaerben();
kachelwahlBauen();
melde('Die Farbe konnte nicht gespeichert werden.');
}
}
/** Die eigenen Nachrichten im offenen Verlauf sofort umfaerben.
*
* OHNE NEU ZU LADEN: Der Verlauf neu zu holen hiesse, beim Faerben
* nach unten zu springen und die Stelle zu verlieren, an der man
* gerade liest. Die Farbe steht ohnehin nur an der Kachel. */
function eigeneKachelnFaerben() {
const farbe = KACHEL_FARBE[meineKachel] || null;
for (const z of document.querySelectorAll('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase')) {
if (farbe) z.style.setProperty('--kachel', farbe);
else z.style.removeProperty('--kachel');
}
}
function kachelwahlBedienen() {
const knopf = $('kachel-oeffnen'), dlg = $('kachel-wahl'), zu = $('kachel-zu');
if (!knopf || !dlg) return;
knopf.addEventListener('click', () => { kachelwahlBauen(); dlg.showModal(); });
zu?.addEventListener('click', () => dlg.close());
}
const el = (tag, klasse, text) => {
const k = document.createElement(tag);
if (klasse) k.className = klasse;
@@ -1090,6 +1208,23 @@
if (n.angeheftet) zeile.dataset.angeheftet = 'ja';
const blase = el('div', 'chat-nachricht__blase');
/* DIE EIGENE KACHELFARBE (20.09.2026).
Filipe: „jeder account soll seine kachel personalisieren
koennen."
Der Wert kommt vom Server als SCHLUESSEL, nicht als Farbe --
hier wird er in der Tabelle nachgeschlagen, die ebenfalls vom
Server kam. Waere die Farbe selbst in der Nachricht, stuende
ein CSS-Wert aus der Datenbank in der Seite; ein vertippter
oder boeswilliger Eintrag koennte dann faerben, was er will.
Kein Wert heisst Standard, und dafuer steht gar nichts da --
der Rueckfall liegt im Stilblatt (`var(--kachel, …)`). Eine
Zeile, die die Standardfarbe noch einmal hinschreibt, waere
eine zweite Stelle, an der sie stimmen muss. */
const kFarbe = KACHEL_FARBE[n.von_kachel];
if (kFarbe) blase.style.setProperty('--kachel', kFarbe);
if (!gleicheFolge && !n.selbst && offen.art !== 'direkt') {
blase.append(el('p', 'chat-nachricht__von', n.von));
}
@@ -2811,6 +2946,11 @@
window.werZeigen?.(ich);
await raeumeLaden();
/* DIE KACHELN VOR DEM ERSTEN VERLAUF. Kaemen sie danach, stuenden
die ersten Nachrichten kurz in Standardfarbe und faerbten sich
dann um -- eine Seite, die sich unter den Fingern aendert. */
await kachelnLaden();
kachelwahlBedienen();
stromOeffnen();
unterbauBeobachten();
unterbauMessen();
+15 -15
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -291,14 +291,14 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/aufgaben.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/aufgaben.js?v=202609202225" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -168,13 +168,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/automation.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/automation.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -160,13 +160,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/befinden.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/befinden.js?v=202609202225" defer></script>
</body>
</html>
+19 -19
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609202225" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -277,16 +277,16 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/checkliste.js?v=202609201909" defer></script>
<script src="assets/js/ampel.js?v=202609201909" defer></script>
<script src="assets/js/schulung.js?v=202609201909" defer></script>
<script src="assets/js/bereich.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/checkliste.js?v=202609202225" defer></script>
<script src="assets/js/ampel.js?v=202609202225" defer></script>
<script src="assets/js/schulung.js?v=202609202225" defer></script>
<script src="assets/js/bereich.js?v=202609202225" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -108,12 +108,12 @@
</main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/bewerben.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/auskunft.js?v=202609202225" defer></script>
<script src="assets/js/bewerben.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -80,13 +80,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/bewerbungen.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/auskunft.js?v=202609202225" defer></script>
<script src="assets/js/bewerbungen.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -89,14 +89,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/calls.js?v=202609201909" defer></script>
<script src="assets/js/ki.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/calls.js?v=202609202225" defer></script>
</body>
</html>
+47 -17
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -70,9 +70,39 @@
<section class="chat__spalte chat__spalte--liste" aria-labelledby="liste-titel">
<div class="chat__kopf">
<h1 class="chat__titel" id="liste-titel">Gespräche</h1>
<!-- MEINE KACHEL (20.09.2026).
Filipe: "jeder account soll seine kachel personalisieren
koennen."
Der Knopf steht LINKS bei den Gespraechen und nicht rechts
im Verlauf: Es ist eine Einstellung ueber MICH, nicht ueber
dieses eine Gespraech. Rechts stehen ausserdem schon fuenf
Knoepfe, und ein sechster hat dort am Handy keinen Platz
mehr -- das war am 19.09. schon einmal der Fehler. -->
<button type="button" class="chat__kachelknopf" id="kachel-oeffnen"
aria-label="Meine Kachelfarbe wählen"
title="Meine Kachelfarbe">
<span class="chat__kachelknopf-probe" aria-hidden="true"></span>
</button>
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Neu</button>
</div>
<!-- Die Auswahl. Als <dialog>, wie die anderen Nachfragen im
Haus -- ein eigenes Aufklapp-Menue waere ein zweites Muster
fuer dieselbe Sache. -->
<dialog class="nachfrage chat-kachelwahl" id="kachel-wahl">
<h2 class="nachfrage__titel">Deine Kachel</h2>
<p class="nachfrage__text">
So sehen deine Nachrichten für alle anderen aus. Alle Töne sind
gleich dunkel – damit bleibt die Schrift überall gleich gut
lesbar.
</p>
<div class="chat-kachelwahl__gitter" id="kachel-gitter" role="radiogroup"
aria-label="Kachelfarbe"></div>
<div class="nachfrage__knoepfe">
<button type="button" class="abmelden" id="kachel-zu">Fertig</button>
</div>
</dialog>
<!-- Suchen erst, wenn es etwas zu suchen gibt (chat.js blendet
es ab acht Gesprächen ein). Ein Suchfeld über drei Einträgen
ist Zierde. -->
@@ -384,18 +414,18 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609201909"></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909"></script>
<script src="assets/js/glocke.js?v=202609201909"></script>
<script src="assets/js/bereiche.js?v=202609202225"></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225"></script>
<script src="assets/js/glocke.js?v=202609202225"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609201909"></script>
<script src="assets/js/chat.js?v=202609201909"></script>
<script src="assets/js/anruf.js?v=202609202225"></script>
<script src="assets/js/chat.js?v=202609202225"></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/content.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/content.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -179,14 +179,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/checkliste.js?v=202609201909" defer></script>
<script src="assets/js/content.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/checkliste.js?v=202609202225" defer></script>
<script src="assets/js/content.js?v=202609202225" defer></script>
</body>
</html>
+5 -5
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609202225" />
</head>
<body class="gate gate--crew">
@@ -358,6 +358,6 @@
␍
<script src="assets/js/gate.js?v=202609201909" defer></script>
<script src="assets/js/gate.js?v=202609202225" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609201909",
"src": "/assets/img/app-symbole/crew-192.png?v=202609202225",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609201909",
"src": "/assets/img/app-symbole/crew-512.png?v=202609202225",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609201909",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609202225",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609201909",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609202225",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -108,14 +108,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/dateien.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/dateien.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -106,12 +106,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/entwicklung.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/entwicklung.js?v=202609202225" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -146,12 +146,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/hilfe.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/hilfe.js?v=202609202225" defer></script>
</body>
</html>
+4 -4
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
</head>
<body class="gate">
@@ -411,6 +411,6 @@
</div>
␍␍
<script src="assets/js/gate.js?v=202609201909" defer></script>
<script src="assets/js/gate.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -383,14 +383,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/kalender.js?v=202609201909" defer></script>
<script src="assets/js/kalender-abo.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/kalender.js?v=202609202225" defer></script>
<script src="assets/js/kalender-abo.js?v=202609202225" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -444,12 +444,12 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609201909"></script>
<script src="assets/js/nachfrage.js?v=202609201909"></script>
<script src="assets/js/wahl.js?v=202609201909"></script>
<script src="assets/js/bereiche.js?v=202609201909"></script>
<script src="assets/js/kopf.js?v=202609201909"></script>
<script src="assets/js/glocke.js?v=202609201909"></script>
<script src="assets/js/leistung.js?v=202609201909"></script>
<script src="assets/js/meldung.js?v=202609202225"></script>
<script src="assets/js/nachfrage.js?v=202609202225"></script>
<script src="assets/js/wahl.js?v=202609202225"></script>
<script src="assets/js/bereiche.js?v=202609202225"></script>
<script src="assets/js/kopf.js?v=202609202225"></script>
<script src="assets/js/glocke.js?v=202609202225"></script>
<script src="assets/js/leistung.js?v=202609202225"></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -453,13 +453,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/personen.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/personen.js?v=202609202225" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -214,15 +214,15 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/steckbrief.js?v=202609201909" defer></script>
<script src="assets/js/profil.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/steckbrief.js?v=202609202225" defer></script>
<script src="assets/js/profil.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -134,11 +134,11 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/rechte.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/rechte.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/report.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/report.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -106,14 +106,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/report.js?v=202609201909" defer></script>
<script src="assets/js/ki.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/report.js?v=202609202225" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -173,13 +173,13 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/scouting.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/scouting.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -678,13 +678,13 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/start.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/start.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -85,14 +85,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/startcheck.js?v=202609201909" defer></script>
<script src="assets/js/ki.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/startcheck.js?v=202609202225" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -150,15 +150,15 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/steckbrief.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/auskunft.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/steckbrief.js?v=202609202225" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609202225" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -111,12 +111,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/talente.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/talente.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/team.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -110,12 +110,12 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/team.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/team.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/team.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,11 +84,11 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/teamlage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/teamlage.js?v=202609202225" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -112,12 +112,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/teilen.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/teilen.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -126,12 +126,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/treff-moderation.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/treff-moderation.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -221,11 +221,11 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/treff-regeln.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/auskunft.js?v=202609202225" defer></script>
<script src="assets/js/treff-regeln.js?v=202609202225" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -149,14 +149,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/uebersicht.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/uebersicht.js?v=202609202225" defer></script>
</body>
</html>
+12 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -217,11 +217,11 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609202225" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -144,11 +144,11 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/werdegang.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/werdegang.js?v=202609202225" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609202225" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609202225" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/start.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609202225" />
<link rel="stylesheet" href="assets/css/module.css?v=202609202225" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609202225" />
</head>
<body class="start">
@@ -190,14 +190,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/meldung.js?v=202609202225" defer></script>
<script src="assets/js/hochladen.js?v=202609202225" defer></script>
<script src="assets/js/nachfrage.js?v=202609202225" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/wissen.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609202225" defer></script>
<script src="assets/js/bereiche.js?v=202609202225" defer></script>
<script src="assets/js/kopf.js?v=202609202225" defer></script>
<script src="assets/js/glocke.js?v=202609202225" defer></script>
<script src="assets/js/wissen.js?v=202609202225" defer></script>
</body>
</html>