Das Foyer: eine Seite vor dem Saal, mit Plan, Eintritt und Vorschlägen
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn man
drauf drückt geht zuerst eine seite auf mit reihen/kategorien. links
eine reihe wo die nächsten geplanten videos schon bereit stehen. wan
und umd wie viel uhr … und das soll geschlossen sein außer für vanvan
und dogfather. in der mitte sollen die leute dan wenn eine sendung
läuft drauf drücken können und der sendung beitreten. auch bei der
vorschau schon und dan rechts will ich die letzte reihe/kategorie, da
sollen die leute alle mir videos anraten können … und nur ich und
vanvan sehen sie."
Haus: Team Dogi (crew.dogfather-universe.com). Die Agentur ist nicht
berührt -- pruef-haus-trennung 107/0, pruef-workspace-seiten 37/0.
WARUM EINE EIGENE SEITE UND KEIN VIERTER ZUSTAND DES SAALS
Der Saal meldet jeden an, der ihn öffnet („dabei"), baut Verbindungen
auf und hält den Ereignisstrom offen. Das ist richtig für jemanden,
der zusieht -- und falsch für jemanden, der nur nachsehen will, ob
heute Abend etwas läuft. Wäre das Foyer der vierte Zustand derselben
Seite, zählte jeder Blick als Zuschauer, und die Zahl im Regiepult
sähe nach Publikum aus, wo niemand zusieht.
Im Foyer wird nur gelesen: Stand holen, zeichnen, alle 20 Sekunden
nachfragen -- und nicht, solange der Reiter im Hintergrund liegt. Kein
Ereignisstrom: Der hielte eine Verbindung offen, und manche Browser
geben je Adresse nur sechs her; im Saal wird jede davon gebraucht.
DREI REIHEN
LINKS die Warteschlange, nach TERMIN sortiert statt nach Platz.
Was keinen hat, steht unten; was vorbei ist, bekommt
„· überfällig". Nur admin und rechte Hand -- und für alle
anderen steht sie gar nicht erst da, statt leer oder
gesperrt zu sein. Ein Kasten mit Schloss erzählt, dass es
etwas zu sehen gäbe. Entschieden wird das am Server; die
Seite fragt nicht nach der Rolle, sondern danach, ob die
Auskunft gekommen ist.
MITTE Lampe (Geschlossen / Gleich / Auf Sendung), Vorschaubild,
Titel, Satz -- und der Knopf, der NUR dasteht, wenn er auch
hineinführt. Er ist ein Link und kein Button: Wer ihn mit
der mittleren Maustaste antippt, bekommt einen neuen Reiter.
RECHTS Video anraten. Jeder darf schicken, niemand sieht fremde,
jeder sieht seine eigenen mit Stand. Vier Sperren, und jede
beantwortet etwas anderes: zu schnell (45 s), zu viele offen
(5 je Person), schon angeraten, steht schon bereit.
Am Telefon steht die MITTE oben. Dort ist „links" nur noch „vor allem
anderen", und das wäre die falsche Reihenfolge.
WAS SONST NOCH DAZUGEHÖRT
* Jede Zeile der Warteschlange im Saal hat jetzt ein Terminfeld.
* Die Kachel sagt nicht mehr „geschlossen" -- das Foyer ist immer
offen. „gleich" und „● live" bleiben: Sie sagen etwas, das man ohne
sie nicht weiß.
* reaktion.html steht in OHNE_KACHEL_UEBERALL. Die erlaubten Seiten
werden aus den Kachelzielen abgeleitet; als die Kachel aufs Foyer
zeigte, war der Saal plötzlich von keiner mehr genannt und
antwortete mit einer Umleitung.
DREI DOPPELTE ANTWORTEN BESEITIGT
* „Wie viele Vorschläge darf einer offen haben" stand VIERMAL:
dreimal als `je_person_max || 5` und einmal als Wort „fünf" im Satz
(plus ein fünftes Mal in meldung.js). Kommt jetzt vom Server.
* `maxlength="200"` im Formular neben VORSCHLAG_NOTIZ_MAX im Server.
Das Feld lernt die Grenze von der Auskunft.
* Die drei Foyer-Tafeln hatten eine eigene Fläche (Weiß mit 4,5 %) und
eine eigene Form. Beides gibt es im Haus längst: Material in
start.css (45 Klassen, gemessen), Form in module.css. Die eigene
Fläche war dazu fast durchsichtig -- über einem hellen
Hintergrundbild stand der Text ohne deckenden Grund. Gefunden hat
das nicht eine Prüfung, sondern das Bildschirmfoto.
EINE LÜCKE IN DER PRÜFUNG GESCHLOSSEN
In module.css steht dieselbe 48er-Klassenliste ACHTMAL. Sieben trugen
die Marke MODULLISTE und wurden verglichen; die achte -- die Umrandung
beim Tabben (:focus-visible) -- nicht. Sie war damit die Einzige, die
still hätte abweichen können, ausgerechnet bei der Regel, die nur
sieht, wer mit der Tastatur bedient. pruef-css-klassen erwartet jetzt
acht. Eine steigende Prüfzahl, und sie ist begründet.
UND EINER, DEN KEIN WERKZEUG FINDEN KANN
Der Satz oben lautete „Links steht, was ansteht; rechts kannst du
etwas anraten." Für die Community gibt es „links" gar nicht, und am
Telefon stehen die Reihen untereinander. Eine Richtung im Text ist
eine Aussage über das Aussehen -- und das ändert sich mit dem
Bildschirm und mit der Rolle. Jetzt steht dort, WAS geht, nicht WO.
GEMESSEN
mess-foyer (neu) 70 Messungen, 0 Fehler, 9 Bildschirmfotos
pruef-reaktion 538, 0 Fehler (vorher 478)
pruef-handy-teamdogi 263 Seitenaufrufe, 0 Befunde (vorher 244)
pruef-sackgassen 14, 0 Fehler
pruef-crew-adresse 173, 0 Fehler
pruef-haus-trennung 107, 0 Fehler
pruef-struktur 102, 0 Fehler
pruef-neue-seiten 109, 0 Fehler
pruef-portnummern 41, 0 Fehler
pruef-haus-seiten 38, 0 Fehler
pruef-workspace-seiten 37, 0 Fehler
pruef-breiten 45 Seiten auf fünf Breiten, 0 beanstandet
pruef-community-sicht 10, 0 Fehler
pruef-deutsche-texte 12, 0 Fehler
pruef-css-klassen grün
mess-foyer klickt den ganzen Weg durch: Ein Gast schickt ein Video,
DogFather sieht es mit Namen, nimmt es, und es muss links im Plan
stehen. Zum Schluss macht es sechs seiner Messungen absichtlich kaputt
und prüft, dass sie das merken.
NICHT BEHOBEN, WEIL NICHT MEINS: pruef-meldungen ist rot (28
Kennungen ohne Satz, 3 Rohanzeigen) -- gemessen im worktree auf dem
letzten Commit schon vorher, Zeichen für Zeichen dieselbe Liste. Die
Dateien gehören überwiegend der Agentur; das gehört in einen eigenen
Durchgang.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -387,6 +387,11 @@ export const GEHOERT_ZU_ADRESSE = [
|
|||||||
die Daten sind die Sache. */
|
die Daten sind die Sache. */
|
||||||
{ datei: "/workspace/notizen.html", zuhause: istCrewAdresse },
|
{ datei: "/workspace/notizen.html", zuhause: istCrewAdresse },
|
||||||
{ datei: "/workspace/reaktion.html", zuhause: istCrewAdresse },
|
{ datei: "/workspace/reaktion.html", zuhause: istCrewAdresse },
|
||||||
|
/* Das Foyer davor (08.10.2026) -- dieselbe Tuer, dieselbe
|
||||||
|
Trennung. Ohne diesen Eintrag waere es auf der Agenturadresse
|
||||||
|
abrufbar, weil express.static jede Datei ausliefert, die man
|
||||||
|
beim Namen nennt. */
|
||||||
|
{ datei: "/workspace/reaktion-foyer.html", zuhause: istCrewAdresse },
|
||||||
/* DIE ZWEI BUEHNENQUELLEN (28.09.2026). Sie kommen ohne
|
/* DIE ZWEI BUEHNENQUELLEN (28.09.2026). Sie kommen ohne
|
||||||
Anmeldung aus -- geprueft wird ein Schluessel in der Adresse
|
Anmeldung aus -- geprueft wird ein Schluessel in der Adresse
|
||||||
-- und gehoeren trotzdem in genau ein Haus. */
|
-- und gehoeren trotzdem in genau ein Haus. */
|
||||||
|
|||||||
@@ -0,0 +1,681 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
WIE DAS FOYER AUSSIEHT (08.10.2026)
|
||||||
|
|
||||||
|
`pruef-reaktion` misst, was die Schnittstelle antwortet. Das sagt
|
||||||
|
nichts darueber, ob die drei Reihen auf einem Bildschirm
|
||||||
|
nebeneinander passen, ob der Knopf in der Mitte ins Auge fiele und
|
||||||
|
ob am Telefon die Sendung oben steht.
|
||||||
|
|
||||||
|
WARUM EIGENES WERKZEUG UND KEIN ABSCHNITT IN mess-reaktion:
|
||||||
|
Dort laufen Kameras, Video und Chat -- jede geoeffnete Seite haelt
|
||||||
|
zwei stehende Verbindungen, und der Browser gibt je Adresse nur
|
||||||
|
wenige her. Das Foyer braucht keine davon. Es misst in Sekunden,
|
||||||
|
was dort zwischen zwei Kameraaufbauten untergehen wuerde.
|
||||||
|
|
||||||
|
GEMESSEN WIRD, WAS MAN NICHT ERRATEN KANN:
|
||||||
|
|
||||||
|
* Steht der Plan bei einem Gast wirklich NICHT da -- und steht
|
||||||
|
auch kein Stueck daraus irgendwo im Dokument?
|
||||||
|
* Ist die Mitte breiter als die Seiten, und rutschen die zwei
|
||||||
|
uebrigen Reihen auf, wenn der Plan fehlt?
|
||||||
|
* Steht am Telefon die Sendung in der ERSTEN Zeile?
|
||||||
|
* Ist der Knopf bei "zu" weg und bei "gleich"/"live" da?
|
||||||
|
* Sind alle Beruehrziele 44 Pixel hoch und alle Schriften
|
||||||
|
mindestens 11,5 Pixel gross?
|
||||||
|
* Und geht der ganze Weg durch: Gast schickt ein Video,
|
||||||
|
DogFather sieht es MIT Namen, nimmt es -- und es steht links
|
||||||
|
im Plan.
|
||||||
|
|
||||||
|
ZU JEDER MESSUNG, DIE "in Ordnung" SAGEN KANN, GEHOERT EINE
|
||||||
|
GEGENPROBE. Am Ende wird jede der tragenden Messungen absichtlich
|
||||||
|
kaputtgemacht und muss anschlagen. Eine Messung, die immer
|
||||||
|
bestaetigt, bestaetigt nichts.
|
||||||
|
|
||||||
|
NIE DIE ECHTE DATENBANK. Eigener Ordner, eigener Port, eigenes
|
||||||
|
Zertifikat -- und am Ende ist alles weg.
|
||||||
|
|
||||||
|
DREI AUSGAENGE:
|
||||||
|
0 in Ordnung
|
||||||
|
1 ein Befund
|
||||||
|
3 konnte nicht nachsehen (Playwright fehlt, kein Zertifikat,
|
||||||
|
die Buehne nimmt nichts an, oder der Stand hat sich waehrend
|
||||||
|
des Laufs geaendert)
|
||||||
|
|
||||||
|
Aufrufen mit: node server/mess-foyer.mjs
|
||||||
|
===================================================================== */
|
||||||
|
import { mkdtempSync, rmSync, readFileSync } from "node:fs";
|
||||||
|
import { tmpdir } from "node:os";
|
||||||
|
import { join, dirname } from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
import { request } from "node:http";
|
||||||
|
import { createServer as httpsServer } from "node:https";
|
||||||
|
import { zertifikatBauen } from "./helfer-openssl.mjs";
|
||||||
|
import { notbremse } from "./helfer-notbremse.mjs";
|
||||||
|
import { eigenerPort } from "./helfer-port.mjs";
|
||||||
|
|
||||||
|
const HIER = dirname(fileURLToPath(import.meta.url));
|
||||||
|
const ordner = mkdtempSync(join(tmpdir(), "mess-foyer-"));
|
||||||
|
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
|
||||||
|
|
||||||
|
const PORT = await eigenerPort(import.meta);
|
||||||
|
const HTTPS_PORT = await eigenerPort(import.meta, "mess-foyer (HTTPS)", 1);
|
||||||
|
process.env.PORT = `${PORT}`;
|
||||||
|
process.env.SITE_ACCESS_SECRET = "lokaler-test";
|
||||||
|
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
|
||||||
|
|
||||||
|
const express = (await import("express")).default;
|
||||||
|
/* Der Sitzungskeks ist `secure`. Der Vorbau unten spricht https, der
|
||||||
|
Server dahinter nicht -- ohne diesen Griff setzt er den Keks und
|
||||||
|
der Browser verwirft ihn. */
|
||||||
|
const ec = express.response.cookie;
|
||||||
|
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
|
||||||
|
await import("./index.js");
|
||||||
|
notbremse(240_000, "mess-foyer");
|
||||||
|
await new Promise((r) => setTimeout(r, 1000));
|
||||||
|
|
||||||
|
const CREW = "crew.dogfather-universe.com";
|
||||||
|
|
||||||
|
/* ---------- Leute ------------------------------------------------------- */
|
||||||
|
const { DatabaseSync } = await import("node:sqlite");
|
||||||
|
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||||
|
const d = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||||
|
const kenn = randomBytes(32).toString("hex");
|
||||||
|
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
|
||||||
|
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
|
||||||
|
.run("code_kennung_schluessel", kenn, new Date().toISOString());
|
||||||
|
const ALT = new Date(Date.now() - 200 * 86400000).toISOString();
|
||||||
|
function anlegen(name, rolle, code) {
|
||||||
|
const salt = randomBytes(16).toString("hex");
|
||||||
|
const hash = scryptSync(code, salt, 64,
|
||||||
|
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
|
||||||
|
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n,"
|
||||||
|
+ " code_kennung, aktiv, erstellt) VALUES (?,?,?,?,?,?,1,?)")
|
||||||
|
.run(name, rolle, hash, salt, 32768,
|
||||||
|
createHmac("sha256", kenn).update(code).digest("hex"), ALT);
|
||||||
|
}
|
||||||
|
const CODES = {
|
||||||
|
admin: "CODE-M00-000001", hand: "CODE-M01-000001",
|
||||||
|
gast: "CODE-M02-000001", gast2: "CODE-M03-000001",
|
||||||
|
};
|
||||||
|
/* VANVAN IST DIE RECHTE HAND und wird mitgemessen, nicht nur
|
||||||
|
DogFather: Filipe hat "nur ich und vanvan" gesagt, und ob die
|
||||||
|
zweite Haelfte davon stimmt, sieht man nur, wenn sie dabei ist. */
|
||||||
|
anlegen("DogFather", "admin", CODES.admin);
|
||||||
|
anlegen("VanVan", "hand", CODES.hand);
|
||||||
|
anlegen("Nachtfalter", "gast", CODES.gast);
|
||||||
|
anlegen("Lenny", "gast", CODES.gast2);
|
||||||
|
d.close();
|
||||||
|
|
||||||
|
function roh(pfad, { method = "GET", keks = "", rumpf = null } = {}) {
|
||||||
|
return new Promise((fertig, schief) => {
|
||||||
|
const daten = rumpf === null ? null : Buffer.from(JSON.stringify(rumpf));
|
||||||
|
const a = request({
|
||||||
|
host: "127.0.0.1", port: PORT, path: pfad, method,
|
||||||
|
headers: {
|
||||||
|
Host: CREW, Origin: `https://${CREW}`,
|
||||||
|
...(keks ? { Cookie: keks } : {}),
|
||||||
|
...(daten ? { "Content-Type": "application/json", "Content-Length": daten.length } : {}),
|
||||||
|
},
|
||||||
|
}, (antwort) => {
|
||||||
|
const teile = [];
|
||||||
|
antwort.on("data", (s) => teile.push(s));
|
||||||
|
antwort.on("end", () => {
|
||||||
|
const text = Buffer.concat(teile).toString("utf8");
|
||||||
|
let j = null; try { j = JSON.parse(text); } catch { /* kein JSON */ }
|
||||||
|
fertig({ code: antwort.statusCode, text, j, kopf: antwort.headers });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
a.on("error", schief);
|
||||||
|
if (daten) a.write(daten);
|
||||||
|
a.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async function anmelden(wer) {
|
||||||
|
const a = await roh("/workspace/api/anmelden", {
|
||||||
|
method: "POST",
|
||||||
|
rumpf: { rolle: wer === "gast2" ? "gast" : wer, code: CODES[wer], alter_ok: true },
|
||||||
|
});
|
||||||
|
return [].concat(a.kopf["set-cookie"] || []).map((z) => z.split(";")[0]).join("; ");
|
||||||
|
}
|
||||||
|
const k = {
|
||||||
|
admin: await anmelden("admin"),
|
||||||
|
hand: await anmelden("hand"),
|
||||||
|
gast: await anmelden("gast"),
|
||||||
|
gast2: await anmelden("gast2"),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------- Zaehlwerk --------------------------------------------------- */
|
||||||
|
let fehler = 0;
|
||||||
|
let geprueft = 0;
|
||||||
|
const ok = (b, t) => {
|
||||||
|
geprueft++;
|
||||||
|
console.log((b ? " ok " : " FEHL ") + t);
|
||||||
|
if (!b) fehler++;
|
||||||
|
};
|
||||||
|
function nichtNachsehbar(grund) {
|
||||||
|
console.log("\n -- NICHT NACHSEHBAR");
|
||||||
|
console.log(` ${grund}`);
|
||||||
|
console.log(" Das ist KEIN Befund am Code -- es heisst nur, dass");
|
||||||
|
console.log(" gerade niemand nachsehen konnte.\n");
|
||||||
|
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||||
|
process.exit(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- Die Buehne fuellen ------------------------------------------ */
|
||||||
|
/* ZWEI STUECKE IN DER WARTESCHLANGE, EINES MIT TERMIN UND EINES OHNE.
|
||||||
|
Genau das ist die Aussage der linken Reihe ("was keinen hat, steht
|
||||||
|
unten"), und mit nur einem Eintrag liesse sie sich nicht messen. */
|
||||||
|
for (const adresse of ["https://youtu.be/9bZkp7q19f0",
|
||||||
|
"https://www.youtube.com/watch?v=kJQP7kiw5Fk"]) {
|
||||||
|
const a = await roh("/workspace/api/reaktion/liste", {
|
||||||
|
method: "POST", keks: k.admin, rumpf: { video: adresse },
|
||||||
|
});
|
||||||
|
if (a.code >= 400) nichtNachsehbar(`Die Warteschlange nimmt nichts an (HTTP ${a.code}).`);
|
||||||
|
}
|
||||||
|
const liste0 = (await roh("/workspace/api/reaktion", { keks: k.admin })).j?.liste || [];
|
||||||
|
if (liste0.length !== 2) {
|
||||||
|
nichtNachsehbar(`In der Warteschlange stehen ${liste0.length} Stuecke statt 2.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Der Termin liegt in der ZUKUNFT und wird relativ gerechnet. Ein
|
||||||
|
festes Datum waere eine Zeitbombe: Es ist richtig, bis der Kalender
|
||||||
|
es einholt -- und dann schlaegt "ueberfaellig" an, ohne dass etwas
|
||||||
|
kaputt ist. */
|
||||||
|
{
|
||||||
|
const a = await roh(`/workspace/api/reaktion/liste/${liste0[0].id}/wann`, {
|
||||||
|
method: "PUT", keks: k.admin,
|
||||||
|
rumpf: { wann: new Date(Date.now() + 3 * 86400000).toISOString() },
|
||||||
|
});
|
||||||
|
if (a.code >= 400) nichtNachsehbar(`Der Termin laesst sich nicht setzen (HTTP ${a.code}).`);
|
||||||
|
}
|
||||||
|
await roh("/workspace/api/reaktion", {
|
||||||
|
method: "PUT", keks: k.admin,
|
||||||
|
rumpf: {
|
||||||
|
titel: "Wir schauen den neuen Trailer",
|
||||||
|
video: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
||||||
|
beginnt_am: new Date(Date.now() + 7 * 60_000).toISOString(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/* ---------- Der Vorbau -------------------------------------------------- */
|
||||||
|
const schluesselDatei = join(ordner, "p.key");
|
||||||
|
const zertDatei = join(ordner, "p.crt");
|
||||||
|
try {
|
||||||
|
zertifikatBauen(schluesselDatei, zertDatei, CREW);
|
||||||
|
} catch (f) {
|
||||||
|
nichtNachsehbar(`Kein Zertifikat zu bauen: ${f?.message}\n`
|
||||||
|
+ " openssl liegt bei Git in mingw64/bin -- im System-PATH\n"
|
||||||
|
+ " steht oft nur Git/cmd.");
|
||||||
|
}
|
||||||
|
const vorbau = httpsServer({
|
||||||
|
key: readFileSync(schluesselDatei), cert: readFileSync(zertDatei),
|
||||||
|
}, (von, nach) => {
|
||||||
|
const weiter = request({
|
||||||
|
host: "127.0.0.1", port: PORT, path: von.url, method: von.method,
|
||||||
|
headers: { ...von.headers, host: `${CREW}:${HTTPS_PORT}` },
|
||||||
|
}, (antwort) => {
|
||||||
|
nach.writeHead(antwort.statusCode || 502, antwort.headers);
|
||||||
|
antwort.pipe(nach);
|
||||||
|
});
|
||||||
|
weiter.on("error", () => { try { nach.writeHead(502); nach.end(); } catch { /* egal */ } });
|
||||||
|
von.pipe(weiter);
|
||||||
|
});
|
||||||
|
await new Promise((r) => vorbau.listen(HTTPS_PORT, "127.0.0.1", r));
|
||||||
|
const BASIS = `https://${CREW}:${HTTPS_PORT}`;
|
||||||
|
|
||||||
|
let pw = null;
|
||||||
|
try {
|
||||||
|
pw = await import(
|
||||||
|
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
|
||||||
|
} catch (f) {
|
||||||
|
nichtNachsehbar(`Playwright ist nicht da: ${f?.message}`);
|
||||||
|
}
|
||||||
|
const browser = await pw.chromium.launch({
|
||||||
|
args: [`--host-resolver-rules=MAP ${CREW} 127.0.0.1`, "--ignore-certificate-errors"],
|
||||||
|
});
|
||||||
|
|
||||||
|
async function alsWer(wer, breite, hoehe) {
|
||||||
|
const kontext = await browser.newContext({
|
||||||
|
viewport: { width: breite, height: hoehe },
|
||||||
|
/* MIT FINGER, WENN ES EIN HANDY IST. Ohne `hasTouch` meldet der
|
||||||
|
Browser `pointer: fine` -- und damit greift KEINE Regel aus
|
||||||
|
`@media (pointer: coarse)`. Dort stehen im ganzen Haus die
|
||||||
|
44-Pixel-Beruehrziele. Eine Handy-Messung mit Mauszeiger misst
|
||||||
|
eine Seite, die auf keinem Handy so aussieht. */
|
||||||
|
hasTouch: breite <= 860,
|
||||||
|
ignoreHTTPSErrors: true,
|
||||||
|
});
|
||||||
|
await kontext.addCookies((k[wer] || "").split("; ").filter(Boolean).map((z) => {
|
||||||
|
const [n, ...r] = z.split("=");
|
||||||
|
return { name: n, value: r.join("="), domain: CREW, path: "/" };
|
||||||
|
}));
|
||||||
|
const seite = await kontext.newPage();
|
||||||
|
const konsole = [];
|
||||||
|
seite.on("pageerror", (f) => konsole.push(String(f?.message || f)));
|
||||||
|
seite.on("console", (m) => { if (m.type() === "error") konsole.push(m.text()); });
|
||||||
|
seite.on("response", (a) => {
|
||||||
|
/* Vorschaubilder kommen von YouTube und sind hier nicht
|
||||||
|
erreichbar -- das ist die Umgebung und kein Befund. */
|
||||||
|
if (a.status() >= 400 && !/ytimg\.com/.test(a.url())) {
|
||||||
|
konsole.push(`${a.status()} ${a.url().replace(/^https?:\/\/[^/]+/, "")}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await seite.goto(`${BASIS}/workspace/reaktion-foyer.html`, { waitUntil: "networkidle" });
|
||||||
|
/* NICHT AUF EINE ZEIT WARTEN, SONDERN AUF DIE AUSKUNFT. Solange im
|
||||||
|
Kopf "Wird geladen" steht, ist der Stand noch nicht da -- eine
|
||||||
|
Messung davor misst den leeren Rahmen. */
|
||||||
|
await seite.waitForFunction(
|
||||||
|
() => !/Wird geladen/.test(document.getElementById("kopf-satz")?.textContent || ""),
|
||||||
|
null, { timeout: 15000 });
|
||||||
|
await seite.waitForTimeout(250);
|
||||||
|
return { kontext, seite, konsole };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function bild(seite, name) {
|
||||||
|
await seite.screenshot({ path: join(HIER, `mess-foyer-${name}.png`), fullPage: true });
|
||||||
|
console.log(` Bild: server/mess-foyer-${name}.png`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
DIE MESSUNGEN, ALLE IM BROWSER
|
||||||
|
|
||||||
|
Sie stehen als Funktionen da und nicht als Code im Ablauf: Nur so
|
||||||
|
kann die Gegenprobe am Ende DIESELBE Messung auf eine absichtlich
|
||||||
|
kaputte Seite anwenden. Zwei Abschriften derselben Frage waeren
|
||||||
|
zwei Antworten, und eine davon waere irgendwann aelter.
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Welche Reihen stehen da, wo, wie breit -- und wie viele Spalten? */
|
||||||
|
const reihenLesen = (seite) => seite.evaluate(() => {
|
||||||
|
const da = (id) => {
|
||||||
|
const e = document.getElementById(id);
|
||||||
|
if (!e) return null;
|
||||||
|
/* `hidden` allein genuegt nicht: Eine Reihe kann auch durch
|
||||||
|
`display:none` am Stilblatt verschwinden. Gefragt ist, ob ein
|
||||||
|
Mensch sie sieht. */
|
||||||
|
if (!e.offsetParent) return null;
|
||||||
|
const r = e.getBoundingClientRect();
|
||||||
|
return { oben: Math.round(r.top), breit: Math.round(r.width), hoch: Math.round(r.height) };
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
plan: da("reihe-plan"),
|
||||||
|
saal: da("reihe-saal"),
|
||||||
|
raten: da("reihe-raten"),
|
||||||
|
spalten: getComputedStyle(document.getElementById("reihen"))
|
||||||
|
.gridTemplateColumns.split(/\s+/).filter(Boolean).length,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Steht eines dieser Woerter irgendwo im Dokument? */
|
||||||
|
const leckLesen = (seite, woerter) => seite.evaluate((w) => {
|
||||||
|
const text = document.body.innerText + " " + document.body.innerHTML;
|
||||||
|
return w.filter((z) => z && text.includes(z));
|
||||||
|
}, woerter);
|
||||||
|
|
||||||
|
/** Das kleinste Beruehrziel, die kleinste Schrift, der Ueberstand. */
|
||||||
|
const massLesen = (seite) => seite.evaluate(() => {
|
||||||
|
const wurzel = document.getElementById("foyer");
|
||||||
|
const sichtbar = (e) => {
|
||||||
|
const r = e.getBoundingClientRect();
|
||||||
|
return r.width > 0 && r.height > 0 && e.offsetParent !== null;
|
||||||
|
};
|
||||||
|
let ziel = null;
|
||||||
|
for (const e of wurzel.querySelectorAll("a, button, input, select, textarea")) {
|
||||||
|
if (!sichtbar(e)) continue;
|
||||||
|
const r = e.getBoundingClientRect();
|
||||||
|
if (!ziel || Math.round(r.height) < ziel.hoch) {
|
||||||
|
ziel = {
|
||||||
|
hoch: Math.round(r.height), breit: Math.round(r.width),
|
||||||
|
was: e.id || e.className || e.tagName,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let schrift = null;
|
||||||
|
for (const e of wurzel.querySelectorAll("*")) {
|
||||||
|
if (!sichtbar(e)) continue;
|
||||||
|
/* NUR ELEMENTE, DIE SELBST TEXT TRAGEN. Sonst waere jede
|
||||||
|
Umhuellung mitgezaehlt, und die Messung sagte etwas ueber den
|
||||||
|
Kasten statt ueber die Schrift. */
|
||||||
|
if (![...e.childNodes].some((n) => n.nodeType === 3 && n.textContent.trim())) continue;
|
||||||
|
const gr = parseFloat(getComputedStyle(e).fontSize);
|
||||||
|
if (!schrift || gr < schrift.gr) schrift = { gr, was: e.id || e.className || e.tagName };
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
ziel, schrift,
|
||||||
|
ueber: Math.max(0, document.documentElement.scrollWidth
|
||||||
|
- document.documentElement.clientWidth),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Was steht in der Mitte? */
|
||||||
|
const mitteLesen = (seite) => seite.evaluate(() => {
|
||||||
|
const t = (id) => document.getElementById(id)?.textContent.trim() || "";
|
||||||
|
const knopf = document.getElementById("saal-knopf");
|
||||||
|
return {
|
||||||
|
lampe: t("lampe-wort"),
|
||||||
|
stand: document.getElementById("lampe")?.dataset.stand || "?",
|
||||||
|
titel: t("saal-titel"),
|
||||||
|
satz: t("saal-satz"),
|
||||||
|
knopfDa: !!(knopf && knopf.offsetParent),
|
||||||
|
knopfWort: t("saal-knopf-wort"),
|
||||||
|
knopfZiel: knopf?.getAttribute("href") || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Die Zeilen der linken Reihe. */
|
||||||
|
const planLesen = (seite) => seite.evaluate(() => [
|
||||||
|
...document.querySelectorAll("#plan-liste .plan-zeile")].map((z) => ({
|
||||||
|
titel: z.querySelector(".plan-zeile__titel")?.textContent.trim() || "",
|
||||||
|
wann: z.querySelector(".plan-zeile__wann")?.textContent.trim() || "",
|
||||||
|
termin: z.dataset.termin || "",
|
||||||
|
})));
|
||||||
|
|
||||||
|
/** Die Zeilen der rechten Reihe. */
|
||||||
|
const ratenLesen = (seite) => seite.evaluate(() => [
|
||||||
|
...document.querySelectorAll("#raten-liste .raten-zeile")].map((z) => ({
|
||||||
|
titel: z.querySelector(".raten-zeile__titel")?.textContent.trim() || "",
|
||||||
|
unter: z.querySelector(".raten-zeile__unter")?.textContent.trim() || "",
|
||||||
|
stand: z.dataset.stand || "",
|
||||||
|
knoepfe: [...z.querySelectorAll(".raten-knopf")].map((b) => b.textContent.trim()),
|
||||||
|
})));
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
1. GESCHLOSSEN, AM RECHNER, ALS COMMUNITY
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 1. Geschlossen, am Rechner, als Community ===");
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
const r = await reihenLesen(gast.seite);
|
||||||
|
ok(r.plan === null, "Gast: die linke Reihe steht gar nicht da");
|
||||||
|
ok(r.saal !== null && r.raten !== null, "Gast: Mitte und Anraten stehen da");
|
||||||
|
ok(r.spalten === 2, `Gast: zwei Spalten, nicht drei (${r.spalten})`);
|
||||||
|
ok(!!(r.saal && r.raten) && r.saal.breit > r.raten.breit,
|
||||||
|
`Gast: die Mitte ist die breitere (${r.saal?.breit} zu ${r.raten?.breit} px)`);
|
||||||
|
|
||||||
|
const leck = await leckLesen(gast.seite,
|
||||||
|
[...liste0.map((z) => z.titel), ...liste0.map((z) => z.video)]);
|
||||||
|
ok(leck.length === 0, "Gast: kein Stueck aus der Warteschlange im Dokument"
|
||||||
|
+ (leck.length ? " -> " + leck.join(", ") : ""));
|
||||||
|
|
||||||
|
const m = await mitteLesen(gast.seite);
|
||||||
|
ok(m.lampe === "Geschlossen", `Gast: die Lampe sagt Geschlossen (${m.lampe})`);
|
||||||
|
ok(m.knopfDa === false, "Gast: bei zu gibt es keinen Knopf");
|
||||||
|
ok(m.satz.length > 20, `Gast: ein Satz erklaert den Zustand (${m.satz.length} Zeichen)`);
|
||||||
|
|
||||||
|
const mass = await massLesen(gast.seite);
|
||||||
|
ok(mass.ueber === 0, `Gast: nichts ragt seitlich hinaus (${mass.ueber} px)`);
|
||||||
|
ok(!!mass.schrift && mass.schrift.gr >= 11.5,
|
||||||
|
`Gast: kleinste Schrift ${mass.schrift?.gr} px (noetig 11,5) bei ${mass.schrift?.was}`);
|
||||||
|
ok(gast.konsole.length === 0, "Gast: nichts in der Konsole"
|
||||||
|
+ (gast.konsole.length ? " -> " + gast.konsole.slice(0, 3).join(" | ") : ""));
|
||||||
|
await bild(gast.seite, "1-zu-gast");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
2. GESCHLOSSEN, DOGFATHER UND VANVAN
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 2. Geschlossen, DogFather und VanVan ===");
|
||||||
|
for (const wer of ["admin", "hand"]) {
|
||||||
|
const chef = await alsWer(wer, 1440, 900);
|
||||||
|
const r = await reihenLesen(chef.seite);
|
||||||
|
ok(r.plan !== null, `${wer}: die linke Reihe steht da`);
|
||||||
|
ok(r.spalten === 3, `${wer}: drei Spalten (${r.spalten})`);
|
||||||
|
ok(!!(r.plan && r.saal && r.raten)
|
||||||
|
&& r.saal.breit > r.plan.breit && r.saal.breit > r.raten.breit,
|
||||||
|
`${wer}: die Mitte ist die breiteste `
|
||||||
|
+ `(${r.plan?.breit} / ${r.saal?.breit} / ${r.raten?.breit} px)`);
|
||||||
|
|
||||||
|
const p = await planLesen(chef.seite);
|
||||||
|
ok(p.length === 2, `${wer}: beide Stuecke stehen im Plan (${p.length})`);
|
||||||
|
ok(p[0]?.termin === "ja", `${wer}: das mit Termin steht oben (${p[0]?.termin || "ohne"})`);
|
||||||
|
ok(/\d{1,2}:\d{2}/.test(p[0]?.wann || ""),
|
||||||
|
`${wer}: beim ersten steht eine Uhrzeit (${p[0]?.wann})`);
|
||||||
|
ok(p[1]?.wann === "noch ohne Termin",
|
||||||
|
`${wer}: das ohne Termin steht unten und sagt das (${p[1]?.wann})`);
|
||||||
|
|
||||||
|
const mass = await massLesen(chef.seite);
|
||||||
|
ok(mass.ueber === 0, `${wer}: nichts ragt seitlich hinaus (${mass.ueber} px)`);
|
||||||
|
ok(chef.konsole.length === 0, `${wer}: nichts in der Konsole`
|
||||||
|
+ (chef.konsole.length ? " -> " + chef.konsole.slice(0, 3).join(" | ") : ""));
|
||||||
|
if (wer === "admin") await bild(chef.seite, "2-zu-dogfather");
|
||||||
|
await chef.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
3. GLEICH -- DER WARTEBEREICH IST OFFEN
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 3. Gleich (Wartebereich) ===");
|
||||||
|
await roh("/workspace/api/reaktion/stand",
|
||||||
|
{ method: "POST", keks: k.admin, rumpf: { stand: "vorbereitung" } });
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
const m = await mitteLesen(gast.seite);
|
||||||
|
ok(m.lampe === "Gleich", `die Lampe sagt Gleich (${m.lampe})`);
|
||||||
|
ok(m.knopfDa, "der Knopf steht da -- auch bei der Vorschau schon");
|
||||||
|
ok(m.knopfWort === "In den Wartebereich", `er heisst In den Wartebereich (${m.knopfWort})`);
|
||||||
|
ok(m.knopfZiel === "reaktion.html", `er fuehrt in den Saal (${m.knopfZiel})`);
|
||||||
|
ok(/Start um/.test(m.satz), `der Satz nennt die Startzeit (${m.satz})`);
|
||||||
|
ok(m.titel.includes("Trailer"), `der Titel der Sendung steht da (${m.titel})`);
|
||||||
|
await bild(gast.seite, "3-gleich-gast");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
4. AUF SENDUNG
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 4. Auf Sendung ===");
|
||||||
|
await roh("/workspace/api/reaktion/stand",
|
||||||
|
{ method: "POST", keks: k.admin, rumpf: { stand: "live" } });
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
const m = await mitteLesen(gast.seite);
|
||||||
|
ok(m.lampe === "Auf Sendung", `die Lampe sagt Auf Sendung (${m.lampe})`);
|
||||||
|
ok(m.knopfWort === "Jetzt beitreten", `der Knopf heisst Jetzt beitreten (${m.knopfWort})`);
|
||||||
|
ok(/dieselbe Stelle/.test(m.satz), `der Satz verspricht den Gleichlauf (${m.satz})`);
|
||||||
|
await bild(gast.seite, "4-live-gast");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
5. AM TELEFON -- DIE SENDUNG STEHT OBEN
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 5. Am Telefon (390 px) ===");
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 390, 844);
|
||||||
|
const r = await reihenLesen(gast.seite);
|
||||||
|
ok(r.plan === null, "Gast am Telefon: keine linke Reihe");
|
||||||
|
ok(!!(r.saal && r.raten) && r.saal.oben < r.raten.oben,
|
||||||
|
`Gast am Telefon: die Sendung steht ueber dem Anraten `
|
||||||
|
+ `(${r.saal?.oben} vor ${r.raten?.oben} px)`);
|
||||||
|
const mass = await massLesen(gast.seite);
|
||||||
|
ok(mass.ueber === 0, `Gast am Telefon: nichts ragt seitlich hinaus (${mass.ueber} px)`);
|
||||||
|
ok(!!mass.ziel && mass.ziel.hoch >= 44,
|
||||||
|
`Gast am Telefon: kleinstes Beruehrziel ${mass.ziel?.hoch} px `
|
||||||
|
+ `(noetig 44) bei ${mass.ziel?.was}`);
|
||||||
|
ok(!!mass.schrift && mass.schrift.gr >= 11.5,
|
||||||
|
`Gast am Telefon: kleinste Schrift ${mass.schrift?.gr} px bei ${mass.schrift?.was}`);
|
||||||
|
await bild(gast.seite, "5-live-handy-gast");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const chef = await alsWer("admin", 390, 844);
|
||||||
|
const r = await reihenLesen(chef.seite);
|
||||||
|
ok(!!(r.plan && r.saal && r.raten)
|
||||||
|
&& r.saal.oben < r.raten.oben && r.raten.oben < r.plan.oben,
|
||||||
|
"DogFather am Telefon: Sendung, Anraten, Plan -- in dieser Folge "
|
||||||
|
+ `(${r.saal?.oben} / ${r.raten?.oben} / ${r.plan?.oben} px)`);
|
||||||
|
ok(r.spalten === 1, `DogFather am Telefon: eine Spalte (${r.spalten})`);
|
||||||
|
const mass = await massLesen(chef.seite);
|
||||||
|
ok(mass.ueber === 0, `DogFather am Telefon: nichts ragt hinaus (${mass.ueber} px)`);
|
||||||
|
ok(!!mass.ziel && mass.ziel.hoch >= 44,
|
||||||
|
`DogFather am Telefon: kleinstes Beruehrziel ${mass.ziel?.hoch} px bei ${mass.ziel?.was}`);
|
||||||
|
await bild(chef.seite, "6-live-handy-dogfather");
|
||||||
|
await chef.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
6. DER GANZE WEG: ANRATEN, SEHEN, NEHMEN
|
||||||
|
|
||||||
|
Hier wird nicht die Schnittstelle gefragt, sondern GEKLICKT. Der
|
||||||
|
Unterschied ist nicht theoretisch: Ein Knopf, an dem nichts haengt,
|
||||||
|
antwortet in der Pruefung nebenan tadellos.
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 6. Anraten, sehen, nehmen ===");
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
await gast.seite.fill("#raten-video", "https://www.youtube.com/watch?v=aqz-KE-bpKQ");
|
||||||
|
await gast.seite.fill("#raten-notiz", "Das muessen wir zusammen sehen.");
|
||||||
|
await gast.seite.click("#raten-los");
|
||||||
|
await gast.seite.waitForFunction(
|
||||||
|
() => document.querySelectorAll("#raten-liste .raten-zeile").length === 1,
|
||||||
|
null, { timeout: 10000 });
|
||||||
|
const meine = await ratenLesen(gast.seite);
|
||||||
|
ok(meine.length === 1, `der Gast sieht seinen eigenen Vorschlag (${meine.length})`);
|
||||||
|
ok(meine[0]?.stand === "offen", `er steht auf offen (${meine[0]?.stand})`);
|
||||||
|
ok(meine[0]?.unter === "wartet",
|
||||||
|
`und sagt wartet -- ohne Namen, auch nicht den eigenen (${meine[0]?.unter})`);
|
||||||
|
ok(!meine[0]?.knoepfe.includes("Nehmen"), "der Gast hat keinen Nehmen-Knopf");
|
||||||
|
ok(meine[0]?.knoepfe.includes("\u00d7"), "aber er darf zurueckziehen, was noch offen ist");
|
||||||
|
const fuss = await gast.seite.textContent("#raten-fuss");
|
||||||
|
ok(/noch 4 Videos/.test(fuss || ""), `er erfaehrt, wie viele noch gehen (${fuss})`);
|
||||||
|
await bild(gast.seite, "7-angeraten-gast");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const chef = await alsWer("admin", 1440, 900);
|
||||||
|
const alle = await ratenLesen(chef.seite);
|
||||||
|
ok(alle.length === 1, `DogFather sieht den Vorschlag (${alle.length})`);
|
||||||
|
ok(/Nachtfalter/.test(alle[0]?.unter || ""),
|
||||||
|
`und bei ihm steht, wer es war (${alle[0]?.unter})`);
|
||||||
|
ok(alle[0]?.knoepfe.includes("Nehmen") && alle[0]?.knoepfe.includes("Diesmal nicht"),
|
||||||
|
`er hat beide Knoepfe (${alle[0]?.knoepfe.join(" / ")})`);
|
||||||
|
const zahl = await chef.seite.textContent("#raten-zahl");
|
||||||
|
ok(/1 offen/.test(zahl || ""), `das Schild zaehlt die offenen (${zahl})`);
|
||||||
|
await bild(chef.seite, "8-angeraten-dogfather");
|
||||||
|
|
||||||
|
/* NEHMEN -- und links muss es ankommen. */
|
||||||
|
await chef.seite.click(".raten-knopf--ja");
|
||||||
|
await chef.seite.waitForFunction(
|
||||||
|
() => document.querySelectorAll("#plan-liste .plan-zeile").length === 3,
|
||||||
|
null, { timeout: 10000 });
|
||||||
|
const p = await planLesen(chef.seite);
|
||||||
|
ok(p.length === 3, `nach Nehmen stehen drei Stuecke im Plan (${p.length})`);
|
||||||
|
const danach = await ratenLesen(chef.seite);
|
||||||
|
ok(danach[0]?.stand === "uebernommen",
|
||||||
|
`der Vorschlag steht auf uebernommen (${danach[0]?.stand})`);
|
||||||
|
ok(/kommt dran/.test(danach[0]?.unter || ""),
|
||||||
|
`und sagt kommt dran (${danach[0]?.unter})`);
|
||||||
|
await bild(chef.seite, "9-genommen-dogfather");
|
||||||
|
await chef.kontext.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
/* UND DER EINSENDER ERFAEHRT ES. Ohne diese Messung waere der Stand
|
||||||
|
nur im Pult richtig und beim Gast von gestern. */
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
const meine = await ratenLesen(gast.seite);
|
||||||
|
ok(meine[0]?.stand === "uebernommen",
|
||||||
|
`der Gast sieht den neuen Stand (${meine[0]?.stand})`);
|
||||||
|
ok(!meine[0]?.knoepfe.includes("\u00d7"),
|
||||||
|
"und kann nichts mehr zurueckziehen, was entschieden ist");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
/* LENNY SIEHT NICHTS DAVON -- "nur ich und vanvan sehen sie",
|
||||||
|
gemessen und nicht nur gelesen. */
|
||||||
|
const lenny = await alsWer("gast2", 1440, 900);
|
||||||
|
const seine = await ratenLesen(lenny.seite);
|
||||||
|
ok(seine.length === 0, `Lenny sieht fremde Vorschlaege nicht (${seine.length})`);
|
||||||
|
const leck = await leckLesen(lenny.seite, ["Nachtfalter", "aqz-KE-bpKQ"]);
|
||||||
|
ok(leck.length === 0, "und auch nicht im Dokument"
|
||||||
|
+ (leck.length ? " -> " + leck.join(", ") : ""));
|
||||||
|
await lenny.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
7. DIE GEGENPROBEN
|
||||||
|
|
||||||
|
Fuenf Messungen oben koennen "in Ordnung" sagen. Hier wird jede
|
||||||
|
absichtlich kaputtgemacht -- schlaegt sie nicht an, ist sie
|
||||||
|
wertlos, und alle gruenen Haken davor beweisen nichts.
|
||||||
|
===================================================================== */
|
||||||
|
console.log("\n=== 7. Gegenproben ===");
|
||||||
|
{
|
||||||
|
const chef = await alsWer("admin", 390, 844);
|
||||||
|
|
||||||
|
/* (a) Die Reihenfolge am Telefon. */
|
||||||
|
await chef.seite.addStyleTag({ content: ".foyer-reihe--saal { order: 9 !important; }" });
|
||||||
|
await chef.seite.waitForTimeout(120);
|
||||||
|
const verdreht = await reihenLesen(chef.seite);
|
||||||
|
ok(!(verdreht.saal.oben < verdreht.raten.oben),
|
||||||
|
`Gegenprobe: eine verdrehte Reihenfolge wird erkannt `
|
||||||
|
+ `(${verdreht.saal.oben} / ${verdreht.raten.oben} px)`);
|
||||||
|
|
||||||
|
/* (b) Ein zu kleines Beruehrziel. */
|
||||||
|
await chef.seite.addStyleTag({
|
||||||
|
content: "#raten-los { min-height: 0 !important; height: 20px !important;"
|
||||||
|
+ " padding: 0 !important; }",
|
||||||
|
});
|
||||||
|
await chef.seite.waitForTimeout(120);
|
||||||
|
const klein = await massLesen(chef.seite);
|
||||||
|
ok(!!klein.ziel && klein.ziel.hoch < 44,
|
||||||
|
`Gegenprobe: ein 20-px-Knopf wird gefunden (${klein.ziel?.hoch} px)`);
|
||||||
|
|
||||||
|
/* (c) Eine zu kleine Schrift. */
|
||||||
|
await chef.seite.addStyleTag({ content: "#saal-satz { font-size: 9px !important; }" });
|
||||||
|
await chef.seite.waitForTimeout(120);
|
||||||
|
const winzig = await massLesen(chef.seite);
|
||||||
|
ok(!!winzig.schrift && winzig.schrift.gr < 11.5,
|
||||||
|
`Gegenprobe: 9-px-Schrift wird gefunden (${winzig.schrift?.gr} px)`);
|
||||||
|
|
||||||
|
/* (d) Und ein Ueberstand. */
|
||||||
|
await chef.seite.addStyleTag({ content: "#saal-titel { width: 900px !important; }" });
|
||||||
|
await chef.seite.waitForTimeout(120);
|
||||||
|
const breit = await massLesen(chef.seite);
|
||||||
|
ok(breit.ueber > 0, `Gegenprobe: ein Ueberstand wird gemessen (${breit.ueber} px)`);
|
||||||
|
await chef.kontext.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const gast = await alsWer("gast", 1440, 900);
|
||||||
|
|
||||||
|
/* (e) Das Leck. Ein Wort wird von Hand ins Dokument geschrieben --
|
||||||
|
findet die Messung es nicht, hat sie oben nichts geprueft. */
|
||||||
|
await gast.seite.evaluate(() => {
|
||||||
|
document.getElementById("saal-satz").textContent += " ZZTESTWORTZZ";
|
||||||
|
});
|
||||||
|
const leck = await leckLesen(gast.seite, ["ZZTESTWORTZZ"]);
|
||||||
|
ok(leck.length === 1, "Gegenprobe: ein Wort im Dokument wird gefunden");
|
||||||
|
|
||||||
|
/* (f) Die Reihen-Messung muss eine AUFGEDECKTE Reihe auch sichtbar
|
||||||
|
nennen -- sonst waere "der Plan steht nicht da" oben nur die
|
||||||
|
Folge davon, dass sie nie etwas findet. */
|
||||||
|
await gast.seite.evaluate(() => {
|
||||||
|
document.getElementById("reihe-plan").hidden = false;
|
||||||
|
});
|
||||||
|
await gast.seite.waitForTimeout(120);
|
||||||
|
const sichtbar = await reihenLesen(gast.seite);
|
||||||
|
ok(sichtbar.plan !== null, "Gegenprobe: eine aufgedeckte Reihe gilt als sichtbar");
|
||||||
|
await gast.kontext.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
SCHLUSS
|
||||||
|
===================================================================== */
|
||||||
|
await browser.close();
|
||||||
|
await new Promise((r) => vorbau.close(r));
|
||||||
|
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||||
|
|
||||||
|
/* DIE ANZAHL GEHOERT IN DIE BEDINGUNG. Faende dieses Werkzeug keine
|
||||||
|
einzige Messung, waere "0 Fehler" das beste Ergebnis ueberhaupt --
|
||||||
|
und voellig wertlos. */
|
||||||
|
console.log(`\n${geprueft} Messungen, ${fehler} Fehler`);
|
||||||
|
if (geprueft < 40) {
|
||||||
|
console.log(`NICHT NACHSEHBAR: nur ${geprueft} Messungen gelaufen, erwartet mindestens 40.`);
|
||||||
|
process.exit(3);
|
||||||
|
}
|
||||||
|
if (fehler) {
|
||||||
|
console.log("NICHT IN ORDNUNG");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
console.log("ALLES IN ORDNUNG");
|
||||||
|
process.exit(0);
|
||||||
@@ -123,6 +123,12 @@ const COMMUNITY_SEITEN = [
|
|||||||
dieser Eintrag hier; die Pruefung sagt beim Anschlagen selbst,
|
dieser Eintrag hier; die Pruefung sagt beim Anschlagen selbst,
|
||||||
welche Seite fehlt oder zu viel ist. */
|
welche Seite fehlt oder zu viel ist. */
|
||||||
"reaktion.html", // zusammen schauen (seit 28.09.2026)
|
"reaktion.html", // zusammen schauen (seit 28.09.2026)
|
||||||
|
/* DAS FOYER davor (08.10.2026): die Seite, auf die die Kachel
|
||||||
|
seither zeigt. Sie ist IMMER offen -- dort steht, was ansteht,
|
||||||
|
und dort kann jeder ein Video anraten. Was darin nur die zwei
|
||||||
|
sehen duerfen, entscheidet der Server bei den Daten und nicht
|
||||||
|
diese Liste. */
|
||||||
|
"reaktion-foyer.html", // das Foyer davor (seit 08.10.2026)
|
||||||
"start.html", // die Wand
|
"start.html", // die Wand
|
||||||
"steckbrief.html", // der eigene Steckbrief
|
"steckbrief.html", // der eigene Steckbrief
|
||||||
"support.html", // etwas ist kaputt (seit 24.09. fuer alle)
|
"support.html", // etwas ist kaputt (seit 24.09. fuer alle)
|
||||||
|
|||||||
@@ -620,20 +620,35 @@ console.log("\n=== Rollenlisten: eine Quelle, nicht neun");
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* =======================================================================
|
/* =======================================================================
|
||||||
DIE SIEBEN KOPIEN DER MODULLISTE MÜSSEN GLEICH SEIN
|
DIE ACHT KOPIEN DER MODULLISTE MÜSSEN GLEICH SEIN
|
||||||
|
|
||||||
module.css beschreibt die Form aller Module -- Silhouette,
|
module.css beschreibt die Form aller Module -- Silhouette,
|
||||||
Kantenlicht, Raster, Handy, Kontrastmodus. Dieselbe Klassenliste
|
Kantenlicht, Raster, Umrandung beim Tabben, Handy, Kontrastmodus.
|
||||||
steht dafür siebenmal in der Datei (im Kontrastmodus dreimal); CSS
|
Dieselbe Klassenliste steht dafür achtmal in der Datei (im
|
||||||
kennt keine Variable für Selektoren.
|
Kontrastmodus dreimal); CSS kennt keine Variable für Selektoren.
|
||||||
|
|
||||||
|
WARUM DIE ZAHL VON SIEBEN AUF ACHT GESTIEGEN IST (08.10.2026):
|
||||||
|
Nicht, weil eine Kopie dazugekommen wäre. Die achte stand seit dem
|
||||||
|
07.09.2026 da -- die Umrandung beim Tabben (`:focus-visible`) --,
|
||||||
|
nur ohne Marke. Sie wurde deshalb als Einzige nie verglichen, und
|
||||||
|
das ausgerechnet bei der Regel, die niemand sieht, solange er die
|
||||||
|
Maus benutzt. Aufgefallen ist es beim Eintragen von
|
||||||
|
`.foyer-reihe`: acht Vorkommen der Liste, sieben Marken. Eine
|
||||||
|
steigende Zahl ist hier also kein Mehraufwand, sondern eine
|
||||||
|
geschlossene Lücke.
|
||||||
|
|
||||||
|
EINE ZAHL, DIE SICH ÄNDERT, WIRD ERKLÄRT -- auch wenn sie steigt.
|
||||||
|
Die Hausregel kennt nur den Fall der FALLENDEN Prüfzahl; der Grund
|
||||||
|
dahinter gilt aber in beide Richtungen: Wer eine Zahl anpasst,
|
||||||
|
ohne zu sagen warum, hat die Prüfung an das Ergebnis angepasst.
|
||||||
|
|
||||||
Das ist die verwundbare Stelle: Wer eine Karte hinzufügt und nur
|
Das ist die verwundbare Stelle: Wer eine Karte hinzufügt und nur
|
||||||
sechs der sieben Stellen pflegt, bekommt eine Karte MIT Schräge und
|
sieben der acht Stellen pflegt, bekommt eine Karte MIT Schräge und
|
||||||
OHNE Kantenlicht -- und niemandem fällt es auf, weil nichts kaputt
|
OHNE Kantenlicht -- und niemandem fällt es auf, weil nichts kaputt
|
||||||
geht. Genau diese Sorte stiller Abweichung fängt hier eine Prüfung
|
geht. Genau diese Sorte stiller Abweichung fängt hier eine Prüfung
|
||||||
ab, statt sich auf Sorgfalt zu verlassen.
|
ab, statt sich auf Sorgfalt zu verlassen.
|
||||||
======================================================================= */
|
======================================================================= */
|
||||||
console.log("\n=== module.css: die Modulliste steht siebenmal — und überall gleich");
|
console.log("\n=== module.css: die Modulliste steht achtmal — und überall gleich");
|
||||||
{
|
{
|
||||||
const pfad = join(WURZEL, "workspace/assets/css/module.css");
|
const pfad = join(WURZEL, "workspace/assets/css/module.css");
|
||||||
const text = readFileSync(pfad, "utf8");
|
const text = readFileSync(pfad, "utf8");
|
||||||
@@ -649,7 +664,7 @@ console.log("\n=== module.css: die Modulliste steht siebenmal — und überall g
|
|||||||
/* Die Anzahl gehört in die BEDINGUNG, nicht nur in den Meldetext:
|
/* Die Anzahl gehört in die BEDINGUNG, nicht nur in den Meldetext:
|
||||||
Fände die Prüfung keine einzige Liste, wäre "alle gleich" sonst
|
Fände die Prüfung keine einzige Liste, wäre "alle gleich" sonst
|
||||||
trivial erfüllt -- grün, ohne etwas angesehen zu haben. */
|
trivial erfüllt -- grün, ohne etwas angesehen zu haben. */
|
||||||
ok(listen.length === 7, `sieben markierte Kopien gefunden (${listen.length})`);
|
ok(listen.length === 8, `acht markierte Kopien gefunden (${listen.length})`);
|
||||||
|
|
||||||
const erste = listen[0] || [];
|
const erste = listen[0] || [];
|
||||||
ok(erste.length >= 30, `die Liste umfasst ${erste.length} Klassen`);
|
ok(erste.length >= 30, `die Liste umfasst ${erste.length} Klassen`);
|
||||||
@@ -657,7 +672,7 @@ console.log("\n=== module.css: die Modulliste steht siebenmal — und überall g
|
|||||||
const abweichung = listen.findIndex(
|
const abweichung = listen.findIndex(
|
||||||
(l) => l.length !== erste.length || l.some((k, i) => k !== erste[i]));
|
(l) => l.length !== erste.length || l.some((k, i) => k !== erste[i]));
|
||||||
ok(abweichung === -1, abweichung === -1
|
ok(abweichung === -1, abweichung === -1
|
||||||
? "alle sieben Kopien sind Zeichen für Zeichen gleich"
|
? "alle acht Kopien sind Zeichen für Zeichen gleich"
|
||||||
: `Kopie ${abweichung + 1} weicht ab (${listen[abweichung].length} statt ${erste.length} Klassen)`);
|
: `Kopie ${abweichung + 1} weicht ab (${listen[abweichung].length} statt ${erste.length} Klassen)`);
|
||||||
|
|
||||||
/* GEGENPROBE: Der Vergleich muss auch NEIN sagen können. Ohne sie
|
/* GEGENPROBE: Der Vergleich muss auch NEIN sagen können. Ohne sie
|
||||||
|
|||||||
+309
-1
@@ -784,7 +784,10 @@ melde("=== 10. Was um die Seite herum stimmen muss ===");
|
|||||||
haben sich in diesem Haus schon zweimal geaendert. */
|
haben sich in diesem Haus schon zweimal geaendert. */
|
||||||
const w = await import("./workspace.js");
|
const w = await import("./workspace.js");
|
||||||
const alle = w.bereicheFuer({ id: IDS.gast, rolle: "gast", name: "Nachtfalter" }, CREW);
|
const alle = w.bereicheFuer({ id: IDS.gast, rolle: "gast", name: "Nachtfalter" }, CREW);
|
||||||
const kachel = (alle || []).find((b) => b.ziel === "reaktion.html");
|
/* SEIT DEM 08.10.2026 ZEIGT SIE AUFS FOYER. Filipe: „wenn man
|
||||||
|
drauf drückt geht zuerst eine seite auf mit reihen/kategorien."
|
||||||
|
In den Saal geht es von dort aus. */
|
||||||
|
const kachel = (alle || []).find((b) => b.ziel === "reaktion-foyer.html");
|
||||||
ok(!!kachel, "die Community hat die Reaction-Kachel");
|
ok(!!kachel, "die Community hat die Reaction-Kachel");
|
||||||
ok(kachel?.live === true,
|
ok(kachel?.live === true,
|
||||||
"sie traegt das Merkmal `live` statt einer Ton-Nummer (der Farbraum ist bei 46 voll)");
|
"sie traegt das Merkmal `live` statt einer Ton-Nummer (der Farbraum ist bei 46 voll)");
|
||||||
@@ -3200,6 +3203,311 @@ melde("=== 19. Vorraum, Geraete, zweites Video ===");
|
|||||||
"und wer mit der Tastatur bedient, wird gesehen");
|
"und wer mit der Tastatur bedient, wird gesehen");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =======================================================================
|
||||||
|
20. DAS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn
|
||||||
|
man drauf drückt geht zuerst eine seite auf mit reihen/kategorien.
|
||||||
|
links eine reihe wo die nächsten geplanten videos schon bereit
|
||||||
|
stehen. wan und umd wie viel uhr … und das soll geschlossen sein
|
||||||
|
außer für vanvan und dogfather. in der mitte sollen die leute dan
|
||||||
|
wenn eine sendung läuft drauf drücken können und der sendung
|
||||||
|
beitreten … und dan rechts … da können die leute videos
|
||||||
|
reinschicken und nur ich und vanvan sehen sie."
|
||||||
|
======================================================================= */
|
||||||
|
melde("");
|
||||||
|
melde("=== 20. Das Foyer: Plan, Eintritt, Vorschlaege ===");
|
||||||
|
{
|
||||||
|
/* ---- Die Seite selbst ---- */
|
||||||
|
for (const rolle of ["admin", "hand", "linke", "modi", "gast"]) {
|
||||||
|
const s = await roh(CREW, "/workspace/reaktion-foyer.html", { keks: k[rolle] });
|
||||||
|
ok(s.code === 200, `${rolle}: kommt ins Foyer (${s.code})`);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const kAgentur = await anmelden("admin", AGENTUR);
|
||||||
|
const a = await roh(AGENTUR, "/workspace/reaktion-foyer.html", { keks: kAgentur });
|
||||||
|
ok(!!kAgentur && a.code === 404, `und die Agentur kennt es nicht (${a.code})`);
|
||||||
|
}
|
||||||
|
/* DIE KACHEL ZEIGT AUFS FOYER UND NICHT MEHR IN DEN SAAL. Zeigte
|
||||||
|
sie weiter auf `reaktion.html`, gaebe es das Foyer zwar -- nur
|
||||||
|
fuehrte kein Weg hin. */
|
||||||
|
{
|
||||||
|
const w = await import("./workspace.js");
|
||||||
|
const alle = w.bereicheFuer({ id: IDS.gast, rolle: "gast", name: "Nachtfalter" }, CREW);
|
||||||
|
const kachel = (alle || []).find((b) => b.name === "Reaction");
|
||||||
|
ok(kachel?.ziel === "reaktion-foyer.html",
|
||||||
|
`die Kachel fuehrt ins Foyer (${kachel?.ziel})`);
|
||||||
|
ok(kachel?.live === true,
|
||||||
|
"und traegt weiterhin ihren Zustand (grau / bernstein / rot)");
|
||||||
|
/* ==== UND DER SAAL BLEIBT TROTZDEM ERREICHBAR ==============
|
||||||
|
Er hat seit heute KEINE Kachel mehr, und die Adressregel vom
|
||||||
|
15.09. verlangt eine. Ohne den Eintrag in
|
||||||
|
OHNE_KACHEL_UEBERALL liefe der Knopf „Jetzt beitreten" auf
|
||||||
|
die Startseite -- wortlos. Genau so ist diese Pruefung beim
|
||||||
|
Umhaengen rot geworden. */
|
||||||
|
ok(w.OHNE_KACHEL_UEBERALL.has("/workspace/reaktion.html"),
|
||||||
|
"und der Saal ist ohne Kachel trotzdem erreichbar");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Der Termin an der Warteschlange ---- */
|
||||||
|
await roh(CREW, "/workspace/api/reaktion/zuruecksetzen", { method: "POST", keks: k.admin });
|
||||||
|
const angehaengt = await roh(CREW, "/workspace/api/reaktion/liste", {
|
||||||
|
method: "POST", keks: k.admin, rumpf: { video: "dQw4w9WgXcQ" },
|
||||||
|
});
|
||||||
|
const zeile = (angehaengt.j?.liste || [])[0];
|
||||||
|
ok(!!zeile, `ein Video liegt bereit (${angehaengt.code})`);
|
||||||
|
ok(zeile?.wann === "", `und es hat zuerst KEINEN Termin ("${zeile?.wann}")`);
|
||||||
|
|
||||||
|
const termin = new Date(Date.now() + 86400000).toISOString();
|
||||||
|
const gesetzt = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||||
|
method: "PUT", keks: k.admin, rumpf: { wann: termin },
|
||||||
|
});
|
||||||
|
ok(gesetzt.code === 200
|
||||||
|
&& (gesetzt.j?.liste || []).find((z) => z.id === zeile.id)?.wann === termin,
|
||||||
|
`der Termin laesst sich setzen (${gesetzt.code})`);
|
||||||
|
|
||||||
|
const leer = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||||
|
method: "PUT", keks: k.admin, rumpf: { wann: "" },
|
||||||
|
});
|
||||||
|
ok(leer.code === 200
|
||||||
|
&& (leer.j?.liste || []).find((z) => z.id === zeile.id)?.wann === "",
|
||||||
|
"und wieder wegnehmen -- leer ist ein gueltiger Wert und der Normalfall");
|
||||||
|
await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||||
|
method: "PUT", keks: k.admin, rumpf: { wann: termin },
|
||||||
|
});
|
||||||
|
|
||||||
|
const quatsch = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||||
|
method: "PUT", keks: k.admin, rumpf: { wann: "irgendwann mal" },
|
||||||
|
});
|
||||||
|
ok(quatsch.code === 400 && quatsch.j?.fehler === "termin_unklar",
|
||||||
|
`ein freier Text wird abgelehnt (${quatsch.code}/${quatsch.j?.fehler})`);
|
||||||
|
|
||||||
|
for (const rolle of ["linke", "modi", "gast"]) {
|
||||||
|
const a = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||||
|
method: "PUT", keks: k[rolle], rumpf: { wann: termin },
|
||||||
|
});
|
||||||
|
ok(a.code === 403, `${rolle}: setzt keinen Termin (${a.code})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==== UND DIE GANZE REIHE SIEHT NUR DIE LEITUNG ==============
|
||||||
|
Filipe: „und das soll geschlossen sein außer für vanvan und
|
||||||
|
dogfather." Die Reihe im Foyer entsteht aus `liste` -- wer die
|
||||||
|
nicht bekommt, bekommt die Reihe nicht. */
|
||||||
|
{
|
||||||
|
const beiDenZweien = await roh(CREW, "/workspace/api/reaktion", { keks: k.hand });
|
||||||
|
ok(Array.isArray(beiDenZweien.j?.liste) && beiDenZweien.j.liste.length > 0,
|
||||||
|
"die rechte Hand bekommt den Plan");
|
||||||
|
for (const rolle of ["linke", "modi", "gast"]) {
|
||||||
|
const a = await roh(CREW, "/workspace/api/reaktion", { keks: k[rolle] });
|
||||||
|
ok(a.j?.liste === null, `${rolle}: bekommt ihn NICHT (${a.j?.liste})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Die Vorschlaege ---- */
|
||||||
|
const v1 = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.gast,
|
||||||
|
rumpf: { video: "https://www.youtube.com/watch?v=9bZkp7q19f0", notiz: "Das waere was" },
|
||||||
|
});
|
||||||
|
ok(v1.code === 201, `ein Zuschauer darf anraten (${v1.code})`);
|
||||||
|
ok(v1.j?.vorschlag?.video === "9bZkp7q19f0",
|
||||||
|
`aus der Adresse wird die Kennung (${v1.j?.vorschlag?.video})`);
|
||||||
|
|
||||||
|
/* EINER JE PERSON UND MINUTE -- gegen den Doppelklick. */
|
||||||
|
const vSchnell = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.gast, rumpf: { video: "bm0sK2-KkW8" },
|
||||||
|
});
|
||||||
|
ok(vSchnell.code === 429, `zweimal gleich hintereinander nicht (${vSchnell.code})`);
|
||||||
|
|
||||||
|
const vDoppelt = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.gast2, rumpf: { video: "9bZkp7q19f0" },
|
||||||
|
});
|
||||||
|
ok(vDoppelt.code === 409 && vDoppelt.j?.fehler === "vorschlag_doppelt",
|
||||||
|
`dasselbe Video nicht zweimal offen (${vDoppelt.code}/${vDoppelt.j?.fehler})`);
|
||||||
|
|
||||||
|
const vBereit = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.modi, rumpf: { video: "dQw4w9WgXcQ" },
|
||||||
|
});
|
||||||
|
ok(vBereit.code === 409 && vBereit.j?.fehler === "steht_schon_bereit",
|
||||||
|
`und nichts, was schon bereitliegt (${vBereit.code}/${vBereit.j?.fehler})`);
|
||||||
|
|
||||||
|
/* ==== WER SIEHT WAS -- DIE EIGENTLICHE FRAGE =================
|
||||||
|
Filipe: „nur ich und vanvan sehen sie." */
|
||||||
|
{
|
||||||
|
const beiDogi = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.admin });
|
||||||
|
ok(beiDogi.j?.darf_entscheiden === true && (beiDogi.j?.vorschlaege || []).length === 1,
|
||||||
|
`DogFather sieht alle (${beiDogi.j?.vorschlaege?.length})`);
|
||||||
|
ok(beiDogi.j?.vorschlaege?.[0]?.name === "Nachtfalter",
|
||||||
|
`mit dem Namen dessen, der ihn geschickt hat (${beiDogi.j?.vorschlaege?.[0]?.name})`);
|
||||||
|
ok(beiDogi.j?.offen === 1, `und wie viele offen sind (${beiDogi.j?.offen})`);
|
||||||
|
|
||||||
|
const beiVanVan = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.hand });
|
||||||
|
ok((beiVanVan.j?.vorschlaege || []).length === 1, "die rechte Hand auch");
|
||||||
|
|
||||||
|
/* DER EINSENDER SIEHT SEINEN EIGENEN -- und zwar OHNE Namen:
|
||||||
|
Dort staende er selbst, und eine Zeile, die einem den eigenen
|
||||||
|
Namen vorliest, ist Platz ohne Auskunft. */
|
||||||
|
const beiIhr = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast });
|
||||||
|
ok(beiIhr.j?.darf_entscheiden === false && (beiIhr.j?.vorschlaege || []).length === 1,
|
||||||
|
"der Einsender sieht seinen eigenen");
|
||||||
|
ok(beiIhr.j?.vorschlaege?.[0]?.name === undefined,
|
||||||
|
"aber keinen Namen");
|
||||||
|
ok(beiIhr.j?.offen === null, "und nicht, wie viele insgesamt offen sind");
|
||||||
|
|
||||||
|
/* UND EIN DRITTER SIEHT GAR NICHTS. Das ist der Satz, um den es
|
||||||
|
geht. */
|
||||||
|
const fremd = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast2 });
|
||||||
|
ok((fremd.j?.vorschlaege || []).length === 0,
|
||||||
|
`wer nichts geschickt hat, sieht nichts (${fremd.j?.vorschlaege?.length})`);
|
||||||
|
const modi = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.modi });
|
||||||
|
ok((modi.j?.vorschlaege || []).length === 0,
|
||||||
|
"auch ein Modi nicht -- Moderation ist etwas anderes als Leitung");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Entscheiden ---- */
|
||||||
|
const offene = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.admin });
|
||||||
|
const vid = offene.j.vorschlaege[0].id;
|
||||||
|
for (const rolle of ["linke", "modi", "gast"]) {
|
||||||
|
const a = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||||
|
method: "POST", keks: k[rolle],
|
||||||
|
});
|
||||||
|
ok(a.code === 403, `${rolle}: entscheidet nicht (${a.code})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const vorListe = (await roh(CREW, "/workspace/api/reaktion", { keks: k.admin }))
|
||||||
|
.j?.liste?.length || 0;
|
||||||
|
const genommen = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||||
|
method: "POST", keks: k.admin,
|
||||||
|
});
|
||||||
|
ok(genommen.code === 200 && (genommen.j?.liste || []).length === vorListe + 1,
|
||||||
|
`uebernehmen legt es in die Warteschlange (${vorListe} -> ${genommen.j?.liste?.length})`);
|
||||||
|
ok((genommen.j?.liste || []).some((z) => z.video === "9bZkp7q19f0"),
|
||||||
|
"und zwar genau dieses Video");
|
||||||
|
|
||||||
|
const nochmal = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||||
|
method: "POST", keks: k.admin,
|
||||||
|
});
|
||||||
|
ok(nochmal.code === 409 && nochmal.j?.fehler === "schon_entschieden",
|
||||||
|
`zweimal uebernehmen geht nicht (${nochmal.code}/${nochmal.j?.fehler})`);
|
||||||
|
|
||||||
|
/* DER EINSENDER ERFAEHRT, WAS DARAUS WURDE. Ohne das waere das
|
||||||
|
Feld ein Loch, in das man etwas wirft. */
|
||||||
|
{
|
||||||
|
const beiIhr = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast });
|
||||||
|
ok(beiIhr.j?.vorschlaege?.[0]?.stand === "uebernommen",
|
||||||
|
`und sie sieht, dass er drankommt (${beiIhr.j?.vorschlaege?.[0]?.stand})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Ablehnen und Zurueckziehen ---- */
|
||||||
|
{
|
||||||
|
const neu = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.gast2, rumpf: { video: "bm0sK2-KkW8" },
|
||||||
|
});
|
||||||
|
ok(neu.code === 201, `noch ein Vorschlag (${neu.code})`);
|
||||||
|
const id2 = neu.j.vorschlag.id;
|
||||||
|
|
||||||
|
/* Ein Fremder kann ihn nicht wegnehmen -- auch nicht den
|
||||||
|
offenen. */
|
||||||
|
const fremdWeg = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}`, {
|
||||||
|
method: "DELETE", keks: k.gast,
|
||||||
|
});
|
||||||
|
ok(fremdWeg.code === 403 && fremdWeg.j?.fehler === "nicht_deiner",
|
||||||
|
`ein Fremder nimmt ihn nicht weg (${fremdWeg.code}/${fremdWeg.j?.fehler})`);
|
||||||
|
|
||||||
|
const abgelehnt = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}/ablehnen`, {
|
||||||
|
method: "POST", keks: k.admin,
|
||||||
|
});
|
||||||
|
ok(abgelehnt.code === 200, `ablehnen geht (${abgelehnt.code})`);
|
||||||
|
const danach = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast2 });
|
||||||
|
ok(danach.j?.vorschlaege?.[0]?.stand === "abgelehnt",
|
||||||
|
"und er sieht es -- die Zeile bleibt stehen");
|
||||||
|
|
||||||
|
/* ==== WAS ENTSCHIEDEN IST, ZIEHT ER NICHT ZURUECK ==========
|
||||||
|
Sonst verschwaende die Spur, dass ueberhaupt entschieden
|
||||||
|
wurde -- und derselbe Vorschlag saehe beim naechsten Mal aus
|
||||||
|
wie der erste. */
|
||||||
|
const zurueck = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}`, {
|
||||||
|
method: "DELETE", keks: k.gast2,
|
||||||
|
});
|
||||||
|
ok(zurueck.code === 403,
|
||||||
|
`einen abgelehnten zieht der Einsender nicht zurueck (${zurueck.code})`);
|
||||||
|
/* GEGENPROBE: einen OFFENEN schon. Ohne sie bewiese das Obige
|
||||||
|
nur, dass Loeschen ueberhaupt nicht geht. */
|
||||||
|
const frisch = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.linke, rumpf: { video: "kJQP7kiw5Fk" },
|
||||||
|
});
|
||||||
|
const weg = await roh(CREW, `/workspace/api/reaktion/vorschlag/${frisch.j.vorschlag.id}`, {
|
||||||
|
method: "DELETE", keks: k.linke,
|
||||||
|
});
|
||||||
|
ok(frisch.code === 201 && weg.code === 200,
|
||||||
|
`Gegenprobe: seinen eigenen OFFENEN schon (${weg.code})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Die Grenze je Person ---- */
|
||||||
|
{
|
||||||
|
const { db } = await import("./workspace.js");
|
||||||
|
const { VORSCHLAEGE_JE_PERSON } = await import("./reaktion-tabellen.js");
|
||||||
|
/* Zurueckdatieren statt warten: Eine Pruefung, die 45 Sekunden
|
||||||
|
je Vorschlag wartet, wird beim naechsten Mal uebersprungen. */
|
||||||
|
const alt = () => db().prepare("UPDATE reaktion_vorschlaege SET erstellt = ?"
|
||||||
|
+ " WHERE person_id = ?").run(new Date(Date.now() - 600_000).toISOString(), IDS.modi);
|
||||||
|
|
||||||
|
const kennungen = ["aqz-KE-bpKQ", "ZZ5LpwO-An4", "e-ORhEE9VVg", "YQHsXMglC9A", "fJ9rUzIMcZQ"];
|
||||||
|
let letzte = null;
|
||||||
|
for (const v of kennungen) {
|
||||||
|
alt();
|
||||||
|
letzte = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.modi, rumpf: { video: v },
|
||||||
|
});
|
||||||
|
if (letzte.code !== 201) break;
|
||||||
|
}
|
||||||
|
alt();
|
||||||
|
const einerZuViel = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||||
|
method: "POST", keks: k.modi, rumpf: { video: "L_jWHffIx5E" },
|
||||||
|
});
|
||||||
|
ok(einerZuViel.code === 409 && einerZuViel.j?.fehler === "zu_viele_vorschlaege",
|
||||||
|
`hoechstens ${VORSCHLAEGE_JE_PERSON} offene je Person `
|
||||||
|
+ `(${einerZuViel.code}/${einerZuViel.j?.fehler})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Und was auf der Seite stehen muss ---- */
|
||||||
|
{
|
||||||
|
const html = readFileSync(join(HIER, "..", "workspace", "reaktion-foyer.html"), "utf8");
|
||||||
|
const js = readFileSync(
|
||||||
|
join(HIER, "..", "workspace", "assets", "js", "reaktion-foyer.js"), "utf8");
|
||||||
|
const css = readFileSync(
|
||||||
|
join(HIER, "..", "workspace", "assets", "css", "foyer.css"), "utf8");
|
||||||
|
ok(/id="reihe-plan"/.test(html) && /id="reihe-saal"/.test(html)
|
||||||
|
&& /id="reihe-raten"/.test(html),
|
||||||
|
"die drei Reihen stehen in der Seite");
|
||||||
|
ok(/id="saal-knopf"/.test(html) && /href="reaktion\.html"/.test(html),
|
||||||
|
"und die Mitte fuehrt in den Saal");
|
||||||
|
ok(/<a class="saal-knopf"/.test(html),
|
||||||
|
"der Weg hinein ist ein Link und kein Knopf -- mittlere Maustaste, neuer Reiter");
|
||||||
|
ok(/id="raten-form"/.test(html), "rechts kann man etwas anraten");
|
||||||
|
/* DER PLAN DARF NICHT AN DER ROLLE HAENGEN, SONDERN AN DEN DATEN.
|
||||||
|
Eine zweite Rollenliste im Browser waere die, die irgendwann
|
||||||
|
von der echten abweicht. */
|
||||||
|
ok(!/rolle\s*===\s*['"]admin/.test(js),
|
||||||
|
"das Foyer fuehrt keine eigene Rollenliste");
|
||||||
|
ok(/Array\.isArray\(lage\?\.liste\)/.test(js),
|
||||||
|
"es fragt, ob die Auskunft gekommen ist");
|
||||||
|
ok(/visibilityState/.test(js),
|
||||||
|
"und fragt nicht nach, wenn der Reiter im Hintergrund liegt");
|
||||||
|
ok(/foyer-reihen/.test(css) && /grid-template-columns/.test(css),
|
||||||
|
"das Stilblatt kennt die drei Reihen");
|
||||||
|
ok(/@media \(max-width: 900px\)/.test(css) && /order: 1/.test(css),
|
||||||
|
"am Handy steht die Mitte oben");
|
||||||
|
|
||||||
|
/* ---- Und „geschlossen" steht nicht mehr an der Kachel ---- */
|
||||||
|
const start = readFileSync(
|
||||||
|
join(HIER, "..", "workspace", "assets", "css", "start.css"), "utf8");
|
||||||
|
ok(!/content:\s*"geschlossen"/.test(start),
|
||||||
|
"die Kachel sagt nicht mehr „geschlossen“");
|
||||||
|
ok(/content:\s*"gleich"/.test(start) && /content:\s*"● live"/.test(start),
|
||||||
|
"Gegenprobe: „gleich“ und „live“ stehen weiterhin da");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
melde("");
|
melde("");
|
||||||
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
|
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
|
||||||
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
|
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
|
||||||
|
|||||||
@@ -97,6 +97,57 @@ export const EINLADUNG_SEKUNDEN = 120;
|
|||||||
sieht im Quelltext aus wie eine Regel und ist keine -- genau die
|
sieht im Quelltext aus wie eine Regel und ist keine -- genau die
|
||||||
Sorte Zeile, auf die man sich beim naechsten Umbau verlaesst. */
|
Sorte Zeile, auf die man sich beim naechsten Umbau verlaesst. */
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
DAS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Filipe: „wenn man drauf drückt geht zuerst eine seite auf mit
|
||||||
|
reihen/kategorien. links eine reihe wo die nächsten geplanten
|
||||||
|
videos schon bereit stehen. wan und umd wie viel uhr … und das
|
||||||
|
soll geschlossen sein außer für vanvan und dogfather. in der mitte
|
||||||
|
sollen die leute dan wenn eine sendung läuft drauf drücken können
|
||||||
|
und der sendung beitreten … und dan rechts … da können die leute
|
||||||
|
videos reinschicken und nur ich und vanvan sehen sie."
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
WARUM DER PLAN KEINE ZWEITE LISTE BEKOMMT
|
||||||
|
|
||||||
|
Die naheliegende Loesung waere eine eigene Tabelle „Sendeplan"
|
||||||
|
gewesen. Es gibt aber schon eine Liste mit genau diesem Inhalt:
|
||||||
|
die WARTESCHLANGE. Sie ueberlebt das Beenden einer Sendung
|
||||||
|
ausdruecklich („Wer Videos fuer morgen vorbereitet, soll sie nicht
|
||||||
|
verlieren"), sie traegt Titel und Vorschaubild, und sie ist der
|
||||||
|
Ort, an dem die zwei ohnehin einraeumen.
|
||||||
|
|
||||||
|
Zwei Listen nebeneinander waeren zwei Antworten auf „was schauen
|
||||||
|
wir als Naechstes" -- und spaetestens beim ersten Verschieben
|
||||||
|
liefen sie auseinander. Die Schlange bekommt deshalb nur EINE
|
||||||
|
Spalte dazu: WANN.
|
||||||
|
|
||||||
|
LEER IST EIN GUELTIGER WERT und der Normalfall: „liegt bereit,
|
||||||
|
aber noch ohne Termin". Ein Pflichttermin haette aus einer
|
||||||
|
Vorbereitung eine Verabredung gemacht.
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Hoechstens so viele offene Vorschlaege je Person.
|
||||||
|
*
|
||||||
|
* Fuenf. Nicht gegen Boeswilligkeit -- dagegen hilft eine Zahl
|
||||||
|
* nicht --, sondern gegen die Liste, die niemand mehr durchsieht:
|
||||||
|
* Wer zwanzig Videos einschickt, bekommt keine Antwort mehr, und
|
||||||
|
* dann schickt er beim naechsten Mal gar keins. */
|
||||||
|
export const VORSCHLAEGE_JE_PERSON = 5;
|
||||||
|
|
||||||
|
/** Was jemand zu seinem Vorschlag dazuschreiben darf. */
|
||||||
|
export const VORSCHLAG_NOTIZ_MAX = 200;
|
||||||
|
|
||||||
|
/** So viele Vorschlaege je Minute und Person.
|
||||||
|
*
|
||||||
|
* Einer. Wer zwei Videos im Kopf hat, tippt sie nicht in derselben
|
||||||
|
* Minute -- und ein Doppelklick soll nicht zwei Zeilen ergeben. */
|
||||||
|
export const VORSCHLAG_BREMSE_SEKUNDEN = 45;
|
||||||
|
|
||||||
|
/** Die Zustaende eines Vorschlags. */
|
||||||
|
export const VORSCHLAG_STAENDE = ["offen", "uebernommen", "abgelehnt"];
|
||||||
|
|
||||||
/** Ein Chatbeitrag in der Reaction. */
|
/** Ein Chatbeitrag in der Reaction. */
|
||||||
export const TEXT_MAX = 400;
|
export const TEXT_MAX = 400;
|
||||||
|
|
||||||
@@ -454,6 +505,49 @@ export function reaktionTabellen(d) {
|
|||||||
gesetzt_am TEXT NOT NULL
|
gesetzt_am TEXT NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* ==== WAS DIE LEUTE ANRATEN (08.10.2026) ====================
|
||||||
|
|
||||||
|
Filipe: „da können die leute videos reinschicken und nur ich
|
||||||
|
und vanvan sehen sie."
|
||||||
|
|
||||||
|
EINE EIGENE TABELLE UND NICHT DIE WARTESCHLANGE. Ein Vorschlag
|
||||||
|
ist eine Bitte, ein Eintrag in der Schlange eine Entscheidung.
|
||||||
|
Haetten beide dieselbe Tabelle, stuende auf der Wartetafel
|
||||||
|
„Danach: …" ein Video, das niemand ausgesucht hat -- und zwar
|
||||||
|
in dem Augenblick, in dem es jemand einschickt.
|
||||||
|
|
||||||
|
DIE ZEILE BLEIBT STEHEN, AUCH WENN SIE ABGELEHNT IST. Wer
|
||||||
|
etwas einschickt, soll sehen, dass es angekommen ist und was
|
||||||
|
daraus wurde. Eine Zeile, die verschwindet, sieht aus wie ein
|
||||||
|
Fehler -- und man schickt dasselbe Video noch einmal. */
|
||||||
|
CREATE TABLE IF NOT EXISTS reaktion_vorschlaege (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
person_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||||||
|
/* Der Name wird MITGESCHRIEBEN und nicht nur verwiesen: Wer
|
||||||
|
das Haus verlaesst, soll seinen Vorschlag nicht als
|
||||||
|
„(niemand)" hinterlassen. */
|
||||||
|
name TEXT NOT NULL DEFAULT '',
|
||||||
|
video TEXT NOT NULL,
|
||||||
|
titel TEXT NOT NULL DEFAULT '',
|
||||||
|
notiz TEXT NOT NULL DEFAULT '',
|
||||||
|
stand TEXT NOT NULL DEFAULT 'offen'
|
||||||
|
CHECK (stand IN ('offen','uebernommen','abgelehnt')),
|
||||||
|
erstellt TEXT NOT NULL,
|
||||||
|
erledigt_am TEXT,
|
||||||
|
erledigt_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
/* DASSELBE VIDEO NICHT ZWEIMAL OFFEN. Nicht aus Ordnungsliebe:
|
||||||
|
Bei einem Video, das drei Leute gut finden, stuende es
|
||||||
|
dreimal in der Liste -- und die Leitung entschiede dreimal
|
||||||
|
ueber dieselbe Sache. Die Bedingung laesst ABGELEHNTE und
|
||||||
|
UEBERNOMMENE nebeneinander stehen; sonst koennte ein Video nie
|
||||||
|
wieder vorgeschlagen werden, auch Monate spaeter nicht. */
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_reaktion_vorschlag_offen
|
||||||
|
ON reaktion_vorschlaege (video) WHERE stand = 'offen';
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_reaktion_vorschlag_stand
|
||||||
|
ON reaktion_vorschlaege (stand, id);
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_reaktion_liste_platz
|
CREATE INDEX IF NOT EXISTS idx_reaktion_liste_platz
|
||||||
ON reaktion_liste (platz, id);
|
ON reaktion_liste (platz, id);
|
||||||
CREATE INDEX IF NOT EXISTS idx_reaktion_chat_zeit
|
CREATE INDEX IF NOT EXISTS idx_reaktion_chat_zeit
|
||||||
@@ -605,6 +699,22 @@ export function reaktionTabellen(d) {
|
|||||||
wirklich. Eine Vorgabe 'gefragt' haette alle laufenden Gaeste
|
wirklich. Eine Vorgabe 'gefragt' haette alle laufenden Gaeste
|
||||||
mitten in einer Sendung zu Eingeladenen gemacht und ihr Bild
|
mitten in einer Sendung zu Eingeladenen gemacht und ihr Bild
|
||||||
abgeschaltet. */
|
abgeschaltet. */
|
||||||
|
/* ==== NACHGEWACHSEN: DER TERMIN AN DER WARTESCHLANGE ===========
|
||||||
|
(08.10.2026)
|
||||||
|
|
||||||
|
`ALTER TABLE ... ADD COLUMN` und nicht „Tabelle neu bauen": Am
|
||||||
|
11.09.2026 hat genau dieses Umkopieren an anderer Stelle drei
|
||||||
|
Spalten mit Inhalt verschluckt, ohne Fehlermeldung.
|
||||||
|
|
||||||
|
LEER IST DER NORMALFALL. Was schon in der Schlange liegt, hat
|
||||||
|
keinen Termin -- und soll auch keinen erfundenen bekommen. */
|
||||||
|
const listeSpalten = new Set(
|
||||||
|
d.prepare("PRAGMA table_info(reaktion_liste)").all().map((z) => z.name));
|
||||||
|
if (!listeSpalten.has("wann")) {
|
||||||
|
d.exec("ALTER TABLE reaktion_liste ADD COLUMN wann TEXT NOT NULL DEFAULT ''");
|
||||||
|
console.log("[reaktion] Spalte wann an der Warteschlange angelegt.");
|
||||||
|
}
|
||||||
|
|
||||||
const gaeste = new Set(
|
const gaeste = new Set(
|
||||||
d.prepare("PRAGMA table_info(reaktion_gaeste)").all().map((z) => z.name));
|
d.prepare("PRAGMA table_info(reaktion_gaeste)").all().map((z) => z.name));
|
||||||
if (!gaeste.has("stand")) {
|
if (!gaeste.has("stand")) {
|
||||||
|
|||||||
@@ -580,6 +580,13 @@ export const SEITEN = {
|
|||||||
ausdruecklich mit drin; wer nicht Host ist, sieht dort die
|
ausdruecklich mit drin; wer nicht Host ist, sieht dort die
|
||||||
Zuschauerseite. */
|
Zuschauerseite. */
|
||||||
"/workspace/reaktion.html": ["admin", "hand", "linke", "modi", "gast"],
|
"/workspace/reaktion.html": ["admin", "hand", "linke", "modi", "gast"],
|
||||||
|
/* DAS FOYER (08.10.2026) steht VOR dem Saal und ist fuer
|
||||||
|
dieselben da. Was darin nur die zwei sehen duerfen -- den
|
||||||
|
Plan und die Vorschlaege --, entscheidet nicht diese Tafel,
|
||||||
|
sondern der Server bei den Daten. Eine Seite zu sperren, auf
|
||||||
|
der drei Reihen stehen und nur eine davon heikel ist, waere
|
||||||
|
die grobe Antwort auf eine feine Frage. */
|
||||||
|
"/workspace/reaktion-foyer.html": ["admin", "hand", "linke", "modi", "gast"],
|
||||||
|
|
||||||
"/workspace/rechte.html": ["admin", "hand"],
|
"/workspace/rechte.html": ["admin", "hand"],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import { einstellung } from "./workspace.js";
|
|||||||
import { mitZugangsdaten, wegeAusfaechern } from "./workspace-turn.js";
|
import { mitZugangsdaten, wegeAusfaechern } from "./workspace-turn.js";
|
||||||
import {
|
import {
|
||||||
SICHT_PLAETZE, GAESTE_MAX, EINLADUNG_SEKUNDEN, TEXT_MAX, SCHREIB_BREMSE,
|
SICHT_PLAETZE, GAESTE_MAX, EINLADUNG_SEKUNDEN, TEXT_MAX, SCHREIB_BREMSE,
|
||||||
|
VORSCHLAEGE_JE_PERSON, VORSCHLAG_NOTIZ_MAX, VORSCHLAG_BREMSE_SEKUNDEN,
|
||||||
STAENDE, LAYOUTS, TEMPI,
|
STAENDE, LAYOUTS, TEMPI,
|
||||||
KAMERA_GROESSEN, KAMERA_ECKEN,
|
KAMERA_GROESSEN, KAMERA_ECKEN,
|
||||||
MELDUNG_TAGE,
|
MELDUNG_TAGE,
|
||||||
@@ -287,10 +288,33 @@ async function videoTitel(kennung) {
|
|||||||
|
|
||||||
/** Die Warteschlange, in ihrer Reihenfolge. */
|
/** Die Warteschlange, in ihrer Reihenfolge. */
|
||||||
function listeHolen() {
|
function listeHolen() {
|
||||||
return db().prepare("SELECT id, video, titel, platz FROM reaktion_liste"
|
return db().prepare("SELECT id, video, titel, platz, wann FROM reaktion_liste"
|
||||||
+ " ORDER BY platz, id").all();
|
+ " ORDER BY platz, id").all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ======================================================================
|
||||||
|
DER PLAN FUERS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Filipe: „links eine reihe wo die nächsten geplanten videos schon
|
||||||
|
bereit stehen. wan und umd wie viel uhr."
|
||||||
|
|
||||||
|
ES IST DIESELBE LISTE -- nur anders sortiert: nach TERMIN statt
|
||||||
|
nach Platz. Im Pult ist die Reihenfolge die Aussage („was kommt
|
||||||
|
als Naechstes im Live"), im Foyer der Termin („Donnerstag um
|
||||||
|
acht").
|
||||||
|
|
||||||
|
SORTIERT WIRD IM BROWSER UND NICHT HIER. Ein zweites Feld im
|
||||||
|
Stand waere eine zweite Antwort auf dieselbe Frage -- dieselben
|
||||||
|
Zeilen, zweimal uebertragen, und beim naechsten Umbau pflegt
|
||||||
|
jemand nur eine der beiden Stellen. Was hinausgeht, ist `liste`
|
||||||
|
mit `wann`; wie man sie anschaut, entscheidet die Seite.
|
||||||
|
|
||||||
|
VERGANGENES FAELLT NICHT WEG. Ein Termin von gestern, den niemand
|
||||||
|
weggeraeumt hat, steht weiter da und ist damit sichtbar
|
||||||
|
ueberfaellig. Ihn stillschweigend auszublenden hiesse, dass eine
|
||||||
|
Vorbereitung verschwindet, ohne dass jemand etwas getan hat.
|
||||||
|
====================================================================== */
|
||||||
|
|
||||||
/** Das naechste Video aus der Liste ins Bild holen.
|
/** Das naechste Video aus der Liste ins Bild holen.
|
||||||
*
|
*
|
||||||
* EINE STELLE FUER ZWEI KNOEPFE. „Naechstes" und „Jetzt spielen"
|
* EINE STELLE FUER ZWEI KNOEPFE. „Naechstes" und „Jetzt spielen"
|
||||||
@@ -1459,6 +1483,262 @@ reaktionRouter.delete("/workspace/api/reaktion/liste/:id", nurHost, (req, res) =
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* ---------- Wann ein vorbereitetes Video laufen soll ---------------------
|
||||||
|
Filipe: „links eine reihe wo die nächsten geplanten videos schon
|
||||||
|
bereit stehen. wan und umd wie viel uhr."
|
||||||
|
|
||||||
|
EIN EIGENER WEG UND KEIN FELD AM ANHAENGEN. Der Termin entsteht
|
||||||
|
fast nie beim Einfuegen -- man raeumt erst ein und legt danach
|
||||||
|
fest, wann es laufen soll. Ein Pflichtfeld beim Anhaengen haette
|
||||||
|
aus dem schnellsten Handgriff des Pults („Adresse einfuegen,
|
||||||
|
Enter") ein Formular gemacht.
|
||||||
|
|
||||||
|
DER WERT WIRD GEPRUEFT UND NICHT NUR GESPEICHERT. Was hier
|
||||||
|
hereinkommt, steht spaeter als Datum im Foyer; ein freier Text
|
||||||
|
ergaebe dort „Invalid Date" -- und das sieht aus, als sei die
|
||||||
|
Seite kaputt, nicht die Eingabe. */
|
||||||
|
reaktionRouter.put("/workspace/api/reaktion/liste/:id/wann", nurHost,
|
||||||
|
express.json({ limit: "2kb" }), (req, res) => {
|
||||||
|
try {
|
||||||
|
const id = Number(req.params.id) || 0;
|
||||||
|
const roh = String(req.body?.wann ?? "").trim();
|
||||||
|
let wann = "";
|
||||||
|
if (roh) {
|
||||||
|
const d = new Date(roh);
|
||||||
|
if (Number.isNaN(d.getTime())) return res.status(400).json({ fehler: "termin_unklar" });
|
||||||
|
wann = d.toISOString();
|
||||||
|
}
|
||||||
|
const a = db().prepare("UPDATE reaktion_liste SET wann = ? WHERE id = ?").run(wann, id);
|
||||||
|
if (!a.changes) return res.status(404).json({ fehler: "nicht_in_der_liste" });
|
||||||
|
|
||||||
|
const l = lage(req.person);
|
||||||
|
melden("reaktion", { was: "liste", lage: oeffentlich(l) });
|
||||||
|
res.json(l);
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Termin:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =======================================================================
|
||||||
|
DIE VORSCHLAEGE (08.10.2026)
|
||||||
|
|
||||||
|
Filipe: „da sollen die leute alle mir videos anraten können. also
|
||||||
|
da können die leute videos reinschicken und nur ich und vanvan
|
||||||
|
sehen sie."
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
WER WAS SIEHT -- UND WARUM DER EINSENDER SEINEN EIGENEN SIEHT
|
||||||
|
|
||||||
|
„Nur ich und vanvan sehen sie" heisst: Niemand sieht die
|
||||||
|
Vorschlaege ANDERER. Dass jemand seinen eigenen zurueckbekommt,
|
||||||
|
ist kein Widerspruch, sondern die Voraussetzung dafuer, dass er
|
||||||
|
ueberhaupt einen schickt: Ein Formular, das nach dem Absenden
|
||||||
|
nichts mehr zeigt, sieht aus wie ein Loch. Er sieht seine eigene
|
||||||
|
Zeile mit dem Stand -- offen, uebernommen, abgelehnt -- und sonst
|
||||||
|
nichts.
|
||||||
|
|
||||||
|
DER TITEL WIRD BEI YOUTUBE GEHOLT, nicht vom Einsender getippt.
|
||||||
|
Sonst stuende im Pult ein Name, den jemand frei gewaehlt hat,
|
||||||
|
neben einer Kennung, die etwas anderes ist -- und die Entscheidung
|
||||||
|
fiele ueber den falschen Film.
|
||||||
|
======================================================================= */
|
||||||
|
|
||||||
|
/** Eine Zeile, wie sie hinausgeht. */
|
||||||
|
function alsVorschlag(z, fuerHost) {
|
||||||
|
return {
|
||||||
|
id: z.id,
|
||||||
|
video: z.video,
|
||||||
|
titel: z.titel || "",
|
||||||
|
notiz: z.notiz || "",
|
||||||
|
stand: z.stand,
|
||||||
|
erstellt: z.erstellt,
|
||||||
|
/* WER ES WAR, SIEHT NUR DIE LEITUNG. Fuer den Einsender steht
|
||||||
|
dort ohnehin er selbst; den Namen mitzuschicken waere eine
|
||||||
|
Auskunft ueber andere, sobald sich die Liste einmal aendert. */
|
||||||
|
name: fuerHost ? (z.name || "") : undefined,
|
||||||
|
mein: undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
reaktionRouter.get("/workspace/api/reaktion/vorschlaege", (req, res) => {
|
||||||
|
try {
|
||||||
|
const istHost = HOST_ROLLEN.has(req.person.rolle);
|
||||||
|
const reihen = istHost
|
||||||
|
? db().prepare(`SELECT * FROM reaktion_vorschlaege
|
||||||
|
ORDER BY (stand = 'offen') DESC, id DESC LIMIT 200`).all()
|
||||||
|
: db().prepare(`SELECT * FROM reaktion_vorschlaege WHERE person_id = ?
|
||||||
|
ORDER BY id DESC LIMIT 50`).all(req.person.id);
|
||||||
|
res.json({
|
||||||
|
vorschlaege: reihen.map((z) => alsVorschlag(z, istHost)),
|
||||||
|
/* WIE VIELE NOCH OFFEN SIND -- die eine Zahl, die ins Register
|
||||||
|
und an die Kachel gehoert. Sie wird hier gerechnet und nicht
|
||||||
|
im Browser aus der Liste gezaehlt: Wer nur seine eigenen
|
||||||
|
bekommt, zaehlte sonst seine eigenen. */
|
||||||
|
offen: istHost
|
||||||
|
? (db().prepare("SELECT COUNT(*) AS n FROM reaktion_vorschlaege"
|
||||||
|
+ " WHERE stand = 'offen'").get()?.n || 0)
|
||||||
|
: null,
|
||||||
|
/* Was der Einsender wissen muss, um nicht gegen eine Wand zu
|
||||||
|
laufen: wie viele er noch offen haben darf. */
|
||||||
|
je_person_max: VORSCHLAEGE_JE_PERSON,
|
||||||
|
notiz_max: VORSCHLAG_NOTIZ_MAX,
|
||||||
|
darf_entscheiden: istHost,
|
||||||
|
});
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Vorschlaege:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
reaktionRouter.post("/workspace/api/reaktion/vorschlag", express.json({ limit: "4kb" }),
|
||||||
|
async (req, res) => {
|
||||||
|
try {
|
||||||
|
const video = videoKennung(String(req.body?.video ?? ""));
|
||||||
|
if (!video) return res.status(400).json({ fehler: "video_unklar" });
|
||||||
|
|
||||||
|
/* ==== DREI SPERREN, UND JEDE BEANTWORTET ETWAS ANDERES ====
|
||||||
|
(1) Zu schnell -- gegen den Doppelklick.
|
||||||
|
(2) Zu viele offen -- gegen die Liste, die niemand mehr
|
||||||
|
durchsieht.
|
||||||
|
(3) Schon da -- gegen dreimal dieselbe Entscheidung. */
|
||||||
|
const kurz = new Date(Date.now() - VORSCHLAG_BREMSE_SEKUNDEN * 1000).toISOString();
|
||||||
|
const eben = db().prepare(`SELECT COUNT(*) AS n FROM reaktion_vorschlaege
|
||||||
|
WHERE person_id = ? AND erstellt > ?`).get(req.person.id, kurz);
|
||||||
|
if ((eben?.n || 0) >= 1) return res.status(429).json({ fehler: "zu_schnell" });
|
||||||
|
|
||||||
|
const meine = db().prepare(`SELECT COUNT(*) AS n FROM reaktion_vorschlaege
|
||||||
|
WHERE person_id = ? AND stand = 'offen'`).get(req.person.id);
|
||||||
|
if ((meine?.n || 0) >= VORSCHLAEGE_JE_PERSON) {
|
||||||
|
return res.status(409).json({ fehler: "zu_viele_vorschlaege" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const schonOffen = db().prepare(`SELECT id FROM reaktion_vorschlaege
|
||||||
|
WHERE video = ? AND stand = 'offen'`).get(video);
|
||||||
|
if (schonOffen) return res.status(409).json({ fehler: "vorschlag_doppelt" });
|
||||||
|
|
||||||
|
/* Und was schon in der Warteschlange liegt, braucht niemand
|
||||||
|
mehr anzuraten -- das waere eine Bitte um etwas, das bereits
|
||||||
|
entschieden ist. */
|
||||||
|
const inDerListe = db().prepare("SELECT id FROM reaktion_liste WHERE video = ?")
|
||||||
|
.get(video);
|
||||||
|
if (inDerListe) return res.status(409).json({ fehler: "steht_schon_bereit" });
|
||||||
|
|
||||||
|
const notiz = String(req.body?.notiz ?? "").trim().slice(0, VORSCHLAG_NOTIZ_MAX);
|
||||||
|
const titel = await videoTitel(video);
|
||||||
|
const { lastInsertRowid } = db().prepare(`INSERT INTO reaktion_vorschlaege
|
||||||
|
(person_id, name, video, titel, notiz, stand, erstellt)
|
||||||
|
VALUES (?,?,?,?,?,'offen',?)`)
|
||||||
|
.run(req.person.id, req.person.name, video, titel, notiz, jetzt());
|
||||||
|
|
||||||
|
const z = db().prepare("SELECT * FROM reaktion_vorschlaege WHERE id = ?")
|
||||||
|
.get(Number(lastInsertRowid));
|
||||||
|
|
||||||
|
/* NUR DIE ZWEI ERFAHREN ES. Ein Rundruf an den Saal haette
|
||||||
|
genau das verraten, was niemand sehen soll. */
|
||||||
|
stromAn(
|
||||||
|
db().prepare("SELECT id FROM personen WHERE rolle IN ('admin','hand') AND aktiv = 1")
|
||||||
|
.all().map((p) => p.id),
|
||||||
|
"reaktion", { was: "vorschlag" },
|
||||||
|
);
|
||||||
|
res.status(201).json({ ok: true, vorschlag: alsVorschlag(z, false) });
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Vorschlag:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Einen Vorschlag uebernehmen -- er wandert in die Warteschlange. */
|
||||||
|
reaktionRouter.post("/workspace/api/reaktion/vorschlag/:id(\\d+)/uebernehmen", nurHost,
|
||||||
|
(req, res) => {
|
||||||
|
try {
|
||||||
|
const z = db().prepare("SELECT * FROM reaktion_vorschlaege WHERE id = ?")
|
||||||
|
.get(Number(req.params.id));
|
||||||
|
if (!z) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||||
|
if (z.stand !== "offen") return res.status(409).json({ fehler: "schon_entschieden" });
|
||||||
|
|
||||||
|
const wie_viele = db().prepare("SELECT COUNT(*) AS n FROM reaktion_liste").get()?.n || 0;
|
||||||
|
if (wie_viele >= LISTE_MAX) return res.status(409).json({ fehler: "liste_voll" });
|
||||||
|
const schon = db().prepare("SELECT id FROM reaktion_liste WHERE video = ?").get(z.video);
|
||||||
|
if (schon) return res.status(409).json({ fehler: "liste_doppelt" });
|
||||||
|
|
||||||
|
/* EIN SCHREIBVORGANG. Bricht es zwischen den beiden
|
||||||
|
Anweisungen ab, stuende der Vorschlag als „uebernommen" da,
|
||||||
|
ohne dass etwas in der Schlange liegt -- und niemand wuerde
|
||||||
|
es je bemerken. */
|
||||||
|
const letzter = db().prepare("SELECT MAX(platz) AS p FROM reaktion_liste").get()?.p || 0;
|
||||||
|
db().exec("BEGIN IMMEDIATE");
|
||||||
|
try {
|
||||||
|
db().prepare("INSERT INTO reaktion_liste (video, titel, platz, von_id, gesetzt_am)"
|
||||||
|
+ " VALUES (?,?,?,?,?)")
|
||||||
|
.run(z.video, z.titel, letzter + 1, req.person.id, jetzt());
|
||||||
|
db().prepare(`UPDATE reaktion_vorschlaege SET stand = 'uebernommen',
|
||||||
|
erledigt_am = ?, erledigt_von = ? WHERE id = ?`)
|
||||||
|
.run(jetzt(), req.person.id, z.id);
|
||||||
|
db().exec("COMMIT");
|
||||||
|
} catch (f) { db().exec("ROLLBACK"); throw f; }
|
||||||
|
|
||||||
|
protokolliere("reaktion_vorschlag", {
|
||||||
|
personId: req.person.id,
|
||||||
|
detail: `uebernommen: ${z.titel || z.video} (von ${z.name || "?"})`,
|
||||||
|
ip: echteIp(req),
|
||||||
|
});
|
||||||
|
/* DER EINSENDER ERFAEHRT ES. Ohne diese Zeile stuende sein
|
||||||
|
Vorschlag bei ihm bis zum naechsten Laden auf „offen" --
|
||||||
|
und die schoenste Nachricht des Abends kaeme nie an. */
|
||||||
|
if (z.person_id) stromAn([z.person_id], "reaktion", { was: "vorschlag" });
|
||||||
|
|
||||||
|
const l = lage(req.person);
|
||||||
|
melden("reaktion", { was: "liste", lage: oeffentlich(l) });
|
||||||
|
res.json(l);
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Vorschlag uebernehmen:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
reaktionRouter.post("/workspace/api/reaktion/vorschlag/:id(\\d+)/ablehnen", nurHost,
|
||||||
|
(req, res) => {
|
||||||
|
try {
|
||||||
|
const a = db().prepare(`UPDATE reaktion_vorschlaege SET stand = 'abgelehnt',
|
||||||
|
erledigt_am = ?, erledigt_von = ? WHERE id = ? AND stand = 'offen'`)
|
||||||
|
.run(jetzt(), req.person.id, Number(req.params.id));
|
||||||
|
if (!a.changes) return res.status(409).json({ fehler: "schon_entschieden" });
|
||||||
|
const z = db().prepare("SELECT person_id FROM reaktion_vorschlaege WHERE id = ?")
|
||||||
|
.get(Number(req.params.id));
|
||||||
|
if (z?.person_id) stromAn([z.person_id], "reaktion", { was: "vorschlag" });
|
||||||
|
res.json({ ok: true });
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Vorschlag ablehnen:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Wegnehmen: der Einsender seinen eigenen OFFENEN, die Leitung jeden.
|
||||||
|
*
|
||||||
|
* ==== WARUM DER EINSENDER NUR DEN OFFENEN ZURUECKZIEHEN DARF
|
||||||
|
*
|
||||||
|
* Was entschieden ist, ist Geschichte -- und zwar auch fuer ihn.
|
||||||
|
* Koennte er einen abgelehnten loeschen, verschwaende damit die
|
||||||
|
* Spur, dass ueberhaupt etwas entschieden wurde; der naechste
|
||||||
|
* Vorschlag desselben Videos saehe dann aus wie der erste. */
|
||||||
|
reaktionRouter.delete("/workspace/api/reaktion/vorschlag/:id(\\d+)", (req, res) => {
|
||||||
|
try {
|
||||||
|
const id = Number(req.params.id);
|
||||||
|
const z = db().prepare("SELECT * FROM reaktion_vorschlaege WHERE id = ?").get(id);
|
||||||
|
if (!z) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||||
|
const istHost = HOST_ROLLEN.has(req.person.rolle);
|
||||||
|
const meiner = z.person_id === req.person.id && z.stand === "offen";
|
||||||
|
if (!istHost && !meiner) return res.status(403).json({ fehler: "nicht_deiner" });
|
||||||
|
|
||||||
|
db().prepare("DELETE FROM reaktion_vorschlaege WHERE id = ?").run(id);
|
||||||
|
res.json({ ok: true });
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[reaktion] Vorschlag weg:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/** Eins hoch oder runter.
|
/** Eins hoch oder runter.
|
||||||
*
|
*
|
||||||
* GETAUSCHT WIRD MIT DEM NACHBARN, nicht neu durchnummeriert. Beim
|
* GETAUSCHT WIRD MIT DEM NACHBARN, nicht neu durchnummeriert. Beim
|
||||||
|
|||||||
+25
-1
@@ -1625,7 +1625,14 @@ const TREFF_BEREICHE = [
|
|||||||
ihre Flaeche selbst mitbringt, genau wie `papier` beim
|
ihre Flaeche selbst mitbringt, genau wie `papier` beim
|
||||||
Notizblock und `silber` bei den Aufgaben. */
|
Notizblock und `silber` bei den Aufgaben. */
|
||||||
{ ...TREFF_GRUPPE, name: "Reaction", unter: "Zusammen schauen \u2013 live mit Kamera und Chat",
|
{ ...TREFF_GRUPPE, name: "Reaction", unter: "Zusammen schauen \u2013 live mit Kamera und Chat",
|
||||||
zeichen: "reaktion", live: true, ziel: "reaktion.html", szene: "arena" },
|
/* ZIEL IST SEIT DEM 08.10.2026 DAS FOYER und nicht mehr der
|
||||||
|
Saal. Filipe: „wenn man drauf drückt geht zuerst eine seite
|
||||||
|
auf mit reihen/kategorien." Wer die Kachel antippt, landet
|
||||||
|
also erst dort, wo steht, was ansteht -- und geht von da aus
|
||||||
|
hinein. Die Benachrichtigung beim Einschalten zeigt weiter
|
||||||
|
direkt in den Saal: Wenn es laeuft, will niemand noch eine
|
||||||
|
Zwischenseite. */
|
||||||
|
zeichen: "reaktion", live: true, ziel: "reaktion-foyer.html", szene: "arena" },
|
||||||
/* DIE FARBE, DIE "REGELN & HILFE" HATTE (22.09.2026).
|
/* DIE FARBE, DIE "REGELN & HILFE" HATTE (22.09.2026).
|
||||||
Filipes screen5: "die farbe dieser kachel soll die farbe von der
|
Filipes screen5: "die farbe dieser kachel soll die farbe von der
|
||||||
kachel: regeln & hilfe werden". Regeln & Hilfe bekommt dafuer
|
kachel: regeln & hilfe werden". Regeln & Hilfe bekommt dafuer
|
||||||
@@ -7302,6 +7309,23 @@ export const OHNE_KACHEL_UEBERALL = new Set([
|
|||||||
wurde auf crew deshalb NIE angezeigt. Ausgerechnet der, der acht
|
wurde auf crew deshalb NIE angezeigt. Ausgerechnet der, der acht
|
||||||
von elf Leuten betrifft. Eine Zeile hier heilt beides. */
|
von elf Leuten betrifft. Eine Zeile hier heilt beides. */
|
||||||
"/workspace/anruf-probe.html",
|
"/workspace/anruf-probe.html",
|
||||||
|
/* DER SAAL DER REACTION (08.10.2026).
|
||||||
|
|
||||||
|
Seit heute zeigt die Kachel auf das FOYER (reaktion-foyer.html);
|
||||||
|
in den Saal geht es von dort aus. Damit hat `reaktion.html` keine
|
||||||
|
Kachel mehr -- und die Adressregel vom 15.09. verlangt eine.
|
||||||
|
|
||||||
|
GEMESSEN UND NICHT VERMUTET: `pruef-reaktion` wurde in derselben
|
||||||
|
Minute rot, in der die Kachel umgehaengt war -- „die Seite steht
|
||||||
|
der Community offen (302)". Die Seite war unveraendert; sie war
|
||||||
|
nur nicht mehr erreichbar. Ohne diese Zeile waere der Saal fuer
|
||||||
|
das ganze Haus auf die Startseite gelaufen, wortlos, und zwar
|
||||||
|
ausgerechnet ueber den Knopf „Jetzt beitreten".
|
||||||
|
|
||||||
|
Auch die Benachrichtigung beim Einschalten zeigt direkt hierher
|
||||||
|
(workspace-reaktion.js) -- wenn es laeuft, will niemand noch eine
|
||||||
|
Zwischenseite. */
|
||||||
|
"/workspace/reaktion.html",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/** Gibt es diese Seite auf der Adresse, auf der die Person gerade steht? */
|
/** Gibt es diese Seite auf der Adresse, auf der die Person gerade steht? */
|
||||||
|
|||||||
+14
-14
@@ -7,17 +7,17 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081102" />
|
||||||
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
|
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
|
||||||
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
|
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
|
||||||
Variablen, und bei Variablen entscheidet allein, wer zuletzt
|
Variablen, und bei Variablen entscheidet allein, wer zuletzt
|
||||||
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
|
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="halle">
|
<body class="start" data-buehne="halle">
|
||||||
@@ -289,16 +289,16 @@
|
|||||||
|
|
||||||
Und anleitung.js braucht es doppelt: Symbol, Farbe, Name und
|
Und anleitung.js braucht es doppelt: Symbol, Farbe, Name und
|
||||||
Adresse jeder Karte kommen von dort, nicht vom Server. -->
|
Adresse jeder Karte kommen von dort, nicht vom Server. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
|
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
|
||||||
Liste. pruef-css-klassen setzt das durch, und zwar auch die
|
Liste. pruef-css-klassen setzt das durch, und zwar auch die
|
||||||
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
|
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
|
||||||
Bedienelement. -->
|
Bedienelement. -->
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/anleitung.js?v=202610080131" defer></script>
|
<script src="assets/js/anleitung.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
verdeckt. Gefunden hat es pruef-struktur.
|
verdeckt. Gefunden hat es pruef-struktur.
|
||||||
|
|
||||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
schreibt jede Seite app.webmanifest -- auch die hier. -->
|
schreibt jede Seite app.webmanifest -- auch die hier. -->
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<style>
|
<style>
|
||||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/anruf-probe.js?v=202610080131" defer></script>
|
<script src="assets/js/anruf-probe.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -23,25 +23,25 @@
|
|||||||
},
|
},
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202610080131",
|
"src": "/assets/img/app-symbole/workspace-192.png?v=202610081102",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202610080131",
|
"src": "/assets/img/app-symbole/workspace-512.png?v=202610081102",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202610080131",
|
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202610081102",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202610080131",
|
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202610081102",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
|
|||||||
@@ -0,0 +1,478 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
DAS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Die Seite vor dem Saal. Drei Reihen nebeneinander: links der Plan,
|
||||||
|
in der Mitte der Weg hinein, rechts die Vorschläge.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
SIE SIEHT AUS WIE DAS HAUS UND NICHT WIE DER SAAL
|
||||||
|
|
||||||
|
Der Saal ist absichtlich anders gebaut als jede andere Seite — fast
|
||||||
|
schwarz, ohne Scrollen, mit eigener Höhensprache. Das ist richtig
|
||||||
|
für einen Raum, in dem man eine Stunde sitzt und auf EINE Sache
|
||||||
|
schaut.
|
||||||
|
|
||||||
|
Das Foyer ist das Gegenteil: Man kommt, liest, entscheidet und geht
|
||||||
|
weiter. Also trägt es die Oberfläche des Hauses (`gate.css`,
|
||||||
|
`start.css`) wie jede andere Seite auch. Eine zweite Höhensprache
|
||||||
|
hier hätte bedeutet, dieselben Werte ein zweites Mal zu pflegen —
|
||||||
|
und beim nächsten Umbau sähe eine der beiden anders aus.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
DIE MITTE IST BREITER, UND DAS IST DIE GANZE GLIEDERUNG
|
||||||
|
|
||||||
|
`1fr 1.3fr 1fr`. Wer hier ist, will meistens EINS wissen: läuft
|
||||||
|
etwas? Die Antwort darauf bekommt den größten Platz und die einzige
|
||||||
|
Farbe. Drei gleich breite Spalten wären drei gleich wichtige
|
||||||
|
Dinge — und dann sucht man.
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/* ==== DIE DREI TAFELN SIND GLEICH HOCH (08.10.2026) ================
|
||||||
|
|
||||||
|
Hier stand `align-items: start`. Die Folge war auf dem ersten
|
||||||
|
Bildschirmfoto zu sehen: drei Tafeln mit drei verschiedenen
|
||||||
|
Unterkanten (572 / 672 / 680 px), als waere die Seite aus drei
|
||||||
|
Zetteln zusammengelegt. Das ist genau die Sorte Kleinigkeit, bei
|
||||||
|
der ein Blick „irgendwie unfertig" sagt, ohne benennen zu koennen,
|
||||||
|
woran es liegt.
|
||||||
|
|
||||||
|
`stretch` ist die Vorgabe des Rasters -- die Zeile hat sie
|
||||||
|
aufgehoben. Jetzt sind alle drei so hoch wie die hoechste, und der
|
||||||
|
Fusssatz jeder Tafel steht unten statt mitten im Nichts (siehe
|
||||||
|
`.foyer-reihe__fuss`). */
|
||||||
|
.foyer-reihen {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr) minmax(0, 1fr);
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==== WENN DER PLAN FEHLT, BLEIBT KEINE LÜCKE =====================
|
||||||
|
Die Community bekommt die linke Reihe gar nicht erst (`hidden`).
|
||||||
|
Ohne diese Regel stünden zwei Reihen in einem Raster für drei, und
|
||||||
|
die Mitte läge an der falschen Stelle — als fehlte etwas. Mit
|
||||||
|
`:has()` misst das Raster, was wirklich da ist, statt eine zweite
|
||||||
|
Zahl zu pflegen. */
|
||||||
|
.foyer-reihen:has(> .foyer-reihe--plan[hidden]) {
|
||||||
|
grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
EINE REIHE
|
||||||
|
===================================================================== */
|
||||||
|
/* FLEX UND NICHT GRID -- und zwar wegen EINER Zeile: `margin-top:
|
||||||
|
auto` am Fusssatz. In einem Raster wirkt die nur innerhalb der
|
||||||
|
zugeteilten Zeile und schiebt nichts an den unteren Rand; in einer
|
||||||
|
Spalte schluckt sie den ganzen Rest. Dieselbe Darstellung, aber
|
||||||
|
der Fusssatz steht da, wo er hingehoert. */
|
||||||
|
/* ==== KEINE EIGENE FLAECHE MEHR (08.10.2026) ======================
|
||||||
|
|
||||||
|
Hier standen Rundung, Kante, Verlauf und Schatten -- eine eigene
|
||||||
|
Gestalt fuer drei Tafeln, waehrend 45 andere Karten im Haus eine
|
||||||
|
gemeinsame haben. Zwei Schaeden daran, und der zweite ist der
|
||||||
|
schwerere:
|
||||||
|
|
||||||
|
* Die Flaeche war fast durchsichtig (Weiss mit 4,5 %). Auf dem
|
||||||
|
Bildschirmfoto schien die Tapete durch die Tafeln, und ueber
|
||||||
|
einem hellen Hintergrundbild stand Text ohne deckenden Grund.
|
||||||
|
Die Kontrastmessung des Hauses nennt das „liegt auf der
|
||||||
|
Buehne“ und zaehlt es als Befund -- zu Recht: Was dahinter
|
||||||
|
liegt, entscheidet jeder Nutzer selbst mit seiner Wandwahl.
|
||||||
|
* Und es war eine zweite Antwort auf die Frage, wie eine Karte
|
||||||
|
in diesem Haus aussieht. Filipe am 07.09.2026: „DU HAST WIEDER
|
||||||
|
EINE KLEINE AENDERUNG UEBERALL GEMACHT ANSTATT EINE RIESEN
|
||||||
|
AENDERUNG.“
|
||||||
|
|
||||||
|
Flaeche kommt jetzt aus start.css (das gemessene Material), Form
|
||||||
|
aus module.css (Schraege, Kantenlicht, Eckwinkel, Raster) --
|
||||||
|
`.foyer-reihe` steht in beiden Listen. Hier bleibt nur, was diese
|
||||||
|
Tafeln von anderen Karten unterscheidet: Spaltenfluss und
|
||||||
|
Polsterung. */
|
||||||
|
.foyer-reihe {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 16px 16px 18px;
|
||||||
|
}
|
||||||
|
.foyer-reihe[hidden] { display: none; }
|
||||||
|
|
||||||
|
.foyer-reihe__kopf {
|
||||||
|
display: flex; align-items: center; justify-content: space-between;
|
||||||
|
gap: 10px; min-width: 0;
|
||||||
|
/* ==== DREI UEBERSCHRIFTEN AUF EINER LINIE =====================
|
||||||
|
Die Kopfzeile ist so hoch wie das, was in ihr steht -- und das
|
||||||
|
ist links ein Schild, in der Mitte eine Lampe und rechts
|
||||||
|
zeitweise gar nichts. Gemessen lagen die drei Ueberschriften
|
||||||
|
dadurch auf 310, 314 und 316 px: kein Mensch nennt das, aber
|
||||||
|
jeder sieht es.
|
||||||
|
|
||||||
|
Die Zahl ist nicht geraten, sondern die hoechste der drei
|
||||||
|
Marken: Lampe = 11,52 px Schrift + 2x5 px Polster + 2x1 px
|
||||||
|
Linie = 26 px. 28 gibt zwei Pixel Luft, damit eine Schrift, die
|
||||||
|
im Browser des Nutzers minimal groesser faellt, nichts
|
||||||
|
verschiebt. */
|
||||||
|
min-height: 28px;
|
||||||
|
}
|
||||||
|
.foyer-reihe__ueber {
|
||||||
|
margin: 0;
|
||||||
|
font-size: .78rem; font-weight: 800;
|
||||||
|
letter-spacing: .14em; text-transform: uppercase;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
/* „nur ihr zwei" — ein Schild und kein Schloss. Ein Schloss sagt
|
||||||
|
„hier ist etwas verborgen"; dieses Schild sagt, dass die Reihe für
|
||||||
|
niemanden sonst existiert, und das ist der Unterschied. */
|
||||||
|
.foyer-reihe__nur,
|
||||||
|
.foyer-reihe__zahl {
|
||||||
|
/* .72rem sind 11,52 px — die Untergrenze des Hauses ist 11,5, und
|
||||||
|
sie ist kein Geschmack: `pruef-css-klassen` misst sie. Der erste
|
||||||
|
Versuch stand auf .68 (10,88 px) und war damit eine Andeutung
|
||||||
|
statt einer Auskunft. */
|
||||||
|
font-size: .72rem; font-weight: 800;
|
||||||
|
letter-spacing: .08em; text-transform: uppercase;
|
||||||
|
padding: 3px 9px 4px;
|
||||||
|
border-radius: 999px;
|
||||||
|
white-space: nowrap;
|
||||||
|
color: #cfe0ff;
|
||||||
|
background: rgba(154, 183, 255, .12);
|
||||||
|
border: 1px solid rgba(154, 183, 255, .3);
|
||||||
|
}
|
||||||
|
.foyer-reihe__zahl { color: #ffd9a0; background: rgba(224, 161, 58, .14); border-color: rgba(224, 161, 58, .34); }
|
||||||
|
.foyer-reihe__zahl[hidden], .foyer-reihe__nur[hidden] { display: none; }
|
||||||
|
|
||||||
|
.foyer-reihe__satz {
|
||||||
|
margin: 0;
|
||||||
|
font-size: .84rem; line-height: 1.5;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
.foyer-reihe__fuss {
|
||||||
|
/* NACH UNTEN, NICHT HINTER DEN TEXT. `auto` nimmt den Platz, den
|
||||||
|
die gleich hohen Tafeln uebrig lassen -- dadurch steht der
|
||||||
|
Fusssatz in jeder Tafel auf derselben Hoehe statt dort, wo der
|
||||||
|
Inhalt darueber zufaellig endet. */
|
||||||
|
margin: auto 0 0;
|
||||||
|
padding-top: 6px;
|
||||||
|
font-size: .76rem; line-height: 1.45;
|
||||||
|
color: var(--text-still, #8b93a4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
LINKS: DER PLAN
|
||||||
|
===================================================================== */
|
||||||
|
.plan-liste { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
|
||||||
|
.plan-zeile {
|
||||||
|
display: flex; align-items: center; gap: 10px;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 8px 10px 8px 8px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .14));
|
||||||
|
background: rgba(255, 255, 255, .03);
|
||||||
|
}
|
||||||
|
/* Ein Termin, der schon vorbei ist, wird nicht ausgeblendet — er wird
|
||||||
|
MARKIERT. Ausblenden hiesse, dass eine Vorbereitung verschwindet,
|
||||||
|
ohne dass jemand etwas getan hat. */
|
||||||
|
.plan-zeile[data-termin="vorbei"] { border-color: rgba(224, 161, 58, .34); }
|
||||||
|
.plan-zeile[data-termin="vorbei"] .plan-zeile__wann { color: #e0a13a; }
|
||||||
|
|
||||||
|
.plan-zeile__bild {
|
||||||
|
flex: none;
|
||||||
|
width: 64px; aspect-ratio: 16 / 9;
|
||||||
|
border-radius: 7px; object-fit: cover;
|
||||||
|
background: #12101a;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .14));
|
||||||
|
}
|
||||||
|
.plan-zeile__text { display: grid; gap: 2px; min-width: 0; }
|
||||||
|
.plan-zeile__titel {
|
||||||
|
font-size: .84rem; font-weight: 600;
|
||||||
|
color: var(--text, #e9e6f2);
|
||||||
|
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||||||
|
}
|
||||||
|
/* Holt YouTube den Namen nicht heraus, steht dort die Kennung — kein
|
||||||
|
erfundener Titel. Sie sieht dann auch danach aus. */
|
||||||
|
.plan-zeile__titel[data-roh="ja"] {
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
|
||||||
|
font-size: .78rem;
|
||||||
|
}
|
||||||
|
.plan-zeile__wann {
|
||||||
|
font-size: .74rem; font-weight: 700;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
.plan-leer, .raten-leer {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0; padding: 10px 2px;
|
||||||
|
font-size: .82rem;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
MITTE: DER WEG HINEIN
|
||||||
|
===================================================================== */
|
||||||
|
/* ==== DIE MITTE TRÄGT FARBE AN DER KANTE, NICHT AUF DER FLÄCHE ====
|
||||||
|
|
||||||
|
Hier standen zwei `background`-Regeln mit halbdurchsichtigen
|
||||||
|
Verläufen. Sie haben das gemessene Material des Hauses wieder
|
||||||
|
überschrieben — also genau das zurückgeholt, was zwanzig Zeilen
|
||||||
|
weiter oben gerade abgeschafft wurde. Eine Reparatur, die sich
|
||||||
|
selbst aufhebt, ist keine.
|
||||||
|
|
||||||
|
`--ton` ist der Weg, den das Haus dafür schon hat: module.css legt
|
||||||
|
damit ein Kantenlicht auf die Silhouette — oben und über die
|
||||||
|
Schräge, der Form folgend. Eine beleuchtete Oberkante statt einer
|
||||||
|
getönten Fläche: Der Text darüber bleibt auf demselben deckenden
|
||||||
|
Grund wie überall, und die Mitte ist trotzdem die, die auffällt.
|
||||||
|
|
||||||
|
NUR DIE MITTE BEKOMMT EINEN. Plan und Anraten lassen `--ton` leer
|
||||||
|
und erben den Hausakzent. Wenn alles leuchtet, leuchtet nichts. */
|
||||||
|
.foyer-reihe--saal { --ton: #9ab7ff; }
|
||||||
|
|
||||||
|
/* Auf Sendung die Farbe des Hauses für „live“ — rot, gedeckt, und
|
||||||
|
nur dann. */
|
||||||
|
.foyer-reihe--saal:has(.foyer-lampe[data-stand="live"]) { --ton: #d8404a; }
|
||||||
|
|
||||||
|
.foyer-lampe {
|
||||||
|
display: inline-flex; align-items: center; gap: 8px;
|
||||||
|
padding: 5px 12px 5px 10px;
|
||||||
|
border-radius: 999px;
|
||||||
|
border: 1px solid var(--linie-hell, rgba(170, 180, 210, .26));
|
||||||
|
background: rgba(255, 255, 255, .04);
|
||||||
|
/* Auch hier 11,52 px und nicht 10,88 — siehe oben. */
|
||||||
|
font-size: .72rem; font-weight: 800;
|
||||||
|
letter-spacing: .1em; text-transform: uppercase;
|
||||||
|
color: #8b93a4;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.foyer-lampe__punkt {
|
||||||
|
width: 8px; height: 8px; border-radius: 50%;
|
||||||
|
background: currentColor;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
.foyer-lampe[data-stand="vorbereitung"] {
|
||||||
|
color: #e0a13a;
|
||||||
|
border-color: rgba(224, 161, 58, .4);
|
||||||
|
background: rgba(224, 161, 58, .12);
|
||||||
|
}
|
||||||
|
.foyer-lampe[data-stand="live"] {
|
||||||
|
color: #ff8b92;
|
||||||
|
border-color: rgba(216, 64, 74, .5);
|
||||||
|
background: rgba(216, 64, 74, .16);
|
||||||
|
}
|
||||||
|
/* Der Punkt atmet, er blinkt nicht: vier Sekunden auf und ab. Ein
|
||||||
|
Blinken wäre dasselbe Signal mit doppelter Belastung für die
|
||||||
|
Augen — und diese Seite steht manchmal eine Stunde offen. */
|
||||||
|
.foyer-lampe[data-stand="live"] .foyer-lampe__punkt {
|
||||||
|
box-shadow: 0 0 10px -1px currentColor;
|
||||||
|
animation: foyer-atmen 4s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
@keyframes foyer-atmen { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }
|
||||||
|
|
||||||
|
.saal-karte {
|
||||||
|
position: relative;
|
||||||
|
aspect-ratio: 16 / 9;
|
||||||
|
border-radius: 13px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #0a0812;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .16));
|
||||||
|
display: grid; place-items: center;
|
||||||
|
box-shadow: inset 0 1px 4px rgba(0, 0, 0, .6);
|
||||||
|
}
|
||||||
|
.saal-karte img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||||
|
.saal-karte[data-bild="nein"] img { display: none; }
|
||||||
|
.saal-karte__leer {
|
||||||
|
position: absolute;
|
||||||
|
padding: 0 18px; text-align: center;
|
||||||
|
font-size: .82rem; line-height: 1.45;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
.saal-karte[data-bild="ja"] .saal-karte__leer { display: none; }
|
||||||
|
|
||||||
|
.saal-titel {
|
||||||
|
font-size: 1.02rem; font-weight: 800;
|
||||||
|
line-height: 1.3;
|
||||||
|
color: var(--text, #e9e6f2);
|
||||||
|
/* Zwei Zeilen, dann Schluss. Ein langer Videotitel darf die Reihe
|
||||||
|
nicht aufziehen — daneben stehen zwei andere. */
|
||||||
|
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.saal-titel[data-leer="ja"] { color: var(--text-leise, #a9a3bd); font-weight: 600; }
|
||||||
|
.saal-satz {
|
||||||
|
margin: 0;
|
||||||
|
font-size: .84rem; line-height: 1.5;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Der Knopf hinein ----------------------------------------------
|
||||||
|
Er ist das Größte auf der Seite. Nicht aus Geschmack: Wer das Foyer
|
||||||
|
öffnet, während etwas läuft, hat genau eine Absicht — und soll sie
|
||||||
|
nicht suchen müssen. */
|
||||||
|
.saal-knopf {
|
||||||
|
display: flex; align-items: center; justify-content: center;
|
||||||
|
min-height: 52px;
|
||||||
|
margin-top: 2px;
|
||||||
|
padding: 0 20px;
|
||||||
|
border-radius: 14px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: .98rem; font-weight: 800;
|
||||||
|
letter-spacing: .01em;
|
||||||
|
color: #cfe0ff;
|
||||||
|
border: 1px solid rgba(154, 183, 255, .44);
|
||||||
|
background: linear-gradient(180deg, rgba(154, 183, 255, .22), rgba(154, 183, 255, .09));
|
||||||
|
box-shadow:
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, .16),
|
||||||
|
0 14px 30px -18px rgba(154, 183, 255, .8);
|
||||||
|
transition: transform .14s cubic-bezier(.2, .7, .3, 1), box-shadow .14s ease;
|
||||||
|
}
|
||||||
|
.saal-knopf:hover { transform: translateY(-1px); }
|
||||||
|
.saal-knopf:active { transform: translateY(1px); box-shadow: inset 0 2px 6px rgba(0, 0, 0, .5); }
|
||||||
|
.saal-knopf[hidden] { display: none; }
|
||||||
|
/* Auf Sendung wird er rot — dieselbe Farbe, die im ganzen Haus
|
||||||
|
„jetzt gerade" bedeutet. */
|
||||||
|
.saal-knopf[data-stand="live"] {
|
||||||
|
color: #ffe9ea;
|
||||||
|
border-color: rgba(216, 64, 74, .56);
|
||||||
|
background: linear-gradient(180deg,
|
||||||
|
color-mix(in srgb, #d8404a 74%, #000),
|
||||||
|
color-mix(in srgb, #d8404a 46%, #000));
|
||||||
|
box-shadow:
|
||||||
|
inset 0 1px 0 rgba(255, 255, 255, .2),
|
||||||
|
0 16px 34px -18px #d8404a;
|
||||||
|
}
|
||||||
|
.saal-zahl {
|
||||||
|
margin: 0;
|
||||||
|
font-size: .78rem;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.saal-zahl[hidden] { display: none; }
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
RECHTS: ANRATEN
|
||||||
|
===================================================================== */
|
||||||
|
.raten-form { display: grid; gap: 9px; }
|
||||||
|
.raten-feld { display: grid; gap: 4px; }
|
||||||
|
.raten-feld > span {
|
||||||
|
display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
|
||||||
|
font-size: .72rem; font-weight: 700;
|
||||||
|
letter-spacing: .03em;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
.raten-feld input {
|
||||||
|
min-height: 44px; padding: 0 12px;
|
||||||
|
border-radius: 11px;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .18));
|
||||||
|
background: linear-gradient(180deg, rgba(0, 0, 0, .4), rgba(0, 0, 0, .26));
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .5);
|
||||||
|
color: var(--text, #e9e6f2);
|
||||||
|
font: inherit; font-size: .88rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
.raten-feld input:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: rgba(154, 183, 255, .5);
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .5), 0 0 0 3px rgba(154, 183, 255, .16);
|
||||||
|
}
|
||||||
|
/* Die Zahl steht erst da, wenn es eng wird — vorher ist sie eine
|
||||||
|
Aufsicht und keine Hilfe. */
|
||||||
|
.raten-rest { font-weight: 600; opacity: .8; font-variant-numeric: tabular-nums; }
|
||||||
|
|
||||||
|
.raten-liste { list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 8px; }
|
||||||
|
.raten-zeile {
|
||||||
|
display: flex; align-items: flex-start; gap: 10px;
|
||||||
|
min-width: 0;
|
||||||
|
padding: 8px 10px 9px 8px;
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .14));
|
||||||
|
background: rgba(255, 255, 255, .03);
|
||||||
|
}
|
||||||
|
/* Der Zustand steht im WORT und nicht nur in der Farbe — rund acht
|
||||||
|
Prozent der Männer unterscheiden Rot und Grün schlecht, und hier
|
||||||
|
hängt an der Unterscheidung etwas: Kommt mein Video dran? */
|
||||||
|
.raten-zeile[data-stand="uebernommen"] { border-color: rgba(95, 201, 154, .34); }
|
||||||
|
.raten-zeile[data-stand="abgelehnt"] { opacity: .66; }
|
||||||
|
.raten-zeile__bild {
|
||||||
|
flex: none;
|
||||||
|
width: 56px; aspect-ratio: 16 / 9;
|
||||||
|
border-radius: 6px; object-fit: cover;
|
||||||
|
background: #12101a;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .14));
|
||||||
|
}
|
||||||
|
.raten-zeile__text { display: grid; gap: 2px; min-width: 0; flex: 1 1 auto; }
|
||||||
|
.raten-zeile__titel {
|
||||||
|
font-size: .82rem; font-weight: 600;
|
||||||
|
color: var(--text, #e9e6f2);
|
||||||
|
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||||||
|
}
|
||||||
|
.raten-zeile__titel[data-roh="ja"] {
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
|
||||||
|
font-size: .76rem;
|
||||||
|
}
|
||||||
|
.raten-zeile__unter {
|
||||||
|
font-size: .72rem; font-weight: 700;
|
||||||
|
letter-spacing: .02em;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
}
|
||||||
|
.raten-zeile[data-stand="uebernommen"] .raten-zeile__unter { color: #86d7b4; }
|
||||||
|
.raten-zeile__notiz {
|
||||||
|
margin: 3px 0 0;
|
||||||
|
font-size: .78rem; line-height: 1.4;
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
.raten-zeile__knoepfe { display: flex; flex-wrap: wrap; gap: 5px; flex: none; }
|
||||||
|
.raten-knopf {
|
||||||
|
appearance: none; cursor: pointer;
|
||||||
|
/* 36 und nicht 44: Diese Knöpfe stehen in einer schmalen Spalte an
|
||||||
|
der Zeile. Sie sind dafür BREIT — gemessen wird ein Tippziel an
|
||||||
|
der Fläche, nicht an einer Kante. Das × daneben ist quadratisch
|
||||||
|
und bekommt deshalb seine vollen 36 in beide Richtungen. */
|
||||||
|
min-height: 36px; min-width: 36px; padding: 0 10px;
|
||||||
|
border-radius: 9px;
|
||||||
|
border: 1px solid var(--linie, rgba(150, 160, 190, .2));
|
||||||
|
background: rgba(255, 255, 255, .05);
|
||||||
|
color: var(--text-leise, #a9a3bd);
|
||||||
|
font: inherit; font-size: .76rem; font-weight: 700;
|
||||||
|
transition: background-color .14s ease, color .14s ease, border-color .14s ease;
|
||||||
|
}
|
||||||
|
.raten-knopf:hover { background: rgba(255, 255, 255, .09); color: var(--text, #e9e6f2); }
|
||||||
|
.raten-knopf--ja {
|
||||||
|
border-color: rgba(95, 201, 154, .4);
|
||||||
|
color: #86d7b4;
|
||||||
|
background: rgba(95, 201, 154, .12);
|
||||||
|
}
|
||||||
|
.raten-knopf--weg { padding: 0; }
|
||||||
|
.raten-knopf--weg:hover { color: #ff8b92; border-color: rgba(216, 64, 74, .4); }
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
AM HANDY: DIE MITTE ZUERST
|
||||||
|
|
||||||
|
Aus drei Spalten wird ein Stapel. Die Reihenfolge dreht sich dabei:
|
||||||
|
Wer am Telefon nachsieht, ob etwas läuft, soll es in der ersten
|
||||||
|
Zeile sehen und nicht nach zwei Bildschirmhöhen Plan.
|
||||||
|
|
||||||
|
`order` und nicht eine andere Reihenfolge im Dokument: Am Rechner
|
||||||
|
steht links der Plan, und das soll so bleiben. Eine zweite Fassung
|
||||||
|
derselben Seite wäre die, die beim nächsten Umbau vergessen wird.
|
||||||
|
===================================================================== */
|
||||||
|
@media (max-width: 900px) {
|
||||||
|
.foyer-reihen,
|
||||||
|
.foyer-reihen:has(> .foyer-reihe--plan[hidden]) {
|
||||||
|
grid-template-columns: minmax(0, 1fr);
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.foyer-reihe--saal { order: 1; }
|
||||||
|
.foyer-reihe--raten { order: 2; }
|
||||||
|
.foyer-reihe--plan { order: 3; }
|
||||||
|
.foyer-reihe { padding: 14px 13px 16px; border-radius: 16px; }
|
||||||
|
.saal-knopf { min-height: 52px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wer weniger Bewegung eingestellt hat, bekommt alles — nur ohne das
|
||||||
|
Atmen und das Heben. Die Auskunft ist wichtiger als der Weg. */
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.foyer-lampe[data-stand="live"] .foyer-lampe__punkt { animation: none; }
|
||||||
|
.saal-knopf { transition: none; }
|
||||||
|
.saal-knopf:hover, .saal-knopf:active { transform: none; }
|
||||||
|
}
|
||||||
@@ -20,12 +20,17 @@
|
|||||||
Als letzte Datei gewinnt die Form ueberall.
|
Als letzte Datei gewinnt die Form ueberall.
|
||||||
|
|
||||||
WER EINE NEUE KARTE BAUT, traegt ihren Klassennamen in die Listen
|
WER EINE NEUE KARTE BAUT, traegt ihren Klassennamen in die Listen
|
||||||
unten ein. Die Liste steht siebenmal in dieser Datei (Grundform,
|
unten ein. Die Liste steht ACHTMAL in dieser Datei (Grundform,
|
||||||
Kantenlicht, Raster, Handy und dreimal Kontrastmodus) -- das ist die
|
Kantenlicht, Raster, Umrandung beim Tabben, Handy und dreimal
|
||||||
schwache Stelle dieser Bauart, denn eine vergessene Kopie faellt
|
Kontrastmodus) -- das ist die schwache Stelle dieser Bauart, denn
|
||||||
niemandem auf. Deshalb steht vor jeder Kopie die Marke
|
eine vergessene Kopie faellt niemandem auf. Deshalb steht vor jeder
|
||||||
MODULLISTE, und `pruef-css-klassen.mjs` vergleicht alle sieben
|
Kopie die Marke MODULLISTE, und `pruef-css-klassen.mjs` vergleicht
|
||||||
Vorkommen miteinander: Weicht eines ab, wird die Pruefung rot.
|
alle acht Vorkommen miteinander: Weicht eines ab, wird die Pruefung
|
||||||
|
rot.
|
||||||
|
|
||||||
|
DIE ACHTE KAM ERST AM 08.10.2026 DAZU -- nicht als neue Regel,
|
||||||
|
sondern weil sie seit dem 07.09. unmarkiert danebenstand und als
|
||||||
|
einzige nie verglichen wurde.
|
||||||
===================================================================== */
|
===================================================================== */
|
||||||
|
|
||||||
/* =====================================================================
|
/* =====================================================================
|
||||||
@@ -135,7 +140,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl) {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe) {
|
||||||
position: relative;
|
position: relative;
|
||||||
clip-path: polygon(var(--fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase));
|
clip-path: polygon(var(--fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase));
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
@@ -163,7 +168,7 @@
|
|||||||
was übrig bleibt, ist eine Linie, die exakt der Form folgt, Schräge
|
was übrig bleibt, ist eine Linie, die exakt der Form folgt, Schräge
|
||||||
inklusive. Ein `border` könnte das nicht: Er folgt dem Rechteck. */
|
inklusive. Ein `border` könnte das nicht: Er folgt dem Rechteck. */
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl)::before {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe)::before {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute; inset: 0;
|
position: absolute; inset: 0;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -186,7 +191,7 @@
|
|||||||
/* RASTER UND ECKWINKEL. Beides auf ::after -- ein drittes Element gibt
|
/* RASTER UND ECKWINKEL. Beides auf ::after -- ein drittes Element gibt
|
||||||
es nicht, und beides ist reine Optik ohne Klicks. */
|
es nicht, und beides ist reine Optik ohne Klicks. */
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl)::after {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe)::after {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute; inset: 0;
|
position: absolute; inset: 0;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -380,7 +385,20 @@
|
|||||||
wandert) wuerde die Form von 45 Bauteilen auf 38 Seiten neu
|
wandert) wuerde die Form von 45 Bauteilen auf 38 Seiten neu
|
||||||
entscheiden. Das ohne Messgeraet zu tun, waere Raten mit viel
|
entscheiden. Das ohne Messgeraet zu tun, waere Raten mit viel
|
||||||
Einsatz. */
|
Einsatz. */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl):focus-visible {
|
/* ==== DIE ACHTE KOPIE WAR NICHT MARKIERT (08.10.2026) =============
|
||||||
|
|
||||||
|
Sieben Kopien trugen die Marke und wurden von `pruef-css-klassen`
|
||||||
|
miteinander verglichen. Diese hier -- die Umrandung beim Tabben --
|
||||||
|
trug sie nicht, obwohl sie dieselbe Liste enthaelt. Sie war damit
|
||||||
|
die einzige, die still haette abweichen koennen: Wer eine Karte
|
||||||
|
eintraegt und sie uebersieht, baut ein Bauteil, das aussieht wie
|
||||||
|
alle anderen und beim Tabben keine Umrandung bekommt -- und das
|
||||||
|
faellt niemandem auf, weil nichts kaputtgeht.
|
||||||
|
|
||||||
|
Gefunden beim Eintragen von `.foyer-reihe`: acht Vorkommen der
|
||||||
|
Liste, sieben Marken. Die Pruefung erwartet jetzt acht. */
|
||||||
|
/* MODULLISTE */
|
||||||
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe):focus-visible {
|
||||||
outline: 2px solid var(--akzent);
|
outline: 2px solid var(--akzent);
|
||||||
outline-offset: -4px;
|
outline-offset: -4px;
|
||||||
}
|
}
|
||||||
@@ -389,7 +407,7 @@
|
|||||||
/* Dieselbe Form, kleiner -- keine zweite Gestaltung. */
|
/* Dieselbe Form, kleiner -- keine zweite Gestaltung. */
|
||||||
:root { --fase: 12px; }
|
:root { --fase: 12px; }
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl) {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe) {
|
||||||
filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .7));
|
filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -403,15 +421,15 @@
|
|||||||
/* Im Kontrastmodus zählt die Kante, und die muss ein echter `border`
|
/* Im Kontrastmodus zählt die Kante, und die muss ein echter `border`
|
||||||
sein. Die Schräge bleibt: Sie ist Geometrie, keine Farbe. */
|
sein. Die Schräge bleibt: Sie ist Geometrie, keine Farbe. */
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl) {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe) {
|
||||||
filter: none; border: 1px solid CanvasText;
|
filter: none; border: 1px solid CanvasText;
|
||||||
}
|
}
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl)::after {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe)::after {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
/* MODULLISTE */
|
/* MODULLISTE */
|
||||||
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl)::before {
|
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl, .foyer-reihe)::before {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2207,6 +2207,44 @@ body.reaktion-seite > .kopfleiste { flex: none; }
|
|||||||
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
|
font-family: ui-monospace, "Cascadia Mono", Menlo, monospace;
|
||||||
font-size: .78rem;
|
font-size: .78rem;
|
||||||
}
|
}
|
||||||
|
/* ==== DER TERMIN AN DER ZEILE (08.10.2026) ========================
|
||||||
|
Er steht zwischen Titel und Knöpfen und ist bewusst schmal: Die
|
||||||
|
meisten Zeilen haben keinen, und ein breites Feld in jeder Zeile
|
||||||
|
machte aus einer Liste ein Formular.
|
||||||
|
|
||||||
|
`flex: none` und eine feste Breite — ein Datumsfeld, das mit der
|
||||||
|
Spalte wächst, ist in einer 327 Pixel schmalen Regie breiter als
|
||||||
|
der Titel daneben. */
|
||||||
|
.warte-zeile__wann {
|
||||||
|
flex: none;
|
||||||
|
width: 11.5rem;
|
||||||
|
min-height: 34px; padding: 0 8px;
|
||||||
|
border-radius: 9px;
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
background: linear-gradient(180deg, rgba(0, 0, 0, .46), rgba(0, 0, 0, .3));
|
||||||
|
box-shadow: var(--w-tief);
|
||||||
|
color: var(--schrift-leise);
|
||||||
|
font: inherit; font-size: .76rem;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
}
|
||||||
|
/* ==== STEHT EIN TERMIN DARIN, WIRD DAS FELD DEUTLICH ===========
|
||||||
|
Sonst sieht eine Liste aus zehn Zeilen gleich aus, egal ob etwas
|
||||||
|
verabredet ist.
|
||||||
|
|
||||||
|
`data-gesetzt` UND NICHT `:not([value=""])`. Das war der erste
|
||||||
|
Versuch und wäre eine Regel gewesen, die aussieht, als täte sie
|
||||||
|
etwas: Ein `value`, das das Programm als EIGENSCHAFT setzt, taucht
|
||||||
|
im Attribut gar nicht auf -- der Selektor hätte auf jede Zeile
|
||||||
|
gepasst, auch auf die leeren. Was das Programm weiss, muss das
|
||||||
|
Programm auch hinschreiben. */
|
||||||
|
.warte-zeile__wann[data-gesetzt="ja"] { color: var(--schrift); }
|
||||||
|
.warte-zeile__wann:hover { border-color: var(--rand-hell); }
|
||||||
|
.warte-zeile__wann:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: rgba(154, 183, 255, .5);
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .55), 0 0 0 3px rgba(154, 183, 255, .16);
|
||||||
|
}
|
||||||
|
|
||||||
.warte-zeile__knoepfe { display: flex; gap: 5px; flex: none; }
|
.warte-zeile__knoepfe { display: flex; gap: 5px; flex: none; }
|
||||||
.warte-zeile__knoepfe button {
|
.warte-zeile__knoepfe button {
|
||||||
appearance: none; cursor: pointer;
|
appearance: none; cursor: pointer;
|
||||||
|
|||||||
@@ -7679,7 +7679,16 @@ body[data-fremde-sicht="ja"]::after {
|
|||||||
.spalte, .balance, .saeulen-kasten, .neu, .call-raum, .schulung__neu,
|
.spalte, .balance, .saeulen-kasten, .neu, .call-raum, .schulung__neu,
|
||||||
.nachricht, .creator, .summe, .wert, .pdf, .pdf-ablage, .suchleiste,
|
.nachricht, .creator, .summe, .wert, .pdf, .pdf-ablage, .suchleiste,
|
||||||
.person, .kk, .fortschritt, .punkt, .nur-lesen, .todo-liste li,
|
.person, .kk, .fortschritt, .punkt, .nur-lesen, .todo-liste li,
|
||||||
.unterweisung, .warnkarte
|
.unterweisung, .warnkarte, .foyer-reihe
|
||||||
|
/* `.foyer-reihe` sind die drei Tafeln im Foyer der Reaction. Sie
|
||||||
|
hatten bis zum 08.10.2026 ihre eigene Flaeche
|
||||||
|
(`rgba(255,255,255,.045)`) -- also eine zweite Antwort auf die
|
||||||
|
Frage, wie eine Karte in diesem Haus aussieht, und eine
|
||||||
|
schlechtere: Auf dem Bildschirmfoto schien die Tapete durch, und
|
||||||
|
ueber einem hellen Hintergrundbild stand der Text ohne deckende
|
||||||
|
Flaeche darunter. Genau das meldet die Kontrastmessung als
|
||||||
|
„liegt auf der Buehne" -- nicht nachsehbar, nicht in Ordnung.
|
||||||
|
Jetzt tragen sie dasselbe Material wie die uebrigen 45. */
|
||||||
/* `.profil-gruppe` stand hier und existiert nirgends -- ich hatte den
|
/* `.profil-gruppe` stand hier und existiert nirgends -- ich hatte den
|
||||||
Namen aus dem Kopf geschrieben statt aus der Datei. pruef-struktur
|
Namen aus dem Kopf geschrieben statt aus der Datei. pruef-struktur
|
||||||
hat es als totes CSS gemeldet. Die Karten auf profil.html heissen
|
hat es als totes CSS gemeldet. Die Karten auf profil.html heissen
|
||||||
@@ -9446,8 +9455,29 @@ body[data-ton] .kopfleiste__rechts > *:hover {
|
|||||||
/* Das Schild oben rechts. Es steht IN der Kachel und nicht daneben:
|
/* Das Schild oben rechts. Es steht IN der Kachel und nicht daneben:
|
||||||
Eine Marke, die neben der Kachel schwebt, verrutscht auf jedem
|
Eine Marke, die neben der Kachel schwebt, verrutscht auf jedem
|
||||||
zweiten Geraet. */
|
zweiten Geraet. */
|
||||||
|
/* ==== „GESCHLOSSEN" STEHT NICHT MEHR DA (08.10.2026) ==============
|
||||||
|
|
||||||
|
Filipe: „diese kachel soll nicht mehr geschlossen sein."
|
||||||
|
|
||||||
|
Und er hat recht, seit es das Foyer gibt: Die Kachel führt nicht
|
||||||
|
mehr in den Saal, sondern auf die Seite davor — und die ist IMMER
|
||||||
|
offen. Dort steht, was ansteht, und dort kann jeder ein Video
|
||||||
|
anraten, auch um drei Uhr nachts. Ein Schild „geschlossen" auf
|
||||||
|
einer Tür, hinter der etwas zu tun ist, hält Leute davon ab,
|
||||||
|
hineinzusehen.
|
||||||
|
|
||||||
|
DIE BEIDEN ANDEREN SCHILDER BLEIBEN. „gleich" und „● live" sagen
|
||||||
|
etwas, das man ohne sie nicht weiss, und zwar genau dann, wenn es
|
||||||
|
zählt. Das Schild ist deshalb an den Zustand gebunden statt an die
|
||||||
|
Kachel: `[data-stand="zu"]` bekommt gar keins mehr.
|
||||||
|
|
||||||
|
`content: ""` UND NICHT DIE GANZE REGEL WEG: Das `::after` trägt
|
||||||
|
auch die Fläche, auf der die beiden anderen Schilder stehen. Zwei
|
||||||
|
getrennte Regeln daraus zu machen hiesse, dieselben zwölf Zeilen
|
||||||
|
zweimal zu pflegen. */
|
||||||
.kachel[data-sendung="ja"] .kachel__link::after {
|
.kachel[data-sendung="ja"] .kachel__link::after {
|
||||||
content: "geschlossen";
|
content: "";
|
||||||
|
display: none;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 12px; right: 12px;
|
top: 12px; right: 12px;
|
||||||
padding: 3px 9px 4px;
|
padding: 3px 9px 4px;
|
||||||
@@ -9461,6 +9491,10 @@ body[data-ton] .kopfleiste__rechts > *:hover {
|
|||||||
border: 1px solid color-mix(in srgb, var(--ton) 38%, transparent);
|
border: 1px solid color-mix(in srgb, var(--ton) 38%, transparent);
|
||||||
backdrop-filter: blur(6px);
|
backdrop-filter: blur(6px);
|
||||||
}
|
}
|
||||||
|
/* Und die beiden Zustaende, die etwas zu sagen haben, holen das
|
||||||
|
Schild zurueck. */
|
||||||
|
.kachel[data-sendung="ja"][data-stand="vorbereitung"] .kachel__link::after,
|
||||||
|
.kachel[data-sendung="ja"][data-stand="live"] .kachel__link::after { display: block; }
|
||||||
.kachel[data-sendung="ja"][data-stand="vorbereitung"] .kachel__link::after { content: "gleich"; }
|
.kachel[data-sendung="ja"][data-stand="vorbereitung"] .kachel__link::after { content: "gleich"; }
|
||||||
.kachel[data-sendung="ja"][data-stand="live"] .kachel__link::after {
|
.kachel[data-sendung="ja"][data-stand="live"] .kachel__link::after {
|
||||||
content: "● live";
|
content: "● live";
|
||||||
|
|||||||
@@ -325,6 +325,27 @@
|
|||||||
sendest_nicht:
|
sendest_nicht:
|
||||||
'Kamera und Mikro schaltet nur, wer gerade sendet – '
|
'Kamera und Mikro schaltet nur, wer gerade sendet – '
|
||||||
+ 'der Host oder ein Gast auf der Bühne.',
|
+ 'der Host oder ein Gast auf der Bühne.',
|
||||||
|
/* ---- Das Foyer: Termin und Vorschläge (08.10.2026) ---- */
|
||||||
|
termin_unklar:
|
||||||
|
'Das ist kein Datum. Nimm das Feld daneben — oder lass es leer, '
|
||||||
|
+ 'dann liegt das Video einfach ohne Termin bereit.',
|
||||||
|
/* OHNE ZAHL, UND ZWAR ABSICHTLICH. Hier stand „fünf Vorschläge" —
|
||||||
|
dieselbe Zahl, die im Server `VORSCHLAEGE_JE_PERSON` heißt und
|
||||||
|
die diese Tafel nicht kennen kann. Wer sie dort ändert, hätte
|
||||||
|
hier einen Satz stehen lassen, der etwas anderes behauptet als
|
||||||
|
die Sperre, die gerade zugeschnappt ist. Wie viele es sind,
|
||||||
|
steht ohnehin im Foyer unter dem Formular — von dort, wo die
|
||||||
|
Zahl herkommt. */
|
||||||
|
zu_viele_vorschlaege:
|
||||||
|
'Du hast gerade zu viele Vorschläge offen. Warte, bis einer davon dran war — '
|
||||||
|
+ 'eine Liste, die niemand mehr durchsieht, hilft keinem.',
|
||||||
|
vorschlag_doppelt:
|
||||||
|
'Dieses Video hat schon jemand angeraten. Es liegt bei DogFather und VanVan.',
|
||||||
|
steht_schon_bereit:
|
||||||
|
'Das liegt schon in der Warteschlange — es kommt also sowieso.',
|
||||||
|
nicht_deiner:
|
||||||
|
'Das ist nicht deiner. Zurückziehen kannst du nur, was du selbst '
|
||||||
|
+ 'geschickt hast und worüber noch nicht entschieden ist.',
|
||||||
/* ---- Die Einladung (08.10.2026) ---- */
|
/* ---- Die Einladung (08.10.2026) ---- */
|
||||||
keine_einladung:
|
keine_einladung:
|
||||||
'Für dich liegt gerade keine Einladung vor. '
|
'Für dich liegt gerade keine Einladung vor. '
|
||||||
|
|||||||
@@ -0,0 +1,540 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
DAS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Die Seite vor dem Saal. Drei Reihen:
|
||||||
|
|
||||||
|
LINKS was ansteht -- nur fuer DogFather und VanVan
|
||||||
|
MITTE der Weg hinein, sobald etwas laeuft oder gleich losgeht
|
||||||
|
RECHTS Videos anraten -- jeder darf, niemand sieht fremde
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
HIER WIRD NUR GELESEN
|
||||||
|
|
||||||
|
Der Saal meldet jeden an, der ihn oeffnet, baut Verbindungen auf
|
||||||
|
und haelt den Ereignisstrom offen. Diese Seite tut nichts davon:
|
||||||
|
Sie holt den Stand, zeichnet ihn und fragt alle 20 Sekunden nach.
|
||||||
|
Erst der Knopf in der Mitte fuehrt hinein.
|
||||||
|
|
||||||
|
WARUM 20 SEKUNDEN UND KEIN EREIGNISSTROM: Ein Strom haelt eine
|
||||||
|
Verbindung offen, und manche Browser lassen nur sechs je Adresse
|
||||||
|
zu -- im Saal wird jede davon gebraucht. Das Foyer ist der
|
||||||
|
ruhigste Zustand des Hauses: kein Video, keine Kamera, kein Chat.
|
||||||
|
Eine Abfrage alle zwanzig Sekunden kostet dort nichts und kann
|
||||||
|
nicht haengenbleiben.
|
||||||
|
===================================================================== */
|
||||||
|
(() => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const $ = (id) => document.getElementById(id);
|
||||||
|
const el = (art, klasse, text) => {
|
||||||
|
const n = document.createElement(art);
|
||||||
|
if (klasse) n.className = klasse;
|
||||||
|
if (text !== undefined) n.textContent = text;
|
||||||
|
return n;
|
||||||
|
};
|
||||||
|
|
||||||
|
let lage = null;
|
||||||
|
let raten = null;
|
||||||
|
|
||||||
|
async function hole(pfad, einstellungen) {
|
||||||
|
return fetch(pfad, { credentials: 'same-origin', ...(einstellungen || {}) });
|
||||||
|
}
|
||||||
|
|
||||||
|
function sagFehler(text) {
|
||||||
|
const f = $('fehler');
|
||||||
|
if (!f) return;
|
||||||
|
f.textContent = text;
|
||||||
|
f.hidden = false;
|
||||||
|
clearTimeout(sagFehler.uhr);
|
||||||
|
sagFehler.uhr = setTimeout(() => { f.hidden = true; }, 6000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Maschinenworte werden uebersetzt -- dieselbe Tafel wie im ganzen
|
||||||
|
* Haus. Wo sie nichts kennt, steht ein Satz und kein Schluessel. */
|
||||||
|
function melde(antwort, ersatz) {
|
||||||
|
const wort = antwort && antwort.fehler;
|
||||||
|
const satz = (window.sagWas && wort) ? window.sagWas(wort) : null;
|
||||||
|
sagFehler(satz || ersatz || 'Das hat gerade nicht geklappt.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
ZEIT UND DATUM -- IMMER DEUTSCH, IMMER DIESELBE FORM
|
||||||
|
|
||||||
|
„Do, 9. Okt, 20:30". Nicht „09.10.2026 20:30": Wer einen Plan
|
||||||
|
ueberfliegt, sucht den WOCHENTAG, nicht die Jahreszahl -- und
|
||||||
|
das Jahr steht ohnehin nur dann dabei, wenn es ein anderes ist.
|
||||||
|
================================================================= */
|
||||||
|
function alsTermin(wert) {
|
||||||
|
if (!wert) return '';
|
||||||
|
const d = new Date(wert);
|
||||||
|
if (Number.isNaN(d.getTime())) return '';
|
||||||
|
const heute = new Date();
|
||||||
|
const gleichesJahr = d.getFullYear() === heute.getFullYear();
|
||||||
|
try {
|
||||||
|
return new Intl.DateTimeFormat('de-DE', {
|
||||||
|
weekday: 'short', day: 'numeric', month: 'short',
|
||||||
|
...(gleichesJahr ? {} : { year: 'numeric' }),
|
||||||
|
hour: '2-digit', minute: '2-digit',
|
||||||
|
}).format(d);
|
||||||
|
} catch {
|
||||||
|
return d.toLocaleString('de-DE');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Ist dieser Termin schon vorbei? */
|
||||||
|
const vorbei = (wert) => {
|
||||||
|
const d = wert ? new Date(wert) : null;
|
||||||
|
return !!(d && !Number.isNaN(d.getTime()) && d.getTime() < Date.now());
|
||||||
|
};
|
||||||
|
|
||||||
|
const vorschaubild = (video) => `https://i.ytimg.com/vi/${video}/mqdefault.jpg`;
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
DIE MITTE
|
||||||
|
================================================================= */
|
||||||
|
const WORTE = {
|
||||||
|
zu: 'Geschlossen',
|
||||||
|
vorbereitung: 'Gleich',
|
||||||
|
live: 'Auf Sendung',
|
||||||
|
};
|
||||||
|
|
||||||
|
function mitteZeichnen() {
|
||||||
|
const stand = lage?.stand || 'zu';
|
||||||
|
const lampe = $('lampe');
|
||||||
|
lampe.dataset.stand = stand;
|
||||||
|
$('lampe-wort').textContent = WORTE[stand] || '…';
|
||||||
|
|
||||||
|
/* ---- Das Bild ---- */
|
||||||
|
const kasten = $('saal-karte');
|
||||||
|
const bild = $('saal-bild');
|
||||||
|
const quelle = String(lage?.vorschau || '').trim()
|
||||||
|
|| (lage?.video ? vorschaubild(lage.video) : '');
|
||||||
|
if (quelle) {
|
||||||
|
if (bild.getAttribute('src') !== quelle) bild.setAttribute('src', quelle);
|
||||||
|
kasten.dataset.bild = 'ja';
|
||||||
|
/* Ein Bild, das 404 antwortet, steht genauso im Dokument wie
|
||||||
|
eines, das laedt -- auf dem Bildschirm ist an seiner Stelle
|
||||||
|
nichts. Dann lieber der Platzhaltersatz. */
|
||||||
|
bild.onerror = () => { kasten.dataset.bild = 'nein'; };
|
||||||
|
} else {
|
||||||
|
bild.removeAttribute('src');
|
||||||
|
kasten.dataset.bild = 'nein';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Titel und Satz ---- */
|
||||||
|
const titel = lage?.titel || lage?.video_titel || '';
|
||||||
|
$('saal-titel').textContent = stand === 'zu' && !titel
|
||||||
|
? 'Gerade ist nichts angesetzt'
|
||||||
|
: (titel || 'Ohne Titel');
|
||||||
|
$('saal-titel').dataset.leer = (stand === 'zu' && !titel) ? 'ja' : 'nein';
|
||||||
|
|
||||||
|
const beginn = lage?.beginnt_am ? alsTermin(lage.beginnt_am) : '';
|
||||||
|
const satz = $('saal-satz');
|
||||||
|
if (stand === 'live') {
|
||||||
|
satz.textContent = 'Es läuft gerade. Du kannst jederzeit dazukommen — '
|
||||||
|
+ 'alle sehen dieselbe Stelle.';
|
||||||
|
} else if (stand === 'vorbereitung') {
|
||||||
|
satz.textContent = beginn
|
||||||
|
? `Der Wartebereich ist offen, Start um ${beginn}. Der Chat läuft schon.`
|
||||||
|
: 'Der Wartebereich ist offen. Der Chat läuft schon.';
|
||||||
|
} else {
|
||||||
|
satz.textContent = beginn
|
||||||
|
? `Angesetzt: ${beginn}. Vorher geht hier nichts auf — schau später noch mal rein.`
|
||||||
|
: 'Sobald DogFather oder VanVan aufmachen, kannst du hier hinein.';
|
||||||
|
}
|
||||||
|
$('saal-leer').textContent = stand === 'zu'
|
||||||
|
? 'Gerade läuft nichts.'
|
||||||
|
: 'Für diese Sendung gibt es kein Vorschaubild.';
|
||||||
|
|
||||||
|
/* ---- Der Knopf ----
|
||||||
|
ER STEHT NUR DA, WENN ER AUCH HINEINFUEHRT. Filipe: „in der
|
||||||
|
mitte sollen die leute dan wenn eine sendung läuft drauf
|
||||||
|
drücken können und der sendung beitreten. auch bei der
|
||||||
|
vorschau schon." Bei „zu" gibt es nichts zu betreten -- und
|
||||||
|
ein Knopf, der auf eine geschlossene Tuer fuehrt, ist
|
||||||
|
schlimmer als keiner. */
|
||||||
|
const knopf = $('saal-knopf');
|
||||||
|
const offen = stand === 'live' || stand === 'vorbereitung';
|
||||||
|
knopf.hidden = !offen;
|
||||||
|
$('saal-knopf-wort').textContent = stand === 'live'
|
||||||
|
? 'Jetzt beitreten' : 'In den Wartebereich';
|
||||||
|
knopf.dataset.stand = stand;
|
||||||
|
|
||||||
|
/* ---- Wie viele dabei sind ----
|
||||||
|
NUR DIE ZAHL, nie die Namen -- dieselbe Regel wie im Saal: Wer
|
||||||
|
zusieht, soll nicht ablesen koennen, wer sonst noch zusieht.
|
||||||
|
Und nur, wenn ueberhaupt jemand da ist: „0 dabei" ist keine
|
||||||
|
Auskunft, sondern eine Enttaeuschung. */
|
||||||
|
const zahl = $('saal-zahl');
|
||||||
|
const wie = Number(lage?.dabei) || 0;
|
||||||
|
zahl.hidden = !(offen && wie > 0);
|
||||||
|
zahl.textContent = wie === 1 ? '1 ist schon dabei' : `${wie} sind schon dabei`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
LINKS: DER PLAN (nur fuer die zwei)
|
||||||
|
================================================================= */
|
||||||
|
function planZeichnen() {
|
||||||
|
const reihe = $('reihe-plan');
|
||||||
|
/* `liste` bekommt nur, wer die Sendung fuehrt -- das entscheidet
|
||||||
|
der Server. Diese Seite fragt deshalb nicht nach der Rolle,
|
||||||
|
sondern danach, ob die Auskunft ueberhaupt gekommen ist. Eine
|
||||||
|
zweite Rollenliste im Browser waere die, die irgendwann von
|
||||||
|
der echten abweicht. */
|
||||||
|
const liste = Array.isArray(lage?.liste) ? lage.liste : null;
|
||||||
|
reihe.hidden = !liste;
|
||||||
|
if (!liste) return;
|
||||||
|
|
||||||
|
/* ==== NACH TERMIN, NICHT NACH PLATZ =========================
|
||||||
|
Im Pult ist die Reihenfolge die Aussage („was kommt als
|
||||||
|
Naechstes im Live"), hier der Termin („Donnerstag um acht").
|
||||||
|
Was keinen hat, steht hinten -- es liegt bereit, aber es ist
|
||||||
|
noch nichts verabredet. */
|
||||||
|
const sortiert = [
|
||||||
|
...liste.filter((z) => z.wann).sort((a, b) => String(a.wann).localeCompare(b.wann)),
|
||||||
|
...liste.filter((z) => !z.wann),
|
||||||
|
];
|
||||||
|
|
||||||
|
const kasten = $('plan-liste');
|
||||||
|
kasten.textContent = '';
|
||||||
|
if (!sortiert.length) {
|
||||||
|
kasten.append(el('li', 'plan-leer',
|
||||||
|
'Noch nichts vorbereitet. Im Saal unter „Warteschlange“ anhängen.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (const z of sortiert) {
|
||||||
|
const zeile = el('li', 'plan-zeile');
|
||||||
|
if (z.wann) zeile.dataset.termin = vorbei(z.wann) ? 'vorbei' : 'ja';
|
||||||
|
|
||||||
|
const b = document.createElement('img');
|
||||||
|
b.className = 'plan-zeile__bild';
|
||||||
|
b.src = vorschaubild(z.video);
|
||||||
|
b.alt = '';
|
||||||
|
b.loading = 'lazy';
|
||||||
|
b.decoding = 'async';
|
||||||
|
zeile.append(b);
|
||||||
|
|
||||||
|
const text = el('div', 'plan-zeile__text');
|
||||||
|
const name = el('span', 'plan-zeile__titel', z.titel || z.video);
|
||||||
|
/* Holt YouTube den Namen nicht heraus, steht dort die Kennung --
|
||||||
|
kein erfundener Titel. Dieselbe Regel wie in der
|
||||||
|
Warteschlange. */
|
||||||
|
name.dataset.roh = z.titel ? 'nein' : 'ja';
|
||||||
|
name.title = z.titel || ('Kennung ' + z.video);
|
||||||
|
text.append(name);
|
||||||
|
|
||||||
|
const wann = el('span', 'plan-zeile__wann',
|
||||||
|
z.wann ? alsTermin(z.wann) : 'noch ohne Termin');
|
||||||
|
if (z.wann && vorbei(z.wann)) wann.textContent += ' · überfällig';
|
||||||
|
text.append(wann);
|
||||||
|
zeile.append(text);
|
||||||
|
|
||||||
|
kasten.append(zeile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
RECHTS: ANRATEN
|
||||||
|
================================================================= */
|
||||||
|
const STAND_WORT = {
|
||||||
|
offen: 'wartet',
|
||||||
|
uebernommen: 'kommt dran',
|
||||||
|
abgelehnt: 'diesmal nicht',
|
||||||
|
};
|
||||||
|
|
||||||
|
function ratenZeichnen() {
|
||||||
|
if (!raten) return;
|
||||||
|
notizGrenze();
|
||||||
|
const darf = !!raten.darf_entscheiden;
|
||||||
|
const liste = raten.vorschlaege || [];
|
||||||
|
|
||||||
|
const zahl = $('raten-zahl');
|
||||||
|
zahl.hidden = !(darf && raten.offen > 0);
|
||||||
|
zahl.textContent = raten.offen === 1 ? '1 offen' : `${raten.offen} offen`;
|
||||||
|
|
||||||
|
$('raten-satz').textContent = darf
|
||||||
|
? 'Was das Rudel euch anträgt. Nur ihr zwei seht das hier.'
|
||||||
|
: 'Schick uns ein Video, das wir zusammen schauen sollen. '
|
||||||
|
+ 'Sehen tun das nur DogFather und VanVan.';
|
||||||
|
|
||||||
|
const kasten = $('raten-liste');
|
||||||
|
kasten.textContent = '';
|
||||||
|
if (!liste.length) {
|
||||||
|
kasten.append(el('li', 'raten-leer', darf
|
||||||
|
? 'Noch nichts angeraten.'
|
||||||
|
: 'Von dir ist noch nichts dabei.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const v of liste) {
|
||||||
|
const zeile = el('li', 'raten-zeile');
|
||||||
|
zeile.dataset.stand = v.stand;
|
||||||
|
|
||||||
|
const b = document.createElement('img');
|
||||||
|
b.className = 'raten-zeile__bild';
|
||||||
|
b.src = vorschaubild(v.video);
|
||||||
|
b.alt = '';
|
||||||
|
b.loading = 'lazy';
|
||||||
|
b.decoding = 'async';
|
||||||
|
zeile.append(b);
|
||||||
|
|
||||||
|
const text = el('div', 'raten-zeile__text');
|
||||||
|
const name = el('span', 'raten-zeile__titel', v.titel || v.video);
|
||||||
|
name.dataset.roh = v.titel ? 'nein' : 'ja';
|
||||||
|
name.title = v.titel || ('Kennung ' + v.video);
|
||||||
|
text.append(name);
|
||||||
|
|
||||||
|
const unter = el('span', 'raten-zeile__unter');
|
||||||
|
/* Beim Host steht, WER es war; beim Einsender waere das er
|
||||||
|
selbst -- und eine Zeile, die einem den eigenen Namen
|
||||||
|
vorliest, ist Platz ohne Auskunft. */
|
||||||
|
unter.textContent = [
|
||||||
|
darf && v.name ? v.name : '',
|
||||||
|
STAND_WORT[v.stand] || v.stand,
|
||||||
|
].filter(Boolean).join(' · ');
|
||||||
|
text.append(unter);
|
||||||
|
|
||||||
|
if (v.notiz) text.append(el('p', 'raten-zeile__notiz', v.notiz));
|
||||||
|
zeile.append(text);
|
||||||
|
|
||||||
|
const knoepfe = el('div', 'raten-zeile__knoepfe');
|
||||||
|
if (darf && v.stand === 'offen') {
|
||||||
|
const ja = el('button', 'raten-knopf raten-knopf--ja', 'Nehmen');
|
||||||
|
ja.type = 'button';
|
||||||
|
ja.title = 'In die Warteschlange legen';
|
||||||
|
ja.addEventListener('click', () => entscheiden(v.id, 'uebernehmen'));
|
||||||
|
const nein = el('button', 'raten-knopf', 'Diesmal nicht');
|
||||||
|
nein.type = 'button';
|
||||||
|
nein.addEventListener('click', () => entscheiden(v.id, 'ablehnen'));
|
||||||
|
knoepfe.append(ja, nein);
|
||||||
|
}
|
||||||
|
/* ==== WER DAS × BEKOMMT =================================
|
||||||
|
Die Leitung bei den ENTSCHIEDENEN (die offenen haben ihre
|
||||||
|
zwei Knoepfe), der Einsender bei seinen OFFENEN.
|
||||||
|
|
||||||
|
Der Einsender darf nur zurueckziehen, was noch nicht
|
||||||
|
entschieden ist: Was entschieden ist, ist Geschichte -- auch
|
||||||
|
fuer ihn. Koennte er einen abgelehnten loeschen, verschwaende
|
||||||
|
die Spur, dass ueberhaupt entschieden wurde, und derselbe
|
||||||
|
Vorschlag saehe beim naechsten Mal aus wie der erste. */
|
||||||
|
const wegErlaubt = darf ? v.stand !== 'offen' : v.stand === 'offen';
|
||||||
|
if (wegErlaubt) {
|
||||||
|
const weg = el('button', 'raten-knopf raten-knopf--weg', '×');
|
||||||
|
weg.type = 'button';
|
||||||
|
weg.title = darf ? 'Aus der Liste nehmen' : 'Zurückziehen';
|
||||||
|
weg.addEventListener('click', () => zurueckziehen(v.id));
|
||||||
|
knoepfe.append(weg);
|
||||||
|
}
|
||||||
|
if (knoepfe.children.length) zeile.append(knoepfe);
|
||||||
|
|
||||||
|
kasten.append(zeile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==== DIE GRENZE KOMMT VOM SERVER, UND ZWAR EINMAL =============
|
||||||
|
Hier stand sie VIERMAL: dreimal als `raten.je_person_max || 5`
|
||||||
|
und einmal als ausgeschriebenes Wort „fünf“ im Satz. Das sind
|
||||||
|
vier Antworten auf eine Frage. Wer die Grenze im Server auf
|
||||||
|
drei setzt, hat danach einen Knopf, der bei drei sperrt, und
|
||||||
|
einen Satz, der von fünf redet -- und niemand merkt es, weil
|
||||||
|
beides fuer sich genommen stimmig aussieht.
|
||||||
|
|
||||||
|
Gerechnet wird mit dem, was angekommen ist. Ist nichts
|
||||||
|
angekommen, steht hier auch keine Zahl: Eine erfundene Grenze
|
||||||
|
waere schlimmer als gar keine, weil man ihr glaubt.
|
||||||
|
|
||||||
|
Dass man sie VORHER erfaehrt, bleibt der Punkt -- eine
|
||||||
|
Grenze, von der man erst beim Anstossen erfaehrt, ist eine
|
||||||
|
Falle. */
|
||||||
|
const grenze = Number(raten.je_person_max) || 0;
|
||||||
|
const offenEigene = liste.filter((v) => v.stand === 'offen').length;
|
||||||
|
const rest = grenze ? Math.max(0, grenze - offenEigene) : null;
|
||||||
|
|
||||||
|
const fuss = $('raten-fuss');
|
||||||
|
if (darf) {
|
||||||
|
fuss.textContent = 'Was du nimmst, landet unten in der Warteschlange.';
|
||||||
|
} else if (rest === null) {
|
||||||
|
fuss.textContent = '';
|
||||||
|
} else if (rest > 0) {
|
||||||
|
fuss.textContent = `Du kannst noch ${rest} ${rest === 1 ? 'Video' : 'Videos'} anraten.`;
|
||||||
|
} else {
|
||||||
|
fuss.textContent = `Du hast gerade ${grenze} offene Vorschläge — `
|
||||||
|
+ 'warte, bis einer dran war.';
|
||||||
|
}
|
||||||
|
$('raten-los').disabled = !darf && rest === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function restZeigen() {
|
||||||
|
const feld = $('raten-notiz');
|
||||||
|
const wort = $('raten-rest');
|
||||||
|
/* ==== KEINE ERSATZZAHL MEHR ====================================
|
||||||
|
Hier stand `feld.maxLength || 200`. Die 200 war eine Abschrift
|
||||||
|
von `VORSCHLAG_NOTIZ_MAX` im Server -- die dritte Stelle, an
|
||||||
|
der dieselbe Zahl stand. Jetzt lernt das Feld sie vom Server
|
||||||
|
(siehe `notizGrenze()`), und diese Funktion liest nur noch ab.
|
||||||
|
Ist sie noch nicht angekommen, meldet `maxLength` -1; dann
|
||||||
|
steht hier NICHTS. „noch -1“ waere schlimmer als keine Zahl. */
|
||||||
|
const max = feld.maxLength;
|
||||||
|
if (!(max > 0)) { wort.textContent = ''; return; }
|
||||||
|
const rest = max - feld.value.length;
|
||||||
|
/* DIE ZAHL STEHT ERST DA, WENN ES ENG WIRD. Ein Zaehler, der von
|
||||||
|
Anfang an mitlaeuft, macht aus einem Satz eine Aufgabe. */
|
||||||
|
wort.textContent = rest <= 40 ? `noch ${rest}` : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Die Laenge der Notiz kommt vom Server und wird dem Feld
|
||||||
|
* angelegt. Einmal, und nur wenn sie sich geaendert hat -- ein
|
||||||
|
* `maxLength`, das bei jedem Zeichnen neu gesetzt wird, setzt in
|
||||||
|
* manchen Browsern den Einfuegezeiger zurueck. */
|
||||||
|
function notizGrenze() {
|
||||||
|
const grenze = Number(raten?.notiz_max) || 0;
|
||||||
|
if (!grenze) return;
|
||||||
|
const feld = $('raten-notiz');
|
||||||
|
if (feld.maxLength === grenze) return;
|
||||||
|
feld.maxLength = grenze;
|
||||||
|
restZeigen();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function abschicken(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const video = $('raten-video').value.trim();
|
||||||
|
if (!video) { sagFehler('Trag erst eine YouTube-Adresse ein.'); return; }
|
||||||
|
const knopf = $('raten-los');
|
||||||
|
knopf.disabled = true;
|
||||||
|
try {
|
||||||
|
const a = await hole('/workspace/api/reaktion/vorschlag', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ video, notiz: $('raten-notiz').value.trim() }),
|
||||||
|
});
|
||||||
|
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging gerade nicht.'); return; }
|
||||||
|
$('raten-video').value = '';
|
||||||
|
$('raten-notiz').value = '';
|
||||||
|
restZeigen();
|
||||||
|
sagFehler('Danke — angekommen. DogFather und VanVan sehen es.');
|
||||||
|
await ratenHolen();
|
||||||
|
} catch { sagFehler('Das ging gerade nicht.'); }
|
||||||
|
finally { knopf.disabled = false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function entscheiden(id, was) {
|
||||||
|
/* ==== DIE ZWEI WEGE STEHEN AUSGESCHRIEBEN DA ===================
|
||||||
|
Vorher hiess es `/vorschlag/${id}/${was}` -- eine Zeile fuer
|
||||||
|
beide Wege, und im Quelltext stand nirgends, welche Woerter
|
||||||
|
fuer `was` ueberhaupt erlaubt sind. `pruef-struktur` hat
|
||||||
|
daraufhin „…/vorschlag/1/1“ gemeldet: Sie setzt in jeden
|
||||||
|
Platzhalter eine 1 ein und kann nicht wissen, dass der zweite
|
||||||
|
„uebernehmen“ oder „ablehnen“ heisst.
|
||||||
|
Das war zu Recht ein Fehler -- ein naechster Leser weiss es
|
||||||
|
genauso wenig. Jetzt stehen beide Adressen vollstaendig da,
|
||||||
|
ein Schreibfehler faellt beim Lesen auf, und die Pruefung
|
||||||
|
findet wieder, was sie pruefen soll. */
|
||||||
|
const weg = was === 'uebernehmen'
|
||||||
|
? `/workspace/api/reaktion/vorschlag/${id}/uebernehmen`
|
||||||
|
: `/workspace/api/reaktion/vorschlag/${id}/ablehnen`;
|
||||||
|
const a = await hole(weg, { method: 'POST' });
|
||||||
|
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
|
||||||
|
/* Beim Uebernehmen wandert es in die Warteschlange -- also muss
|
||||||
|
auch der Plan links nachziehen. Eine der beiden Reihen allein
|
||||||
|
zu zeichnen hiesse, dass links ein Video fehlt, das rechts
|
||||||
|
eben angenommen wurde. */
|
||||||
|
await Promise.all([standHolen(), ratenHolen()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function zurueckziehen(id) {
|
||||||
|
const a = await hole(`/workspace/api/reaktion/vorschlag/${id}`, { method: 'DELETE' });
|
||||||
|
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
|
||||||
|
await ratenHolen();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
HOLEN
|
||||||
|
================================================================= */
|
||||||
|
async function standHolen() {
|
||||||
|
try {
|
||||||
|
const a = await hole('/workspace/api/reaktion');
|
||||||
|
if (!a.ok) return;
|
||||||
|
lage = await a.json();
|
||||||
|
mitteZeichnen();
|
||||||
|
planZeichnen();
|
||||||
|
kopfSatz();
|
||||||
|
} catch { /* beim naechsten Takt wieder */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function ratenHolen() {
|
||||||
|
try {
|
||||||
|
const a = await hole('/workspace/api/reaktion/vorschlaege');
|
||||||
|
if (!a.ok) return;
|
||||||
|
raten = await a.json();
|
||||||
|
ratenZeichnen();
|
||||||
|
} catch { /* die Reihe bleibt stehen, wie sie war */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==== DER SATZ OBEN NENNT KEINE RICHTUNGEN MEHR ==================
|
||||||
|
|
||||||
|
Hier stand: „Gerade läuft nichts. Links steht, was ansteht;
|
||||||
|
rechts kannst du etwas anraten.“ Zwei Fehler in einem Satz, und
|
||||||
|
beide derselbe:
|
||||||
|
|
||||||
|
* „Links“ gibt es für die Community überhaupt nicht — der
|
||||||
|
Plan ist nur für DogFather und VanVan da. Der Satz zeigte
|
||||||
|
also ALLEN außer DogFather und VanVan auf einen leeren Rand.
|
||||||
|
* Und am Telefon stehen die Reihen übereinander. Dort ist
|
||||||
|
„links“ und „rechts“ auch für die zwei falsch.
|
||||||
|
|
||||||
|
Eine Richtung im Text ist eine Aussage über das Aussehen — und
|
||||||
|
das Aussehen ändert sich mit dem Bildschirm und mit der Rolle.
|
||||||
|
Das ist dieselbe Falle wie eine feste Pixelzahl: Sie stimmt, bis
|
||||||
|
jemand etwas verschiebt, und wird dann still falsch. Gesagt wird
|
||||||
|
deshalb, WAS geht, nicht WO es steht.
|
||||||
|
|
||||||
|
Dass der Plan da ist, wird nicht aus der Rolle geschlossen,
|
||||||
|
sondern daran gemessen, ob die Auskunft gekommen ist — dieselbe
|
||||||
|
Frage wie in `planZeichnen()`, und nur eine Antwort darauf. */
|
||||||
|
function kopfSatz() {
|
||||||
|
const stand = lage?.stand || 'zu';
|
||||||
|
const mitPlan = Array.isArray(lage?.liste);
|
||||||
|
$('kopf-satz').textContent = stand === 'live'
|
||||||
|
? 'Es läuft gerade — du kannst jederzeit dazukommen.'
|
||||||
|
: stand === 'vorbereitung'
|
||||||
|
? 'Gleich geht es los. Der Wartebereich ist schon offen.'
|
||||||
|
: mitPlan
|
||||||
|
? 'Gerade läuft nichts. Was ansteht, steht im Plan — und was '
|
||||||
|
+ 'das Rudel anträgt, wartet auf euch.'
|
||||||
|
: 'Gerade läuft nichts. Du kannst uns aber jederzeit ein Video anraten.';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
LOS
|
||||||
|
================================================================= */
|
||||||
|
function los() {
|
||||||
|
$('raten-form').addEventListener('submit', abschicken);
|
||||||
|
$('raten-notiz').addEventListener('input', restZeigen);
|
||||||
|
restZeigen();
|
||||||
|
|
||||||
|
standHolen();
|
||||||
|
ratenHolen();
|
||||||
|
|
||||||
|
/* ==== ALLE ZWANZIG SEKUNDEN NACHFRAGEN ====================
|
||||||
|
Damit jemand, der das Foyer offen stehen laesst, den Start
|
||||||
|
mitbekommt. Ein Ereignisstrom waere genauer und haelt dafuer
|
||||||
|
eine Verbindung offen -- im Saal wird jede davon gebraucht
|
||||||
|
(manche Browser lassen nur sechs je Adresse zu).
|
||||||
|
|
||||||
|
UND NICHT, WENN DER REITER IM HINTERGRUND LIEGT. Ein Foyer,
|
||||||
|
das jemand seit gestern offen hat, soll den Server nicht alle
|
||||||
|
zwanzig Sekunden fragen. Beim Zurueckkommen wird sofort
|
||||||
|
einmal geholt -- dann steht der Stand von JETZT da und nicht
|
||||||
|
der von gestern. */
|
||||||
|
setInterval(() => {
|
||||||
|
if (document.visibilityState === 'visible') standHolen();
|
||||||
|
}, 20000);
|
||||||
|
document.addEventListener('visibilitychange', () => {
|
||||||
|
if (document.visibilityState === 'visible') { standHolen(); ratenHolen(); }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', los);
|
||||||
|
} else {
|
||||||
|
los();
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -1601,7 +1601,7 @@
|
|||||||
audio: { ...tonVorgaben(), deviceId: undefined },
|
audio: { ...tonVorgaben(), deviceId: undefined },
|
||||||
});
|
});
|
||||||
sagFehler('Das eingestellte Gerät ist gerade nicht da — es läuft über '
|
sagFehler('Das eingestellte Gerät ist gerade nicht da — es läuft über '
|
||||||
+ 'das Standardgerät. Im Register „Ton" kannst du es neu wählen.');
|
+ 'das Standardgerät. Im Register „Ton“ kannst du es neu wählen.');
|
||||||
await geraeteHolen();
|
await geraeteHolen();
|
||||||
geraeteZeichnen();
|
geraeteZeichnen();
|
||||||
kamerasZeichnen();
|
kamerasZeichnen();
|
||||||
@@ -1624,7 +1624,7 @@
|
|||||||
if (!istPult(name)) return;
|
if (!istPult(name)) return;
|
||||||
const h = $('geraete-hinweis');
|
const h = $('geraete-hinweis');
|
||||||
if (h) {
|
if (h) {
|
||||||
h.textContent = `Es sieht aus, als hinge ein Mischpult dran („${name}"). `
|
h.textContent = `Es sieht aus, als hinge ein Mischpult dran („${name}“). `
|
||||||
+ 'Mit dem Pultmodus lässt die Seite den Ton so, wie das Pult ihn liefert.';
|
+ 'Mit dem Pultmodus lässt die Seite den Ton so, wie das Pult ihn liefert.';
|
||||||
h.dataset.vorschlag = 'ja';
|
h.dataset.vorschlag = 'ja';
|
||||||
}
|
}
|
||||||
@@ -3716,7 +3716,7 @@
|
|||||||
tausch.textContent = lage.video
|
tausch.textContent = lage.video
|
||||||
? 'Jetzt wechseln'
|
? 'Jetzt wechseln'
|
||||||
: 'Erst ein Video eintragen';
|
: 'Erst ein Video eintragen';
|
||||||
tausch.title = lage.video ? `Umschalten auf „${kurz}"` : '';
|
tausch.title = lage.video ? `Umschalten auf „${kurz}“` : '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3735,7 +3735,7 @@
|
|||||||
einer Sendung drückt man dann ein zweites Mal. Jetzt steht
|
einer Sendung drückt man dann ein zweites Mal. Jetzt steht
|
||||||
einen Augenblick lang da, was bereitliegt. */
|
einen Augenblick lang da, was bereitliegt. */
|
||||||
sagKurz(lage.zweit && lage.zweit.video
|
sagKurz(lage.zweit && lage.zweit.video
|
||||||
? 'Bereitgelegt. Mit „Jetzt wechseln" springst du hin und zurück.'
|
? 'Bereitgelegt. Mit „Jetzt wechseln“ springst du hin und zurück.'
|
||||||
: 'Der zweite Platz ist jetzt leer.');
|
: 'Der zweite Platz ist jetzt leer.');
|
||||||
/* Der Name kommt von YouTube nach -- nach anderthalb Sekunden
|
/* Der Name kommt von YouTube nach -- nach anderthalb Sekunden
|
||||||
steht er da, ohne dass jemand neu laden muss. */
|
steht er da, ohne dass jemand neu laden muss. */
|
||||||
@@ -4530,6 +4530,61 @@
|
|||||||
name.title = z.titel || ('Kennung ' + z.video);
|
name.title = z.titel || ('Kennung ' + z.video);
|
||||||
zeile.append(name);
|
zeile.append(name);
|
||||||
|
|
||||||
|
/* ==== WANN ES LAUFEN SOLL (08.10.2026) ====================
|
||||||
|
|
||||||
|
Filipe: „links eine reihe wo die nächsten geplanten videos
|
||||||
|
schon bereit stehen. wan und umd wie viel uhr."
|
||||||
|
|
||||||
|
DER TERMIN STEHT AN DER ZEILE UND NICHT IN EINER ZWEITEN
|
||||||
|
LISTE. Die Warteschlange ist ohnehin die Liste der Dinge,
|
||||||
|
die anstehen -- sie überlebt das Beenden einer Sendung
|
||||||
|
ausdrücklich. Eine eigene Tabelle „Sendeplan" daneben wären
|
||||||
|
zwei Antworten auf „was schauen wir als Nächstes", und
|
||||||
|
spätestens beim ersten Verschieben liefen sie auseinander.
|
||||||
|
|
||||||
|
LEER IST GÜLTIG und der Normalfall: „liegt bereit, aber noch
|
||||||
|
ohne Termin". Ein Pflichtfeld hätte aus einer Vorbereitung
|
||||||
|
eine Verabredung gemacht.
|
||||||
|
|
||||||
|
GESPEICHERT WIRD BEI `change`, NICHT BEI `input`. Ein
|
||||||
|
Datumsfeld meldet jeden Tastendruck -- beim Tippen von
|
||||||
|
„09.10.2026" wären das sechs Aufrufe mit sechs Zuständen,
|
||||||
|
von denen fünf Unsinn sind (Jahr 0009). `change` kommt
|
||||||
|
einmal, wenn der Wert fertig ist. */
|
||||||
|
const wann = document.createElement('input');
|
||||||
|
wann.type = 'datetime-local';
|
||||||
|
wann.className = 'warte-zeile__wann';
|
||||||
|
wann.title = 'Wann es laufen soll — leer heißt „noch ohne Termin“';
|
||||||
|
wann.setAttribute('aria-label', 'Termin für ' + (z.titel || z.video));
|
||||||
|
if (z.wann) {
|
||||||
|
const d = new Date(z.wann);
|
||||||
|
if (!Number.isNaN(d.getTime())) {
|
||||||
|
const p = (n) => String(n).padStart(2, '0');
|
||||||
|
wann.value = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`
|
||||||
|
+ `T${p(d.getHours())}:${p(d.getMinutes())}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Das Stilblatt kann an einem Eingabefeld nicht ablesen, ob
|
||||||
|
etwas darin steht: Ein `value`, das das Programm als
|
||||||
|
Eigenschaft setzt, taucht im Attribut nicht auf. Also
|
||||||
|
hinschreiben. */
|
||||||
|
wann.dataset.gesetzt = wann.value ? 'ja' : 'nein';
|
||||||
|
wann.addEventListener('change', async () => {
|
||||||
|
wann.dataset.gesetzt = wann.value ? 'ja' : 'nein';
|
||||||
|
const a = await hole(`/workspace/api/reaktion/liste/${z.id}/wann`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ wann: wann.value ? new Date(wann.value).toISOString() : '' }),
|
||||||
|
});
|
||||||
|
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
|
||||||
|
lage = { ...(await a.json()) };
|
||||||
|
zeichnen();
|
||||||
|
sagKurz(wann.value
|
||||||
|
? 'Termin gesetzt — er steht jetzt im Foyer.'
|
||||||
|
: 'Termin weg. Das Video bleibt bereitgelegt.');
|
||||||
|
});
|
||||||
|
zeile.append(wann);
|
||||||
|
|
||||||
const knoepfe = el('div', 'warte-zeile__knoepfe');
|
const knoepfe = el('div', 'warte-zeile__knoepfe');
|
||||||
const jetzt = el('button', null, 'Jetzt');
|
const jetzt = el('button', null, 'Jetzt');
|
||||||
jetzt.type = 'button';
|
jetzt.type = 'button';
|
||||||
|
|||||||
+19
-19
@@ -12,19 +12,19 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="garage">
|
<body class="start" data-buehne="garage">
|
||||||
@@ -430,22 +430,22 @@
|
|||||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||||
<script src="assets/js/textform.js?v=202610080131"></script>
|
<script src="assets/js/textform.js?v=202610081102"></script>
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/zuteilung.js?v=202610080131" defer></script>
|
<script src="assets/js/zuteilung.js?v=202610081102" defer></script>
|
||||||
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
|
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
|
||||||
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
|
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
|
||||||
eigene Datei; hier zeigt er den Creator-Katalog.
|
eigene Datei; hier zeigt er den Creator-Katalog.
|
||||||
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
|
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
|
||||||
<script src="assets/js/vorlagenbrett.js?v=202610080131" defer></script>
|
<script src="assets/js/vorlagenbrett.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/aufgaben.js?v=202610080131" defer></script>
|
<script src="assets/js/aufgaben.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/automation.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/automation.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="garage">
|
<body class="start" data-buehne="garage">
|
||||||
@@ -168,15 +168,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/automation.js?v=202610080131" defer></script>
|
<script src="assets/js/automation.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -197,16 +197,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/befinden.js?v=202610080131" defer></script>
|
<script src="assets/js/befinden.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+19
-19
@@ -7,17 +7,17 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -108,15 +108,15 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202610080131" defer></script>
|
<script src="assets/js/auskunft.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bewerben.js?v=202610080131" defer></script>
|
<script src="assets/js/bewerben.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -7,16 +7,16 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -80,16 +80,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202610080131" defer></script>
|
<script src="assets/js/auskunft.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bewerbungen.js?v=202610080131" defer></script>
|
<script src="assets/js/bewerbungen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -59,11 +59,11 @@
|
|||||||
<!-- DIE WERBEEINBLENDUNG. Dieselbe Datei wie in der Reaction-Seite:
|
<!-- DIE WERBEEINBLENDUNG. Dieselbe Datei wie in der Reaction-Seite:
|
||||||
Zwei Fassungen altern unterschiedlich, und dann sieht der Stream
|
Zwei Fassungen altern unterschiedlich, und dann sieht der Stream
|
||||||
anders aus als das, worueber geredet wird. -->
|
anders aus als das, worueber geredet wird. -->
|
||||||
<link rel="stylesheet" href="assets/css/werbung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/werbung.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
<body class="obs-buehne">
|
<body class="obs-buehne">
|
||||||
<div id="platz"></div>
|
<div id="platz"></div>
|
||||||
<script src="assets/js/werbung.js?v=202610080131" defer></script>
|
<script src="assets/js/werbung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/buehne.js?v=202610080131" defer></script>
|
<script src="assets/js/buehne.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/calls.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/calls.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="lounge">
|
<body class="start" data-buehne="lounge">
|
||||||
@@ -89,15 +89,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202610080131" defer></script>
|
<script src="assets/js/ki.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/calls.js?v=202610080131" defer></script>
|
<script src="assets/js/calls.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+21
-21
@@ -12,31 +12,31 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||||||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||||||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||||||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||||||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||||||
Dialog zu sehen bekam. -->
|
Dialog zu sehen bekam. -->
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/chat.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/chat.css?v=202610081102" />
|
||||||
<!-- Die Bildschau stand bis zum 07.10.2026 in chat.css. Sie wird jetzt
|
<!-- Die Bildschau stand bis zum 07.10.2026 in chat.css. Sie wird jetzt
|
||||||
auch vom Event-Banner benutzt (bereich.html) und hat deshalb eine
|
auch vom Event-Banner benutzt (bereich.html) und hat deshalb eine
|
||||||
eigene Datei. Sie steht GENAU HIER -- direkt hinter chat.css, also
|
eigene Datei. Sie steht GENAU HIER -- direkt hinter chat.css, also
|
||||||
an derselben Stelle im Ladeweg wie der Block vorher. -->
|
an derselben Stelle im Ladeweg wie der Block vorher. -->
|
||||||
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bildschau.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="lounge">
|
<body class="start" data-buehne="lounge">
|
||||||
@@ -744,24 +744,24 @@
|
|||||||
</form>
|
</form>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
<script src="assets/js/bereiche.js?v=202610080131"></script>
|
<script src="assets/js/bereiche.js?v=202610081102"></script>
|
||||||
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
||||||
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
||||||
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
||||||
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
||||||
wirklich vor den anderen dasteht. -->
|
wirklich vor den anderen dasteht. -->
|
||||||
<script src="assets/js/textform.js?v=202610080131"></script>
|
<script src="assets/js/textform.js?v=202610081102"></script>
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131"></script>
|
<script src="assets/js/kopf.js?v=202610081102"></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131"></script>
|
<script src="assets/js/glocke.js?v=202610081102"></script>
|
||||||
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
||||||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||||||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||||||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||||||
<script src="assets/js/anruf.js?v=202610080131"></script>
|
<script src="assets/js/anruf.js?v=202610081102"></script>
|
||||||
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
|
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
|
||||||
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
|
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
|
||||||
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
|
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
|
||||||
@@ -772,8 +772,8 @@
|
|||||||
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
|
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
|
||||||
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
|
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
|
||||||
auftritt, ist der, den man nie nachstellen kann. -->
|
auftritt, ist der, den man nie nachstellen kann. -->
|
||||||
<script src="assets/js/bildschau.js?v=202610080131"></script>
|
<script src="assets/js/bildschau.js?v=202610081102"></script>
|
||||||
<script src="assets/js/chat.js?v=202610080131"></script>
|
<script src="assets/js/chat.js?v=202610081102"></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/content.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/content.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="portal">
|
<body class="start" data-buehne="portal">
|
||||||
@@ -179,15 +179,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/checkliste.js?v=202610080131" defer></script>
|
<script src="assets/js/checkliste.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/content.js?v=202610080131" defer></script>
|
<script src="assets/js/content.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -36,15 +36,15 @@
|
|||||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||||
type="image/webp" media="(max-width: 899px)" />
|
type="image/webp" media="(max-width: 899px)" />
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="gate gate--crew">
|
<body class="gate gate--crew">
|
||||||
@@ -459,7 +459,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/gate.js?v=202610080131" defer></script>
|
<script src="assets/js/gate.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -23,25 +23,25 @@
|
|||||||
},
|
},
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-192.png?v=202610080131",
|
"src": "/assets/img/app-symbole/crew-192.png?v=202610081102",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-512.png?v=202610080131",
|
"src": "/assets/img/app-symbole/crew-512.png?v=202610081102",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202610080131",
|
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202610081102",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202610080131",
|
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202610081102",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/dateien.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="arena">
|
<body class="start" data-buehne="arena">
|
||||||
@@ -108,15 +108,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/dateien.js?v=202610080131" defer></script>
|
<script src="assets/js/dateien.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -306,20 +306,20 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
|
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
|
||||||
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
|
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
|
||||||
in Dokumentreihenfolge. -->
|
in Dokumentreihenfolge. -->
|
||||||
<script src="assets/js/vorlagenbrett.js?v=202610080131" defer></script>
|
<script src="assets/js/vorlagenbrett.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/entwicklung.js?v=202610080131" defer></script>
|
<script src="assets/js/entwicklung.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+15
-15
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/hilfe.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -146,14 +146,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hilfe.js?v=202610080131" defer></script>
|
<script src="assets/js/hilfe.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||||
type="image/webp" media="(max-width: 899px)" />
|
type="image/webp" media="(max-width: 899px)" />
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="gate">
|
<body class="gate">
|
||||||
@@ -427,7 +427,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/gate.js?v=202610080131" defer></script>
|
<script src="assets/js/gate.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/kalender.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="skyline">
|
<body class="start" data-buehne="skyline">
|
||||||
@@ -383,15 +383,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kalender.js?v=202610080131" defer></script>
|
<script src="assets/js/kalender.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kalender-abo.js?v=202610080131" defer></script>
|
<script src="assets/js/kalender-abo.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/leistung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="arena">
|
<body class="start" data-buehne="arena">
|
||||||
@@ -444,13 +444,13 @@
|
|||||||
</form>
|
</form>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131"></script>
|
<script src="assets/js/meldung.js?v=202610081102"></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131"></script>
|
<script src="assets/js/nachfrage.js?v=202610081102"></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131"></script>
|
<script src="assets/js/wahl.js?v=202610081102"></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131"></script>
|
<script src="assets/js/bereiche.js?v=202610081102"></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131"></script>
|
<script src="assets/js/kopf.js?v=202610081102"></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131"></script>
|
<script src="assets/js/glocke.js?v=202610081102"></script>
|
||||||
<script src="assets/js/leistung.js?v=202610080131"></script>
|
<script src="assets/js/leistung.js?v=202610081102"></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,17 +7,17 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/manager-ziele.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/manager-ziele.css?v=202610081102" />
|
||||||
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
|
<!-- module.css an VORLETZTER, haus.css an LETZTER Stelle. Die
|
||||||
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
|
Reihenfolge ist keine Geschmacksfrage: haus.css setzt nur
|
||||||
Variablen, und bei Variablen entscheidet allein, wer zuletzt
|
Variablen, und bei Variablen entscheidet allein, wer zuletzt
|
||||||
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
|
kommt. pruef-css-klassen.mjs misst genau dieses Paar nach. -->
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="arena">
|
<body class="start" data-buehne="arena">
|
||||||
@@ -230,16 +230,16 @@
|
|||||||
kopf.js liest daraus die Leitungsrollen. Ohne sie stürzt jede
|
kopf.js liest daraus die Leitungsrollen. Ohne sie stürzt jede
|
||||||
Seite ab, und zwar nur in der Browserkonsole -- die Kopfleiste
|
Seite ab, und zwar nur in der Browserkonsole -- die Kopfleiste
|
||||||
kommt trotzdem. -->
|
kommt trotzdem. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
|
<!-- wahl.js gehört zu kopf.js: Der Sicht-Umschalter baut daraus seine
|
||||||
Liste. pruef-css-klassen setzt das durch, und zwar auch die
|
Liste. pruef-css-klassen setzt das durch, und zwar auch die
|
||||||
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
|
Reihenfolge -- kopf.js fragt beim Aufbau nach dem fertigen
|
||||||
Bedienelement. -->
|
Bedienelement. -->
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/manager-ziele.js?v=202610080131" defer></script>
|
<script src="assets/js/manager-ziele.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,13 +12,13 @@
|
|||||||
vergessen wird. -->
|
vergessen wird. -->
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/material.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/material.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
<body class="start" data-ton="42" data-buehne="studio">
|
<body class="start" data-ton="42" data-buehne="studio">
|
||||||
|
|
||||||
@@ -138,14 +138,14 @@
|
|||||||
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/material.js?v=202610080131" defer></script>
|
<script src="assets/js/material.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+14
-14
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/notizen.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/notizen.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-ton="46">
|
<body class="start" data-ton="46">
|
||||||
@@ -181,12 +181,12 @@
|
|||||||
|
|
||||||
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
||||||
liest daraus die Leitungsrollen. -->
|
liest daraus die Leitungsrollen. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/notizen.js?v=202610080131" defer></script>
|
<script src="assets/js/notizen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/personen.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/personen.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="halle">
|
<body class="start" data-buehne="halle">
|
||||||
@@ -453,14 +453,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/personen.js?v=202610080131" defer></script>
|
<script src="assets/js/personen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/profil.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/profil.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="halle">
|
<body class="start" data-buehne="halle">
|
||||||
@@ -214,16 +214,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/steckbrief.js?v=202610080131" defer></script>
|
<script src="assets/js/steckbrief.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/profil.js?v=202610080131" defer></script>
|
<script src="assets/js/profil.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -0,0 +1,206 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
|
<title>Reaction · Team Dogi</title>
|
||||||
|
<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=202610081102" />
|
||||||
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
|
<link rel="stylesheet" href="assets/css/foyer.css?v=202610081102" />
|
||||||
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="start">
|
||||||
|
|
||||||
|
<div class="schleier" aria-hidden="true"></div>
|
||||||
|
|
||||||
|
<header class="kopfleiste">
|
||||||
|
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||||
|
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||||
|
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||||
|
</svg>
|
||||||
|
<span class="zurueck-knopf__text">Zurück</span>
|
||||||
|
</button>
|
||||||
|
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Reaction</span></p>
|
||||||
|
<div class="kopfleiste__rechts">
|
||||||
|
<span class="wer" id="wer">…</span>
|
||||||
|
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- ======================================================================
|
||||||
|
DAS FOYER (08.10.2026)
|
||||||
|
|
||||||
|
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn
|
||||||
|
man drauf drückt geht zuerst eine seite auf mit
|
||||||
|
reihen/kategorien. links eine reihe wo die nächsten geplanten
|
||||||
|
videos schon bereit stehen. wan und umd wie viel uhr … und das
|
||||||
|
soll geschlossen sein außer für vanvan und dogfather. in der
|
||||||
|
mitte sollen die leute dan wenn eine sendung läuft drauf drücken
|
||||||
|
können und der sendung beitreten. auch bei der vorschau schon und
|
||||||
|
dan rechts will ich die letzte reihe/kategorie, da sollen die
|
||||||
|
leute alle mir videos anraten können."
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
WARUM DAS EINE EIGENE SEITE IST UND KEIN VIERTER ZUSTAND DES SAALS
|
||||||
|
|
||||||
|
Der Saal meldet jeden an, der ihn oeffnet („dabei"), baut
|
||||||
|
Verbindungen auf und haelt den Ereignisstrom offen. Das ist
|
||||||
|
richtig fuer jemanden, der zusieht -- und falsch fuer jemanden,
|
||||||
|
der nur nachsehen will, ob heute Abend etwas laeuft. Waere das
|
||||||
|
Foyer der vierte Zustand derselben Seite, zaehlte jeder Blick
|
||||||
|
als Zuschauer, und die Zahl im Regiepult saehe nach Publikum
|
||||||
|
aus, wo niemand zusieht.
|
||||||
|
|
||||||
|
Hier wird nur GELESEN. Erst der Knopf in der Mitte fuehrt in den
|
||||||
|
Saal, und ab da gilt alles, was dort gilt.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
DREI REIHEN, UND DIE MITTE IST DIE BREITESTE
|
||||||
|
|
||||||
|
Links der Plan, in der Mitte der Weg hinein, rechts die
|
||||||
|
Vorschlaege. Die Mitte bekommt mehr Platz, weil sie das Einzige
|
||||||
|
ist, weswegen die meisten hier sind -- und weil ein Knopf, der
|
||||||
|
in eine laufende Sendung fuehrt, nicht gesucht werden soll.
|
||||||
|
|
||||||
|
AM HANDY STEHT DIE MITTE OBEN. Dort ist „links" nur noch „vor
|
||||||
|
allem anderen", und das waere die falsche Reihenfolge: Wer am
|
||||||
|
Telefon nachsieht, ob es laeuft, soll es in der ersten Zeile
|
||||||
|
sehen und nicht nach zwei Bildschirmhoehen Plan.
|
||||||
|
====================================================================== -->
|
||||||
|
<main class="inhalt inhalt--breit" id="foyer">
|
||||||
|
|
||||||
|
<section class="kopf-zeile">
|
||||||
|
<div>
|
||||||
|
<p class="marke">Reaction</p>
|
||||||
|
<h1 class="titel">Zusammen schauen</h1>
|
||||||
|
<p class="unterzeile" id="kopf-satz">Wird geladen …</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<p class="fehler" id="fehler" role="alert" aria-live="polite" hidden></p>
|
||||||
|
|
||||||
|
<div class="foyer-reihen" id="reihen">
|
||||||
|
|
||||||
|
<!-- ============ LINKS: DER PLAN ===========================
|
||||||
|
Nur fuer DogFather und VanVan. Filipe: „und das soll
|
||||||
|
geschlossen sein außer für vanvan und dogfather."
|
||||||
|
|
||||||
|
SIE STEHT GAR NICHT ERST DA, statt leer oder gesperrt zu
|
||||||
|
sein. Ein Kasten mit Schloss darauf erzaehlt, dass es etwas
|
||||||
|
zu sehen gaebe -- und genau das soll er nicht. -->
|
||||||
|
<section class="foyer-reihe foyer-reihe--plan" id="reihe-plan" hidden>
|
||||||
|
<header class="foyer-reihe__kopf">
|
||||||
|
<h2 class="foyer-reihe__ueber">Was ansteht</h2>
|
||||||
|
<span class="foyer-reihe__nur">nur ihr zwei</span>
|
||||||
|
</header>
|
||||||
|
<p class="foyer-reihe__satz">
|
||||||
|
Die Warteschlange aus der Regie — hier nach Termin sortiert.
|
||||||
|
Was noch keinen hat, steht unten.
|
||||||
|
</p>
|
||||||
|
<ol class="plan-liste" id="plan-liste"></ol>
|
||||||
|
<p class="foyer-reihe__fuss">
|
||||||
|
Termine setzt du im Saal unter <strong>Regie → Warteschlange</strong>.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ============ MITTE: HINEIN ============================= -->
|
||||||
|
<section class="foyer-reihe foyer-reihe--saal" id="reihe-saal">
|
||||||
|
<header class="foyer-reihe__kopf">
|
||||||
|
<h2 class="foyer-reihe__ueber">Die Sendung</h2>
|
||||||
|
<span class="foyer-lampe" id="lampe" data-stand="laedt">
|
||||||
|
<span class="foyer-lampe__punkt" aria-hidden="true"></span>
|
||||||
|
<span class="foyer-lampe__wort" id="lampe-wort">…</span>
|
||||||
|
</span>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="saal-karte" id="saal-karte" data-bild="nein">
|
||||||
|
<img id="saal-bild" alt="" />
|
||||||
|
<span class="saal-karte__leer" id="saal-leer">Gerade läuft nichts.</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<strong class="saal-titel" id="saal-titel">—</strong>
|
||||||
|
<p class="saal-satz" id="saal-satz"></p>
|
||||||
|
|
||||||
|
<!-- DER KNOPF IST EIN LINK UND KEIN BUTTON. Wer ihn mit der
|
||||||
|
mittleren Maustaste antippt, bekommt einen neuen Reiter --
|
||||||
|
genau das tut man, wenn man die Sendung nebenher laufen
|
||||||
|
lassen will. Ein `button` mit `location.href` kann das
|
||||||
|
nicht, und man merkt es erst, wenn es nicht geht. -->
|
||||||
|
<a class="saal-knopf" id="saal-knopf" href="reaktion.html" hidden>
|
||||||
|
<span class="saal-knopf__wort" id="saal-knopf-wort">Beitreten</span>
|
||||||
|
</a>
|
||||||
|
<p class="saal-zahl" id="saal-zahl" hidden></p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ============ RECHTS: ANRATEN ===========================
|
||||||
|
Filipe: „da sollen die leute alle mir videos anraten können.
|
||||||
|
also da können die leute videos reinschicken und nur ich und
|
||||||
|
vanvan sehen sie."
|
||||||
|
|
||||||
|
JEDER DARF SCHICKEN, NIEMAND SIEHT FREMDE. Was man selbst
|
||||||
|
geschickt hat, steht darunter mit seinem Stand -- sonst
|
||||||
|
waere das Feld ein Loch, in das man etwas wirft. -->
|
||||||
|
<section class="foyer-reihe foyer-reihe--raten" id="reihe-raten">
|
||||||
|
<header class="foyer-reihe__kopf">
|
||||||
|
<h2 class="foyer-reihe__ueber">Video anraten</h2>
|
||||||
|
<span class="foyer-reihe__zahl" id="raten-zahl" hidden></span>
|
||||||
|
</header>
|
||||||
|
<p class="foyer-reihe__satz" id="raten-satz">
|
||||||
|
Schick uns ein Video, das wir zusammen schauen sollen.
|
||||||
|
Sehen tun das nur DogFather und VanVan.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<form class="raten-form" id="raten-form">
|
||||||
|
<label class="raten-feld">
|
||||||
|
<span>YouTube-Adresse</span>
|
||||||
|
<input type="text" id="raten-video" autocomplete="off"
|
||||||
|
placeholder="Adresse einfügen" />
|
||||||
|
</label>
|
||||||
|
<!-- KEIN `maxlength` HIER. Die Zahl stand sonst zweimal: hier
|
||||||
|
und als `VORSCHLAG_NOTIZ_MAX` im Server. Wer sie dort
|
||||||
|
aendert, haette hier die alte stehen gelassen, und der
|
||||||
|
Zaehler neben „Warum?“ hätte eine Grenze gezählt, die es
|
||||||
|
nicht mehr gibt. Das Feld lernt sie von der Auskunft
|
||||||
|
(`notiz_max`); bis dahin schneidet der Server ohnehin ab. -->
|
||||||
|
<label class="raten-feld">
|
||||||
|
<span>Warum? <span class="raten-rest" id="raten-rest"></span></span>
|
||||||
|
<input type="text" id="raten-notiz"
|
||||||
|
placeholder="Freiwillig — ein Satz reicht" />
|
||||||
|
</label>
|
||||||
|
<!-- `knopf` und nicht `knopf-still--haupt`: Der Hauptknopf des
|
||||||
|
Hauses steht in `gate.css`, und die lädt diese Seite.
|
||||||
|
`knopf-still--haupt` wird in `reaktion.css` gestaltet --
|
||||||
|
die gehört dem Saal und wird hier nicht geladen. Die
|
||||||
|
Klasse hätte also im Quelltext ausgesehen, als sei etwas
|
||||||
|
hervorgehoben, und auf dem Bildschirm wäre es ein
|
||||||
|
gewöhnlicher Knopf gewesen. Gefunden hat das
|
||||||
|
`pruef-css-klassen`. -->
|
||||||
|
<button type="submit" class="knopf" id="raten-los">Abschicken</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<ol class="raten-liste" id="raten-liste"></ol>
|
||||||
|
<p class="foyer-reihe__fuss" id="raten-fuss"></p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
||||||
|
liest daraus die Leitungsrollen. -->
|
||||||
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
|
<script src="assets/js/reaktion-foyer.js?v=202610081102" defer></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+20
-20
@@ -7,15 +7,15 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/reaktion.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/reaktion.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/werbung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/werbung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start reaktion-seite" data-stand="laedt">
|
<body class="start reaktion-seite" data-stand="laedt">
|
||||||
@@ -835,7 +835,7 @@
|
|||||||
<p class="pult__klein">
|
<p class="pult__klein">
|
||||||
Wählt jemand einen davon aus, läuft seine Karte
|
Wählt jemand einen davon aus, läuft seine Karte
|
||||||
<strong>sofort</strong> — niemand muss sie bestätigen. Nur
|
<strong>sofort</strong> — niemand muss sie bestätigen. Nur
|
||||||
selbst geschriebene Texte warten im Register „Spenden" auf
|
selbst geschriebene Texte warten im Register „Spenden“ auf
|
||||||
dich. Ein leeres Feld nimmt den Satz weg.
|
dich. Ein leeres Feld nimmt den Satz weg.
|
||||||
</p>
|
</p>
|
||||||
<div class="saetze" id="saetze"></div>
|
<div class="saetze" id="saetze"></div>
|
||||||
@@ -1132,15 +1132,15 @@
|
|||||||
|
|
||||||
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
||||||
liest daraus die Leitungsrollen. -->
|
liest daraus die Leitungsrollen. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/spendenkarte.js?v=202610080131" defer></script>
|
<script src="assets/js/spendenkarte.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/werbung.js?v=202610080131" defer></script>
|
<script src="assets/js/werbung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/reaktion.js?v=202610080131" defer></script>
|
<script src="assets/js/reaktion.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -134,14 +134,14 @@
|
|||||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||||
die seit dem 07.09. jede Seite danach absucht. -->
|
die seit dem 07.09. jede Seite danach absucht. -->
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/rechte.js?v=202610080131" defer></script>
|
<script src="assets/js/rechte.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/report.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/report.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="showbuehne">
|
<body class="start" data-buehne="showbuehne">
|
||||||
@@ -106,17 +106,17 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202610080131" defer></script>
|
<script src="assets/js/ki.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/report.js?v=202610080131" defer></script>
|
<script src="assets/js/report.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/scouting.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="wald">
|
<body class="start" data-buehne="wald">
|
||||||
@@ -194,14 +194,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/scouting.js?v=202610080131" defer></script>
|
<script src="assets/js/scouting.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+19
-19
@@ -12,26 +12,26 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
||||||
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
||||||
<link rel="stylesheet" href="assets/css/heim.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/heim.css?v=202610081102" />
|
||||||
<!-- Die Einweisung bringt ihr Aussehen mit. Sie steht in
|
<!-- Die Einweisung bringt ihr Aussehen mit. Sie steht in
|
||||||
anleitung.css, weil sie dorthin gehoert -- und nicht in
|
anleitung.css, weil sie dorthin gehoert -- und nicht in
|
||||||
start.css, wo sie zwischen 48 Kachelfarben verschwinden
|
start.css, wo sie zwischen 48 Kachelfarben verschwinden
|
||||||
wuerde. -->
|
wuerde. -->
|
||||||
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/anleitung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -768,22 +768,22 @@
|
|||||||
</p>
|
</p>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/live.js?v=202610080131" defer></script>
|
<script src="assets/js/live.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/start.js?v=202610080131" defer></script>
|
<script src="assets/js/start.js?v=202610081102" defer></script>
|
||||||
<!-- Die Begruessung und der Rundgang beim ersten Anmelden.
|
<!-- Die Begruessung und der Rundgang beim ersten Anmelden.
|
||||||
EIGENE DATEI und nicht ein Stueck start.js: Sie laeuft auf der
|
EIGENE DATEI und nicht ein Stueck start.js: Sie laeuft auf der
|
||||||
meistbenutzten Seite des Hauses, und wenn hier etwas schiefgeht,
|
meistbenutzten Seite des Hauses, und wenn hier etwas schiefgeht,
|
||||||
darf davon nichts anderes betroffen sein. -->
|
darf davon nichts anderes betroffen sein. -->
|
||||||
<script src="assets/js/rundgang.js?v=202610080131" defer></script>
|
<script src="assets/js/rundgang.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/aufstieg.js?v=202610080131" defer></script>
|
<script src="assets/js/aufstieg.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/startcheck.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="wald">
|
<body class="start" data-buehne="wald">
|
||||||
@@ -85,16 +85,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202610080131" defer></script>
|
<script src="assets/js/ki.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/startcheck.js?v=202610080131" defer></script>
|
<script src="assets/js/startcheck.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/profil.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/profil.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="halle">
|
<body class="start" data-buehne="halle">
|
||||||
@@ -150,16 +150,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202610080131" defer></script>
|
<script src="assets/js/auskunft.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/steckbrief.js?v=202610080131" defer></script>
|
<script src="assets/js/steckbrief.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+14
-14
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/support.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/support.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="studio">
|
<body class="start" data-buehne="studio">
|
||||||
@@ -154,16 +154,16 @@
|
|||||||
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
|
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
|
||||||
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
|
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
|
||||||
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
|
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
|
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
|
||||||
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
|
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
|
||||||
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
|
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
|
||||||
uebersicht.html, und heute hier. -->
|
uebersicht.html, und heute hier. -->
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/support.js?v=202610080131" defer></script>
|
<script src="assets/js/support.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
„Eigenes CSS" leer lassen (der Grund ist schon
|
„Eigenes CSS" leer lassen (der Grund ist schon
|
||||||
durchsichtig).
|
durchsichtig).
|
||||||
====================================================================== -->
|
====================================================================== -->
|
||||||
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202610081102" />
|
||||||
<style>
|
<style>
|
||||||
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
|
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
|
||||||
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
|
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
|
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
|
||||||
|
|
||||||
<script src="assets/js/spendenkarte.js?v=202610080131" defer></script>
|
<script src="assets/js/spendenkarte.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/tafel.js?v=202610080131" defer></script>
|
<script src="assets/js/tafel.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -7,18 +7,18 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081102" />
|
||||||
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
||||||
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
||||||
anders aussieht. -->
|
anders aussieht. -->
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -111,15 +111,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/talente.js?v=202610080131" defer></script>
|
<script src="assets/js/talente.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,20 +7,20 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/team.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/team.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="halle">
|
<body class="start" data-buehne="halle">
|
||||||
@@ -110,15 +110,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/team.js?v=202610080131" defer></script>
|
<script src="assets/js/team.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,20 +7,20 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/team.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/team.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
<!-- `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
|
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
||||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/teamlage.js?v=202610080131" defer></script>
|
<script src="assets/js/teamlage.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+15
-15
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/bereich.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -112,15 +112,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/teilen.js?v=202610080131" defer></script>
|
<script src="assets/js/teilen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -126,14 +126,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/treff-moderation.js?v=202610080131" defer></script>
|
<script src="assets/js/treff-moderation.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,18 +7,18 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||||
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
|
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -248,14 +248,14 @@
|
|||||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||||
die seit dem 07.09. jede Seite danach absucht. -->
|
die seit dem 07.09. jede Seite danach absucht. -->
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202610080131" defer></script>
|
<script src="assets/js/auskunft.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/treff-regeln.js?v=202610080131" defer></script>
|
<script src="assets/js/treff-regeln.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,22 +12,22 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||||
Dialog "Creator anlegen". -->
|
Dialog "Creator anlegen". -->
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="showbuehne">
|
<body class="start" data-buehne="showbuehne">
|
||||||
@@ -149,16 +149,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/uebersicht.js?v=202610080131" defer></script>
|
<script src="assets/js/uebersicht.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -335,14 +335,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/live.js?v=202610080131" defer></script>
|
<script src="assets/js/live.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/unsere-seiten.js?v=202610080131" defer></script>
|
<script src="assets/js/unsere-seiten.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -106,17 +106,17 @@
|
|||||||
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
|
||||||
liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit
|
liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit
|
||||||
„Cannot read properties of undefined (reading 'LEITUNG')" ab. -->
|
„Cannot read properties of undefined (reading 'LEITUNG')" ab. -->
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202610080131" defer></script>
|
<script src="assets/js/holen.js?v=202610081102" defer></script>
|
||||||
<!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort
|
<!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort
|
||||||
des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet
|
des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet
|
||||||
von pruef-meldungen, nicht beim Ansehen. -->
|
von pruef-meldungen, nicht beim Ansehen. -->
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/unterstuetzen.js?v=202610080131" defer></script>
|
<script src="assets/js/unterstuetzen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,15 +7,15 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/werdegang.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -144,14 +144,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/werdegang.js?v=202610080131" defer></script>
|
<script src="assets/js/werdegang.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
veraltet beim naechsten Umbau. -->
|
veraltet beim naechsten Umbau. -->
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* Bewusst ohne eigenes Stilblatt: Die Seite ist in aller Regel nur
|
/* Bewusst ohne eigenes Stilblatt: Die Seite ist in aller Regel nur
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610080131" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610081102" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610080131" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/wissen.css?v=202610081102" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202610081102" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202610080131" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202610081102" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start" data-buehne="arena">
|
<body class="start" data-buehne="arena">
|
||||||
@@ -190,15 +190,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202610080131" defer></script>
|
<script src="assets/js/meldung.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202610080131" defer></script>
|
<script src="assets/js/hochladen.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202610080131" defer></script>
|
<script src="assets/js/nachfrage.js?v=202610081102" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202610080131" defer></script>
|
<script src="assets/js/wahl.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202610080131" defer></script>
|
<script src="assets/js/bereiche.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202610080131" defer></script>
|
<script src="assets/js/installieren.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202610080131" defer></script>
|
<script src="assets/js/kopf.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202610080131" defer></script>
|
<script src="assets/js/glocke.js?v=202610081102" defer></script>
|
||||||
<script src="assets/js/wissen.js?v=202610080131" defer></script>
|
<script src="assets/js/wissen.js?v=202610081102" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user