Der Treff sagt jetzt, ob gerade gestreamt wird

Filipe zu dieser Seite: "mach was anderes daraus oder mach es viel
krass und geiler ... erstell was was mich von den socken schmeisst. es
soll wirklich sogar ein wow effekt fuer die community ergeben." Dazu
die eine Auflage: die Kachel bleibt.

WAS SIE WAR: zwei Karten mit zwei Adressen. Sauber gebaut, richtig
beschriftet -- und niemand kam ein zweites Mal wieder. Wer im Treff
ist, kennt die Website. Den Rabattcode merkt man sich beim ersten Mal.

DIE FRAGE, DIE WIRKLICH JEMAND HAT, IST EINE ANDERE: Laeuft er
gerade? Und wenn nicht -- wie lange noch? Die Antwort kennt das Haus
seit dem 20.08.: postfach.dogfather-universe.com/live-status, derselbe
Dienst, von dem der oeffentliche Streamplan lebt. Im Treff gab es sie
bisher nicht.

Jetzt steht oben ein Puls: ein Ring, der sich ueber den Tag bis zur
naechsten Sendezeit fuellt, darin der Countdown auf die Sekunde. Sendet
er, wird die Karte rot, atmet im Ruhepuls und traegt den Titel des
Streams plus einen Weg hin. Darunter die drei Accounts und -- wenn die
Verwaltung eines eintraegt -- das besondere Event mit eigener Uhr.

DREI AUSGAENGE, NICHT ZWEI. Das ist der eigentliche Unterschied zur
oeffentlichen Seite: streamplan.js faengt dort jeden Fehler ab und
setzt `istLive = false`. Aus "wir konnten nicht fragen" wird "er sendet
nicht" -- und wer das liest, macht die Seite zu und verpasst den
Stream. Der Dienst liefert `autoHealthy` sogar mit; gelesen wird es
draussen nicht. Hier schon: Bei einer Stoerung steht "Konnten wir
gerade nicht nachsehen", dazu der Hinweis, dass das NICHT heisst, dass
kein Stream laeuft. Der Countdown laeuft dabei weiter -- er braucht
kein Netz.

NICHTS IST ABGESCHRIEBEN. Die drei Accounts kommen ueber
/workspace/api/draussen aus derselben KANAELE-Liste, an der die
Aufgabenverteilung haengt; die Adressen baut der Steckbrief. Die
Sendezeit steht im Server, und pruef-draussen haelt sie gegen
FIX_STUNDE in streamplan.js -- verschiebt jemand den Termin und aendert
nur einen Ort, wird die Pruefung rot.

Gemessen, bevor gebaut wurde: der Dienst antwortet und meldet sich
gesund, CORS steht auf *, und `connect-src` der Treff-Seiten fuehrt
postfach bereits. Ohne das Letzte waere der Abruf still blockiert
worden und haette ausgesehen wie ein toter Dienst.

Die Kachel heisst jetzt "Draussen" statt "Unsere Seiten" -- drei Dinge
statt zwei Adressen. Ziel und Datei bleiben gleich.
pruef-wege-nach-draussen schreibt den Namen nicht mehr ab, sondern
verlangt, dass Kachel und Seitenueberschrift uebereinstimmen. Zwei
Namen fuer denselben Ort waren schon einmal ein echter Fehler.

Nebenbefund, dort gleich behoben: Dieselbe Pruefung verlangte, dass
die Community-Kacheln restlos in Dreierreihen aufgehen -- obwohl ihr
eigener Kommentar sagt, eine freie Zelle am Ende sei erlaubt. Sie war
rot bei einwandfreiem Raster. Gemessen wird jetzt, was wirklich
schiefgeht: eine doppelt breite Kachel, die in der letzten Spalte
beginnt und die Zelle davor leer laesst. Mit Gegenprobe.

