Regieplatz, Bildschirm teilen, Zuruecksetzen und der Preis

Vier Sachen aus Filipes Ansagen vom 28.09.2026.

=======================================================================
1. DER REGIEPLATZ

"kann das nicht bissl aufgeteilt sein auf links und rechts und eine
barre unten in der mitte. kannst du das nicht hoch professionell
machen und hochwertig vom aussehen?"

Die Teilung folgt dem, was WANN gebraucht wird:
  LINKS   Was laeuft. Das liest man.
  RECHTS  Was eingetragen wird. Das tippt man VOR der Sendung.
  UNTEN   Der Transport. Den fasst man WAEHREND der Sendung an.

Vorher stand alles in einem Stapel, und wer im Live an den Play-Knopf
wollte, musste an den Eingabefeldern vorbeiscrollen. Der Play-Knopf
ist jetzt rund und 58 px -- der einzige, den man blind treffen muss,
und die Form unterscheidet ihn schon vor dem Hinsehen.

UND EIN FUND, DEN NUR DIE MESSUNG FAND: Nach dem Umbau lag die Leiste
bei y=986 in einem 900 Pixel hohen Fenster. Die Rechnung ging auf
(links, rechts, Leiste darunter) und das Ergebnis war trotzdem
falsch. Jetzt klebt sie (`position: sticky`) -- unten, wie gewollt,
und immer sichtbar. Ihr Grund musste dafuer dicht werden: eine
halbdurchsichtige Leiste, durch die Text scrollt, ist die Flaeche,
auf der man sich im Live verliest.

=======================================================================
2. DEN BILDSCHIRM TEILEN

"waere es nicht einfach eine bildschirm uebertragung zu installieren
und es zu perfektionieren?"

Ja -- der Weg war schon da: Die Kamerabilder laufen als
Direktverbindung von Mensch zu Mensch. Geteilt wird deshalb AN STELLE
der Kamera; `replaceTrack` tauscht die Bildspur in jeder bestehenden
Leitung aus, ohne dass eine einzige neu ausgehandelt werden muss.
Eine zweite Spur daneben waere eine zweite Verhandlung je Zuschauer,
und jede davon kann scheitern.

Vier Dinge, die sonst schiefgegangen waeren:
  - Wer waehrenddessen dazukommt, bekommt den Bildschirm und nicht
    das Gesicht.
  - Das eigene Fenster zeigt, was die anderen sehen -- sonst waere es
    die eine Anzeige, der man nicht trauen kann.
  - Der Stopp-Knopf des Browsers wird gehoert; sonst bliebe die Seite
    auf "teilt" stehen und sendete ein totes Bild.
  - Der Kameraknopf wird grau, solange geteilt wird. Er haette keine
    Wirkung mehr -- und ein Knopf, der still nichts tut, ist
    schlimmer als keiner.

Ein Bildschirm wird ausserdem NICHT zugeschnitten: `cover` ist fuer
ein Gesicht richtig, bei einem Schreibtisch faellt links und rechts
genau das weg, worum es geht.

UND DIE WAHRHEIT STEHT AN DER BEDIENUNG: Netflix, Disney+ und Prime
bleiben beim Teilen schwarz (Widevine schaltet den Videobereich ab --
auf Discord und Zoom ist es genauso), und einen Film weiterzusenden
waere eine oeffentliche Wiedergabe. Wer das erst erfaehrt, nachdem im
Stream zehn Minuten ein schwarzes Rechteck stand, erfaehrt es zu
spaet.

=======================================================================
3. ALLES ZURUECKSETZEN

"brauch ich auch noch einen button wo ich alles easy zuruecksetzen
kann."

"Alles" heisst: der Schreibtisch, nicht das Gedaechtnis. Geleert
werden Titel, Video, zweites Video, Vorschaubild, Beginn,
Warteschlange, Gaesteliste; Anordnung, Kameragroesse, Ecke, Tempo und
Chatmodus gehen auf Vorgabe.

NICHT ANGETASTET werden Spenden, die Dogen der Leute, der Chatverlauf
und die Massnahmen der Moderation. Eine bezahlte Spende aus den
Buechern zu nehmen waere eine Faelschung; eine stillschweigend
aufgehobene Sperre waere eine Entscheidung, die niemand getroffen
hat. Beides steht nebeneinander im Dialog, BEVOR etwas passiert -- ein
"Bist du sicher?" ohne diese Liste ist keine Frage, sondern eine
Huerde.

Im Live ist der Knopf grau und sagt warum. Und die Spalten stehen
einzeln da statt als "alles ausser": Eine Ausnahmeliste waechst still
mit jeder neuen Spalte mit, und dann loescht das Zuruecksetzen
irgendwann etwas, das es nie loeschen sollte.

=======================================================================
4. DER PREIS BEI DEN DOGEN

"da muss ich auch sehen so viel dogen sind so viel euro. damit ich
auch immer weiss was es ist. aber nur ich. die leute sollen nur sehen
was dogen kosten."

Das ist keine Ruecknahme von "nie Geld", sondern ihre Grenze. Die
Regel war richtig fuer alles, was ANZEIGE ist -- Karte, Stream, Chat,
Punktestand -- und falsch fuer die eine Stelle, an der jemand KAUFT.

GENAU ZWEI AUSNAHMEN, und die Pruefung nennt sie beim Namen statt die
Regel aufzuweichen:
  knoepfe[].cent      fuer alle -- der Preis am Kaufknopf
  kurs_cent_je_doge   nur fuer die Leitung

DIE ERLAUBNIS STECKT IN DEN DATEN UND NICHT IN EINEM `if`. Ein
Zuschauer hat den Kurs nicht und kann deshalb GAR KEINEN Preis
ausrechnen -- auch nicht, wenn eine spaetere Zeile es versuchte. Eine
Abfrage "darf der das sehen?" in der Oberflaeche waere eine Regel, die
man vergessen kann; eine fehlende Zahl ist eine, die man nicht
vergessen kann.

Eine Zahl statt dreissig Einzelumrechnungen: Wer je Zeile einen Cent
mitschickt, hat dreissig Gelegenheiten, eine zu vergessen.

=======================================================================
FUENF BEFUNDE GEGEN DIE EIGENEN PRUEFUNGEN

1. Eine Pruefung fragte "liegt die Leiste unter beiden Spalten?" --
   das tut eine klebende Leiste beim Hochscrollen absichtlich nicht.
   Sie stellte die Frage von vorher. Jetzt zaehlt die Reihenfolge im
   Dokument, die beim Scrollen wie beim Stillstand gilt.
2. Eine Messung klickte auf einen Namen und wartete 400 ms auf die
   UHR -- und verschluckte den Klickfehler still. Derselbe Lauf war
   dreimal gruen und beim vierten rot, ohne Codeaenderung. Jetzt wird
   auf das Merkmal gewartet, bis zu dreimal, und die Zahl der
   Anlaeufe steht im Protokoll.
3. Eine Pruefung loeschte erst selbst den Chat (eine Sendung zu
   beenden tut das mit Absicht) und fragte dann, ob er noch da ist.
4. "Die Dogen sind unberuehrt (0 Staende)" -- null bleibt auch dann
   null, wenn das Zuruecksetzen sie mitnaehme. Jetzt steht vorher
   eine echte Spende da, und die Zahl gehoert in die BEDINGUNG.
5. `knopf-still--haupt` stand seit Wochen im HTML und war in KEINEM
   Stilblatt definiert -- eine Klasse, die aussieht, als sei etwas
   hervorgehoben, und auf dem Bildschirm ist es das nicht. Gefunden
   beim Nachsehen, ob es sie gibt, bevor ich sie ein zweites Mal
   benutze.

Und eine neue Pruefung, die es vorher nicht gab: ALLE 118 Kennungen,
die das Programm mit `$('...')` anspricht, werden gegen das HTML
gehalten. Nach einem Umbau, der die halbe Tafel neu sortiert, waere
eine verlorene Kennung KEIN Fehler beim Laden -- `$()` gibt still
`null` zurueck, und der Fehler erscheint erst, wenn jemand mitten in
der Sendung den Knopf drueckt.

