Compare commits
2
Commits
2a6008d699
...
eca9aed279
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eca9aed279 | ||
|
|
9a71f3a242 |
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
@@ -271,6 +271,75 @@ melde("=== 6. Nicht nur nachgeplappert ===");
|
||||
.map((v) => `${v.kanal ?? "leer"}:${v.n}`).join(" ")})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
7. STIMMEN DIE ADRESSEN MIT DER OEFFENTLICHEN SEITE UEBEREIN?
|
||||
======================================================================= */
|
||||
melde("");
|
||||
melde("=== 7. Dieselben Accounts wie draussen ===");
|
||||
{
|
||||
/* WARUM DIESER ABSCHNITT AM 21.09.2026 DAZUKAM.
|
||||
|
||||
In KANAELE stand "@hasidog00804" -- eine Null zu viel. Nachgemessen
|
||||
bei TikTok selbst: "@hasidog0804" hat 65 Follower, "@hasidog00804"
|
||||
liefert "Couldn't find this account". Der Tippfehler war nicht
|
||||
kosmetisch: `kanalVonHandle` ordnet ein hochgeladenes Video ueber
|
||||
genau diesen Text einem Kanal zu. Ein echtes HasiDog-Video waere
|
||||
abgelehnt worden -- mit dem Satz "ist keiner deiner Kanaele.
|
||||
Moeglich sind: ..." und einer Adresse darin, die es nicht gibt.
|
||||
Eine Sackgasse, die auch noch falsch erklaert, wo sie hinfuehrt.
|
||||
|
||||
GEFUNDEN HAT ES KEINE PRUEFUNG, sondern ein Vergleich: Die
|
||||
oeffentliche Website verlinkt dieselben Accounts, und dort stand
|
||||
die richtige Schreibweise. Zwei Orte im selben Haus, die dasselbe
|
||||
behaupten und sich widersprechen -- das ist messbar, ohne irgendwen
|
||||
im Netz zu fragen.
|
||||
|
||||
WARUM NICHT BEI TIKTOK NACHFRAGEN: Das waere die direktere Frage,
|
||||
haengt aber an einem fremden Dienst. Faellt er aus, wird aus einer
|
||||
Stoerung ein roter Alarm (der Fall vom 04.09. in der Buchhaltung).
|
||||
Der Vergleich im Haus braucht kein Netz und kann deshalb immer
|
||||
antworten. */
|
||||
const { readFileSync, readdirSync } = await import("node:fs");
|
||||
const { fileURLToPath } = await import("node:url");
|
||||
const { KANAELE } = await import("./workspace.js");
|
||||
const wurzel = fileURLToPath(new URL("../", import.meta.url));
|
||||
|
||||
const draussen = new Set();
|
||||
let gelesen = 0;
|
||||
for (const f of readdirSync(wurzel)) {
|
||||
if (!f.endsWith(".html")) continue;
|
||||
gelesen++;
|
||||
const text = readFileSync(wurzel + f, "utf8");
|
||||
for (const m of text.matchAll(/tiktok\.com\/@([A-Za-z0-9._-]+)/g)) {
|
||||
draussen.add("@" + m[1].toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Faende die Suche gar nichts --
|
||||
weil die Seiten umgezogen sind oder anders verlinken --, waere
|
||||
"keiner fehlt" wahr und vollkommen wertlos. */
|
||||
ok(gelesen > 10 && draussen.size >= 3,
|
||||
`auf ${gelesen} oeffentlichen Seiten stehen ${draussen.size} TikTok-Adressen`);
|
||||
|
||||
const fehlend = KANAELE.filter((k) => !draussen.has(k.handle.toLowerCase()));
|
||||
ok(fehlend.length === 0,
|
||||
fehlend.length
|
||||
? `DIESE ADRESSEN KENNT DIE OEFFENTLICHE SEITE NICHT: `
|
||||
+ fehlend.map((k) => `${k.name} ${k.handle}`).join(", ")
|
||||
+ ` -- eine davon ist falsch geschrieben, und Videos von diesem `
|
||||
+ `Account wuerden abgelehnt`
|
||||
: `alle ${KANAELE.length} Accounts stehen genauso auch draussen `
|
||||
+ `(${KANAELE.map((k) => k.handle).join(", ")})`);
|
||||
|
||||
/* GEGENPROBE: Kann dieser Vergleich ueberhaupt "nicht in Ordnung"
|
||||
sagen? Eine erfundene Adresse muss durchfallen -- sonst wuerde
|
||||
oben auch der echte Tippfehler durchrutschen. */
|
||||
ok(!draussen.has("@hasidog00804"),
|
||||
"Gegenprobe: die falsch geschriebene Adresse findet sich draussen NICHT");
|
||||
ok(!draussen.has("@diesen-account-gibt-es-nicht"),
|
||||
"Gegenprobe: eine erfundene Adresse wuerde auffallen");
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
melde("");
|
||||
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
|
||||
|
||||
@@ -34,6 +34,20 @@ process.env.SITE_ACCESS_SECRET = "lokaler-test";
|
||||
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
|
||||
process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`;
|
||||
|
||||
/* DIE HANDLES WERDEN ABGELEITET, NICHT ABGESCHRIEBEN (21.09.2026).
|
||||
|
||||
Hier standen sie als Text im Pruefcode -- und einer davon war falsch:
|
||||
"@hasidog00804" mit einer Null zu viel. Er stand genauso falsch in
|
||||
KANAELE, weshalb die Pruefung gruen war: Zwei Abschriften desselben
|
||||
Tippfehlers bestaetigen sich gegenseitig. Nachgemessen bei TikTok
|
||||
selbst gibt es nur "@hasidog0804" (65 Follower); die andere Adresse
|
||||
liefert "Couldn't find this account".
|
||||
|
||||
Jetzt kommen sie aus KANAELE. Damit kann diese Datei den Wert gar
|
||||
nicht mehr eigenstaendig falsch haben -- sie misst den echten. */
|
||||
const { KANAELE } = await import("./workspace.js");
|
||||
const HANDLES = KANAELE.map((k) => k.handle.replace(/^@/, ""));
|
||||
|
||||
const PNG = Buffer.from(
|
||||
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
|
||||
"base64");
|
||||
@@ -43,9 +57,10 @@ const tiktok = createServer((q, a) => {
|
||||
const ziel = u.searchParams.get("url") || "";
|
||||
const wer = (ziel.match(/@([^/?]+)/) || [])[1] || "";
|
||||
if (!wer) { a.writeHead(404); a.end("{}"); return; }
|
||||
const titel = { "dogfather0804": "Casper klaut die Fernbedienung 😄",
|
||||
"hasidog00804": "Casper schläft im Wäschekorb",
|
||||
"dogis.modi.gang": "Der Chat entscheidet: Horror oder Koop?" }[wer] || "Video";
|
||||
const TITEL = ["Casper klaut die Fernbedienung 😄",
|
||||
"Casper schläft im Wäschekorb",
|
||||
"Der Chat entscheidet: Horror oder Koop?"];
|
||||
const titel = TITEL[HANDLES.indexOf(wer)] || "Video";
|
||||
a.writeHead(200, { "content-type": "application/json" });
|
||||
a.end(JSON.stringify({
|
||||
version: "1.0", type: "video", title: titel,
|
||||
@@ -141,8 +156,8 @@ ok(!(await zeileDa()), "bei einem einzigen Kanal steht dort KEINE Filterzeile");
|
||||
|
||||
/* ---- 2. Drei Kanäle -------------------------------------------------- */
|
||||
console.log("\n=== 2. Mit drei Kanaelen ===");
|
||||
console.log(" Video 2:", await video("hasidog00804", "102"));
|
||||
console.log(" Video 3:", await video("dogis.modi.gang", "103"));
|
||||
console.log(" Video 2:", await video(HANDLES[1], "102"));
|
||||
console.log(" Video 3:", await video(HANDLES[2], "103"));
|
||||
await seite.reload({ waitUntil: "networkidle" });
|
||||
await seite.waitForTimeout(1800);
|
||||
ok(await zeileDa(), "sobald drei Kanaele da sind, erscheint sie");
|
||||
|
||||
@@ -39,6 +39,13 @@ process.env.SITE_ACCESS_SECRET = "lokaler-test";
|
||||
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
|
||||
process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`;
|
||||
|
||||
/* Der Handle wird abgeleitet, nicht abgeschrieben (21.09.2026) -- hier
|
||||
stand "@hasidog00804" mit einer Null zu viel, derselbe Tippfehler wie
|
||||
in KANAELE. Zwei gleiche Abschriften bestaetigen sich gegenseitig und
|
||||
merken nichts. */
|
||||
const { KANAELE } = await import("./workspace.js");
|
||||
const HANDLES = KANAELE.map((k) => k.handle.replace(/^@/, ""));
|
||||
|
||||
const PNG = Buffer.from(
|
||||
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
|
||||
"base64");
|
||||
@@ -233,7 +240,7 @@ melde("");
|
||||
melde("=== 5. Wohin ist eine Frage ===");
|
||||
{
|
||||
const vorher = await zahlIm("treff");
|
||||
await oeffne(`url=${encodeURIComponent(`http://127.0.0.1:${TIKTOK}/@hasidog00804/video/99`)}`);
|
||||
await oeffne(`url=${encodeURIComponent(`http://127.0.0.1:${TIKTOK}/@${HANDLES[1]}/video/99`)}`);
|
||||
await seite.click('.tl-brett[data-brett="treff"]');
|
||||
await seite.waitForTimeout(300);
|
||||
const gewaehlt = await seite.$$eval(".tl-brett",
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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" });
|
||||
}
|
||||
});
|
||||
+35
-5
@@ -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." },
|
||||
{ wert: "hasidog", name: "HasiDog", handle: "@hasidog00804",
|
||||
+ "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?
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 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 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 →</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 DIY & 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 %</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 →</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 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 →</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 →</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 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 →</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 DIY & 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 %</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 →</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
@@ -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
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user