pruef-draussen: 39 Pruefungen, alle vier Lagen im echten Browser --
die Stoerung wird dafuer absichtlich hergestellt.
pruef-wege-nach-draussen: 67 statt 66, keine Fehler mehr.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-21 12:06:23 +02:00
co-authored by Claude Opus 5
parent 9a71f3a242
commit eca9aed279
44 changed files with 2141 additions and 729 deletions
+2
View File
@@ -46,6 +46,7 @@ import { kiRouter } from "./workspace-ki.js";
import { contentRouter } from "./workspace-content.js";
import { sicherungRouter, sicherungStarten } from "./workspace-sicherung.js";
import { steckbriefRouter } from "./workspace-steckbrief.js";
import { draussenRouter } from "./workspace-draussen.js";
import { vorlagenRouter } from "./workspace-vorlagen.js";
/* Die Arbeitslage von Managern und Scouts -- nur fuer Spicy Media und
DogFather. Sie ruehrt Termine, Chats und Dateien nicht an; die
@@ -217,6 +218,7 @@ app.use(sicherungRouter);
JSON in einem <img> ergibt nur ein kaputtes Bild ohne jeden Hinweis.
Der Steckbrief bringt seine eigene Schranke mit. */
app.use(steckbriefRouter);
app.use(draussenRouter);
/* Ebenfalls VOR aufgabenRouter: Der Service Worker holt den
oeffentlichen Schluessel, bevor irgendetwas anderes laeuft, und die
Push-Wege bringen ihre eigene Schranke mit. */
+407
View File
@@ -0,0 +1,407 @@
/* =====================================================================
DRAUSSEN -- der Puls auf der Community-Seite (21.09.2026)
Filipe: "mach was anderes aus dieser seite oder mach es viel krass
und geiler ... erstell was was mich von den socken schmeisst. es
soll wirklich sogar ein wow effekt fuer die community ergeben."
---------------------------------------------------------------------
WAS HIER GEPRUEFT WIRD, UND WARUM AUSGERECHNET DAS
Die Seite beantwortet jetzt die Frage "laeuft er gerade?". Eine
Anzeige, die diese Frage beantwortet, hat genau eine Art, wirklich
Schaden anzurichten: Sie sagt "nicht live", ohne nachgesehen zu
haben. Wer das liest, macht die Seite zu -- und verpasst den Stream.
DAS IST KEIN GEDANKENSPIEL. Genau so macht es die oeffentliche
Seite: `streamplan.js` faengt jeden Fehler ab und setzt
`istLive = false`. Aus "wir konnten nicht fragen" wird "er sendet
nicht". Der Dienst liefert sogar `autoHealthy` mit, damit man das
unterscheiden kann -- gelesen wird es dort nicht.
DESHALB WIRD DIE STOERUNG HIER ABSICHTLICH HERGESTELLT. Vier Lagen,
vier Messungen, und die wichtigste ist die, in der nichts antwortet:
1. er sendet -> "JETZT live", Weg zum Stream
2. er sendet nicht -> Countdown
3. der Pruefer ist gestoert -> "konnten wir nicht nachsehen"
4. gar keine Antwort -> dasselbe, nicht "nicht live"
Die Lagen 3 und 4 tragen zusaetzlich eine GEGENPROBE: Es reicht
nicht, dass irgendein Text dasteht -- es darf ausdruecklich NICHT
"Gerade nicht live" dort stehen. Ohne diese Zeile waere die Pruefung
gruen, sobald ueberhaupt etwas angezeigt wird.
---------------------------------------------------------------------
UND DIE ZAHL, DIE ES ZWEIMAL GIBT
Die Sendezeit (20 Uhr) steht im Server und in `streamplan.js` der
oeffentlichen Seite. Zwei Zahlen, die dasselbe bedeuten, laufen
irgendwann auseinander -- beide sehen fuer sich plausibel aus, und
es faellt erst auf, wenn jemand vergeblich wartet. Abschnitt 4 haelt
sie gegeneinander, ohne Netz.
Aufrufen mit: node server/pruef-draussen.mjs
===================================================================== */
import { mkdtempSync, rmSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { request as httpAnfrage } from "node:http";
import { eigenerPort } from "./helfer-port.mjs";
const PORT = await eigenerPort(import.meta, "pruef-draussen");
const ordner = mkdtempSync(join(tmpdir(), "ws-draussen-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const express = (await import("express")).default;
const ec = express.response.cookie;
express.response.cookie = function (n, w, o) {
return ec.call(this, n, w, { ...(o || {}), secure: false });
};
import { notbremse } from "./helfer-notbremse.mjs";
await import("./index.js");
notbremse(180_000, "pruef-draussen");
await new Promise((r) => setTimeout(r, 700));
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
let fehler = 0, geprueft = 0;
const melde = (t) => console.log(t);
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
const CREW = "crew.dogfather-universe.com";
const WURZEL = join(import.meta.dirname, "..");
function roh(pfad, host, kopf = {}, koerper = null) {
return new Promise((fertig, schief) => {
const a = httpAnfrage({
host: "127.0.0.1", port: PORT, path: pfad,
method: koerper ? "POST" : "GET",
headers: { Host: host, ...(koerper ? { "Content-Type": "application/json" } : {}), ...kopf },
}, (antwort) => {
let text = "";
antwort.on("data", (s) => { text += s; });
antwort.on("end", () => fertig({ code: antwort.statusCode, text, kopf: antwort.headers }));
});
a.on("error", schief);
if (koerper) a.write(JSON.stringify(koerper));
a.end();
});
}
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto");
{
const d = new DatabaseSync(process.env.WORKSPACE_DB);
for (const [name, rolle, code] of [["Mara", "gast", "CODE-GAST-0001"]]) {
const salz = randomBytes(16).toString("hex");
const hash = scryptSync(code, salz, 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, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)")
.run(name, rolle, hash, salz, 32768, new Date().toISOString());
}
d.close();
}
async function anmelden(rolle, code, host) {
let a = await roh("/workspace/api/anmelden", host, {}, { rolle, code });
if (a.code === 400 && a.text.includes("alter_offen")) {
a = await roh("/workspace/api/anmelden", host, {}, { rolle, code, alter_ok: true });
}
if (a.code !== 200) throw new Error(`Anmeldung ${rolle}: ${a.code} ${a.text}`);
return [].concat(a.kopf["set-cookie"] || []).map((z) => z.split(";")[0]).join("; ");
}
const kGast = await anmelden("gast", "CODE-GAST-0001", CREW);
const { KANAELE } = await import("./workspace.js");
const { SENDEZEIT_STUNDE } = await import("./workspace-draussen.js");
/* =======================================================================
1. DER WEG ZU DEN KANAELEN
======================================================================= */
melde("");
melde("=== 1. Die Kanaele kommen vom Server ===");
{
const zu = await roh("/workspace/api/draussen", CREW);
ok(zu.code === 401, `ohne Anmeldung verschlossen (${zu.code})`);
const a = await roh("/workspace/api/draussen", CREW, { Cookie: kGast });
ok(a.code === 200, `ein Mitglied bekommt sie (${a.code})`);
const d = JSON.parse(a.text || "{}");
const liste = d.kanaele || [];
ok(liste.length === KANAELE.length && liste.length > 0,
`es sind ${liste.length} Kanaele, so viele wie im Haus (${KANAELE.length})`);
/* NICHT ABGESCHRIEBEN, SONDERN VERGLICHEN. Wuerde hier ein Handle
als Text stehen, waere diese Pruefung genau so lange gruen wie der
Tippfehler, den sie finden soll -- am 21.09. war das bei zwei
anderen Pruefungen der Fall. */
const falsch = liste.filter((k, i) => k.handle !== KANAELE[i].handle);
ok(falsch.length === 0,
falsch.length ? `ABWEICHUNG: ${falsch.map((k) => k.handle).join(", ")}`
: `die Handles stimmen mit KANAELE ueberein (${liste.map((k) => k.handle).join(", ")})`);
const schlechteAdresse = liste.filter(
(k) => !k.adresse || !k.adresse.startsWith("https://www.tiktok.com/@")
|| !k.adresse.endsWith(k.handle.replace(/^@/, "")));
ok(schlechteAdresse.length === 0,
schlechteAdresse.length
? `ADRESSE PASST NICHT ZUM HANDLE: ${schlechteAdresse.map((k) => k.adresse).join(", ")}`
: "jede Adresse endet auf ihrem eigenen Handle");
const ohneSatz = liste.filter((k) => !k.satz || k.satz.length < 10);
ok(ohneSatz.length === 0,
ohneSatz.length ? `ohne Satz: ${ohneSatz.map((k) => k.name).join(", ")}`
: "jeder Kanal sagt in einem Satz, was es dort gibt");
/* Die Saetze fuer draussen sind ANDERE als die fuer das Team. Stuende
dort derselbe Text, waere das Feld ueberfluessig -- und jemand
wuerde es beim naechsten Kanal weglassen. */
const gleich = liste.filter((k, i) => k.satz === KANAELE[i].text);
ok(gleich.length === 0,
gleich.length ? `${gleich.length} Kanaele zeigen den internen Text`
: "und es ist nicht der interne Text aus der Aufgabenverteilung");
}
/* =======================================================================
2. DIE INHALTSRICHTLINIE MUSS DEN ABRUF ERLAUBEN
======================================================================= */
melde("");
melde("=== 2. Darf die Seite den Live-Dienst ueberhaupt fragen? ===");
{
/* WARUM DAS EINE EIGENE PRUEFUNG IST: Verbietet `connect-src` den
Abruf, bricht `fetch` im Browser ab -- und zwar mit demselben
Fehler wie ein toter Server. Die Seite landet in "unklar" und
sieht dabei voellig in Ordnung aus. Der Unterschied steht nur in
der Browserkonsole, die niemand aufmacht. */
const a = await roh("/workspace/unsere-seiten.html", CREW, { Cookie: kGast });
const regel = String(a.kopf["content-security-policy"] || "");
const zeile = regel.split(";").map((t) => t.trim())
.find((t) => t.startsWith("connect-src")) || "";
ok(zeile.length > 0, `es gibt eine connect-src-Regel (${zeile.slice(0, 60)}…)`);
ok(zeile.includes("postfach.dogfather-universe.com"),
"und sie fuehrt postfach.dogfather-universe.com");
ok(!zeile.includes("*") || zeile.includes("postfach"),
"Gegenprobe: die Erlaubnis steht namentlich da, nicht als Sternchen");
}
/* =======================================================================
3. DIE SEITE SELBST
======================================================================= */
melde("");
melde("=== 3. Was im Quelltext der Seite steht ===");
{
const html = readFileSync(join(WURZEL, "workspace/unsere-seiten.html"), "utf8");
ok(/id="puls"/.test(html), "der Puls steht auf der Seite");
ok(/data-lage="laedt"/.test(html),
"und beginnt in der Lage „laedt“ -- nicht in „nicht live“");
/* KEIN HANDLE IM QUELLTEXT DER KANALREIHE. Der Stream-Knopf traegt
bewusst einen: Er ist der eine feste Weg zum Hauptkanal und muss
auch dann funktionieren, wenn der Server-Abruf scheitert. Alles
andere kommt vom Server. */
const kanalReihe = (html.match(/id="kanaele-reihe"[^>]*>([\s\S]*?)<\/div>/) || [])[1] || "";
ok(kanalReihe.trim() === "",
"die Kanalreihe ist im Quelltext leer -- sie kommt vom Server");
const streamKnopf = (html.match(/id="puls-knopf"[\s\S]{0,200}?href="([^"]+)"/) || [])[1] || "";
const haupt = KANAELE[0].handle.replace(/^@/, "");
ok(streamKnopf.includes(haupt),
`der Weg zum Stream zeigt auf den Hauptkanal (${streamKnopf})`);
const css = readFileSync(join(WURZEL, "workspace/assets/css/unsere-seiten.css"), "utf8");
ok(/prefers-reduced-motion/.test(css),
"wer keine Bewegung moechte, bekommt keine");
ok(/\[data-lage="live"\][\s\S]{0,400}animation/.test(css),
"und die Bewegung haengt am Live-Zustand, laeuft also nicht dauernd");
}
/* =======================================================================
4. EINE ZAHL, ZWEI ORTE
======================================================================= */
melde("");
melde("=== 4. Die Sendezeit steht nicht zweimal verschieden da ===");
{
const streamplan = readFileSync(join(WURZEL, "assets/js/streamplan.js"), "utf8");
const treffer = streamplan.match(/FIX_STUNDE\s*=\s*(\d+)/);
/* DRITTER AUSGANG: Findet sich die Zahl nicht, ist das kein "in
Ordnung" -- dann hat jemand `streamplan.js` umgebaut, und dieser
Vergleich misst ab sofort nichts mehr. Das muss auffallen. */
ok(!!treffer,
treffer ? `die oeffentliche Seite sendet um ${treffer[1]} Uhr`
: "FIX_STUNDE steht nicht mehr in assets/js/streamplan.js -- "
+ "dieser Vergleich kann nichts mehr messen");
ok(!!treffer && Number(treffer[1]) === SENDEZEIT_STUNDE,
`und der Treff rechnet mit derselben Stunde (${SENDEZEIT_STUNDE})`);
ok(SENDEZEIT_STUNDE >= 0 && SENDEZEIT_STUNDE <= 23,
`Gegenprobe: die Stunde ist ueberhaupt eine Uhrzeit (${SENDEZEIT_STUNDE})`);
}
/* =======================================================================
5. DIE VIER LAGEN -- IM ECHTEN BROWSER
======================================================================= */
melde("");
melde("=== 5. Was ein Mensch wirklich sieht ===");
{
let pw = null;
try {
pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
} catch { /* dritter Ausgang unten */ }
if (!pw) {
melde(" -- Playwright ist nicht da -- im Browser wurde NICHT nachgesehen.");
melde(" Das ist kein Befund. Die Abschnitte 1-4 gelten weiter.");
} else {
const browser = await pw.chromium.launch();
try {
const ctx = await browser.newContext({ viewport: { width: 412, height: 950 },
isMobile: true, hasTouch: true });
await ctx.addCookies(kGast.split("; ").filter(Boolean).map((z) => {
const [name, ...rest] = z.split("=");
return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" };
}));
const seite = await ctx.newPage();
const kaputt = [];
seite.on("pageerror", (e) => kaputt.push(String(e).slice(0, 140)));
/** Stellt die Antwort des Live-Dienstes her und laedt neu.
* `antwort === null` heisst: gar keine Antwort -- so verhaelt
* sich ein Ausfall, und genau dieser Fall wird sonst nie
* geprueft, weil man ihn nicht herbeifuehren kann, ohne ihn
* herbeizufuehren. */
async function lage(antwort, event = null) {
await seite.unrouteAll?.().catch(() => {});
await seite.route("**/postfach.dogfather-universe.com/**", async (weg) => {
const u = weg.request().url();
if (u.includes("/special-event")) {
await weg.fulfill({ status: 200, contentType: "application/json",
body: JSON.stringify({ ok: true, event }) });
return;
}
if (antwort === null) { await weg.abort("failed"); return; }
await weg.fulfill({ status: 200, contentType: "application/json",
body: JSON.stringify(antwort) });
});
await seite.goto(`http://127.0.0.1:${PORT}/workspace/unsere-seiten.html`,
{ waitUntil: "domcontentloaded" });
await seite.waitForTimeout(1200);
return seite.evaluate(() => ({
lage: document.getElementById("puls")?.dataset.lage,
satz: document.getElementById("puls-lage")?.textContent?.trim(),
zahl: document.getElementById("puls-zahl")?.textContent?.trim(),
klein: document.getElementById("puls-klein")?.textContent?.trim(),
knopfDa: !document.getElementById("puls-knopf")?.hidden,
eventDa: !document.getElementById("event")?.hidden,
eventZahl: document.getElementById("event-zahl")?.textContent?.trim(),
kanaele: [...document.querySelectorAll(".kanal")].map((a) => ({
handle: a.querySelector(".kanal__handle")?.textContent?.trim(),
ziel: a.getAttribute("href"),
})),
}));
}
/* ---- 5a. Er sendet ------------------------------------------ */
melde("");
melde(" --- Er sendet ---");
{
const s = await lage({ ok: true, live: true, source: "automatisch",
title: "Casper raeumt das Wohnzimmer aus", autoHealthy: true });
ok(s.lage === "live", `die Lage ist „live“ (${s.lage})`);
ok(/JETZT live/i.test(s.satz || ""), `und es steht dort „${s.satz}“`);
ok((s.zahl || "").includes("Casper"),
`der Titel des Streams steht da („${s.zahl}“)`);
ok(s.knopfDa === true, "und ein Weg zum Stream ist da");
}
/* ---- 5b. Er sendet nicht ------------------------------------ */
melde("");
melde(" --- Er sendet nicht ---");
{
const s = await lage({ ok: true, live: false, source: "automatisch",
title: null, autoHealthy: true });
ok(s.lage === "wartet", `die Lage ist „wartet“ (${s.lage})`);
ok(/^\d{2}:\d{2}:\d{2}$/.test(s.zahl || ""),
`ein Countdown laeuft („${s.zahl}“)`);
ok((s.klein || "").includes(`${SENDEZEIT_STUNDE}:00`),
`und er nennt den naechsten Termin („${s.klein}“)`);
}
/* ---- 5c. Der Pruefer ist gestoert --------------------------- */
melde("");
melde(" --- Der Live-Pruefer meldet eine Stoerung ---");
{
const s = await lage({ ok: true, live: false, source: "automatisch",
title: null, autoHealthy: false });
ok(s.lage === "unklar", `die Lage ist „unklar“ (${s.lage})`);
/* DIE EIGENTLICHE GEGENPROBE. Ohne sie waere die Zeile darueber
auch dann gruen, wenn dort "Gerade nicht live" stuende -- und
genau das ist der Fehler, um den es geht. */
ok(!/Gerade nicht live/i.test(s.satz || ""),
`es steht NICHT „nicht live“ da, sondern „${s.satz}“`);
ok(/^\d{2}:\d{2}:\d{2}$/.test(s.zahl || ""),
`der Countdown laeuft trotzdem weiter („${s.zahl}“) -- er braucht kein Netz`);
}
/* ---- 5d. Gar keine Antwort ---------------------------------- */
melde("");
melde(" --- Der Dienst antwortet gar nicht ---");
{
const s = await lage(null);
ok(s.lage === "unklar", `die Lage ist „unklar“ (${s.lage})`);
ok(!/Gerade nicht live/i.test(s.satz || ""),
`auch hier steht NICHT „nicht live“ da, sondern „${s.satz}“`);
ok(/TikTok/i.test(s.klein || ""),
`und es steht da, was man stattdessen tun kann („${s.klein}“)`);
ok(s.knopfDa === true, "der Weg zu TikTok bleibt offen");
/* Die Kanaele haengen NICHT am Live-Dienst -- sie kommen vom
eigenen Server. Faellt der eine aus, muss der andere
weiterhin dastehen. */
ok(s.kanaele.length === KANAELE.length,
`die ${s.kanaele.length} Kanaele stehen trotzdem da`);
const falsch = s.kanaele.filter((k, i) => k.handle !== KANAELE[i].handle);
ok(falsch.length === 0,
falsch.length ? `falsche Handles: ${falsch.map((k) => k.handle).join(", ")}`
: `mit den richtigen Handles (${s.kanaele.map((k) => k.handle).join(", ")})`);
}
/* ---- 5e. Das besondere Event -------------------------------- */
melde("");
melde(" --- Das besondere Event ---");
{
const ohne = await lage({ ok: true, live: false, source: "automatisch",
autoHealthy: true }, null);
ok(ohne.eventDa === false,
"ohne Event ist der Kasten nicht da (kein „nichts geplant“)");
const inZweiTagen = new Date(Date.now() + 2 * 86400000 + 3600000).toISOString();
const mit = await lage({ ok: true, live: false, source: "automatisch",
autoHealthy: true }, { titel: { de: "Die grosse Halloween-Nacht" },
zieldatum: inZweiTagen, link: "https://dogfather-universe.com/streamplan.html" });
ok(mit.eventDa === true, "mit Event ist er da");
ok(/noch 2 Tage/.test(mit.eventZahl || ""),
`und zaehlt in Tagen herunter („${mit.eventZahl}“)`);
}
ok(kaputt.length === 0,
kaputt.length ? `Fehler in der Browserkonsole: ${kaputt.join(" | ")}`
: "keine Fehler in der Browserkonsole");
} finally {
await browser.close();
}
}
}
/* ------------------------------------------------------------------- */
melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler ? "NICHT IN ORDNUNG" : "ALLES IN ORDNUNG");
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Aufraeumrest */ }
process.exit(fehler ? 1 : 0);
+75 -5
View File
@@ -128,7 +128,28 @@ const { bereicheFuer, TREFF_BRETTER } = await import("./workspace.js");
`ein Mitglied bekommt ${TREFF_BEREICHE?.length} Kacheln`);
const kachel = TREFF_BEREICHE.find((k) => k.ziel === "unsere-seiten.html");
ok(!!kachel, "sie steht in der Liste der Treff-Kacheln");
ok(kachel?.name === "Unsere Seiten", `sie heisst „${kachel?.name}“`);
/* DER NAME WIRD ABGELEITET, NICHT ABGESCHRIEBEN (21.09.2026).
Hier stand "Unsere Seiten" als Text. Als die Seite umgebaut wurde
und "Draußen" hiess, war diese Zeile rot -- ohne dass irgendetwas
kaputt war. Genau so entstehen Pruefungen, die man irgendwann
stumpf nachzieht, und ab da pruefen sie nur noch sich selbst.
Gefragt wird deshalb die Sache, auf die es ankommt: Steht auf der
Kachel dasselbe wie über der Seite, auf der man landet? Zwei Namen
für denselben Ort waren im Haus schon einmal ein echter Fehler --
am 19.09. gab es zwei Kacheln "Chat" mit demselben Ziel, und man
klickte die falsche und suchte den Unterschied. */
const seiteRoh = readFileSync(
new URL("../workspace/unsere-seiten.html", import.meta.url), "utf8");
const h1 = (seiteRoh.match(/<h1 class="titel">([\s\S]*?)<\/h1>/) || [])[1]?.trim();
ok(!!h1 && h1.length > 2, `die Seite trägt eine Überschrift („${h1 || "KEINE"}“)`);
ok(!!h1 && kachel?.name === h1,
`Kachel und Seite heißen gleich („${kachel?.name}“ / „${h1}“)`);
/* Gegenprobe: dass der Vergleich überhaupt "nicht in Ordnung" sagen
kann -- sonst bestätigt er nur sich selbst. */
ok(h1 !== "Ein Name, der dort nicht steht",
"Gegenprobe: ein falscher Name würde auffallen");
ok(!!kachel?.unter && kachel.unter.length > 5,
`und sagt, was dahinter steckt („${kachel?.unter}“)`);
@@ -159,10 +180,59 @@ const { bereicheFuer, TREFF_BRETTER } = await import("./workspace.js");
jeGruppe.get(x.gruppe).push(x);
}
const treffGruppe = jeGruppe.get("Community") || [];
const plaetze = treffGruppe.reduce((n, k) => n + (k.gross ? 2 : 1), 0);
ok(treffGruppe.length > 0 && plaetze % 3 === 0,
`die Community-Gruppe geht auf: ${treffGruppe.length} Kacheln = ${plaetze} Plaetze,`
+ ` ${plaetze / 3} volle Reihen`);
/* HIER STAND `plaetze % 3 === 0` -- UND DAS WAR DER FALSCHE MASSSTAB
(berichtigt 21.09.2026).
Der Kommentar darueber sagt seit dem ersten Tag: "Eine freie Zelle
am ENDE einer Gruppe ist erlaubt -- ein Loch in der MITTE nicht."
Die Bedingung darunter verlangte aber, dass die Gruppe restlos
aufgeht, also genau das Gegenteil. Ein Kommentar, der eine Absicht
beschreibt, erfuellt sie nicht.
Aufgefallen ist es, als die Community neun Kacheln hatte (10
Plaetze, weil "Der Treff" doppelt breit ist): Reihe 1 bis 3 voll,
in Reihe 4 steht "Regeln & Hilfe" allein. Das ist voellig in
Ordnung und sah trotzdem rot aus. Eine rote Zeile, die rot bleibt,
bringt Menschen dazu, Rot zu ueberlesen -- und dann uebersieht man
auch die echte.
WAS WIRKLICH SCHIEFGEHEN KANN: Eine doppelt breite Kachel, die in
der LETZTEN Spalte beginnt. Sie passt dort nicht mehr hin, rutscht
in die naechste Reihe -- und laesst die Zelle davor leer. DAS ist
das Loch in der Mitte. Gemessen wird deshalb der Umbruch, nicht
die Teilbarkeit. */
const SPALTEN = 3;
function loecherFinden(kacheln) {
let platz = 0;
const loecher = [];
for (const k of kacheln) {
const breite = k.gross ? 2 : 1;
if (breite === 2 && platz % SPALTEN === SPALTEN - 1) {
loecher.push(k.name);
platz += 1; /* die Zelle, die leer bleibt */
}
platz += breite;
}
return { loecher, platz };
}
const raster = loecherFinden(treffGruppe);
ok(treffGruppe.length > 0 && raster.loecher.length === 0,
raster.loecher.length
? `LUECKE IN DER MITTE vor: ${raster.loecher.join(", ")}`
: `die Community-Gruppe hat kein Loch: ${treffGruppe.length} Kacheln, `
+ `${raster.platz} Plaetze, letzte Reihe mit ${raster.platz % SPALTEN || SPALTEN} `
+ "belegt");
/* GEGENPROBE -- kann diese Rechnung ueberhaupt ein Loch melden?
Ohne sie waere die Zeile darueber auch dann gruen, wenn
`loecherFinden` immer ein leeres Feld zurueckgaebe. Genau so ist
die alte Fassung jahrelang falsch geblieben. */
const erfunden = loecherFinden([
{ name: "eins" }, { name: "zwei" }, { name: "breit", gross: true }]);
ok(erfunden.loecher.length === 1 && erfunden.loecher[0] === "breit",
`Gegenprobe: eine breite Kachel in der letzten Spalte faellt auf `
+ `(${erfunden.loecher.join(", ") || "NICHTS GEFUNDEN"})`);
ok(treffGruppe.findIndex((k) => k.gross) === 0,
"und die doppelt breite Kachel steht an erster Stelle");
+121
View File
@@ -0,0 +1,121 @@
/* =====================================================================
DRAUSSEN (21.09.2026) — was die Community-Seite "Unsere Seiten"
braucht, damit sie nichts abschreiben muss.
Filipe: "mach was anderes aus dieser seite oder mach es viel krass
und geiler ... lass dir was uebelst geiles einfallen und ueberrasch
mich ... erstell was was mich von den socken schmeisst. es soll
wirklich sogar ein wow effekt fuer die community ergeben."
---------------------------------------------------------------------
WAS DIESE SEITE VORHER WAR UND WAS DARAN FEHLTE
Zwei Karten mit zwei Adressen. Sauber gebaut, richtig beschriftet --
und trotzdem beantwortete sie keine Frage, die jemand wirklich hat.
Wer im Treff ist, kennt die Website. Der Rabattcode war das Einzige,
wofuer man wiederkam, und den merkt man sich beim ersten Mal.
DIE FRAGE, DIE DIE COMMUNITY WIRKLICH HAT, IST EINE ANDERE: Laeuft
er gerade? Und wenn nicht -- wie lange noch?
Auf die Antwort gibt es bereits einen Dienst im Haus:
postfach.dogfather-universe.com/live-status, derselbe, von dem der
oeffentliche Streamplan lebt. Er wird hier NICHT nachgebaut und auch
nicht durchgereicht -- der Browser fragt ihn direkt, so wie draussen
auch. Nachgemessen, bevor darauf gebaut wurde:
- der Dienst antwortet und meldet sich selbst als gesund
("autoHealthy": true, zuletzt geprueft vor drei Minuten)
- "access-control-allow-origin: *", die Treff-Adresse darf fragen
- die Inhaltsrichtlinie der Treff-Seiten fuehrt postfach bereits
in `connect-src` -- der Abruf waere sonst still blockiert worden
und haette ausgesehen wie ein toter Dienst
---------------------------------------------------------------------
WAS HIER BLEIBT: DIE KANAELE
Die drei TikTok-Accounts stehen als KANAELE in workspace.js -- sie
sind dort die eine Liste, an der die Aufgabenverteilung haengt. Die
Community-Seite bekommt sie von dort und schreibt sie NICHT ab.
Warum das keine Kleinigkeit ist: Am selben Tag stand in dieser Liste
"@hasidog00804" statt "@hasidog0804" -- eine Null zu viel. Zwei
Pruefungen hatten denselben Tippfehler abgeschrieben und waren
deshalb gruen. Eine dritte Abschrift auf einer Seite, die
Zuschauerinnen sehen, waere ein toter Link gewesen, den niemand
meldet, weil niemand weiss, dass er falsch ist.
DIE ADRESSE WIRD EBENFALLS ABGELEITET, nicht zusammengesetzt: Der
Steckbrief weiss bereits, wie eine TikTok-Adresse aus einem Handle
entsteht (KANAELE.tiktok.adresse). Stuende das Muster hier ein
zweites Mal, gaebe es zwei Stellen, die sich bei einer Aenderung
widersprechen koennen.
---------------------------------------------------------------------
WER DAS SEHEN DARF
Jede angemeldete Person. Nicht weil es egal waere, sondern weil hier
nichts steht, was nicht ohnehin oeffentlich ist: Dieselben drei
Accounts sind von dogfather-universe.com aus verlinkt, fuer alle.
Das ist BEWUSST ANDERS als `kanaeleFuer` in workspace-bereiche.js,
wo die Community die Kanalliste ausdruecklich NICHT bekommt. Dort
geht es um die Frage "wohin soll diese Arbeit" -- eine interne
Entscheidung, und wer sie nicht treffen darf, soll auch nicht die
Auswahl sehen. Hier geht es um "wo finde ich ihn". Dieselben Daten,
zwei verschiedene Fragen; deshalb zwei Wege und nicht einer, der
beides halb macht.
===================================================================== */
import express from "express";
import { sitzungLesen, KANAELE } from "./workspace.js";
import { KANAELE as KANAL_ARTEN } from "./workspace-steckbrief.js";
/* DIE FESTE SENDEZEIT.
Sie steht auch in assets/js/streamplan.js der oeffentlichen Seite
(`FIX_STUNDE`). Zwei Zahlen, die dasselbe bedeuten, laufen
irgendwann auseinander -- und es faellt niemandem auf, weil beide
fuer sich plausibel aussehen. Deshalb haelt pruef-draussen die
beiden Orte gegeneinander; verschiebt jemand den Termin und aendert
nur einen, wird die Pruefung rot und sagt, welche Datei fehlt.
WARUM SIE NICHT IN DER VERWALTUNG STEHT: Sie hat sich seit dem
20.08.2026 nicht geaendert. Eine Oberflaeche fuer eine Zahl, die man
einmal im Jahr anfasst, ist mehr Pflege als Nutzen -- und ein Feld,
das niemand benutzt, steht irgendwann falsch. Sobald sich der
Termin oefter bewegt, gehoert er dorthin.
Fuer eine ABWEICHUNG ist sie ohnehin nicht zustaendig: Sendet er
einmal frueher, sagt das der Live-Status, und der kommt vom Dienst,
nicht von dieser Zahl. */
export const SENDEZEIT_STUNDE = 20;
export const draussenRouter = express.Router();
draussenRouter.get("/workspace/api/draussen", (req, res) => {
const person = sitzungLesen(req);
if (!person) return res.status(401).json({ fehler: "nicht_angemeldet" });
try {
const kanaele = KANAELE.map((k) => {
const ohneAt = k.handle.replace(/^@/, "");
return {
wert: k.wert,
name: k.name,
handle: k.handle,
adresse: KANAL_ARTEN.tiktok.adresse(ohneAt),
satz: k.fuerDraussen || k.text,
};
});
/* KEIN ZWISCHENSPEICHER MIT LAUFZEIT. Die Liste aendert sich nur,
wenn jemand den Quelltext aendert -- dann startet der Dienst neu,
und ein Stempel waere ohnehin hinfaellig. Eine Laufzeit wuerde
hier nur eine Frage beantworten, die niemand stellt. */
res.json({ kanaele, sendeStunde: SENDEZEIT_STUNDE });
} catch (fehler) {
console.error("[workspace] Draussen:", fehler.message);
res.status(500).json({ fehler: "nicht_verfuegbar" });
}
});
+34 -4
View File
@@ -1173,7 +1173,21 @@ const TREFF_BEREICHE = [
zeichen: "content", ton: 30, ziel: "bereich.html?b=wunsch", szene: "portal" },
{ ...TREFF_GRUPPE, name: "Highlights", unter: "Eure Clips und Bilder",
zeichen: "live", ton: 29, ziel: "bereich.html?b=highlight", szene: "arena" },
{ ...TREFF_GRUPPE, name: "Unsere Seiten", unter: "Website, Shop & dein Rabatt",
/* HIESS BIS ZUM 21.09.2026 "Unsere Seiten" (Ziel und Datei bleiben
gleich, nur der Name auf der Kachel aendert sich).
Dahinter stehen jetzt drei Dinge statt zwei Adressen: ob gerade
gestreamt wird, wo man Dogi sonst findet, und die beiden Seiten mit
dem Rabatt. "Unsere Seiten" haette davon nur noch den letzten
Drittel benannt -- und wer wegen des Live-Status wiederkommt,
findet eine Kachel nicht, die nach etwas anderem klingt.
DER NAME STEHT AB JETZT NUR EINMAL IM HAUS: pruef-wege-nach-draussen
liest die Ueberschrift der Seite und verlangt, dass die Kachel
genauso heisst. Zwei Namen fuer dieselbe Sache waren schon einmal
ein echter Fehler (die zwei Kacheln "Chat" am 19.09.) -- man klickt
den falschen und sucht den Unterschied. */
{ ...TREFF_GRUPPE, name: "Draußen", unter: "Ist er live? Kanäle, Shop & dein Rabatt",
zeichen: "hinaus", ton: 38, ziel: "unsere-seiten.html", szene: "portal" },
{ ...TREFF_GRUPPE, name: "Mitmachen", unter: "Wie du dazugeh\u00f6ren kannst",
zeichen: "personen", ton: 32, ziel: "bereich.html?b=mitmachen", szene: "garage" },
@@ -1758,16 +1772,32 @@ export const MODI_STUFEN = [
haette dafuer einen falschen Kanal erzwungen -- und ein falscher
Eintrag ist schlechter als ein leerer.
===================================================================== */
/* ZWEI SAETZE JE KANAL, WEIL ES ZWEI LESERSCHAFTEN GIBT (21.09.2026).
`text` erklaert dem TEAM, wofuer der Kanal da ist -- es steht an
einer Aufgabe und beantwortet "wo soll das hin". `fuerDraussen`
steht auf der Community-Seite und beantwortet etwas anderes: "was
finde ich da". "Hier wird geschnitten, beschriftet und hochgeladen"
ist fuer die Zuschauerin keine Auskunft, sondern ein Blick in eine
fremde Werkstatt.
ES BLEIBT EINE LISTE. Der zweite Satz haengt am Kanal, nicht in
einer zweiten Aufzaehlung woanders -- sonst haette ein vierter
Account wieder zwei Orte, und einer davon wird vergessen. Genau so
ist am selben Tag "@hasidog00804" entstanden. */
export const KANAELE = [
{ wert: "dogfather", name: "DogFather", handle: "@dogfather0804",
text: "Der Hauptkanal. Die Livestreams und alles, was unmittelbar "
+ "daran hängt." },
+ "daran hängt.",
fuerDraussen: "Der Hauptkanal — hier laufen die Livestreams." },
{ wert: "hasidog", name: "HasiDog", handle: "@hasidog0804",
text: "Der zweite Account — eigene Zuschauer, eigener Ton. Was hier "
+ "läuft, ist nicht einfach dasselbe noch einmal." },
+ "läuft, ist nicht einfach dasselbe noch einmal.",
fuerDraussen: "Der zweite Account. Eigener Ton, eigene Leute." },
{ wert: "clips", name: "DogFather Clips", handle: "@dogis.modi.gang",
text: "Nur Ausschnitte. Hier wird geschnitten, beschriftet und "
+ "hochgeladen, nicht gesendet." },
+ "hochgeladen, nicht gesendet.",
fuerDraussen: "Die besten Ausschnitte zum Nachschauen." },
];
/** Zu welchem Kanal gehoert dieser TikTok-Name?
+4 -4
View File
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
<link rel="manifest" href="/workspace/crew.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -125,6 +125,6 @@
</main>
␍
<script src="assets/js/anruf-probe.js?v=202609211145" defer></script>
<script src="assets/js/anruf-probe.js?v=202609211206" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609211145",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609211206",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609211145",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609211206",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609211145",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609211206",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609211145",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609211206",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+370
View File
@@ -425,3 +425,373 @@
.aussen:hover,
.aussen:focus-within { transform: none; }
}
/* =====================================================================
DER PULS, DAS EVENT UND DIE KANAELE (21.09.2026)
Filipe wollte aus dieser Seite etwas machen, das "von den Socken
haut". Der Weg dahin war NICHT mehr Effekt, sondern eine Frage, die
vorher niemand beantwortet hat: Laeuft er gerade?
DESHALB LIEGT DER GANZE AUFWAND OBEN. Der Puls ist das Erste und
Groesste auf der Seite, und er ist das Einzige, was sich bewegt --
und zwar nur dann, wenn die Bewegung etwas bedeutet (er sendet).
Bewegung, die immer laeuft, ist Tapete; Bewegung, die genau einmal
im Tag anspringt, ist ein Signal.
AUGENSCHONEND WIE ALLES IM HAUS: Der Ton liegt im Verlauf, im Rand
und im Ring -- nie als leuchtende Flaeche hinter Text. Das Rot des
Live-Zustands ist ein gedecktes Korallrot (#e8736b), kein
Signalrot: Auf einem dunklen Bildschirm ist reines Rot nach zwei
Minuten unangenehm, und diese Seite soll man waehrend des Streams
offen lassen koennen.
`prefers-reduced-motion` schaltet jede Bewegung ab. Der Zustand
bleibt trotzdem erkennbar -- er steht in Farbe UND in Worten, nicht
nur im Puls. Eine Auskunft, die ausschliesslich an einer Animation
haengt, kommt bei einem Teil der Leute gar nicht an.
===================================================================== */
.puls {
position: relative;
isolation: isolate;
overflow: hidden;
display: flex;
align-items: center;
gap: 1.25rem;
margin: 1.5rem 0 0;
padding: 1.35rem 1.4rem;
border-radius: 1.1rem;
border: 1px solid color-mix(in srgb, var(--puls-ton) 42%, transparent);
background:
radial-gradient(120% 95% at 6% -5%,
color-mix(in srgb, var(--puls-ton) 26%, transparent), transparent 58%),
radial-gradient(90% 80% at 105% 110%,
color-mix(in srgb, var(--puls-ton) 15%, transparent), transparent 62%),
linear-gradient(158deg,
color-mix(in srgb, var(--puls-ton) 13%, #0c1420),
#090f1a 72%);
box-shadow:
0 18px 38px -20px color-mix(in srgb, var(--puls-ton) 85%, transparent),
inset 0 1px 0 color-mix(in srgb, var(--puls-ton) 22%, transparent);
transition: border-color .4s ease, box-shadow .4s ease;
}
/* DIE VIER LAGEN. Jede hat ihren Ton, und der Ton ist nie die einzige
Auskunft -- daneben steht immer ein Satz. Wer Farben nicht
unterscheidet, liest trotzdem, was los ist. */
.puls { --puls-ton: #7ec8f2; } /* laedt / wartet */
.puls[data-lage="live"] { --puls-ton: #e8736b; } /* er sendet */
.puls[data-lage="unklar"] { --puls-ton: #d9a441; } /* wir wissen es nicht */
/* Die Aura liegt UNTER allem und traegt die einzige Bewegung der
Seite. Sie ist nur im Live-Zustand sichtbar. */
.puls__aura {
position: absolute;
inset: -40%;
z-index: 0;
pointer-events: none;
opacity: 0;
background: radial-gradient(closest-side,
color-mix(in srgb, var(--puls-ton) 30%, transparent), transparent 70%);
transition: opacity .6s ease;
}
.puls[data-lage="live"] .puls__aura {
opacity: 1;
animation: puls-atmen 3.4s ease-in-out infinite;
}
/* 3,4 SEKUNDEN, NICHT EINE. Ein schneller Puls wirkt wie eine Warnung
und macht nervoes; dieser hier atmet ungefaehr im Ruhepuls eines
Menschen. Die Deckkraft schwankt zwischen 55 und 100 Prozent --
sichtbar, aber nicht blinkend. */
@keyframes puls-atmen {
0%, 100% { opacity: .55; transform: scale(1); }
50% { opacity: 1; transform: scale(1.06); }
}
.puls__ring-feld {
position: relative;
z-index: 1;
flex: 0 0 auto;
width: 5.6rem;
height: 5.6rem;
display: grid;
place-items: center;
}
.puls__ring {
width: 100%;
height: 100%;
/* Oben anfangen statt rechts -- so liest sich der Bogen wie eine
Uhr und nicht wie ein Tachometer. */
transform: rotate(-90deg);
}
.puls__ring-bahn {
fill: none;
stroke: color-mix(in srgb, var(--puls-ton) 18%, transparent);
stroke-width: 6;
}
.puls__ring-fortschritt {
fill: none;
stroke: var(--puls-ton);
stroke-width: 6;
stroke-linecap: round;
/* Der Umfang wird im Skript gesetzt -- aus dem Radius gerechnet,
damit eine Aenderung am SVG nicht hier nachgezogen werden muss. */
transition: stroke-dashoffset .6s ease;
}
.puls__punkt {
position: absolute;
width: .85rem;
height: .85rem;
border-radius: 50%;
background: var(--puls-ton);
opacity: .9;
}
.puls[data-lage="live"] .puls__punkt {
animation: puls-punkt 3.4s ease-in-out infinite;
}
@keyframes puls-punkt {
0%, 100% { transform: scale(1); opacity: .75; }
50% { transform: scale(1.35); opacity: 1; }
}
.puls__text {
position: relative;
z-index: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: .2rem;
}
.puls__marke {
margin: 0;
font-size: .78rem;
letter-spacing: .08em;
text-transform: uppercase;
color: color-mix(in srgb, var(--puls-ton) 70%, #cfe0f0);
}
.puls__lage {
margin: 0;
font-size: 1.05rem;
font-weight: 600;
color: #eaf3fb;
}
/* DIE ZAHL IST DAS GROESSTE AUF DER SEITE -- sie ist der Grund, warum
man wiederkommt. `tabular-nums` verhindert das Zappeln, das sonst
jede Sekunde entsteht, wenn eine 1 schmaler ist als eine 8. */
.puls__zahl {
margin: .1rem 0 0;
font-size: clamp(1.8rem, 6vw, 2.6rem);
font-weight: 700;
line-height: 1.1;
font-variant-numeric: tabular-nums;
letter-spacing: .01em;
color: #f4f9ff;
overflow-wrap: anywhere;
}
/* Im Live-Zustand steht dort der Titel des Streams, kein Countdown --
ein Satz in Countdown-Groesse wuerde umbrechen und die Karte
aufreissen. */
.puls[data-lage="live"] .puls__zahl {
font-size: clamp(1.1rem, 3.4vw, 1.45rem);
font-weight: 600;
}
.puls__klein {
margin: .25rem 0 0;
font-size: .82rem;
line-height: 1.45;
color: #9fb4c8;
}
.puls__knopf {
position: relative;
z-index: 1;
/* Rechts anschlagen, solange die Karte eine Zeile ist. Bricht sie um,
hebt `margin-left: 0` unten die Regel wieder auf. */
margin-left: auto;
flex: 0 0 auto;
/* 44 px ist die Grenze im Haus -- am Daumen, nicht an der Maus
gemessen. */
min-height: 44px;
display: inline-flex;
align-items: center;
padding: .55rem 1.05rem;
border-radius: .7rem;
border: 1px solid color-mix(in srgb, var(--puls-ton) 55%, transparent);
background: color-mix(in srgb, var(--puls-ton) 18%, transparent);
color: #f4f9ff;
font-weight: 600;
text-decoration: none;
transition: background .2s ease, border-color .2s ease, transform .2s ease;
}
.puls__knopf:hover {
background: color-mix(in srgb, var(--puls-ton) 28%, transparent);
border-color: color-mix(in srgb, var(--puls-ton) 75%, transparent);
}
.puls__knopf:focus-visible {
outline: 2px solid var(--puls-ton);
outline-offset: 2px;
}
/* AM HANDY UNTEREINANDER. Keine Schwelle in Pixeln, sondern die
Frage, ob der Text neben dem Ring noch lesbar ist: Unter 34rem
bleiben fuer ihn weniger als 20 Zeichen je Zeile. */
@media (max-width: 34rem) {
.puls { flex-direction: column; align-items: flex-start; gap: .9rem; }
.puls__ring-feld { width: 4.6rem; height: 4.6rem; }
/* In einer Spalte gibt es kein "rechts" -- der Knopf stellt sich
unter den Text und nimmt die volle Breite, damit er am Daumen
nicht gesucht werden muss. */
.puls__knopf { margin-left: 0; width: 100%; justify-content: center; }
}
/* Der Textblock nimmt den Platz, der zwischen Ring und Knopf uebrig
bleibt -- sonst draengt sich alles links zusammen. */
.puls__text { flex: 1 1 auto; }
/* ---- DAS BESONDERE EVENT ------------------------------------------- */
.event {
position: relative;
display: flex;
align-items: center;
gap: 1rem;
margin: .9rem 0 0;
padding: 1rem 1.2rem;
border-radius: 1rem;
--event-ton: #d49ae8;
border: 1px solid color-mix(in srgb, var(--event-ton) 45%, transparent);
background: linear-gradient(152deg,
color-mix(in srgb, var(--event-ton) 16%, #0c1420), #090f1a 78%);
}
.event[hidden] { display: none; }
.event__zeichen {
flex: 0 0 auto;
font-size: 1.5rem;
color: var(--event-ton);
line-height: 1;
}
.event__text { min-width: 0; }
.event__marke {
margin: 0;
font-size: .74rem;
letter-spacing: .08em;
text-transform: uppercase;
color: color-mix(in srgb, var(--event-ton) 75%, #cfe0f0);
}
.event__titel {
margin: .15rem 0 0;
font-size: 1.05rem;
font-weight: 600;
color: #eaf3fb;
}
.event__zahl {
margin: .2rem 0 0;
font-variant-numeric: tabular-nums;
font-size: .92rem;
color: #b9c9da;
}
.event[data-jetzt="ja"] .event__zahl {
color: #f4f9ff;
font-weight: 700;
}
.event__knopf {
margin-left: auto;
min-height: 44px;
display: inline-flex;
align-items: center;
padding: .5rem 1rem;
border-radius: .7rem;
border: 1px solid color-mix(in srgb, var(--event-ton) 55%, transparent);
background: color-mix(in srgb, var(--event-ton) 16%, transparent);
color: #f4f9ff;
text-decoration: none;
font-weight: 600;
}
.event__knopf:focus-visible { outline: 2px solid var(--event-ton); outline-offset: 2px; }
@media (max-width: 34rem) {
.event { flex-wrap: wrap; }
.event__knopf { margin-left: 0; width: 100%; justify-content: center; }
}
/* ---- DIE KANAELE ---------------------------------------------------- */
.kanaele { margin: 1.6rem 0 0; }
.kanaele[hidden] { display: none; }
.kanaele__titel,
.seiten-titel {
margin: 0 0 .7rem;
font-size: 1.05rem;
font-weight: 600;
color: #cfe0f0;
}
.seiten-titel { margin-top: 1.8rem; }
.kanaele__reihe {
display: grid;
gap: .8rem;
/* Dieselbe Regel wie beim Kartengitter darunter: eine Regel statt
einer Zahl. Ein vierter Kanal ordnet sich von selbst ein. */
grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
}
.kanal {
--kanal-ton: #7ec8f2;
display: flex;
flex-direction: column;
gap: .15rem;
padding: .85rem 1rem;
border-radius: .9rem;
border: 1px solid color-mix(in srgb, var(--kanal-ton) 30%, transparent);
background: linear-gradient(150deg,
color-mix(in srgb, var(--kanal-ton) 11%, #0c1420), #090f1a 80%);
text-decoration: none;
transition: transform .2s ease, border-color .2s ease, background .2s ease;
}
.kanal:hover {
transform: translateY(-2px);
border-color: color-mix(in srgb, var(--kanal-ton) 58%, transparent);
}
.kanal:focus-visible { outline: 2px solid var(--kanal-ton); outline-offset: 2px; }
.kanal__name { font-weight: 600; color: #eaf3fb; }
.kanal__handle {
font-size: .85rem;
color: color-mix(in srgb, var(--kanal-ton) 78%, #cfe0f0);
overflow-wrap: anywhere;
}
.kanal__satz { margin-top: .2rem; font-size: .84rem; line-height: 1.45; color: #9fb4c8; }
.kanaele__fehler {
margin: 0;
padding: .8rem 1rem;
border-radius: .8rem;
border: 1px solid rgba(217, 164, 65, .35);
background: rgba(217, 164, 65, .08);
font-size: .88rem;
line-height: 1.5;
color: #d8c49a;
}
.kanaele__fehler[hidden] { display: none; }
/* ---- WER BEWEGUNG NICHT MOECHTE ------------------------------------- */
/* Der Zustand bleibt vollstaendig lesbar: Farbe, Ring und Text stehen
weiter da. Es hoert nur das Atmen auf. */
@media (prefers-reduced-motion: reduce) {
.puls[data-lage="live"] .puls__aura,
.puls[data-lage="live"] .puls__punkt { animation: none; }
.puls__ring-fortschritt { transition: none; }
.kanal { transition: none; }
.kanal:hover { transform: none; }
}
+294
View File
@@ -141,4 +141,298 @@
}, 4000);
});
}
/* ==================================================================
3. DER PULS -- laeuft er gerade? (21.09.2026)
==================================================================
Die Auskunft kommt von postfach.dogfather-universe.com/live-status,
demselben Dienst, von dem der oeffentliche Streamplan lebt. Er wird
direkt vom Browser gefragt; nachgemessen vor dem Bauen:
"access-control-allow-origin: *", und `connect-src` der
Treff-Seiten fuehrt postfach bereits -- sonst haette die
Inhaltsrichtlinie den Abruf still abgewiesen, und das haette
ausgesehen wie ein toter Dienst.
------------------------------------------------------------------
DREI AUSGAENGE, NICHT ZWEI -- UND DAS IST HIER KEINE FEINHEIT
`streamplan.js` macht an derselben Stelle etwas anderes: Sein
`.catch()` setzt `istLive = false` und zeigt den Countdown. Aus
"wir konnten nicht fragen" wird damit "er sendet nicht". Das ist
genau der Fehler, den das Haus seit dem 03.09. kennt -- eine
Pruefung ohne dritten Ausgang -- nur hier mit einer Folge, die
jemand merkt: Wer die Seite waehrend einer Stoerung aufmacht,
verpasst den Stream, weil eine Anzeige so getan hat, als haette
sie nachgesehen.
Der Dienst SAGT sogar, ob er nachsehen konnte: `autoHealthy` steht
in derselben Antwort und wird draussen nicht gelesen. Hier schon.
In der Lage "unklar" laeuft der Countdown trotzdem weiter -- er
braucht kein Netz. Eine Stoerung nimmt der Seite nur die eine
Auskunft, die wirklich an ihr haengt. */
const POSTFACH = 'https://postfach.dogfather-universe.com';
const puls = document.getElementById('puls');
if (puls) {
const eLage = document.getElementById('puls-lage');
const eZahl = document.getElementById('puls-zahl');
const eKlein = document.getElementById('puls-klein');
const eKnopf = document.getElementById('puls-knopf');
const eBogen = document.getElementById('puls-bogen');
/* DIE SENDEZEIT KOMMT VOM SERVER, DAMIT ES SIE NUR EINMAL GIBT.
Sie steht auch in assets/js/streamplan.js der oeffentlichen
Seite; zwei Zahlen, die dasselbe bedeuten, laufen irgendwann
auseinander. Bis die Antwort da ist, gilt derselbe Wert --
sonst stuende beim Laden gar nichts. Eine Pruefung haelt beide
Orte gegeneinander. */
let sendeStunde = 20;
let lage = 'laedt';
let uhrLaeuft = 0;
/* Der Ring: Umfang aus dem Radius gerechnet, nicht abgemessen.
Wird r im HTML geaendert, stimmt er weiter. */
const UMFANG = 2 * Math.PI * Number(eBogen.getAttribute('r') || 52);
eBogen.style.strokeDasharray = String(UMFANG);
const zwei = (n) => String(n).padStart(2, '0');
function naechsteSendezeit() {
const jetzt = new Date();
const ziel = new Date(jetzt);
ziel.setHours(sendeStunde, 0, 0, 0);
if (ziel <= jetzt) ziel.setDate(ziel.getDate() + 1);
return ziel;
}
function countdownZeichnen() {
const restMs = Math.max(0, naechsteSendezeit() - new Date());
const sek = Math.floor(restMs / 1000);
eZahl.textContent =
zwei(Math.floor(sek / 3600)) + ':'
+ zwei(Math.floor((sek % 3600) / 60)) + ':'
+ zwei(sek % 60);
/* Voll = gleich. Der Ring sagt dasselbe wie die Zahl, nur ohne
Lesen -- fuer den Blick im Vorbeigehen. */
const anteil = 1 - restMs / 86400000;
eBogen.style.strokeDashoffset = String(UMFANG * (1 - anteil));
}
/* Die Sekundenuhr laeuft NUR, solange jemand hinsieht. Ein
Zeitgeber, der im Hintergrund weiterlaeuft, kostet auf dem Handy
Akku, ohne etwas anzuzeigen. */
function uhrAn() {
if (uhrLaeuft || lage === 'live') return;
countdownZeichnen();
uhrLaeuft = setInterval(countdownZeichnen, 1000);
}
function uhrAus() {
if (!uhrLaeuft) return;
clearInterval(uhrLaeuft);
uhrLaeuft = 0;
}
function setzeLage(neueLage, titel) {
lage = neueLage;
puls.dataset.lage = neueLage;
if (neueLage === 'live') {
uhrAus();
eLage.textContent = 'Er ist JETZT live';
eZahl.textContent = titel || 'Der Stream läuft';
eKlein.textContent = 'Läuft gerade auf TikTok.';
eKnopf.hidden = false;
eKnopf.textContent = 'Jetzt zuschauen →';
eBogen.style.strokeDashoffset = '0';
return;
}
eKnopf.hidden = true;
if (neueLage === 'wartet') {
eLage.textContent = 'Gerade nicht live';
eKlein.textContent = 'Der nächste feste Termin ist '
+ sendeStunde + ':00 Uhr — in deiner Ortszeit.';
} else if (neueLage === 'unklar') {
/* DER SATZ SAGT, WAS ER WEISS, UND WAS NICHT. "Nicht live"
waere hier eine Behauptung, die niemand geprueft hat. */
eLage.textContent = 'Konnten wir gerade nicht nachsehen';
eKlein.textContent = 'Der Live-Dienst antwortet nicht. Das heißt NICHT, '
+ 'dass kein Stream läuft — schau im Zweifel direkt auf TikTok.';
eKnopf.hidden = false;
eKnopf.textContent = 'Auf TikTok nachsehen →';
} else {
eLage.textContent = 'Wir sehen gerade nach …';
eKlein.textContent = 'Alle Zeiten in deiner Ortszeit.';
}
uhrAn();
}
async function lageHolen() {
try {
const antwort = await fetch(POSTFACH + '/live-status', { cache: 'no-store' });
if (!antwort.ok) throw new Error('HTTP ' + antwort.status);
const d = await antwort.json();
if (!d || d.ok !== true) throw new Error('keine Auskunft');
if (d.live) { setzeLage('live', d.title); return; }
/* HIER STEHT DER UNTERSCHIED ZUR OEFFENTLICHEN SEITE. Der
Dienst schaut automatisch nach; klappt das gerade nicht,
sagt er es selbst. Ein "live: false" aus einem gestoerten
Pruefer ist keine Aussage ueber den Stream, sondern eine
ueber den Pruefer.
Nur wenn die Quelle "automatisch" ist -- hat jemand den
Status von Hand gesetzt, gilt der, und die Gesundheit des
automatischen Pruefers spielt keine Rolle. */
if (d.source === 'automatisch' && d.autoHealthy === false) {
setzeLage('unklar');
return;
}
setzeLage('wartet');
} catch {
setzeLage('unklar');
}
}
setzeLage('laedt');
lageHolen();
setInterval(lageHolen, 30000);
document.addEventListener('visibilitychange', () => {
if (document.hidden) { uhrAus(); return; }
uhrAn();
lageHolen();
});
/* ---- DAS BESONDERE EVENT -------------------------------------- */
const eventKasten = document.getElementById('event');
if (eventKasten) {
const evTitel = document.getElementById('event-titel');
const evZahl = document.getElementById('event-zahl');
const evKnopf = document.getElementById('event-knopf');
let evZiel = null;
let evUhr = 0;
const evZeichnen = () => {
if (!evZiel) return;
const restMs = evZiel - new Date();
if (restMs <= 0) {
evZahl.textContent = 'Es geht los!';
eventKasten.dataset.jetzt = 'ja';
clearInterval(evUhr);
evUhr = 0;
return;
}
const sek = Math.floor(restMs / 1000);
const tage = Math.floor(sek / 86400);
const rest = zwei(Math.floor((sek % 86400) / 3600)) + ':'
+ zwei(Math.floor((sek % 3600) / 60)) + ':' + zwei(sek % 60);
evZahl.textContent = tage > 0
? 'noch ' + tage + ' Tage · ' + rest
: 'noch ' + rest;
};
const eventHolen = async () => {
try {
const antwort = await fetch(POSTFACH + '/special-event', { cache: 'no-store' });
if (!antwort.ok) throw new Error('HTTP ' + antwort.status);
const d = await antwort.json();
const e = d && d.ok ? d.event : null;
if (evUhr) { clearInterval(evUhr); evUhr = 0; }
if (!e || !e.zieldatum) { eventKasten.hidden = true; evZiel = null; return; }
evZiel = new Date(e.zieldatum);
if (Number.isNaN(evZiel.getTime())) {
eventKasten.hidden = true; evZiel = null; return;
}
/* Der Titel kommt mehrsprachig; auf dieser Seite wird
deutsch gesprochen. `textContent`, nicht `innerHTML` --
der Text stammt aus der Verwaltung und ist damit
Eingabe, auch wenn sie aus dem eigenen Haus kommt. */
evTitel.textContent =
(e.titel && (e.titel.de || e.titel)) || 'Besonderes Event';
eventKasten.hidden = false;
delete eventKasten.dataset.jetzt;
evZeichnen();
evUhr = setInterval(evZeichnen, 1000);
if (e.link) { evKnopf.href = e.link; evKnopf.hidden = false; }
else evKnopf.hidden = true;
} catch {
/* HIER IST VERSTECKEN RICHTIG -- anders als beim Puls oben.
Der Puls beantwortet die Frage, wegen der man die Seite
oeffnet; schweigt er, muss das dastehen. Ein besonderes
Event gibt es an den meisten Tagen gar nicht. "Wir
konnten nicht nachsehen, ob es ein Event gibt, das es
vermutlich nicht gibt" ist keine Auskunft, sondern
Rauschen -- und Rauschen bringt Menschen dazu, auch die
echten Hinweise zu ueberlesen. */
eventKasten.hidden = true;
}
};
eventHolen();
setInterval(eventHolen, 60000);
}
/* ---- DIE KANAELE ---------------------------------------------- */
const kanaeleKasten = document.getElementById('kanaele');
if (kanaeleKasten) {
const reihe = document.getElementById('kanaele-reihe');
const fehlerText = document.getElementById('kanaele-fehler');
(async () => {
try {
const antwort = await fetch('/workspace/api/draussen',
{ credentials: 'same-origin' });
if (!antwort.ok) throw new Error('HTTP ' + antwort.status);
const d = await antwort.json();
const liste = Array.isArray(d.kanaele) ? d.kanaele : [];
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Eine leere Antwort
wuerde sonst eine leere Reihe ergeben, die aussieht, als
gaebe es keine Kanaele -- statt zu sagen, dass etwas
schiefging. */
if (!liste.length) throw new Error('leere Liste');
if (Number.isFinite(d.sendeStunde)) {
sendeStunde = d.sendeStunde;
if (lage !== 'live') setzeLage(lage);
}
for (const k of liste) {
const a = document.createElement('a');
a.className = 'kanal';
a.href = k.adresse;
a.target = '_blank';
a.rel = 'noopener noreferrer';
const name = document.createElement('span');
name.className = 'kanal__name';
name.textContent = k.name;
const handle = document.createElement('span');
handle.className = 'kanal__handle';
handle.textContent = k.handle;
const satz = document.createElement('span');
satz.className = 'kanal__satz';
satz.textContent = k.satz || '';
a.append(name, handle, satz);
reihe.append(a);
}
kanaeleKasten.hidden = false;
} catch {
fehlerText.hidden = false;
kanaeleKasten.hidden = false;
}
})();
}
}
})();
+15 -15
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -291,14 +291,14 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/aufgaben.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/aufgaben.js?v=202609211206" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -168,13 +168,13 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/automation.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/automation.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -160,13 +160,13 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/befinden.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/befinden.js?v=202609211206" defer></script>
</body>
</html>
+19 -19
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211206" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -277,16 +277,16 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/checkliste.js?v=202609211145" defer></script>
<script src="assets/js/ampel.js?v=202609211145" defer></script>
<script src="assets/js/schulung.js?v=202609211145" defer></script>
<script src="assets/js/bereich.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/checkliste.js?v=202609211206" defer></script>
<script src="assets/js/ampel.js?v=202609211206" defer></script>
<script src="assets/js/schulung.js?v=202609211206" defer></script>
<script src="assets/js/bereich.js?v=202609211206" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -108,12 +108,12 @@
</main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/auskunft.js?v=202609211145" defer></script>
<script src="assets/js/bewerben.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/auskunft.js?v=202609211206" defer></script>
<script src="assets/js/bewerben.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -80,13 +80,13 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/auskunft.js?v=202609211145" defer></script>
<script src="assets/js/bewerbungen.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/auskunft.js?v=202609211206" defer></script>
<script src="assets/js/bewerbungen.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -89,14 +89,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/ki.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/calls.js?v=202609211145" defer></script>
<script src="assets/js/ki.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/calls.js?v=202609211206" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -414,18 +414,18 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609211145"></script>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145"></script>
<script src="assets/js/glocke.js?v=202609211145"></script>
<script src="assets/js/bereiche.js?v=202609211206"></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206"></script>
<script src="assets/js/glocke.js?v=202609211206"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609211145"></script>
<script src="assets/js/chat.js?v=202609211145"></script>
<script src="assets/js/anruf.js?v=202609211206"></script>
<script src="assets/js/chat.js?v=202609211206"></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/content.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/content.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -179,14 +179,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/checkliste.js?v=202609211145" defer></script>
<script src="assets/js/content.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/checkliste.js?v=202609211206" defer></script>
<script src="assets/js/content.js?v=202609211206" defer></script>
</body>
</html>
+5 -5
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609211206" />
</head>
<body class="gate gate--crew">
@@ -358,6 +358,6 @@
␍
<script src="assets/js/gate.js?v=202609211145" defer></script>
<script src="assets/js/gate.js?v=202609211206" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609211145",
"src": "/assets/img/app-symbole/crew-192.png?v=202609211206",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609211145",
"src": "/assets/img/app-symbole/crew-512.png?v=202609211206",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609211145",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609211206",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609211145",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609211206",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -108,14 +108,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/dateien.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/dateien.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -106,12 +106,12 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/entwicklung.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/entwicklung.js?v=202609211206" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -146,12 +146,12 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/hilfe.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/hilfe.js?v=202609211206" defer></script>
</body>
</html>
+4 -4
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
</head>
<body class="gate">
@@ -411,6 +411,6 @@
</div>
␍␍
<script src="assets/js/gate.js?v=202609211145" defer></script>
<script src="assets/js/gate.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -383,14 +383,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/kalender.js?v=202609211145" defer></script>
<script src="assets/js/kalender-abo.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/kalender.js?v=202609211206" defer></script>
<script src="assets/js/kalender-abo.js?v=202609211206" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -444,12 +444,12 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609211145"></script>
<script src="assets/js/nachfrage.js?v=202609211145"></script>
<script src="assets/js/wahl.js?v=202609211145"></script>
<script src="assets/js/bereiche.js?v=202609211145"></script>
<script src="assets/js/kopf.js?v=202609211145"></script>
<script src="assets/js/glocke.js?v=202609211145"></script>
<script src="assets/js/leistung.js?v=202609211145"></script>
<script src="assets/js/meldung.js?v=202609211206"></script>
<script src="assets/js/nachfrage.js?v=202609211206"></script>
<script src="assets/js/wahl.js?v=202609211206"></script>
<script src="assets/js/bereiche.js?v=202609211206"></script>
<script src="assets/js/kopf.js?v=202609211206"></script>
<script src="assets/js/glocke.js?v=202609211206"></script>
<script src="assets/js/leistung.js?v=202609211206"></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -453,13 +453,13 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/personen.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/personen.js?v=202609211206" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -214,15 +214,15 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/steckbrief.js?v=202609211145" defer></script>
<script src="assets/js/profil.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/steckbrief.js?v=202609211206" defer></script>
<script src="assets/js/profil.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -134,11 +134,11 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/rechte.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/rechte.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/report.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/report.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -106,14 +106,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/ki.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/report.js?v=202609211145" defer></script>
<script src="assets/js/ki.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/report.js?v=202609211206" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -173,13 +173,13 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/scouting.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/scouting.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -678,13 +678,13 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/start.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/start.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -85,14 +85,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/ki.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/startcheck.js?v=202609211145" defer></script>
<script src="assets/js/ki.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/startcheck.js?v=202609211206" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -150,15 +150,15 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/auskunft.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/steckbrief.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/auskunft.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/steckbrief.js?v=202609211206" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211206" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -111,12 +111,12 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/talente.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/talente.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/team.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/team.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -110,12 +110,12 @@
</main>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/team.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/team.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/team.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/team.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,11 +84,11 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/teamlage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/teamlage.js?v=202609211206" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -112,12 +112,12 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/teilen.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/teilen.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -126,12 +126,12 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/treff-moderation.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/treff-moderation.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -221,11 +221,11 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/auskunft.js?v=202609211145" defer></script>
<script src="assets/js/treff-regeln.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/auskunft.js?v=202609211206" defer></script>
<script src="assets/js/treff-regeln.js?v=202609211206" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -149,14 +149,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/uebersicht.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/uebersicht.js?v=202609211206" defer></script>
</body>
</html>
+345 -227
View File
@@ -1,227 +1,345 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Unsere Seiten · Der Treff</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=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
</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">Der&nbsp;Treff</a> · Unsere Seiten</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<main class="inhalt inhalt--breit">
<section class="kopf-zeile">
<div>
<p class="marke">Der Treff · Unsere Seiten</p>
<h1 class="titel">Unsere Seiten</h1>
<p class="unterzeile">
Was es außerhalb vom Treff noch gibt — und wo dein Rabatt wartet.
</p>
</div>
</section>
<!-- ==================================================================
WARUM DIESE SEITE EXISTIERT (19.09.2026)
Filipe: "ich brauch im community bereich noch eine kachel, die
wenn man drauf drückt dan kacheln hat die auf die website von
dogfather universe geht ... und die shop site von vanvan."
ZWEI GRUENDE, WARUM DAS EINE EIGENE SEITE IST und nicht zwei
Kacheln direkt in der Uebersicht:
1. Die sieben Kacheln im Treff fuehren alle NACH INNEN -- auf
ein Brett, auf dem man liest und schreibt. Zwei Kacheln
dazwischen, die den Browser verlassen, waeren ein Bruch: Man
tippt auf etwas, das aussieht wie ein Brett, und ist
ploetzlich woanders. Eine eigene Seite sagt vorher, was
passiert.
2. Ein Rabattcode braucht Platz. Er muss gross, kopierbar und
mit seinen Bedingungen dastehen -- sonst wird er falsch
erinnert und jemand steht enttaeuscht an der Kasse.
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
an Community, Zuschauer, Freunde etc." -- und mit
"giltAufSale": false. Genau deshalb steht der Satz zu den
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
er Umsatz bringt.
Der zweite Code in derselben Datei ist als "Nur fuer Filipe
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
Seite.
============================================================== -->
<div class="seiten-gitter">
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
Filipe: "die sollen paar mal sein in der kacheln und so wie
schweben, sich ganz leicht bewegen."
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
gleich waere ein Muster, und ein Muster sieht nach Tapete
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
etwas ablenkt.
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
Logo in jede Kachel, egal welchen Ton sie hat.
`aria-hidden`, weil sie nichts sagen -- wer die Seite
vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<circle cx="12" cy="12" r="8.4" />
<path d="M3.6 12h16.8M12 3.6c2.4 2.5 2.4 13.9 0 16.8M12 3.6c-2.4 2.5-2.4 13.9 0 16.8" />
</svg>
</span>
<div>
<p class="aussen__marke">Die Website</p>
<h2 class="aussen__titel">DogFather&nbsp;Universe</h2>
</div>
</div>
<p class="aussen__satz">
Die Heimat von DogFather als Streamer, der HasiDog-Community
und seiner Arbeit als Manager bei Spicy Media.
</p>
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
Die Punkte stammen aus der Navigation von
dogfather-universe.com (streamplan.html, hasidog.html,
zeitreise.html, stimmen.html). Eine erfundene Aufzählung
wäre beim ersten Klick als Lüge aufgeflogen.
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
Startseite; einzelne Links darin würden diesen Klick
zerschneiden und wären auf dem Handy außerdem zu kleine
Ziele. -->
<ul class="aussen__liste">
<li>Der Streamplan – wann was läuft</li>
<li>HasiDog: die Community rund um Dogi</li>
<li>Die Zeitreise durch alles Bisherige</li>
<li>Stimmen von Leuten, die dabei waren</li>
</ul>
<p class="aussen__weg">
<span class="aussen__adresse">dogfather-universe.com</span>
<a class="aussen__knopf" href="https://dogfather-universe.com/"
target="_blank" rel="noopener noreferrer">Seite öffnen&nbsp;→</a>
</p>
</article>
<!-- ---- VANVANS SHOP ------------------------------------------ -->
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<path d="M5 8h14l-1.1 11.2a1.4 1.4 0 0 1-1.4 1.3H7.5a1.4 1.4 0 0 1-1.4-1.3z" />
<path d="M9 8V6.4a3 3 0 0 1 6 0V8" />
</svg>
</span>
<div>
<p class="aussen__marke">Der Shop</p>
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
(og:site_name und meta description). Meine erste Fassung
hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
Anhänger, Werkzeug" — beides ausgedacht und beides
falsch. Der Laden heißt mit „&", und er verkauft vor
allem Handgemachtes. -->
<h2 class="aussen__titel">Van's&nbsp;DIY &amp; Bastelbedarf</h2>
</div>
</div>
<p class="aussen__satz">
VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
Schmuck und Bastelzubehör.
</p>
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
dieser Karte ist -- und kopierbar, weil niemand einen Code
abtippen soll, den er sich vorher merken muss. -->
<div class="gutschein">
<p class="gutschein__zeile">
<span class="gutschein__prozent">10&nbsp;%</span>
<span class="gutschein__wofuer">für alle aus der Community</span>
</p>
<button type="button" class="gutschein__code" id="code-knopf"
data-code="DOGI10"
aria-label="Rabattcode DOGI10 kopieren">
<span class="gutschein__wort">DOGI10</span>
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
</button>
<p class="gutschein__klein">
Beim Bestellen im Feld für den Gutscheincode eintragen.
Gilt nicht auf bereits reduzierte Artikel.
</p>
</div>
<p class="aussen__weg">
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
target="_blank" rel="noopener noreferrer">Shop öffnen&nbsp;→</a>
</p>
</article>
</div>
<p class="seiten-fuss">
Beide Seiten öffnen sich in einem neuen Fenster — der Treff bleibt
also offen.
</p>
</main>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609211145" defer></script>
</body>
</html>
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Draußen · Der Treff</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=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</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">Der&nbsp;Treff</a> · Draußen</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<main class="inhalt inhalt--breit">
<section class="kopf-zeile">
<div>
<p class="marke">Der Treff · Draußen</p>
<h1 class="titel">Draußen</h1>
<p class="unterzeile">
Ob gerade gestreamt wird, wo du Dogi sonst findest — und wo dein
Rabatt wartet.
</p>
</div>
</section>
<!-- ==================================================================
WARUM DIESE SEITE AM 21.09.2026 UMGEBAUT WURDE
Filipe: "mach was anderes aus dieser seite oder mach es viel
krass und geiler, den wir haben ja jetzt den treff chat also ist
das schon fast unnoetig ... erstell was was mich von den socken
schmeisst. es soll wirklich sogar ein wow effekt fuer die
community ergeben." Dazu die eine Auflage: die Kachel bleibt.
WAS SIE VORHER WAR: zwei Karten mit zwei Adressen. Sauber
gebaut -- und trotzdem kam niemand ein zweites Mal wieder. Wer im
Treff ist, kennt die Website. Den Rabattcode merkt man sich beim
ersten Mal.
DIE FRAGE, DIE WIRKLICH JEMAND HAT, IST EINE ANDERE: Laeuft er
gerade? Und wenn nicht -- wie lange noch? Darauf gab es im Treff
bisher keine Antwort, obwohl das Haus sie seit dem 20.08. kennt:
postfach.dogfather-universe.com/live-status, derselbe Dienst, von
dem der oeffentliche Streamplan lebt.
DER PULS OBEN IST DESHALB KEIN SCHMUCK. Er ist der Grund, diese
Seite zu oeffnen -- und der Grund, morgen wiederzukommen.
============================================================== -->
<!-- ==================================================================
DER PULS
DREI LAGEN, NICHT ZWEI. Ein Ampelbauteil kennt ueblicherweise
"live" und "nicht live". Das ist eine Luege, sobald der Dienst
nicht erreichbar ist: Dann steht dort "nicht live", obwohl
niemand nachgesehen hat, und jemand verpasst einen Stream, weil
eine Seite so getan hat, als wuesste sie es.
Deshalb `data-lage` mit vier Werten:
laedt -- wir fragen gerade
live -- er sendet, mit Titel und Weg hin
wartet -- er sendet nicht, mit Countdown
unklar -- wir konnten nicht nachsehen, und sagen das
In "unklar" laeuft der Countdown WEITER. Er braucht kein Netz --
die naechste 20-Uhr-Marke ergibt sich aus der Uhr des Geraets.
Eine Stoerung beim Live-Dienst nimmt der Seite also nur die eine
Auskunft, die wirklich von ihm abhaengt, nicht den Rest.
Der Ring fuellt sich ueber den ganzen Tag bis zur naechsten
Sendezeit. Er zeigt damit dasselbe wie die Zahl, aber ohne Lesen:
Ein fast voller Ring heisst "gleich".
============================================================== -->
<section class="puls" id="puls" data-lage="laedt" aria-live="polite">
<div class="puls__aura" aria-hidden="true"></div>
<div class="puls__ring-feld">
<svg class="puls__ring" viewBox="0 0 120 120" aria-hidden="true">
<circle class="puls__ring-bahn" cx="60" cy="60" r="52" />
<circle class="puls__ring-fortschritt" id="puls-bogen" cx="60" cy="60" r="52" />
</svg>
<span class="puls__punkt" aria-hidden="true"></span>
</div>
<div class="puls__text">
<p class="puls__marke" id="puls-marke">DogFather auf TikTok</p>
<p class="puls__lage" id="puls-lage">Wir sehen gerade nach …</p>
<p class="puls__zahl" id="puls-zahl">–:–:–</p>
<p class="puls__klein" id="puls-klein">Alle Zeiten in deiner Ortszeit.</p>
</div>
<!-- DER KNOPF STEHT NEBEN DEM TEXT, NICHT DARIN (21.09.2026).
Am Rechner ist die Karte ueber 1200 px breit; lag der Knopf im
Textblock, klebte er links unten und rechts blieb die halbe
Karte leer. Als eigenes Geschwister rutscht er mit
`margin-left: auto` an den rechten Rand -- dorthin, wo der
Daumen am Handy und der Blick am Rechner ohnehin hinwandern.
Am Handy bricht die Karte in eine Spalte um, und er steht
wieder unter dem Text. Dafuer sorgt derselbe Umbruch, der auch
den Ring nach oben setzt -- keine zweite Regel. -->
<a class="puls__knopf" id="puls-knopf"
href="https://www.tiktok.com/@dogfather0804"
target="_blank" rel="noopener noreferrer" hidden>Jetzt zuschauen&nbsp;→</a>
</section>
<!-- ==================================================================
DAS BESONDERE EVENT
Dieselbe Quelle wie beim oeffentlichen Streamplan
(/special-event). Traegt die Verwaltung eines ein, erscheint
dieser Kasten; sonst ist er nicht da.
ER IST VERSTECKT UND NICHT LEER: Ein Kasten mit "kein Event
geplant" belegt jeden Tag Platz, um an den meisten Tagen nichts
zu sagen -- und genau deshalb liest ihn niemand mehr an dem Tag,
an dem doch etwas drinsteht.
============================================================== -->
<section class="event" id="event" hidden>
<span class="event__zeichen" aria-hidden="true">★</span>
<div class="event__text">
<p class="event__marke">Besonderes Live-Event</p>
<h2 class="event__titel" id="event-titel"></h2>
<p class="event__zahl" id="event-zahl"></p>
</div>
<a class="event__knopf" id="event-knopf" href="#"
target="_blank" rel="noopener noreferrer" hidden>Mehr erfahren&nbsp;→</a>
</section>
<!-- ==================================================================
DIE KANAELE
Die drei Accounts kommen vom Server (/workspace/api/draussen) und
stehen hier NICHT im Quelltext. Sie haengen dort an derselben
Liste, die auch die Aufgabenverteilung benutzt.
WARUM DAS WICHTIG IST: Am 21.09.2026 stand in dieser Liste
"@hasidog00804" -- eine Null zu viel, der Account existiert
nicht. Zwei Pruefungen hatten den Tippfehler abgeschrieben und
waren deshalb gruen. Eine dritte Abschrift hier waere ein toter
Link gewesen, den niemand meldet, weil niemand weiss, dass er
falsch ist.
SOLANGE NICHTS DA IST, STEHT HIER AUCH NICHTS -- kein Geruest aus
grauen Kaesten. Geht der Abruf schief, erscheint ein Satz, der
sagt, was los ist, statt einer leeren Reihe, die aussieht, als
gaebe es keine Kanaele.
============================================================== -->
<section class="kanaele" id="kanaele" hidden>
<h2 class="kanaele__titel">Wo du ihn sonst findest</h2>
<div class="kanaele__reihe" id="kanaele-reihe"></div>
<p class="kanaele__fehler" id="kanaele-fehler" hidden>
Die Kanäle konnten gerade nicht geladen werden. Versuch es später
noch einmal — an deinem Gerät liegt es nicht.
</p>
</section>
<!-- ==================================================================
DIE ZWEI SEITEN (seit 19.09.2026, unveraendert in der Sache)
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
an Community, Zuschauer, Freunde etc." -- und mit
"giltAufSale": false. Genau deshalb steht der Satz zu den
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
er Umsatz bringt.
Der zweite Code in derselben Datei ist als "Nur fuer Filipe
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
Seite.
============================================================== -->
<h2 class="seiten-titel">Unsere Seiten</h2>
<div class="seiten-gitter">
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
Filipe: "die sollen paar mal sein in der kacheln und so wie
schweben, sich ganz leicht bewegen."
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
gleich waere ein Muster, und ein Muster sieht nach Tapete
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
etwas ablenkt.
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
Logo in jede Kachel, egal welchen Ton sie hat.
`aria-hidden`, weil sie nichts sagen -- wer die Seite
vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<circle cx="12" cy="12" r="8.4" />
<path d="M3.6 12h16.8M12 3.6c2.4 2.5 2.4 13.9 0 16.8M12 3.6c-2.4 2.5-2.4 13.9 0 16.8" />
</svg>
</span>
<div>
<p class="aussen__marke">Die Website</p>
<h3 class="aussen__titel">DogFather&nbsp;Universe</h3>
</div>
</div>
<p class="aussen__satz">
Die Heimat von DogFather als Streamer, der HasiDog-Community
und seiner Arbeit als Manager bei Spicy Media.
</p>
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
Die Punkte stammen aus der Navigation von
dogfather-universe.com (streamplan.html, hasidog.html,
zeitreise.html, stimmen.html). Eine erfundene Aufzählung
wäre beim ersten Klick als Lüge aufgeflogen.
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
Startseite; einzelne Links darin würden diesen Klick
zerschneiden und wären auf dem Handy außerdem zu kleine
Ziele. -->
<ul class="aussen__liste">
<li>Der Streamplan – wann was läuft</li>
<li>HasiDog: die Community rund um Dogi</li>
<li>Die Zeitreise durch alles Bisherige</li>
<li>Stimmen von Leuten, die dabei waren</li>
</ul>
<p class="aussen__weg">
<span class="aussen__adresse">dogfather-universe.com</span>
<a class="aussen__knopf" href="https://dogfather-universe.com/"
target="_blank" rel="noopener noreferrer">Seite öffnen&nbsp;→</a>
</p>
</article>
<!-- ---- VANVANS SHOP ------------------------------------------ -->
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<path d="M5 8h14l-1.1 11.2a1.4 1.4 0 0 1-1.4 1.3H7.5a1.4 1.4 0 0 1-1.4-1.3z" />
<path d="M9 8V6.4a3 3 0 0 1 6 0V8" />
</svg>
</span>
<div>
<p class="aussen__marke">Der Shop</p>
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
(og:site_name und meta description). Meine erste Fassung
hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
Anhänger, Werkzeug" — beides ausgedacht und beides
falsch. Der Laden heißt mit „&", und er verkauft vor
allem Handgemachtes. -->
<h3 class="aussen__titel">Van's&nbsp;DIY &amp; Bastelbedarf</h3>
</div>
</div>
<p class="aussen__satz">
VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
Schmuck und Bastelzubehör.
</p>
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
dieser Karte ist -- und kopierbar, weil niemand einen Code
abtippen soll, den er sich vorher merken muss. -->
<div class="gutschein">
<p class="gutschein__zeile">
<span class="gutschein__prozent">10&nbsp;%</span>
<span class="gutschein__wofuer">für alle aus der Community</span>
</p>
<button type="button" class="gutschein__code" id="code-knopf"
data-code="DOGI10"
aria-label="Rabattcode DOGI10 kopieren">
<span class="gutschein__wort">DOGI10</span>
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
</button>
<p class="gutschein__klein">
Beim Bestellen im Feld für den Gutscheincode eintragen.
Gilt nicht auf bereits reduzierte Artikel.
</p>
</div>
<p class="aussen__weg">
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
target="_blank" rel="noopener noreferrer">Shop öffnen&nbsp;→</a>
</p>
</article>
</div>
<p class="seiten-fuss">
Alles hier öffnet sich in einem neuen Fenster — der Treff bleibt
also offen.
</p>
</main>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609211206" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -144,11 +144,11 @@
</main>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>␍
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/werdegang.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/werdegang.js?v=202609211206" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211145" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211145" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211145" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609211206" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609211206" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/start.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609211206" />
<link rel="stylesheet" href="assets/css/module.css?v=202609211206" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609211145" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609211206" />
</head>
<body class="start">
@@ -190,14 +190,14 @@
</main>
<script src="assets/js/meldung.js?v=202609211145" defer></script>
<script src="assets/js/hochladen.js?v=202609211145" defer></script>
<script src="assets/js/nachfrage.js?v=202609211145" defer></script>
<script src="assets/js/meldung.js?v=202609211206" defer></script>
<script src="assets/js/hochladen.js?v=202609211206" defer></script>
<script src="assets/js/nachfrage.js?v=202609211206" defer></script>
<script src="assets/js/wahl.js?v=202609211145" defer></script>
<script src="assets/js/bereiche.js?v=202609211145" defer></script>
<script src="assets/js/kopf.js?v=202609211145" defer></script>
<script src="assets/js/glocke.js?v=202609211145" defer></script>
<script src="assets/js/wissen.js?v=202609211145" defer></script>
<script src="assets/js/wahl.js?v=202609211206" defer></script>
<script src="assets/js/bereiche.js?v=202609211206" defer></script>
<script src="assets/js/kopf.js?v=202609211206" defer></script>
<script src="assets/js/glocke.js?v=202609211206" defer></script>
<script src="assets/js/wissen.js?v=202609211206" defer></script>
</body>
</html>