Der Sendeplan: ein Kalender in der Regie -- und getippter Text bleibt stehen

Filipe: „in der regie will ich auch video hinzufügen können für andere
tage und uhrzeiten, gerade geht das nicht. wie so ein kalender wo vanvan
und dogfather videos eintragen und vorbereiten können. und wenn ich
texte eingebe oder videos und kurz was anderes mache und es nicht
gespeichert hab löscht es sich von selbst. es soll bleiben bist ich
fertig bin und speichern drücke. oder aus der seite gehe aber nicht
solange wie ich noch da bin."

Haus: Team Dogi (crew.dogfather-universe.com). Die Agentur ist nicht
berührt -- pruef-haus-trennung 107/0.

======================================================================
1. GETIPPTER TEXT ÜBERLEBT DAS NEUZEICHNEN
======================================================================

WARUM ER VERSCHWUNDEN IST: Die Regie zeichnet sich bei jedem Ereignis
neu -- jemand kommt dazu, der Chat bekommt eine Zeile, das Video springt
eine Sekunde weiter. Dabei werden Listen von Grund auf gebaut
(`kasten.textContent = ''`), und jedes Eingabefeld darin entsteht neu,
gefüllt mit dem Wert vom Server.

Es gab einen Notbehelf: `if (document.activeElement !== feld)`, also
„überschreib es nicht, solange der Finger drinsteht". Filipe beschreibt
den Fall, in dem der zu kurz greift, wörtlich: „und kurz was anderes
mache". Wer tippt und dann woanders hinklickt, verliert den Fokus -- und
beim nächsten Takt auch seinen Text. An einem Sendeabend sind das
hunderte Gelegenheiten.

DIE FRAGE IST NICHT „HAT ES DEN FOKUS", SONDERN „IST ES SAUBER". Steht
im Feld genau das, was der Server zuletzt geliefert hat, darf eine neue
Auskunft es ersetzen -- sie ist aktueller. Weicht es ab, hat ein Mensch
etwas hineingetan, das noch nirgends steht; dann gewinnt der Mensch.

Das hat zwei Nebenwirkungen, und beide sind gewollt:
  * Wer NICHTS angefasst hat, sieht Änderungen des anderen sofort.
  * Wer etwas angefasst hat, verliert es auch dann nicht, wenn dieselbe
    Stelle gerade von jemand anderem geändert wurde.

EIN NEUER BAUSTEIN, NICHT ZWANZIG EINZELFÄLLE: `assets/js/getippt.js`.
Ein Feld wird an seinen Serverwert gebunden, meldet beim Tippen, was
offen ist, und wird nach dem Speichern wieder sauber. Benutzt an zehn
Stellen der Regie: Titel, Video, Vorschaubild, Startzeit, zweites Video,
die Termine der Warteschlange, Name und Gruß an jeder Spende, die
fertigen Sätze.

