Die Chatkiste steht immer, Beenden raeumt auf -- und eine verspaetete Antwort ueberschreibt nichts Neueres mehr

Filipe, 30.09.2026: „wenn eine sendung beendet wurde soll alles
automatisch verschwinden. also von daten die da stehen von dem video."
Und: „mach dass ich die chat kiste immer sehe bitte und nicht erst
wenn das video läuft."

=====================================================================
1. BEENDET HEISST LEER
=====================================================================
Beim Beenden verschwinden Titel, YouTube-Adresse, Videotitel,
Vorschaubild, Beginn und das zweite Video samt seiner Stelle. Vorher
blieb alles stehen; beim naechsten Aufmachen stand dort der Titel der
letzten Sendung und ein Beginn, der in der Vergangenheit liegt.

ERST DER VERLAUF, DANN DAS LEEREN -- weg vom Schreibtisch heisst
nicht weg aus der Welt. Geprueft: Nach dem Beenden steht die Sendung
weiter in `reaktion_verlauf`, samt Video.

EINE FELDLISTE, NICHT ZWEI. Die Aufzaehlung stand in der
Zuruecksetzen-Route; jetzt brauchen sie zwei Wege. `SENDUNGS_FELDER`
und `PULT_EINSTELLUNGEN` stehen einmal oben. Zwei Abschriften waeren
die, die beim naechsten Spaltenzuwachs auseinanderlaufen -- genau so
sind am 11.09. drei Spalten mit Inhalt verlorengegangen.

Einstellungen (Bildaufteilung, Kameragroesse, Chatmodus) und die
Warteschlange bleiben -- die raeumt weiter nur „Alles zuruecksetzen"
ab. Wer nur vorbereitet und dann zumacht, behaelt seine Eingaben; das
ist eine Entscheidung und steht als Pruefung fest.

DAS FELD „BEGINN" WURDE NIE GELEERT, nur gefuellt:
`if (lage.beginnt_am && document.activeElement !== …)` -- zwei Fragen
in einer Bedingung, und die zweite beantwortete die erste
stillschweigend mit nein. Das betraf auch den vorhandenen
Zuruecksetzen-Knopf.

=====================================================================
2. DIE CHATKISTE STEHT IMMER
=====================================================================
Sie lag in `#teil-live` und ging mit ihm weg. Im Wartebereich stand
dabei woertlich „Der Chat ist schon offen" -- der Satz stimmte sogar,
der Server laesst dort schreiben (201, geprueft); zu sehen war der
Chat trotzdem nicht.

Die drei Haeute und die Schiene liegen jetzt in einem gemeinsamen
`.raum`: links wechseln die Haeute, rechts steht der Chat. Das Raster
wandert mit nach oben statt sich zu verdoppeln -- zwei
`grid-template-columns` fuer dieselbe Frage waren am 28.09. der
Grund, warum die Regieleiste null Pixel bekam.

Wer nicht schreiben darf, liest den Grund im Feld („Der Saal ist zu").

DER UMBAU HAT DREI DINGE VERSCHOBEN, und die Messung hat sie sofort
gefunden: Kino 0 px hoch, Spendenkarte bei x=1458 ausserhalb des
Bildes, „Kamera aus"-Schild kam nicht an. Eine Ursache: Zwei Regeln
(`grid-row: 2` und `grid-area: kino`) zielten auf die drei Haeute,
weil die frueher unmittelbar im Saal lagen. Gefunden hat das nicht
das Nachdenken, sondern eine Messung der ganzen Kette --
`teil-live 0x0 @1440,742` lag NEBEN dem Raum.

=====================================================================
3. „DER SAAL IST ZU" ERREICHTE NIEMANDEN, DER DARIN SASS
=====================================================================
`stand: "zu"` loescht `reaktion_dabei`, und `melden()` suchte seine
Empfaenger erst danach -- in genau dieser geleerten Liste. Die Seiten
der Zuschauer blieben auf „live" stehen.

`melden(art, daten, wer)` nimmt jetzt eine Empfaengerliste; die
Stand-Route bestimmt sie VOR jeder Aenderung.

UND EINE ZUGESPERRTE SEITE VERSTUMMTE FUER IMMER. War der Saal zu,
hielt `anschliessen()` jeden Takt an -- und Rundrufe bekam sie auch
keine, weil sie in keiner Liste mehr stand. Machte der Host wieder
auf, passierte bei allen mit offenem Reiter NICHTS. Nicht in dreissig
Sekunden: nie, bis jemand von Hand neu lud. Gemessen: Server sagt
„vorbereitung", die Seite zeigt „zu", auch nach 40 Sekunden.
Jetzt fragt eine geschlossene Seite alle 15 Sekunden nach -- der
ruhigste Zustand des Hauses, dort kostet das nichts.

=====================================================================
4. WER ZULETZT ANTWORTET, HAT NICHT RECHT
=====================================================================
Eine Abfrage ist Sekundenbruchteile unterwegs. Kommt in dieser Zeit
ein Rundruf an, ist SEIN Stand der neuere -- und trotzdem hat die
verspaetete Antwort ihn ueberschrieben.

Gemessen: Die Regie schaltet die Werbung auf Wechsel, der Rundruf
zeichnet ihn, und einen Augenblick spaeter steht wieder Laufband.
Eine feste Wartezeit in der Messung hatte das zugedeckt; es fiel
erst auf, als ich sie durch eine echte Bedingung ersetzte.

Drei Runden Raten lagen daneben. Gefunden hat es eine Mitschrift der
Aufrufkette:

    wechsel:2  @ EventSource
    laufband:2 @ zeichnen < standHolen < signalEmpfangen

Eine Folgenummer zaehlt jeden angekommenen Rundruf. Jede Abfrage, die
die Seite VON SICH AUS macht -- nach dem Verbindungsaufbau, im
geschlossenen Saal, bei jedem Verbindungssignal, nach einer
abgelehnten Anwesenheitsmeldung, und der Anwesenheitstakt selbst --
verwirft ihr Ergebnis, wenn inzwischen etwas Neueres da war.

Abfragen nach einer EIGENEN Handlung bleiben hart: Sie bringen Dinge
mit, die kein Rundruf traegt (die Verwaltungslisten der Regie). Die
Unterscheidung steht am Aufruf, nicht in einer Bedingung im Inneren.

=====================================================================
5. UND DIE MESSUNGEN WARTEN NICHT MEHR AUF DIE UHR
=====================================================================
Feste Wartezeiten sind dieselbe Falle wie feste Schwellen: Sie
stimmen, bis daneben etwas langsamer wird, und melden dann einen
Fehler, den es nicht gibt. Zweimal ist mir das in einer Stunde
passiert -- einmal beim Band, einmal bei den Ecken. Der Werbeblock
wartet jetzt fuenfmal auf das Ergebnis, der Gleichlauf viermal; laeuft
eine Frist ab, ist es ein echter Befund.

Die erste Fassung der Gleichlauf-Gegenprobe war selbst falsch -- sie
hielt das Selbstheilen des Systems fuer einen Fehler.

Neu in mess-reaktion: „Die Chatkiste in jedem Zustand" (alle drei,
mit Breite und Sperrgrund) und „Beendet heisst leer (im Pult)" -- dort
gemessen, wo Filipe hinsieht, nicht in der Datenbank.
Neu in pruef-reaktion (+14): das Leeren, die Gegenprobe „vorher war
etwas drin", der Verlauf bleibt, und die Entscheidung „wer nur
vorbereitet hat, behaelt seine Eingaben".

