Reaction: der Gleichlauf rechnet ohne Uhrenvergleich

Filipe: „die videos muessen perfekt laufen wenn ich die reaktions
mache."

GEMESSEN, NICHT VERMUTET. mess-reaktion hat einen neuen Abschnitt:
Er liest den Spielstand am ECHTEN <video>-Element in beiden Browsern,
rechnet beide auf denselben Augenblick um und sagt, wie weit Host und
Zuschauerin auseinanderliegen. Die vorhandene Pruefung fragte nur, ob
Start und Stopp ANKOMMEN -- zwei Videos koennen beide laufen und
trotzdem zwanzig Sekunden auseinander sein.

                        vorher      nachher
  Im Lauf                0,12 s     -0,04 s
  Wer dazukommt          6,91 s      0,26 s
  Uhr des Geraets 30 s vor  -29,97 s      0,26 s

DER SCHLIMMSTE FUND: DIE UHR DES TELEFONS

Der Zuschauer rechnete `Date.now() - stand.gesendet`. `gesendet` kam
vom SERVER, `Date.now()` vom Geraet -- zwei Uhren, die nie jemand
verglichen hat. Wessen Telefon dreissig Sekunden vorgeht, schaute
29,97 s weiter als alle anderen. Kein langsames Netz, kein schwaches
Handy. Oertlich faellt das nie auf: Auf einem Rechner sind beide
Uhren dieselbe.

Jetzt geht ein ALTER hinaus statt einer Uhrzeit -- die Differenz
zweier SERVERzeiten. Der Empfaenger braucht dafuer gar keine Uhr,
nur eine Stoppuhr (`performance.now()`), und die haelt Zeitumstellung
und Aufwachen aus dem Ruhezustand aus.

WEITER

* WER DAZUKOMMT, STEIGT RICHTIG EIN. Der gespeicherte Stand war so
  alt wie der letzte Takt des Hosts; neue Spalte `sekunde_am` sagt,
  wann er galt.
* DAS TEMPO GEHT IN DIE HOCHRECHNUNG EIN. Bei 2x laeuft die Videouhr
  doppelt so schnell -- das fehlte ganz.
* JEDER RECHNET ALLE ZWEI SEKUNDEN SELBST NACH statt nur auf Zuruf.
  Wer stockte, hing bis zu fuenf Sekunden hinterher.
* DER VORLAUF NACH EINEM SPRUNG WIRD GEREGELT, nicht geschaetzt --
  gemessen wird der Rest, nicht die Ladezeit (siehe unten).
* PUFFERN IST AUCH IN DER TRANSPORTLEISTE KEINE PAUSE. Der
  Start-Stopp-Knopf rief beim Puffern `playVideo()` -- wer Pause
  drueckte, bekam „weiter". Lampe und Knopfbild flackerten bei jedem
  Stocken. Die Lektion vom 29.09. war nur an einer Stelle eingeloest.
* DAS TEMPO MELDET UEBER `hostMelden()` statt ein zweites Mal von
  Hand -- es hielt Puffern fuer Stillstand und hielt damit beim
  Umschalten alle an.
* EIN VIDEO-RUNDRUF STATT DREI ABSCHRIFTEN. Beim Einbau hatte ich
  zuerst nur eine nachgezogen; das Tauschen der beiden Videos haette
  still die alte Rechnung weiterverschickt.

DREI EIGENE FEHLER UNTERWEGS, alle im Text festgehalten

1. ZWEI FUNKTIONEN HIESSEN `springen`. Meine „spring AUF die Stelle"
   wurde von der vorhandenen „spring UM so viele Sekunden"
   ueberschrieben -- lautlos, rueckwirkend fuer die ganze Datei. Ein
   Zuschauer bei Sekunde 100, dem „geh auf 101" gesagt wird, waere
   bei 201 gelandet. DREI BROWSERLAEUFE HABEN ES NICHT GEFUNDEN:
   oertlich blieb der Abstand unter der Sprungschwelle, die Zeile
   lief kein einziges Mal. Gefunden hat es erst eine Frage an die
   ganze Datei -- die steht jetzt als Pruefung drin und wurde
   nachgestellt (rot).
2. DER VORLAUF LERNTE NUR NACH OBEN. Gemessen wurde die Ladezeit
   nach einem Sprung; ein Sprung in geladenes Material dauert aber
   gar nicht, meldet nichts und lehrt nichts. Ergebnis: -0,95 s
   stabil. Jetzt wird das ERGEBNIS geregelt statt der Ursache.
3. DER AUSREISSER VON 39,84 s WAR MEINE EIGENE MESSUNG -- der Block
   davor schickt eine erfundene Position. Jetzt wird abgeklungen und
   in Messreihenfolge ausgegeben.

GEPRUEFT
pruef-reaktion 421/0 (14 neue, darunter der Riegel gegen die
Rueckkehr der Uhrenrechnung und die Wache gegen doppelte
Funktionsnamen -- beide nachgestellt), mess-reaktion ohne ein
einziges ACHTUNG, pruef-buehne 38/0, pruef-struktur, pruef-
zwischenspeicher 34/0.