DER SCHLÜSSEL TRÄGT DIE KENNUNG, NICHT DIE POSITION (`warte-wann-7`,
nicht „Zeile 3"). Sonst landete der getippte Termin in der falschen
Zeile, sobald jemand eine nach oben schiebt.

IM SPEICHER UND NICHT IN `localStorage` -- genau wie Filipe es gesagt
hat: „oder aus der seite gehe". Ein halber Satz, der drei Tage später
wieder auftaucht, ist keine Hilfe; man weiß dann nicht mehr, ob er
gelten soll.

UND MAN SIEHT ES: Ein ungespeichertes Feld bekommt eine bernsteine Kante
links -- dieselbe Farbe wie ein überfälliger Termin. Keine eingefärbte
Fläche: Die schreit, eine Kante sagt dasselbe und lässt den Text in
Ruhe. Ohne diese Marke wäre die Reparatur halb -- der Text stünde da,
sähe aus wie gespeichert, und niemand drückte mehr auf „Sichern".

======================================================================
2. DER KALENDER
======================================================================

Es ging bisher nur in zwei Schritten: anhängen, dann in der Zeile den
Termin setzen. Wer einen Abend für nächste Woche plant, macht das je
Video zweimal -- und der zweite Handgriff ist der, den man vergisst.
Jetzt steht das Terminfeld neben der Adresse, und `POST /liste` nimmt
`wann` entgegen.

ZWEI SICHTEN AUF DIESELBE LISTE, keine zweite Tabelle:
  Reihenfolge  -> „was kommt als Nächstes" (mitten in einer Sendung)
  Kalender     -> „wann läuft was" (beim Vorbereiten)
Eine zweite Tabelle „Sendeplan" wären zwei Antworten auf denselben
Bestand, und spätestens beim ersten Verschieben liefen sie auseinander.

EIN MONATSRASTER UND KEINE WOCHE. Wer einen Abend plant, denkt in
„nächsten Donnerstag", nicht in „in sechs Tagen". Tage mit etwas darin
tragen die ANZAHL und nicht nur einen Punkt -- „da ist etwas" und „da
sind vier" sind zwei verschiedene Auskünfte. Heute trägt einen Ring, was
vorbei ist und noch dasteht, wird warm markiert.

Das × an einem Eintrag nimmt NUR DEN TERMIN weg; das Video bleibt in der
Warteschlange. Gelöscht wird in der Reihenfolge-Sicht, und zwar nur
dort, damit es beim Umplanen nicht aus Versehen passiert.

EINE TERMINPRÜFUNG, ZWEI WEGE: `terminLesen()` im Server -- das
Anhängen und das nachträgliche Ändern fragen dieselbe Funktion. Zwei
Abschriften wären zwei Antworten auf „ist das ein Datum", und die zweite
wäre die, die beim nächsten Umbau stehen bleibt. Leer ist gültig und
bleibt der Normalfall.

======================================================================
3. EIN FUND, DER NEBENBEI HERAUSFIEL
======================================================================

`mess-regie` wollte nur ein Neuzeichnen auslösen -- VanVan hängt ein
Video an, DogFather hat die Regie offen -- und wartete vergeblich. Nach
zehn Sekunden war es bei ihm immer noch nicht da.

`empfaenger()` schickte an die Zusehenden, die Gäste und den Host DER
LAUFENDEN Sendung. Solange nichts läuft, gibt es keinen `host_id` und
niemanden, der „dabei" ist -- der Rundruf ging also an NIEMANDEN.
Ausgerechnet beim Vorbereiten, also genau dann, wenn die beiden
zusammenarbeiten.

Was das angerichtet hätte: VanVan trägt den Donnerstag ein, DogFather
sieht seinen alten Stand, trägt daneben etwas ein -- und einer von
beiden wundert sich später, wo sein Eintrag geblieben ist. Das fällt
erst auf, wenn es weh tut. Die Host-Rollen sind jetzt immer Empfänger,
ABGELEITET aus `HOST_ROLLEN` statt aufgezählt.

DIE FRAGE DAHINTER IST ALLGEMEIN: Ist die Menge im RUHEZUSTAND leer? Ein
Verteiler, der nur im Betrieb gefüllt ist, schweigt genau in der
Vorbereitungsphase -- und die ist die einzige, in der zwei Leute
gleichzeitig an derselben Sache arbeiten. Dieselbe Form wie `every()`
auf einem leeren Feld: Beides sagt Ja, weil nichts da ist.

======================================================================
4. DREI FEHLER IN DEN EIGENEN MESSUNGEN, BEHOBEN
======================================================================

(a) GRÜN AUS DEM FALSCHEN GRUND. Die Messung wartete nach VanVans
    Änderung 1200 ms und fragte dann, ob der getippte Text noch
    dasteht. Er stand da -- weil das Neuzeichnen noch gar nicht
    passiert war. Ein grüner Haken über einer Voraussetzung, die nicht
    eingetreten ist. Jetzt wird auf das EREIGNIS gewartet, nicht auf
    die Uhr, und dass es eingetreten ist, ist eine eigene Zusage.

(b) DIE GEGENPROBE MASS DAS GEGENTEIL. Sie machte `Getippt.binde` zu
    einer LEEREN Funktion -- damit schreibt niemand mehr in das Feld,
    also bleibt der Text erst recht stehen. „Ohne das Gedächtnis"
    heißt nicht „ohne Schreiben", sondern: wieder so wie früher,
    nämlich `feld.value = wert`. Genau das wird jetzt eingesetzt.

(c) ZWEI PRÜFUNGEN LASEN FLIESSTEXT STATT CODE.
    `html.indexOf("reaktion.js")` fand das Wort im Kommentar darüber,
    und `!/localStorage/` schlug an, weil in getippt.js im Kommentar
    steht „liegt im Speicher und NICHT in localStorage". Beide waren
    rot, obwohl der Code stimmte. Jetzt wird der Skript-Einhänger
    verglichen und der Aufruf `localStorage.setItem` gesucht.

UND EINER, DEN NUR DAS BILDSCHIRMFOTO ZEIGEN KONNTE: Ich hatte
`--w-tief`, `--w-hoch` und `--w-ring` als `background` und
`border-color` benutzt -- das sind aber SCHATTEN, keine Farben, und das
steht im Werkstoff-Abschnitt direkt darüber. Tückisch daran: Der
Ersatzwert in `var(--x, fallback)` greift dabei NICHT. Er hilft nur,
wenn die Variable fehlt, nicht wenn ihr Wert für die Eigenschaft
unsinnig ist. Die Sichtumschaltung sah dadurch aus wie zwei Wörter ohne
Knopf.

======================================================================
GEMESSEN
======================================================================

  pruef-reaktion          588, 0 Fehler (vorher 571) -- Abschnitt 22
  mess-regie (neu)         28, 0 Fehler, 3 Bildschirmfotos
  mess-foyer               96, 0 Fehler
  pruef-struktur          102 · pruef-css-klassen 37 · pruef-portnummern 41
  pruef-lesbarkeit         14 · pruef-bewegung 9 · pruef-tippziele 13
  pruef-deutsche-texte     12 · pruef-crew-adresse 173
  pruef-haus-trennung     107 · pruef-community-sicht 10
  pruef-sackgassen         14
  alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-08 15:16:54 +02:00
co-authored by Claude Opus 5
parent 5a6641e8da
commit ab204e96f9
54 changed files with 2330 additions and 742 deletions
+501
View File
@@ -0,0 +1,501 @@
/* =====================================================================
DER PLATZ HINTER DEM PULT (08.10.2026)
Zwei Dinge, die Filipe am 08.10.2026 gemeldet hat, und beide lassen
sich NUR in einem echten Browser messen:
1. „in der regie will ich auch video hinzufuegen koennen fuer
andere tage und uhrzeiten, gerade geht das nicht. wie so ein
kalender wo vanvan und dogfather videos eintragen und
vorbereiten koennen."
2. „wenn ich texte eingebe oder videos und kurz was anderes mache
und es nicht gespeichert hab loescht es sich von selbst. es
soll bleiben bis ich fertig bin und speichern druecke. oder
aus der seite gehe aber nicht solange wie ich noch da bin."
---------------------------------------------------------------------
WARUM DER ZWEITE PUNKT HIER UND NICHT IN EINER PRUEFUNG STEHT
Er handelt von einem Zustand, den es auf dem Server gar nicht gibt:
getippter, noch nicht abgeschickter Text. Eine Schnittstellenpruefung
kann ihn nicht sehen. Gemessen wird deshalb der Vorgang selbst --
tippen, ein Neuzeichnen ausloesen, nachsehen, ob es noch dasteht.
DAS NEUZEICHNEN WIRD ECHT AUSGELOEST und nicht nachgeahmt: Die
Messung schickt eine Aenderung von einer ZWEITEN Sitzung (VanVan),
wie es an einem Sendeabend auch passiert. Ein `zeichnen()` von Hand
aufzurufen wuerde beweisen, dass die Funktion funktioniert -- nicht,
dass der Fall eintritt.
NIE DIE ECHTE DATENBANK. Eigener Ordner, eigener Port, eigenes
Zertifikat -- und am Ende ist alles weg.
DREI AUSGAENGE: 0 in Ordnung · 1 ein Befund · 3 konnte nicht nachsehen
Aufrufen mit: node server/mess-regie.mjs
===================================================================== */
import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { request } from "node:http";
import { createServer as httpsServer } from "node:https";
import { zertifikatBauen } from "./helfer-openssl.mjs";
import { notbremse } from "./helfer-notbremse.mjs";
import { eigenerPort } from "./helfer-port.mjs";
const HIER = dirname(fileURLToPath(import.meta.url));
const ordner = mkdtempSync(join(tmpdir(), "mess-regie-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const PORT = await eigenerPort(import.meta);
const HTTPS_PORT = await eigenerPort(import.meta, "mess-regie (HTTPS)", 1);
process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const express = (await import("express")).default;
const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js");
notbremse(240_000, "mess-regie");
await new Promise((r) => setTimeout(r, 1000));
const CREW = "crew.dogfather-universe.com";
/* ---------- Leute ------------------------------------------------------- */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const kenn = randomBytes(32).toString("hex");
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
.run("code_kennung_schluessel", kenn, new Date().toISOString());
const ALT = new Date(Date.now() - 200 * 86400000).toISOString();
function anlegen(name, rolle, code) {
const salt = randomBytes(16).toString("hex");
const hash = scryptSync(code, salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n,"
+ " code_kennung, aktiv, erstellt) VALUES (?,?,?,?,?,?,1,?)")
.run(name, rolle, hash, salt, 32768,
createHmac("sha256", kenn).update(code).digest("hex"), ALT);
}
const CODES = { admin: "CODE-M00-000001", hand: "CODE-M01-000001" };
anlegen("DogFather", "admin", CODES.admin);
anlegen("VanVan", "hand", CODES.hand);
d.close();
function roh(pfad, { method = "GET", keks = "", rumpf = null } = {}) {
return new Promise((fertig, schief) => {
const daten = rumpf === null ? null : Buffer.from(JSON.stringify(rumpf));
const a = request({
host: "127.0.0.1", port: PORT, path: pfad, method,
headers: {
Host: CREW, Origin: `https://${CREW}`,
...(keks ? { Cookie: keks } : {}),
...(daten ? { "Content-Type": "application/json", "Content-Length": daten.length } : {}),
},
}, (antwort) => {
const teile = [];
antwort.on("data", (s) => teile.push(s));
antwort.on("end", () => {
const text = Buffer.concat(teile).toString("utf8");
let j = null; try { j = JSON.parse(text); } catch { /* kein JSON */ }
fertig({ code: antwort.statusCode, text, j, kopf: antwort.headers });
});
});
a.on("error", schief);
if (daten) a.write(daten);
a.end();
});
}
async function anmelden(wer) {
const a = await roh("/workspace/api/anmelden", {
method: "POST", rumpf: { rolle: wer, code: CODES[wer], alter_ok: true },
});
return [].concat(a.kopf["set-cookie"] || []).map((z) => z.split(";")[0]).join("; ");
}
const k = { admin: await anmelden("admin"), hand: await anmelden("hand") };
/* ---------- Zaehlwerk --------------------------------------------------- */
let fehler = 0;
let geprueft = 0;
const ok = (b, t) => {
geprueft++;
console.log((b ? " ok " : " FEHL ") + t);
if (!b) fehler++;
};
function nichtNachsehbar(grund) {
console.log("\n -- NICHT NACHSEHBAR");
console.log(` ${grund}`);
console.log(" Das ist KEIN Befund am Code.\n");
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
process.exit(3);
}
/* ---------- Der Vorbau -------------------------------------------------- */
const schluesselDatei = join(ordner, "p.key");
const zertDatei = join(ordner, "p.crt");
try { zertifikatBauen(schluesselDatei, zertDatei, CREW); }
catch (f) { nichtNachsehbar(`Kein Zertifikat zu bauen: ${f?.message}`); }
const vorbau = httpsServer({
key: readFileSync(schluesselDatei), cert: readFileSync(zertDatei),
}, (von, nach) => {
const weiter = request({
host: "127.0.0.1", port: PORT, path: von.url, method: von.method,
headers: { ...von.headers, host: `${CREW}:${HTTPS_PORT}` },
}, (antwort) => {
nach.writeHead(antwort.statusCode || 502, antwort.headers);
antwort.pipe(nach);
});
weiter.on("error", () => { try { nach.writeHead(502); nach.end(); } catch { /* egal */ } });
von.pipe(weiter);
});
await new Promise((r) => vorbau.listen(HTTPS_PORT, "127.0.0.1", r));
const BASIS = `https://${CREW}:${HTTPS_PORT}`;
let pw = null;
try {
pw = await import(
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
} catch (f) { nichtNachsehbar(`Playwright ist nicht da: ${f?.message}`); }
const browser = await pw.chromium.launch({
args: [`--host-resolver-rules=MAP ${CREW} 127.0.0.1`, "--ignore-certificate-errors",
"--use-fake-ui-for-media-stream", "--use-fake-device-for-media-stream"],
});
async function alsWer(wer, breite = 1440, hoehe = 980) {
const kontext = await browser.newContext({
viewport: { width: breite, height: hoehe },
hasTouch: breite <= 860,
ignoreHTTPSErrors: true,
permissions: ["camera", "microphone"],
});
await kontext.addCookies((k[wer] || "").split("; ").filter(Boolean).map((z) => {
const [n, ...r] = z.split("=");
return { name: n, value: r.join("="), domain: CREW, path: "/" };
}));
const seite = await kontext.newPage();
const konsole = [];
seite.on("pageerror", (f) => konsole.push(String(f?.message || f)));
seite.on("console", (m) => { if (m.type() === "error") konsole.push(m.text()); });
await seite.goto(`${BASIS}/workspace/reaktion.html`, { waitUntil: "networkidle" });
await seite.waitForTimeout(1200);
return { kontext, seite, konsole };
}
/** Die Regie aufklappen und auf ein Register gehen. */
async function regieAuf(seite, tafel) {
await seite.evaluate(() => {
const auf = document.getElementById("reiter-auf");
if (auf && auf.getAttribute("aria-expanded") !== "true") auf.click();
});
await seite.waitForTimeout(150);
await seite.click(`#reiter-${tafel}`);
await seite.waitForTimeout(250);
}
async function bild(seite, name) {
await seite.screenshot({ path: join(HIER, `mess-regie-${name}.png`) });
console.log(` Bild: server/mess-regie-${name}.png`);
}
/* =====================================================================
1. DER KALENDER
===================================================================== */
console.log("\n=== 1. Der Kalender ===");
/* Zwei Videos mit Termin, eines ohne -- beide Faelle muessen sich im
Raster unterscheiden lassen. Die Termine werden RELATIV gerechnet:
Ein festes Datum waere eine Zeitbombe, die stimmt, bis der Kalender
sie einholt. */
const INZWEITAGEN = new Date();
INZWEITAGEN.setDate(INZWEITAGEN.getDate() + 2);
INZWEITAGEN.setHours(20, 30, 0, 0);
{
const a = await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://youtu.be/9bZkp7q19f0", wann: INZWEITAGEN.toISOString() },
});
ok(a.code === 200, `ein Video laesst sich GLEICH mit Termin anhaengen (${a.code})`);
const z = (a.j?.liste || []).find((x) => x.video === "9bZkp7q19f0");
ok(!!z && !!z.wann, `und der Termin steht daran (${z?.wann || "leer"})`);
const zweit = new Date(INZWEITAGEN);
zweit.setHours(22, 0, 0, 0);
await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://www.youtube.com/watch?v=kJQP7kiw5Fk", wann: zweit.toISOString() },
});
await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://www.youtube.com/watch?v=aqz-KE-bpKQ" },
});
/* UND EIN UNSINNIGES DATUM WIRD ABGEWIESEN -- mit einem eigenen
Wort, nicht mit „video_unklar". */
const b = await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://youtu.be/dQw4w9WgXcQ", wann: "irgendwann mal" },
});
ok(b.code === 400 && b.j?.fehler === "termin_unklar",
`ein unsinniges Datum wird abgewiesen (${b.code} ${b.j?.fehler})`);
}
{
const chef = await alsWer("admin");
await regieAuf(chef.seite, "liste");
/* ---- Die Umschaltung ---- */
const vorher = await chef.seite.evaluate(() => ({
liste: !document.getElementById("warteliste").hidden,
kalender: !document.getElementById("plan-kalender").hidden,
}));
ok(vorher.liste && !vorher.kalender, "zuerst steht die Reihenfolge da");
await chef.seite.click("#plan-sicht-kalender");
await chef.seite.waitForTimeout(250);
const nachher = await chef.seite.evaluate(() => ({
liste: !document.getElementById("warteliste").hidden,
kalender: !document.getElementById("plan-kalender").hidden,
monat: document.getElementById("plan-monat").textContent.trim(),
zellen: document.querySelectorAll("#plan-raster .plan-zelle:not(.plan-zelle--leer)").length,
voll: [...document.querySelectorAll("#plan-raster .plan-zelle[data-voll=\"ja\"]")]
.map((z) => z.dataset.tag),
heute: document.querySelectorAll("#plan-raster .plan-zelle[data-heute=\"ja\"]").length,
}));
ok(!nachher.liste && nachher.kalender, "der Knopf schaltet auf den Kalender");
ok(nachher.zellen >= 28 && nachher.zellen <= 31,
`der Monat hat so viele Tage, wie er hat (${nachher.zellen})`);
ok(/^[A-ZÄÖÜ][a-zäöü]+ \d{4}$/.test(nachher.monat),
`und er steht ausgeschrieben da (${nachher.monat})`);
ok(nachher.heute === 1, `heute ist genau einmal markiert (${nachher.heute})`);
/* ==== BEIDE TERMINE LIEGEN AUF DEMSELBEN TAG ==================
Deshalb darf GENAU EINE Zelle gefuellt sein -- zwei waeren ein
Zeichen dafuer, dass in UTC statt in Ortszeit gruppiert wird,
und genau dieser Fehler verschiebt eine Sendung um 00:30 auf
den Vortag. */
ok(nachher.voll.length === 1,
`zwei Termine am selben Tag ergeben EINE volle Zelle (${nachher.voll.length})`);
const erwartet = `${INZWEITAGEN.getFullYear()}-`
+ `${String(INZWEITAGEN.getMonth() + 1).padStart(2, "0")}-`
+ `${String(INZWEITAGEN.getDate()).padStart(2, "0")}`;
ok(nachher.voll[0] === erwartet,
`und zwar die richtige (${nachher.voll[0]} statt ${erwartet})`);
const anzahl = await chef.seite.textContent(
`#plan-raster .plan-zelle[data-tag="${erwartet}"] .plan-zelle__anzahl`);
ok(anzahl?.trim() === "2", `die Zelle zeigt die ANZAHL und nicht nur einen Punkt (${anzahl})`);
await bild(chef.seite, "1-kalender");
/* ---- Einen Tag antippen ---- */
await chef.seite.click(`#plan-raster .plan-zelle[data-tag="${erwartet}"]`);
await chef.seite.waitForTimeout(200);
const tag = await chef.seite.evaluate(() => ({
kopf: document.querySelector("#plan-tag .plan-tag__kopf")?.textContent.trim() || "",
eintraege: document.querySelectorAll("#plan-tag .plan-eintrag").length,
zeiten: [...document.querySelectorAll("#plan-tag .plan-eintrag__zeit")]
.map((z) => z.textContent.trim()),
}));
ok(tag.eintraege === 2, `der Tag zeigt beide Videos (${tag.eintraege})`);
ok(tag.zeiten[0] === "20:30 Uhr" && tag.zeiten[1] === "22:00 Uhr",
`nach Uhrzeit sortiert (${tag.zeiten.join(" / ")})`);
/* Vor dem Bild in die Schublade rollen: Sie ist hoeher als das
Fenster, und ein Bildschirmfoto vom oberen Rand zeigt genau das
nicht, worum es hier geht. */
await chef.seite.evaluate(() => {
document.getElementById("plan-tag")?.scrollIntoView({ block: "center" });
});
await chef.seite.waitForTimeout(250);
await bild(chef.seite, "2-tag");
/* ---- „Fuer diesen Tag anhaengen" fuellt das Feld ---- */
await chef.seite.click(".plan-tag__anhaengen");
await chef.seite.waitForTimeout(150);
const vorbelegt = await chef.seite.inputValue("#l-wann");
ok(vorbelegt === `${erwartet}T20:00`,
`der Knopf schlaegt den Abend vor, statt ihn zu erzwingen (${vorbelegt})`);
const wo = await chef.seite.evaluate(() => document.activeElement?.id);
ok(wo === "l-neu", `und setzt den Finger in die Adresse (${wo})`);
/* ---- Und ein Monat weiter ---- */
const jetztMonat = nachher.monat;
await chef.seite.click("#plan-vor");
await chef.seite.waitForTimeout(200);
const weiter = await chef.seite.textContent("#plan-monat");
ok(weiter?.trim() !== jetztMonat, `ein Monat vor wechselt (${jetztMonat} -> ${weiter?.trim()})`);
await chef.seite.click("#plan-heute");
await chef.seite.waitForTimeout(200);
const zurueck = await chef.seite.textContent("#plan-monat");
ok(zurueck?.trim() === jetztMonat, `und „Heute" bringt zurueck (${zurueck?.trim()})`);
ok(chef.konsole.length === 0, "nichts in der Konsole"
+ (chef.konsole.length ? " -> " + chef.konsole.slice(0, 3).join(" | ") : ""));
await chef.kontext.close();
}
/* =====================================================================
2. GETIPPTES ÜBERLEBT DAS NEUZEICHNEN
Der eigentliche Befund. Gemessen wird der Vorgang, den Filipe
beschrieben hat: tippen, den Finger woanders hin, etwas passiert --
und nachsehen, ob der Text noch dasteht.
===================================================================== */
console.log("\n=== 2. Getipptes ueberlebt das Neuzeichnen ===");
{
const chef = await alsWer("admin");
await regieAuf(chef.seite, "sendung");
await chef.seite.fill("#p-titel", "Mein halber Satz");
/* ==== UND DANN WOANDERS HIN ================================
Genau das ist Filipes Fall: „und kurz was anderes mache". Der
alte Schutz hing am Fokus und griff ab hier nicht mehr. */
await chef.seite.click("#p-video");
await chef.seite.waitForTimeout(100);
const markiert = await chef.seite.getAttribute("#p-titel", "data-ungespeichert");
ok(markiert === "ja", `das Feld sagt, dass es ungespeichert ist (${markiert})`);
/* ==== DAS NEUZEICHNEN WIRD ECHT AUSGELOEST ==================
VanVan aendert etwas; der Rundruf kommt beim Host an und zeichnet
die Regie neu. Ein `zeichnen()` von Hand wuerde beweisen, dass
die Funktion laeuft -- nicht, dass der Fall eintritt. */
await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.hand, rumpf: { video: "https://youtu.be/ZZ5LpwO-An4" },
});
/* ==== AUF DAS EREIGNIS WARTEN, NICHT AUF DIE UHR ===============
Der erste Entwurf wartete 1200 ms und zaehlte dann. Die Zahl
stand auf 3 statt 4 -- das Neuzeichnen war also noch gar nicht
passiert, und die Zeile darunter („der Text steht noch da") war
damit wertlos: Er stand da, weil NICHTS ihn angefasst hatte.
Das ist der gefaehrlichste Messfehler ueberhaupt, weil er GRUEN
wird. Jetzt wird gewartet, bis VanVans Video wirklich
angekommen ist -- und erst dann gefragt, ob der getippte Text
ueberlebt hat. Scheitert das Warten, ist es ein Fehler und kein
Ueberspringen. */
let gezeichnet = true;
try {
await chef.seite.waitForFunction(
() => document.querySelectorAll("#warteliste .warte-zeile").length === 4,
null, { timeout: 10000 });
} catch { gezeichnet = false; }
ok(gezeichnet,
"VanVans Video kommt an -- es wurde also wirklich neu gezeichnet"
+ (gezeichnet ? "" : " (nach 10 s nicht)"));
const steht = await chef.seite.inputValue("#p-titel");
ok(steht === "Mein halber Satz",
`und der getippte Text steht immer noch da ("${steht}")`);
/* ---- Speichern macht es wieder sauber ---- */
await chef.seite.click("#p-sichern");
await chef.seite.waitForTimeout(900);
const sauber = await chef.seite.getAttribute("#p-titel", "data-ungespeichert");
ok(sauber === "nein", `nach dem Speichern ist die Marke weg (${sauber})`);
const nachSpeichern = await chef.seite.inputValue("#p-titel");
ok(nachSpeichern === "Mein halber Satz", `und der Text steht weiter da ("${nachSpeichern}")`);
await bild(chef.seite, "3-getippt");
/* ---- Und in einer LISTE, die bei jedem Takt neu gebaut wird ----
Das ist der haertere Fall: Die Zeile selbst entsteht neu, das
Feld ist danach ein anderes Element. */
await regieAuf(chef.seite, "liste");
await chef.seite.evaluate(() => {
document.getElementById("plan-sicht-reihe").click();
});
await chef.seite.waitForTimeout(200);
const felder = await chef.seite.evaluate(() =>
document.querySelectorAll("#warteliste .warte-zeile__wann").length);
ok(felder >= 3, `die Warteschlange hat Terminfelder (${felder})`);
await chef.seite.evaluate(() => {
const f = document.querySelectorAll("#warteliste .warte-zeile__wann")[2];
f.value = "2027-03-05T19:45";
f.dispatchEvent(new Event("input", { bubbles: true }));
});
await chef.seite.waitForTimeout(100);
await roh("/workspace/api/reaktion/liste", {
method: "POST", keks: k.hand, rumpf: { video: "https://youtu.be/L_jWHffIx5E" },
});
await chef.seite.waitForTimeout(1200);
const inListe = await chef.seite.evaluate(() => {
const f = [...document.querySelectorAll("#warteliste .warte-zeile__wann")]
.find((x) => x.dataset.ungespeichert === "ja");
return f ? { wert: f.value, schluessel: f.dataset.schluessel } : null;
});
ok(inListe?.wert === "2027-03-05T19:45",
`auch in einer neu gebauten Liste bleibt es stehen (${inListe?.wert})`);
ok(/^warte-wann-\d+$/.test(inListe?.schluessel || ""),
`und haengt an der Kennung der Zeile, nicht an ihrer Nummer (${inListe?.schluessel})`);
ok(chef.konsole.length === 0, "nichts in der Konsole"
+ (chef.konsole.length ? " -> " + chef.konsole.slice(0, 3).join(" | ") : ""));
await chef.kontext.close();
}
/* =====================================================================
3. GEGENPROBEN
===================================================================== */
console.log("\n=== 3. Gegenproben ===");
{
const chef = await alsWer("admin");
await regieAuf(chef.seite, "sendung");
/* ==== OHNE DAS GEDAECHTNIS MUSS DER TEXT VERSCHWINDEN =========
Sonst bewiese Abschnitt 2 nur, dass irgendetwas stehen bleibt.
DER ERSTE ENTWURF HAT DAS GEGENTEIL GEMESSEN: Er machte
`Getippt.binde` zu einer LEEREN Funktion -- damit schreibt
niemand mehr in das Feld, und der Text bleibt erst recht
stehen. „Ohne das Gedaechtnis" heisst nicht „ohne Schreiben",
sondern: wieder so wie frueher, naemlich stumpf
`feld.value = wert`. Genau das wird hier eingesetzt. */
await chef.seite.evaluate(() => {
window.Getippt.binde = (feld, schluessel, vomServer) => {
feld.value = vomServer === null || vomServer === undefined ? "" : String(vomServer);
};
window.Getippt.vergissAlles();
});
await chef.seite.fill("#p-titel", "Dieser Satz geht verloren");
await chef.seite.click("#p-video");
await roh("/workspace/api/reaktion", {
method: "PUT", keks: k.hand, rumpf: { titel: "Von VanVan" },
});
let kam = true;
try {
await chef.seite.waitForFunction(
() => document.getElementById("p-titel").value === "Von VanVan",
null, { timeout: 10000 });
} catch { kam = false; }
const weg = await chef.seite.inputValue("#p-titel");
ok(kam && weg === "Von VanVan",
`Gegenprobe: nach der alten Bauart ist der getippte Satz weg ("${weg}")`);
await chef.kontext.close();
}
/* =====================================================================
SCHLUSS
===================================================================== */
await browser.close();
await new Promise((r) => vorbau.close(r));
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
console.log(`\n${geprueft} Messungen, ${fehler} Fehler`);
if (geprueft < 20) {
console.log(`NICHT NACHSEHBAR: nur ${geprueft} Messungen gelaufen, erwartet mindestens 20.`);
process.exit(3);
}
if (fehler) { console.log("NICHT IN ORDNUNG"); process.exit(1); }
console.log("ALLES IN ORDNUNG");
process.exit(0);
+134
View File
@@ -3691,6 +3691,140 @@ melde("=== 21. Das Regie-Tor ===");
}
}
/* =======================================================================
22. DER SENDEPLAN (08.10.2026)
Filipe: „in der regie will ich auch video hinzufuegen koennen fuer
andere tage und uhrzeiten, gerade geht das nicht. wie so ein kalender
wo vanvan und dogfather videos eintragen und vorbereiten koennen."
WAS HIER GEPRUEFT WIRD UND WAS NICHT: Hier steht, was die
Schnittstelle antwortet. Ob der Kalender im Browser richtig
gruppiert -- und ob getippter Text ein Neuzeichnen ueberlebt --
misst `mess-regie.mjs`; das laesst sich ohne Browser gar nicht
fragen.
======================================================================= */
melde("");
melde("=== 22. Der Sendeplan ===");
{
const dbP = new DatabaseSync(process.env.WORKSPACE_DB);
dbP.prepare("DELETE FROM reaktion_liste").run();
/* RELATIV GERECHNET und nicht mit einem festen Datum: Ein fester
Termin stimmt, bis der Kalender ihn einholt -- und dann wird die
Pruefung rot, ohne dass am Programm etwas ist. */
const inDreiTagen = new Date(Date.now() + 3 * 86400000);
inDreiTagen.setHours(20, 30, 0, 0);
{
const a = await roh(CREW, "/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://youtu.be/9bZkp7q19f0", wann: inDreiTagen.toISOString() },
});
ok(a.code === 200, `ein Video laesst sich GLEICH mit Termin anhaengen (${a.code})`);
const z = (a.j?.liste || []).find((x) => x.video === "9bZkp7q19f0");
ok(!!z?.wann, `der Termin steht sofort daran (${z?.wann || "leer"})`);
ok(z?.wann === inDreiTagen.toISOString(),
"und zwar auf die Minute der, der geschickt wurde");
}
/* OHNE TERMIN BLEIBT DER NORMALFALL. Ein Pflichtfeld haette aus
einer Vorbereitung eine Verabredung gemacht. */
{
const a = await roh(CREW, "/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://www.youtube.com/watch?v=kJQP7kiw5Fk" },
});
const z = (a.j?.liste || []).find((x) => x.video === "kJQP7kiw5Fk");
ok(a.code === 200 && z?.wann === "",
`ohne Termin geht weiterhin (${a.code}, wann="${z?.wann}")`);
}
/* EIN UNSINNIGES DATUM BEKOMMT SEIN EIGENES WORT und nicht
„video_unklar" -- sonst sucht jemand den Fehler in der Adresse. */
{
const a = await roh(CREW, "/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin,
rumpf: { video: "https://youtu.be/aqz-KE-bpKQ", wann: "naechsten Donnerstag" },
});
ok(a.code === 400 && a.j?.fehler === "termin_unklar",
`ein unsinniges Datum wird abgewiesen (${a.code} ${a.j?.fehler})`);
const n = dbP.prepare("SELECT COUNT(*) AS n FROM reaktion_liste WHERE video = ?")
.get("aqz-KE-bpKQ").n;
ok(n === 0, `und das Video landet GAR NICHT in der Liste (${n})`);
}
/* DIESELBE PRUEFUNG AUF BEIDEN WEGEN. Haette nur das Anhaengen sie
und das nachtraegliche Aendern nicht, kaeme derselbe Unsinn ueber
die zweite Tuer doch herein. */
{
const liste = (await roh(CREW, "/workspace/api/reaktion", { keks: k.admin })).j?.liste || [];
const id = liste[0]?.id;
const a = await roh(CREW, `/workspace/api/reaktion/liste/${id}/wann`, {
method: "PUT", keks: k.admin, rumpf: { wann: "irgendwann" },
});
ok(a.code === 400 && a.j?.fehler === "termin_unklar",
`auch beim nachtraeglichen Aendern (${a.code} ${a.j?.fehler})`);
const b = await roh(CREW, `/workspace/api/reaktion/liste/${id}/wann`, {
method: "PUT", keks: k.admin, rumpf: { wann: "" },
});
ok(b.code === 200 && (b.j?.liste || []).find((x) => x.id === id)?.wann === "",
"Gegenprobe: leer nimmt den Termin weg, statt abgelehnt zu werden");
}
/* WER NICHT FUEHRT, TRAEGT AUCH KEINEN TERMIN EIN. */
{
const a = await roh(CREW, "/workspace/api/reaktion/liste", {
method: "POST", keks: k.modi,
rumpf: { video: "https://youtu.be/L_jWHffIx5E", wann: inDreiTagen.toISOString() },
});
ok(a.code === 403, `ein Modi kann nichts einplanen (${a.code})`);
}
/* ---- Was auf der Seite steht ---- */
{
const html = readFileSync(join(HIER, "..", "workspace", "reaktion.html"), "utf8");
const js = readFileSync(
join(HIER, "..", "workspace", "assets", "js", "reaktion.js"), "utf8");
const getippt = readFileSync(
join(HIER, "..", "workspace", "assets", "js", "getippt.js"), "utf8");
ok(/id="l-wann"/.test(html), "das Anhaengen hat ein Terminfeld");
ok(/id="plan-kalender"/.test(html) && /id="plan-raster"/.test(html),
"und es gibt ein Monatsraster");
ok(/data-sicht="reihe"/.test(html) && /data-sicht="kalender"/.test(html),
"zwei Sichten auf DIESELBE Liste, keine zweite Liste");
/* ==== GEMESSEN WIRD DER EINHAENGER, NICHT DER FLIESSTEXT =====
Der erste Entwurf verglich `html.indexOf("getippt.js")` mit
`html.indexOf("reaktion.js")` -- und wurde rot, obwohl die
Reihenfolge stimmt: Direkt ueber dem Einhaenger steht ein
Kommentar, in dem das Wort „reaktion.js" vorkommt, und den fand
`indexOf` zuerst. Eine Pruefung, die Prosa liest, misst Prosa. */
const einhaenger = (datei) => html.indexOf(`<script src="assets/js/${datei}`);
ok(einhaenger("getippt.js") > 0
&& einhaenger("getippt.js") < einhaenger("reaktion.js"),
"getippt.js wird VOR reaktion.js eingehaengt");
/* ==== DER ALTE NOTBEHELF DARF NICHT ZURUECKKOMMEN ===========
`document.activeElement !== feld` war die Fassung, die Filipes
Text verschluckt hat: Sie schuetzt nur, solange der Finger im
Feld steht. Taucht sie wieder auf, ist der Fehler wieder da --
und zwar lautlos. */
ok(!/activeElement\s*!==\s*\$\(/.test(js),
"der alte Fokus-Notbehelf steht nicht mehr in der Regie");
ok(/Getippt\.binde\(/.test(js) && /Getippt\.gespeichert\(/.test(js),
"stattdessen wird gebunden und nach dem Speichern freigegeben");
/* Dieselbe Falle ein zweites Mal: `!/localStorage/` schlug an,
weil das WORT im erklaerenden Kommentar von getippt.js steht
(„liegt im Speicher und NICHT in localStorage"). Gefragt ist,
ob es BENUTZT wird -- also der Aufruf, nicht das Wort. */
ok(!/localStorage\.(get|set|remove)Item/.test(getippt),
"das Gemerkte ueberlebt die Sitzung NICHT -- so hat Filipe es gesagt");
ok(/offen\.delete/.test(getippt) && /isConnected/.test(getippt),
"und es zaehlt keine Felder mit, die es nicht mehr gibt");
}
dbP.close();
}
melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
+72 -11
View File
@@ -425,6 +425,38 @@ function empfaenger() {
for (const g of gaesteListe()) ids.add(g.id);
const s = sendung();
if (s?.host_id) ids.add(s.host_id);
/* ==== DIE ZWEI, DIE VORBEREITEN, GEHOEREN IMMER DAZU (08.10.2026)
Gefunden von `mess-regie`, und zwar als Nebenbefund: Die Messung
wollte nur ein Neuzeichnen ausloesen -- VanVan haengt ein Video
an, DogFather hat die Regie offen -- und wartete vergeblich. Nach
zehn Sekunden war es bei ihm immer noch nicht da.
DER GRUND: Empfaenger waren bisher die Zusehenden, die Gaeste und
der Host DER LAUFENDEN Sendung. Solange nichts laeuft, gibt es
keinen `host_id` und niemanden, der „dabei" ist -- also ging der
Rundruf an NIEMANDEN. Ausgerechnet beim Vorbereiten, also genau
dann, wenn die beiden zusammenarbeiten.
Was das angerichtet haette: VanVan traegt den Donnerstag ein,
DogFather sieht seinen alten Stand, traegt daneben etwas ein --
und einer von beiden wundert sich spaeter, wo sein Eintrag
geblieben ist. Das faellt erst auf, wenn es weh tut.
ES KOSTET NICHTS. `stromAn` schickt an offene Verbindungen; wer
die Regie nicht offen hat, hat keine, und die Nachricht
verschwindet. Zwei Kennungen mehr in einer Liste, die ohnehin
gebaut wird.
ABGELEITET AUS `HOST_ROLLEN`, nicht abgeschrieben: Kaeme eine
dritte Rolle dazu, die die Sendung fuehren darf, waere sie hier
sonst die, die nichts mitbekommt. */
for (const p of db().prepare(
`SELECT id FROM personen WHERE aktiv = 1 AND rolle IN (${
[...HOST_ROLLEN].map(() => "?").join(",")})`).all(...HOST_ROLLEN)) {
ids.add(p.id);
}
return [...ids];
}
@@ -1441,12 +1473,44 @@ reaktionRouter.post("/workspace/api/reaktion/tauschen", nurHost,
Risiko eines Tippfehlers und damit eines schwarzen Rechtecks.
Jetzt ist das eine Vorbereitung und kein Handgriff im Live. */
/* ==== EIN TERMIN WIRD AN EINER STELLE GEPRUEFT (08.10.2026) ======
Zwei Wege setzen jetzt einen Termin: das Anhaengen mit Datum und
das nachtraegliche Aendern an der Zeile. Zwei Abschriften derselben
Pruefung waeren zwei Antworten auf „ist das ein Datum" -- und die
zweite waere die, die beim naechsten Umbau stehen bleibt.
DREI AUSGAENGE, nicht zwei: leer ist GUELTIG und heisst „liegt
bereit, aber noch ohne Termin". Das ist der Normalfall und kein
Fehler; ein Pflichtfeld haette aus einer Vorbereitung eine
Verabredung gemacht.
@returns {{ok: true, wann: string} | {ok: false}} */
function terminLesen(roh) {
const text = String(roh ?? "").trim();
if (!text) return { ok: true, wann: "" };
const d = new Date(text);
if (Number.isNaN(d.getTime())) return { ok: false };
return { ok: true, wann: d.toISOString() };
}
reaktionRouter.post("/workspace/api/reaktion/liste", nurHost, express.json({ limit: "8kb" }),
async (req, res) => {
try {
const video = videoKennung(String(req.body?.video ?? ""));
if (!video) return res.status(400).json({ fehler: "video_unklar" });
/* ==== GLEICH MIT TERMIN (08.10.2026) =======================
Filipe: „in der regie will ich auch video hinzufuegen koennen
fuer andere tage und uhrzeiten, gerade geht das nicht."
Vorher ging es nur in zwei Schritten: anhaengen, dann in der
Zeile den Termin setzen. Bei einem Abend, den man fuer naechste
Woche plant, sind das zwei Handgriffe je Video -- und der
zweite wird vergessen. */
const termin = terminLesen(req.body?.wann);
if (!termin.ok) return res.status(400).json({ fehler: "termin_unklar" });
const wie_viele = db().prepare("SELECT COUNT(*) AS n FROM reaktion_liste").get()?.n || 0;
if (wie_viele >= LISTE_MAX) return res.status(409).json({ fehler: "liste_voll" });
@@ -1459,9 +1523,9 @@ reaktionRouter.post("/workspace/api/reaktion/liste", nurHost, express.json({ lim
const titel = await videoTitel(video);
const letzter = db().prepare("SELECT MAX(platz) AS p FROM reaktion_liste").get()?.p || 0;
db().prepare("INSERT INTO reaktion_liste (video, titel, platz, von_id, gesetzt_am)"
+ " VALUES (?,?,?,?,?)")
.run(video, titel, letzter + 1, req.person.id, jetzt());
db().prepare("INSERT INTO reaktion_liste (video, titel, platz, von_id, gesetzt_am, wann)"
+ " VALUES (?,?,?,?,?,?)")
.run(video, titel, letzter + 1, req.person.id, jetzt(), termin.wann);
const l = lage(req.person);
melden("reaktion", { was: "liste", lage: oeffentlich(l) });
@@ -1502,14 +1566,11 @@ reaktionRouter.put("/workspace/api/reaktion/liste/:id/wann", nurHost,
express.json({ limit: "2kb" }), (req, res) => {
try {
const id = Number(req.params.id) || 0;
const roh = String(req.body?.wann ?? "").trim();
let wann = "";
if (roh) {
const d = new Date(roh);
if (Number.isNaN(d.getTime())) return res.status(400).json({ fehler: "termin_unklar" });
wann = d.toISOString();
}
const a = db().prepare("UPDATE reaktion_liste SET wann = ? WHERE id = ?").run(wann, id);
/* Dieselbe Pruefung wie beim Anhaengen -- siehe `terminLesen`. */
const termin = terminLesen(req.body?.wann);
if (!termin.ok) return res.status(400).json({ fehler: "termin_unklar" });
const a = db().prepare("UPDATE reaktion_liste SET wann = ? WHERE id = ?")
.run(termin.wann, id);
if (!a.changes) return res.status(404).json({ fehler: "nicht_in_der_liste" });
const l = lage(req.person);
+14 -14
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081516" />
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
Variablen, und bei Variablen entscheidet allein, wer zuletzt
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="halle">
@@ -289,16 +289,16 @@
Und anleitung.js braucht es doppelt: Symbol, Farbe, Name und
Adresse jeder Karte kommen von dort, nicht vom Server. -->
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
Liste. pruef-css-klassen setzt das durch, und zwar auch die
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
Bedienelement. -->
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/anleitung.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/anleitung.js?v=202610081516" defer></script>
</body>
</html>
+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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<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=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/anruf-probe.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202610081212",
"src": "/assets/img/app-symbole/workspace-192.png?v=202610081516",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202610081212",
"src": "/assets/img/app-symbole/workspace-512.png?v=202610081516",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202610081212",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202610081516",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202610081212",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202610081516",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+246
View File
@@ -5124,3 +5124,249 @@ body[data-nur="buehne"] { background: #000; }
nur den Daumen frei. */
.eckenwahl__knopf { min-width: 58px; min-height: 44px; }
}
/* =====================================================================
WAS GETIPPT UND NOCH NICHT GESPEICHERT IST (08.10.2026)
Filipe: „es soll bleiben bis ich fertig bin und speichern drücke."
Es BLEIBT jetzt -- und damit entsteht eine neue Frage, die es
vorher nicht gab: Woran sieht man, dass etwas noch nicht gesichert
ist? Ohne eine Antwort darauf wäre die Reparatur nur halb: Der Text
steht da, sieht aus wie gespeichert, und niemand drückt mehr auf
„Sichern".
EINE KANTE UND KEIN KASTEN. Ein eingefärbtes Feld schreit; eine
Kante links sagt dasselbe und lässt den Text in Ruhe. Bernstein
ist im Haus die Farbe für „sieh noch mal hin" -- dieselbe wie bei
einem überfälligen Termin.
===================================================================== */
[data-ungespeichert="ja"] {
border-left: 3px solid #e0a13a !important;
/* Der Schein ist schwach und steht still. Ein Blinken an einem
Feld, in das jemand gerade tippt, wäre eine Belästigung. */
box-shadow: inset 2px 0 10px -6px #e0a13a;
}
/* =====================================================================
DER KALENDER IN DER REGIE (08.10.2026)
Filipe: „wie so ein kalender wo vanvan und dogfather videos
eintragen und vorbereiten können."
ER MUSS IN DIE SCHUBLADE PASSEN. Die Regie ist am Handy 342 Pixel
breit -- gemessen, nicht geschätzt. Sieben Spalten ergeben dort
44 Pixel je Zelle, und das ist genau das Fingermaß des Hauses.
Deshalb `minmax(0, 1fr)` und keine feste Breite: Das Raster
schrumpft mit, statt seitlich hinauszuragen.
===================================================================== */
.plan-wahl {
display: flex;
gap: 6px;
margin-bottom: 10px;
padding: 3px;
border-radius: 999px;
/* ECHTE FARBEN. `--w-tief` und `--w-ring` aus dem Werkstoff-Abschnitt
sind SCHATTEN, keine Farben -- hier standen sie als Hintergrund
und als Kante, und beides war damit ungueltig. Der Ersatzwert im
`var()` rettet das NICHT: Er greift nur, wenn die Variable fehlt,
nicht wenn ihr Wert fuer die Eigenschaft unsinnig ist. */
background: rgba(0, 0, 0, .3);
border: 1px solid rgba(150, 160, 190, .16);
box-shadow: var(--w-tief);
}
.plan-wahl__knopf {
flex: 1 1 0;
min-height: 36px;
border: 0;
border-radius: 999px;
background: none;
color: var(--text-leise, #a9a3bd);
font: inherit;
font-size: .8rem;
font-weight: 700;
cursor: pointer;
transition: background-color .14s ease, color .14s ease;
}
.plan-wahl__knopf[aria-selected="true"] {
background: var(--w-grund-2);
box-shadow: var(--w-hoch);
color: var(--text, #e9e6f2);
}
.pult__feld--wann { flex: 0 1 13rem; }
.pult__leise { font-weight: 400; color: var(--text-still, #8b93a4); }
.plan-kalender[hidden] { display: none; }
.plan-kalender__kopf {
display: flex; align-items: center; gap: 8px;
margin-bottom: 8px;
}
.plan-kalender__monat { flex: 1 1 auto; font-size: .92rem; font-weight: 800; }
.plan-kalender__pfeil,
.plan-kalender__heute {
min-width: 44px; min-height: 44px;
padding: 0 10px;
border-radius: 10px;
border: 1px solid rgba(150, 160, 190, .18);
background: var(--w-grund);
box-shadow: var(--w-hoch);
color: var(--text, #e9e6f2);
font: inherit; font-size: 1rem; line-height: 1;
cursor: pointer;
}
.plan-kalender__heute { font-size: .78rem; font-weight: 700; }
.plan-kalender__tage,
.plan-kalender__raster {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 4px;
}
.plan-kalender__tage {
margin-bottom: 4px;
/* .72rem sind 11,52 px -- die Untergrenze des Hauses ist 11,5, und
sie ist kein Geschmack: `pruef-css-klassen` zaehlt jede Stelle
darunter und wird rot, sobald eine dazukommt. */
font-size: .72rem; font-weight: 800;
letter-spacing: .04em; text-transform: uppercase;
color: var(--text-still, #8b93a4);
text-align: center;
}
.plan-zelle {
position: relative;
/* QUADRATISCH ÜBER DAS SEITENVERHÄLTNIS und nicht über eine Höhe:
So bleibt die Zelle in jeder Breite ein Quadrat, auch wenn die
Schublade schmaler wird. */
aspect-ratio: 1 / 1;
min-height: 38px;
display: grid;
place-items: center;
border-radius: 9px;
border: 1px solid rgba(150, 160, 190, .1);
background: rgba(0, 0, 0, .24);
color: var(--text-leise, #a9a3bd);
font: inherit; font-size: .78rem; font-weight: 700;
cursor: pointer;
transition: background-color .12s ease, border-color .12s ease;
}
/* Die Felder vor dem Ersten sind LEER und nicht „ein Tag ohne
nichts": Mit einer Kante sähen sie aus wie Tage, auf die man
drücken kann. */
.plan-zelle--leer { background: none; border-color: transparent; cursor: default; }
.plan-zelle:hover { background: rgba(255, 255, 255, .07); }
.plan-zelle[data-heute="ja"] {
border-color: rgba(154, 183, 255, .5);
color: #cfe0ff;
}
.plan-zelle[data-voll="ja"] {
background: rgba(95, 201, 154, .14);
border-color: rgba(95, 201, 154, .34);
color: #e9e6f2;
}
/* Was vorbei ist und noch dasteht, wird warm markiert -- dieselbe
Farbe und derselbe Grund wie im Foyer: Ein Termin, der still
vergilbt, wird nie wieder angesehen. */
.plan-zelle[data-voll="ja"][data-vorbei="ja"] {
background: rgba(224, 161, 58, .16);
border-color: rgba(224, 161, 58, .4);
}
.plan-zelle[data-gewaehlt="ja"] {
background: rgba(154, 183, 255, .2);
border-color: rgba(154, 183, 255, .7);
color: #ffffff;
}
.plan-zelle__anzahl {
position: absolute;
right: 3px; bottom: 2px;
/* Auch hier 11,52 px. Die Zahl steht deshalb als schmale Marke am
unteren Rand und nicht als winziger Index -- lesbar ist sie nur
so, und lesbar ist der ganze Zweck: „da ist etwas" und „da sind
vier" sind zwei verschiedene Auskuenfte. */
font-size: .72rem; font-weight: 800;
line-height: 1;
padding: 1px 4px 2px;
border-radius: 5px;
background: rgba(0, 0, 0, .35);
opacity: .9;
}
/* ---------- Was unter dem Raster steht ---------- */
.plan-tag { margin-top: 12px; display: grid; gap: 7px; }
.plan-tag__ueber {
margin: 0;
font-size: .72rem; font-weight: 800;
letter-spacing: .12em; text-transform: uppercase;
color: var(--text-still, #8b93a4);
}
.plan-tag__kopf {
display: flex; align-items: center; gap: 8px;
margin: 4px 0 0;
font-size: .84rem; font-weight: 800;
color: var(--text, #e9e6f2);
}
.plan-tag__zahl {
font-size: .72rem; font-weight: 800;
padding: 2px 7px 3px;
border-radius: 999px;
color: #cfe0ff;
background: rgba(154, 183, 255, .14);
}
.plan-tag__leer {
margin: 0;
font-size: .8rem; line-height: 1.45;
color: var(--text-still, #8b93a4);
}
.plan-eintrag {
display: flex; align-items: center; gap: 9px;
min-width: 0;
padding: 6px 8px;
border-radius: 10px;
border: 1px solid rgba(150, 160, 190, .14);
background: rgba(0, 0, 0, .22);
}
.plan-eintrag[data-vorbei="ja"] { border-color: rgba(224, 161, 58, .3); }
.plan-eintrag__bild {
flex: none;
width: 54px; aspect-ratio: 16 / 9;
border-radius: 6px; object-fit: cover;
background: #12101a;
}
.plan-eintrag__text { display: grid; gap: 1px; min-width: 0; flex: 1 1 auto; }
.plan-eintrag__titel {
font-size: .8rem; font-weight: 600;
color: var(--text, #e9e6f2);
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.plan-eintrag__titel[data-roh="ja"] {
color: var(--text-leise, #a9a3bd);
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
font-size: .74rem;
}
.plan-eintrag__zeit {
font-size: .74rem; font-weight: 700;
font-variant-numeric: tabular-nums;
color: var(--text-leise, #a9a3bd);
}
.plan-eintrag__weg {
flex: none;
min-width: 34px; min-height: 34px;
border-radius: 8px;
border: 1px solid rgba(150, 160, 190, .18);
background: none;
color: var(--text-still, #8b93a4);
font: inherit; line-height: 1;
cursor: pointer;
}
.plan-eintrag__weg:hover { color: #ff8b92; border-color: rgba(216, 64, 74, .4); }
.plan-tag__anhaengen, .plan-tag__ab { justify-self: start; margin-top: 2px; }
@media (pointer: coarse) {
/* AM FINGER WIRD ALLES 44 PIXEL. Die Zelle ist quadratisch, also
reicht eine Mindesthöhe -- die Breite zieht nach. */
.plan-zelle { min-height: 44px; }
.plan-eintrag__weg { min-width: 44px; min-height: 44px; }
.plan-wahl__knopf { min-height: 44px; }
}
+214
View File
@@ -0,0 +1,214 @@
/* =====================================================================
WAS GETIPPT UND NOCH NICHT GESPEICHERT IST, BLEIBT STEHEN
(08.10.2026)
Filipe: „wenn ich texte eingebe oder videos und kurz was anderes
mache und es nicht gespeichert hab löscht es sich von selbst. es
soll bleiben bis ich fertig bin und speichern drücke. oder aus der
seite gehe aber nicht solange wie ich noch da bin."
---------------------------------------------------------------------
WARUM ES SICH GELÖSCHT HAT
Die Regie zeichnet sich bei jedem Ereignis neu — jemand kommt
dazu, der Chat bekommt eine Zeile, das Video springt eine Sekunde
weiter. Beim Neuzeichnen werden Listen von Grund auf gebaut
(`kasten.textContent = ''`), und jedes Eingabefeld darin entsteht
neu, gefüllt mit dem Wert vom Server. Was jemand hineingetippt und
noch nicht gespeichert hatte, war damit weg — ohne Meldung, ohne
Spur, oft mitten im Satz.
Für die festen Felder gab es einen Notbehelf: `if
(document.activeElement !== feld)` — also „überschreib es nicht,
solange der Finger drinsteht". Das ist genau zu kurz gedacht, und
Filipe beschreibt den Fall wörtlich: „und kurz was anderes mache".
Wer tippt und dann woanders hinklickt, verliert den Fokus — und
beim nächsten Takt auch seinen Text.
---------------------------------------------------------------------
DIE FRAGE IST NICHT „HAT ES DEN FOKUS", SONDERN „IST ES SAUBER"
Ein Feld ist SAUBER, solange darin genau das steht, was der Server
zuletzt geliefert hat. Dann darf eine neue Auskunft es überschreiben
— sie ist aktueller. Weicht es ab, hat ein Mensch etwas hineingetan,
das noch nirgends steht; dann gewinnt der Mensch.
Das ist dieselbe Unterscheidung, die eine Textverarbeitung macht,
und sie hat zwei angenehme Nebenwirkungen:
* Wer NICHTS angefasst hat, sieht Änderungen anderer sofort —
VanVan trägt einen Titel ein, DogFather sieht ihn.
* Wer etwas angefasst hat, verliert es nicht, auch wenn dieselbe
Stelle gerade von jemand anderem geändert wurde. Er sieht dann
beim Speichern, was passiert ist, statt es vorher wortlos zu
verlieren.
---------------------------------------------------------------------
UND BIS WANN?
„bis ich fertig bin und speichern drücke. oder aus der seite gehe."
Also: über jedes Neuzeichnen hinweg, aber NICHT über das Verlassen
der Seite. Deshalb liegt das Gemerkte in einer Map im Speicher und
NICHT in `localStorage`. Ein halber Satz, der drei Tage später
wieder auftaucht, ist keine Hilfe — man weiß dann nicht mehr, ob er
gelten soll, und löscht ihn zur Sicherheit. Was Filipe beschreibt,
ist die Sitzung, nicht das Archiv.
---------------------------------------------------------------------
SO WIRD ES BENUTZT
Getippt.binde(feld, 'warte-wann-7', wertVomServer);
-> füllt das Feld: mit dem Gemerkten, wenn etwas offen ist,
sonst mit dem Serverwert. Hängt sich selbst an `input`.
Getippt.gespeichert('warte-wann-7');
-> nach einem erfolgreichen Speichern. Ab da ist das Feld
wieder sauber.
Getippt.offeneZahl() -> wie viele Felder ungespeichert sind
Getippt.istOffen(schl) -> ist genau dieses offen?
DER SCHLÜSSEL MUSS STABIL SEIN und darf nicht die Position in der
Liste enthalten. Steht er auf „Zeile 3" und jemand schiebt eine
Zeile nach oben, landet der getippte Text in der falschen. Deshalb
immer die Kennung des Gegenstands nehmen (`warte-wann-<id>`), nie
den Zähler der Schleife.
===================================================================== */
(() => {
'use strict';
/** Schlüssel -> der getippte, noch nicht gespeicherte Wert. */
const offen = new Map();
/* Welche Felder gerade im Dokument hängen. Wird gebraucht, damit
`offeneZahl()` nicht Felder mitzählt, die es längst nicht mehr
gibt — etwa eine Spendenzeile, die inzwischen erledigt ist. Eine
Zahl, die Gespenster zählt, ist schlimmer als keine. */
const felder = new Map();
const alsText = (w) => (w === null || w === undefined ? '' : String(w));
function markiere(feld, istOffen) {
feld.dataset.ungespeichert = istOffen ? 'ja' : 'nein';
}
/**
* Ein Eingabefeld an seinen Serverwert binden.
*
* @param {HTMLInputElement|HTMLTextAreaElement} feld
* @param {string} schluessel stabil, ohne Listenposition
* @param {string} vomServer was der Server zuletzt geliefert hat
*/
function binde(feld, schluessel, vomServer) {
if (!feld || !schluessel) return;
const server = alsText(vomServer);
feld.dataset.schluessel = schluessel;
feld.dataset.vomServer = server;
felder.set(schluessel, feld);
if (offen.has(schluessel)) {
const getippt = offen.get(schluessel);
/* ==== DER SELTENE, ABER WICHTIGE FALL ======================
Jemand tippt genau das, was inzwischen auch auf dem Server
steht. Dann ist nichts mehr offen -- und es waere falsch,
das Feld weiter als „ungespeichert" zu markieren: Der
Mensch sucht sonst einen Knopf, der nichts mehr zu tun hat. */
if (getippt === server) {
offen.delete(schluessel);
feld.value = server;
markiere(feld, false);
} else {
feld.value = getippt;
markiere(feld, true);
}
} else {
feld.value = server;
markiere(feld, false);
}
/* `input` und nicht `change`: `change` kommt erst beim Verlassen
des Feldes -- und genau dazwischen liegt das Neuzeichnen, das
den Text verschluckt hat. Gemerkt wird bei jedem Zeichen.
EINMAL JE FELD. Ein Feld, das bei jedem Neuzeichnen neu
entsteht, bekommt den Zuhoerer ohnehin frisch; eines, das
stehen bleibt (`p-titel`), bekaeme ihn sonst bei jedem Takt
noch einmal -- nach einer Stunde waeren das hunderte. */
if (feld.dataset.getipptBereit !== 'ja') {
feld.dataset.getipptBereit = 'ja';
feld.addEventListener('input', () => {
const schl = feld.dataset.schluessel;
if (!schl) return;
if (feld.value === feld.dataset.vomServer) {
offen.delete(schl);
markiere(feld, false);
} else {
offen.set(schl, feld.value);
markiere(feld, true);
}
melde();
});
}
melde();
}
/**
* Nach dem Speichern: Das Feld ist wieder sauber.
*
* Endet der Schlüssel auf `*`, gilt es für alle, die so anfangen --
* gedacht für ein Formular, das mehrere Felder auf einmal sichert
* (`Getippt.gespeichert('stufe-3-*')`).
*/
function gespeichert(schluessel) {
if (!schluessel) return;
if (schluessel.endsWith('*')) {
const anfang = schluessel.slice(0, -1);
for (const s of [...offen.keys()]) if (s.startsWith(anfang)) sauber(s);
} else {
sauber(schluessel);
}
melde();
}
function sauber(schluessel) {
offen.delete(schluessel);
const feld = felder.get(schluessel);
if (feld && feld.isConnected) {
feld.dataset.vomServer = feld.value;
markiere(feld, false);
}
}
/** Alles vergessen -- etwa, wenn eine Sendung beendet wurde und die
* ganze Tafel einen neuen Gegenstand hat. */
function vergissAlles() {
offen.clear();
for (const feld of felder.values()) {
if (feld && feld.isConnected) markiere(feld, false);
}
felder.clear();
melde();
}
const istOffen = (schluessel) => offen.has(schluessel);
/** Wie viele Felder gerade ungespeichert sind -- und zwar nur die,
* die noch im Dokument stehen. */
function offeneZahl() {
let n = 0;
for (const s of offen.keys()) {
const feld = felder.get(s);
if (feld && feld.isConnected) n++;
}
return n;
}
/* Wer die Zahl anzeigen will, hoert hier zu, statt sie zu pollen. */
function melde() {
document.dispatchEvent(new CustomEvent('getippt', {
detail: { offen: offeneZahl() },
}));
}
window.Getippt = { binde, gespeichert, vergissAlles, istOffen, offeneZahl };
})();
+405 -25
View File
@@ -45,6 +45,32 @@
'use strict';
const $ = (id) => document.getElementById(id);
/* ==== EIN DATUM FUER EIN EINGABEFELD (08.10.2026) ==================
`datetime-local` will „2026-10-09T20:30" in ORTSZEIT -- nicht die
ISO-Zeichenkette mit Z am Ende, die der Server liefert. Diese
Umrechnung stand an drei Stellen abgeschrieben (Sendungsbeginn,
Termin je Zeile, und beim Bauen des Kalenders waere die vierte
dazugekommen). Drei Abschriften sind drei Gelegenheiten, die
Zeitzone falsch zu machen -- und ein Termin, der eine Stunde
verrutscht, faellt erst auf, wenn niemand da ist.
LEER BLEIBT LEER. Ein ungueltiges Datum ergibt ebenfalls leer und
nicht „1970" -- eine erfundene Zahl waere schlimmer als keine. */
const zweiStellig = (n) => String(n).padStart(2, '0');
function alsFeldwert(wert) {
if (!wert) return '';
const d = new Date(wert);
if (Number.isNaN(d.getTime())) return '';
return `${d.getFullYear()}-${zweiStellig(d.getMonth() + 1)}-${zweiStellig(d.getDate())}`
+ `T${zweiStellig(d.getHours())}:${zweiStellig(d.getMinutes())}`;
}
/** Derselbe Tag? Verglichen wird in ORTSZEIT, nicht in UTC -- sonst
* liegt eine Sendung um 00:30 im Kalender am Vortag. */
const tagSchluessel = (d) =>
`${d.getFullYear()}-${zweiStellig(d.getMonth() + 1)}-${zweiStellig(d.getDate())}`;
const el = (art, klasse, text) => {
const n = document.createElement(art);
if (klasse) n.className = klasse;
@@ -3292,6 +3318,29 @@
/* ---- Die Warteschlange ---- */
$('l-anhaengen').addEventListener('click', anhaengen);
for (const k of document.querySelectorAll('.plan-wahl__knopf')) {
k.addEventListener('click', () => planSichtSetzen(k.dataset.sicht));
}
$('plan-zurueck').addEventListener('click', () => {
planMonat.setMonth(planMonat.getMonth() - 1);
kalenderZeichnen();
});
$('plan-vor').addEventListener('click', () => {
planMonat.setMonth(planMonat.getMonth() + 1);
kalenderZeichnen();
});
$('plan-heute').addEventListener('click', () => {
planMonat = new Date();
planMonat.setHours(0, 0, 0, 0);
planMonat.setDate(1);
planTagWahl = null;
kalenderZeichnen();
});
{
let gemerkt = null;
try { gemerkt = localStorage.getItem('reaktion-plan-sicht'); } catch { /* egal */ }
planSichtSetzen(gemerkt === 'kalender' ? 'kalender' : 'reihe');
}
$('l-neu').addEventListener('keydown', (e) => {
if (e.key === 'Enter') { e.preventDefault(); anhaengen(); }
});
@@ -3552,20 +3601,305 @@
zeichnen();
}
/* ===================================================================
DER KALENDER IN DER REGIE (08.10.2026)
Filipe: „wie so ein kalender wo vanvan und dogfather videos
eintragen und vorbereiten können."
-------------------------------------------------------------------
ER ZEIGT DIESELBE LISTE, NUR ANDERS GEFRAGT
Die Warteschlange beantwortet zwei Fragen, und beide sind
berechtigt: „was kommt als Nächstes" (mitten in einer Sendung)
und „wann läuft was" (beim Vorbereiten für nächste Woche). Eine
zweite Tabelle „Sendeplan" daneben wären zwei Antworten auf
denselben Bestand -- und spätestens beim ersten Verschieben
liefen sie auseinander. Es ist dieselbe Liste, zweimal gezeigt.
-------------------------------------------------------------------
EIN MONATSRASTER UND KEINE WOCHE
Wer einen Abend plant, denkt in „nächsten Donnerstag", nicht in
„in sechs Tagen". Das Raster zeigt deshalb den ganzen Monat;
Tage mit etwas darin tragen einen Punkt und die Anzahl, der
heutige einen Ring. Was vorbei ist und noch dasteht, wird warm
markiert -- genau wie im Foyer, und aus demselben Grund: Ein
Termin, der still vergilbt, wird nie wieder angesehen.
DIE WOCHE BEGINNT AM MONTAG. `getDay()` zählt von Sonntag; die
Verschiebung steht einmal in `erstesFeld()` und nicht in jeder
Schleife.
=================================================================== */
/* Welcher Monat gerade gezeigt wird -- der Erste des Monats, damit
ein Monatswechsel nicht am 31. hängenbleibt (ein `setMonth(+1)`
auf dem 31. Januar landet im März). */
let planMonat = null;
/* Welcher Tag angetippt ist. Null heißt „keiner" und zeigt die
nächsten Termine statt eines einzelnen Tages. */
let planTagWahl = null;
const MONATE = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
/** Wie viele Felder vor dem Ersten frei bleiben (Woche ab Montag). */
const erstesFeld = (ersterDesMonats) => (ersterDesMonats.getDay() + 6) % 7;
/** Die Liste nach Tagen -- Schlüssel „2026-10-09", Wert: die Zeilen. */
function nachTagen() {
const karte = new Map();
for (const z of (lage?.liste || [])) {
if (!z.wann) continue;
const d = new Date(z.wann);
if (Number.isNaN(d.getTime())) continue;
const schl = tagSchluessel(d);
if (!karte.has(schl)) karte.set(schl, []);
karte.get(schl).push({ ...z, zeitpunkt: d });
}
for (const liste of karte.values()) liste.sort((a, b) => a.zeitpunkt - b.zeitpunkt);
return karte;
}
function kalenderZeichnen() {
const raster = $('plan-raster');
if (!raster) return;
if (!planMonat) {
planMonat = new Date();
planMonat.setHours(0, 0, 0, 0);
planMonat.setDate(1);
}
const karte = nachTagen();
$('plan-monat').textContent = `${MONATE[planMonat.getMonth()]} ${planMonat.getFullYear()}`;
const heute = new Date();
heute.setHours(0, 0, 0, 0);
const heuteSchl = tagSchluessel(heute);
raster.textContent = '';
/* Die leeren Felder vor dem Ersten. Sie bekommen `aria-hidden`:
Für ein Vorleseprogramm ist „leer, leer, leer" vor jedem Monat
nur Lärm. */
for (let i = 0; i < erstesFeld(planMonat); i++) {
const leer = el('span', 'plan-zelle plan-zelle--leer');
leer.setAttribute('aria-hidden', 'true');
raster.append(leer);
}
const letzterTag = new Date(planMonat.getFullYear(), planMonat.getMonth() + 1, 0).getDate();
for (let tag = 1; tag <= letzterTag; tag++) {
const d = new Date(planMonat.getFullYear(), planMonat.getMonth(), tag);
const schl = tagSchluessel(d);
const drin = karte.get(schl) || [];
const zelle = document.createElement('button');
zelle.type = 'button';
zelle.className = 'plan-zelle';
zelle.dataset.tag = schl;
zelle.dataset.heute = schl === heuteSchl ? 'ja' : 'nein';
zelle.dataset.gewaehlt = schl === planTagWahl ? 'ja' : 'nein';
zelle.dataset.voll = drin.length ? 'ja' : 'nein';
zelle.dataset.vorbei = d < heute ? 'ja' : 'nein';
zelle.append(el('span', 'plan-zelle__zahl', String(tag)));
if (drin.length) {
/* DIE ANZAHL UND NICHT NUR EIN PUNKT. „Da ist etwas" und „da
sind vier" sind zwei verschiedene Auskünfte, und die zweite
ist die, wegen der man hinsieht. */
zelle.append(el('span', 'plan-zelle__anzahl', String(drin.length)));
}
/* Der Vorlesetext steht ausgeschrieben da -- „9" allein sagt
einem Vorleseprogramm nicht, dass es ein Datum ist. */
zelle.setAttribute('aria-label',
`${tag}. ${MONATE[planMonat.getMonth()]}`
+ (drin.length ? ` — ${drin.length} ${drin.length === 1 ? 'Video' : 'Videos'}` : ' — nichts'));
zelle.addEventListener('click', () => {
planTagWahl = planTagWahl === schl ? null : schl;
kalenderZeichnen();
});
raster.append(zelle);
}
tagZeichnen(karte, heute);
}
/** Was unter dem Raster steht: der gewählte Tag -- oder, wenn
* keiner gewählt ist, was als Nächstes ansteht. */
function tagZeichnen(karte, heute) {
const kasten = $('plan-tag');
kasten.textContent = '';
if (!planTagWahl) {
/* ==== OHNE WAHL: DIE NÄCHSTEN DREI ======================
Ein leerer Kasten unter dem Raster sieht aus, als sei etwas
kaputt. Und die Frage, die man beim Öffnen hat, ist ohnehin
„was kommt als Nächstes". */
const kommend = [...karte.entries()]
.filter(([schl]) => schl >= tagSchluessel(heute))
.sort((a, b) => a[0].localeCompare(b[0]))
.slice(0, 3);
if (!kommend.length) {
kasten.append(el('p', 'plan-tag__leer',
'Noch nichts mit Termin. Tipp auf einen Tag und häng oben ein Video an.'));
return;
}
kasten.append(el('p', 'plan-tag__ueber', 'Als Nächstes'));
for (const [schl, zeilen] of kommend) {
kasten.append(tagKopf(new Date(schl + 'T12:00'), zeilen.length));
for (const z of zeilen) kasten.append(planZeile(z));
}
return;
}
const tag = new Date(planTagWahl + 'T12:00');
const zeilen = karte.get(planTagWahl) || [];
kasten.append(tagKopf(tag, zeilen.length));
if (!zeilen.length) {
kasten.append(el('p', 'plan-tag__leer', 'An diesem Tag steht noch nichts.'));
}
for (const z of zeilen) kasten.append(planZeile(z));
/* ==== FÜR DIESEN TAG ANHÄNGEN =============================
Der Knopf trägt die Uhrzeit nicht selbst ein, sondern füllt das
Feld oben und setzt den Finger in die Adresse. So bleibt es EIN
Weg zum Anhängen -- ein zweiter, eigener wäre eine zweite
Stelle, die beim nächsten Umbau vergessen wird.
ZWANZIG UHR als Vorschlag, weil ein Reaction-Abend dort
anfängt. Es ist ein Vorschlag und keine Vorgabe: Das Feld steht
offen daneben. */
const los = document.createElement('button');
los.type = 'button';
los.className = 'knopf-still plan-tag__anhaengen';
los.textContent = 'Für diesen Tag anhängen';
los.addEventListener('click', () => {
const vorschlag = new Date(tag);
vorschlag.setHours(20, 0, 0, 0);
$('l-wann').value = alsFeldwert(vorschlag);
$('l-neu').focus();
});
kasten.append(los);
const ab = document.createElement('button');
ab.type = 'button';
ab.className = 'knopf-still plan-tag__ab';
ab.textContent = 'Tag abwählen';
ab.addEventListener('click', () => {
planTagWahl = null;
$('l-wann').value = '';
kalenderZeichnen();
});
kasten.append(ab);
}
function tagKopf(d, wie_viele) {
const heute = new Date();
heute.setHours(0, 0, 0, 0);
const morgen = new Date(heute);
morgen.setDate(morgen.getDate() + 1);
const schl = tagSchluessel(d);
let wort;
if (schl === tagSchluessel(heute)) wort = 'Heute';
else if (schl === tagSchluessel(morgen)) wort = 'Morgen';
else {
wort = d.toLocaleDateString('de-DE',
{ weekday: 'long', day: 'numeric', month: 'long' });
}
const k = el('p', 'plan-tag__kopf', wort);
if (wie_viele) k.append(el('span', 'plan-tag__zahl', String(wie_viele)));
return k;
}
function planZeile(z) {
const zeile = el('div', 'plan-eintrag');
zeile.dataset.vorbei = z.zeitpunkt < new Date() ? 'ja' : 'nein';
const bild = document.createElement('img');
bild.className = 'plan-eintrag__bild';
bild.src = `https://i.ytimg.com/vi/${z.video}/mqdefault.jpg`;
bild.alt = '';
bild.loading = 'lazy';
bild.decoding = 'async';
zeile.append(bild);
const text = el('div', 'plan-eintrag__text');
const name = el('span', 'plan-eintrag__titel', z.titel || z.video);
name.dataset.roh = z.titel ? 'nein' : 'ja';
name.title = z.titel || ('Kennung ' + z.video);
text.append(name);
text.append(el('span', 'plan-eintrag__zeit',
z.zeitpunkt.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' }) + ' Uhr'));
zeile.append(text);
/* DEN TERMIN HIER WEGZUNEHMEN heißt NICHT löschen: Das Video
bleibt in der Warteschlange und steht ab dann unter „ohne
Termin". Löschen gibt es in der Reihenfolge-Sicht -- und zwar
nur dort, damit man es nicht aus Versehen beim Umplanen tut. */
const weg = document.createElement('button');
weg.type = 'button';
weg.className = 'plan-eintrag__weg';
weg.textContent = '×';
weg.title = 'Termin wegnehmen — das Video bleibt in der Warteschlange';
weg.setAttribute('aria-label', `Termin für ${z.titel || z.video} wegnehmen`);
weg.addEventListener('click', async () => {
const a = await hole(`/workspace/api/reaktion/liste/${z.id}/wann`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ wann: '' }),
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = { ...(await a.json()) };
Getippt.gespeichert(`warte-wann-${z.id}`);
zeichnen();
});
zeile.append(weg);
return zeile;
}
/** Reihenfolge oder Kalender. */
function planSichtSetzen(sicht) {
const istKalender = sicht === 'kalender';
$('warteliste').hidden = istKalender;
$('liste-hinweis').hidden = istKalender;
$('plan-kalender').hidden = !istKalender;
for (const k of document.querySelectorAll('.plan-wahl__knopf')) {
k.setAttribute('aria-selected', k.dataset.sicht === sicht ? 'true' : 'false');
}
/* GEMERKT, weil das eine Gewohnheit ist und keine Einstellung:
Wer plant, plant mehrmals hintereinander. Beim nächsten Öffnen
soll die Sicht dastehen, in der man zuletzt gearbeitet hat. */
try { localStorage.setItem('reaktion-plan-sicht', sicht); } catch { /* egal */ }
if (istKalender) kalenderZeichnen();
}
async function anhaengen() {
const feld = $('l-neu');
const roh = feld.value.trim();
if (!roh) { sagFehler('Erst eine YouTube-Adresse einfügen.'); return; }
/* ==== GLEICH MIT TERMIN (08.10.2026) =========================
Filipe: „in der regie will ich auch video hinzufügen können für
andere tage und uhrzeiten, gerade geht das nicht."
Vorher ging es nur in zwei Schritten -- anhängen, dann in der
Zeile den Termin setzen. Wer einen Abend für nächste Woche
plant, macht das je Video zweimal, und der zweite Handgriff
ist der, den man vergisst. */
const wannFeld = $('l-wann');
const wann = wannFeld.value ? new Date(wannFeld.value).toISOString() : '';
$('l-anhaengen').disabled = true;
try {
const a = await hole('/workspace/api/reaktion/liste', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ video: roh }),
body: JSON.stringify({ video: roh, wann }),
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = { ...(await a.json()) };
feld.value = '';
Getippt.gespeichert('l-neu');
/* DER TERMIN BLEIBT STEHEN. Wer einen Abend plant, hängt drei
Videos hintereinander an denselben Tag -- ihn dreimal zu
tippen wäre eine Strafe fürs Vorbereiten. Weg ist er mit
einem Druck auf „Tag abwählen". */
zeichnen();
} catch { sagFehler('Das ging gerade nicht.'); }
finally { $('l-anhaengen').disabled = false; }
@@ -3728,6 +4062,7 @@
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = { ...(await a.json()) };
Getippt.gespeichert('p-zweit');
zeichnen();
/* ==== ES WIRD GESAGT, DASS ES GEKLAPPT HAT (08.10.2026)
Der Knopf tat bis heute seine Arbeit stumm: Das Feld blieb
@@ -3916,9 +4251,28 @@
listeZeichnen();
/* ---- Die Felder ---- */
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 || '';
/* ==== GETIPPTES UEBERLEBT DAS NEUZEICHNEN (08.10.2026) =======
Hier stand `if (document.activeElement !== feld)` -- also
„ueberschreib es nicht, solange der Finger drinsteht". Filipe
hat den Fall beschrieben, in dem das zu kurz greift, und zwar
woertlich: „wenn ich texte eingebe oder videos und kurz was
anderes mache und es nicht gespeichert hab loescht es sich von
selbst."
Wer tippt und dann woanders hinklickt, hat den Fokus nicht
mehr -- und beim naechsten Takt auch seinen Text nicht mehr.
Die Regie zeichnet sich bei jedem Ereignis neu; das sind an
einem Sendeabend hunderte Gelegenheiten.
Gefragt ist nicht „hat es den Fokus", sondern „ist es sauber":
Steht darin genau das, was der Server zuletzt geliefert hat,
darf eine neue Auskunft es ersetzen. Weicht es ab, gewinnt der
Mensch. Das macht `Getippt` -- an einer Stelle fuer alle
Felder, siehe assets/js/getippt.js. */
Getippt.binde($('p-titel'), 'p-titel', lage.titel || '');
Getippt.binde($('p-video'), 'p-video', lage.video || '');
Getippt.binde($('p-vorschau'), 'p-vorschau', lage.vorschau || '');
/* ZWEI FRAGEN, ZWEI BEDINGUNGEN (30.09.2026).
Hier stand `if (lage.beginnt_am && document.activeElement !== …)`.
@@ -3932,14 +4286,13 @@
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())}`;
Getippt.binde($('p-beginn'), 'p-beginn', alsFeldwert(lage.beginnt_am));
} else {
$('p-beginn').value = '';
Getippt.binde($('p-beginn'), 'p-beginn', '');
}
}
@@ -4083,8 +4436,8 @@
tausch.title = `Wechseln zu „${wort}“`
+ (lage.zweit.sekunde > 2 ? ` — weiter bei ${alsZeit(lage.zweit.sekunde)}` : '');
}
if (document.activeElement !== $('p-zweit')) {
$('p-zweit').value = lage.zweit ? lage.zweit.video : '';
{
Getippt.binde($('p-zweit'), 'p-zweit', lage.zweit ? lage.zweit.video : '');
}
zweitZeichnen();
@@ -4325,7 +4678,7 @@
wer.type = 'text';
wer.className = 'spendenzeile__feld';
wer.maxLength = spendenLage.name_max || 40;
wer.value = k.name || '';
Getippt.binde(wer, `spende-name-${k.id}`, k.name || '');
wer.setAttribute('aria-label', 'Name auf der Karte');
mitte.append(wer);
@@ -4333,7 +4686,7 @@
text.type = 'text';
text.className = 'spendenzeile__feld spendenzeile__feld--gruss';
text.maxLength = spendenLage.gruss_max || 140;
text.value = k.gruss || '';
Getippt.binde(text, `spende-gruss-${k.id}`, k.gruss || '');
text.placeholder = 'Kein Text dabei';
text.setAttribute('aria-label', 'Text auf der Karte');
mitte.append(text);
@@ -4361,12 +4714,26 @@
const ja = el('button', 'spendenzeile__ja',
k.schon_gezeigt ? 'Stimmt – Dogen gutschreiben' : 'Stimmt – zeigen');
ja.type = 'button';
ja.addEventListener('click', () => spendeEntscheiden(k.id, true, {
name: wer.value.trim(), gruss: text.value.trim(),
}));
ja.addEventListener('click', () => {
/* ERST AUFRAEUMEN, DANN SCHICKEN: Die Zeile verschwindet
nach der Entscheidung aus der Liste. Bliebe ihr Eintrag im
Gedaechtnis stehen, zaehlte er bis zum naechsten Neuladen
als „ungespeichert" mit, obwohl es das Feld nicht mehr
gibt. Eine Zahl, die Gespenster zaehlt, ist schlimmer als
keine. */
Getippt.gespeichert(`spende-name-${k.id}`);
Getippt.gespeichert(`spende-gruss-${k.id}`);
spendeEntscheiden(k.id, true, {
name: wer.value.trim(), gruss: text.value.trim(),
});
});
const nein = el('button', 'spendenzeile__nein', 'Stimmt nicht');
nein.type = 'button';
nein.addEventListener('click', () => spendeEntscheiden(k.id, false));
nein.addEventListener('click', () => {
Getippt.gespeichert(`spende-name-${k.id}`);
Getippt.gespeichert(`spende-gruss-${k.id}`);
spendeEntscheiden(k.id, false);
});
zeile.append(ja); zeile.append(nein);
kasten.append(zeile);
}
@@ -4503,6 +4870,8 @@
/* Siehe oben: eine breitere Zahl verschiebt die Marke. */
reiterMarke();
kalenderZeichnen();
const kasten = $('warteliste');
kasten.textContent = '';
if (!liste.length) {
@@ -4556,14 +4925,11 @@
wann.className = 'warte-zeile__wann';
wann.title = 'Wann es laufen soll — leer heißt „noch ohne Termin“';
wann.setAttribute('aria-label', 'Termin für ' + (z.titel || z.video));
if (z.wann) {
const d = new Date(z.wann);
if (!Number.isNaN(d.getTime())) {
const p = (n) => String(n).padStart(2, '0');
wann.value = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`
+ `T${p(d.getHours())}:${p(d.getMinutes())}`;
}
}
/* DER SCHLUESSEL TRAEGT DIE KENNUNG DER ZEILE, nicht ihre
Nummer in der Liste. Stuende dort „Zeile 3" und jemand
schiebt eine Zeile nach oben, landete der getippte Termin in
der falschen. */
Getippt.binde(wann, `warte-wann-${z.id}`, alsFeldwert(z.wann));
/* Das Stilblatt kann an einem Eingabefeld nicht ablesen, ob
etwas darin steht: Ein `value`, das das Programm als
Eigenschaft setzt, taucht im Attribut nicht auf. Also
@@ -4578,6 +4944,7 @@
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = { ...(await a.json()) };
Getippt.gespeichert(`warte-wann-${z.id}`);
zeichnen();
sagKurz(wann.value
? 'Termin gesetzt — er steht jetzt im Foyer.'
@@ -4667,6 +5034,11 @@
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = await a.json();
/* ERST JETZT IST ES SAUBER. Vorher waere es eine Luege: Der
Server hat es noch gar nicht gesehen. */
for (const f of ['p-titel', 'p-video', 'p-vorschau', 'p-beginn']) {
Getippt.gespeichert(f);
}
zeichnen();
sagFehler('Übernommen.');
} catch { sagFehler('Das ging gerade nicht.'); }
@@ -5364,7 +5736,10 @@
feld.type = 'text';
feld.className = 'pult__eingabe satz-text';
feld.maxLength = stufen.gestaltung.gruss_max || 140;
feld.value = s.text || '';
/* Die Saetze haben keine eigene Kennung -- ihre Nummer IST ihre
Kennung, denn sie werden als Liste in einem Zug gespeichert
und nicht einzeln verschoben. */
Getippt.binde(feld, `satz-${i}`, s.text || '');
feld.placeholder = 'Leer lassen nimmt den Satz weg';
feld.addEventListener('input', saetzeGeaendert);
const weg = el('button', 'stufe-tun stufe-tun--weg', 'Weg');
@@ -5408,6 +5783,11 @@
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
const d = await a.json();
/* ALLE SAETZE AUF EINMAL -- sie werden auch in einem Zug
gespeichert. Der Stern nimmt `satz-0` bis `satz-7` zusammen;
sie einzeln aufzuzaehlen waere eine Liste, die beim naechsten
Satz mehr nicht mehr stimmt. */
Getippt.gespeichert('satz-*');
stufen.saetze = d.fertige_saetze;
if (spendenLage) spendenLage.fertige_saetze = d.fertige_saetze;
saetzeZeichnen();
+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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="garage">
@@ -430,22 +430,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=202610081212"></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/textform.js?v=202610081516"></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/zuteilung.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/zuteilung.js?v=202610081516" 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=202610081212" defer></script>
<script src="assets/js/aufgaben.js?v=202610081212" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202610081516" defer></script>
<script src="assets/js/aufgaben.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/automation.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/automation.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="garage">
@@ -168,15 +168,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/automation.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/automation.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -197,16 +197,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/befinden.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/befinden.js?v=202610081516" defer></script>
</body>
</html>
+24 -24
View File
@@ -12,29 +12,29 @@
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081516" />
<!-- Die Bildschau: ein Banner wird darin mittig gezeigt statt als nackte
Datei in einem neuen Tab. Sie ist seit dem 07.10.2026 eine eigene
Datei und keine Kopie aus chat.css -- dieselbe Schau im Chat und
hier, ein Stil. -->
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -454,20 +454,20 @@
<!-- 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=202610081212"></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/textform.js?v=202610081516"></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/checkliste.js?v=202610081212" defer></script>
<script src="assets/js/ampel.js?v=202610081212" defer></script>
<script src="assets/js/schulung.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/bildschau.js?v=202610081212"></script>
<script src="assets/js/bereich.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/checkliste.js?v=202610081516" defer></script>
<script src="assets/js/ampel.js?v=202610081516" defer></script>
<script src="assets/js/schulung.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/bildschau.js?v=202610081516"></script>
<script src="assets/js/bereich.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/auskunft.js?v=202610081212" defer></script>
<script src="assets/js/bewerben.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/auskunft.js?v=202610081516" defer></script>
<script src="assets/js/bewerben.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -80,16 +80,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/auskunft.js?v=202610081212" defer></script>
<script src="assets/js/bewerbungen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/auskunft.js?v=202610081516" defer></script>
<script src="assets/js/bewerbungen.js?v=202610081516" 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=202610081212" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202610081516" />
</head>
<body class="obs-buehne">
<div id="platz"></div>
<script src="assets/js/werbung.js?v=202610081212" defer></script>
<script src="assets/js/buehne.js?v=202610081212" defer></script>
<script src="assets/js/werbung.js?v=202610081516" defer></script>
<script src="assets/js/buehne.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/calls.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/calls.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="lounge">
@@ -89,15 +89,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/ki.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/calls.js?v=202610081212" defer></script>
<script src="assets/js/ki.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/calls.js?v=202610081516" defer></script>
</body>
</html>
+21 -21
View File
@@ -12,31 +12,31 @@
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/chat.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/chat.css?v=202610081516" />
<!-- Die Bildschau stand bis zum 07.10.2026 in chat.css. Sie wird jetzt
auch vom Event-Banner benutzt (bereich.html) und hat deshalb eine
eigene Datei. Sie steht GENAU HIER -- direkt hinter chat.css, also
an derselben Stelle im Ladeweg wie der Block vorher. -->
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="lounge">
@@ -744,24 +744,24 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202610081212"></script>
<script src="assets/js/bereiche.js?v=202610081516"></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=202610081212"></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212"></script>
<script src="assets/js/glocke.js?v=202610081212"></script>
<script src="assets/js/textform.js?v=202610081516"></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516"></script>
<script src="assets/js/glocke.js?v=202610081516"></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=202610081212"></script>
<script src="assets/js/anruf.js?v=202610081516"></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
@@ -772,8 +772,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=202610081212"></script>
<script src="assets/js/chat.js?v=202610081212"></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/bildschau.js?v=202610081516"></script>
<script src="assets/js/chat.js?v=202610081516"></script>
<script src="assets/js/installieren.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/content.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/content.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="portal">
@@ -179,15 +179,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/checkliste.js?v=202610081212" defer></script>
<script src="assets/js/content.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/checkliste.js?v=202610081516" defer></script>
<script src="assets/js/content.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202610081516" />
</head>
<body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/gate.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202610081212",
"src": "/assets/img/app-symbole/crew-192.png?v=202610081516",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202610081212",
"src": "/assets/img/app-symbole/crew-512.png?v=202610081516",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202610081212",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202610081516",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202610081212",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202610081516",
"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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="arena">
@@ -108,15 +108,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/dateien.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/dateien.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -306,20 +306,20 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" 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=202610081212" defer></script>
<script src="assets/js/entwicklung.js?v=202610081212" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202610081516" defer></script>
<script src="assets/js/entwicklung.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -146,14 +146,14 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/hilfe.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/hilfe.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
</head>
<body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/gate.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="skyline">
@@ -383,15 +383,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/kalender.js?v=202610081212" defer></script>
<script src="assets/js/kalender-abo.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/kalender.js?v=202610081516" defer></script>
<script src="assets/js/kalender-abo.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="arena">
@@ -444,13 +444,13 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202610081212"></script>
<script src="assets/js/nachfrage.js?v=202610081212"></script>
<script src="assets/js/wahl.js?v=202610081212"></script>
<script src="assets/js/bereiche.js?v=202610081212"></script>
<script src="assets/js/kopf.js?v=202610081212"></script>
<script src="assets/js/glocke.js?v=202610081212"></script>
<script src="assets/js/leistung.js?v=202610081212"></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516"></script>
<script src="assets/js/nachfrage.js?v=202610081516"></script>
<script src="assets/js/wahl.js?v=202610081516"></script>
<script src="assets/js/bereiche.js?v=202610081516"></script>
<script src="assets/js/kopf.js?v=202610081516"></script>
<script src="assets/js/glocke.js?v=202610081516"></script>
<script src="assets/js/leistung.js?v=202610081516"></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
</body>
</html>
+14 -14
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/manager-ziele.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/manager-ziele.css?v=202610081516" />
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
Variablen, und bei Variablen entscheidet allein, wer zuletzt
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="arena">
@@ -230,16 +230,16 @@
kopf.js liest daraus die Leitungsrollen. Ohne sie stürzt jede
Seite ab, und zwar nur in der Browserkonsole -- die Kopfleiste
kommt trotzdem. -->
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
Liste. pruef-css-klassen setzt das durch, und zwar auch die
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
Bedienelement. -->
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/manager-ziele.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/manager-ziele.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/material.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/material.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/material.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/material.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/notizen.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/notizen.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/personen.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/personen.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="halle">
@@ -453,14 +453,14 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/personen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/personen.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/profil.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/profil.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="halle">
@@ -214,16 +214,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/steckbrief.js?v=202610081212" defer></script>
<script src="assets/js/profil.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/steckbrief.js?v=202610081516" defer></script>
<script src="assets/js/profil.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/foyer.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/foyer.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -283,13 +283,13 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/reaktion-foyer.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/reaktion-foyer.js?v=202610081516" defer></script>
</body>
</html>
+72 -20
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start reaktion-seite" data-stand="laedt">
@@ -635,14 +635,62 @@
<!-- ==== Warteschlange ================================== -->
<section class="pult-tafel" data-tafel="liste" role="tabpanel" hidden
id="tafel-liste" aria-labelledby="reiter-liste">
<div class="pult__zeile">
<!-- ==== ZWEI SICHTEN AUF DIESELBE LISTE (08.10.2026) ====
Filipe: „in der regie will ich auch video hinzufügen
können für andere tage und uhrzeiten, gerade geht das
nicht. wie so ein kalender wo vanvan und dogfather videos
eintragen und vorbereiten können."
KEINE ZWEITE LISTE. Die Warteschlange beantwortet zwei
verschiedene Fragen: „was kommt als Nächstes" (während
einer Sendung) und „wann läuft was" (beim Vorbereiten).
Zwei Listen nebeneinander liefen spätestens beim ersten
Verschieben auseinander — es ist derselbe Bestand, nur
anders sortiert und anders gezeigt. -->
<div class="plan-wahl" role="tablist" aria-label="Ansicht der Warteschlange">
<button type="button" class="plan-wahl__knopf" role="tab" data-sicht="reihe"
id="plan-sicht-reihe" aria-selected="true">Reihenfolge</button>
<button type="button" class="plan-wahl__knopf" role="tab" data-sicht="kalender"
id="plan-sicht-kalender" aria-selected="false">Kalender</button>
</div>
<div class="pult__zeile pult__zeile--anhaengen">
<label class="pult__feld">
<span>Video anhängen</span>
<input type="text" id="l-neu" placeholder="YouTube-Adresse einfügen und Enter" />
</label>
<label class="pult__feld pult__feld--wann">
<!-- LEER IST GÜLTIG und bleibt der Normalfall: „liegt
bereit, aber noch ohne Termin". -->
<span>Wann <span class="pult__leise">leer = ohne Termin</span></span>
<input type="datetime-local" id="l-wann" />
</label>
<button type="button" class="knopf-still" id="l-anhaengen">Anhängen</button>
</div>
<ol class="warteliste" id="warteliste"></ol>
<div class="plan-kalender" id="plan-kalender" hidden>
<div class="plan-kalender__kopf">
<button type="button" class="plan-kalender__pfeil" id="plan-zurueck"
aria-label="Einen Monat zurück">‹</button>
<strong class="plan-kalender__monat" id="plan-monat" aria-live="polite">…</strong>
<button type="button" class="plan-kalender__pfeil" id="plan-vor"
aria-label="Einen Monat vor">›</button>
<button type="button" class="plan-kalender__heute" id="plan-heute">Heute</button>
</div>
<!-- Die Wochentage stehen als eigene Zeile und nicht in jeder
Zelle: Sieben Kürzel einmal sind sieben Kürzel; in jeder
Zelle wären es fünfunddreißig. -->
<div class="plan-kalender__tage" aria-hidden="true">
<span>Mo</span><span>Di</span><span>Mi</span><span>Do</span>
<span>Fr</span><span>Sa</span><span>So</span>
</div>
<div class="plan-kalender__raster" id="plan-raster" role="grid"
aria-label="Monatsraster"></div>
<div class="plan-tag" id="plan-tag"></div>
</div>
<p class="pult__klein" id="liste-hinweis">
Räum vorher ein, was ihr schauen wollt. Im Live drückst du
dann nur noch „Nächstes“ — eine Adresse mitten in der
@@ -1132,15 +1180,19 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/spendenkarte.js?v=202610081212" defer></script>
<script src="assets/js/werbung.js?v=202610081212" defer></script>
<script src="assets/js/reaktion.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/spendenkarte.js?v=202610081516" defer></script>
<script src="assets/js/werbung.js?v=202610081516" defer></script>
<!-- VOR reaktion.js: Dort steht `window.Getippt`, und reaktion.js
bindet damit beim ersten Zeichnen schon Felder. Kaeme sie
spaeter, waere das erste Zeichnen ohne Gedaechtnis. -->
<script src="assets/js/getippt.js?v=202610081516" defer></script>
<script src="assets/js/reaktion.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/rechte.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/rechte.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/report.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/report.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="showbuehne">
@@ -106,17 +106,17 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/ki.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/report.js?v=202610081212" defer></script>
<script src="assets/js/ki.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/report.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="wald">
@@ -194,14 +194,14 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/scouting.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/scouting.js?v=202610081516" defer></script>
</body>
</html>
+19 -19
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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/heim.css?v=202610081516" />
<!-- Die Einweisung bringt ihr Aussehen mit. Sie steht in
anleitung.css, weil sie dorthin gehoert -- und nicht in
start.css, wo sie zwischen 48 Kachelfarben verschwinden
wuerde. -->
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -768,22 +768,22 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/live.js?v=202610081212" defer></script>
<script src="assets/js/start.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/live.js?v=202610081516" defer></script>
<script src="assets/js/start.js?v=202610081516" defer></script>
<!-- Die Begruessung und der Rundgang beim ersten Anmelden.
EIGENE DATEI und nicht ein Stueck start.js: Sie laeuft auf der
meistbenutzten Seite des Hauses, und wenn hier etwas schiefgeht,
darf davon nichts anderes betroffen sein. -->
<script src="assets/js/rundgang.js?v=202610081212" defer></script>
<script src="assets/js/aufstieg.js?v=202610081212" defer></script>
<script src="assets/js/rundgang.js?v=202610081516" defer></script>
<script src="assets/js/aufstieg.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="wald">
@@ -85,16 +85,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/ki.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/startcheck.js?v=202610081212" defer></script>
<script src="assets/js/ki.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/startcheck.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/profil.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/profil.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="halle">
@@ -150,16 +150,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/auskunft.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/steckbrief.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/auskunft.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/steckbrief.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/support.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/support.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="studio">
@@ -154,16 +154,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=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" 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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/support.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/support.js?v=202610081516" 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=202610081212" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610081516" />
<style>
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
@@ -109,7 +109,7 @@
<body>
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
<script src="assets/js/spendenkarte.js?v=202610081212" defer></script>
<script src="assets/js/tafel.js?v=202610081212" defer></script>
<script src="assets/js/spendenkarte.js?v=202610081516" defer></script>
<script src="assets/js/tafel.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -111,15 +111,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/talente.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/talente.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/team.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/team.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="halle">
@@ -110,15 +110,15 @@
</main>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/team.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/team.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/team.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/team.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/teamlage.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" defer></script>
<script src="assets/js/teamlage.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -112,15 +112,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/teilen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/teilen.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -126,14 +126,14 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/treff-moderation.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/treff-moderation.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/treff.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/auskunft.js?v=202610081212" defer></script>
<script src="assets/js/treff-regeln.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/auskunft.js?v=202610081516" defer></script>
<script src="assets/js/treff-regeln.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="showbuehne">
@@ -149,16 +149,16 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/uebersicht.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/uebersicht.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -335,14 +335,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/live.js?v=202610081212" defer></script>
<script src="assets/js/unsere-seiten.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/live.js?v=202610081516" defer></script>
<script src="assets/js/unsere-seiten.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</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=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/holen.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/holen.js?v=202610081516" 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=202610081212" defer></script>
<script src="assets/js/unterstuetzen.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/unterstuetzen.js?v=202610081516" 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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start">
@@ -144,14 +144,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/werdegang.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/werdegang.js?v=202610081516" defer></script>
</body>
</html>
+1 -1
View File
@@ -56,7 +56,7 @@
veraltet beim naechsten Umbau. -->
<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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<style>
/* Bewusst ohne eigenes Stilblatt: Die Seite ist in aller Regel nur
+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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081516" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081516" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202610081516" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081516" />
<!-- 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=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081516" />
</head>
<body class="start" data-buehne="arena">
@@ -190,15 +190,15 @@
</main>
<script src="assets/js/meldung.js?v=202610081212" defer></script>
<script src="assets/js/hochladen.js?v=202610081212" defer></script>
<script src="assets/js/nachfrage.js?v=202610081212" defer></script>
<script src="assets/js/meldung.js?v=202610081516" defer></script>
<script src="assets/js/hochladen.js?v=202610081516" defer></script>
<script src="assets/js/nachfrage.js?v=202610081516" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/wissen.js?v=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081516" defer></script>
<script src="assets/js/bereiche.js?v=202610081516" defer></script>
<script src="assets/js/installieren.js?v=202610081516" defer></script>
<script src="assets/js/kopf.js?v=202610081516" defer></script>
<script src="assets/js/glocke.js?v=202610081516" defer></script>
<script src="assets/js/wissen.js?v=202610081516" defer></script>
</body>
</html>