Gemessen: mess-reaktion dreimal hintereinander 0/0, pruef-reaktion
407/0, pruef-css-klassen 37/0, pruef-struktur 44/0, pruef-tippziele
13/0, pruef-haus-seiten 38/0, pruef-haus-trennung 100/0, pruef-buehne
38/0, pruef-push-ziel 38/0, mess-buehne 0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-30 02:36:13 +02:00
co-authored by Claude Opus 5
parent 2c3b90d75c
commit 0fbd3f45b3
50 changed files with 1644 additions and 933 deletions
+315 -11
View File
@@ -455,8 +455,23 @@ console.log("=== Der Gleichlauf des Videos ===");
Fuenf-Sekunden-Taktes. Die erste Fassung dieser Gegenprobe hat
genau daran Alarm geschlagen: Sie hielt das Selbstheilen des
Systems fuer einen Fehler. */
/* GEWARTET WIRD AUF DEN ZUSTAND, NICHT AUF DIE UHR. Eine feste
Wartezeit stimmt meistens -- und wenn der Fuenf-Sekunden-Takt
des Hosts dazwischenfaellt, hinkt die Zuschauerin ein Ereignis
hinterher und die Messung meldet einen Fehler, den es nicht
gibt. Genau das ist einmal passiert. */
const warteAuf = async (seite, wert, frist = 9000) => {
try {
await seite.waitForFunction(
(w) => document.getElementById("video-platz")?.dataset.spieler === w,
wert, { timeout: frist });
return true;
} catch { return false; }
};
await host.seite.evaluate(() => document.getElementById("v-spiel")?.click());
await host.seite.waitForTimeout(1800);
await warteAuf(host.seite, "pause");
await warteAuf(zuschauer.seite, "pause");
const haltHost = await stand(host.seite);
const haltZu = await stand(zuschauer.seite);
console.log(` Host haelt wirklich an: Host=${haltHost} Zuschauerin=${haltZu}`);
@@ -468,7 +483,8 @@ console.log("=== Der Gleichlauf des Videos ===");
/* Und wieder los, mit demselben Knopf. */
await host.seite.evaluate(() => document.getElementById("v-spiel")?.click());
await host.seite.waitForTimeout(2000);
await warteAuf(host.seite, "laeuft");
await warteAuf(zuschauer.seite, "laeuft");
const weiterHost = await stand(host.seite);
const weiterZu = await stand(zuschauer.seite);
console.log(` Und wieder los: Host=${weiterHost} Zuschauerin=${weiterZu}`);
@@ -1663,16 +1679,29 @@ console.log(" --- Die Regieleiste ---");
/* ---- WAS SIE DEM VIDEO KOSTET ----
Die eigentliche Frage bei einer Leiste am oberen Rand. */
const platz = await host.seite.evaluate(() => {
/* SPUR: die ganze Kette vom Saal bis zur Leinwand. Wer nur die
Hoehe des Kinos kennt, raet, an welchem Glied sie verloren
geht. */
window.__spur = ["saal", "raum", "teil-live", "leinwand", "schiene"].map((id) => {
const e = document.getElementById(id);
if (!e) return `${id}=FEHLT`;
const r = e.getBoundingClientRect();
const c = getComputedStyle(e);
return `${id} ${Math.round(r.width)}x${Math.round(r.height)} `
+ `@${Math.round(r.left)},${Math.round(r.top)} ${c.display}`;
}).join(" | ");
const l = document.getElementById("regieleiste").getBoundingClientRect();
const k = document.getElementById("teil-live").getBoundingClientRect();
const s2 = document.getElementById("saal").getBoundingClientRect();
return {
spur: window.__spur,
leiste: Math.round(l.height), kino: Math.round(k.height), saal: Math.round(s2.height),
ueber: Math.max(0, document.documentElement.scrollHeight
- document.documentElement.clientHeight),
};
});
console.log(` Saal ${platz.saal} px = Leiste ${platz.leiste} + Kino ${platz.kino} `
console.log(` [Kette] ${platz.spur}`);
console.log(` Saal ${platz.saal} px = Leiste ${platz.leiste} + Kino ${platz.kino} `
+ `+ Regie, senkrecht ueber ${platz.ueber} px`);
if (platz.ueber > 6 || platz.kino < 200) {
console.log(" ACHTUNG: Die Leiste nimmt dem Bild zu viel oder die Seite laeuft ueber.");
@@ -2534,11 +2563,24 @@ console.log("=== Die Werbeeinblendung ===");
bleibt, steht als offener Punkt in der Liste; hier still darum
herumzumessen waere das Verstecken eines Befunds. */
await zuschauer.seite.reload({ waitUntil: "domcontentloaded" });
/* GEWARTET WIRD AUF DEN STAND, NICHT AUF DIE SEITE. `#leinwand`
steht im HTML und ist sofort da; `body[data-stand]` setzt erst
`zeichnen()`, also nachdem der Stand angekommen UND verarbeitet
ist. Vorher hat diese Messung gemessen, waehrend die Seite noch
nichts wusste -- und das sah aus wie Flatterhaftigkeit. */
await zuschauer.seite.waitForFunction(
() => !document.querySelector(".raus__titel")
&& !!document.getElementById("leinwand"),
&& !!document.getElementById("leinwand")
&& !!document.body.dataset.stand
/* UND DIE WERBEFLAECHE IST EINGEHAENGT. Hier standen
vorher 600 Millisekunden „zur Sicherheit". Das ist
keine Bedingung, sondern eine Annahme -- und dieselbe
Sorte Annahme hat in diesem Block zweimal einen Fehler
gemeldet, den es nicht gab. Die Flaeche entsteht in
`werbungZeichnen()`, also nachdem der Stand angekommen
und verarbeitet ist. */
&& !!document.querySelector(".werbung"),
null, { timeout: 15000 });
await zuschauer.seite.waitForTimeout(600);
const setz = (felder) => host.seite.evaluate(async (f) => {
const a = await fetch("/workspace/api/reaktion/werbung", {
@@ -2549,11 +2591,27 @@ console.log("=== Die Werbeeinblendung ===");
return { code: a.status, text: (await a.text()).slice(0, 120) };
}, felder);
/* AUF DAS ERGEBNIS WARTEN, NICHT AUF DIE UHR. Feste Wartezeiten
stimmen meistens -- und melden, wenn daneben etwas langsamer
wird, einen Fehler, den es nicht gibt. Genau das ist hier
zweimal passiert. Laeuft die Frist ab, ist es ein echter
Befund. */
const warte = async (seite, fn, was, frist = 9000) => {
try { await seite.waitForFunction(fn, null, { timeout: frist }); return true; }
catch {
console.log(` ACHTUNG: ${was} ist nach ${frist / 1000} s nicht angekommen.`);
ausgang = 1;
return false;
}
};
/* ---- 1. Das Laufband ---- */
const an = await setz({ art: "laufband", tempo: 12 });
console.log(` Band einschalten: ${an.code}`);
await host.seite.waitForTimeout(700);
await zuschauer.seite.waitForTimeout(900);
await warte(zuschauer.seite,
() => document.querySelector('.werbung[data-art="laufband"]')
&& document.querySelectorAll(".werbung__stueck").length > 0,
"das Laufband");
const band = await zuschauer.seite.evaluate(() => {
const w = document.querySelector(".werbung");
@@ -2620,7 +2678,10 @@ console.log("=== Die Werbeeinblendung ===");
/* ---- 2. Die Ecken ---- */
const ecken = await setz({ ecke_dogi: "ol", ecke_hase: "ur", ecke_gross: 1.4 });
console.log(` Ecken setzen: ${ecken.code}`);
await zuschauer.seite.waitForTimeout(800);
await warte(zuschauer.seite,
() => document.querySelector('.werbung__ecke--dogi[data-platz="ol"]:not([hidden])')
&& document.querySelector('.werbung__ecke--hase[data-platz="ur"]:not([hidden])'),
"die zwei Eckenbilder");
const lage = await zuschauer.seite.evaluate(() => {
const lein = document.getElementById("leinwand")?.getBoundingClientRect();
@@ -2669,7 +2730,25 @@ console.log("=== Die Werbeeinblendung ===");
/* ---- 4. Der Wechsel ---- */
await setz({ art: "wechsel", tempo: 8 });
await zuschauer.seite.waitForTimeout(900);
await warte(zuschauer.seite,
() => document.querySelector('.werbung[data-art="wechsel"]')
&& document.querySelectorAll(".werbung__stueck--wechsel").length > 1,
"der Wechsel");
/* SPUR: Was passiert in der Sekunde nach dem Umschalten? Ein
einzelner Blick sagt nicht, ob etwas nie da war oder gleich
wieder weg -- und das sind zwei ganz verschiedene Ursachen. */
{
const folge = [];
for (let i = 0; i < 6; i++) {
folge.push(await zuschauer.seite.evaluate(() => {
const w = document.querySelector(".werbung");
return `${w?.dataset.art || "?"}/`
+ `${document.querySelectorAll(".werbung__stueck--wechsel").length}`;
}));
await zuschauer.seite.waitForTimeout(250);
}
console.log(` [Spur] Art/Stuecke: ${folge.join(" -> ")}`);
}
const wechsel = await zuschauer.seite.evaluate(() => {
const w = document.querySelector(".werbung");
const alle = [...document.querySelectorAll(".werbung__stueck--wechsel")];
@@ -2725,12 +2804,17 @@ console.log("=== Die Werbeeinblendung ===");
/* ---- 5. Ein Bild davon ---- */
await setz({ art: "laufband", ecke_hase: "ur" });
await zuschauer.seite.waitForTimeout(900);
await warte(zuschauer.seite,
() => document.querySelector('.werbung[data-art="laufband"]'),
"das Laufband fuer das Bildschirmfoto");
await bild(zuschauer.seite, "24-werbung");
/* ---- 6. Wieder aus ---- */
const aus = await setz({ art: "aus", ecke_dogi: "aus", ecke_hase: "aus" });
await zuschauer.seite.waitForTimeout(700);
await warte(zuschauer.seite,
() => !document.querySelector(".werbung__band:not([hidden])")
&& !document.querySelector(".werbung__ecke:not([hidden])"),
"das Abschalten");
const weg = await zuschauer.seite.evaluate(() => {
const b = document.querySelector(".werbung__band");
const e = [...document.querySelectorAll(".werbung__ecke")].filter((x) => !x.hidden);
@@ -2744,6 +2828,226 @@ console.log("=== Die Werbeeinblendung ===");
}
}
/* =====================================================================
BEENDET HEISST LEER -- auch im Kasten
=====================================================================
Filipe, 30.09.2026: „wenn eine sendung beendet wurde soll alles
automatisch verschwinden. also von daten die da stehen von dem
video."
GEMESSEN WIRD DAS EINGABEFELD, nicht die Spalte. Genau dazwischen
lag der zweite Fehler: `p-beginn` wurde nur gefuellt, nie geleert
-- die Spalte war leer, im Pult stand der Termin weiter, bis
jemand die Seite neu lud. Das betraf auch den vorhandenen Knopf
„Alles zuruecksetzen".
===================================================================== */
console.log("");
console.log("=== Beendet heisst leer (im Pult) ===");
{
const felder = () => host.seite.evaluate(() => ({
titel: document.getElementById("p-titel")?.value ?? null,
video: document.getElementById("p-video")?.value ?? null,
beginn: document.getElementById("p-beginn")?.value ?? null,
zweit: document.getElementById("p-zweit")?.value ?? null,
}));
/* Erst fuellen -- sonst misst die Pruefung leere Felder und nennt
das Erfolg. */
await host.seite.evaluate(async () => {
const wann = new Date(Date.now() + 3600000);
const p = (n) => String(n).padStart(2, "0");
await fetch("/workspace/api/reaktion", {
method: "PUT", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
titel: "Test", video: "dQw4w9WgXcQ",
beginnt_am: wann.toISOString(),
}),
});
await fetch("/workspace/api/reaktion/stand", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "live" }),
});
});
await host.seite.waitForTimeout(1500);
const voll = await felder();
console.log(` Vorher im Pult: Titel="${voll.titel}" Video="${voll.video}" `
+ `Beginn="${voll.beginn}"`);
if (!voll.titel || !voll.video || !voll.beginn) {
console.log(" ACHTUNG: Die Felder liessen sich nicht fuellen -- "
+ "so ist die Frage nicht zu beantworten.");
ausgang = 1;
} else {
await host.seite.evaluate(() => fetch("/workspace/api/reaktion/stand", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "zu" }),
}));
await host.seite.waitForTimeout(1800);
const leer = await felder();
console.log(` Nach dem Beenden: Titel="${leer.titel}" Video="${leer.video}" `
+ `Beginn="${leer.beginn}" Zweites="${leer.zweit}"`);
for (const [name, wert] of Object.entries(leer)) {
if (wert) {
console.log(` ACHTUNG: Im Feld „${name}" steht nach dem Beenden `
+ `weiter „${wert}".`);
ausgang = 1;
}
}
}
/* Wiederherstellen -- die Messungen danach brauchen eine laufende
Sendung. */
await host.seite.evaluate(async () => {
await fetch("/workspace/api/reaktion", {
method: "PUT", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ titel: "Reaction", video: "dQw4w9WgXcQ" }),
});
await fetch("/workspace/api/reaktion/stand", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "live" }),
});
});
await host.seite.waitForTimeout(1200);
}
/* =====================================================================
DIE CHATKISTE STEHT IMMER (30.09.2026)
=====================================================================
Filipe: „mach dass ich die chat kiste immer sehe bitte und nicht
erst wenn das video läuft."
Sie lag im Kino (`#teil-live`) und ging mit ihm weg. Im
Wartebereich stand dabei woertlich „Der Chat ist schon offen" --
der Satz stimmte sogar, der Server laesst dort schreiben; zu sehen
war der Chat trotzdem nicht.
GEMESSEN WIRD IN ALLEN DREI ZUSTAENDEN. Nur im Live zu messen
waere die Pruefung, die den Fehler nicht sehen kann.
===================================================================== */
console.log("");
console.log("=== Die Chatkiste in jedem Zustand ===");
{
const kiste = (seite) => seite.evaluate(() => {
const e = document.getElementById("schiene");
if (!e) return null;
const r = e.getBoundingClientRect();
const feld = document.getElementById("chat-feld");
const fr = feld ? feld.getBoundingClientRect() : null;
return {
stand: document.body.dataset.stand || "(nichts)",
breit: Math.round(r.width), hoch: Math.round(r.height),
/* SICHTBAR HEISST: hat Flaeche UND ist nicht weggeschaltet.
`display: none` gibt 0x0 -- beides zusammen laesst keinen
Zwischenweg offen. */
sichtbar: getComputedStyle(e).display !== "none" && r.width > 0 && r.height > 0,
feldBreit: fr ? Math.round(fr.width) : 0,
grund: feld ? feld.placeholder : "",
gesperrt: feld ? !!feld.disabled : null,
};
});
const stellen = async (stand, mitVideo) => {
const antwort = await host.seite.evaluate(async (w) => {
if (w.video) {
await fetch("/workspace/api/reaktion", {
method: "PUT", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ titel: "Chatprobe", video: "dQw4w9WgXcQ" }),
});
}
const a = await fetch("/workspace/api/reaktion/stand", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: w.stand }),
});
/* DIE ANTWORT WIRD ZURUECKGEGEBEN. Ohne sie meldet die Messung
nur „steht auf live statt auf zu" und verschweigt, dass der
Server 409 gesagt hat -- man sucht dann am falschen Ende. */
return { code: a.status, text: (await a.text()).slice(0, 80) };
}, { stand, video: mitVideo });
if (antwort.code !== 200) {
console.log(` Der Server nimmt „${stand}" nicht an: `
+ `${antwort.code} ${antwort.text}`);
}
/* 40 SEKUNDEN, UND DAS HAT EINEN GRUND. „zu" kommt sofort an --
die Empfaenger werden seit dem 30.09. vor dem Leeren der
Dabei-Liste bestimmt. Die RUECKKEHR nicht: Wer im
geschlossenen Saal sitzt, steht in keiner Liste mehr und
bekommt keinen Rundruf. Seine Seite faengt sich selbst, aber
erst mit dem eigenen Dreissig-Sekunden-Takt.
Gewartet wird auf den Zustand, nicht die volle Zeit: Kommt er
frueher, geht es frueher weiter. */
try {
await zuschauer.seite.waitForFunction(
(w) => document.body.dataset.stand === w, stand, { timeout: 40_000 });
} catch { /* unten faellt es auf */ }
await zuschauer.seite.waitForTimeout(400);
};
let fehlt = 0;
for (const [stand, wort, mitVideo] of [
["zu", "der Saal ist zu", false],
["vorbereitung", "im Wartebereich", true],
["live", "waehrend der Sendung", true],
]) {
await stellen(stand, mitVideo);
/* SPUR: Was sagt der Server, und was zeigt ihre Seite? Ohne
beides nebeneinander sucht man am falschen Ende. */
const spur = await zuschauer.seite.evaluate(async () => {
const a = await fetch("/workspace/api/reaktion", { credentials: "same-origin" });
const j = await a.json().catch(() => null);
return { code: a.status, server: j?.stand, seite: document.body.dataset.stand,
raus: document.body.dataset.raus || "nein" };
});
console.log(` [Spur] Server sagt „${spur.server}" (${spur.code}), `
+ `Seite zeigt „${spur.seite}", raus=${spur.raus}`);
const k = await kiste(zuschauer.seite);
if (!k) {
console.log(` ACHTUNG: ${wort}: die Chatkiste gibt es gar nicht.`);
ausgang = 1; fehlt++;
continue;
}
console.log(` ${wort.padEnd(22)} Stand=${k.stand.padEnd(13)} `
+ `Kiste ${k.breit}x${k.hoch} px, Feld ${k.feldBreit} px`
+ `${k.gesperrt ? ` (gesperrt: „${k.grund}")` : ""}`);
if (k.stand !== stand) {
console.log(` ACHTUNG: ${wort}: die Seite steht auf „${k.stand}" `
+ `statt auf „${stand}" -- so ist die Frage nicht zu beantworten.`);
ausgang = 1; fehlt++;
continue;
}
/* 200 px und nicht „groesser als null": Eine Spalte, die auf
zwanzig Pixel zusammenfaellt, ist rechnerisch da und auf dem
Bildschirm weg. */
if (!k.sichtbar || k.breit < 200 || k.hoch < 100 || k.feldBreit < 100) {
console.log(` ACHTUNG: ${wort}: die Chatkiste ist nicht zu sehen `
+ `(${k.breit}x${k.hoch}, Feld ${k.feldBreit}).`);
ausgang = 1; fehlt++;
}
/* WER NICHT SCHREIBEN DARF, LIEST DEN GRUND. Ein graues Feld
ohne Erklaerung laesst einen an sich selbst zweifeln. */
if (k.gesperrt && !k.grund) {
console.log(` ACHTUNG: ${wort}: das Feld ist gesperrt und sagt nicht, warum.`);
ausgang = 1; fehlt++;
}
}
if (!fehlt) console.log(" In allen drei Zustaenden steht die Kiste.");
offenePunkte.push("Wird der Saal wieder aufgemacht, erfahren die, die im "
+ "geschlossenen Saal sitzen, es erst mit ihrem eigenen 30-Sekunden-Takt "
+ "-- sie stehen in keiner Dabei-Liste mehr, an die ein Rundruf gehen "
+ "koennte. „Zu\" kommt seit dem 30.09. sofort an.");
/* Und wieder auf Sendung -- was danach kommt, braucht sie. */
await stellen("live", true);
}
await modi.kontext.close();
await host.kontext.close();
await gast2.kontext.close();
+99
View File
@@ -2475,6 +2475,14 @@ melde("=== Die Einladung ===");
live, und eingeladen wird nur beim Uebergang. */
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "zu" } });
/* UND DANN EIN NEUES VIDEO. Seit dem 30.09. raeumt das Beenden die
Sendungsdaten weg -- ohne Video gibt es kein „auf Sendung" (400
kein_video). Genau das tut ein Mensch auch: Nach der einen
Sendung traegt er fuer die naechste ein neues Video ein. */
await roh(CREW, "/workspace/api/reaktion", {
method: "PUT", keks: k.admin,
rumpf: { titel: "Die naechste Sendung", video: "dQw4w9WgXcQ" },
});
const db2 = new DatabaseSync(process.env.WORKSPACE_DB);
/* Je ein Geraet fuer JEDEN -- auch fuer die, die keine Einladung
@@ -2559,6 +2567,97 @@ melde("=== Die Einladung ===");
await new Promise((r) => dienst.close(r));
}
/* =======================================================================
BEENDET HEISST LEER -- aber nicht vergessen
=======================================================================
Filipe, 30.09.2026, mit einem Bild des Pults („Titel der Sendung:
Test / YouTube: bm0sK2-KkW8 / Beginn: 29.09.2026 18:36"):
„wenn eine sendung beendet wurde soll alles automatisch
verschwinden. also von daten die da stehen von dem video."
Vorher blieb alles stehen. Beim naechsten Aufmachen stand dort der
Titel der letzten Sendung und ein Beginn, der in der Vergangenheit
liegt.
======================================================================= */
melde("");
melde("=== Beendet heisst leer ===");
{
/* Die Sendung laeuft an dieser Stelle noch (aus dem Abschnitt
darueber). Erst werden die Felder gefuellt, damit es ueberhaupt
etwas zu leeren gibt. */
const beginn = new Date(Date.now() + 3600_000).toISOString();
await roh(CREW, "/workspace/api/reaktion", {
method: "PUT", keks: k.admin,
rumpf: { titel: "Die letzte Sendung", video: "dQw4w9WgXcQ",
vorschau: "https://example.invalid/bild.jpg", beginnt_am: beginn },
});
await roh(CREW, "/workspace/api/reaktion/zweitvideo", {
method: "POST", keks: k.admin, rumpf: { video: "bm0sK2-KkW8" },
});
/* DIE VORAUSSETZUNG WIRD HERGESTELLT UND GEPRUEFT.
Ohne das misst dieser Abschnitt bei der kleinsten Aenderung
weiter oben etwas ganz anderes -- und meldet es als Befund. */
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "live" } });
/* ---- DIE GEGENPROBE STEHT VORNE ----------------------------
Ohne sie bestuende die Pruefung darunter auch dann, wenn nie
etwas in den Feldern stand. */
const vorher = await roh(CREW, "/workspace/api/reaktion", { keks: k.admin });
ok(vorher.j?.titel === "Die letzte Sendung" && !!vorher.j?.video,
`vorher stehen Titel und Video im Pult ("${vorher.j?.titel}")`);
ok(!!vorher.j?.beginnt_am, "und ein Beginn");
ok(!!vorher.j?.zweit?.video, `und ein zweites Video (${vorher.j?.zweit?.video})`);
ok(vorher.j?.stand === "live",
`und die Sendung laeuft wirklich -- sonst misst dieser Abschnitt `
+ `etwas anderes (${vorher.j?.stand})`);
const anAus = await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "zu" } });
ok(anAus.code === 200, `die Sendung wird beendet (${anAus.code})`);
const nachher = await roh(CREW, "/workspace/api/reaktion", { keks: k.admin });
ok(!nachher.j?.titel, `der Titel ist weg ("${nachher.j?.titel}")`);
ok(!nachher.j?.video, `das Video ist weg ("${nachher.j?.video}")`);
ok(!nachher.j?.vorschau, "das Vorschaubild ist weg");
ok(!nachher.j?.beginnt_am, `der Beginn ist weg (${nachher.j?.beginnt_am})`);
ok(!nachher.j?.zweit?.video, "das zweite Video ist weg");
ok(!nachher.j?.laeuft && !nachher.j?.sekunde, "und die Stelle steht auf null");
/* ---- WEG VOM SCHREIBTISCH, NICHT AUS DER WELT ---------------
Der Verlaufseintrag wird VOR dem Leeren geschrieben. Schoebe
jemand das Leeren nach vorn, stuende dort ein leerer Titel --
und es faellt erst auf, wenn jemand nachsehen will, was letzte
Woche lief. */
const dbv = new DatabaseSync(process.env.WORKSPACE_DB);
const letzte = dbv.prepare(
"SELECT titel, video FROM reaktion_verlauf ORDER BY id DESC LIMIT 1").get();
dbv.close();
ok(letzte?.titel === "Die letzte Sendung",
`im Verlauf steht sie weiter ("${letzte?.titel}")`);
ok(letzte?.video === "dQw4w9WgXcQ", `samt Video (${letzte?.video})`);
/* ---- WER NUR VORBEREITET HAT, BEHAELT SEINE EINGABEN --------
Eine Entscheidung, und deshalb steht sie hier: Aus der
Vorbereitung zumachen heisst „ich hoere auf vorzubereiten",
nicht „ich habe gesendet". Ohne diese Zeile nimmt eine spaetere,
gut gemeinte Vereinfachung („leeren wir doch bei jedem zu") die
Eingaben unbemerkt weg. */
await roh(CREW, "/workspace/api/reaktion", {
method: "PUT", keks: k.admin,
rumpf: { titel: "Nur vorbereitet", video: "dQw4w9WgXcQ" },
});
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "vorbereitung" } });
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "zu" } });
const probe = await roh(CREW, "/workspace/api/reaktion", { keks: k.admin });
ok(probe.j?.titel === "Nur vorbereitet",
`wer nur vorbereitet hat, behaelt seine Eingaben ("${probe.j?.titel}")`);
}
melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
+84 -19
View File
@@ -98,6 +98,41 @@ export const REAKTION_HOST_ROLLEN = HOST_ROLLEN;
const jetzt = () => new Date().toISOString();
/* ======================================================================
WAS ZU EINER EINZELNEN SENDUNG GEHOERT (30.09.2026)
Filipe: „wenn eine sendung beendet wurde soll alles automatisch
verschwinden. also von daten die da stehen von dem video."
Diese Aufzaehlung stand bis dahin EINMAL mitten in der
Zuruecksetzen-Route. Jetzt brauchen sie zwei Wege -- das Beenden
und der Knopf --, und zwei Abschriften waeren die, die beim
naechsten Spaltenzuwachs auseinanderlaufen. Genau so sind am
11.09. drei Spalten mit Inhalt verlorengegangen.
SIE STEHT EINZELN DA UND NICHT ALS „alles ausser". Eine Liste von
Ausnahmen waechst still mit jeder neuen Spalte mit -- und dann
loescht das Aufraeumen etwas, das es nie loeschen sollte. Was hier
fehlt, bleibt stehen, und das ist die sichere Richtung.
====================================================================== */
const SENDUNGS_FELDER = {
titel: "", video: "", video_titel: "", vorschau: "",
beginnt_am: null, laeuft: 0, sekunde: 0, gestartet_am: null,
zweit_video: "", zweit_titel: "", zweit_sekunde: 0,
};
/* UND WAS EINSTELLUNG IST -- nur beim ausdruecklichen Zuruecksetzen.
Bildaufteilung, Kameragroesse und Chatmodus gelten fuer alle
Sendungen. Wer sie nach jedem Beenden neu setzen muesste, haette
nach der dritten Sendung genug davon -- und schaltet dann lieber
gar nicht mehr ab. Das ist der Unterschied zwischen Aufraeumen und
Abraeumen. */
const PULT_EINSTELLUNGEN = {
tempo: 1, layout: "kino", kamera_gross: 1, kamera_ecke: "ur",
chat_modus: "offen",
};
/* ---------- Schranken --------------------------------------------------- */
function angemeldet(req, res, next) {
@@ -484,8 +519,15 @@ function darfSchreiben(person, stand) {
return schreibGrund(person, stand) === null;
}
function melden(art, daten) {
stromAn(empfaenger(), art, daten);
/** Rundruf an alle, die von einer Aenderung erfahren sollen.
*
* `wer` ist ausdruecklich ueberschreibbar (30.09.2026): Eine
* Aenderung, die die Zuschauerliste LEERT, muss ihre Empfaenger
* vorher bestimmt haben. Sonst sucht der Rundruf sie in einer
* Liste, die es nicht mehr gibt -- und ausgerechnet die Nachricht
* „der Saal ist zu" erreicht niemanden, der darin sitzt. */
function melden(art, daten, wer) {
stromAn(wer || empfaenger(), art, daten);
/* UND AN DIE BUEHNENQUELLEN. Sie haengen an keiner Person -- OBS
meldet sich mit einem Schluessel, nicht mit einem Zugang. Beide
Aufrufe stehen hier, an EINER Stelle: zwei Stellen, die je einen
@@ -539,19 +581,16 @@ reaktionRouter.post("/workspace/api/reaktion/zuruecksetzen", nurHost, (req, res)
db().exec("BEGIN IMMEDIATE");
try {
/* DIE SPALTEN STEHEN EINZELN DA UND NICHT ALS „alles ausser".
Eine Liste von Ausnahmen waechst still mit jeder neuen
Spalte mit -- und dann loescht das Zuruecksetzen etwas, das
es nie loeschen sollte. Was hier fehlt, bleibt stehen, und
das ist die sichere Richtung. */
db().prepare(`UPDATE reaktion SET
stand = 'zu', titel = '', video = '', video_titel = '', vorschau = '',
beginnt_am = NULL, laeuft = 0, sekunde = 0, tempo = 1,
layout = 'kino', kamera_gross = 1, kamera_ecke = 'ur',
chat_modus = 'offen',
zweit_video = '', zweit_titel = '', zweit_sekunde = 0,
gestartet_am = NULL, stand_seit = ?, geaendert = ?
WHERE id = 1`).run(jetzt(), jetzt());
/* BEIDE LISTEN, und beide stehen oben bei den Tabellen -- der
Knopf raeumt mehr weg als das blosse Beenden: auch die
Einstellungen und die Warteschlange. */
const felder = {
...SENDUNGS_FELDER, ...PULT_EINSTELLUNGEN,
stand: "zu", stand_seit: jetzt(), geaendert: jetzt(),
};
const spalten = Object.keys(felder).map((k) => `${k} = ?`).join(", ");
db().prepare(`UPDATE reaktion SET ${spalten} WHERE id = 1`)
.run(...Object.values(felder));
db().prepare("DELETE FROM reaktion_liste").run();
db().prepare("DELETE FROM reaktion_gaeste").run();
db().exec("COMMIT");
@@ -635,6 +674,13 @@ reaktionRouter.post("/workspace/api/reaktion/stand", nurHost, express.json({ lim
if (!STAENDE.includes(neu)) return res.status(400).json({ fehler: "stand_unbekannt" });
const s = sendung();
/* WER DAVON ERFAHREN SOLL, STEHT JETZT FEST -- vor jeder
Aenderung. „zu" loescht `reaktion_dabei`; wuerde der Rundruf
seine Empfaenger erst danach suchen, ginge ausgerechnet die
Nachricht „der Saal ist zu" an niemanden, der darin sitzt.
Ihre Seite blieb dann auf „live" stehen, bis sie neu luden. */
const erfahren = empfaenger();
/* OHNE VIDEO KEIN LIVE. Der Knopf waere sonst da, das Ergebnis
ein schwarzes Rechteck -- und die Leute sitzen davor. */
if (neu === "live" && !s.video) {
@@ -664,9 +710,28 @@ reaktionRouter.post("/workspace/api/reaktion/stand", nurHost, express.json({ lim
dabeiListe().length, zahl?.n || 0);
db().exec("DELETE FROM reaktion_chat");
db().exec("DELETE FROM reaktion_gaeste");
felder.laeuft = 0;
felder.sekunde = 0;
felder.gestartet_am = null;
/* UND DER SCHREIBTISCH WIRD LEER (30.09.2026).
Filipe: „wenn eine sendung beendet wurde soll alles
automatisch verschwinden. also von daten die da stehen von
dem video."
Vorher blieben Titel, Video, Vorschau, Beginn und das
zweite Video stehen. Beim naechsten Aufmachen stand dort
der Titel der letzten Sendung und ein Beginn, der in der
Vergangenheit liegt -- man musste jedes Feld einzeln
leeren, bevor man anfangen konnte.
ERST DER VERLAUF, DANN DAS LEEREN. Die Zeile darueber
schreibt Titel und Video in `reaktion_verlauf`; umgekehrt
stuende dort nichts. Verloren geht also nichts -- es wandert
nur dorthin, wo Vergangenes hingehoert.
Die Einstellungen (Bildaufteilung, Kameragroesse,
Chatmodus) und die Warteschlange bleiben. Wer sie auch weg
haben will, hat dafuer den Knopf „Alles zuruecksetzen". */
Object.assign(felder, SENDUNGS_FELDER);
}
if (neu === "zu") db().exec("DELETE FROM reaktion_dabei");
@@ -680,7 +745,7 @@ reaktionRouter.post("/workspace/api/reaktion/stand", nurHost, express.json({ lim
ip: echteIp(req),
});
const l = lage(req.person);
melden("reaktion", { was: "stand", lage: oeffentlich(l) });
melden("reaktion", { was: "stand", lage: oeffentlich(l) }, erfahren);
/* ERST JETZT EINLADEN, nach dem Schreiben und nach `melden`.
Wer die Meldung antippt, landet auf einer Seite, die den
+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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<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=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/anruf-probe.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609292348",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609300235",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609292348",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609300235",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609292348",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609300235",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609292348",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609300235",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+63 -7
View File
@@ -125,7 +125,12 @@ body.reaktion-seite > .kopfleiste { flex: none; }
max-width: none;
}
.regieleiste { grid-row: 1; }
#teil-zu, #teil-warte, #teil-live { grid-row: 2; }
/* DER RAUM steht in der zweiten Zeile -- nicht mehr die drei Häute.
Sie liegen seit dem 30.09.2026 in ihm und werden dort platziert
(siehe „DER RAUM" weiter unten). Stünde die Angabe weiter an
ihnen, legte sie sie in eine stillschweigende zweite Zeile DES
RAUMS; gemessen war das Kino danach 0 px hoch. */
.raum { grid-row: 2; }
.pult { grid-row: 3; }
.transport { grid-row: 4; }
.transport[hidden] { display: none; }
@@ -168,9 +173,12 @@ body.reaktion-seite > .kopfleiste { flex: none; }
grid-template-rows: auto minmax(0, 1fr) auto auto;
}
.saal:has(.pult[data-auf="ja"]) .regieleiste { grid-area: leiste; }
.saal:has(.pult[data-auf="ja"]) #teil-zu,
.saal:has(.pult[data-auf="ja"]) #teil-warte,
.saal:has(.pult[data-auf="ja"]) #teil-live { grid-area: kino; }
/* Das Feld „kino" nimmt der RAUM ein -- darin stehen dann Bild und
Chat nebeneinander, wie der Satz oben es beschreibt. Vor dem
30.09.2026 standen hier die drei Häute; seit sie im Raum liegen,
zeigte die Angabe auf ein Feld, das es in ihrem Raster nicht
gibt, und das Kino landete mit 0 px neben dem Bild. */
.saal:has(.pult[data-auf="ja"]) .raum { grid-area: kino; }
.saal:has(.pult[data-auf="ja"]) .transport { grid-area: transport; }
.saal:has(.pult[data-auf="ja"]) .pult {
@@ -319,6 +327,41 @@ body.reaktion-seite > .kopfleiste { flex: none; }
/* ---------------------------------------------------------------------
HÄUTE EIN- UND AUSBLENDEN
--------------------------------------------------------------------- */
/* ==== DER RAUM: zwei Spalten, und die rechte bleibt ===============
Filipe, 30.09.2026: „mach dass ich die chat kiste immer sehe bitte
und nicht erst wenn das video läuft."
Die Schiene lag bis dahin IM Kino und ging mit ihm weg — sichtbar
war sie damit nur im Live. Jetzt hält der Raum die Spalten: Links
wechseln sich die drei Häute ab, rechts steht der Chat.
DIE SPALTEN STEHEN NUR HIER. `.kino` hatte sie vorher selbst;
blieben sie dort, wären es zwei Antworten auf dieselbe Frage — und
genau daran ist am 28.09. die Regieleiste auf null Pixel gelaufen,
weil zwei `grid-template-rows` in dieser Datei standen und die
spätere gewann. */
.raum {
display: grid;
grid-template-columns: 1fr minmax(19rem, 23rem);
/* DIE ZEILE MUSS FEST SEIN. Ohne Angabe hat ein Raster eine
stillschweigende Zeile, die sich am Inhalt bemisst — und darin
steht `.kino` mit `height: 100%`, also „so hoch wie die Zeile".
Zwei Angaben, die aufeinander zeigen; der Browser löst das mit
NULL auf. Gemessen: Kino 613 px → 0 px, und mit der Leinwand
rutschten Spendenkarte und Kamera-Schild aus dem Bild.
Vorher lag `.kino` unmittelbar in der Zeile `minmax(0, 1fr)` des
Saals — die Festigkeit wandert hier mit. */
grid-template-rows: minmax(0, 1fr);
height: 100%;
min-height: 0; /* sonst wächst das Raster über das Fenster */
}
/* ALLE DREI HÄUTE IN DIESELBE ZELLE. Nicht nebeneinander: Sichtbar
ist immer genau eine, und die soll die ganze Spalte haben. */
#teil-zu, #teil-warte, #teil-live { grid-area: 1 / 1; }
.raum > .schiene { grid-area: 1 / 2; }
#teil-zu, #teil-warte, #teil-live { display: none; }
.saal[data-stand="zu"] #teil-zu { display: grid; }
.saal[data-stand="vorbereitung"] #teil-warte { display: grid; }
@@ -445,7 +488,9 @@ body.reaktion-seite > .kopfleiste { flex: none; }
LIVE — der Kinosaal
===================================================================== */
.kino {
grid-template-columns: 1fr minmax(19rem, 23rem);
/* KEINE SPALTEN MEHR — die hält seit dem 30.09.2026 `.raum`, weil
die Chatschiene nicht mehr hier drinliegt. Hier stünde sonst die
zweite Antwort auf dieselbe Frage. */
gap: 0;
height: 100%;
min-height: 0; /* sonst wächst das Raster über das Fenster */
@@ -2664,8 +2709,16 @@ body.reaktion-seite > .kopfleiste { flex: none; }
}
.transport__teil--rechts { justify-content: center; }
.kino {
/* AM SCHMALEN GERÄT UNTEREINANDER: erst das Bild, dann der Chat.
Die Angabe gehört an denselben Ort wie die breite — an den Raum,
nicht ans Kino. */
.raum {
grid-template-columns: 1fr;
grid-template-rows: auto minmax(0, 1fr);
}
#teil-zu, #teil-warte, #teil-live { grid-area: 1 / 1; }
.raum > .schiene { grid-area: 2 / 1; }
.kino {
grid-template-rows: auto 1fr;
}
.leinwand {
@@ -3064,7 +3117,10 @@ body[data-nur="buehne"] .spendentafel {
body[data-nur="buehne"] .saal {
height: 100dvh;
}
body[data-nur="buehne"] .kino { grid-template-columns: 1fr; }
/* In der Bühnenquelle gibt es keinen Chat — dann soll die rechte
Spalte auch keinen Platz belegen. */
body[data-nur="buehne"] .raum,
.obs-buehne .raum { grid-template-columns: 1fr; }
body[data-nur="buehne"] { background: #000; }
/* ==== KEINE TASTENKUERZEL AM FINGERGERAET =========================
+188 -15
View File
@@ -1264,7 +1264,16 @@
den Wachhund zu warten; den behalten wir als Netz, aber
er soll nicht der Normalfall sein. */
if (!binSender && lage && lage.stand === 'live') {
await standHolen().catch(() => { /* dann eben mit dem alten Stand */ });
/* SANFT (30.09.2026): Diese Abfrage macht die Seite von
sich aus, bei jedem Verbindungssignal. Kommt während
ihrer Laufzeit ein Rundruf, ist der neuer.
Gemessen hat sie den frisch gesetzten Wechsel der
Werbung wieder auf Laufband zurückgedreht — gefunden hat
das nicht das Nachdenken, sondern eine Mitschrift der
Aufrufkette: `zeichnen < standHolen < signalEmpfangen`.
Drei Runden Raten davor lagen daneben. */
await standHolen(true).catch(() => { /* dann eben mit dem alten Stand */ });
}
if (binSender && !meinStrom) await kameraHolen();
const d = draht(von);
@@ -2650,12 +2659,27 @@
if (document.activeElement !== $('p-titel')) $('p-titel').value = lage.titel || '';
if (document.activeElement !== $('p-video')) $('p-video').value = lage.video || '';
if (document.activeElement !== $('p-vorschau')) $('p-vorschau').value = lage.vorschau || '';
if (lage.beginnt_am && document.activeElement !== $('p-beginn')) {
const d = new Date(lage.beginnt_am);
if (!Number.isNaN(d.getTime())) {
/* ZWEI FRAGEN, ZWEI BEDINGUNGEN (30.09.2026).
Hier stand `if (lage.beginnt_am && document.activeElement !== …)`.
„Tippt gerade jemand darin?" ist die eine Frage, „gibt es einen
Wert?" die andere — zusammengezogen beantwortet die zweite die
erste stillschweigend mit nein: Fiel der Termin weg, wurde der
ganze Block übersprungen, und im Kasten stand das alte Datum
weiter, bis jemand die Seite neu lud.
Das betraf auch den Knopf „Alles zurücksetzen": Die Spalte war
leer, das Pult zeigte den Termin trotzdem. Titel und Video
haben es immer richtig gemacht (`|| ''`), dieses eine Feld
nicht. */
if (document.activeElement !== $('p-beginn')) {
const d = lage.beginnt_am ? new Date(lage.beginnt_am) : null;
if (d && !Number.isNaN(d.getTime())) {
const p = (n) => String(n).padStart(2, '0');
$('p-beginn').value = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`
+ `T${p(d.getHours())}:${p(d.getMinutes())}`;
} else {
$('p-beginn').value = '';
}
}
@@ -3244,9 +3268,38 @@
function stromAuf() {
if (strom) return;
strom = new EventSource('/workspace/api/chat/strom');
strom.addEventListener('open', () => { stromOffen = true; });
/* WER GERADE ZUHOEREN KANN, FRAGT NACH, WAS ER VERPASST HAT
(30.09.2026).
Zwischen dem Laden der Seite und dem Offensein des Stroms
liegt ein Fenster. Was die Regie darin umschaltet, kam bei
dieser Seite NIE an: Der Rundruf ging hinaus, als noch niemand
zuhoerte, und danach fragte niemand mehr nach.
Dasselbe nach jedem Abriss — der Browser baut den Strom von
selbst wieder auf, aber alles aus der Unterbrechung ist weg.
Die Seite zeigte dann einen Stand von vor dem Abriss, und zwar
unbegrenzt: Ein Zuschauer lädt eine Stunde lang nicht neu.
Eine kleine Abfrage je Verbindung macht die Seite
selbstheilend. Die Alternative wäre, jedem Rundruf zu
glauben, dass er angekommen ist — und genau das war der
Fehler. */
strom.addEventListener('open', () => {
stromOffen = true;
/* SANFT: Diese Abfrage macht die Seite von sich aus. Kommt
währenddessen ein Rundruf, ist der neuer — dann gilt er. */
standHolen(true);
});
strom.addEventListener('reaktion', (e) => {
try {
/* JEDER RUNDRUF ZAEHLT — an EINER Stelle, ganz oben. In
jeden Zweig einzeln geschrieben wäre es die Zeile, die
beim nächsten Zweig vergessen wird. Dass dabei auch
Rundrufe mitzählen, die `lage` gar nicht anfassen, ist
die sichere Richtung: Im Zweifel behält die Seite, was
sie über den Strom weiß. */
standFolge++;
const d = JSON.parse(e.data);
if (d.was === 'video') {
/* WER STEUERT, FOLGT SEINEM EIGENEN ECHO NICHT (29.09.2026).
@@ -3265,10 +3318,23 @@
danebensteht, muss weiter folgen, sonst sieht er etwas
anderes als alle übrigen.
DAS TEMPO ZIEHT TROTZDEM MIT — es steht darunter und
kommt nicht von seinem eigenen Spieler, sondern aus dem
Regiepult. */
if (!(lage?.host?.id && lage.host.id === meineId)) folgen(d);
DAS TEMPO GILT AUCH FÜR IHN, und zwar ausdrücklich.
Hier stand erst „das zieht trotzdem mit — es steht
darunter". Das war falsch: Darunter wird `lage.tempo`
gesetzt und das Schild neu gezeichnet; den SPIELER
stellt allein `tempoNachziehen()`, und die steht in
`folgen()`. Gemessen lief 2× bei ihm danach mit 0,50
statt 2,00 Sekunden je Sekunde — er war der Einzige, bei
dem die Geschwindigkeit nichts tat.
Das Tempo kommt nicht aus seinem Spieler zurück, sondern
aus dem Pult. Es ist kein Echo seiner selbst, sondern
eine Ansage. */
if (lage?.host?.id && lage.host.id === meineId) {
if (d.tempo) tempoNachziehen(d.tempo);
} else {
folgen(d);
}
/* DAS SCHILD MUSS MIT. `folgen()` stellt den Spieler, aber
der Rundruf geht hier mit `return` heraus -- ohne diese
zwei Zeilen stuende beim Zuschauer weiter „1x", waehrend
@@ -3308,8 +3374,23 @@
`banner_alle` ist NICHT dabei -- die Verwaltungsliste
samt abgeschalteten Entwuerfen gehoert nur der Regie.
Wer sie braucht, holt den Stand. */
if (lage) {
Wer sie braucht, holt den Stand.
KOMMT ER VOR DEM STAND AN, wird der ganze Stand geholt
statt den Rundruf wegzuwerfen (30.09.2026). Der
Ereignisstrom haengt beim Aufbau der Seite; `lage` ist
erst da, wenn `standHolen()` einmal durch ist. In dem
Fenster dazwischen ging jeder Rundruf still verloren --
wer die Seite gerade aufmachte, waehrend die Regie
umschaltete, sah die Werbung nicht, und niemand merkte
es.
Die Messung hat das als scheinbare Flatterhaftigkeit
gezeigt: einmal fehlte das Laufband, beim naechsten Lauf
der Wechsel. Ein Ergebnis, das zwischen zwei Laeufen
springt, ist zuerst als Wettlauf verdaechtig. */
if (!lage) { standHolen(); return; }
{
lage = { ...lage, werbung: {
art: d.art, tempo: d.tempo, ecke_dogi: d.ecke_dogi,
ecke_hase: d.ecke_hase, ecke_gross: d.ecke_gross, band: d.band,
@@ -3443,17 +3524,53 @@
if (!lage || lage.stand === 'zu') {
clearInterval(draehteUhr);
draehteWeg();
/* ABER NICHT VERSTUMMEN (30.09.2026).
Hier stand ein blankes `return` — und damit fragte die Seite
nie wieder nach. Rundrufe bekommt sie in diesem Zustand auch
keine: Wer nicht in `reaktion_dabei` steht, steht nicht in
`empfaenger()`, und beim Schließen wird genau diese Liste
geleert.
Folge: Macht der Host wieder auf, passiert bei allen, die den
Reiter noch offen haben, NICHTS. Nicht später, nicht in
dreißig Sekunden — nie, bis jemand von Hand neu lädt.
Gemessen: Server sagt „vorbereitung", die Seite zeigt „zu",
auch nach 40 Sekunden.
Ein geschlossener Saal ist der ruhigste Fall des ganzen
Hauses: kein Video, keine Kameras, kein Chat. Eine kleine
Abfrage alle fünfzehn Sekunden kostet dort nichts — und ist
der Unterschied zwischen „es geht los" und „lad mal neu".
`anschliessen()` ruft sich danach selbst: Ist wieder
aufgemacht, räumt dieser Aufruf den langsamen Takt weg und
startet den richtigen. `standHolen()` allein täte das nicht
— es zeichnet nur. */
dabeiUhr = setInterval(async () => {
await standHolen(true);
anschliessen();
}, 15_000);
return;
}
await stromAbwarten();
const melden = async () => {
try {
/* DIE FOLGENUMMER GILT AUCH HIER (30.09.2026). Dieser Takt
laeuft auf jeder Zuschauerseite alle 30 Sekunden und
ersetzt den GANZEN Stand. Ist er unterwegs, waehrend ein
Rundruf ankommt, gewinnt er -- obwohl der Rundruf das
Neuere wusste. Gemessen: Der Wechsel der Werbung wurde
gezeichnet und war einen Augenblick spaeter wieder leer. */
const beim = standFolge;
const a = await hole('/workspace/api/reaktion/dabei', { method: 'POST' });
if (a.ok) {
const neu = await a.json();
lage = neu;
zeichnen();
if (beim === standFolge) { lage = neu; zeichnen(); }
/* Die Verbindungen werden in jedem Fall nachgezogen -- das
ist kein Stand, sondern der Draht dorthin. */
draehteNachziehen();
return;
}
@@ -3466,7 +3583,29 @@
if (a.status === 403) {
const wort = (await a.json().catch(() => null))?.fehler;
if (wort === 'aus_der_sendung' || wort === 'treff_massnahme') rausgenommen(wort);
return;
}
/* JEDE ANDERE ABSAGE IST AUCH EINE AUSKUNFT (30.09.2026).
Der wichtigste Fall ist 409 „saal_zu". Ist der Saal zu,
steht diese Person in keiner Dabei-Liste mehr — sie bekommt
also auch keinen Rundruf, wenn wieder aufgemacht wird. Ihr
Takt lief weiter, wurde jedes Mal abgewiesen, und die Seite
blieb stehen. Nicht dreißig Sekunden: für immer, bis
jemand neu lädt.
Gemessen: Nach dem Schließen und Wiederaufmachen stand die
Seite der Zuschauerin auch nach 40 Sekunden noch auf „zu".
Wer nicht sagen kann, ob er dabei ist, holt den Stand.
Eine kleine Abfrage je halber Minute — und der Unterschied
zwischen einer Seite, die sich fängt, und einer, die man
neu laden muss.
SANFT, wie jede Abfrage, die die Seite von sich aus
macht. */
standHolen(true);
} catch { /* der nächste Takt versucht es wieder */ }
};
melden();
@@ -4034,10 +4173,44 @@
document.body.append(kasten);
}
async function standHolen() {
/* ==== WER ZULETZT ANTWORTET, HAT NICHT RECHT (30.09.2026) =======
Eine Abfrage ist Sekundenbruchteile unterwegs. Kommt in dieser
Zeit ein Rundruf an, ist SEIN Stand der neuere — und trotzdem
hat die verspätete Antwort ihn überschrieben, weil sie später
ankam.
Gemessen: Die Regie schaltet die zwei Eckenbilder ein, der
Rundruf zeichnet sie, und eine Sekunde später waren sie wieder
weg — eine beim Seitenaufbau gestartete Abfrage war
zurückgekommen und hatte den Stand von vorher gesetzt. Eine
feste Wartezeit in der Messung hatte das monatelang zugedeckt;
sie fiel erst auf, als ich sie durch eine echte Bedingung
ersetzte.
Die Folgenummer zählt jeden angekommenen Rundruf. Eine SANFTE
Abfrage merkt sie sich, bevor sie losgeht, und wirft ihr
Ergebnis weg, wenn inzwischen etwas Neueres da war. */
let standFolge = 0;
/** Den ganzen Stand holen.
*
* @param sanft `true`: verwirft das Ergebnis, wenn währenddessen
* ein Rundruf angekommen ist. Für Abfragen, die die
* Seite von sich aus macht (nach dem Verbindungs-
* aufbau, im geschlossenen Saal).
*
* Ohne Angabe gewinnt die Abfrage — sie bringt
* Dinge mit, die kein Rundruf trägt (etwa die
* Verwaltungsliste der Regie). Dort wäre der
* Vorrang des Rundrufs ein Verlust. */
async function standHolen(sanft) {
const beim = standFolge;
const a = await hole('/workspace/api/reaktion');
if (!a.ok) { sagFehler('Die Reaction ist gerade nicht erreichbar.'); return; }
lage = await a.json();
const neu = await a.json();
if (sanft && beim !== standFolge) return;
lage = neu;
zeichnen();
}
+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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348"></script>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/textform.js?v=202609300235"></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/zuteilung.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/zuteilung.js?v=202609300235" 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=202609292348" defer></script>
<script src="assets/js/aufgaben.js?v=202609292348" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609300235" defer></script>
<script src="assets/js/aufgaben.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -168,15 +168,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/automation.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/automation.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -197,16 +197,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/befinden.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/befinden.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348"></script>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/textform.js?v=202609300235"></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/checkliste.js?v=202609292348" defer></script>
<script src="assets/js/ampel.js?v=202609292348" defer></script>
<script src="assets/js/schulung.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/bereich.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/checkliste.js?v=202609300235" defer></script>
<script src="assets/js/ampel.js?v=202609300235" defer></script>
<script src="assets/js/schulung.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/bereich.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/bewerben.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/auskunft.js?v=202609300235" defer></script>
<script src="assets/js/bewerben.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -80,16 +80,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/bewerbungen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/auskunft.js?v=202609300235" defer></script>
<script src="assets/js/bewerbungen.js?v=202609300235" 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=202609292348" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609300235" />
</head>
<body class="obs-buehne">
<div id="platz"></div>
<script src="assets/js/werbung.js?v=202609292348" defer></script>
<script src="assets/js/buehne.js?v=202609292348" defer></script>
<script src="assets/js/werbung.js?v=202609300235" defer></script>
<script src="assets/js/buehne.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -89,15 +89,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/calls.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/calls.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -739,24 +739,24 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609292348"></script>
<script src="assets/js/bereiche.js?v=202609300235"></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=202609292348"></script>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348"></script>
<script src="assets/js/glocke.js?v=202609292348"></script>
<script src="assets/js/textform.js?v=202609300235"></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235"></script>
<script src="assets/js/glocke.js?v=202609300235"></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=202609292348"></script>
<script src="assets/js/anruf.js?v=202609300235"></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=202609292348"></script>
<script src="assets/js/chat.js?v=202609292348"></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/bildschau.js?v=202609300235"></script>
<script src="assets/js/chat.js?v=202609300235"></script>
<script src="assets/js/installieren.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/content.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/content.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -179,15 +179,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/checkliste.js?v=202609292348" defer></script>
<script src="assets/js/content.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/checkliste.js?v=202609300235" defer></script>
<script src="assets/js/content.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609300235" />
</head>
<body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/gate.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609292348",
"src": "/assets/img/app-symbole/crew-192.png?v=202609300235",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609292348",
"src": "/assets/img/app-symbole/crew-512.png?v=202609300235",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609292348",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609300235",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609292348",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609300235",
"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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/dateien.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/dateien.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -297,20 +297,20 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" 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=202609292348" defer></script>
<script src="assets/js/entwicklung.js?v=202609292348" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609300235" defer></script>
<script src="assets/js/entwicklung.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -146,14 +146,14 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/hilfe.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/hilfe.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
</head>
<body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/gate.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -383,15 +383,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/kalender.js?v=202609292348" defer></script>
<script src="assets/js/kalender-abo.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/kalender.js?v=202609300235" defer></script>
<script src="assets/js/kalender-abo.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -444,13 +444,13 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609292348"></script>
<script src="assets/js/nachfrage.js?v=202609292348"></script>
<script src="assets/js/wahl.js?v=202609292348"></script>
<script src="assets/js/bereiche.js?v=202609292348"></script>
<script src="assets/js/kopf.js?v=202609292348"></script>
<script src="assets/js/glocke.js?v=202609292348"></script>
<script src="assets/js/leistung.js?v=202609292348"></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235"></script>
<script src="assets/js/nachfrage.js?v=202609300235"></script>
<script src="assets/js/wahl.js?v=202609300235"></script>
<script src="assets/js/bereiche.js?v=202609300235"></script>
<script src="assets/js/kopf.js?v=202609300235"></script>
<script src="assets/js/glocke.js?v=202609300235"></script>
<script src="assets/js/leistung.js?v=202609300235"></script>
<script src="assets/js/installieren.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/material.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/material.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/material.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/material.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/notizen.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/notizen.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -453,14 +453,14 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/personen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/personen.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -214,16 +214,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/steckbrief.js?v=202609292348" defer></script>
<script src="assets/js/profil.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/steckbrief.js?v=202609300235" defer></script>
<script src="assets/js/profil.js?v=202609300235" defer></script>
</body>
</html>
+244 -230
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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start reaktion-seite" data-stand="laedt">
@@ -129,226 +129,240 @@
<p class="fehler" id="fehler" role="alert" aria-live="polite" hidden></p>
<!-- ============ ZU ============================================== -->
<section class="vorhang" id="teil-zu" aria-label="Die Reaction ist geschlossen">
<div class="vorhang__licht" aria-hidden="true"></div>
<div class="vorhang__innen">
<span class="vorhang__marke"><i></i>Team Dogi<i></i></span>
<h1 class="vorhang__titel">Der Saal ist zu.</h1>
<p class="vorhang__satz" id="zu-satz">
Hier schauen wir zusammen. Wenn etwas läuft, steht es hier —
und du siehst es schon an der Kachel.
</p>
<p class="vorhang__naechste" id="zu-naechste" hidden></p>
</div>
</section>
<!-- ============ DER RAUM =======================================
Zwei Spalten: links wechseln die drei Haeute (Vorhang,
Wartebereich, Kino), rechts steht die Chatschiene -- und die
bleibt.
<!-- ============ VORBEREITUNG ==================================== -->
<section class="warte" id="teil-warte" aria-label="Wartebereich">
<div class="warte__buehne">
<div class="warte__bild" id="warte-bild" aria-hidden="true"></div>
<div class="warte__text">
<span class="warte__kicker">Gleich geht es los</span>
<h1 class="warte__titel" id="warte-titel">Reaction startet bald</h1>
<!-- Der Countdown ist eine ZAHL und kein Balken. Ein Balken
sagt „irgendwann"; eine Zahl sagt „in vier Minuten", und
danach entscheidet jemand, ob er sich noch einen Kaffee
holt. -->
<div class="countdown" id="countdown" hidden>
<span class="countdown__zahl" id="countdown-zahl">–</span>
<span class="countdown__wort" id="countdown-wort">bis zum Start</span>
</div>
<p class="warte__danach" id="warte-naechstes" hidden></p>
<p class="warte__satz">
Der Chat ist schon offen. Schreib schon mal, wer da ist.
Filipe, 30.09.2026: "mach dass ich die chat kiste immer sehe
bitte und nicht erst wenn das video laeuft."
Vorher lag die Schiene IM Kino und ging mit ihm weg. Im
Wartebereich stand dabei "Der Chat ist schon offen" -- der
Satz stimmte, der Server laesst dort schreiben; zu sehen war
der Chat trotzdem nicht. -->
<div class="raum" id="raum">
<section class="vorhang" id="teil-zu" aria-label="Die Reaction ist geschlossen">
<div class="vorhang__licht" aria-hidden="true"></div>
<div class="vorhang__innen">
<span class="vorhang__marke"><i></i>Team Dogi<i></i></span>
<h1 class="vorhang__titel">Der Saal ist zu.</h1>
<p class="vorhang__satz" id="zu-satz">
Hier schauen wir zusammen. Wenn etwas läuft, steht es hier —
und du siehst es schon an der Kachel.
</p>
<p class="vorhang__naechste" id="zu-naechste" hidden></p>
</div>
</div>
</section>
</section>
<!-- ============ LIVE ============================================ -->
<section class="kino" id="teil-live" aria-label="Die Reaction läuft">
<!-- Das Video. Der Rahmen bleibt stehen, auch wenn noch nichts
darin ist -- ein Kasten, der erst entsteht, wenn das Video
kommt, lässt die halbe Seite springen. -->
<div class="leinwand" id="leinwand">
<div class="leinwand__video" id="video-platz">
<div class="leinwand__warte" id="video-warte">Das Video kommt gleich …</div>
</div>
<!-- WER MITSIEHT, MUSS ES WISSEN. Läuft das Video auf 1,5-fach
und steht das nirgends, hält jeder Zweite seine Leitung für
kaputt — oder glaubt, bei ihm sei etwas verstellt. Ein
kleines Schild, nur wenn es nicht 1× ist; bei normaler
Geschwindigkeit wäre es eine Fläche ohne Aussage. -->
<span class="leinwand__tempo" id="leinwand-tempo" hidden aria-live="polite"></span>
<!-- Die Kamerafenster liegen ÜBER dem Video, nicht daneben.
Genau so sieht eine Reaction aus: das Bild groß, das
Gesicht klein davor. Wer lieber beides gleich groß hat,
stellt oben die Anordnung um. -->
<div class="kameras" id="kameras"></div>
<!-- DER TON MUSS FREIGEGEBEN WERDEN. Ein Videoelement mit Ton
darf nicht von allein losgehen -- das verbietet jeder
Browser. Die Kameras starten deshalb stumm, und dieser
Knopf (oder die erste Berührung der Seite) schaltet sie
laut. Ohne ihn säße jemand vor einem stummen Bild und
suchte den Fehler bei sich. -->
<!-- DIE SPENDENTAFEL. Hier laufen die Karten ein — eine nach
der anderen, unten am Rand, nie über der Mitte. Wer etwas
gibt, soll es sehen; wer zusieht, soll das Video nicht
verlieren. -->
<div class="spendentafel" id="spendentafel" aria-live="polite"></div>
<!-- DIE SENDERLEISTE. Sie gehört jedem, der sendet — Host wie
Gast — und liegt über dem Bild, weil man dorthin sieht.
Ein Gast, der sein eigenes Bild nicht abschalten kann,
müsste den Host darum bitten; das ist keine Bedienung,
das ist eine Bitte. -->
<div class="senderleiste" id="senderleiste" hidden>
<button type="button" class="sender-knopf" id="s-kamera" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.5 6.5h11v11h-11z" />
<path d="M14.5 10.5l6-3.5v10l-6-3.5z" />
<path class="sender-knopf__strich" d="M3 21L21 3" />
</svg>
<span id="s-kamera-wort">Kamera</span>
</button>
<!-- ==== DEN BILDSCHIRM TEILEN ==========================
Filipe: „waere es nicht einfach eine bildschirm
uebertragung zu installieren?"
Er geht denselben Weg wie die Kamera — dieselbe
Direktverbindung, nur eine andere Quelle. Deshalb steht
der Knopf auch hier und nicht in einem eigenen
Bereich. -->
<button type="button" class="sender-knopf" id="s-teilen" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3 4.5h18v12H3z" />
<path d="M8 20.5h8" />
<path d="M12 16.5v4" />
</svg>
<span id="s-teilen-wort">Bildschirm</span>
</button>
<button type="button" class="sender-knopf" id="s-mikro" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 3.2a2.6 2.6 0 0 1 2.6 2.6v6a2.6 2.6 0 0 1-5.2 0v-6A2.6 2.6 0 0 1 12 3.2z" />
<path d="M5.8 11.4a6.2 6.2 0 0 0 12.4 0M12 17.6V21" />
<path class="sender-knopf__strich" d="M3 21L21 3" />
</svg>
<span id="s-mikro-wort">Mikro</span><kbd class="sender-taste">M</kbd>
</button>
<span class="sender-pegel" id="s-pegel" aria-hidden="true"><i></i></span>
</div>
<button type="button" class="ton-an" id="ton-an" hidden>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M4 9.4h3.6L12 5.2v13.6L7.6 14.6H4z" />
<path d="M16.2 9.2a4 4 0 0 1 0 5.6" />
<path d="M18.6 6.6a7.4 7.4 0 0 1 0 10.8" />
</svg>
<span>Ton einschalten</span>
</button>
</div>
<!-- Der Chat. Auf dem Rechner eine Schiene rechts, am Handy eine
Lade, die von unten einfährt. -->
<aside class="schiene" id="schiene" aria-label="Live-Chat">
<header class="schiene__kopf">
<h2 class="schiene__titel">Live-Chat</h2>
<span class="schiene__zahl" id="chat-zahl">0</span>
<!-- WAS GEMELDET WURDE. Steht nur da, wenn etwas offen ist —
eine Zahl, die immer sichtbar und meistens null ist, wird
nach drei Tagen nicht mehr gelesen. Nur für die
Moderation. -->
<button type="button" class="schiene__meldungen" id="chat-meldungen" hidden></button>
<!-- DIE CHAT-STUFE STEHT DORT, WO DER CHAT IST, und nicht im
Regiepult. Man moderiert, wo man liest — ein Umweg über
ein Register wäre in dem Moment, in dem es laut wird,
genau ein Umweg zu viel. Nur die zwei sehen sie. -->
<div class="chatstufen" id="chat-stufen" hidden role="group" aria-label="Wer schreiben darf">
<button type="button" class="chatstufe" data-modus="offen" aria-pressed="true">Offen</button>
<button type="button" class="chatstufe" data-modus="team" aria-pressed="false">Team</button>
<button type="button" class="chatstufe" data-modus="zu" aria-pressed="false">Zu</button>
</div>
</header>
<ol class="schiene__liste" id="chat-liste" aria-live="polite"></ol>
<form class="schiene__form" id="chat-form">
<input type="text" id="chat-feld" class="schiene__feld" maxlength="400"
placeholder="Sag was …" autocomplete="off" />
<button type="submit" class="schiene__senden" aria-label="Senden">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12 20 4l-4 8 4 8z" /></svg>
</button>
</form>
<!-- DER WEG, DEN HOST ZU UNTERSTÜTZEN. Er steht IM Chat und
nicht in einer eigenen Ecke: Wer gerade etwas gut findet,
tippt es in den Chat — und sieht den Knopf in derselben
Bewegung.
VIER BETRÄGE STATT EINES LINKS. Ein Tipp öffnet PayPal mit
schon eingetragener Summe; wer eine Liste sieht, rechnet,
wer vier Knöpfe sieht, tippt. Danach fragt das Feld
einmal nach — mehr können wir von hier aus nicht wissen,
und so zu tun, als wüssten wir es, wäre gelogen. -->
<div class="geben" id="geben" hidden>
<div class="geben__kopf">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 20.4S3.6 15.2 3.6 9.6A4.2 4.2 0 0 1 12 7.4a4.2 4.2 0 0 1 8.4 2.2c0 5.6-8.4 10.8-8.4 10.8z" />
</svg>
<span id="geben-titel">Dogi was ausgeben</span>
</div>
<div class="geben__betraege" id="geben-betraege"></div>
<a class="geben__frei" id="geben-frei" hidden
rel="noopener noreferrer" target="_blank">Frei wählen …</a>
<!-- Erscheint erst, wenn jemand eine Zahl angetippt hat.
Vorher wäre es eine Frage auf etwas, das nicht passiert
ist. -->
<div class="geben__nach" id="geben-nach" hidden>
<p class="geben__frage" id="geben-frage">Hat es geklappt?</p>
<!-- ==== DER TEXT KOMMT VON DEM, DER GIBT ==============
Filipe: „der text der dazu erscheint sollen die leute
selber schreiben können … es sollen personalisierte
texte sein von den leuten selbst."
Der Name steht oben, weil viele mit ihrem Rudelnamen
dastehen wollen und nicht mit dem, der im Haus
steht. Beides ist freiwillig — wer nichts schreibt,
bekommt seinen Namen und eine Karte ohne Satz. -->
<label class="geben__feld">
<span>Name auf der Karte</span>
<input type="text" id="geben-name" maxlength="40"
autocomplete="off" placeholder="So wie du dastehen willst" />
</label>
<label class="geben__feld">
<span>Dein Text <span class="geben__rest" id="geben-rest"></span></span>
<textarea id="geben-text" rows="2" maxlength="140"
placeholder="Was soll im Bild stehen?"></textarea>
</label>
<div class="geben__nach-knoepfe">
<button type="button" class="geben__melden" id="geben-melden">Ja, melden</button>
<button type="button" class="geben__abbruch" id="geben-abbruch">Doch nicht</button>
<!-- ============ VORBEREITUNG ==================================== -->
<section class="warte" id="teil-warte" aria-label="Wartebereich">
<div class="warte__buehne">
<div class="warte__bild" id="warte-bild" aria-hidden="true"></div>
<div class="warte__text">
<span class="warte__kicker">Gleich geht es los</span>
<h1 class="warte__titel" id="warte-titel">Reaction startet bald</h1>
<!-- Der Countdown ist eine ZAHL und kein Balken. Ein Balken
sagt „irgendwann"; eine Zahl sagt „in vier Minuten", und
danach entscheidet jemand, ob er sich noch einen Kaffee
holt. -->
<div class="countdown" id="countdown" hidden>
<span class="countdown__zahl" id="countdown-zahl">–</span>
<span class="countdown__wort" id="countdown-wort">bis zum Start</span>
</div>
<p class="warte__danach" id="warte-naechstes" hidden></p>
<p class="warte__satz">
Der Chat ist schon offen. Schreib schon mal, wer da ist.
</p>
</div>
<p class="geben__danke" id="geben-danke" hidden></p>
<!-- WAS ICH SELBST HABE. Ohne einen sichtbaren Stand wären
die Punkte eine Zahl in einer Datenbank und kein Grund,
wiederzukommen. Er steht nur da, wenn er nicht null
ist — eine Null zu zeigen ist keine Auskunft, sondern
eine Aufforderung. -->
<p class="geben__stand" id="geben-stand" hidden></p>
</div>
</aside>
</section>
<!-- ============ LIVE ============================================ -->
<section class="kino" id="teil-live" aria-label="Die Reaction läuft">
<!-- Das Video. Der Rahmen bleibt stehen, auch wenn noch nichts
darin ist -- ein Kasten, der erst entsteht, wenn das Video
kommt, lässt die halbe Seite springen. -->
<div class="leinwand" id="leinwand">
<div class="leinwand__video" id="video-platz">
<div class="leinwand__warte" id="video-warte">Das Video kommt gleich …</div>
</div>
<!-- WER MITSIEHT, MUSS ES WISSEN. Läuft das Video auf 1,5-fach
und steht das nirgends, hält jeder Zweite seine Leitung für
kaputt — oder glaubt, bei ihm sei etwas verstellt. Ein
kleines Schild, nur wenn es nicht 1× ist; bei normaler
Geschwindigkeit wäre es eine Fläche ohne Aussage. -->
<span class="leinwand__tempo" id="leinwand-tempo" hidden aria-live="polite"></span>
<!-- Die Kamerafenster liegen ÜBER dem Video, nicht daneben.
Genau so sieht eine Reaction aus: das Bild groß, das
Gesicht klein davor. Wer lieber beides gleich groß hat,
stellt oben die Anordnung um. -->
<div class="kameras" id="kameras"></div>
<!-- DER TON MUSS FREIGEGEBEN WERDEN. Ein Videoelement mit Ton
darf nicht von allein losgehen -- das verbietet jeder
Browser. Die Kameras starten deshalb stumm, und dieser
Knopf (oder die erste Berührung der Seite) schaltet sie
laut. Ohne ihn säße jemand vor einem stummen Bild und
suchte den Fehler bei sich. -->
<!-- DIE SPENDENTAFEL. Hier laufen die Karten ein — eine nach
der anderen, unten am Rand, nie über der Mitte. Wer etwas
gibt, soll es sehen; wer zusieht, soll das Video nicht
verlieren. -->
<div class="spendentafel" id="spendentafel" aria-live="polite"></div>
<!-- DIE SENDERLEISTE. Sie gehört jedem, der sendet — Host wie
Gast — und liegt über dem Bild, weil man dorthin sieht.
Ein Gast, der sein eigenes Bild nicht abschalten kann,
müsste den Host darum bitten; das ist keine Bedienung,
das ist eine Bitte. -->
<div class="senderleiste" id="senderleiste" hidden>
<button type="button" class="sender-knopf" id="s-kamera" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.5 6.5h11v11h-11z" />
<path d="M14.5 10.5l6-3.5v10l-6-3.5z" />
<path class="sender-knopf__strich" d="M3 21L21 3" />
</svg>
<span id="s-kamera-wort">Kamera</span>
</button>
<!-- ==== DEN BILDSCHIRM TEILEN ==========================
Filipe: „waere es nicht einfach eine bildschirm
uebertragung zu installieren?"
Er geht denselben Weg wie die Kamera — dieselbe
Direktverbindung, nur eine andere Quelle. Deshalb steht
der Knopf auch hier und nicht in einem eigenen
Bereich. -->
<button type="button" class="sender-knopf" id="s-teilen" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3 4.5h18v12H3z" />
<path d="M8 20.5h8" />
<path d="M12 16.5v4" />
</svg>
<span id="s-teilen-wort">Bildschirm</span>
</button>
<button type="button" class="sender-knopf" id="s-mikro" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 3.2a2.6 2.6 0 0 1 2.6 2.6v6a2.6 2.6 0 0 1-5.2 0v-6A2.6 2.6 0 0 1 12 3.2z" />
<path d="M5.8 11.4a6.2 6.2 0 0 0 12.4 0M12 17.6V21" />
<path class="sender-knopf__strich" d="M3 21L21 3" />
</svg>
<span id="s-mikro-wort">Mikro</span><kbd class="sender-taste">M</kbd>
</button>
<span class="sender-pegel" id="s-pegel" aria-hidden="true"><i></i></span>
</div>
<button type="button" class="ton-an" id="ton-an" hidden>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M4 9.4h3.6L12 5.2v13.6L7.6 14.6H4z" />
<path d="M16.2 9.2a4 4 0 0 1 0 5.6" />
<path d="M18.6 6.6a7.4 7.4 0 0 1 0 10.8" />
</svg>
<span>Ton einschalten</span>
</button>
</div>
<!-- Der Chat. Auf dem Rechner eine Schiene rechts, am Handy eine
Lade, die von unten einfährt. -->
</section>
</section>
<aside class="schiene" id="schiene" aria-label="Live-Chat">
<header class="schiene__kopf">
<h2 class="schiene__titel">Live-Chat</h2>
<span class="schiene__zahl" id="chat-zahl">0</span>
<!-- WAS GEMELDET WURDE. Steht nur da, wenn etwas offen ist —
eine Zahl, die immer sichtbar und meistens null ist, wird
nach drei Tagen nicht mehr gelesen. Nur für die
Moderation. -->
<button type="button" class="schiene__meldungen" id="chat-meldungen" hidden></button>
<!-- DIE CHAT-STUFE STEHT DORT, WO DER CHAT IST, und nicht im
Regiepult. Man moderiert, wo man liest — ein Umweg über
ein Register wäre in dem Moment, in dem es laut wird,
genau ein Umweg zu viel. Nur die zwei sehen sie. -->
<div class="chatstufen" id="chat-stufen" hidden role="group" aria-label="Wer schreiben darf">
<button type="button" class="chatstufe" data-modus="offen" aria-pressed="true">Offen</button>
<button type="button" class="chatstufe" data-modus="team" aria-pressed="false">Team</button>
<button type="button" class="chatstufe" data-modus="zu" aria-pressed="false">Zu</button>
</div>
</header>
<ol class="schiene__liste" id="chat-liste" aria-live="polite"></ol>
<form class="schiene__form" id="chat-form">
<input type="text" id="chat-feld" class="schiene__feld" maxlength="400"
placeholder="Sag was …" autocomplete="off" />
<button type="submit" class="schiene__senden" aria-label="Senden">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12 20 4l-4 8 4 8z" /></svg>
</button>
</form>
<!-- DER WEG, DEN HOST ZU UNTERSTÜTZEN. Er steht IM Chat und
nicht in einer eigenen Ecke: Wer gerade etwas gut findet,
tippt es in den Chat — und sieht den Knopf in derselben
Bewegung.
VIER BETRÄGE STATT EINES LINKS. Ein Tipp öffnet PayPal mit
schon eingetragener Summe; wer eine Liste sieht, rechnet,
wer vier Knöpfe sieht, tippt. Danach fragt das Feld
einmal nach — mehr können wir von hier aus nicht wissen,
und so zu tun, als wüssten wir es, wäre gelogen. -->
<div class="geben" id="geben" hidden>
<div class="geben__kopf">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 20.4S3.6 15.2 3.6 9.6A4.2 4.2 0 0 1 12 7.4a4.2 4.2 0 0 1 8.4 2.2c0 5.6-8.4 10.8-8.4 10.8z" />
</svg>
<span id="geben-titel">Dogi was ausgeben</span>
</div>
<div class="geben__betraege" id="geben-betraege"></div>
<a class="geben__frei" id="geben-frei" hidden
rel="noopener noreferrer" target="_blank">Frei wählen …</a>
<!-- Erscheint erst, wenn jemand eine Zahl angetippt hat.
Vorher wäre es eine Frage auf etwas, das nicht passiert
ist. -->
<div class="geben__nach" id="geben-nach" hidden>
<p class="geben__frage" id="geben-frage">Hat es geklappt?</p>
<!-- ==== DER TEXT KOMMT VON DEM, DER GIBT ==============
Filipe: „der text der dazu erscheint sollen die leute
selber schreiben können … es sollen personalisierte
texte sein von den leuten selbst."
Der Name steht oben, weil viele mit ihrem Rudelnamen
dastehen wollen und nicht mit dem, der im Haus
steht. Beides ist freiwillig — wer nichts schreibt,
bekommt seinen Namen und eine Karte ohne Satz. -->
<label class="geben__feld">
<span>Name auf der Karte</span>
<input type="text" id="geben-name" maxlength="40"
autocomplete="off" placeholder="So wie du dastehen willst" />
</label>
<label class="geben__feld">
<span>Dein Text <span class="geben__rest" id="geben-rest"></span></span>
<textarea id="geben-text" rows="2" maxlength="140"
placeholder="Was soll im Bild stehen?"></textarea>
</label>
<div class="geben__nach-knoepfe">
<button type="button" class="geben__melden" id="geben-melden">Ja, melden</button>
<button type="button" class="geben__abbruch" id="geben-abbruch">Doch nicht</button>
</div>
</div>
<p class="geben__danke" id="geben-danke" hidden></p>
<!-- WAS ICH SELBST HABE. Ohne einen sichtbaren Stand wären
die Punkte eine Zahl in einer Datenbank und kein Grund,
wiederzukommen. Er steht nur da, wenn er nicht null
ist — eine Null zu zeigen ist keine Auskunft, sondern
eine Aufforderung. -->
<p class="geben__stand" id="geben-stand" hidden></p>
</div>
</aside>
</div><!-- /raum -->
<!-- ============ DIE REGIE =====================================
Nur für DogFather und die rechte Hand.
@@ -867,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=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/spendenkarte.js?v=202609292348" defer></script>
<script src="assets/js/werbung.js?v=202609292348" defer></script>
<script src="assets/js/reaktion.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/spendenkarte.js?v=202609300235" defer></script>
<script src="assets/js/werbung.js?v=202609300235" defer></script>
<script src="assets/js/reaktion.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/rechte.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/rechte.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/report.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/report.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/report.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/report.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -173,14 +173,14 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/scouting.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/scouting.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -732,16 +732,16 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/live.js?v=202609292348" defer></script>
<script src="assets/js/start.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/live.js?v=202609300235" defer></script>
<script src="assets/js/start.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -85,16 +85,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/startcheck.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/startcheck.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -150,16 +150,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/steckbrief.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/auskunft.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/steckbrief.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/support.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/support.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" 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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/support.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/support.js?v=202609300235" 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=202609292348" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609300235" />
<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=202609292348" defer></script>
<script src="assets/js/tafel.js?v=202609292348" defer></script>
<script src="assets/js/spendenkarte.js?v=202609300235" defer></script>
<script src="assets/js/tafel.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -111,15 +111,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/talente.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/talente.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/team.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/team.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -110,15 +110,15 @@
</main>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/team.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/team.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/team.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/team.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/teamlage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" defer></script>
<script src="assets/js/teamlage.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -112,15 +112,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/teilen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/teilen.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -126,14 +126,14 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/treff-moderation.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/treff-moderation.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/treff-regeln.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/auskunft.js?v=202609300235" defer></script>
<script src="assets/js/treff-regeln.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -149,16 +149,16 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/uebersicht.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/uebersicht.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -335,14 +335,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/live.js?v=202609292348" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/live.js?v=202609300235" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/holen.js?v=202609300235" 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=202609292348" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -144,14 +144,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/werdegang.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/werdegang.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</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=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/willkommen.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/willkommen.js?v=202609300235" 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=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609300235" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609300235" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/start.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609300235" />
<link rel="stylesheet" href="assets/css/module.css?v=202609300235" />
<!-- 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=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609300235" />
</head>
<body class="start">
@@ -190,15 +190,15 @@
</main>
<script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609300235" defer></script>
<script src="assets/js/hochladen.js?v=202609300235" defer></script>
<script src="assets/js/nachfrage.js?v=202609300235" defer></script>
<script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/wissen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609300235" defer></script>
<script src="assets/js/bereiche.js?v=202609300235" defer></script>
<script src="assets/js/installieren.js?v=202609300235" defer></script>
<script src="assets/js/kopf.js?v=202609300235" defer></script>
<script src="assets/js/glocke.js?v=202609300235" defer></script>
<script src="assets/js/wissen.js?v=202609300235" defer></script>
</body>
</html>