Schemaaenderung: ADD COLUMN sekunde_am. Datenbank vorher gesichert
und geprueft (integrity_check ok, 20 Personen).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-30 15:45:48 +02:00
co-authored by Claude Opus 5
parent d5c84c7608
commit a3ec558127
50 changed files with 1483 additions and 719 deletions
+184
View File
@@ -553,6 +553,190 @@ console.log("=== Der Gleichlauf des Videos ===");
}
}
/* ==== WIE WEIT LIEGEN SIE AUSEINANDER? ==============================
Der Abschnitt darueber prueft, ob Start und Stopp ANKOMMEN. Das ist
etwas anderes als gemeinsam schauen: Zwei Videos koennen beide
laufen und trotzdem zwanzig Sekunden auseinanderliegen. Dort saehe
man davon nichts -- beide meldeten brav „laeuft".
GELESEN WIRD AM ECHTEN <video>-ELEMENT im YouTube-Rahmen. Nicht an
einer Zahl, die die Seite ueber sich selbst schreibt: Die koennte
stimmen, waehrend das Bild etwas anderes zeigt. Playwright kommt an
den Rahmen heran, also wird dort gemessen, wo das Bild entsteht.
BEIDE AUF DENSELBEN AUGENBLICK UMGERECHNET. Zwei Ablesungen
nacheinander liegen 20 bis 80 ms auseinander; ungerechnet waere
genau das der „Abstand". Jede Ablesung bekommt deshalb ihren
Zeitpunkt (die Mitte zwischen Anfrage und Antwort) und wird auf
einen gemeinsamen Bezug hochgerechnet -- mit dem Tempo, denn bei 2x
laeuft die Uhr im Video doppelt so schnell.
==================================================================== */
console.log("");
console.log(" --- Der Abstand zwischen Host und Zuschauerin ---");
{
const stelleLesen = async (w) => {
const f = w.seite.frames().find((x) => /youtube(-nocookie)?\.com\/embed/.test(x.url()));
if (!f) return null;
const t0 = Date.now();
let z = null;
try {
z = await f.evaluate(() => {
const v = document.querySelector("video");
return v ? { zeit: v.currentTime, steht: v.paused, tempo: v.playbackRate || 1 } : null;
});
} catch { return null; } /* der Rahmen wurde gerade neu gebaut */
const t1 = Date.now();
return z ? { ...z, am: (t0 + t1) / 2, spanne: (t1 - t0) / 1000 } : null;
};
/** Der Abstand in Sekunden. Positiv heisst: die Zuschauerin ist
* HINTEN -- der Host ist schon weiter. */
const abstandMessen = async () => {
const [h, g] = await Promise.all([stelleLesen(host), stelleLesen(zuschauer)]);
if (!h || !g) return null;
const bezug = Math.max(h.am, g.am);
const bei = (z) => z.zeit + (z.steht ? 0 : ((bezug - z.am) / 1000) * z.tempo);
return {
abstand: bei(h) - bei(g),
/* Wie genau diese eine Messung ueberhaupt sein kann. Ein
Befund, der kleiner ist als seine eigene Ungenauigkeit, ist
keiner. */
genauigkeit: h.spanne + g.spanne,
hSteht: h.steht, gSteht: g.steht,
};
};
const reihe = async (wieoft, abstandMs) => {
const werte = [];
for (let i = 0; i < wieoft; i++) {
const m = await abstandMessen();
if (m) werte.push(m);
await host.seite.waitForTimeout(abstandMs);
}
return werte;
};
const auswerten = (werte, was) => {
if (!werte.length) {
console.log(` KONNTE NICHT NACHSEHEN: ${was} -- der YouTube-Rahmen `
+ "war nicht zu lesen.");
offenePunkte.push(`Abstand „${was}" war in diesem Lauf nicht messbar.`);
return null;
}
const b = werte.map((w) => w.abstand).sort((x, y) => x - y);
const mitte = b[Math.floor(b.length / 2)];
const groesste = b.reduce((a, x) => (Math.abs(x) > Math.abs(a) ? x : a), 0);
const gen = Math.max(...werte.map((w) => w.genauigkeit));
console.log(` ${was}: Mitte ${mitte.toFixed(2)} s, `
+ `groesster ${groesste.toFixed(2)} s, ${werte.length} Messungen `
+ `(Messgenauigkeit ${gen.toFixed(2)} s)`);
/* IN MESSREIHENFOLGE, nicht sortiert. Die Reihenfolge ist eine
Auskunft: Ein Ausreisser gleich am Anfang heisst „es hat sich
noch nicht eingerenkt", einer mittendrin heisst etwas ganz
anderes. Sortiert sieht beides gleich aus. */
console.log(` der Reihe nach: `
+ `${werte.map((w) => w.abstand.toFixed(2)).join(" ")}`);
return { mitte, groesste };
};
/* ---- 1. Der Normalfall: beide laufen schon eine Weile ---------
ERST ABKLINGEN LASSEN -- und zwar wegen des Blocks DARUEBER,
nicht wegen des Programms. Um einen Pufferer herzustellen,
springt der Host dort 60 Sekunden vor; danach schickt die
Messung eine erfundene Meldung („die Sendung steht bei Sekunde
7"). Die Zuschauerin folgt ihr, der Host bleibt bei 60 -- bis
sein naechster Takt die Wahrheit sagt.
Im ersten Lauf stand deshalb ein Ausreisser von 39,84 s in der
Reihe. Er kam aus dem Aufbau der Messung, nicht aus der
Software. Zwei Takte des Hosts abwarten, dann ist der Zustand
wieder echt. */
await host.seite.waitForTimeout(11000);
const normal = auswerten(await reihe(8, 1800), "Im Lauf");
if (normal && Math.abs(normal.mitte) > 1.5) {
console.log(" ACHTUNG: Sie schauen nicht dasselbe. Ein Abstand von "
+ `${normal.mitte.toFixed(1)} s heisst, dass die Zuschauerin eine andere `
+ "Stelle sieht als der Host -- bei einer Reaction ist genau das der Punkt.");
ausgang = 1;
}
/* ---- 2. Wer mitten in der Sendung dazukommt -------------------
Der haeufigste Fall ueberhaupt: Jemand macht die Seite auf,
waehrend schon laeuft. Er bekommt den Stand aus der Datenbank --
und der ist so alt wie der letzte Takt des Hosts. */
await zuschauer.seite.reload({ waitUntil: "networkidle" });
let da = false;
for (let i = 0; i < 40 && !da; i++) {
da = !!(await stelleLesen(zuschauer));
if (!da) await zuschauer.seite.waitForTimeout(250);
}
if (!da) {
console.log(" KONNTE NICHT NACHSEHEN: nach dem Neuladen kam kein Spieler.");
offenePunkte.push("Der Abstand beim Dazukommen war nicht messbar.");
} else {
/* SOFORT messen, nicht nach zehn Sekunden -- die Frage ist, was
der Mensch in der ersten Sekunde sieht. Danach noch einmal:
Holt das System den Rueckstand von allein auf? */
const gleich = await abstandMessen();
if (gleich) {
console.log(` Beim Dazukommen: ${gleich.abstand.toFixed(2)} s`);
if (Math.abs(gleich.abstand) > 2) {
console.log(" ACHTUNG: Wer dazukommt, steigt "
+ `${gleich.abstand.toFixed(1)} s versetzt ein.`);
ausgang = 1;
}
}
await zuschauer.seite.waitForTimeout(7000);
const spaeter = await abstandMessen();
if (spaeter) {
console.log(` Sieben Sekunden spaeter: ${spaeter.abstand.toFixed(2)} s`);
}
}
/* ---- 3. UND DIE UHR DES GERAETS -------------------------------
Der Zuschauer rechnet `Date.now() - stand.gesendet`. `gesendet`
kommt vom SERVER, `Date.now()` vom Handy. Das sind zwei Uhren,
und niemand hat sie je verglichen.
HERGESTELLT, NICHT ABGEWARTET: Die Uhr der Seite wird um 30
Sekunden vorgestellt -- genau das, was ein Telefon mit von Hand
gestellter Zeit mitbringt. Ein Geraet, das nachgeht, faellt
durch `Math.max(0, ...)` weniger auf; eines, das vorgeht, nicht. */
console.log("");
console.log(" --- Wenn die Uhr des Geraets falsch geht ---");
await zuschauer.seite.evaluate((ms) => {
window.__echtJetzt = Date.now;
Date.now = () => window.__echtJetzt() + ms;
}, 30000);
/* Zwei Takte des Hosts abwarten -- erst dann hat die falsche Uhr
ueberhaupt Gelegenheit, sich auszuwirken. */
await host.seite.waitForTimeout(12000);
const schief = auswerten(await reihe(5, 1500), "Uhr 30 s vor");
if (schief && Math.abs(schief.mitte) > 3) {
console.log(" ACHTUNG: Eine falsch gehende Uhr im Geraet verschiebt das "
+ `Video um ${schief.mitte.toFixed(1)} s. Der Abstand wird aus zwei `
+ "Uhren gerechnet, die niemand verglichen hat -- wessen Telefon "
+ "falsch steht, schaut etwas anderes.");
ausgang = 1;
}
/* DIE GEGENPROBE ZUR GEGENPROBE: Uhr zurueckstellen, und es muss
sich wieder einrenken. Ohne sie hiesse ein grosser Wert oben
womoeglich nur, dass die Messung kaputtgegangen ist. */
await zuschauer.seite.evaluate(() => {
if (window.__echtJetzt) Date.now = window.__echtJetzt;
});
await host.seite.waitForTimeout(12000);
const wieder = auswerten(await reihe(4, 1200), "Uhr wieder richtig");
if (wieder && Math.abs(wieder.mitte) > 2) {
console.log(" ACHTUNG: Nach dem Zurueckstellen der Uhr renkt es sich "
+ "nicht wieder ein.");
ausgang = 1;
}
}
/* ---- Die Regie ---------------------------------------------------
NICHT UMSCHALTEN, SONDERN HERSTELLEN. Ein Klick auf „Griff" heisst
„das Gegenteil von dem, was gerade ist" -- und setzt damit voraus,
+160
View File
@@ -1660,6 +1660,166 @@ melde("=== 17. Tempo, Anordnung und das zweite Video ===");
method: "POST", keks: k.admin, rumpf: { tempo: 1, laeuft: true, sekunde: 25 },
});
/* =====================================================================
DER GLEICHLAUF: WIE ALT IST DER STAND? (30.09.2026)
Bis heute schickte der Server seine UHRZEIT mit (`gesendet`), und
der Browser rechnete `Date.now() - gesendet`. Das vergleicht die
Uhr des Servers mit der Uhr des Telefons -- zwei Uhren, die nie
jemand abgeglichen hat.
Gemessen am echten Browser (mess-reaktion): Ein Geraet, dessen Uhr
30 Sekunden vorgeht, spielte das Video 29,97 Sekunden weiter als
alle anderen. Und wer mitten in der Sendung dazukam, stieg 6,91
Sekunden hinter allen ein, weil der gespeicherte Stand so alt war
wie der letzte Takt des Hosts.
Jetzt geht ein ALTER hinaus -- die Differenz zweier SERVERzeiten.
Der Empfaenger braucht dafuer keine eigene Uhr.
===================================================================== */
{
const jetztStellen = (sek, alter) => roh(CREW, "/workspace/api/reaktion/video", {
method: "POST", keks: k.admin, rumpf: { laeuft: true, sekunde: sek, alter },
});
const holen = async () => (await roh(CREW, "/workspace/api/reaktion", { keks: k.gast })).j;
await jetztStellen(100, 0);
const frisch = await holen();
ok(Number.isFinite(frisch?.alter) && frisch.alter >= 0 && frisch.alter < 500,
`ein frischer Stand ist fast null Millisekunden alt (${frisch?.alter})`);
/* ES IST WIRKLICH EIN ALTER UND KEINE FESTE ZAHL. Ohne diese
Zeile hiesse „0 ms" oben womoeglich nur, dass dort immer 0
steht -- und dann rechnete niemand je etwas dazu. */
await new Promise((r) => setTimeout(r, 1300));
const gereift = await holen();
ok(gereift?.alter >= 1200 && gereift?.alter <= 2600,
`nach 1,3 s ist derselbe Stand 1,3 s alt (${gereift?.alter} ms)`);
/* UND DIE RECHNUNG GEHT AUF. Das ist der eigentliche Zweck:
sekunde + alter muss die Stelle ergeben, an der die Sendung
jetzt steht. */
const stelle = (gereift.sekunde || 0) + (gereift.alter || 0) / 1000;
ok(Math.abs(stelle - 101.3) < 0.4,
`daraus folgt die richtige Stelle: ${stelle.toFixed(2)} s (erwartet ~101,3)`);
/* ---- Was der Host ueber seine eigene Ablesung sagt ----------
Er misst oertlich, wie alt sie beim Absenden war. Das gehoert
dazugerechnet -- sonst saesse jeder Zuschauer genau um diese
Spanne zu weit hinten. */
await jetztStellen(200, 3000);
const mitAlter = await holen();
ok(mitAlter?.alter >= 3000 && mitAlter?.alter < 3600,
`eine 3 s alte Ablesung kommt auch als 3 s alt an (${mitAlter?.alter})`);
/* GEDECKELT, WEIL ES VOM BROWSER KOMMT. Was hereinkommt, wird
geprueft und nicht geglaubt -- sonst setzte eine einzige
falsche Zahl alle Zuschauer an eine erfundene Stelle. */
await jetztStellen(300, 999999);
const frech = await holen();
ok(frech?.alter !== null && frech.alter <= 5600,
`ein unsinniges Alter wird auf 5 s gedeckelt (${frech?.alter})`);
await jetztStellen(310, -8000);
const negativ = await holen();
ok(negativ?.alter !== null && negativ.alter >= 0 && negativ.alter < 600,
`ein negatives Alter gilt als null (${negativ?.alter})`);
/* ---- Der dritte Ausgang: „weiss ich nicht" -------------------
Ein Stand ohne Zeitstempel (alte Zeile, frisch aufgeraeumte
Sendung) darf NICHT als „null Millisekunden alt" durchgehen.
`null` heisst beim Empfaenger „nicht hochrechnen"; eine 0
hiesse „taufrisch" und schickte alle an eine alte Stelle. */
/* EIGENES HANDLE. Das vom Anfang der Datei ist laengst
geschlossen (Zeile 108) -- die Pruefung legt die Leute an und
ueberlaesst die Datenbank danach dem Server. */
const { DatabaseSync: DB3 } = await import("node:sqlite");
const d3 = new DB3(process.env.WORKSPACE_DB);
d3.prepare("UPDATE reaktion SET sekunde_am = 0 WHERE id = 1").run();
const ohne = await holen();
ok(ohne?.alter === null,
`ohne Zeitstempel ist das Alter ausdruecklich unbekannt (${JSON.stringify(ohne?.alter)})`);
/* UND EIN UNMOEGLICH ALTER STAND EBENSO. Eine Zeile aus der
vorigen Woche wuerde sonst „604800000 ms" melden, und der
Browser rechnete sie brav dazu. */
d3.prepare("UPDATE reaktion SET sekunde_am = ? WHERE id = 1")
.run(Date.now() - 7 * 86400000);
const uralt = await holen();
ok(uralt?.alter === null,
`ein eine Woche alter Stand gilt als unbekannt (${JSON.stringify(uralt?.alter)})`);
d3.close();
/* Und wieder in einen brauchbaren Zustand -- die Pruefungen
danach sollen keinen Scherbenhaufen vorfinden. */
await jetztStellen(0, 0);
/* ---- UND EIN RIEGEL GEGEN DIE RUECKKEHR ---------------------
Die alte Zeile sah harmlos aus:
const unterwegs = Date.now() - stand.gesendet;
Der Kommentar daneben erklaerte sogar richtig, warum die
Laufzeit dazugehoert. Nur verglich sie die Uhr des Servers mit
der Uhr des Telefons -- und das faellt oertlich NIE auf: Auf
einem Rechner sind beide Uhren dieselbe. Erst als jemand die
Uhr absichtlich verstellt hat, kam es heraus.
GEMESSEN WIRD AM KOMMENTARFREIEN TEXT. Im Kopf der Datei steht
die alte Zeile als Beispiel, und ein Beispiel im Kommentar ist
kein Programm. Genau diese Falle hat mich heute frueh beim
Abzeichen schon einmal erwischt. */
const { jsOhneKommentar: ohneK } = await import("./helfer-ohne-kommentar.mjs");
const rjs = ohneK(readFileSync(
join(HIER, "..", "workspace", "assets", "js", "reaktion.js"), "utf8"));
ok(!/\bgesendet\b/.test(rjs),
"der Browser rechnet nicht mehr mit der Uhrzeit des Servers");
const kern = rjs.slice(rjs.indexOf("function sollJetzt"));
const rumpf = kern.slice(0, kern.indexOf("\n }"));
ok(rumpf.length > 40 && /performance\.now\(\)/.test(rumpf),
"die Soll-Stelle wird mit der Stoppuhr gerechnet, nicht mit dem Kalender");
ok(/anker\.tempo/.test(rumpf),
"und das Tempo geht in die Hochrechnung ein (bei 2x laeuft die Videouhr doppelt)");
ok(!/Date\.now\(\)/.test(rumpf),
"in der Rechnung selbst steckt keine Tagesuhr mehr");
/* GEGENPROBE: Die Suche liest wirklich etwas. Ohne sie hiessen
die drei Zeilen darueber womoeglich nur, dass `rumpf` leer
ist -- und ein leerer Text besteht jede Verbotspruefung. */
ok(/const her =/.test(rumpf),
`die Suche findet den Rumpf von sollJetzt (${rumpf.length} Zeichen)`);
/* ---- KEIN NAME ZWEIMAL ---------------------------------------
`reaktion.js` ist ein einziger Rumpf von 4400 Zeilen. Wer dort
einen Funktionsnamen ein zweites Mal vergibt, ueberschreibt
die erste -- und zwar RUECKWIRKEND fuer die ganze Datei, auch
fuer Aufrufe weit davor. Es gibt keine Fehlermeldung.
GENAU DAS IST AM 30.09.2026 PASSIERT. Die neue Nachfuehrung
hiess `springen(ziel)` („spring AUF diese Stelle"), der Host
hatte laengst ein `springen(um)` („spring UM so viele
Sekunden"). Gewonnen hat das zweite. Ein Zuschauer bei
Sekunde 100, dem „geh auf 101" gesagt wird, waere bei 201
gelandet.
DIE MESSUNG IM BROWSER HAT ES NICHT GEFUNDEN -- oertlich blieb
der Abstand unter der Sprungschwelle, die Zeile lief in drei
Laeufen kein einziges Mal. Gefunden hat es erst diese Frage an
die ganze Datei. */
const namen = [...rjs.matchAll(/^\s{0,4}(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/gm)]
.map((t) => t[1]);
const doppelt = [...new Set(namen.filter((n, i) => namen.indexOf(n) !== i))];
ok(namen.length > 40 && doppelt.length === 0,
doppelt.length
? `ZWEIMAL VERGEBEN: ${doppelt.join(", ")} — die spaetere gewinnt, lautlos`
: `alle ${namen.length} Funktionsnamen in reaktion.js sind einmalig`);
}
/* ---- Das zweite Video ---- */
const A = "dQw4w9WgXcQ";
const B = "9bZkp7q19f0";
+19
View File
@@ -495,6 +495,25 @@ export function reaktionTabellen(d) {
["ecke_gross", "REAL NOT NULL DEFAULT 1"],
];
if (!da.has("sekunde_am")) {
/* WANN DIE SEKUNDE GALT -- in Millisekunden der Serveruhr.
(30.09.2026)
Ohne sie liess sich nicht sagen, wie alt der gespeicherte
Spielstand ist. Wer mitten in der Sendung dazukam, bekam
`sekunde` aus der Datenbank und setzte sich damit dorthin --
gemessen 6,91 s hinter allen anderen, weil der Host nur alle
fuenf Sekunden meldet.
Sie wird NICHT an den Browser weitergegeben. Hinausgeschickt
wird nur die Differenz `Date.now() - sekunde_am`, also ein
ALTER. Eine absolute Serverzeit koennte der Empfaenger nur mit
seiner eigenen Uhr verrechnen, und genau das war der Fehler:
Ein Geraet mit 30 s falscher Uhr schaute 30 s woanders. */
d.exec("ALTER TABLE reaktion ADD COLUMN sekunde_am INTEGER NOT NULL DEFAULT 0");
console.log("[reaktion] Spalte sekunde_am angelegt.");
}
if (!da.has("chat_modus")) {
/* Wer im Live-Chat schreiben darf. Gilt fuer die ganze Sendung,
nicht je Person -- deshalb hier und nicht an den Zusehenden. */
+86 -21
View File
@@ -117,7 +117,7 @@ const jetzt = () => new Date().toISOString();
====================================================================== */
const SENDUNGS_FELDER = {
titel: "", video: "", video_titel: "", vorschau: "",
beginnt_am: null, laeuft: 0, sekunde: 0, gestartet_am: null,
beginnt_am: null, laeuft: 0, sekunde: 0, sekunde_am: 0, gestartet_am: null,
zweit_video: "", zweit_titel: "", zweit_sekunde: 0,
};
@@ -133,6 +133,63 @@ const PULT_EINSTELLUNGEN = {
chat_modus: "offen",
};
/** Wie alt ist dieser Spielstand -- in Millisekunden?
*
* DAS IST DIE EINE ZAHL, DIE HINAUSGEHT (30.09.2026), und
* ausdruecklich keine Uhrzeit. Ein Alter ist die Differenz zweier
* Serverzeiten; der Empfaenger braucht dafuer keine eigene Uhr.
*
* Vorher ging `gesendet: Date.now()` hinaus, und der Browser rechnete
* `Date.now() - gesendet`. Das verglich die Serveruhr mit der Uhr des
* Telefons. Gemessen am 30.09.2026: Ein Geraet, dessen Uhr 30 s
* vorgeht, spielte das Video 29,97 s weiter als alle anderen. Kein
* Fehler im Netz, kein langsames Handy -- nur zwei Uhren, die nie
* jemand verglichen hat.
*
* GEDECKELT. Ein `sekunde_am` von 0 (alte Zeile, frisch angelegte
* Sendung) hiesse sonst „dieser Stand ist 56 Jahre alt". Wer nichts
* weiss, gibt `null` zurueck -- und `null` heisst beim Empfaenger
* „nicht hochrechnen", nicht „null Millisekunden". */
const MAX_ALTER_MS = 60_000;
function standAlter(s) {
const am = Number(s?.sekunde_am) || 0;
if (!am) return null;
const alt = Date.now() - am;
if (alt < 0 || alt > MAX_ALTER_MS) return null;
return Math.round(alt);
}
/** Der Rundruf „so steht das Video jetzt" -- an EINER Stelle.
*
* ER WURDE AN DREI STELLEN VON HAND ZUSAMMENGESETZT: beim Starten
* der Sendung, beim Takt des Hosts und beim Tauschen der beiden
* Videos. Beim Einbau des Alters (30.09.2026) habe ich zuerst nur
* eine davon nachgezogen -- das Tauschen haette danach weiter die
* alte, kaputte Rechnung verschickt, und zwar still.
*
* Dieselbe Sorte Doppelung wie am 11.09.2026, als drei Spalten mit
* Inhalt verlorengegangen sind. Eine Liste, die niemand pflegt, kann
* nicht veralten.
*
* GELESEN WIRD AUS DER ZEILE, nicht aus dem, was der Aufrufer
* gerade zu wissen glaubt. */
function videoRundruf(s) {
melden("reaktion", {
was: "video",
video: s.video,
laeuft: !!s.laeuft,
sekunde: s.sekunde,
tempo: Number(s.tempo) || 1,
/* DAS ALTER, NICHT DIE UHRZEIT. Warum: siehe standAlter(). */
alter: standAlter(s),
/* `gesendet` bleibt vorerst mit drin. Ein Browser, der die alte
Fassung noch im Zwischenspeicher hat, wuerde sonst gar nicht
mehr nachfuehren -- und „gar nicht" ist schlechter als „etwas
ungenau". Darf weg, sobald der Stempel ueberall durch ist. */
gesendet: Date.now(),
});
}
/* ---------- Schranken --------------------------------------------------- */
function angemeldet(req, res, next) {
@@ -236,7 +293,7 @@ function listeHolen() {
* Zuruecksetzen der Sekunde vergessen kann. */
function weiterZu(zeile, personId) {
db().prepare("UPDATE reaktion SET video = ?, video_titel = ?, laeuft = 1,"
+ " sekunde = 0, geaendert = ? WHERE id = 1")
+ " sekunde = 0, sekunde_am = unixepoch('subsec') * 1000, geaendert = ? WHERE id = 1")
.run(zeile.video, zeile.titel, jetzt());
db().prepare("DELETE FROM reaktion_liste WHERE id = ?").run(zeile.id);
protokolliere("reaktion_weiter", { personId, detail: zeile.video });
@@ -248,7 +305,11 @@ function weiterZu(zeile, personId) {
betrifft nur die Anzeige und darf einen Wimpernschlag spaeter
kommen. Nur die erste zu schicken hiesse: Das Video wechselt,
und im Pult steht weiter der alte Name. */
melden("reaktion", { was: "video", video: s.video, laeuft: true, sekunde: 0, gesendet: Date.now() });
/* HIER GILT DIE SEKUNDE JETZT -- das Video faengt von vorn an.
Ohne `sekunde_am` waere der Stand „unbekannt alt" und niemand
duerfte hochrechnen; ausgerechnet beim Start, wo alle
gleichzeitig einsteigen. */
videoRundruf(s);
return s;
}
@@ -300,6 +361,12 @@ function lage(person) {
layout: s.layout,
laeuft: !!s.laeuft,
sekunde: s.sekunde,
/* WIE ALT DIESE SEKUNDE IST. Ohne sie setzte sich jeder, der
mitten in der Sendung dazukam, auf den Stand des letzten
Host-Taktes -- gemessen 6,91 s hinter allen anderen. Jetzt
rechnet er die verstrichene Zeit dazu und steigt an der
richtigen Stelle ein. */
alter: standAlter(s),
/* DIE GESCHWINDIGKEIT GEHT AN ALLE. Sie ist kein Regieknopf,
sondern Teil dessen, was gerade laeuft -- wer sie nicht
bekaeme, saehe dasselbe Video in einem anderen Tempo und waere
@@ -943,6 +1010,14 @@ reaktionRouter.post("/workspace/api/reaktion/video", nurHost, express.json({ lim
try {
const laeuft = req.body?.laeuft ? 1 : 0;
const sekunde = Math.max(0, Number(req.body?.sekunde) || 0);
/* WIE ALT DIE ABLESUNG BEIM ABSENDEN WAR.
Der Host misst das oertlich (Differenz zweier eigener
Messpunkte) -- das stimmt auch auf einem Geraet mit falscher
Uhr, waehrend eine mitgeschickte Uhrzeit dort falsch waere.
Gedeckelt, weil es vom Browser kommt: Was hereinkommt, wird
geprueft, nicht geglaubt. */
const alter = Math.min(5000, Math.max(0, Number(req.body?.alter) || 0));
const sekundeAm = Date.now() - alter;
const video = req.body?.video === undefined ? null : videoKennung(String(req.body.video));
if (req.body?.video !== undefined && !video) {
return res.status(400).json({ fehler: "video_unklar" });
@@ -963,8 +1038,9 @@ reaktionRouter.post("/workspace/api/reaktion/video", nurHost, express.json({ lim
db().prepare("UPDATE reaktion SET tempo = ? WHERE id = 1").run(tempo);
}
if (video) {
db().prepare("UPDATE reaktion SET video = ?, laeuft = ?, sekunde = ?, geaendert = ? WHERE id = 1")
.run(video, laeuft, sekunde, jetzt());
db().prepare(`UPDATE reaktion SET video = ?, laeuft = ?, sekunde = ?,
sekunde_am = ?, geaendert = ? WHERE id = 1`)
.run(video, laeuft, sekunde, sekundeAm, jetzt());
/* Der Name wird NACHGEREICHT und nicht abgewartet: Diese
Route laeuft waehrend der Sendung im Sekundentakt. Sie
darf unter keinen Umstaenden auf YouTube warten. */
@@ -977,19 +1053,11 @@ reaktionRouter.post("/workspace/api/reaktion/video", nurHost, express.json({ lim
});
}
} else {
db().prepare("UPDATE reaktion SET laeuft = ?, sekunde = ? WHERE id = 1")
.run(laeuft, sekunde);
db().prepare("UPDATE reaktion SET laeuft = ?, sekunde = ?, sekunde_am = ? WHERE id = 1")
.run(laeuft, sekunde, sekundeAm);
}
const s = sendung();
melden("reaktion", {
was: "video",
video: s.video, laeuft: !!s.laeuft, sekunde: s.sekunde,
tempo: Number(s.tempo) || 1,
/* Die Uhrzeit des Servers geht mit: Der Empfaenger rechnet
die Laufzeit seit dem Absenden dazu. Ohne das waere jeder
genau so weit hinten, wie sein Netz langsam ist. */
gesendet: Date.now(),
});
videoRundruf(s);
res.json({ ok: true, tempo: Number(s.tempo) || 1 });
} catch (fehler) {
console.error("[reaktion] Video:", fehler?.message);
@@ -1073,6 +1141,7 @@ reaktionRouter.post("/workspace/api/reaktion/tauschen", nurHost,
try {
db().prepare(`UPDATE reaktion SET
video = ?, video_titel = ?, sekunde = ?,
sekunde_am = unixepoch('subsec') * 1000,
zweit_video = ?, zweit_titel = ?, zweit_sekunde = ?,
geaendert = ?
WHERE id = 1`)
@@ -1095,11 +1164,7 @@ reaktionRouter.post("/workspace/api/reaktion/tauschen", nurHost,
}
const n = sendung();
melden("reaktion", {
was: "video",
video: n.video, laeuft: !!n.laeuft, sekunde: n.sekunde,
tempo: Number(n.tempo) || 1, gesendet: Date.now(),
});
videoRundruf(n);
melden("reaktion", { was: "getauscht", lage: oeffentlich(lage(req.person)) });
res.json(lage(req.person));
} catch (fehler) {
+5 -5
View File
@@ -16,8 +16,8 @@
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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
<!-- 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,
@@ -33,7 +33,7 @@
schreibt jede Seite app.webmanifest -- auch die hier. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -135,7 +135,7 @@
<script src="assets/js/anruf-probe.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/anruf-probe.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609301339",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609301544",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609301339",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609301544",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609301339",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609301544",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609301339",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609301544",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+364 -28
View File
@@ -873,13 +873,250 @@
NACHGEFUEHRT WIRD NUR BEI ECHTER ABWEICHUNG. Ein Player, dem man
jede Sekunde eine neue Position gibt, ruckelt sichtbar. Erst ab
anderthalb Sekunden Unterschied wird gesprungen -- darunter
gut einer Sekunde Unterschied wird gesprungen -- darunter
merkt es niemand, darüber merkt es jeder.
---------------------------------------------------------------
WIE DIE SOLL-STELLE GERECHNET WIRD (neu gefasst 30.09.2026)
soll = sekunde + (alter + laufzeit + seither) * tempo
Hier stand bis heute `Date.now() - stand.gesendet` — die Uhr des
Telefons gegen die Uhr des Servers. Zwei Uhren, die nie jemand
verglichen hat. Gemessen: Ein Gerät, dessen Uhr 30 Sekunden
vorgeht, spielte das Video **29,97 Sekunden weiter** als alle
anderen. Kein langsames Netz, kein schwaches Handy — nur eine
falsch gestellte Uhr, wie sie auf jedem dritten Telefon steht.
Die neue Rechnung benutzt überhaupt keine Tagesuhr mehr:
`alter` sagt der Server, gerechnet aus ZWEI Serverzeiten.
Ein Alter ist eine Differenz — dafür braucht der
Empfänger keinen eigenen Kalender.
`laufzeit` die halbe kleinste selbst gemessene Umlaufzeit.
`seither` `performance.now()`, eine Stoppuhr ab Seitenstart.
Sie überlebt Zeitumstellung, Zeitzonenwechsel und
das Aufwachen aus dem Ruhezustand; `Date.now()`
springt dabei.
`tempo` Bei 2× läuft die Uhr im Video doppelt so schnell.
Das fehlte bisher ganz — bei einer Sekunde
Laufzeit war das eine Sekunde Fehler.
UND ES WIRD NICHT NUR AUF ZURUF NACHGEFÜHRT. Der Host meldet
alle fünf Sekunden; wer dazwischen stockt, hing bis zu fünf
Sekunden hinterher und wurde dann mit einem Ruck geholt. Jetzt
rechnet jeder alle zwei Sekunden selbst nach — der Anker weiß,
wo die Sendung steht, auch ohne neue Meldung.
WER NICHTS WEISS, SPRINGT NICHT. Kommt kein `alter` mit oder ist
die Seite so lange weggewesen, dass die Hochrechnung nicht mehr
trägt, liefert `sollJetzt()` `null` — und `null` heißt „nicht
anfassen", nicht „auf null springen". Lieber eine Sekunde hinten
als an der falschen Stelle.
================================================================= */
let spieler = null;
let spielerBereit = false;
let letztesVideo = '';
/* ---- Wie lange eine Meldung zu mir braucht ---------------------
Die HALBE KLEINSTE Umlaufzeit, nicht der Durchschnitt. Eine
einzelne langsame Antwort sagt etwas über die Warteschlange
unterwegs, nicht über den Weg; die schnellste gemessene kommt
der reinen Laufzeit am nächsten. Dieselbe Überlegung wie bei
jeder Zeitmessung über ein Netz. */
let laufzeitMs = 0;
let kleinsteUmlauf = Infinity;
function umlaufMerken(ms) {
if (!(ms >= 0) || ms > 10_000) return;
if (ms < kleinsteUmlauf) { kleinsteUmlauf = ms; laufzeitMs = ms / 2; }
}
/* ---- Der Anker: der letzte bekannte Stand ----------------------
`seit` ist eine STOPPUHR (`performance.now()`), keine Uhrzeit.
Gesetzt wird er in dem Augenblick, in dem die Nachricht ANKOMMT
— nicht dort, wo sie später verarbeitet wird. Das ist kein
Detail: Zwischen dem Laden des Stands und dem Fertigwerden des
YouTube-Spielers vergehen ein bis drei Sekunden, und genau die
fehlten sonst in der Rechnung. */
let anker = null;
function ankerSetzen(stand) {
if (!stand) return;
anker = {
sekunde: Number(stand.sekunde) || 0,
laeuft: !!stand.laeuft,
tempo: Number(stand.tempo) || 1,
/* `null` heißt „unbekannt" und ist etwas anderes als 0. */
alterMs: Number.isFinite(stand.alter) ? stand.alter : null,
seit: performance.now(),
};
}
/* Weiter als das trägt keine Hochrechnung. Wer eine Viertelstunde
im Hintergrund lag, weiß nichts mehr — und eine Zahl, die aus
einem Anker von vor einer Viertelstunde stammt, ist schlimmer
als keine. */
const ANKER_HAELT = 90;
/** Wo müsste ich jetzt stehen? `null` = weiß ich nicht. */
function sollJetzt() {
if (!anker) return null;
if (!anker.laeuft) return anker.sekunde;
if (anker.alterMs === null) return anker.sekunde;
const her = (anker.alterMs + laufzeitMs + (performance.now() - anker.seit)) / 1000;
if (her < 0 || her > ANKER_HAELT) return null;
return anker.sekunde + her * anker.tempo;
}
/** Wer die Sendung führt, folgt niemandem — er IST der Stand.
*
* GEPRÜFT WIRD DIE KENNUNG, NICHT DIE ROLLE: `ich.host` ist bei
* DogFather UND bei seiner rechten Hand wahr, geführt wird aber
* von genau einem. Wer danebensteht, muss mitlaufen. */
function binSteuerHost() {
return !!(lage?.host?.id && meineId && lage.host.id === meineId);
}
/* ---- Springen, und wie weit vorgehalten wird -------------------
Nach einem Sprung lädt der Spieler nach. Bis er wieder spielt,
ist die Sendung weitergelaufen — man landet also genau um diese
Ladezeit hinten und braucht bald den nächsten Sprung. Deshalb
wird ein Vorlauf dazugerechnet.
GEMESSEN WIRD DAS ERGEBNIS, NICHT DIE URSACHE.
Der erste Anlauf (30.09.2026) stoppte die LADEZEIT: Wie lange
dauert es vom Sprung bis zum Weiterspielen? Klingt richtig und
war systematisch falsch. Ein Sprung in einen schon geladenen
Bereich dauert nämlich gar nicht — der Spieler verlässt den
Zustand „läuft" nie, die Meldung darüber kommt nie, und gelernt
wurde ausschließlich aus den LANGSAMEN Sprüngen. Der Vorlauf
kannte nur den Weg nach oben.
Gemessen kam dabei heraus: Die Zuschauerin lag 0,95 s VOR dem
Host — über acht Messungen auf zwei Hundertstel stabil. Ein
Mittelwert, der nur eine Sorte Messung sieht, ist keiner.
Jetzt wird zweieinhalb Sekunden nach jedem Sprung nachgesehen,
wie weit man DANEBEN liegt, und der Vorlauf um einen Teil dieses
Restes verschoben. Zu weit vorn zieht ihn herunter, zu weit
hinten hinauf — ein Regelkreis auf die Größe, auf die es
ankommt, statt auf einen Hilfswert, von dem man hofft, dass er
dasselbe bedeutet.
Auf einer schnellen Leitung geht er gegen null, auf einer
langsamen wächst er mit. Eine feste Zahl wäre wieder die
Rechnung von gestern. */
let vorlauf = 0;
let restPruefenAb = 0;
/* `aufStelleSpringen` UND NICHT `springen` (berichtigt 30.09.2026).
Sie hiess zuerst `springen` -- genau wie die Funktion des Hosts
1600 Zeilen weiter unten, die UM so viele Sekunden spult. In
einem gemeinsamen Rumpf gewinnt die spaetere Deklaration, und
zwar rueckwirkend fuer die ganze Datei. Nachgestellt:
function springen(ziel) { return 'MEINER'; }
function springen(um) { return 'HOSTS'; }
springen(101); // -> „HOSTS"
Ein Zuschauer bei Sekunde 100, dem „geh auf 101" gesagt wird,
waere damit bei 201 gelandet. Und beim naechsten Mal bei 302.
Die Messung hat es NICHT gefunden: Oertlich blieb der Abstand
unter der Sprungschwelle, die Zeile lief in drei Laeufen kein
einziges Mal. Auf einer echten Leitung waere sie staendig
gelaufen. */
function aufStelleSpringen(ziel) {
spieler.seekTo(Math.max(0, ziel + (anker?.laeuft ? vorlauf : 0)), true);
/* Erst nachsehen, wenn das Nachladen vorbei sein kann. Sofort
gemessen wäre der „Rest" nur die Ladezeit selbst. */
restPruefenAb = performance.now() + 2500;
}
/** Was ist von dem Sprung übrig geblieben? `weg` ist positiv, wenn
* man hinten liegt. */
function vorlaufLernen(weg) {
if (!restPruefenAb || performance.now() < restPruefenAb) return;
restPruefenAb = 0;
/* Mehr als fünf Sekunden Rest ist kein Nachladefehler, sondern
etwas anderes (ein Sprung des Hosts, ein Videowechsel) — und
darf den Vorlauf nicht verziehen. */
if (Math.abs(weg) > 5) return;
/* Nur ein Teil des Restes, damit einzelne Ausreißer den Wert
nicht hin und her werfen. */
vorlauf = Math.max(0, Math.min(1.5, vorlauf + 0.4 * weg));
}
/* Ab wann gesprungen wird. Darunter merkt es niemand; ein Sprung
kostet dagegen immer ein sichtbares Nachladen. */
const SPRUNG_AB = 1.2;
/** Einmal nachführen: stehe ich da, wo die Sendung steht?
*
* `auchHost` — WER FÜHRT, WIRD NICHT NACHGEFÜHRT, mit genau einer
* Ausnahme: dem ersten Mal. Sein Spieler IST der Stand; ihn alle
* zwei Sekunden auf seine eigene Meldung zu setzen, wäre ein Echo,
* das sich selbst hinterherläuft (genau der Fehler vom 29.09., als
* ein Pufferer den Host über den Umweg des Servers anhielt).
*
* Beim Laden hat er aber noch gar keine Stelle. Im Quelltext stand
* dazu schon: „Lädt der Host mitten in der Sendung neu, soll er
* dort weitermachen, wo die Sendung steht, und nicht bei null."
* Ohne diese Ausnahme finge er bei null an — und alle anderen
* wären ihm eine Sekunde später dorthin gefolgt. */
function nachfuehren(auchHost = false) {
if (!spielerBereit || !anker) return;
if (!auchHost && binSteuerHost()) return;
const zustand = spieler.getPlayerState();
/* WÄHREND GEPUFFERT WIRD, WIRD NICHT GESPRUNGEN. Ein Sprung löst
neues Puffern aus — auf einer schwachen Leitung käme man aus
dem Nachladen nicht mehr heraus, und genau das fühlt sich an
wie „das Video hängt". */
if (zustand === PUFFERT) return;
const soll = sollJetzt();
if (soll === null) { standAuffrischen(); return; }
const ist = spieler.getCurrentTime();
const weg = soll - ist;
/* Ablesbar von außen, wie `data-spieler` daneben — die Messung
braucht eine Zahl, die das Programm selbst für wahr hält. */
const platz = $('video-platz');
if (platz) {
platz.dataset.stelle = ist.toFixed(2);
platz.dataset.versatz = weg.toFixed(2);
}
/* ZUERST LERNEN, DANN ENTSCHEIDEN. Andersherum wäre der Rest
schon wegkorrigiert, bevor jemand ihn gesehen hat — und der
Vorlauf bliebe für immer auf seinem ersten Wert. */
vorlaufLernen(weg);
if (Math.abs(weg) > SPRUNG_AB) aufStelleSpringen(soll);
if (anker.laeuft && zustand !== SPIELT && zustand !== PUFFERT) spieler.playVideo();
if (!anker.laeuft && zustand === SPIELT) spieler.pauseVideo();
}
/* Der eigene Takt. Der Host meldet alle fünf Sekunden; wer
dazwischen stockt, hing bisher bis zu fünf Sekunden hinterher.
Zwei Sekunden sind der Kompromiss: oft genug, dass man es nicht
merkt, selten genug, dass es nichts kostet. */
let gleichUhr = null;
function gleichlaufTakt() {
clearInterval(gleichUhr);
/* Über eine Pfeilfunktion und nicht direkt: `setInterval`
übergibt in manchen Umgebungen die Zahl der Verspätungen als
erstes Argument — das wäre hier ein wahrheitswertiges
`auchHost` und machte aus der Ausnahme die Regel. */
gleichUhr = setInterval(() => nachfuehren(), 2000);
}
/* Wenn der Anker nicht mehr trägt (lange im Hintergrund), wird er
geholt statt geraten. Mit Bremse — sonst fragte eine Seite ohne
Verbindung im Zwei-Sekunden-Takt. */
let letztesAuffrischen = 0;
function standAuffrischen() {
if (performance.now() - letztesAuffrischen < 10_000) return;
letztesAuffrischen = performance.now();
standHolen(true);
}
function apiLaden() {
if (window.YT && window.YT.Player) { spielerBauen(); return; }
if (document.getElementById('yt-api')) return;
@@ -933,6 +1170,10 @@
Sendung steht, und nicht bei null. */
folgen(lage);
if (lage.ich.host) hostTakt();
/* FÜR ALLE, AUCH FÜR DEN HOST. `nachfuehren()` steigt bei
dem, der führt, selbst wieder aus — und wechselt die
Führung mitten in der Sendung, läuft der Takt schon. */
gleichlaufTakt();
},
onStateChange: (e) => {
/* Der Zustand steht am Element -- ablesbar von aussen, ohne
@@ -963,8 +1204,33 @@
nachgeschlagen und danach falsch erinnert wird. */
const SPIELT = 1, PUFFERT = 3;
async function hostMelden() {
if (!spielerBereit || !lage || lage.stand !== 'live') return;
/** @param {object} dazu Was ausser dem Spielstand mitgehen soll
* (heute nur `tempo`).
*
* ES GIBT NUR EINE STELLE, DIE DEN SPIELSTAND MELDET.
* Der Tempo-Knopf hatte dieselbe Meldung ein zweites Mal von Hand
* zusammengebaut -- und dabei beides falsch gemacht, was diese
* Funktion richtig macht: Er hielt Puffern fuer Stillstand
* (`=== 1`) und liess das Alter der Ablesung weg. Wer das Tempo
* umstellte, waehrend seine Leitung nachlud, hielt damit alle
* Zuschauer an. */
async function hostMelden(dazu = null) {
if (!lage) return null;
/* ---- HERZSCHLAG ODER ANSAGE? ------------------------------
Der Fuenf-Sekunden-Takt meldet nur waehrend der Sendung --
sonst schriebe eine offene Regieseite dauernd in eine
Sendung, die gar nicht laeuft.
Eine ABSICHTLICHE Ansage (`dazu`, heute das Tempo) geht
dagegen immer hinaus. Das Tempo laesst sich naemlich vor der
Sendung stellen; die Route verlangt `nurHost` und sonst
nichts. Ohne diese Unterscheidung bekaeme Filipe in der
Vorbereitung „Das Tempo ging nicht." zu sehen.
Der Unterschied ist inhaltlich: Ein Herzschlag sagt „so steht
es gerade" und darf ausfallen. Eine Ansage sagt „mach das ab
jetzt" und muss ankommen. */
if (!dazu && (!spielerBereit || lage.stand !== 'live')) return null;
try {
/* PUFFERN IST KEIN ANHALTEN (29.09.2026).
@@ -983,23 +1249,56 @@
Gemessen in mess-reaktion: `Host=laeuft` → ein gemeldeter
Pufferer → `Host=pause`. */
const zustand = spieler.getPlayerState();
/* OHNE FERTIGEN SPIELER GIBT ES KEINEN SPIELSTAND -- aber die
Ansage geht trotzdem hinaus. Genau so hat es der Tempo-Knopf
vorher gemacht (`sekunde: 0`), und das war richtig. */
const zustand = spielerBereit ? spieler.getPlayerState() : -1;
const laeuft = zustand === SPIELT || zustand === PUFFERT;
const sekunde = spieler.getCurrentTime();
await hole('/workspace/api/reaktion/video', {
const gelesenAm = performance.now();
const sekunde = spielerBereit ? spieler.getCurrentTime() : 0;
/* WIE ALT DIE ABLESUNG IST, WENN SIE ANKOMMT.
Das Ablesen, das Zusammenbauen und der Weg zum Server
dauern zusammen ein paar Dutzend Millisekunden. Ohne diese
Zahl hielte der Server die Sekunde für taufrisch, und jeder
Zuschauer säße genau um diese Spanne zu weit hinten.
Gerechnet wird mit der Stoppuhr, nicht mit dem Kalender —
eine örtliche Differenz stimmt auch auf einem Gerät mit
falsch gestellter Uhr. */
const t0 = performance.now();
const a = await hole('/workspace/api/reaktion/video', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ laeuft, sekunde }),
body: JSON.stringify({
...(dazu || {}),
laeuft, sekunde,
alter: Math.round(performance.now() - gelesenAm + laufzeitMs),
}),
});
umlaufMerken(performance.now() - t0);
return a;
} catch { /* der nächste Takt versucht es wieder */ }
return null;
}
/** Alle anderen folgen. */
/** Alle anderen folgen.
*
* DER ANKER WIRD HIER NICHT GESETZT, sondern dort, wo die
* Nachricht ANKOMMT (`standHolen` und der Ereignisstrom). Der
* Unterschied sind ein bis drei Sekunden: `folgen(lage)` läuft
* aus `onReady`, und bis der YouTube-Spieler fertig ist, vergeht
* genau diese Zeit. Sie hier in den Anker zu schreiben hieße,
* sie zu verlieren. */
function folgen(stand) {
if (!spielerBereit || !stand) return;
if (stand.video && stand.video !== letztesVideo) {
letztesVideo = stand.video;
spieler.loadVideoById(stand.video, stand.sekunde || 0);
/* AN DIE HOCHGERECHNETE STELLE, nicht an die gemeldete. Ein
Videowechsel mitten in der Sendung ist der Fall, in dem der
Rückstand am meisten auffällt — alle anderen laufen weiter,
während hier noch geladen wird. */
const start = sollJetzt();
spieler.loadVideoById(stand.video,
Number.isFinite(start) ? Math.max(0, start) : (stand.sekunde || 0));
/* YouTube setzt die Geschwindigkeit beim Laden auf 1 zurück.
Ein kurzer Nachschlag, sobald das neue Video bereit ist --
sonst liefe jedes zweite Video im falschen Tempo. */
@@ -1007,14 +1306,11 @@
return;
}
if (stand.tempo) tempoNachziehen(stand.tempo);
/* Die Laufzeit der Meldung wird dazugerechnet. Ohne das wäre
jeder genau so weit hinten, wie sein Netz langsam ist. */
const unterwegs = stand.gesendet ? Math.max(0, (Date.now() - stand.gesendet) / 1000) : 0;
const soll = (stand.sekunde || 0) + (stand.laeuft ? unterwegs : 0);
const ist = spieler.getCurrentTime();
if (Math.abs(ist - soll) > 1.5) spieler.seekTo(soll, true);
if (stand.laeuft && spieler.getPlayerState() !== 1) spieler.playVideo();
if (!stand.laeuft && spieler.getPlayerState() === 1) spieler.pauseVideo();
/* `true`: Aus `folgen()` heraus darf auch der Host einmal
einsteigen — von hier kommt entweder sein eigener erster
Aufruf beim Laden oder ein Rundruf, und Rundrufe erreichen
`folgen()` bei ihm ohnehin nicht. */
nachfuehren(true);
}
/** Die Geschwindigkeit nachziehen.
@@ -2401,7 +2697,18 @@
/* ---- Die Videospur bedienen -------------------------------------- */
function spielPause() {
if (!spielerBereit) return;
if (spieler.getPlayerState() === 1) spieler.pauseVideo();
/* PUFFERN ZAEHLT ALS LAEUFT (berichtigt 30.09.2026).
Hier stand `=== 1`. Waehrend nachgeladen wird, ist der Zustand
3 -- also nicht 1, also ging der Klick in den else-Zweig und
rief `playVideo()`. Wer die Pause drueckte, bekam „weiter".
Der Knopf tat das Gegenteil dessen, was auf ihm stand, und
zwar genau dann, wenn die Leitung ohnehin schon stockt.
Dieselbe Verwechslung wie am 29.09. in `hostMelden()`. Die
Reparatur blieb damals an dieser einen Stelle haengen. */
const zustand = spieler.getPlayerState();
if (zustand === SPIELT || zustand === PUFFERT) spieler.pauseVideo();
else spieler.playVideo();
hostMelden();
}
@@ -2496,15 +2803,14 @@
* zweites Mal. */
async function tempoSetzen(wert) {
tempoNachziehen(wert);
const a = await hole('/workspace/api/reaktion/video', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tempo: wert,
laeuft: spielerBereit && spieler.getPlayerState() === 1,
sekunde: spielerBereit ? spieler.getCurrentTime() : 0,
}),
});
/* UEBER `hostMelden()` UND NICHT NOCH EINMAL VON HAND
(berichtigt 30.09.2026). Hier stand dieselbe Meldung ein
zweites Mal, und sie machte beides falsch, was `hostMelden()`
richtig macht: Sie hielt Puffern fuer Stillstand und liess das
Alter der Ablesung weg. Wer das Tempo umstellte, waehrend
seine Leitung nachlud, hielt damit alle Zuschauer an. */
const a = await hostMelden({ tempo: wert });
if (!a) { sagFehler('Das Tempo ging nicht.'); return; }
if (!a.ok) { melde(await a.json().catch(() => null), 'Das Tempo ging nicht.'); return; }
lage = { ...lage, tempo: wert };
zeichnen();
@@ -2554,7 +2860,13 @@
/* Das Positionsband */
if (!spielerBereit) return;
const laeuft = spieler.getPlayerState() === 1;
/* UND AUCH HIER IST PUFFERN KEINE PAUSE. Ohne das sprang die
Lampe bei jedem Stocken der Leitung auf „Pause" und gleich
wieder zurueck -- ein Flackern, das sagt „etwas ist kaputt",
waehrend nur nachgeladen wird. Dasselbe galt fuer das Bild auf
dem Knopf: zwei Balken, Dreieck, zwei Balken. */
const zustandJetzt = spieler.getPlayerState();
const laeuft = zustandJetzt === SPIELT || zustandJetzt === PUFFERT;
$('spur').dataset.laeuft = laeuft ? 'ja' : 'nein';
$('spur-marke').textContent = laeuft ? 'Läuft' : 'Pause';
$('v-spiel-bild').innerHTML = laeuft
@@ -3379,6 +3691,15 @@
Das Tempo kommt nicht aus seinem Spieler zurück, sondern
aus dem Pult. Es ist kein Echo seiner selbst, sondern
eine Ansage. */
/* DER ANKER ZUERST, und zwar fuer JEDEN -- auch fuer den,
der fuehrt. Er ist die Beschreibung dessen, was gerade
laeuft, nicht eine Anweisung an den Spieler. Wer sie
nicht mitschreibt, hat nach einem Wechsel der Fuehrung
keinen Stand.
HIER OBEN, weil `seit` eine Stoppuhr ist: Sie gehoert in
den Augenblick der Ankunft. */
ankerSetzen(d);
if (lage?.host?.id && lage.host.id === meineId) {
if (d.tempo) tempoNachziehen(d.tempo);
} else {
@@ -4303,12 +4624,27 @@
* Vorrang des Rundrufs ein Verlust. */
async function standHolen(sanft) {
const beim = standFolge;
/* GLEICH MITGEMESSEN: wie lange ein Hin und Zurueck dauert.
Daraus schaetzt der Gleichlauf die Laufzeit einer Meldung zu
mir. Ein eigener Weg nur zum Messen waere ein zweiter Weg,
der irgendwann eine andere Antwort gibt als dieser. */
const t0 = performance.now();
const a = await hole('/workspace/api/reaktion');
umlaufMerken(performance.now() - t0);
if (!a.ok) { sagFehler('Die Reaction ist gerade nicht erreichbar.'); return; }
const neu = await a.json();
if (sanft && beim !== standFolge) return;
/* DER ANKER GEHT SOFORT LOS -- vor dem Zeichnen, vor allem
anderen. Er merkt sich mit `performance.now()`, wann diese
Zahl ankam; jede Sekunde, die zwischen Ankunft und Auswertung
liegt, waere sonst ein Rueckstand, den niemand mehr sieht. */
ankerSetzen(neu);
lage = neu;
zeichnen();
/* Und gleich hinterher: Steht der Spieler schon, wird jetzt
nachgefuehrt. Ohne das wartete ein frisch geladener Stand bis
zum naechsten Takt. */
nachfuehren();
}
async function los() {
+19 -19
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -391,22 +391,22 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609301339"></script>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/textform.js?v=202609301544"></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/zuteilung.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/zuteilung.js?v=202609301544" defer></script>
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
eigene Datei; hier zeigt er den Creator-Katalog.
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
<script src="assets/js/vorlagenbrett.js?v=202609301339" defer></script>
<script src="assets/js/aufgaben.js?v=202609301339" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609301544" defer></script>
<script src="assets/js/aufgaben.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -168,15 +168,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/automation.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/automation.js?v=202609301544" defer></script>
</body>
</html>
+17 -17
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -197,16 +197,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/befinden.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/befinden.js?v=202609301544" defer></script>
</body>
</html>
+22 -22
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -304,19 +304,19 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609301339"></script>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/textform.js?v=202609301544"></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/checkliste.js?v=202609301339" defer></script>
<script src="assets/js/ampel.js?v=202609301339" defer></script>
<script src="assets/js/schulung.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/bereich.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/checkliste.js?v=202609301544" defer></script>
<script src="assets/js/ampel.js?v=202609301544" defer></script>
<script src="assets/js/schulung.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/bereich.js?v=202609301544" defer></script>
</body>
</html>
+19 -19
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/auskunft.js?v=202609301339" defer></script>
<script src="assets/js/bewerben.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/auskunft.js?v=202609301544" defer></script>
<script src="assets/js/bewerben.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -80,16 +80,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/auskunft.js?v=202609301339" defer></script>
<script src="assets/js/bewerbungen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/auskunft.js?v=202609301544" defer></script>
<script src="assets/js/bewerbungen.js?v=202609301544" defer></script>
</body>
</html>
+3 -3
View File
@@ -59,11 +59,11 @@
<!-- DIE WERBEEINBLENDUNG. Dieselbe Datei wie in der Reaction-Seite:
Zwei Fassungen altern unterschiedlich, und dann sieht der Stream
anders aus als das, worueber geredet wird. -->
<link rel="stylesheet" href="assets/css/werbung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609301544" />
</head>
<body class="obs-buehne">
<div id="platz"></div>
<script src="assets/js/werbung.js?v=202609301339" defer></script>
<script src="assets/js/buehne.js?v=202609301339" defer></script>
<script src="assets/js/werbung.js?v=202609301544" defer></script>
<script src="assets/js/buehne.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -89,15 +89,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/ki.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/calls.js?v=202609301339" defer></script>
<script src="assets/js/ki.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/calls.js?v=202609301544" defer></script>
</body>
</html>
+20 -20
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -739,24 +739,24 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609301339"></script>
<script src="assets/js/bereiche.js?v=202609301544"></script>
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
wirklich vor den anderen dasteht. -->
<script src="assets/js/textform.js?v=202609301339"></script>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339"></script>
<script src="assets/js/glocke.js?v=202609301339"></script>
<script src="assets/js/textform.js?v=202609301544"></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544"></script>
<script src="assets/js/glocke.js?v=202609301544"></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=202609301339"></script>
<script src="assets/js/anruf.js?v=202609301544"></script>
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
@@ -767,8 +767,8 @@
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
auftritt, ist der, den man nie nachstellen kann. -->
<script src="assets/js/bildschau.js?v=202609301339"></script>
<script src="assets/js/chat.js?v=202609301339"></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/bildschau.js?v=202609301544"></script>
<script src="assets/js/chat.js?v=202609301544"></script>
<script src="assets/js/installieren.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/content.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/content.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -179,15 +179,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/checkliste.js?v=202609301339" defer></script>
<script src="assets/js/content.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/checkliste.js?v=202609301544" defer></script>
<script src="assets/js/content.js?v=202609301544" defer></script>
</body>
</html>
+6 -6
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609301544" />
</head>
<body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/gate.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609301339",
"src": "/assets/img/app-symbole/crew-192.png?v=202609301544",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609301339",
"src": "/assets/img/app-symbole/crew-512.png?v=202609301544",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609301339",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609301544",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609301339",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609301544",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/dateien.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/dateien.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -297,20 +297,20 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
in Dokumentreihenfolge. -->
<script src="assets/js/vorlagenbrett.js?v=202609301339" defer></script>
<script src="assets/js/entwicklung.js?v=202609301339" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609301544" defer></script>
<script src="assets/js/entwicklung.js?v=202609301544" defer></script>
</body>
</html>
+15 -15
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -146,14 +146,14 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/hilfe.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/hilfe.js?v=202609301544" defer></script>
</body>
</html>
+5 -5
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
</head>
<body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/gate.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -383,15 +383,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/kalender.js?v=202609301339" defer></script>
<script src="assets/js/kalender-abo.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/kalender.js?v=202609301544" defer></script>
<script src="assets/js/kalender-abo.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -444,13 +444,13 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609301339"></script>
<script src="assets/js/nachfrage.js?v=202609301339"></script>
<script src="assets/js/wahl.js?v=202609301339"></script>
<script src="assets/js/bereiche.js?v=202609301339"></script>
<script src="assets/js/kopf.js?v=202609301339"></script>
<script src="assets/js/glocke.js?v=202609301339"></script>
<script src="assets/js/leistung.js?v=202609301339"></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544"></script>
<script src="assets/js/nachfrage.js?v=202609301544"></script>
<script src="assets/js/wahl.js?v=202609301544"></script>
<script src="assets/js/bereiche.js?v=202609301544"></script>
<script src="assets/js/kopf.js?v=202609301544"></script>
<script src="assets/js/glocke.js?v=202609301544"></script>
<script src="assets/js/leistung.js?v=202609301544"></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,13 +12,13 @@
vergessen wird. -->
<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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/material.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/material.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start" data-ton="42" data-buehne="studio">
@@ -138,14 +138,14 @@
<p class="m-laedt" id="laedt">Einen Moment …</p>
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/material.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/material.js?v=202609301544" defer></script>
</body>
</html>
+14 -14
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start" data-ton="46">
@@ -181,12 +181,12 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/notizen.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/notizen.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -453,14 +453,14 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/personen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/personen.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -214,16 +214,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/steckbrief.js?v=202609301339" defer></script>
<script src="assets/js/profil.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/steckbrief.js?v=202609301544" defer></script>
<script src="assets/js/profil.js?v=202609301544" defer></script>
</body>
</html>
+19 -19
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start reaktion-seite" data-stand="laedt">
@@ -881,15 +881,15 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/spendenkarte.js?v=202609301339" defer></script>
<script src="assets/js/werbung.js?v=202609301339" defer></script>
<script src="assets/js/reaktion.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/spendenkarte.js?v=202609301544" defer></script>
<script src="assets/js/werbung.js?v=202609301544" defer></script>
<script src="assets/js/reaktion.js?v=202609301544" defer></script>
</body>
</html>
+17 -17
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -134,14 +134,14 @@
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=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/rechte.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/rechte.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/report.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/report.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/ki.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/report.js?v=202609301339" defer></script>
<script src="assets/js/ki.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/report.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -173,14 +173,14 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/scouting.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/scouting.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -732,16 +732,16 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/live.js?v=202609301339" defer></script>
<script src="assets/js/start.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/live.js?v=202609301544" defer></script>
<script src="assets/js/start.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -85,16 +85,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/ki.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/startcheck.js?v=202609301339" defer></script>
<script src="assets/js/ki.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/startcheck.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -150,16 +150,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/auskunft.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/steckbrief.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/auskunft.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/steckbrief.js?v=202609301544" defer></script>
</body>
</html>
+14 -14
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/support.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/support.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -128,16 +128,16 @@
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
uebersicht.html, und heute hier. -->
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/support.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/support.js?v=202609301544" defer></script>
</body>
</html>
+3 -3
View File
@@ -23,7 +23,7 @@
„Eigenes CSS" leer lassen (der Grund ist schon
durchsichtig).
====================================================================== -->
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609301544" />
<style>
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
@@ -80,7 +80,7 @@
<body>
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
<script src="assets/js/spendenkarte.js?v=202609301339" defer></script>
<script src="assets/js/tafel.js?v=202609301339" defer></script>
<script src="assets/js/spendenkarte.js?v=202609301544" defer></script>
<script src="assets/js/tafel.js?v=202609301544" defer></script>
</body>
</html>
+18 -18
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -111,15 +111,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/talente.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/talente.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/team.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/team.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -110,15 +110,15 @@
</main>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/team.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/team.js?v=202609301544" defer></script>
</body>
</html>
+17 -17
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/team.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/team.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,15 +84,15 @@
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=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/teamlage.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<script src="assets/js/teamlage.js?v=202609301544" defer></script>
</body>
</html>
+15 -15
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -112,15 +112,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/teilen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/teilen.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -126,14 +126,14 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/treff-moderation.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/treff-moderation.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Rudels 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -248,14 +248,14 @@
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=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/auskunft.js?v=202609301339" defer></script>
<script src="assets/js/treff-regeln.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/auskunft.js?v=202609301544" defer></script>
<script src="assets/js/treff-regeln.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -149,16 +149,16 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/uebersicht.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/uebersicht.js?v=202609301544" defer></script>
</body>
</html>
+15 -15
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -335,14 +335,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/live.js?v=202609301339" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/live.js?v=202609301544" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit
„Cannot read properties of undefined (reading 'LEITUNG')" ab. -->
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/holen.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/holen.js?v=202609301544" defer></script>
<!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort
des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet
von pruef-meldungen, nicht beim Ansehen. -->
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609301544" defer></script>
</body>
</html>
+16 -16
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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -144,14 +144,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/werdegang.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/werdegang.js?v=202609301544" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,13 +12,13 @@
vergessen wird. -->
<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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
@@ -75,13 +75,13 @@
<p class="fehler" id="fehler" hidden></p>
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/willkommen.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/willkommen.js?v=202609301544" 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=202609301339" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301339" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609301339" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301339" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609301544" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609301544" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/start.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609301544" />
<link rel="stylesheet" href="assets/css/module.css?v=202609301544" />
<!-- 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=202609301339" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609301544" />
</head>
<body class="start">
@@ -190,15 +190,15 @@
</main>
<script src="assets/js/meldung.js?v=202609301339" defer></script>
<script src="assets/js/hochladen.js?v=202609301339" defer></script>
<script src="assets/js/nachfrage.js?v=202609301339" defer></script>
<script src="assets/js/meldung.js?v=202609301544" defer></script>
<script src="assets/js/hochladen.js?v=202609301544" defer></script>
<script src="assets/js/nachfrage.js?v=202609301544" defer></script>
<script src="assets/js/wahl.js?v=202609301339" defer></script>
<script src="assets/js/bereiche.js?v=202609301339" defer></script>
<script src="assets/js/installieren.js?v=202609301339" defer></script>
<script src="assets/js/kopf.js?v=202609301339" defer></script>
<script src="assets/js/glocke.js?v=202609301339" defer></script>
<script src="assets/js/wissen.js?v=202609301339" defer></script>
<script src="assets/js/wahl.js?v=202609301544" defer></script>
<script src="assets/js/bereiche.js?v=202609301544" defer></script>
<script src="assets/js/installieren.js?v=202609301544" defer></script>
<script src="assets/js/kopf.js?v=202609301544" defer></script>
<script src="assets/js/glocke.js?v=202609301544" defer></script>
<script src="assets/js/wissen.js?v=202609301544" defer></script>
</body>
</html>