pruef-reaktion 365/0 (vorher 321) - pruef-spenden 172/0 (vorher 167) -
pruef-buehne 36/0 - pruef-css-klassen ok - pruef-tippziele 11/0 -
mess-reaktion und mess-buehne ohne Beanstandung

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-28 20:03:38 +02:00
co-authored by Claude Opus 5
parent 96bdd79a91
commit 99e62eebbe
55 changed files with 2043 additions and 776 deletions
+204 -6
View File
@@ -396,6 +396,143 @@ await host.seite.evaluate(() => {
});
await host.seite.waitForTimeout(900);
/* ---- Der Regieplatz: links, rechts und die Leiste unten ----------
Filipe: „kann das nicht bissl aufgeteilt sein auf links und rechts
und eine barre unten in der mitte."
GEMESSEN WIRD DIE LAGE UND NICHT DIE REGEL. Dass im Stilblatt
`grid-template-areas` steht, sagt nichts darueber, ob die rechte
Spalte auch wirklich rechts landet -- eine spaetere Regel, eine zu
breite Zelle, ein langer Titel, und sie steht darunter. Geprueft
wird deshalb an den Kanten:
linke Spalte endet, BEVOR die rechte anfaengt
die Leiste liegt UNTER beiden und ist so breit wie beide
Und zusaetzlich, dass nichts seitlich hinauslaeuft: Der Umbau hat
eine 16-rem-Spalte gegen einen Videotitel ohne Grenze gestellt. */
{
const platz = await host.seite.evaluate(() => {
const k = (w) => {
const e = document.querySelector(w);
if (!e) return null;
const r = e.getBoundingClientRect();
return {
l: Math.round(r.left), r: Math.round(r.right),
o: Math.round(r.top), u: Math.round(r.bottom),
b: Math.round(r.width), h: Math.round(r.height),
};
};
const innen = document.getElementById("pult-innen");
return {
links: k(".regieplatz__seite:not(.regieplatz__seite--rechts)"),
rechts: k(".regieplatz__seite--rechts"),
leiste: k(".transport"),
spiel: k("#v-spiel"),
/* Laeuft etwas seitlich hinaus? `scrollWidth` groesser als die
sichtbare Breite heisst genau das. */
ueber: innen ? innen.scrollWidth - innen.clientWidth : -1,
/* ==== UND IST DIE LEISTE UEBERHAUPT ZU SEHEN? ============
Beim ersten Bau lag sie bei y=986 in einem 900 Pixel hohen
Fenster -- die Rechnung ging auf, und man kam trotzdem nur
mit Scrollen an den Play-Knopf. Geprueft wird deshalb
gegen den SICHTBAREN Ausschnitt der Regie, nicht gegen die
Seite. */
sichtbar: (() => {
const e = document.querySelector(".transport");
if (!e || !innen) return false;
const r = e.getBoundingClientRect();
const i = innen.getBoundingClientRect();
return r.bottom <= i.bottom + 1 && r.top >= i.top - 1;
})(),
/* ==== UND SIE IST DIE LETZTE ZEILE ========================
„Unten" laesst sich bei einer KLEBENDEN Leiste nicht mehr an
den Kanten ablesen: Beim Hochscrollen schwebt sie
absichtlich ueber dem unteren Teil der Spalten. Die Frage
„liegt sie unter beiden?" war die von vorher -- sie hat nach
der Reparatur einen Fehler gemeldet, wo das Verhalten
richtig ist.
Was „unten" wirklich heisst, steht in der Reihenfolge: Sie
kommt im Dokument NACH beiden Spalten. Das gilt beim
Scrollen wie beim Stillstand. */
letzte: (() => {
const e = document.querySelector(".transport");
const r = document.querySelector(".regieplatz__seite--rechts");
if (!e || !r) return false;
/* 4 = DOCUMENT_POSITION_FOLLOWING */
return !!(r.compareDocumentPosition(e) & 4);
})(),
klebt: (() => {
const e = document.querySelector(".transport");
return e ? getComputedStyle(e).position : "(?)";
})(),
fenster: window.innerHeight,
};
});
const p = platz;
console.log(` Regieplatz: links ${p.links?.l}..${p.links?.r} · `
+ `rechts ${p.rechts?.l}..${p.rechts?.r} · `
+ `Leiste ${p.leiste?.l}..${p.leiste?.r} bei y=${p.leiste?.o} (${p.leiste?.h} px hoch)`);
console.log(` Play-Knopf ${p.spiel?.b}x${p.spiel?.h} px · seitlich ueber ${p.ueber} px `
+ `· Leiste ohne Scrollen sichtbar: ${p.sichtbar} `
+ `(${p.klebt}, nach beiden Spalten: ${p.letzte})`);
if (!p.sichtbar) {
console.log(" ACHTUNG: Die Transportleiste ist nur mit Scrollen zu erreichen.");
ausgang = 1;
}
if (!p.links || !p.rechts || !p.leiste) {
console.log(" ACHTUNG: Der Regieplatz fehlt.");
ausgang = 1;
} else {
if (p.links.r > p.rechts.l + 1) {
console.log(" ACHTUNG: Links und rechts stehen nicht nebeneinander.");
ausgang = 1;
}
if (!p.letzte || p.klebt !== "sticky") {
console.log(` ACHTUNG: Die Leiste ist nicht die letzte Zeile `
+ `(danach=${p.letzte}, position=${p.klebt}).`);
ausgang = 1;
}
/* Sie soll ueber die GANZE Breite gehen -- eine Leiste, die nur
so breit ist wie eine Spalte, ist keine Leiste unten in der
Mitte, sondern eine dritte Spalte. */
if (p.leiste.l > p.links.l + 1 || p.leiste.r < p.rechts.r - 1) {
console.log(" ACHTUNG: Die Leiste geht nicht ueber beide Spalten.");
ausgang = 1;
}
/* Der Play-Knopf ist der einzige, den man im Live blind treffen
muss. 44 px ist die Hausgrenze; er soll deutlich darueber
liegen. */
if ((p.spiel?.b || 0) < 52 || (p.spiel?.h || 0) < 52) {
console.log(" ACHTUNG: Der Play-Knopf ist zu klein zum Blindtreffen.");
ausgang = 1;
}
if (p.ueber > 1) {
console.log(` ACHTUNG: Der Regieplatz laeuft ${p.ueber} px seitlich hinaus.`);
ausgang = 1;
}
}
/* ---- Und der Knopf zum Teilen ---- */
const teilen = await host.seite.evaluate(() => {
const e = document.getElementById("s-teilen");
if (!e) return null;
const r = e.getBoundingClientRect();
return {
da: r.width > 0 && r.height > 0,
b: Math.round(r.width), h: Math.round(r.height),
wort: document.getElementById("s-teilen-wort")?.textContent || "",
gedrueckt: e.getAttribute("aria-pressed"),
};
});
console.log(` Bildschirm teilen: „${teilen?.wort}" ${teilen?.b}x${teilen?.h} px, `
+ `gedrueckt=${teilen?.gedrueckt}`);
if (!teilen?.da || teilen.h < 40 || teilen.wort !== "Bildschirm") {
console.log(" ACHTUNG: Der Knopf zum Teilen fehlt oder ist zu klein.");
ausgang = 1;
}
await bild(host.seite, "23-regieplatz");
}
const regie = await host.seite.evaluate(() => {
const t = (id) => document.getElementById(id)?.textContent?.trim() || "";
const sicht = (w) => {
@@ -639,17 +776,48 @@ const geben = await zuschauer.seite.evaluate(() => {
if (!b) return false;
return b.tagName.toLowerCase() === "img" ? b.naturalWidth > 0 : true;
}).length,
/* Und nirgends ein Euro. */
geld: /€|EUR|Euro/.test(k2?.textContent || ""),
/* ==== HIER MUSS DER PREIS STEHEN ==========================
Filipe: „die leute sollen nur sehen was dogen kosten. sonst
wissen die ja nicht wie viel es kosten wird."
Hier stand bis zum 28.09. das Gegenteil -- „nirgends ein
Euro". Das war fuer jede ANZEIGE richtig und fuer den einen
Kaufknopf falsch. */
preise: knoepfe.map((a) => a.querySelector(".geben__preis")?.textContent?.trim() || ""),
/* ==== UND SONST NIRGENDS AUF DER SEITE ====================
Die staerkste Form der Frage: den ganzen sichtbaren Text
nehmen, den Geben-Kasten herausschneiden und nachsehen, ob
irgendwo noch ein Eurozeichen uebrig ist. Eine Pruefung, die
nur den Kasten ansieht, uebersieht genau die Stelle, an der
es versehentlich landet. */
geldSonstwo: (() => {
const alles = document.body.textContent || "";
const kasten = k2?.textContent || "";
return /€|EUR/.test(alles.split(kasten).join(" "));
})(),
};
});
console.log(` Geben-Kasten: ${geben.knoepfe} Knoepfe (${geben.zahlen.join(" · ")}), `
+ `${geben.zeichen} mit Zeichen, Geld im Text: ${geben.geld}`);
if (!geben.da || geben.knoepfe !== 4 || geben.zeichen !== 4 || geben.geld
+ `${geben.zeichen} mit Zeichen`);
console.log(` Preise am Knopf: ${geben.preise.join(" · ")} `
+ `| Geld sonstwo auf der Seite: ${geben.geldSonstwo}`);
if (!geben.da || geben.knoepfe !== 4 || geben.zeichen !== 4
|| geben.zahlen[0] !== "0,2") {
console.log(" ACHTUNG: Der Geben-Kasten zeigt nicht, was er soll.");
ausgang = 1;
}
/* WER BEZAHLT, MUSS VORHER WISSEN, WAS ER ZAHLT. Vier Knoepfe, vier
Preise -- ein Knopf ohne Preis waere der eine, bei dem es niemand
merkt. */
if (geben.preise.some((p) => !/\d/.test(p) || !p.includes("€"))) {
console.log(` ACHTUNG: An einem Knopf fehlt der Preis (${geben.preise.join(" | ")}).`);
ausgang = 1;
}
/* UND SONST NIRGENDS. Ein Zuschauer sieht den Preis dort, wo er
kauft -- und sonst nur Dogen. */
if (geben.geldSonstwo) {
console.log(" ACHTUNG: Auf der Zuschauerseite steht Geld ausserhalb der Kaufknoepfe.");
ausgang = 1;
}
/* ==== DIE PROBE AENDERT NUR DAS, WAS SIE AENDERN MUSS ============
Der Knopf ist ein Verweis mit `target="_blank"` und fuehrt zu
@@ -1837,8 +2005,38 @@ if (modiSicht !== 0 || abz.namensknoepfe < 3) {
/* DAS MENUE MUSS INS BILD PASSEN. Ein Menue, das unten oder rechts
heraussteht, ist auf dem Handy die Haelfte der Zeit nicht
bedienbar -- und man sieht es erst, wenn man es aufmacht. */
await modi.seite.click("#chat-liste .beitrag:last-child .beitrag__name").catch(() => {});
await modi.seite.waitForTimeout(400);
/* ==== AUF DAS MENUE WARTEN, NICHT AUF DIE UHR ===================
Hier stand `click(...).catch(() => {})` und danach 400 ms Pause.
Beide Haelften waren falsch:
Der `.catch()` verschluckte einen fehlgeschlagenen Klick still.
Die Chatliste wird bei jeder Meldung neu gezeichnet, und trifft
das genau zwischen Auswahl und Klick, ist der Knoten weg.
Und 400 ms sind eine Wette. Gemessen: Derselbe Lauf war am
28.09. dreimal gruen und beim vierten Mal rot -- geaendert
hatte sich am Programm nichts, nur an dieser Messung. Ein
Ergebnis, das ohne Codeaenderung kippt, ist ein Fehler der
Messung und kein Befund.
Jetzt wird auf das MERKMAL gewartet und bis zu dreimal neu
angesetzt -- und die Zahl der Versuche steht im Protokoll. Ein
stiller Wiederholungsversuch waere nur eine leisere Wette. */
let menueVersuche = 0;
let menueOffen = false;
while (menueVersuche < 3 && !menueOffen) {
menueVersuche += 1;
await modi.seite.click("#chat-liste .beitrag:last-child .beitrag__name")
.catch(() => {});
menueOffen = await modi.seite.waitForSelector(".modmenue", { timeout: 3000 })
.then(() => true).catch(() => false);
}
if (menueVersuche > 1) {
console.log(` (Das Menue brauchte ${menueVersuche} Anlaeufe -- die Chatliste `
+ `wurde dazwischen neu gezeichnet.)`);
}
await modi.seite.waitForTimeout(250);
const menue = await modi.seite.evaluate(() => {
const m = document.querySelector(".modmenue");
if (!m) return null;
+259
View File
@@ -1895,6 +1895,265 @@ melde("=== 19. Groesse und Ecke der Kamerafenster ===");
}
}
/* =======================================================================
20. DER REGIEPLATZ UND DAS TEILEN DES BILDSCHIRMS
Filipe, 28.09.2026:
„kann das nicht bissl aufgeteilt sein auf links und rechts und
eine barre unten in der mitte."
„waere es nicht einfach eine bildschirm uebertragung zu
installieren und es zu perfektionieren?"
======================================================================= */
melde("");
melde("=== 20. Regieplatz und Bildschirm ===");
{
const html = readFileSync(join(HIER, "..", "workspace", "reaktion.html"), "utf8");
const css = readFileSync(join(HIER, "..", "workspace", "assets", "css", "reaktion.css"), "utf8");
const js = readFileSync(join(HIER, "..", "workspace", "assets", "js", "reaktion.js"), "utf8");
const regeln = css.replace(/\/\*[\s\S]*?\*\//g, " ");
/* ==== KEINE KENNUNG DARF BEIM UMBAU VERLORENGEHEN ==============
Das ist die wichtigste Pruefung dieses Abschnitts. Der
Regieplatz hat die halbe Sendung-Tafel neu sortiert, und jedes
`$('...')` im Programm zeigt auf ein Element im HTML. Faellt
eines heraus, ist es KEIN Fehler beim Laden -- `$()` gibt `null`
zurueck, und der Fehler erscheint erst, wenn jemand den Knopf
drueckt. Also mitten in einer Sendung.
Gezaehlt wird gegen die Kennungen im HTML. Was das Programm
selbst anlegt, steht darunter namentlich -- eine Liste von
Ausnahmen, die man SIEHT, ist besser als eine Pruefung, die
schweigt. */
{
const selbstGebaut = new Set([
/* Diese legt das Programm an oder sie stehen in anderen
Dateien der Kopfleiste. */
]);
const gebraucht = [...js.matchAll(/\$\('([a-z0-9-]+)'\)/g)].map((m) => m[1]);
const einmalig = [...new Set(gebraucht)].filter((x) => !selbstGebaut.has(x));
const fehlend = einmalig.filter((x) => !html.includes(`id="${x}"`));
ok(einmalig.length > 40, `das Programm greift auf ${einmalig.length} Kennungen zu`);
ok(fehlend.length === 0,
fehlend.length
? `ES FEHLEN IM HTML: ${fehlend.join(", ")}`
: "und jede davon gibt es im HTML");
/* Gegenprobe: Eine erfundene Kennung muss auffallen -- sonst
koennte die Liste auch leer sein und die Pruefung gruen. */
ok(!html.includes('id="gibtesnicht"'),
"Gegenprobe: eine erfundene Kennung steht in keinem HTML");
}
/* ---- LINKS, RECHTS UND EINE LEISTE UNTEN ---- */
ok(/grid-template-areas:\s*"links rechts"\s*"leiste leiste"/.test(regeln.replace(/\s+/g, " ")
.replace(/" "/g, '" "')) || /links rechts[\s\S]{0,40}leiste leiste/.test(regeln),
"der Regieplatz hat links, rechts und eine Leiste unten");
const platz = [...regeln.matchAll(/([^{}]*\.regieplatz[^{}]*)\{([^}]*)\}/g)]
.filter((m) => /grid-template-areas/.test(m[2]));
/* ZWEI REGELN FUER DIESELBE FRAGE SIND DIE GARANTIE, DASS EINE
FALSCH GEWINNT -- heute schon viermal passiert. Die Handyansicht
darf die Bereiche neu setzen; deshalb zwei, nicht eine. */
ok(platz.length === 2,
`${platz.length} Regeln ordnen den Regieplatz (Rechner und Handy)`);
/* Die Leiste traegt den ganzen Transport -- und zwar in EINER. */
const iLeiste = html.indexOf('class="transport"');
const iEnde = html.indexOf("</section>", iLeiste);
const inLeiste = html.slice(iLeiste, iEnde);
for (const k of ["v-band", "v-zeit", "v-zurueck", "v-spiel", "v-vor", "v-naechstes", "tempo"]) {
ok(inLeiste.includes(`id="${k}"`), `„${k}" liegt in der Transportleiste`);
}
ok(!inLeiste.includes('id="p-titel"'),
"und die Eingabefelder liegen NICHT darin");
/* ---- DER BILDSCHIRM ---- */
ok(/getDisplayMedia/.test(js), "die Seite kann den Bildschirm holen");
ok(/replaceTrack/.test(js),
"und tauscht die Bildspur aus, statt eine zweite Leitung auszuhandeln");
ok(/audio:\s*false/.test(js),
"der Rechnerton kommt NICHT mit -- sonst waere alles doppelt");
ok(/addEventListener\('ended'/.test(js),
"der eigene Stopp-Knopf des Browsers wird gehoert");
ok(/bildschirmSpur \|\| meinStrom\.getVideoTracks\(\)\[0\]/.test(js),
"auch wer waehrenddessen dazukommt, bekommt den Bildschirm");
ok(/\.kamera\[data-bildschirm="ja"\] video/.test(regeln)
&& /object-fit:\s*contain/.test(regeln),
"ein geteilter Bildschirm wird nicht zugeschnitten");
ok(html.includes('id="s-teilen"'), "es gibt den Knopf in der Senderleiste");
/* ==== UND DIE WAHRHEIT STEHT AN DER BEDIENUNG ==================
Netflix und Disney+ bleiben beim Teilen schwarz -- das ist ihr
Kopierschutz und keine Einstellung. Wer das erst erfaehrt,
nachdem im Stream zehn Minuten ein schwarzes Rechteck stand,
erfaehrt es zu spaet. Deshalb ist der Hinweis Teil der Seite
und nicht Teil einer Hilfe, die niemand oeffnet. */
ok(/Netflix[\s\S]{0,80}schwarz/.test(html),
"und die Seite sagt, dass Netflix schwarz bleibt");
ok(/öffentliche Wiedergabe/.test(html),
"und warum ein Film nicht weitergesendet wird");
/* ---- AM SERVER ---- */
{
const an = await roh(CREW, "/workspace/api/reaktion/senden", {
method: "POST", keks: k.admin, rumpf: { bildschirm: true },
});
ok(an.code === 200 && an.j?.ich?.bildschirm === true,
`der Host meldet das Teilen (${an.code})`);
const beiAnderen = await roh(CREW, "/workspace/api/reaktion", { keks: k.gast });
ok(beiAnderen.j?.host?.bildschirm === true,
"und alle sehen es an seinem Fenster");
const aus = await roh(CREW, "/workspace/api/reaktion/senden", {
method: "POST", keks: k.admin, rumpf: { bildschirm: false },
});
ok(aus.code === 200 && aus.j?.ich?.bildschirm === false,
`und das Beenden auch (${aus.code})`);
const fremd = await roh(CREW, "/workspace/api/reaktion/senden", {
method: "POST", keks: k.gast, rumpf: { bildschirm: true },
});
ok(fremd.code === 403,
`wer nicht sendet, teilt auch nicht (${fremd.code})`);
}
}
/* =======================================================================
21. ALLES ZURUECKSETZEN
Filipe, 28.09.2026: „brauch ich auch noch einen button wo ich alles
easy zuruecksetzen kann."
Die wichtigste Frage dieses Abschnitts ist nicht, ob es leert --
sondern ob es das Richtige STEHEN LAESST. Ein Zuruecksetzen, das
eine bezahlte Spende mitnimmt, ist keine Bequemlichkeit, sondern
ein Datenverlust mit Knopf.
======================================================================= */
melde("");
melde("=== 21. Alles zuruecksetzen ===");
{
/* Erst etwas hinstellen, das verschwinden soll -- und etwas, das
bleiben muss. Ohne beides prueft man ein leeres Haus.
==== „VORBEREITUNG" UND NICHT „ZU" -- UND DAS IST DER PUNKT
Beim ersten Lauf stand hier „zu", und die Pruefung meldete
danach „der Chatverlauf steht nicht mehr". Der Befund war
richtig und die Pruefung trotzdem falsch: Eine Sendung zu
BEENDEN loescht den Live-Chat seit jeher mit Absicht (sonst
finge die naechste mit den Rufen der letzten an). Sie hat also
erst selbst geloescht und dann gefragt, ob noch etwas da ist --
und haette dieselbe Antwort auch gegeben, wenn das
Zuruecksetzen den Chat mitnaehme.
In „vorbereitung" bleibt der Chat stehen, und erst dann sagt
die Antwort etwas ueber das Zuruecksetzen. */
await roh(CREW, "/workspace/api/reaktion/stand", {
method: "POST", keks: k.admin, rumpf: { stand: "vorbereitung" },
});
await roh(CREW, "/workspace/api/reaktion/chat", {
method: "POST", keks: k.admin, rumpf: { text: "Der bleibt stehen" },
});
await roh(CREW, "/workspace/api/reaktion", {
method: "PUT", keks: k.admin,
rumpf: { titel: "Wird geleert", video: "dQw4w9WgXcQ", vorschau: "https://x/y.jpg" },
});
await roh(CREW, "/workspace/api/reaktion/liste", {
method: "POST", keks: k.admin, rumpf: { video: "dQw4w9WgXcQ" },
});
await roh(CREW, "/workspace/api/reaktion/layout", {
method: "POST", keks: k.admin,
rumpf: { layout: "gleich", kamera_gross: 2, kamera_ecke: "ol" },
});
/* ==== ES MUSS AUCH ETWAS DA SEIN, DAS BLEIBEN KANN ===========
Beim ersten Lauf stand hier „die Dogen sind unberuehrt (0
Staende)". Null bleibt aber auch dann null, wenn das
Zuruecksetzen sie mitnaehme -- die Zeile war gruen und wertlos.
Die Zahl der geprueften Dinge gehoert in die BEDINGUNG und
nicht nur in den Meldetext. */
await roh(CREW, "/workspace/api/spenden", {
method: "POST", keks: k.admin,
rumpf: { dogen_mille: 500, name: "Nachtfalter", person_id: IDS.gast },
});
const vorher = await roh(CREW, "/workspace/api/reaktion", { keks: k.admin });
const spendenVorher = await roh(CREW, "/workspace/api/spenden", { keks: k.admin });
const dogenVorher = spendenVorher.j?.staende?.length || 0;
const letzteVorher = spendenVorher.j?.letzte?.length || 0;
ok(!!vorher.j?.titel && (vorher.j?.liste || []).length > 0,
`vorher steht etwas da (Titel „${vorher.j?.titel}", `
+ `${vorher.j?.liste?.length} in der Warteschlange)`);
const weg = await roh(CREW, "/workspace/api/reaktion/zuruecksetzen", {
method: "POST", keks: k.admin,
});
ok(weg.code === 200, `zuruecksetzen geht (${weg.code})`);
ok(weg.j?.titel === "" && weg.j?.video === "",
"Titel und Video sind leer");
ok((weg.j?.liste || []).length === 0, "die Warteschlange ist leer");
ok((weg.j?.gaeste || []).length === 0, "die Gaesteliste ist leer");
ok(weg.j?.layout === "kino" && weg.j?.kamera_gross === 1
&& weg.j?.kamera_ecke === "ur" && weg.j?.tempo === 1,
`das Bild steht wieder auf Vorgabe (${weg.j?.layout}, `
+ `${weg.j?.kamera_gross}x, ${weg.j?.kamera_ecke})`);
ok(weg.j?.stand === "zu", "und der Saal ist zu");
/* ==== UND DAS WICHTIGERE: WAS BLEIBEN MUSS, BLEIBT ============ */
const spendenNachher = await roh(CREW, "/workspace/api/spenden", { keks: k.admin });
ok(dogenVorher > 0 && letzteVorher > 0,
`es gab vorher etwas zu verlieren (${dogenVorher} Staende, `
+ `${letzteVorher} Spenden)`);
ok(dogenVorher > 0 && (spendenNachher.j?.staende?.length || 0) === dogenVorher,
`die Dogen der Leute sind unberuehrt (${dogenVorher} Staende)`);
ok(letzteVorher > 0 && (spendenNachher.j?.letzte?.length || 0) === letzteVorher,
`und die Spenden auch (${letzteVorher} gezeigte)`);
const chat = await roh(CREW, "/workspace/api/reaktion/chat", { keks: k.admin });
ok((chat.j?.beitraege || []).some((b) => b.text === "Der bleibt stehen"),
`der Chatverlauf steht noch (${chat.j?.beitraege?.length} Beitraege)`);
/* ---- NICHT WAEHREND EINER SENDUNG ----
Mitten im Live zurueckzusetzen zieht allen das Video unter den
Fuessen weg -- und zwar ohne Rueckweg. */
await roh(CREW, "/workspace/api/reaktion", {
method: "PUT", keks: k.admin, rumpf: { titel: "Laeuft", video: "dQw4w9WgXcQ" },
});
await roh(CREW, "/workspace/api/reaktion/stand", {
method: "POST", keks: k.admin, rumpf: { stand: "live" },
});
const imLive = await roh(CREW, "/workspace/api/reaktion/zuruecksetzen", {
method: "POST", keks: k.admin,
});
ok(imLive.code === 409 && imLive.j?.fehler === "laeuft_noch",
`waehrend der Sendung wird abgelehnt (${imLive.code})`);
const nochDa = await roh(CREW, "/workspace/api/reaktion", { keks: k.admin });
ok(nochDa.j?.titel === "Laeuft",
"und es ist dabei auch wirklich nichts passiert");
/* ---- UND NUR DER HOST ---- */
const fremd = await roh(CREW, "/workspace/api/reaktion/zuruecksetzen", {
method: "POST", keks: k.modi,
});
ok(fremd.code === 403, `ein Modi setzt nichts zurueck (${fremd.code})`);
/* ---- DER KNOPF SAGT VORHER, WAS ER TUT ----
Ein „Bist du sicher?" ohne die Liste ist keine Frage, sondern
eine Huerde: Man klickt sie weg und erfaehrt erst danach, was
fehlt. */
{
const html = readFileSync(join(HIER, "..", "workspace", "reaktion.html"), "utf8");
const js = readFileSync(join(HIER, "..", "workspace", "assets", "js", "reaktion.js"), "utf8");
ok(html.includes('id="p-zuruecksetzen"'), "es gibt den Knopf");
ok(/frageNach\(\{[\s\S]{0,600}?bleibt:/.test(js),
"und er sagt vorher, was BLEIBT -- nicht nur, was verschwindet");
ok(/Spenden[\s\S]{0,80}Dogen[\s\S]{0,120}unberührt/.test(js),
"und nennt Spenden und Dogen dabei ausdruecklich");
ok(/p-zuruecksetzen'\)\.disabled = laeuftGerade/.test(js),
"im Live ist er grau");
}
await roh(CREW, "/workspace/api/reaktion/stand", {
method: "POST", keks: k.admin, rumpf: { stand: "live" },
});
}
melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
+72 -9
View File
@@ -670,22 +670,74 @@ melde("=== 9. Dogen, eigener Text und Punkte ===");
}
return raus;
};
for (const [wer, keks] of [["die Leitung", k.admin], ["ein Zuschauer", k.gast]]) {
/* ==== ZWEI AUSNAHMEN, UND NUR DIESE ZWEI =====================
Am 28.09. stand hier „kein Geldfeld, fuer niemanden". Das war
fuer alles richtig, was ANZEIGE ist -- und falsch fuer die eine
Stelle, an der jemand KAUFT. Filipe: „die leute sollen nur
sehen was dogen kosten. sonst wissen die ja nicht wie viel es
kosten wird."
Erlaubt sind jetzt GENAU zwei Dinge, und die Pruefung nennt sie
beim Namen statt die Regel aufzuweichen:
`knoepfe[].cent` fuer alle -- der Preis am Kaufknopf
`kurs_cent_je_doge` nur fuer die Leitung
Alles andere bleibt verboten. Eine Ausnahmeliste, die man
aufzaehlen kann, ist eine Regel; „irgendwo darf Geld stehen"
waere keine. */
const ERLAUBT = new Set(["cent", "kurs_cent_je_doge"]);
for (const [wer, keks, kursErlaubt] of [
["die Leitung", k.admin, true],
["ein Zuschauer", k.gast, false],
]) {
const a = await roh(CREW, "/workspace/api/spenden", { keks });
const felder = namen(a.j);
const geld = [...felder].filter((n) => /cent|waehrung|euro|eur$/i.test(n));
const geld = [...felder].filter((n) => /cent|waehrung|euro|eur$/i.test(n))
.filter((n) => !ERLAUBT.has(n));
ok(geld.length === 0,
geld.length ? `GELD IM STAND (${wer}): ${geld.join(", ")}`
: `kein Geldfeld im Stand (${wer}, ${felder.size} Felder)`);
geld.length ? `UNERLAUBTES GELDFELD (${wer}): ${geld.join(", ")}`
: `kein unerlaubtes Geldfeld im Stand (${wer}, ${felder.size} Felder)`);
ok(felder.has("dogen_max_mille") && felder.has("gruss_max"),
"und die Grenzen stehen als Dogen und Zeichen darin");
/* Ein Eurozeichen darf nirgends stehen -- auch nicht in einem
Text, den irgendwer einmal eingetippt hat. */
ok(!JSON.stringify(a.j).includes("€"), `kein Eurozeichen (${wer})`);
/* ---- Der Preis steht am Kaufknopf -- fuer alle ---- */
const knopf = a.j?.knoepfe?.[0];
ok(typeof knopf?.cent === "number" && knopf.cent > 0,
`der Preis steht am Knopf (${wer}: ${knopf?.cent} Cent)`);
/* ---- Und der Kurs nur bei der Leitung ----
Er ist der Generalschluessel: Wer ihn hat, kann JEDEN
Dogenwert in Geld umrechnen. Genau deshalb steckt die
Erlaubnis in den Daten und nicht in einem `if` der
Oberflaeche -- eine fehlende Zahl kann man nicht vergessen. */
const kurs = a.j?.kurs_cent_je_doge;
ok(kursErlaubt ? typeof kurs === "number" && kurs > 0 : kurs === null,
`der Kurs ${kursErlaubt ? "kommt mit" : "bleibt weg"} (${wer}: ${kurs})`);
/* Ausser an den Knoepfen darf nirgends ein Eurozeichen stehen --
auch nicht in einem Text, den jemand eingetippt hat. */
const ohneKnoepfe = { ...a.j, knoepfe: undefined };
ok(!JSON.stringify(ohneKnoepfe).includes("€"), `kein Eurozeichen (${wer})`);
}
ok([...namen({ a: [{ betrag_cent: 1 }] })].includes("betrag_cent"),
"Gegenprobe: ein Geldfeld wuerde gefunden");
/* ==== DIE KARTE TRAEGT WEITERHIN KEINEN CENT ==================
Sie geht auch an die Buehnentafel, und die steht im Stream. Ein
Betrag, der dort ankommt, waere Geld im Bild -- genau das, was
nirgends stehen soll. Der Preis gehoert an den Kaufknopf und
nirgendwo sonst. */
{
const probe = await roh(CREW, "/workspace/api/spenden/probe", {
method: "POST", keks: k.admin, rumpf: { dogen_mille: 500 },
});
const felder = namen(probe.j?.karte);
const geld = [...felder].filter((n) => /cent|waehrung|euro|eur$/i.test(n));
ok(geld.length === 0,
geld.length ? `GELD AUF DER KARTE: ${geld.join(", ")}`
: `die Karte traegt keinen Betrag (${felder.size} Felder)`);
}
/* ---- DIE KNOEPFE FUEHREN ZU EINEM EURO-BETRAG, ZEIGEN ABER DOGEN ----
Der Euro entsteht erst in der PayPal-Adresse, weil PayPal ihn
braucht. Das ist der einzige Ort, an dem er ueberhaupt noch
@@ -696,8 +748,19 @@ melde("=== 9. Dogen, eigener Text und Punkte ===");
ok(knopf?.mille === KNOEPFE_MILLE[0],
`der erste Knopf steht auf ${knopf?.mille} Tausendsteln`);
ok(knopf?.ziel?.endsWith("EUR"),
`und fuehrt trotzdem zu einer Zahlung (${knopf?.ziel})`);
ok(knopf?.cent === undefined, "der Euro-Betrag selbst kommt nicht mit");
`und fuehrt zu einer Zahlung (${knopf?.ziel})`);
/* ==== UND DER PREIS STEHT DABEI ============================
Hier stand bis zum 28.09. das Gegenteil: „der Euro-Betrag
selbst kommt nicht mit". Das war die Regel „nie Geld", bis
eine Stelle ihr widersprach -- die einzige, an der jemand
BEZAHLT. Wer auf „0,2 Dogen" drueckt, muss vorher wissen,
dass ihn das zwei Euro kostet; den Preis erst auf der
Zahlseite zu erfahren ist keiner.
Die Zahl muss zur Adresse PASSEN -- sonst steht am Knopf ein
Preis und bei PayPal ein anderer, und das merkt niemand
vorher. */
ok(knopf?.cent === milleInCent(knopf?.mille),
`und der Preis dazu (${knopf?.cent} Cent) passt zur Zahlung`);
}
/* ---- DER TEXT KOMMT VON DEM, DER GIBT ---- */
+10
View File
@@ -360,6 +360,16 @@ export function reaktionTabellen(d) {
}
const dabei = new Set(
d.prepare("PRAGMA table_info(reaktion_dabei)").all().map((z) => z.name));
if (!dabei.has("bildschirm")) {
/* WER GERADE SEINEN BILDSCHIRM TEILT.
Es ist eine eigene Spalte und nicht „kamera_aus umgedreht":
Beim Teilen geht ein Bild hinaus, es ist nur ein anderes. Wer
beides in eine Spalte legte, koennte nachher nicht mehr
sagen, ob da ein schwarzes Fenster steht oder ein
Schreibtisch. */
d.exec("ALTER TABLE reaktion_dabei ADD COLUMN bildschirm INTEGER NOT NULL DEFAULT 0");
console.log("[reaktion] Spalte bildschirm angelegt.");
}
if (!dabei.has("kamera_aus")) {
/* Wer sein Bild gerade abgeschaltet hat.
AN DIESER TABELLE UND NICHT AN DEN GAESTEN: Hier steht, wer
+83 -2
View File
@@ -220,7 +220,7 @@ function dabeiListe() {
const grenze = new Date(Date.now() - 120_000).toISOString();
db().prepare("DELETE FROM reaktion_dabei WHERE gesehen < ?").run(grenze);
return db().prepare(`
SELECT d.person_id AS id, d.sicht, d.seit, d.kamera_aus, d.mikro_aus,
SELECT d.person_id AS id, d.sicht, d.seit, d.kamera_aus, d.mikro_aus, d.bildschirm,
p.name, p.rolle
FROM reaktion_dabei d JOIN personen p ON p.id = d.person_id
ORDER BY d.seit`).all();
@@ -277,13 +277,24 @@ function lage(person) {
const p = db().prepare("SELECT id, name, rolle FROM personen WHERE id = ?").get(s.host_id);
if (!p) return null;
const z = dabei.find((d) => d.id === p.id);
return { ...p, kamera_aus: !!z?.kamera_aus, mikro_aus: !!z?.mikro_aus };
return {
...p,
kamera_aus: !!z?.kamera_aus,
mikro_aus: !!z?.mikro_aus,
bildschirm: !!z?.bildschirm,
};
})()
: null,
gaeste: gaeste.map((g) => ({
id: g.id, name: g.name, rolle: g.rolle, stumm: !!g.stumm, platz: g.platz,
kamera_aus: !!(dabei.find((d) => d.id === g.id)?.kamera_aus),
mikro_aus: !!(dabei.find((d) => d.id === g.id)?.mikro_aus),
/* WER TEILT, MUSS ERKENNBAR SEIN. Ohne diese Auskunft waere
ein geteilter Bildschirm ein Kamerafenster, in dem ploetzlich
ein Schreibtisch steht -- und das Fenster wuerde ihn
beschneiden, weil eine Kamera hochkant zugeschnitten wird
und ein Bildschirm nicht. */
bildschirm: !!(dabei.find((d) => d.id === g.id)?.bildschirm),
})),
chat_modus: s.chat_modus || "offen",
chat_modi: CHAT_MODI,
@@ -336,6 +347,7 @@ function lage(person) {
moderiert: MODERIERT.has(person.rolle),
sicht: !!(dabei.find((d) => d.id === person.id)?.sicht),
kamera_aus: !!(dabei.find((d) => d.id === person.id)?.kamera_aus),
bildschirm: !!(dabei.find((d) => d.id === person.id)?.bildschirm),
mikro_aus: !!(dabei.find((d) => d.id === person.id)?.mikro_aus),
darf_schreiben: darfSchreiben(person, s),
/* Der Grund steht daneben -- die Seite muss ihn nicht raten. */
@@ -462,6 +474,72 @@ reaktionRouter.get("/workspace/api/reaktion", (req, res) => {
}
});
/* ======================================================================
ALLES ZURUECKSETZEN
Filipe: „brauch ich auch noch einen button wo ich alles easy
zuruecksetzen kann."
---------------------------------------------------------------------
DER SCHREIBTISCH, NICHT DAS GEDAECHTNIS
Geleert wird, was zur naechsten Sendung gehoert: Titel, Video,
zweites Video, Vorschaubild, Beginn, Warteschlange, Gaesteliste --
und das Bild geht auf seine Vorgaben zurueck.
NICHT ANGETASTET wird, was Menschen getan haben: Spenden, die
Dogen der Leute, der Chatverlauf, die Massnahmen der Moderation.
Eine bezahlte Spende aus den Buechern zu nehmen waere eine
Faelschung; eine stillschweigend aufgehobene Sperre waere eine
Entscheidung, die niemand getroffen hat. „Alles" heisst hier
„alles, was ich selbst eingetragen habe".
NICHT WAEHREND EINER SENDUNG. Mitten im Live zurueckzusetzen
zieht allen das Video unter den Fuessen weg -- und zwar ohne dass
es rueckgaengig zu machen waere.
====================================================================== */
reaktionRouter.post("/workspace/api/reaktion/zuruecksetzen", nurHost, (req, res) => {
try {
const s = sendung();
if (s.stand === "live") return res.status(409).json({ fehler: "laeuft_noch" });
db().exec("BEGIN IMMEDIATE");
try {
/* DIE SPALTEN STEHEN EINZELN DA UND NICHT ALS „alles ausser".
Eine Liste von Ausnahmen waechst still mit jeder neuen
Spalte mit -- und dann loescht das Zuruecksetzen etwas, das
es nie loeschen sollte. Was hier fehlt, bleibt stehen, und
das ist die sichere Richtung. */
db().prepare(`UPDATE reaktion SET
stand = 'zu', titel = '', video = '', video_titel = '', vorschau = '',
beginnt_am = NULL, laeuft = 0, sekunde = 0, tempo = 1,
layout = 'kino', kamera_gross = 1, kamera_ecke = 'ur',
chat_modus = 'offen',
zweit_video = '', zweit_titel = '', zweit_sekunde = 0,
gestartet_am = NULL, stand_seit = ?, geaendert = ?
WHERE id = 1`).run(jetzt(), jetzt());
db().prepare("DELETE FROM reaktion_liste").run();
db().prepare("DELETE FROM reaktion_gaeste").run();
db().exec("COMMIT");
} catch (f) {
db().exec("ROLLBACK");
throw f;
}
protokolliere("reaktion_zurueckgesetzt", {
personId: req.person.id,
detail: "Pult geleert (Spenden, Dogen, Chat und Massnahmen unberuehrt)",
ip: echteIp(req),
});
const l = lage(req.person);
melden("reaktion", { was: "stand", lage: oeffentlich(l) });
res.json(l);
} catch (fehler) {
console.error("[reaktion] Zuruecksetzen:", fehler?.message);
res.status(503).json({ fehler: "nicht_verfuegbar" });
}
});
/** Der Host stellt ein: Titel, Video, Vorschaubild, Beginn. */
reaktionRouter.put("/workspace/api/reaktion", nurHost, express.json({ limit: "32kb" }),
async (req, res) => {
@@ -1226,6 +1304,9 @@ reaktionRouter.post("/workspace/api/reaktion/senden", express.json({ limit: "2kb
if (req.body?.mikro_aus !== undefined) {
felder.push("mikro_aus = ?"); werte.push(req.body.mikro_aus ? 1 : 0);
}
if (req.body?.bildschirm !== undefined) {
felder.push("bildschirm = ?"); werte.push(req.body.bildschirm ? 1 : 0);
}
if (!felder.length) return res.status(400).json({ fehler: "nichts_zu_tun" });
const geschrieben = db().prepare(
+33 -6
View File
@@ -45,7 +45,7 @@ import {
BETRAG_MAX_CENT, NAME_MAX, GRUSS_MAX, KNOEPFE_MILLE, SPENDEN_TAGE,
VORLAGEN, STUFEN_MAX, DAUER_MS_MIN, DAUER_MS_MAX,
GROESSE_MIN, GROESSE_MAX, BILD_MAX_BYTES,
centInMille, milleInCent, ZEICHEN_NAME,
centInMille, milleInCent, ZEICHEN_NAME, CENT_JE_DOGE,
DOGEN_SAETZE, DOGEN_STUFEN, SATZ_NAME, muenzeAdresse,
} from "./spenden-tabellen.js";
@@ -443,12 +443,22 @@ spendenRouter.get("/workspace/api/spenden", (req, res) => {
try {
const pp = paypalAdresse();
const darf = GELD_ROLLEN.has(req.person.rolle);
/* DER EURO ENTSTEHT ERST IN DER ADRESSE. `mitBetrag` braucht
ihn, weil PayPal ihn braucht -- an den Browser geht nur die
fertige Adresse und die Zahl in Dogen. */
/* ==== HIER DARF DER PREIS STEHEN -- UND NUR HIER ===========
Filipe: „die leute sollen nur sehen was dogen kosten. sonst
wissen die ja nicht wie viel es kosten wird."
Das ist die eine Stelle, an der jemand KAUFT. Wer auf „0,2
Dogen" drueckt, muss vorher wissen, dass ihn das zwei Euro
kostet. Ueberall sonst ist Geld eine Anzeige, hier ist es ein
Preis -- und ein Preis, den man erst auf der Zahlseite
erfaehrt, ist keiner. */
const knoepfe = pp
? KNOEPFE_MILLE.map((m) => ({ mille: m, ziel: mitBetrag(pp.ziel, milleInCent(m)) }))
.filter((k) => k.ziel)
? KNOEPFE_MILLE.map((m) => ({
mille: m,
cent: milleInCent(m),
ziel: mitBetrag(pp.ziel, milleInCent(m)),
})).filter((k) => k.ziel)
: [];
res.json({
paypal: pp ? { ziel: pp.ziel, knopf: pp.knopf } : null,
@@ -475,6 +485,23 @@ spendenRouter.get("/workspace/api/spenden", (req, res) => {
groesse_min: GROESSE_MIN, groesse_max: GROESSE_MAX,
bild_max_mb: Math.round(BILD_MAX_BYTES / 1024 / 1024),
},
/* ==== DER KURS GEHT NUR AN DIE LEITUNG ==================
Filipe: „damit ich auch immer weiss was es ist. aber nur
ich."
Mit dieser einen Zahl kann die Oberflaeche jeden Dogenwert
in Geld umrechnen -- an der Stufenleiter, beim Eintragen,
in den Listen. Ein Zuschauer bekommt sie nicht: Fuer ihn
ist der Preis an den Knoepfen die ganze Auskunft, die er
braucht, und alles darueber hinaus waere Geld auf dem
Bildschirm ohne Anlass.
EINE ZAHL UND NICHT DREISSIG EINZELUMRECHNUNGEN. Wer je
Zeile einen Cent mitschickt, hat dreissig Gelegenheiten,
eine zu vergessen -- und dann steht an einer Stelle ein
Preis von gestern. */
kurs_cent_je_doge: darf ? CENT_JE_DOGE : null,
/* Die Grenzen fuer die Felder -- in Dogen und in Zeichen. Sie
kommen vom Server, damit nicht zwei Zahlen dieselbe Frage
beantworten und eine davon veraltet. */
+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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<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=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/anruf-probe.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609281932",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609282002",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609281932",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609282002",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609281932",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609282002",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609281932",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609282002",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+264 -12
View File
@@ -465,6 +465,36 @@
display: block;
background: #0b0a12;
}
/* ==== EIN GETEILTER BILDSCHIRM WIRD NICHT ZUGESCHNITTEN ============
Filipe: „waere es nicht einfach eine bildschirm uebertragung zu
installieren?"
`cover` ist fuer ein Gesicht richtig: Es fuellt den Rahmen, und
was an den Seiten fehlt, fehlt niemandem. Bei einem Bildschirm
faellt genau das weg, worum es geht -- 16:9 in einem 4:3-Fenster
verliert links und rechts je ein Achtel, und dort steht die
Werkzeugleiste.
`contain` UND EIN SCHWARZER GRUND. Die schwarzen Streifen sind
kein Schoenheitsfehler, sondern die einzige Art, ein Bild ganz zu
zeigen, dessen Form man nicht kennt.
UND DAS SEITENVERHAELTNIS GEHT AUF 16:9. Ein Bildschirm ist fast
nie 4:3; das Fenster passt sich an, statt den Rahmen mit Schwarz
zu fuellen. */
.kamera[data-bildschirm="ja"] { aspect-ratio: 16 / 9; }
.kamera[data-bildschirm="ja"] video {
object-fit: contain;
background: #000;
}
/* Ein Schild, damit niemand ein stehendes Bild fuer eine
eingefrorene Kamera haelt. */
.kamera[data-bildschirm="ja"] .kamera__name::before {
content: "Bildschirm · ";
color: var(--schrift-leise);
}
.kamera__name {
position: absolute; left: 8px; bottom: 8px;
padding: 3px 9px 4px;
@@ -972,6 +1002,42 @@
background: linear-gradient(180deg, #7de2a8, #47c97f);
box-shadow: 0 10px 22px -14px #47c97f;
}
/* ==== DER PREIS AM KAUFKNOPF ======================================
Filipe: „die leute sollen nur sehen was dogen kosten. sonst wissen
die ja nicht wie viel es kosten wird."
Klein und ruhig UNTER der Dogenzahl. Die Dogen sind die Waehrung
des Hauses, der Preis ist die Auskunft dazu -- andersherum waere
es ein Geldknopf mit Dogen als Beiwerk. Die Farbe ist dieselbe wie
der Knopftext, nur schwaecher: Ein zweiter Farbton auf einem Knopf
von 44 Pixeln ist einer zu viel. */
.geben__preis {
display: block;
margin-top: 1px;
font-size: .72rem; font-weight: 700;
font-variant-numeric: tabular-nums;
opacity: .62;
}
/* ==== UND DIE UMRECHNUNG FUER DIE LEITUNG =========================
Filipe: „damit ich auch immer weiss was es ist. aber nur ich."
Sie steht ueberall, wo er eine Dogenzahl EINTRAEGT oder PRUEFT --
an der Stufenleiter, beim Eintragen, in den Listen. Immer leise:
Sie ist die Nebenauskunft, nicht die Zahl, um die es geht.
Es gibt sie nur, wenn der Server den Kurs mitgeschickt hat -- und
den bekommt nur die Leitung. Ein Zuschauer sieht diese Klasse nie,
weil die Zeichenkette leer bleibt und `if (preis)` sie gar nicht
erst anlegt. */
.preis {
font-size: .72rem; font-weight: 600;
font-variant-numeric: tabular-nums;
color: var(--schrift-leise);
letter-spacing: 0; text-transform: none;
}
.preis--unter { display: block; margin-top: 1px; }
.geben__frei {
justify-self: start;
min-height: 34px; display: inline-flex; align-items: center;
@@ -1484,6 +1550,114 @@
und was dort passiert, passiert nur bei einem selbst, waehrend
alle anderen weiterlaufen.
--------------------------------------------------------------------- */
/* =====================================================================
DER REGIEPLATZ (28.09.2026)
Filipe: „kann das nicht bissl aufgeteilt sein auf links und rechts
und eine barre unten in der mitte. kannst du das nicht hoch
professionell machen und hochwertig vom aussehen?"
---------------------------------------------------------------------
DIE TEILUNG FOLGT DEM, WAS WANN GEBRAUCHT WIRD
LINKS Was läuft. Das liest man, man tippt es nicht.
RECHTS Was eingetragen wird. Das tippt man VOR der Sendung.
UNTEN Der Transport. Den fasst man WÄHREND der Sendung an --
und er liegt deshalb immer an derselben Stelle, über
die ganze Breite.
Vorher stand alles in einem Stapel untereinander, und wer im Live
an den Play-Knopf wollte, musste an den Eingabefeldern
vorbeiscrollen. Scrollen ist mitten in einer Sendung ein Griff
daneben.
`minmax(0, 1fr)` UND NICHT `1fr`: Ein langer Videotitel würde die
Spalte sonst aufziehen, statt abgeschnitten zu werden -- und dann
läuft die rechte Seite aus dem Pult. Dieselbe Falle wie bei den
Saalzeilen am selben Tag.
===================================================================== */
.regieplatz {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
grid-template-areas:
"links rechts"
"leiste leiste";
gap: 16px 20px;
align-items: start;
}
.regieplatz__seite { grid-area: links; display: grid; gap: 10px; align-content: start; }
.regieplatz__seite--rechts {
grid-area: rechts;
/* Eine ruhige Linie statt eines Kastens. Zwei Kästen nebeneinander
wären zwei Rahmen mehr auf einer Fläche, die ohnehin voll ist. */
border-left: 1px solid var(--rand);
padding-left: 20px;
}
.regieplatz__ueber {
margin: 0;
/* .72rem und nicht .68: 11,52 px ist die Untergrenze des Hauses,
10,88 waere darunter. Die Zahl ist nicht Geschmack -- sie steht
in `pruef-css-klassen`, und genau dort ist diese Zeile
aufgefallen. */
font-size: .72rem; font-weight: 800;
letter-spacing: .14em; text-transform: uppercase;
color: var(--schrift-leise);
}
/* ---- Die Transportleiste --------------------------------------------
Aufgebaut wie jeder Videospieler, den man kennt: Schiene über die
ganze Breite, darunter eine Reihe mit dem Transport in der MITTE.
Eine Anordnung, die man schon kennt, muss man nicht lernen.
Sie ist die einzige Fläche im Pult mit eigenem Grund -- weil sie
die einzige ist, die im Live gebraucht wird. */
.transport {
grid-area: leiste;
display: grid; gap: 10px;
padding: 12px 14px 13px;
border-radius: 15px;
border: 1px solid var(--rand-hell);
/* ==== SIE KLEBT UNTEN ==========================================
GEMESSEN, NICHT VERMUTET: Beim ersten Bau lag die Leiste bei
y=986 in einem 900 Pixel hohen Fenster -- unter dem Falz. Wer im
Live an den Play-Knopf wollte, haette also scrollen muessen, und
genau davon sollte der Umbau wegfuehren. Die Rechnung ging auf
(links, rechts, Leiste darunter), und das Ergebnis war trotzdem
falsch.
`sticky` loest beides auf einmal: Sie steht unten -- wie Filipe
es wollte -- und bleibt dabei immer sichtbar. Sie ist die
LETZTE Zeile des Rasters, also verdeckt sie nichts: Unter ihr
kommt nichts mehr.
Der Grund muss dafuer DICHT sein. Eine halbdurchsichtige Leiste,
durch die Text scrollt, ist genau die Art Flaeche, auf der man
sich im Live verliest. */
position: sticky;
bottom: 0;
z-index: 3;
background:
linear-gradient(180deg, rgba(23, 20, 34, .95), rgba(15, 13, 24, .98));
backdrop-filter: blur(12px) saturate(1.1);
-webkit-backdrop-filter: blur(12px) saturate(1.1);
box-shadow: 0 -14px 26px -22px #000, inset 0 1px 0 rgba(255, 255, 255, .06);
}
.transport__schiene { display: flex; align-items: center; gap: 12px; }
.transport__schiene .spur__schiene { flex: 1 1 auto; min-width: 0; }
.transport__reihe {
display: grid;
/* Drei gleich breite Teile -- nur so steht der Transport wirklich
in der Mitte und nicht dort, wo die Nachbarn gerade Platz
lassen. */
grid-template-columns: 1fr auto 1fr;
align-items: center;
gap: 10px;
}
.transport__teil { display: flex; align-items: center; gap: 8px; min-width: 0; }
.transport__teil--mitte { justify-content: center; gap: 10px; }
.transport__teil--rechts { justify-content: flex-end; }
.spur {
display: grid; gap: 11px;
padding: 13px 14px 14px;
@@ -1521,7 +1695,6 @@
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
font-size: .82rem;
}
.spur__band { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.spur__knopf {
appearance: none; cursor: pointer;
min-height: 40px; min-width: 44px; padding: 0 12px;
@@ -1533,11 +1706,18 @@
font-variant-numeric: tabular-nums;
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
}
/* DER PLAY-KNOPF IST DER GROESSTE KNOPF DES HAUSES -- und das ist
kein Geschmack: Er ist der einzige, den man mitten in einer
Sendung blind treffen muss. Rund, damit er sich schon in der
Form von allen anderen unterscheidet. */
.spur__knopf--gross {
min-width: 52px;
background: rgba(255, 255, 255, .1);
min-width: 58px; min-height: 58px;
border-radius: 50%;
background: rgba(255, 255, 255, .12);
border-color: var(--rand-hell);
}
.spur__knopf--gross svg { width: 18px; height: 18px; fill: currentColor; }
.spur__knopf--gross:hover { background: rgba(255, 255, 255, .17); }
.spur__knopf--gross svg { width: 22px; height: 22px; fill: currentColor; }
.spur__knopf--weiter {
border-color: rgba(154, 183, 255, .34);
background: rgba(154, 183, 255, .12);
@@ -1551,7 +1731,11 @@
border-color: rgba(224, 161, 58, .36);
background: rgba(224, 161, 58, .13);
color: #f0cf9a;
max-width: 24rem;
/* Er steht seit dem 28.09. in der linken Spalte und nicht mehr in
einer eigenen Reihe: Dort ist die Breite der Spalte die Grenze,
nicht eine Zahl, die man beim naechsten Umbau vergisst. */
max-width: 100%;
justify-content: flex-start;
overflow: hidden;
}
.spur__knopf--tausch span {
@@ -1562,13 +1746,11 @@
/* ---- Geschwindigkeit ----
Eine Reihe kleiner Schalter, kein Schieberegler: Es gibt sechs
erlaubte Werte, und ein Regler, der zwischen ihnen einrastet, wäre
eine Bedienung, die etwas vortäuscht, das sie nicht kann. */
.spur__mehr {
display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
margin-top: 9px;
padding-top: 9px;
border-top: 1px solid var(--rand);
}
eine Bedienung, die etwas vortäuscht, das sie nicht kann.
Sie steht LINKS in der Transportleiste und nicht neben dem
Play-Knopf: Sie wird selten angefasst, und im Live fasst man in
die Mitte. */
.tempo { display: flex; gap: 4px; flex-wrap: wrap; }
.tempo__knopf {
appearance: none; cursor: pointer;
@@ -1998,6 +2180,17 @@
Element gedeckt ist, und hat den Eckwähler zu Recht gemeldet,
solange dort nur eine feste Höhe stand. Eine feste Höhe sagt
„genau so groß"; die Regel will wissen „mindestens so groß". */
/* Der Teilen-Knopf in der Senderleiste: gedrueckt heisst hier
„teilt gerade" und nicht „ist aus" -- deshalb leuchtet er, statt
durchgestrichen zu sein. */
#s-teilen[aria-pressed="true"] {
border-color: rgba(125, 226, 168, .5);
background: rgba(125, 226, 168, .16);
color: #9ff0c2;
}
#s-teilen svg { fill: none; stroke: currentColor; stroke-width: 1.7; }
.sender-knopf[disabled] { opacity: .4; cursor: default; }
@media (pointer: coarse) {
.kamgroesse__knopf { min-height: 44px; }
.kamecke__knopf { min-height: 44px; min-width: 52px; height: 44px; width: 52px; }
@@ -2063,6 +2256,39 @@
font-size: .72rem; font-weight: 700;
color: var(--schrift-leise); letter-spacing: .04em;
}
/* ==== DER HAUPTKNOPF EINER ZEILE ===================================
`knopf-still--haupt` stand schon an „Übernehmen" bei den Stufen --
und war NIRGENDS gestaltet. Eine Klasse, die kein Stilblatt kennt,
ist stille Absicht ohne Wirkung: Sie sieht im Quelltext aus, als
sei etwas hervorgehoben, und auf dem Bildschirm ist es das nicht.
Gefunden beim Nachsehen, ob es sie gibt, bevor ich sie ein zweites
Mal benutze.
Dieselben Werte wie „Nächstes" in der Transportleiste: Ein Haus,
in dem die wichtige Handlung zweimal verschieden aussieht, hat
keine wichtige Handlung. */
.knopf-still--haupt {
border-color: rgba(154, 183, 255, .34);
background: rgba(154, 183, 255, .12);
color: #cfe0ff;
}
/* Ein Knopf, der gebraucht wird, aber nicht gesucht: leise Farbe,
und im Live grau. Rot waere er erst, wenn er etwas zerstoeren
koennte -- er leert nur den Schreibtisch. */
.knopf-still--leise {
border-color: var(--rand);
background: none;
color: var(--schrift-leise);
}
.knopf-still--leise:hover:not([disabled]) {
color: var(--an-hell);
border-color: rgba(216, 64, 74, .35);
background: rgba(216, 64, 74, .1);
}
.knopf-still--leise[disabled] { opacity: .4; cursor: default; }
.pult__zeile--ende { margin-top: 4px; align-items: center; }
.pult__feld select {
min-height: 44px; padding: 0 10px;
border-radius: 11px;
@@ -2089,6 +2315,32 @@
Grund, warum jemand hier ist.
===================================================================== */
@media (max-width: 860px) {
/* ==== AM HANDY WIRD AUS LINKS UND RECHTS EIN STAPEL ==========
Zwei Spalten auf 390 px waeren zwei Spalten mit je 180 px -- da
passt kein Videotitel hinein und kein Datumsfeld. Die
Transportleiste bleibt, wo sie ist: ganz unten, ueber die
ganze Breite. Sie ist das, was man im Live anfasst, und das
aendert sich mit der Bildschirmbreite nicht. */
.regieplatz {
grid-template-columns: minmax(0, 1fr);
grid-template-areas: "links" "rechts" "leiste";
gap: 14px;
}
.regieplatz__seite--rechts {
border-left: 0;
border-top: 1px solid var(--rand);
padding-left: 0;
padding-top: 14px;
}
/* Die drei gleich breiten Teile der Leiste gehen auf; uebrig
bleibt: Transport in der Mitte, alles andere darunter. */
.transport__reihe {
grid-template-columns: minmax(0, 1fr);
justify-items: center;
gap: 12px;
}
.transport__teil--rechts { justify-content: center; }
.kino {
grid-template-columns: 1fr;
grid-template-rows: auto 1fr;
+3
View File
@@ -212,6 +212,9 @@
'Es sind schon zwei Gäste dabei. Nimm erst jemanden heraus.',
layout_unbekannt:
'Diese Anordnung gibt es nicht.',
laeuft_noch:
'Die Sendung läuft gerade. Beende sie zuerst — mitten im Live '
+ 'zurückzusetzen würde allen das Video wegnehmen.',
satz_unbekannt:
'Diesen Münzsatz gibt es nicht. Wähl einen aus der Liste — '
+ '„Eigenes Zeichen" geht erst, wenn du eines hochgeladen hast.',
+264 -5
View File
@@ -278,6 +278,11 @@
Ohne diese Beschriftung sind beide ein schwarzes Rechteck,
und man fragt den anderen, ob bei ihm etwas klemmt. */
fenster.dataset.kamera = s.kamera_aus ? 'aus' : 'an';
/* EIN BILDSCHIRM WIRD NICHT ZUGESCHNITTEN. Ein Kamerafenster
steht auf `object-fit: cover` -- richtig fuer ein Gesicht,
falsch fuer einen Schreibtisch: Dort faellt genau das weg,
worum es geht. Das Stilblatt schaltet daran auf `contain`. */
fenster.dataset.bildschirm = s.bildschirm ? 'ja' : 'nein';
/* `stumm` setzt der Host fuer alle, `mikro_aus` der Mensch fuer
sich. Beides sieht man dem Fenster an, und beides heisst
dasselbe: von hier kommt gerade kein Ton. */
@@ -291,8 +296,13 @@
}
const draht = drähte.get(s.id);
const v = fenster.querySelector('video');
if (s.id === meineId && meinStrom && v.srcObject !== meinStrom) {
v.srcObject = meinStrom;
/* IM EIGENEN FENSTER STEHT, WAS DIE ANDEREN SEHEN. Zeigte es
weiter die Kamera, waehrend der Bildschirm hinausgeht, waere
es die eine Anzeige, der man nicht trauen kann -- und man
merkt es erst, wenn jemand nachfragt. */
const meins = bildschirmStrom || meinStrom;
if (s.id === meineId && meins && v.srcObject !== meins) {
v.srcObject = meins;
v.play().catch(() => { /* stumm darf immer */ });
}
if (draht && draht.strom && v.srcObject !== draht.strom) {
@@ -326,6 +336,31 @@
const mAus = !!lage.ich.mikro_aus;
$('s-kamera').setAttribute('aria-pressed', String(kAus));
$('s-mikro').setAttribute('aria-pressed', String(mAus));
/* ==== DER BILDSCHIRM ==========================================
`aria-pressed` steht hier fuer „teilt gerade" und nicht wie
bei den Nachbarn fuer „ist aus". Das ist kein Bruch, sondern
der Unterschied: Kamera und Mikro schaltet man AB, den
Bildschirm schaltet man AN.
UND DIE KAMERA WIRD DERWEIL GRAU. Solange der Bildschirm
hinausgeht, ist die Bildspur der Leitungen der Bildschirm --
der Kameraknopf haette dann keine Wirkung mehr auf das, was
ankommt. Ein Knopf, der still nichts tut, ist schlimmer als
einer, der nicht da ist. */
const teilt = !!lage.ich.bildschirm;
const knopf = $('s-teilen');
if (knopf) {
knopf.setAttribute('aria-pressed', String(teilt));
knopf.title = teilt
? 'Teilen beenden — dann läuft wieder deine Kamera'
: 'Deinen Bildschirm statt der Kamera zeigen';
$('s-teilen-wort').textContent = teilt ? 'Teilt' : 'Bildschirm';
}
$('s-kamera').disabled = teilt;
$('s-kamera').title = teilt
? 'Solange du den Bildschirm teilst, geht dein Bildschirm hinaus'
: '';
$('s-kamera-wort').textContent = kAus ? 'Kamera an' : 'Kamera';
$('s-mikro-wort').textContent = mAus ? 'Mikro an' : 'Mikro';
$('s-kamera').title = kAus ? 'Bild wieder einschalten' : 'Bild abschalten';
@@ -337,6 +372,146 @@
* ERST DAS GERAET, DANN DIE ANSAGE. Andersherum stuende bei allen
* „Kamera aus", waehrend noch ein Bild fliesst -- und das ist die
* unangenehmere Reihenfolge: Man glaubt, man sei unsichtbar. */
/* =================================================================
DEN BILDSCHIRM TEILEN
Filipe: „waere es nicht einfach eine bildschirm uebertragung zu
installieren und es zu perfektionieren?"
Es ist einfach, weil der Weg schon da ist: Die Kamerabilder
laufen als Direktverbindung von Mensch zu Mensch. Geteilt wird
deshalb nicht NEBEN der Kamera, sondern AN IHRER STELLE --
`replaceTrack` tauscht die Bildspur in jeder bestehenden
Leitung aus, ohne dass eine einzige neu ausgehandelt werden
muss. Eine zweite Spur daneben waere eine zweite Verhandlung je
Zuschauer, und jede davon kann scheitern.
WAS DAMIT NICHT GEHT, STEHT IM REGIEPULT und nicht nur hier:
Netflix, Disney+ und Prime bleiben schwarz (Kopierschutz), und
einen Film weiterzusenden waere eine oeffentliche Wiedergabe.
================================================================= */
let bildschirmStrom = null;
let bildschirmSpur = null;
async function bildschirmSchalten() {
if (bildschirmStrom) { await bildschirmBeenden(); return; }
if (!navigator.mediaDevices?.getDisplayMedia) {
sagFehler('Dieser Browser kann den Bildschirm nicht teilen. '
+ 'Am Handy geht es grundsätzlich nicht — dort gibt es die Funktion nicht.');
return;
}
/* OHNE KAMERA KEINE LEITUNG. Die Verbindungen entstehen aus dem
eigenen Strom; ohne ihn gibt es nichts, worin man tauschen
könnte. */
if (!meinStrom) await kameraHolen();
if (!meinStrom) return;
let strom;
try {
strom = await navigator.mediaDevices.getDisplayMedia({
/* 15 Bilder je Sekunde und höchstens 1280 breit. Ein
Bildschirm ist meist ruhig, und jede Verbindung kostet
den, der teilt, Upload: Bei 12 Zuschauern ist der
Unterschied zwischen „läuft" und „stockt" genau diese
Zahl. Gemessen steht die Grenze im Kopf von
reaktion-tabellen.js. */
video: { frameRate: { ideal: 15, max: 30 }, width: { max: 1280 } },
/* KEIN RECHNERTON. `getDisplayMedia` kann ihn liefern, und
er käme zusätzlich zum Mikrofon heraus -- alles doppelt
und einmal davon verzögert. Der Ton bleibt beim Mikro. */
audio: false,
});
} catch {
/* Abgebrochen ist kein Fehler: Wer im Auswahlfenster
„Abbrechen" drückt, hat sich entschieden. Eine Fehlermeldung
darauf wäre eine Belehrung. */
return;
}
bildschirmStrom = strom;
bildschirmSpur = strom.getVideoTracks()[0] || null;
/* DER BROWSER HAT EINEN EIGENEN STOPP-KNOPF, unten am Rand. Wer
ihn drückt, erwartet, dass alles zurückgeht -- ohne diesen
Zuhörer bliebe die Seite auf „teilt" stehen und sendete ein
totes Bild. */
if (bildschirmSpur) {
bildschirmSpur.addEventListener('ended', () => { bildschirmBeenden(); });
}
await bildSpurTauschen(bildschirmSpur);
await bildschirmMelden(true);
}
async function bildschirmBeenden() {
if (!bildschirmStrom) return;
try { for (const sp of bildschirmStrom.getTracks()) sp.stop(); } catch { /* war schon aus */ }
bildschirmStrom = null;
bildschirmSpur = null;
await bildSpurTauschen(meinStrom ? meinStrom.getVideoTracks()[0] : null);
await bildschirmMelden(false);
}
/** Die Bildspur in JEDER bestehenden Leitung austauschen. */
async function bildSpurTauschen(spur) {
for (const d of drähte.values()) {
const sender = d.pc.getSenders().find((x) => x.track && x.track.kind === 'video');
if (!sender) continue;
try { await sender.replaceTrack(spur); } catch { /* diese Leitung eben nicht */ }
}
kamerasZeichnen();
}
async function bildschirmMelden(an) {
try {
const a = await hole('/workspace/api/reaktion/senden', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ bildschirm: an }),
});
if (a.ok) { lage = { ...(await a.json()) }; zeichnen(); }
} catch { /* die Leitung laeuft trotzdem -- nur das Schild fehlt */ }
}
/* =================================================================
ALLES ZURUECKSETZEN
Filipe: „brauch ich auch noch einen button wo ich alles easy
zuruecksetzen kann."
ZWEI SPALTEN IM DIALOG, und das ist der ganze Punkt: Was geleert
wird, steht neben dem, was bleibt. Ein „Bist du sicher?" ohne
diese Liste ist keine Frage, sondern eine Huerde -- man klickt
sie weg und erfaehrt erst danach, was fehlt.
================================================================= */
async function allesZuruecksetzen() {
if (!window.frageNach) return;
const ja = await window.frageNach({
titel: 'Das Pult zurücksetzen?',
was: 'Titel, Video, zweites Video, Vorschaubild, Beginn, die '
+ 'Warteschlange und die Gästeliste werden geleert. Anordnung, '
+ 'Kameragröße, Ecke, Tempo und der Chatmodus gehen auf ihre '
+ 'Vorgaben zurück.',
bleibt: 'Spenden, die Dogen der Leute, der Chatverlauf und alle '
+ 'Maßnahmen der Moderation bleiben unberührt.',
ja: 'Ja, zurücksetzen',
nein: 'Doch nicht',
endgueltig: true,
});
if (!ja) return;
const a = await hole('/workspace/api/reaktion/zuruecksetzen', { method: 'POST' });
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
lage = { ...(await a.json()) };
zeichnen();
/* DIE FELDER LEERT DER SERVER NICHT -- er kennt sie nicht. Ohne
diese Zeilen stuende der alte Text weiter im Eingabefeld,
waehrend die Sendung leer ist: die eine Anzeige, der man nicht
trauen kann. */
for (const id of ['p-titel', 'p-video', 'p-vorschau', 'p-zweit', 'p-beginn']) {
const e = $(id);
if (e) e.value = '';
}
sagFehler('');
}
async function sendenSchalten(was, aus) {
if (!meinStrom) return;
const spuren = was === 'kamera'
@@ -688,7 +863,18 @@
}
};
if (binSender && meinStrom) {
for (const spur of meinStrom.getTracks()) pc.addTrack(spur, meinStrom);
/* ==== WAS HINAUSGEHT, IST NICHT IMMER DIE KAMERA ==========
Teile ich gerade den Bildschirm, muss auch eine NEUE
Verbindung den Bildschirm bekommen -- sonst sieht jeder, der
waehrenddessen dazukommt, mein Gesicht statt dessen, worum
es geht. Genau das ist die Sorte Fehler, die erst auffaellt,
wenn jemand im Chat fragt, was er sehen soll.
Der Ton kommt weiter vom Mikrofon: `getDisplayMedia` liefert
den Ton des Rechners, und den will hier niemand. */
const bild = bildschirmSpur || meinStrom.getVideoTracks()[0];
const ton = meinStrom.getAudioTracks()[0];
if (bild) pc.addTrack(bild, meinStrom);
if (ton) pc.addTrack(ton, meinStrom);
}
return d;
}
@@ -1683,10 +1869,17 @@
$('zeichen-weg').addEventListener('click', zeichenWeg);
/* ---- Spenden ---- */
$('p-zuruecksetzen').addEventListener('click', allesZuruecksetzen);
$('sp-zeigen').addEventListener('click', spendeEintragen);
$('sp-betrag').addEventListener('keydown', (e) => {
if (e.key === 'Enter') { e.preventDefault(); spendeEintragen(); }
});
/* Beim Tippen mitrechnen: Die Zahl von der Zahlungsmeldung steht
in Euro, eingetragen wird in Dogen -- ohne die Umrechnung
daneben ist jeder Eintrag geraten. */
$('sp-betrag').addEventListener('input', () => {
$('sp-preis').textContent = alsPreis(dogenInMille($('sp-betrag').value));
});
$('v-spiel').addEventListener('click', spielPause);
$('v-zurueck').addEventListener('click', () => springen(-10));
@@ -2161,6 +2354,17 @@
$('p-beenden').disabled = lage.stand === 'zu';
$('p-starten').textContent = lage.video ? 'Auf Sendung' : 'Erst ein Video eintragen';
/* ZURUECKSETZEN GEHT NICHT IM LIVE. Wer mitten in der Sendung
zuruecksetzt, zieht allen das Video unter den Fuessen weg --
und das ist nicht rueckgaengig zu machen. Der Knopf wird grau
und sagt, warum; einer, der verschwindet, laesst einen
suchen. */
const laeuftGerade = lage.stand === 'live';
$('p-zuruecksetzen').disabled = laeuftGerade;
$('zurueck-hinweis').textContent = laeuftGerade
? 'Geht erst, wenn die Sendung beendet ist.'
: 'Leert das Pult — Spenden, Dogen und Chat bleiben.';
for (const k of $('layout-reihe').children) {
k.setAttribute('aria-pressed', String(k.dataset.layout === (lage.layout || 'kino')));
}
@@ -2384,6 +2588,11 @@
const zeile = el('li', 'spendenzeile');
const betrag = el('strong', 'spendenzeile__betrag');
betrag.append(window.Spendenkarte.dogenStueck(k.dogen_mille, k.zeichen));
/* Der Preis daneben -- das ist die Zahl, die in Filipes
Zahlungsmeldung steht. Ohne sie muesste er beim Bestaetigen
im Kopf umrechnen, und das mitten in einer Sendung. */
const preis = alsPreis(k.dogen_mille);
if (preis) betrag.append(el('span', 'preis preis--unter', preis));
zeile.append(betrag);
/* ==== DIE SCHRANKE VOR DEM STREAM =========================
@@ -2435,6 +2644,8 @@
const zeile = el('li', 'spendenzeile');
const betrag = el('strong', 'spendenzeile__betrag');
betrag.append(window.Spendenkarte.dogenStueck(k.dogen_mille, k.zeichen));
const preis = alsPreis(k.dogen_mille);
if (preis) betrag.append(el('span', 'preis preis--unter', preis));
zeile.append(betrag);
const mitte = el('div', 'spendenzeile__mitte');
mitte.append(el('span', 'spendenzeile__wer', k.name || 'Jemand'));
@@ -2465,6 +2676,8 @@
zeile.append(el('span', 'dogenzeile__wer', p.name));
const wert = el('strong', 'dogenzeile__wert');
wert.append(window.Spendenkarte.dogenStueck(p.mille, spendenLage.zeichen));
const preis = alsPreis(p.mille);
if (preis) wert.append(el('span', 'preis preis--unter', preis));
zeile.append(wert);
staende.append(zeile);
}
@@ -2945,8 +3158,27 @@
/* Die Grenze steht in DOGEN — im Feld wie in der Leitung.
Diese Seite kennt keinen anderen Wert mehr. */
zeile.append(feld('Ab Dogen', eingabe('text', milleAlsWort(st.ab_mille),
{ inputMode: 'decimal', className: 'stufe-ab' })));
/* ==== WAS EINE STUFE IN GELD BEDEUTET ==================
Filipe: „da muss ich auch sehen so viel dogen sind so viel
euro. damit ich auch immer weiss was es ist."
Direkt am Feld und nicht in einer Fußzeile: Wer eine Grenze
verschiebt, will im selben Blick sehen, was er verschoben
hat. Die Zahl rechnet beim Tippen mit -- eine Umrechnung,
die erst nach dem Speichern stimmt, kommt zu spät. */
const abFeld = eingabe('text', milleAlsWort(st.ab_mille),
{ inputMode: 'decimal', className: 'stufe-ab' });
const abPreis = el('span', 'preis', alsPreis(st.ab_mille));
abFeld.addEventListener('input', () => {
abPreis.textContent = alsPreis(dogenInMille(abFeld.value));
});
const abKasten = el('label', 'stufe-feld');
const abWort = el('span');
abWort.append(document.createTextNode('Ab Dogen '));
abWort.append(abPreis);
abKasten.append(abWort);
abKasten.append(abFeld);
zeile.append(abKasten);
zeile.append(feld('Name', eingabe('text', st.name,
{ maxLength: 40, className: 'stufe-name' })));
@@ -3228,6 +3460,13 @@
const k = el('a', 'geben__betrag');
k.append(window.Spendenkarte.dogenStueck(b.mille, spendenLage.zeichen,
'dogen--nurzahl'));
/* ==== DER PREIS STEHT AM KNOPF =========================
Filipe: „die leute sollen nur sehen was dogen kosten.
sonst wissen die ja nicht wie viel es kosten wird."
Klein unter der Zahl: Die Dogen sind die Währung des
Hauses, der Preis ist die Auskunft dazu. Andersherum
wäre es ein Geldknopf mit Dogen als Beiwerk. */
if (b.cent) k.append(el('span', 'geben__preis', window.Spendenkarte.alsGeld(b.cent)));
k.href = b.ziel;
k.target = '_blank';
k.rel = 'noopener noreferrer';
@@ -3351,6 +3590,25 @@
return Math.round(zahl * 1000);
}
/** Dogen in Geld — oder nichts.
*
* ==== DIE ERLAUBNIS STECKT IN DEN DATEN, NICHT IN EINEM `if`
*
* Der Kurs kommt nur für die Leitung mit (`kurs_cent_je_doge`).
* Ein Zuschauer hat ihn nicht und kann deshalb GAR KEINEN Preis
* ausrechnen -- auch nicht, wenn eine spätere Zeile es versuchte.
* Eine Abfrage „darf der das sehen?" in der Oberfläche wäre eine
* Regel, die man vergessen kann; eine fehlende Zahl ist eine, die
* man nicht vergessen kann.
*
* Die Kaufknöpfe sind die Ausnahme: Dort schickt der Server den
* Betrag ausdrücklich mit, für jeden. */
function alsPreis(mille) {
const kurs = spendenLage?.kurs_cent_je_doge;
if (!kurs) return '';
return window.Spendenkarte.alsGeld(Math.round((Number(mille) || 0) * kurs / 1000));
}
/** Tausendstel zurück in das, was im Feld steht. */
function milleAlsWort(mille) {
return String((Math.round(Number(mille) || 0) / 1000)).replace('.', ',');
@@ -3412,6 +3670,7 @@
() => sendenSchalten('kamera', !lage.ich.kamera_aus));
$('s-mikro').addEventListener('click',
() => sendenSchalten('mikro', !lage.ich.mikro_aus));
$('s-teilen').addEventListener('click', bildschirmSchalten);
/* Die Chat-Stufe -- nur fuer die zwei */
$('chat-meldungen')?.addEventListener('click', meldungenZeigen);
+26 -1
View File
@@ -105,6 +105,31 @@
}
}
/** Cent als Geld.
*
* ==== WARUM ES DIESE FUNKTION WIEDER GIBT
*
* Am 28.09. flog sie raus: „es soll auch nie geld da stehen
* sondern Dogen." Das war richtig für alles, was ANZEIGE ist --
* Karte, Stream, Chat, Punktestand. Es war falsch für die eine
* Stelle, an der jemand KAUFT: Wer auf „0,2 Dogen" drückt, muss
* vorher wissen, dass ihn das zwei Euro kostet.
*
* Sie formatiert nur. Ob überhaupt ein Betrag da ist, entscheidet
* der Server -- ein Zuschauer bekommt außerhalb der Kaufknöpfe
* keinen. */
function alsGeld(cent) {
const c = Math.round(Number(cent) || 0);
try {
return new Intl.NumberFormat('de-DE', {
style: 'currency', currency: 'EUR',
minimumFractionDigits: c % 100 === 0 ? 0 : 2,
}).format(c / 100);
} catch {
return (c / 100).toFixed(2).replace('.', ',') + ' €';
}
}
/** „Doge" oder „Dogen" — die Einzahl gibt es nur bei genau einem. */
function dogenWort(mille) {
return Math.abs(Math.round(Number(mille) || 0)) === 1000 ? 'Doge' : 'Dogen';
@@ -288,7 +313,7 @@
}
window.Spendenkarte = {
zeigen, alsDogen, dogenWort, dogenStueck, muenzeFuer,
zeigen, alsDogen, dogenWort, dogenStueck, muenzeFuer, alsGeld,
/* „dogen" ist keine Zeichnung, aber eine gueltige Vorlage --
deshalb steht sie hier dabei und nicht in `VORLAGEN`. */
VORLAGEN: ['dogen', ...Object.keys(VORLAGEN)],
+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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -391,22 +391,22 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609281932"></script>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/textform.js?v=202609282002"></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/zuteilung.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/zuteilung.js?v=202609282002" 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=202609281932" defer></script>
<script src="assets/js/aufgaben.js?v=202609281932" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609282002" defer></script>
<script src="assets/js/aufgaben.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -168,15 +168,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/automation.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/automation.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -197,16 +197,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/befinden.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/befinden.js?v=202609282002" defer></script>
</body>
</html>
+22 -22
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -304,19 +304,19 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609281932"></script>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/textform.js?v=202609282002"></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/checkliste.js?v=202609281932" defer></script>
<script src="assets/js/ampel.js?v=202609281932" defer></script>
<script src="assets/js/schulung.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/bereich.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/checkliste.js?v=202609282002" defer></script>
<script src="assets/js/ampel.js?v=202609282002" defer></script>
<script src="assets/js/schulung.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/bereich.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/auskunft.js?v=202609281932" defer></script>
<script src="assets/js/bewerben.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/auskunft.js?v=202609282002" defer></script>
<script src="assets/js/bewerben.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -80,16 +80,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/auskunft.js?v=202609281932" defer></script>
<script src="assets/js/bewerbungen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/auskunft.js?v=202609282002" defer></script>
<script src="assets/js/bewerbungen.js?v=202609282002" defer></script>
</body>
</html>
+1 -1
View File
@@ -59,6 +59,6 @@
</head>
<body>
<div id="platz"></div>
<script src="assets/js/buehne.js?v=202609281932" defer></script>
<script src="assets/js/buehne.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -89,15 +89,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/ki.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/calls.js?v=202609281932" defer></script>
<script src="assets/js/ki.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/calls.js?v=202609282002" defer></script>
</body>
</html>
+20 -20
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -739,24 +739,24 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609281932"></script>
<script src="assets/js/bereiche.js?v=202609282002"></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=202609281932"></script>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932"></script>
<script src="assets/js/glocke.js?v=202609281932"></script>
<script src="assets/js/textform.js?v=202609282002"></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002"></script>
<script src="assets/js/glocke.js?v=202609282002"></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=202609281932"></script>
<script src="assets/js/anruf.js?v=202609282002"></script>
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
@@ -767,8 +767,8 @@
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
auftritt, ist der, den man nie nachstellen kann. -->
<script src="assets/js/bildschau.js?v=202609281932"></script>
<script src="assets/js/chat.js?v=202609281932"></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/bildschau.js?v=202609282002"></script>
<script src="assets/js/chat.js?v=202609282002"></script>
<script src="assets/js/installieren.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/content.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/content.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -179,15 +179,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/checkliste.js?v=202609281932" defer></script>
<script src="assets/js/content.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/checkliste.js?v=202609282002" defer></script>
<script src="assets/js/content.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609282002" />
</head>
<body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/gate.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609281932",
"src": "/assets/img/app-symbole/crew-192.png?v=202609282002",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609281932",
"src": "/assets/img/app-symbole/crew-512.png?v=202609282002",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609281932",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609282002",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609281932",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609282002",
"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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/dateien.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/dateien.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -297,20 +297,20 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" 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=202609281932" defer></script>
<script src="assets/js/entwicklung.js?v=202609281932" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609282002" defer></script>
<script src="assets/js/entwicklung.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -146,14 +146,14 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/hilfe.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/hilfe.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
</head>
<body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/gate.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -383,15 +383,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/kalender.js?v=202609281932" defer></script>
<script src="assets/js/kalender-abo.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/kalender.js?v=202609282002" defer></script>
<script src="assets/js/kalender-abo.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -444,13 +444,13 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609281932"></script>
<script src="assets/js/nachfrage.js?v=202609281932"></script>
<script src="assets/js/wahl.js?v=202609281932"></script>
<script src="assets/js/bereiche.js?v=202609281932"></script>
<script src="assets/js/kopf.js?v=202609281932"></script>
<script src="assets/js/glocke.js?v=202609281932"></script>
<script src="assets/js/leistung.js?v=202609281932"></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002"></script>
<script src="assets/js/nachfrage.js?v=202609282002"></script>
<script src="assets/js/wahl.js?v=202609282002"></script>
<script src="assets/js/bereiche.js?v=202609282002"></script>
<script src="assets/js/kopf.js?v=202609282002"></script>
<script src="assets/js/glocke.js?v=202609282002"></script>
<script src="assets/js/leistung.js?v=202609282002"></script>
<script src="assets/js/installieren.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/material.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/material.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/material.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/material.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/notizen.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/notizen.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -453,14 +453,14 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/personen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/personen.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -214,16 +214,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/steckbrief.js?v=202609281932" defer></script>
<script src="assets/js/profil.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/steckbrief.js?v=202609282002" defer></script>
<script src="assets/js/profil.js?v=202609282002" defer></script>
</body>
</html>
+176 -86
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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start reaktion-seite" data-stand="laedt">
@@ -212,6 +212,22 @@
</svg>
<span id="s-kamera-wort">Kamera</span>
</button>
<!-- ==== DEN BILDSCHIRM TEILEN ==========================
Filipe: „waere es nicht einfach eine bildschirm
uebertragung zu installieren?"
Er geht denselben Weg wie die Kamera — dieselbe
Direktverbindung, nur eine andere Quelle. Deshalb steht
der Knopf auch hier und nicht in einem eigenen
Bereich. -->
<button type="button" class="sender-knopf" id="s-teilen" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3 4.5h18v12H3z" />
<path d="M8 20.5h8" />
<path d="M12 16.5v4" />
</svg>
<span id="s-teilen-wort">Bildschirm</span>
</button>
<button type="button" class="sender-knopf" id="s-mikro" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 3.2a2.6 2.6 0 0 1 2.6 2.6v6a2.6 2.6 0 0 1-5.2 0v-6A2.6 2.6 0 0 1 12 3.2z" />
@@ -403,79 +419,129 @@
<section class="pult-tafel" data-tafel="sendung" role="tabpanel"
id="tafel-sendung" aria-labelledby="reiter-sendung">
<!-- DIE VIDEOSPUR. Vorher gab es für das laufende Video im
Pult überhaupt keine Bedienung — wer spulen wollte,
musste in das YouTube-Bild fassen, und was dort passiert,
passiert nur bei einem selbst. -->
<div class="spur" id="spur">
<div class="spur__kopf">
<span class="spur__marke" id="spur-marke">Läuft</span>
<strong class="spur__titel" id="spur-titel">Noch kein Video eingetragen</strong>
</div>
<div class="spur__band">
<button type="button" class="spur__knopf" id="v-zurueck" title="10 Sekunden zurück">−10</button>
<button type="button" class="spur__knopf spur__knopf--gross" id="v-spiel" title="Leertaste">
<svg viewBox="0 0 24 24" aria-hidden="true" id="v-spiel-bild"><path d="M8 5h3v14H8zm5 0h3v14h-3z" /></svg>
</button>
<button type="button" class="spur__knopf" id="v-vor" title="10 Sekunden vor">+10</button>
<input type="range" class="spur__schiene" id="v-band" min="0" max="1000" value="0"
step="1" aria-label="Stelle im Video" />
<span class="spur__zeit" id="v-zeit">0:00 / 0:00</span>
<button type="button" class="spur__knopf spur__knopf--weiter" id="v-naechstes"
title="Nächstes Video aus der Warteschlange">Nächstes</button>
<!-- ==== DER REGIEPLATZ ==================================
Filipe: „kann das nicht bissl aufgeteilt sein auf links
und rechts und eine barre unten in der mitte."
Links steht, was LÄUFT — das liest man. Rechts steht,
was man EINTRÄGT — das tippt man vor der Sendung. Unten
liegt der Transport — den fasst man währenddessen an,
und er liegt deshalb immer an derselben Stelle. -->
<div class="regieplatz">
<!-- ---- LINKS: was läuft ---------------------------- -->
<div class="regieplatz__seite">
<h4 class="regieplatz__ueber">Was läuft</h4>
<div class="spur" id="spur">
<div class="spur__kopf">
<span class="spur__marke" id="spur-marke">Läuft</span>
<strong class="spur__titel" id="spur-titel">Noch kein Video eingetragen</strong>
</div>
<!-- Der Umschalter steht bei dem, was läuft, und nicht
bei den Feldern: Er ist eine Entscheidung im Live,
keine Eintragung davor. -->
<button type="button" class="spur__knopf spur__knopf--tausch" id="v-tauschen"
hidden title="Zwischen den beiden Videos wechseln (T)">
Wechseln zu <span id="v-tausch-titel">…</span>
</button>
</div>
<!-- ==== DAS ZWEITE VIDEO ==========================
Nicht die Warteschlange: Die ist eine Reihenfolge,
eins nach dem anderen, und das Gespielte ist danach
heraus. Hier stehen ZWEI nebeneinander, und jedes
merkt sich seine Stelle. -->
<label class="pult__feld">
<span>Zweites Video (zum Hin- und Herschalten)</span>
<input type="text" id="p-zweit" placeholder="YouTube-Adresse — leer lassen räumt es weg" />
</label>
<div class="pult__zeile">
<button type="button" class="knopf-still" id="p-zweit-sichern">Bereitlegen</button>
</div>
<p class="pult__klein" id="zweit-hinweis">
Beide merken sich, wo sie stehen. Du kannst also mitten
im einen wegschalten und später genau dort weitermachen.
</p>
</div>
<!-- ==== GESCHWINDIGKEIT UND UMSCHALTER ==================
Beide stehen an der Spur und nicht in einem eigenen
Register: Es ist dieselbe Frage — was läuft gerade und
wie. Ein Registerwechsel mitten im Live ist ein
Handgriff zu viel. -->
<div class="spur__mehr">
<div class="tempo" id="tempo" role="group" aria-label="Geschwindigkeit"></div>
<button type="button" class="spur__knopf spur__knopf--tausch" id="v-tauschen"
hidden title="Zwischen den beiden Videos wechseln (T)">
Wechseln zu <span id="v-tausch-titel">…</span>
</button>
<!-- ---- RECHTS: einrichten -------------------------- -->
<div class="regieplatz__seite regieplatz__seite--rechts">
<h4 class="regieplatz__ueber">Einrichten</h4>
<label class="pult__feld">
<span>Titel der Sendung</span>
<input type="text" id="p-titel" maxlength="120" placeholder="Worum geht es?" />
</label>
<label class="pult__feld">
<span>YouTube</span>
<input type="text" id="p-video" placeholder="Adresse oder Kennung einfügen" />
</label>
<label class="pult__feld">
<span>Vorschaubild</span>
<input type="text" id="p-vorschau" placeholder="Adresse eines Bildes (freiwillig)" />
</label>
<div class="pult__zeile">
<label class="pult__feld pult__feld--kurz">
<span>Beginn</span>
<input type="datetime-local" id="p-beginn" />
</label>
<button type="button" class="knopf-still knopf-still--haupt"
id="p-sichern">Übernehmen</button>
</div>
<!-- ==== ALLES ZURÜCKSETZEN ========================
Filipe: „brauch ich auch noch einen button wo ich
alles easy zurücksetzen kann."
Er steht unten in der Spalte, in der eingetragen
wird — und bewusst ruhig: Er gehört hierher, aber er
ist nicht das, was man sucht. Was er leert und was
er stehen lässt, sagt er vorher. -->
<div class="pult__zeile pult__zeile--ende">
<button type="button" class="knopf-still knopf-still--leise"
id="p-zuruecksetzen">Alles zurücksetzen</button>
<span class="pult__klein" id="zurueck-hinweis"></span>
</div>
</div>
</div>
<div class="pult__zeile">
<label class="pult__feld">
<span>Titel der Sendung</span>
<input type="text" id="p-titel" maxlength="120" placeholder="Worum geht es?" />
</label>
<label class="pult__feld">
<span>YouTube</span>
<input type="text" id="p-video" placeholder="Adresse oder Kennung einfügen" />
</label>
</div>
<!-- ---- UNTEN MITTIG: die Transportleiste -----------
Aufgebaut wie jeder Videospieler, den man kennt:
Schiene über die ganze Breite, darunter eine Reihe mit
dem Transport in der Mitte. Eine Anordnung, die man
schon kennt, muss man nicht lernen. -->
<div class="transport">
<div class="transport__schiene">
<input type="range" class="spur__schiene" id="v-band" min="0" max="1000" value="0"
step="1" aria-label="Stelle im Video" />
<span class="spur__zeit" id="v-zeit">0:00 / 0:00</span>
</div>
<!-- ==== DAS ZWEITE VIDEO ================================
Nicht die Warteschlange: Die ist eine Reihenfolge, eins
nach dem anderen, und das Gespielte ist danach heraus.
Hier stehen ZWEI nebeneinander, und jedes merkt sich
seine Stelle. -->
<div class="pult__zeile">
<label class="pult__feld">
<span>Zweites Video (zum Hin- und Herschalten)</span>
<input type="text" id="p-zweit" placeholder="YouTube-Adresse — leer lassen räumt es weg" />
</label>
<button type="button" class="knopf-still" id="p-zweit-sichern">Bereitlegen</button>
</div>
<p class="pult__klein" id="zweit-hinweis">
Beide merken sich, wo sie stehen. Du kannst also mitten im
einen wegschalten und später genau dort weitermachen.
</p>
<div class="pult__zeile">
<label class="pult__feld">
<span>Vorschaubild</span>
<input type="text" id="p-vorschau" placeholder="Adresse eines Bildes (freiwillig)" />
</label>
<label class="pult__feld pult__feld--kurz">
<span>Beginn</span>
<input type="datetime-local" id="p-beginn" />
</label>
<button type="button" class="knopf-still" id="p-sichern">Übernehmen</button>
<div class="transport__reihe">
<!-- Links die Geschwindigkeit: Sie wird selten
angefasst und darf nicht neben dem Play-Knopf
liegen, wo man im Live hinfasst. -->
<div class="transport__teil">
<div class="tempo" id="tempo" role="group" aria-label="Geschwindigkeit"></div>
</div>
<div class="transport__teil transport__teil--mitte">
<button type="button" class="spur__knopf" id="v-zurueck"
title="10 Sekunden zurück">−10</button>
<button type="button" class="spur__knopf spur__knopf--gross" id="v-spiel"
title="Leertaste">
<svg viewBox="0 0 24 24" aria-hidden="true" id="v-spiel-bild"><path d="M8 5h3v14H8zm5 0h3v14h-3z" /></svg>
</button>
<button type="button" class="spur__knopf" id="v-vor"
title="10 Sekunden vor">+10</button>
</div>
<div class="transport__teil transport__teil--rechts">
<button type="button" class="spur__knopf spur__knopf--weiter" id="v-naechstes"
title="Nächstes Video aus der Warteschlange">Nächstes</button>
</div>
</div>
</div>
</div>
</section>
@@ -530,6 +596,26 @@
(380 px) gab es nichts. Für eine Sendung, in der zwei
Leute reden, ist das eine zu klein und das andere
verdeckt das Video. -->
<!-- ==== WAS BEIM TEILEN ZU ERWARTEN IST ===============
Das gehört an die Bedienung und nicht in eine Hilfe:
Wer es erst erfährt, nachdem im Stream zehn Minuten ein
schwarzes Rechteck stand, erfährt es zu spät. -->
<h3 class="pult__ueber">Bildschirm teilen</h3>
<p class="pult__klein">
Der Knopf sitzt unten in der Senderleiste. Geteilt wird
statt deiner Kamera — dein Bildschirm läuft dann in deinem
Fenster, und mit „Kameras groß" oder „Nur Kamera" füllt er
die ganze Fläche.
</p>
<p class="pult__klein" id="teilen-hinweis">
<strong>Netflix, Disney+ und Prime bleiben schwarz.</strong>
Das ist keine Einstellung, sondern ihr Kopierschutz — auf
Discord und Zoom ist es genauso. Und einen Film
weiterzusenden wäre eine öffentliche Wiedergabe. Gedacht
ist das Teilen für dein Spiel, dein Schnittprogramm, OBS
oder eine Webseite.
</p>
<h3 class="pult__ueber">Kamerafenster</h3>
<div class="kamerawahl">
<div class="kamerawahl__teil">
@@ -623,7 +709,11 @@
drei Sekunden eingetippt, die Karte läuft sofort. -->
<div class="pult__zeile">
<label class="pult__feld pult__feld--kurz">
<span>Dogen</span>
<!-- Der Preis steht IM Feldnamen und nicht darunter: Beim
Eintragen liest man die Zahl von der Zahlungsmeldung
ab, und die Umrechnung muss in derselben Zeile
stehen, in der man tippt. -->
<span>Dogen <span class="preis" id="sp-preis"></span></span>
<input type="text" id="sp-betrag" inputmode="decimal" placeholder="0,5" />
</label>
<label class="pult__feld">
@@ -674,14 +764,14 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/spendenkarte.js?v=202609281932" defer></script>
<script src="assets/js/reaktion.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/spendenkarte.js?v=202609282002" defer></script>
<script src="assets/js/reaktion.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/rechte.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/rechte.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/report.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/report.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/ki.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/report.js?v=202609281932" defer></script>
<script src="assets/js/ki.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/report.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -173,14 +173,14 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/scouting.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/scouting.js?v=202609282002" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -732,16 +732,16 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/live.js?v=202609281932" defer></script>
<script src="assets/js/start.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/live.js?v=202609282002" defer></script>
<script src="assets/js/start.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -85,16 +85,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/ki.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/startcheck.js?v=202609281932" defer></script>
<script src="assets/js/ki.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/startcheck.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -150,16 +150,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/auskunft.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/steckbrief.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/auskunft.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/steckbrief.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/support.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/support.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -128,16 +128,16 @@
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" 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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/support.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/support.js?v=202609282002" 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=202609281932" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609282002" />
<style>
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
@@ -80,7 +80,7 @@
<body>
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
<script src="assets/js/spendenkarte.js?v=202609281932" defer></script>
<script src="assets/js/tafel.js?v=202609281932" defer></script>
<script src="assets/js/spendenkarte.js?v=202609282002" defer></script>
<script src="assets/js/tafel.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -111,15 +111,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/talente.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/talente.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/team.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/team.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -110,15 +110,15 @@
</main>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/team.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/team.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/team.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/team.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/teamlage.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" defer></script>
<script src="assets/js/teamlage.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -112,15 +112,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/teilen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/teilen.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -126,14 +126,14 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/treff-moderation.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/treff-moderation.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/auskunft.js?v=202609281932" defer></script>
<script src="assets/js/treff-regeln.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/auskunft.js?v=202609282002" defer></script>
<script src="assets/js/treff-regeln.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -149,16 +149,16 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/uebersicht.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/uebersicht.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -335,14 +335,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/live.js?v=202609281932" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/live.js?v=202609282002" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</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=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/holen.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/holen.js?v=202609282002" 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=202609281932" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -144,14 +144,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/werdegang.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/werdegang.js?v=202609282002" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,13 +12,13 @@
vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
@@ -75,13 +75,13 @@
<p class="fehler" id="fehler" hidden></p>
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/willkommen.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/willkommen.js?v=202609282002" 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=202609281932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609281932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/start.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609281932" />
<link rel="stylesheet" href="assets/css/module.css?v=202609281932" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609282002" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609282002" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/start.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609282002" />
<link rel="stylesheet" href="assets/css/module.css?v=202609282002" />
<!-- 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=202609281932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609282002" />
</head>
<body class="start">
@@ -190,15 +190,15 @@
</main>
<script src="assets/js/meldung.js?v=202609281932" defer></script>
<script src="assets/js/hochladen.js?v=202609281932" defer></script>
<script src="assets/js/nachfrage.js?v=202609281932" defer></script>
<script src="assets/js/meldung.js?v=202609282002" defer></script>
<script src="assets/js/hochladen.js?v=202609282002" defer></script>
<script src="assets/js/nachfrage.js?v=202609282002" defer></script>
<script src="assets/js/wahl.js?v=202609281932" defer></script>
<script src="assets/js/bereiche.js?v=202609281932" defer></script>
<script src="assets/js/installieren.js?v=202609281932" defer></script>
<script src="assets/js/kopf.js?v=202609281932" defer></script>
<script src="assets/js/glocke.js?v=202609281932" defer></script>
<script src="assets/js/wissen.js?v=202609281932" defer></script>
<script src="assets/js/wahl.js?v=202609282002" defer></script>
<script src="assets/js/bereiche.js?v=202609282002" defer></script>
<script src="assets/js/installieren.js?v=202609282002" defer></script>
<script src="assets/js/kopf.js?v=202609282002" defer></script>
<script src="assets/js/glocke.js?v=202609282002" defer></script>
<script src="assets/js/wissen.js?v=202609282002" defer></script>
</body>
</html>