Compare commits

...
3 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 d77dd216c5 Ein Termin von-bis belegt jeden Tag dazwischen
Zwei Fehler, nicht einer.

Der sichtbare: Die Kachel stand nur am Anfangstag. Wer im
Monatsraster auf den Mittwoch sah, sah nichts -- obwohl die Aktion
von Montag bis Freitag lief.

Der unsichtbare, und der ist der schlimmere: Der SERVER suchte
Eintraege, deren ANFANG im sichtbaren Fenster liegt. Eine Aktion vom
28.09. bis zum 05.10. kam im Oktober deshalb ueberhaupt nicht an --
nicht "nur am ersten Tag markiert", sondern gar nicht da. Wer im
Oktober plante, sah eine freie Woche, die belegt war. Jetzt
entscheidet die UEBERSCHNEIDUNG, nicht der Anfang.

Gebaut wurde es in nachTag() -- der einzigen Stelle, an der
Eintraege auf Tage verteilt werden. Monat, Woche, Liste und
Zeitstrahl holen sich alle dort; vier Ansichten einzeln
nachzuruesten waeren vier Stellen, an denen die fuenfte vergessen
wird.

Das Ende wird abgeleitet, nicht gepflegt: aus event_ende ODER aus
Uhrzeit plus Dauer. Ein Live von 22:00 ueber vier Stunden endet um
02:00 am naechsten Tag -- das stand bisher nirgends, obwohl die
Zahlen da waren.

Der Tagesdialog filterte selbst auf den Anfangstag. Im Raster war
der Mittwoch markiert, tippte man ihn an, stand da "An diesem Tag
steht nichts." Jetzt fragt er dieselbe Stelle wie das Raster.

pruef-zeitraum.mjs: 16 Pruefungen, beide Fehler einzeln, mit drei
Gegenproben (vor dem Anfang, nach dem Ende, Punkttermin).
pruef-terminregel.mjs weiterhin 35/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:20:18 +02:00
DogFatherGitandClaude Opus 5 947ea7ff49 Fertige Vorschlaege lassen sich wechseln
Bisher kamen ALLE auf einmal -- damit gab es nichts zu wechseln, die
Liste war entweder ganz da oder ganz weg. Bei 17 Vorschlaegen (Brett
"regeln") ist eine Wand aus Karten ausserdem das Gegenteil von
"uebernehmen, was passt".

Jetzt vier auf einmal, und ein Knopf holt die naechsten vier. Der
Server rechnet die Stelle mit Rest -- nach dem letzten kommt wieder
der erste. Es gibt also keinen Zustand "durchgeklickt, jetzt leer".

Bei hoechstens vier offenen Vorschlaegen erscheint der Knopf gar
nicht: Ein Knopf, der dieselben Karten noch einmal malt, ist ein
Knopf, der nichts tut.

Was es NICHT ist: Die Vorschlaege werden nicht erzeugt. Sie sind ein
geschriebener Vorrat von 113 Stueck auf 16 Brettern.

pruef-vorschlaege.mjs: 21 Pruefungen. Die entscheidende vergleicht
die Titel vorher und nachher -- ein Knopf, der nur gedrueckt werden
kann, besteht jede Pruefung, die nur nach dem Knopf sucht.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:15:49 +02:00
DogFatherGitandClaude Opus 5 c4e26409b9 Die Seite laesst sich als App installieren
Das Manifest war lange vollstaendig -- die App LIESS sich
installieren. Nur bot das ausschliesslich der Browser an, versteckt
in seinem Dreipunktemenue. Wer es nicht sucht, findet es nie. Und
ohne installierte App gibt es auf dem Handy keine verlaesslichen
Benachrichtigungen; genau daran hing im September das Telefonieren.

Jetzt steht der Knopf in der Kopfleiste, auf allen Seiten, mit drei
Antworten statt einer:

  schon installiert -> gar kein Knopf
  Browser bietet an -> der Knopf fragt ihn
  Safari am iPhone  -> der Knopf erklaert den Weg

Der dritte Fall ist der gefaehrliche: Dort gibt es
beforeinstallprompt nicht und wird es nicht geben. Ein Knopf, der
am iPhone nichts tut, waere schlimmer als keiner -- man drueckt ihn
und sucht den Fehler bei sich.

pruef-installieren.mjs: 14 Pruefungen, alle drei Zustaende, mit
Gegenprobe in der installierten App.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:13:36 +02:00
49 changed files with 1624 additions and 517 deletions
+206
View File
@@ -0,0 +1,206 @@
/* =====================================================================
pruef-installieren.mjs — Die Seite als App auf dem Gerät
Filipe, 20.09.2026: „kannst du da dazwischen in der starseite oben,
ein button reinsetzen damit die leute die seite installieren koennen
auf dem handy oder pc. das soll auch verschwinden wenn die leute es
installiert haben."
---------------------------------------------------------------------
WARUM DAS MEHR IST ALS EIN KNOPF
Ohne installierte App gibt es auf dem Handy keine verlässlichen
Benachrichtigungen — daran hing im September das Telefonieren. Das
Manifest war die ganze Zeit vollständig, die App ließ sich
installieren. Nur bot das ausschließlich der Browser an, versteckt
in seinem Dreipunktemenü.
DREI ZUSTÄNDE, DREI ANTWORTEN — und jede wird hier geprüft:
1. schon installiert -> gar kein Knopf
2. Browser bietet an -> Knopf fragt ihn
3. Safari/iPhone -> Knopf erklärt den Weg (dort gibt es
`beforeinstallprompt` nicht und wird es
nicht geben)
Der gefährlichste Fall ist der dritte: Ein Knopf, der auf dem iPhone
nichts tut, ist schlimmer als keiner — man drückt ihn und sucht den
Fehler bei sich.
AUFRUF: node server/pruef-installieren.mjs
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4435, "pruef-installieren");
const ordner = mkdtempSync(join(tmpdir(), "ws-install-"));
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 }); };
await import("./index.js");
notbremse(220_000, "pruef-installieren");
await new Promise((r) => setTimeout(r, 900));
const BASIS = `http://127.0.0.1:${PORT}`;
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
process.on("unhandledRejection", (f) => { console.error("ABSTURZ (Versprechen):", f); process.exit(7); });
let fehler = 0, geprueft = 0;
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
console.log("\n=== Die Seite als App installieren ===\n");
/* ---- 1. Das Manifest, ohne Browser -------------------------------- */
{
const { readFileSync } = await import("node:fs");
const { fileURLToPath } = await import("node:url");
const { dirname } = await import("node:path");
const HIER = dirname(fileURLToPath(import.meta.url));
const m = JSON.parse(readFileSync(join(HIER, "..", "workspace", "crew.webmanifest"), "utf8"));
/* Ohne diese vier Angaben bietet kein Browser das Installieren an --
der schoenste Knopf haette dann nichts zu fragen. */
ok(!!m.name && !!m.short_name, `Name und Kurzname stehen (${m.short_name})`);
ok(m.display === "standalone", `display ist "${m.display}"`);
ok(!!m.start_url && m.start_url.startsWith("/workspace/"),
`Startadresse zeigt in den Workspace (${m.start_url})`);
const gross = (m.icons || []).filter((i) => /512|384/.test(i.sizes || ""));
ok(gross.length >= 1, `mindestens ein grosses Symbol (${gross.length})`);
}
/* ---- 2. Am echten Bildschirm -------------------------------------- */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const salt = randomBytes(16).toString("hex");
const hash = scryptSync("CODE-DOGI-0001", salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)").run("Filipe", "admin", hash, salt, 32768, new Date().toISOString());
d.close();
const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
const browser = await pw.chromium.launch();
try {
async function seiteAuf(extra = {}) {
const ctx = await browser.newContext({ viewport: { width: 1280, height: 860 }, ...extra });
const s = await ctx.newPage();
await s.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
await s.click('.rolle[data-rolle="admin"]');
await s.fill("#code", "CODE-DOGI-0001");
await s.click("button[type=submit]");
await s.waitForURL("**/start.html", { timeout: 25000 });
await s.waitForTimeout(1300);
return { ctx, s };
}
/* ---- Zustand 2: der Browser bietet es an ----------------------- */
const a = await seiteAuf();
/* Chromium loest `beforeinstallprompt` in dieser Umgebung nicht von
selbst aus (kein echtes Profil, kein Nutzerverhalten). Das
Ereignis wird deshalb nachgestellt -- geprueft wird, was DIE SEITE
damit macht, und genau das ist hier die Frage. */
const vorher = await a.s.locator(".install-knopf").count();
const sichtbarVorher = await a.s.evaluate(() =>
!!document.querySelector(".install-knopf:not([hidden])"));
ok(vorher === 1, `der Knopf steht im Dokument (${vorher})`);
ok(sichtbarVorher === false,
"bleibt aber versteckt, solange der Browser nichts anbietet — kein Knopf ohne Wirkung");
await a.s.evaluate(() => {
const e = new Event("beforeinstallprompt");
e.prompt = () => {};
e.userChoice = Promise.resolve({ outcome: "accepted" });
window.dispatchEvent(e);
});
await a.s.waitForTimeout(300);
const nachher = await a.s.evaluate(() => {
const k = document.querySelector(".install-knopf");
if (!k) return null;
const r = k.getBoundingClientRect();
return { sichtbar: !k.hidden, text: k.textContent.trim(),
satz: k.getAttribute("aria-label"),
breit: Math.round(r.width), hoch: Math.round(r.height) };
});
ok(nachher?.sichtbar === true, `sobald der Browser anbietet, steht er da ("${nachher?.text}")`);
ok((nachher?.hoch || 0) >= 44, ` und ist am Finger treffbar (${nachher?.hoch} px)`);
ok(/installieren/i.test(nachher?.satz || ""),
` mit einem ganzen Satz fuer Vorleseprogramme ("${nachher?.satz}")`);
/* Und ein Druck macht ihn fertig. */
await a.s.click(".install-knopf");
await a.s.waitForTimeout(500);
const weg = await a.s.locator(".install-knopf").count();
ok(weg === 0, `nach dem Installieren ist er weg (${weg})`);
/* ---- Zustand 1: schon installiert ------------------------------ */
const b = await browser.newContext({ viewport: { width: 1280, height: 860 } });
const bs = await b.newPage();
/* `display-mode: standalone` laesst sich nicht direkt setzen --
`matchMedia` wird deshalb vor dem Laden ueberschrieben. Damit
antwortet die Seite genau so, wie sie es in einer installierten
App taete. */
await bs.addInitScript(() => {
const echt = window.matchMedia.bind(window);
window.matchMedia = (q) => (q.includes("display-mode: standalone")
? { matches: true, media: q, addEventListener() {}, removeEventListener() {}, addListener() {}, removeListener() {} }
: echt(q));
});
await bs.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
await bs.click('.rolle[data-rolle="admin"]');
await bs.fill("#code", "CODE-DOGI-0001");
await bs.click("button[type=submit]");
await bs.waitForURL("**/start.html", { timeout: 25000 });
await bs.waitForTimeout(1300);
const inApp = await bs.locator(".install-knopf").count();
ok(inApp === 0,
`Gegenprobe: in der installierten App gibt es den Knopf gar nicht erst (${inApp})`);
/* ---- Zustand 3: Safari auf dem iPhone -------------------------- */
const c = await browser.newContext({
viewport: { width: 390, height: 844 }, isMobile: true, hasTouch: true,
userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) "
+ "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",
});
const cs = await c.newPage();
await cs.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
await cs.click('.rolle[data-rolle="admin"]');
await cs.fill("#code", "CODE-DOGI-0001");
await cs.click("button[type=submit]");
await cs.waitForURL("**/start.html", { timeout: 25000 });
await cs.waitForTimeout(1300);
const beiApple = await cs.evaluate(() => {
const k = document.querySelector(".install-knopf");
return k ? { sichtbar: !k.hidden, breit: Math.round(k.getBoundingClientRect().width) } : null;
});
/* DER WICHTIGSTE FALL: Dort gibt es `beforeinstallprompt` nicht --
der Knopf muss trotzdem dastehen und erklaeren. */
ok(beiApple?.sichtbar === true,
"auf dem iPhone steht er von Anfang an da (dort fragt der Browser nie)");
ok((beiApple?.breit || 0) >= 44,
` und ist auch dort treffbar (${beiApple?.breit} px breit)`);
await cs.click(".install-knopf");
await cs.waitForTimeout(700);
const erklaerung = await cs.evaluate(() => {
const d2 = document.querySelector("dialog.nachfrage[open]");
return d2 ? d2.textContent.replace(/\s+/g, " ").trim() : null;
});
ok(/Teilen|Home-Bildschirm/i.test(erklaerung || ""),
` und erklaert den Weg statt es zu versuchen ("${(erklaerung || "").slice(0, 70)}…")`);
await a.ctx.close(); await b.close(); await c.close();
} finally {
await browser.close();
}
console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`);
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
process.exit(fehler ? 1 : 0);
+178
View File
@@ -0,0 +1,178 @@
/* =====================================================================
pruef-vorschlaege.mjs — Die fertigen Vorschläge lassen sich wechseln
Filipe, 20.09.2026: „fertige vorschläge, überall auf der ganzen
kompletten website, will ich dass man auch immer wieder neuladen
kann, so dass wenn man alle benutzt hat man neue erstellen kann oder
wenn keiner uns gefällt wir komplett neue erstellen können
automatisch, mach das richtig geil dass es immer wieder möglich ist
die liste zu wechseln wenn sie uns nicht gefällt oder leer ist."
---------------------------------------------------------------------
WAS HIER DIE EIGENTLICHE FRAGE IST
Nicht „gibt es einen Knopf" — sondern „kommt nach dem Druck etwas
ANDERES". Ein Knopf, der dieselben vier Karten noch einmal malt,
besteht jede Prüfung, die nur nach dem Knopf sucht, und ist
trotzdem wertlos. Deshalb werden hier die Titel VORHER und NACHHER
verglichen.
UND DER RUNDLAUF: Wer oft genug drückt, muss wieder am Anfang
landen statt vor einer leeren Liste. Das wird gemessen, indem so oft
weitergeschaltet wird, dass der Vorrat sicher durch ist.
AUFRUF: node server/pruef-vorschlaege.mjs
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4436, "pruef-vorschlaege");
const ordner = mkdtempSync(join(tmpdir(), "ws-vorschlag-"));
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 }); };
await import("./index.js");
notbremse(200_000, "pruef-vorschlaege");
await new Promise((r) => setTimeout(r, 900));
const BASIS = `http://127.0.0.1:${PORT}`;
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
process.on("unhandledRejection", (f) => { console.error("ABSTURZ (Versprechen):", f); process.exit(7); });
let fehler = 0, geprueft = 0;
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
console.log("\n=== Fertige Vorschläge wechseln ===\n");
/* ---- Anmelden: ein Gast, denn nur wer NICHT schreiben darf, bekommt
den Katalog ueberhaupt. Genau das ist der Sinn: Vorschlaege sind
fuer leere Bretter da. ------------------------------------------ */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const salt = randomBytes(16).toString("hex");
const hash = scryptSync("CODE-DOGI-0001", salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)").run("Filipe", "admin", hash, salt, 32768, new Date().toISOString());
d.close();
const an = await fetch(BASIS + "/workspace/api/anmelden", {
method: "POST", headers: { "Content-Type": "application/json", Origin: BASIS },
body: JSON.stringify({ rolle: "admin", code: "CODE-DOGI-0001" }),
});
const keks = (an.headers.getSetCookie?.() || []).map((z) => z.split(";")[0]).join("; ");
ok(an.ok && !!keks, "angemeldet");
const hole = async (weg) => {
const a = await fetch(BASIS + weg, { headers: { Cookie: keks } });
return a.ok ? a.json() : null;
};
/* ---- 1. Welches Brett hat den groessten Vorrat? ------------------- */
/* NICHT geraten: gemessen. Ein fest eingetragener Bereichsname waere
falsch, sobald jemand den Katalog umbaut -- und die Pruefung liefe
dann auf einem Brett mit drei Vorschlaegen und koennte gar nichts
ueber das Weiterschalten sagen. */
const { STARTKATALOG } = await import("./workspace-bereiche.js")
.then((m) => ({ STARTKATALOG: m.STARTKATALOG }))
.catch(() => ({ STARTKATALOG: null }));
let bereich = null, vorrat = 0;
for (const b of ["regeln", "mitmachen", "content", "community", "live", "technik", "schutz"]) {
const r = await hole(`/workspace/api/bereich/${b}/start`);
if (r && r.offen > vorrat) { bereich = b; vorrat = r.offen; }
}
/* DRITTER AUSGANG: Ohne ein Brett mit mehr als vier offenen
Vorschlaegen ist die Frage "kommt etwas anderes" nicht zu
beantworten -- und das muss ein FEHLER sein, kein Schweigen. */
ok(!!bereich && vorrat > 4,
`Brett mit genug Vorrat gefunden: "${bereich}" mit ${vorrat} offenen`);
if (!bereich || vorrat <= 4) {
console.log("\n KONNTE NICHT NACHSEHEN: Kein Brett hat mehr als vier offene");
console.log(" Vorschlaege. Ohne das ist nicht messbar, ob das Weiterschalten");
console.log(" etwas anderes liefert. Katalog pruefen: server/workspace-*-start.js\n");
process.exit(1);
}
/* ---- 2. Es kommt ein FENSTER, nicht die ganze Wand ---------------- */
const s0 = await hole(`/workspace/api/bereich/${bereich}/start?ab=0`);
ok(s0.vorschlaege.length < vorrat,
`es kommen ${s0.vorschlaege.length} von ${vorrat} auf einmal - nicht alle`);
ok(s0.vorschlaege.length === 4, `das Fenster ist vier gross (${s0.vorschlaege.length})`);
ok(s0.mehr_da === true, "und der Server sagt, dass es mehr gibt (mehr_da)");
ok(s0.offen === vorrat, `"offen" zaehlt weiterhin alle (${s0.offen}) - davon haengt "Alle N uebernehmen" ab`);
/* ---- 3. DIE EIGENTLICHE FRAGE: kommt etwas anderes? --------------- */
const s1 = await hole(`/workspace/api/bereich/${bereich}/start?ab=4`);
const t0 = s0.vorschlaege.map((v) => v.titel);
const t1 = s1.vorschlaege.map((v) => v.titel);
const gleich = t1.filter((t) => t0.includes(t)).length;
ok(gleich === 0,
`nach dem Weiterschalten ist KEINER der vier derselbe (${gleich} Ueberschneidungen)`);
console.log(` vorher : ${t0.map((t) => t.slice(0, 22)).join(" | ")}`);
console.log(` nachher: ${t1.map((t) => t.slice(0, 22)).join(" | ")}`);
/* GEGENPROBE: Dieselbe Abfrage OHNE Weiterschalten muss dieselben
liefern. Sonst misst der Vergleich oben nur Zufall -- eine Liste,
die sich bei jedem Abruf mischt, haette den Test auch bestanden und
waere trotzdem kaputt (man findet einen Vorschlag nie wieder). */
const s0b = await hole(`/workspace/api/bereich/${bereich}/start?ab=0`);
ok(JSON.stringify(s0b.vorschlaege.map((v) => v.titel)) === JSON.stringify(t0),
"Gegenprobe: ohne Weiterschalten kommen dieselben - die Liste wuerfelt nicht");
/* ---- 4. KEIN ENDE: der Vorrat laeuft im Kreis --------------------- */
/* Weit ueber den Vorrat hinaus. Wer so oft drueckt, darf nicht vor
einer leeren Liste stehen -- das war Filipes Punkt ("oder leer ist"). */
const weit = await hole(`/workspace/api/bereich/${bereich}/start?ab=${vorrat * 3 + 2}`);
ok((weit?.vorschlaege?.length || 0) === 4,
`weit hinter dem Ende kommen immer noch vier (${weit?.vorschlaege?.length}) - kein leerer Bildschirm`);
const rund = await hole(`/workspace/api/bereich/${bereich}/start?ab=${vorrat}`);
ok(JSON.stringify(rund.vorschlaege.map((v) => v.titel)) === JSON.stringify(t0),
"genau einmal herum gibt wieder den Anfang - der Rundlauf schliesst");
/* ---- 5. Unsinn in der Adresse darf nichts umwerfen ---------------- */
for (const mies of ["-7", "abc", "9e99", "", "1.5"]) {
const r = await hole(`/workspace/api/bereich/${bereich}/start?ab=${encodeURIComponent(mies)}`);
ok((r?.vorschlaege?.length || 0) === 4, ` "ab=${mies}" liefert trotzdem vier`);
}
/* ---- 6. Ein kleines Brett bekommt KEINEN Wechselknopf ------------- */
/* Ein Knopf, der dieselben drei Karten noch einmal malt, ist ein
Knopf, der nichts tut -- und der Verdacht, die Seite haenge, ist
schlimmer als ein fehlender Knopf. */
let klein = null;
for (const b of ["highlight", "ansteht", "agentur", "wunsch", "ideen", "angebote"]) {
const r = await hole(`/workspace/api/bereich/${b}/start`);
if (r && r.offen > 0 && r.offen <= 4) { klein = { b, r }; break; }
}
ok(!!klein, `Brett mit hoechstens vier Vorschlaegen gefunden ("${klein?.b}", ${klein?.r?.offen})`);
ok(klein?.r?.mehr_da === false,
" und dort sagt der Server: nichts zu wechseln (mehr_da ist falsch)");
ok((klein?.r?.vorschlaege?.length || 0) === klein?.r?.offen,
` es kommen trotzdem alle ${klein?.r?.offen} auf einmal - nichts versteckt`);
/* ---- 7. Und die Seite baut den Knopf auch ------------------------- */
const { readFileSync } = await import("node:fs");
const { fileURLToPath } = await import("node:url");
const { dirname } = await import("node:path");
const HIER = dirname(fileURLToPath(import.meta.url));
const js = readFileSync(join(HIER, "..", "workspace", "assets", "js", "bereich.js"), "utf8");
ok(/katalogAb \+= Math\.max\(1, daten\.vorschlaege\.length\)/.test(js),
"die Seite zaehlt um das weiter, was wirklich kam - keine zweite 4 im Code");
ok(/if \(daten\.mehr_da\)/.test(js),
"und zeigt den Knopf nur, wenn der Server sagt, dass es mehr gibt");
ok(/let katalogAb = 0;[\s\S]{0,200}async function startkatalogZeigen/.test(js),
"der Merker steht AUSSERHALB der Funktion - sonst spraenge die Liste nach jedem Uebernehmen zurueck");
console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`);
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
process.exit(fehler ? 1 : 0);
+218
View File
@@ -0,0 +1,218 @@
/* =====================================================================
pruef-zeitraum.mjs — Ein Termin von–bis belegt jeden Tag dazwischen
Filipe, 20.09.2026: „wenn ich termine eintrage mit von bis, will ich
dass die ganze zeit markiert ist und nicht nur der anfang."
---------------------------------------------------------------------
ZWEI FEHLER, NICHT EINER
Der sichtbare: Die Kachel stand nur am Anfangstag. Wer im
Monatsraster auf den Mittwoch sah, sah nichts — obwohl die Aktion
von Montag bis Freitag lief.
Der unsichtbare, und der ist der schlimmere: Der SERVER suchte
Einträge, deren ANFANG im sichtbaren Fenster liegt. Eine Aktion vom
28.09. bis zum 05.10. kam im Oktober deshalb überhaupt nicht an —
nicht „nur am ersten Tag markiert", sondern gar nicht da. Wer im
Oktober plante, sah eine freie Woche, die belegt war.
Deshalb wird hier BEIDES gemessen, und der zweite Fall zuerst.
AUFRUF: node server/pruef-zeitraum.mjs
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { portMussFreiSein } from "./helfer-port.mjs";
import { notbremse } from "./helfer-notbremse.mjs";
const PORT = await portMussFreiSein(4437, "pruef-zeitraum");
const ordner = mkdtempSync(join(tmpdir(), "ws-zeitraum-"));
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 }); };
await import("./index.js");
notbremse(230_000, "pruef-zeitraum");
await new Promise((r) => setTimeout(r, 900));
const BASIS = `http://127.0.0.1:${PORT}`;
process.on("uncaughtException", (f) => { console.error("ABSTURZ:", f); process.exit(7); });
process.on("unhandledRejection", (f) => { console.error("ABSTURZ (Versprechen):", f); process.exit(7); });
let fehler = 0, geprueft = 0;
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
console.log("\n=== Termine über mehrere Tage ===\n");
/* ---- Daten anlegen ------------------------------------------------
RELATIV ZU HEUTE, nie mit einem festen Datum: Ein fest eingetragener
Termin wird vom Kalender eingeholt, und dann schlägt die Prüfung
fehl, ohne dass etwas kaputt ist (Hausregel, 06.09.2026). */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const salt = randomBytes(16).toString("hex");
const hash = scryptSync("CODE-DOGI-0001", salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,1,?)").run("Filipe", "admin", hash, salt, 32768, new Date().toISOString());
const tagPlus = (n) => {
const x = new Date();
x.setHours(12, 0, 0, 0);
x.setDate(x.getDate() + n);
return x.toISOString().slice(0, 10);
};
/* Eine Aktion über fünf Tage, die GESTERN angefangen hat — genau der
Fall, den der Server vorher verschluckt hat. */
const LAUF_START = tagPlus(-1), LAUF_ENDE = tagPlus(3);
/* Und ein Punkttermin als Gegenprobe. */
const EINZEL = tagPlus(5);
const spalten = new Set(d.prepare("PRAGMA table_info(eintraege)").all().map((z) => z.name));
ok(spalten.has("event_ende") && spalten.has("geplant"),
"die Tabelle kennt Anfang und Ende (event_ende, geplant)");
const einf = (titel, von, bis) => d.prepare(
"INSERT INTO eintraege (bereich, art, titel, text, status, dringlichkeit,"
+ " datum, geplant, event_ende, erstellt_von, erstellt)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?,?)")
.run("live", "idee", titel, "", "offen", "mittel", von, von, bis, 1,
new Date().toISOString());
einf("Wochenaktion quer", LAUF_START, LAUF_ENDE);
einf("Nur ein Tag", EINZEL, null);
d.close();
const an = await fetch(BASIS + "/workspace/api/anmelden", {
method: "POST", headers: { "Content-Type": "application/json", Origin: BASIS },
body: JSON.stringify({ rolle: "admin", code: "CODE-DOGI-0001" }),
});
const keks = (an.headers.getSetCookie?.() || []).map((z) => z.split(";")[0]).join("; ");
ok(an.ok && !!keks, "angemeldet");
/* ---- 1. DER SERVER: Überschneidung statt Anfang ------------------- */
const hole = async (von, tage) => {
const a = await fetch(`${BASIS}/workspace/api/termine?von=${von}&tage=${tage}`,
{ headers: { Cookie: keks } });
return a.ok ? a.json() : null;
};
const titel = (j) => (j?.brettsachen || []).map((b) => b.titel);
/* Ein Fenster, das MITTEN im Zeitraum liegt — der Anfang ist davor. */
const mitten = await hole(tagPlus(1), 2);
ok(titel(mitten).includes("Wochenaktion quer"),
"ein laufender Zeitraum kommt mit, auch wenn sein Anfang vor dem Fenster liegt");
console.log(` Fenster ${tagPlus(1)} + 2 Tage, Aktion läuft ${LAUF_START}–${LAUF_ENDE}`);
/* GEGENPROBE: Ein Fenster NACH dem Ende darf ihn nicht bringen. Ohne
diese Probe würde auch ein Server bestehen, der einfach alles
schickt — und dann stünde jeder je getippte Zettel im Kalender. */
const danach = await hole(tagPlus(10), 5);
ok(!titel(danach).includes("Wochenaktion quer"),
"Gegenprobe: nach dem Ende kommt er nicht mehr — es wird nicht einfach alles geschickt");
const davor = await hole(tagPlus(-30), 20);
ok(!titel(davor).includes("Wochenaktion quer"),
"Gegenprobe: und vor dem Anfang auch nicht");
/* Der Punkttermin muss sich genauso verhalten wie vorher. */
const beimEinzel = await hole(EINZEL, 1);
ok(titel(beimEinzel).includes("Nur ein Tag"),
"der Punkttermin kommt weiterhin an seinem Tag");
/* ---- 2. DER BILDSCHIRM: jeder Tag ist markiert -------------------- */
const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
const browser = await pw.chromium.launch();
try {
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1000 } });
const s = await ctx.newPage();
await s.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
await s.click('.rolle[data-rolle="admin"]');
await s.fill("#code", "CODE-DOGI-0001");
await s.click("button[type=submit]");
await s.waitForURL("**/start.html", { timeout: 25000 });
await s.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" });
await s.waitForTimeout(1800);
/* Wie viele Tageszellen tragen die Aktion? */
const lage = await s.evaluate(() => {
const zellen = [...document.querySelectorAll(".k-tag")];
const treffer = [];
for (const z of zellen) {
for (const p of z.querySelectorAll(".k-pille")) {
if (/Wochenaktion quer/.test(p.textContent)) {
treffer.push({
zahl: z.querySelector(".k-tag__zahl")?.textContent || "?",
spanne: p.dataset.spanne || null,
text: p.textContent.replace(/\s+/g, " ").trim(),
breit: Math.round(p.getBoundingClientRect().width),
});
}
}
}
const einzel = [...document.querySelectorAll(".k-pille")]
.filter((p) => /Nur ein Tag/.test(p.textContent));
return { zellen: zellen.length, treffer,
einzel: einzel.length, einzelSpanne: einzel[0]?.dataset.spanne ?? null };
});
ok(lage.zellen > 0, `das Monatsraster steht (${lage.zellen} Tageszellen)`);
ok(lage.treffer.length === 5,
`die Aktion ist an allen fünf Tagen markiert (${lage.treffer.length})`);
console.log(" " + lage.treffer.map((t) => `${t.zahl}.[${t.spanne}]`).join(" "));
const pos = lage.treffer.map((t) => t.spanne);
ok(pos[0] === "start" && pos.at(-1) === "ende",
`Anfang und Ende sind als solche erkennbar (${pos[0]} … ${pos.at(-1)})`);
ok(pos.slice(1, -1).every((p) => p === "mitte"),
"dazwischen steht überall 'mitte' — die Form sagt, dass es weitergeht");
/* Auf dem ersten Tag steht die Uhrzeit-Spalte, danach die Lage. Eine
Uhrzeit am Mittwoch zu wiederholen behauptet, es ginge am Mittwoch
wieder los. */
ok(/Tag 2\/5/.test(lage.treffer[1]?.text || ""),
`der zweite Tag sagt, der wievielte er ist ("${lage.treffer[1]?.text.slice(0, 34)}")`);
ok(!/Tag \d+\/\d+/.test(lage.treffer[0]?.text || ""),
"am ersten Tag steht das NICHT — dort gehört die Startzeit hin");
/* GEGENPROBE AM BILDSCHIRM: Der Punkttermin darf sich nicht
angesteckt haben. Ohne sie bestünde auch eine Fassung, die jede
Kachel über den halben Monat zieht. */
ok(lage.einzel === 1,
`Gegenprobe: der Punkttermin steht an genau einem Tag (${lage.einzel})`);
ok(lage.einzelSpanne === null,
"Gegenprobe: und trägt keine Spannen-Kennzeichnung");
/* ---- 3. Der Tagesdialog widerspricht dem Raster nicht ----------- */
/* Vorher filterte er selbst auf den Anfangstag: Im Raster war der
Mittwoch markiert, tippte man ihn an, stand da „An diesem Tag
steht nichts." */
const mitteTag = lage.treffer[2]?.zahl;
await s.evaluate((zahl) => {
for (const z of document.querySelectorAll(".k-tag")) {
if (z.querySelector(".k-tag__zahl")?.textContent === zahl) { z.click(); return; }
}
}, mitteTag);
await s.waitForTimeout(700);
const dialog = await s.evaluate(() => {
const dl = document.querySelector("#tagdialog[open]");
return dl ? dl.textContent.replace(/\s+/g, " ").trim() : null;
});
ok(!!dialog && /Wochenaktion quer/.test(dialog),
`der Tagesdialog am ${mitteTag}. zeigt die Aktion auch`);
ok(!/An diesem Tag steht nichts/.test(dialog || ""),
" und sagt nicht mehr 'An diesem Tag steht nichts'");
await ctx.close();
} finally {
await browser.close();
}
console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`);
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
process.exit(fehler ? 1 : 0);
+52 -2
View File
@@ -1846,9 +1846,59 @@ bereicheRouter.get("/workspace/api/bereich/:bereich/start", (req, res) => {
Wahrheit, und beim Umformulieren liefe sie auseinander. */
const da = new Set(db().prepare(
"SELECT titel FROM eintraege WHERE bereich = ?").all(bereich).map((z) => z.titel));
/* ==== EIN FENSTER STATT DER GANZEN LISTE (20.09.2026) ===========
Filipe: "fertige vorschlaege, ueberall auf der ganzen kompletten
website, will ich dass man auch immer wieder neuladen kann, so
dass wenn man alle benutzt hat man neue erstellen kann oder wenn
keiner uns gefaellt wir komplett neue erstellen koennen
automatisch ... dass es immer wieder moeglich ist die liste zu
wechseln wenn sie uns nicht gefaellt oder leer ist."
BISHER KAMEN ALLE AUF EINMAL. Damit gab es nichts zu wechseln --
die Liste war entweder ganz da oder ganz weg. Und bei 17
Vorschlaegen (Brett "regeln") ist eine Wand aus Karten das
Gegenteil von "uebernehmen, was passt".
JETZT: vier auf einmal, und ein Knopf holt die naechsten vier.
Ist der Vorrat durch, faengt er von vorn an -- `ab` wird mit
Rest gerechnet, es gibt also kein Ende und keine Sackgasse.
WAS ES NICHT IST: Die Vorschlaege werden nicht ERZEUGT. Sie sind
ein geschriebener Vorrat (113 Stueck auf 16 Brettern), und das
steht auch in der Antwort -- `vorrat` sagt, wie viele es
insgesamt sind. Der Oberflaeche zu erlauben, "neue" zu
versprechen, die es nicht gibt, waere eine Luege mit
Fortschrittsanzeige. */
const FENSTER = 4;
const offeneListe = liste.map((v, nr) => ({ nr, ...v, schon: da.has(v.titel) }))
.filter((v) => !v.schon);
const roh = Number(req.query?.ab);
/* MODULO STATT GRENZE: Wer oft genug weiterklickt, landet wieder am
Anfang -- statt vor einer leeren Liste zu stehen. */
const ab = offeneListe.length
? ((Number.isFinite(roh) ? Math.trunc(roh) : 0) % offeneListe.length
+ offeneListe.length) % offeneListe.length
: 0;
const fenster = [];
for (let i = 0; i < Math.min(FENSTER, offeneListe.length); i++) {
fenster.push(offeneListe[(ab + i) % offeneListe.length]);
}
res.json({
vorschlaege: liste.map((v, nr) => ({ nr, ...v, schon: da.has(v.titel) })),
offen: liste.filter((v) => !da.has(v.titel)).length,
vorschlaege: fenster,
/* `offen` bleibt, was es war: wie viele es NOCH gibt. Die
Oberflaeche zaehlt damit "Alle N uebernehmen" richtig. */
offen: offeneListe.length,
/* NEU: Gibt es ueberhaupt etwas zu wechseln? Ohne diese Angabe
muesste die Seite rechnen, und ein Knopf, der nichts anderes
zeigt, ist ein Knopf, der nichts tut. */
mehr_da: offeneListe.length > FENSTER,
ab,
vorrat: liste.length,
});
} catch (fehler) {
console.error("[workspace] Startkatalog:", fehler?.message);
+10 -3
View File
@@ -36,7 +36,7 @@ import { sichtbarEintrag, BEREICHE } from "./workspace-bereiche.js";
laufen auseinander, und dann zeigt die Karte etwas anderes als der
Kalender. */
import {
TERMIN_TAG_SQL, TERMIN_BEDINGUNG_SQL, TERMIN_GRUND_SQL, OHNE_ZUSTAENDE,
TERMIN_TAG_SQL, TERMIN_ENDE_SQL, TERMIN_BEDINGUNG_SQL, TERMIN_GRUND_SQL, OHNE_ZUSTAENDE,
} from "./workspace-termin-regel.js";
export const kalenderRouter = express.Router();
@@ -463,10 +463,17 @@ kalenderRouter.get("/workspace/api/termine", (req, res) => {
WHERE ${eintragRegel.wo}
AND e.status NOT IN (${OHNE_ZUSTAENDE.map(() => "?").join(", ")})
AND ${TERMIN_BEDINGUNG_SQL}
AND ${TERMIN_TAG_SQL} >= ?
/* UEBERSCHNEIDUNG, NICHT ANFANG (20.09.2026).
Vorher stand hier zweimal TERMIN_TAG_SQL -- also: „faengt
im sichtbaren Fenster an". Eine Aktion vom 28.09. bis zum
05.10. fiel damit im Oktober komplett heraus. Richtig ist
die Frage, ob sich Zeitraum und Fenster BERUEHREN:
faengt vor dem Fensterende an UND hoert nach dem
Fensteranfang auf. */
AND ${TERMIN_TAG_SQL} <= ?
AND ${TERMIN_ENDE_SQL} >= ?
ORDER BY wann, e.uhrzeit, e.id`)
.all(...eintragRegel.werte, ...OHNE_ZUSTAENDE, heuteLokal(), von, bis) : [];
.all(...eintragRegel.werte, ...OHNE_ZUSTAENDE, heuteLokal(), bis, von) : [];
/* DER NAME DES BRETTS KOMMT MIT -- und zwar aus dem Katalog, nicht
als abgeschriebene Liste im Browser. Ein Brett, das morgen
+20
View File
@@ -52,6 +52,26 @@
* den 24., auch wenn der Zettel am 3. entstanden ist. */
export const TERMIN_TAG_SQL = "COALESCE(e.geplant, e.datum)";
/** Der LETZTE Tag, an dem ein Eintrag noch laeuft -- als SQL-Ausdruck.
*
* Gebraucht seit dem 20.09.2026. Filipe: „wenn ich termine eintrage
* mit von bis, will ich dass die ganze zeit markiert ist und nicht
* nur der anfang."
*
* DER FEHLER SASS TIEFER ALS IN DER ANZEIGE. Der Kalender suchte
* Eintraege, deren ANFANG im sichtbaren Fenster liegt. Eine Aktion
* vom 28.09. bis zum 05.10. kam damit im Oktober ueberhaupt nicht an
* -- nicht „nur am ersten Tag markiert", sondern gar nicht da. Wer im
* Oktober plante, sah eine freie Woche, die belegt war.
*
* `MAX` und nicht `COALESCE(e.event_ende, ...)`: Ein Ende, das VOR
* dem Anfang liegt (vertippt, Anfang spaeter verschoben), wuerde
* sonst den Eintrag aus seinem eigenen Zeitraum werfen. Der leere
* Text sortiert vor jedem Datum -- ohne Ende gewinnt damit immer der
* Anfang, und das ist genau richtig. */
export const TERMIN_ENDE_SQL =
"MAX(COALESCE(e.event_ende, ''), COALESCE(e.geplant, e.datum))";
/** Die Bedingung als SQL. Erwartet GENAU EINEN Platzhalter: den
* heutigen Tag in Ortszeit (`heuteLokal()`).
*
+4 -4
View File
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
<!-- 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?v=202609191018" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<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=202609201907" defer></script>
<script src="assets/js/anruf-probe.js?v=202609201909" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609201907",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609201909",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609201907",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609201909",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609201907",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609201909",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609201907",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609201909",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+19
View File
@@ -998,6 +998,25 @@
font-size: .85rem; color: var(--text-leise);
}
.startkatalog__alle { flex: 0 0 auto; }
.startkatalog__andere { flex: 0 0 auto; }
/* DER WECHSELKNOPF IST DER ZWEITE, NICHT DER ERSTE (20.09.2026).
Neben ihm steht "Alle N uebernehmen" -- das ist die Handlung, die
etwas bewirkt. "Andere zeigen" blaettert nur. Stuenden beide gleich
kraeftig da, muesste man jedes Mal lesen, welcher welcher ist.
Deshalb bekommt er dieselbe Form und weniger Farbe: erkennbar als
Knopf, aber nicht als Angebot. */
.startkatalog__andere {
background: transparent;
border-color: var(--rand);
color: var(--text-leise);
}
.startkatalog__andere:hover {
color: var(--text);
border-color: color-mix(in srgb, var(--akzent) 45%, var(--rand));
background: color-mix(in srgb, var(--akzent) 7%, transparent);
}
/* Auto-fill: Auf dem Handy eine Spalte, am Rechner drei — gemessen,
nicht gerechnet. */
+69
View File
@@ -355,6 +355,75 @@
Kontrastmodus nicht zu erkennen. */
.k-pille.erledigt { opacity: .5; text-decoration: line-through; }
/* =====================================================================
EIN TERMIN, DER MEHRERE TAGE LAEUFT (20.09.2026)
Filipe: „wenn ich termine eintrage mit von bis, will ich dass die
ganze zeit markiert ist und nicht nur der anfang."
Die Kachel steht jetzt in jeder Tageszelle dazwischen. Damit man
sieht, dass es EIN Termin ist und nicht vier gleichnamige, wird sie
an den Seiten angeschnitten, an denen es weitergeht:
Mo [ 20:00 Aktion ━
Di ━ Tag 2/4 ━
Mi ━ Tag 3/4 ━
Do ━ Tag 4/4 ]
DIE FORM MACHT DIE AUSSAGE, nicht die Farbe -- an einer eckigen
Kante sieht man „geht weiter" auch dann, wenn man Farben schlecht
unterscheidet oder der Kontrastmodus alles einfaerbt.
WARUM KEIN ECHTER BALKEN UEBER DIE ZELLEN: Ein Element, das sich
ueber mehrere Rasterzellen legt, muesste wissen, wo die Woche
umbricht, wie hoch die Zeile gerade ist und was darunter noch steht.
Das ist bei jeder Fensterbreite eine andere Rechnung -- und eine
Rechnung, die irgendwann danebenliegt, schiebt Kacheln uebereinander.
Die angeschnittene Kante kostet nichts und kann nicht verrutschen. */
/* Laeuft gestern schon: links glatt abgeschnitten, kein Randstrich. */
.k-pille[data-spanne="mitte"],
.k-pille[data-spanne="ende"] {
border-left: 0;
border-top-left-radius: 0; border-bottom-left-radius: 0;
/* Der Strich am linken Rand wird zum FORTSETZUNGSZEICHEN: ein
schmaler, waagerechter Balken in der Farbe, auf halber Hoehe. */
padding-left: 12px;
background-image: linear-gradient(90deg,
var(--pfarbe) 0 4px, transparent 4px);
background-repeat: no-repeat;
background-position: 0 50%;
background-size: 100% 2px;
}
/* Geht morgen weiter: rechts glatt abgeschnitten. */
.k-pille[data-spanne="start"],
.k-pille[data-spanne="mitte"] {
border-top-right-radius: 0; border-bottom-right-radius: 0;
/* Eine Kante, die zeigt, dass hier nichts endet. */
box-shadow: inset -3px 0 0 -1px color-mix(in srgb, var(--pfarbe) 70%, transparent);
}
/* Der ganze Zeitraum liegt etwas satter als ein Punkttermin -- er
BELEGT die Tage, und das soll man beim Ueberfliegen sehen. */
.k-pille[data-spanne] {
background-color: color-mix(in srgb, var(--pfarbe) 22%, transparent);
}
.k-pille[data-spanne]:hover {
background-color: color-mix(in srgb, var(--pfarbe) 32%, transparent);
}
/* „Tag 2/4" ist eine Angabe zur Lage, keine Uhrzeit -- deshalb ruhiger
als die fette Startzeit daneben. */
.k-pille__lauf { font-weight: 550; opacity: .82; }
@media (forced-colors: active) {
/* Im Kontrastmodus verschwinden Farbflaechen und Schatten. Dann muss
die Kante als echter Rahmen dastehen, sonst sieht die Kachel am
Mittwoch genauso aus wie ein eigener Termin. */
.k-pille[data-spanne="start"],
.k-pille[data-spanne="mitte"] { border-right: 2px dashed CanvasText; }
.k-pille[data-spanne="mitte"],
.k-pille[data-spanne="ende"] { border-left: 2px dashed CanvasText; }
}
/* ---------- Wochenansicht ----------------------------------------------- */
.k-woche {
display: grid; gap: 1px;
+40
View File
@@ -1022,3 +1022,43 @@
.tperson[data-rolle="hand"] { border: 3px solid Highlight; }
.tperson[data-rolle="hand"]::before { display: none; }
}
/* ---- Der Installieren-Knopf (20.09.2026) ---------------------------
Er sieht aus wie die anderen Knöpfe der Kopfleiste -- mit einem
Unterschied: ein leiser Akzentrand. Er ist ein Angebot, keine
Warnung, und er verschwindet, sobald er überflüssig ist. Deshalb
darf er auffallen, ohne zu drängen. */
.install-knopf {
appearance: none;
display: inline-flex; align-items: center; gap: 7px;
min-height: 44px; padding: 0 13px;
border-radius: var(--radius-klein);
border: 1px solid color-mix(in srgb, var(--akzent) 45%, transparent);
background: color-mix(in srgb, var(--akzent) 12%, transparent);
color: var(--text);
font: inherit; font-size: .86rem; font-weight: 600;
cursor: pointer; white-space: nowrap;
transition: background var(--tempo), border-color var(--tempo);
}
.install-knopf:hover {
background: color-mix(in srgb, var(--akzent) 22%, transparent);
border-color: color-mix(in srgb, var(--akzent) 70%, transparent);
}
.install-knopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
.install-knopf__zeichen {
flex: none; width: 17px; height: 17px;
fill: none; stroke: currentColor; stroke-width: 1.8;
stroke-linecap: round; stroke-linejoin: round;
}
/* AM HANDY NUR DAS ZEICHEN. Die Leiste ist dort eng, und ein Knopf mit
Pfeil-nach-unten-in-eine-Ablage wird als „herunterladen/installieren"
verstanden -- das Wort kostet 90 px, die woanders fehlen. Der
`aria-label` sagt es weiterhin vollständig. */
@media (max-width: 760px) {
.install-knopf__text { display: none; }
.install-knopf { padding: 0; width: 44px; justify-content: center; }
}
@media (forced-colors: active) {
.install-knopf { border: 1px solid CanvasText; }
}
+49 -2
View File
@@ -1641,13 +1641,32 @@
Fertige Texte, die jemand aus dem Team uebernimmt. Nicht
automatisch: Ein Text, den niemand gelesen hat, stuende sonst als
Ansage des Teams auf einer oeffentlichen Seite. */
/* WO IM VORRAT WIR GERADE STEHEN (20.09.2026).
Filipe: "fertige vorschlaege ... will ich dass man auch immer
wieder neuladen kann, so dass wenn man alle benutzt hat man neue
erstellen kann oder wenn keiner uns gefaellt wir komplett neue
erstellen koennen automatisch."
Bisher kamen ALLE auf einmal -- damit gab es nichts zu wechseln.
Jetzt zeigt der Server ein Fenster, und dieser Merker sagt ihm, wo
es anfangen soll. Er steht ausserhalb der Funktion, weil `laden()`
sie neu aufruft: Waere er drin, spraenge die Liste nach jedem
Uebernehmen zurueck an den Anfang.
KEINE EIGENE FENSTERGROESSE HIER. Weitergezaehlt wird um das, was
tatsaechlich kam (`vorschlaege.length`) -- eine zweite 4 an dieser
Stelle waere eine Zahl, die beim naechsten Anfassen auseinanderlaeuft. */
let katalogAb = 0;
async function startkatalogZeigen() {
const ziel = $('startkatalog');
if (!ziel) return;
if (!darfEintragen()) { ziel.hidden = true; return; }
let daten = null;
try {
const a = await fetch(`/workspace/api/bereich/${bereich}/start`,
const a = await fetch(
`/workspace/api/bereich/${bereich}/start?ab=${katalogAb}`,
{ credentials: 'same-origin' });
if (!a.ok) { ziel.hidden = true; return; }
daten = await a.json();
@@ -1660,7 +1679,9 @@
kopf.append(el('h2', 'startkatalog__titel', 'Fertige Vorschläge'));
kopf.append(el('p', 'startkatalog__unter',
`${daten.offen} ${daten.offen === 1 ? 'Vorschlag ist' : 'Vorschläge sind'} `
+ 'vorbereitet. Übernehmen, was passt – ändern kannst du danach alles.'));
+ (daten.mehr_da
? 'vorbereitet. Hier stehen die nächsten – übernimm, was passt.'
: 'vorbereitet. Übernehmen, was passt – ändern kannst du danach alles.')));
const alle = el('button', 'schritt startkatalog__alle',
`Alle ${daten.offen} übernehmen`);
alle.type = 'button';
@@ -1673,6 +1694,32 @@
await laden();
});
kopf.append(alle);
/* ---- ANDERE ZEIGEN ------------------------------------------------
Nur wenn es ueberhaupt andere GIBT. Ein Knopf, der dieselben vier
noch einmal bringt, ist ein Knopf, der nichts tut -- und der
Verdacht, dass die Seite haengt, ist schlimmer als ein fehlender
Knopf. Deshalb entscheidet der Server (`mehr_da`) und nicht eine
Rechnung hier.
DER VORRAT ENDET NICHT: Der Server rechnet `ab` mit Rest, nach dem
letzten kommt wieder der erste. Es gibt also keinen Zustand
"durchgeklickt, jetzt ist leer". */
if (daten.mehr_da) {
const andere = el('button', 'schritt startkatalog__andere',
'Andere Vorschläge zeigen');
andere.type = 'button';
andere.setAttribute('aria-label',
'Andere Vorschläge zeigen – die nächsten aus dem Vorrat');
andere.addEventListener('click', () => {
/* Um das weiterzaehlen, was wirklich kam. Bei drei gezeigten
Karten um drei -- sonst uebersprungen wir eine. */
katalogAb += Math.max(1, daten.vorschlaege.length);
startkatalogZeigen();
});
kopf.append(andere);
}
ziel.append(kopf);
const liste = el('div', 'startkatalog__liste');
+126 -5
View File
@@ -601,11 +601,93 @@
statt verschluckt. */
const sichtbare = () => (daten ? daten.eintraege.filter((e) => zeigen[e.art] !== false) : []);
/* =====================================================================
EIN TERMIN VON--BIS STEHT AN JEDEM TAG DAZWISCHEN (20.09.2026)
Filipe: „wenn ich termine eintrage mit von bis, will ich dass die
ganze zeit markiert ist und nicht nur der anfang."
BISHER stand er nur am Anfangstag. Wer im Monatsraster auf den
Mittwoch sah, sah nichts -- obwohl die Aktion von Montag bis
Freitag lief. Genau in der Ansicht, in der man plant, war der
belegte Zeitraum unsichtbar, und man legte etwas mitten hinein.
WARUM GENAU HIER: `nachTag()` ist die EINZIGE Stelle, an der
Eintraege auf Tage verteilt werden -- Monat, Woche, Liste und
Zeitstrahl holen sich alle `karte.get(tag)`. Vier Ansichten
einzeln nachzuruesten waere vier Stellen, an denen die naechste
Ansicht vergessen wird.
DAS ENDE WIRD ABGELEITET, NICHT GEPFLEGT:
* `bis` -- Brettkarten mit event_ende
* Uhr + Dauer -- ein Live von 22:00 ueber 240 Minuten endet um
02:00 am naechsten Tag. Das stand bisher
NIRGENDS, obwohl die Zahlen da waren.
Eine Liste „diese Arten haben ein Ende" waere die Liste, die beim
naechsten Termintyp veraltet.
DIE KOPIEN AENDERN `tag` NICHT. Wer auf eine Kachel am Mittwoch
tippt, will den Termin bearbeiten -- und der faengt am Montag an.
Wuerde die Kopie `tag` auf den Mittwoch setzen, verschoebe ein
Speichern den Termin auf den Tag, an dem man zufaellig
hingetippt hat. Der Anzeigetag steht deshalb getrennt daneben. */
/** Der letzte Tag, an dem dieser Eintrag noch laeuft. */
function endTagVon(e) {
if (e.bis) return String(e.bis).slice(0, 10);
if (e.uhr && Number(e.dauer_min) > 0) {
const [st, mi] = e.uhr.split(':').map(Number);
const start = ausText(e.tag);
if (Number.isNaN(st) || Number.isNaN(start.getTime())) return e.tag;
/* AB MITTERNACHT RECHNEN, NICHT AB `ausText`. `ausText` legt den
Tag bewusst auf 12:00 UTC (damit Zeitzonen ihn nicht um einen
Tag verschieben) -- wer darauf die Uhrzeit ADDIERT, rechnet
zwoelf Stunden zu viel. Erster Anlauf ergab damit fuer
„13:00, 60 Minuten" den FOLGETAG. */
const mitternacht = Date.UTC(
start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate());
/* Minus eine Millisekunde: Ein Stream von 22:00 ueber genau zwei
Stunden endet um 00:00 -- er laeuft am naechsten Tag NICHT
mehr, auch wenn die Zahl dort steht. */
const endeMs = mitternacht
+ ((st * 60 + mi + Number(e.dauer_min)) * 60000) - 1;
return alsText(new Date(Math.max(endeMs, mitternacht)));
}
return e.tag;
}
/* Eine Obergrenze, die nicht schoen ist, aber ehrlich: Ein Eintrag
mit kaputtem Enddatum (Jahr 9999) wuerde sonst Millionen Kopien
bauen und den Browser anhalten. 400 Tage sind mehr als jede
Ansicht je zeigt -- die Grenze ist also nie im Weg und faengt nur
den Unfall ab. */
const SPANNE_MAX = 400;
function nachTag() {
const karte = new Map();
const lege = (tag, e) => {
if (!karte.has(tag)) karte.set(tag, []);
karte.get(tag).push(e);
};
for (const e of sichtbare()) {
if (!karte.has(e.tag)) karte.set(e.tag, []);
karte.get(e.tag).push(e);
const ende = endTagVon(e);
if (!ende || ende <= e.tag) { lege(e.tag, e); continue; }
const tage = Math.min(SPANNE_MAX,
Math.round((ausText(ende) - ausText(e.tag)) / 86400000) + 1);
let d = ausText(e.tag);
for (let i = 0; i < tage; i++) {
lege(alsText(d), {
...e,
/* Der Tag, an dem die Kachel steht -- NICHT `tag`. */
spann_tag: alsText(d),
spann_nr: i + 1,
spann_tage: tage,
spann_bis: ende,
spann_pos: i === 0 ? 'start' : (i === tage - 1 ? 'ende' : 'mitte'),
});
d = plus(d, 1);
}
}
return karte;
}
@@ -629,8 +711,38 @@
if (e.ziel) k.href = e.ziel;
k.style.setProperty('--pfarbe', e.farbe);
k.title = `${e.titel}${e.zusatz ? ' — ' + e.zusatz : ''}`
+ (e.serie_id ? ' — wiederholt sich' : '');
if (e.uhr) k.append(el('span', 'k-pille__zeit', e.uhr));
+ (e.serie_id ? ' — wiederholt sich' : '')
/* Der ganze Zeitraum, nicht nur „Tag 2/4": Wer am Mittwoch
draufzeigt, will wissen, WANN es anfing und aufhoert -- sonst
muss er selbst zurueckblaettern und zaehlen. */
+ (e.spann_tage > 1
? ` — läuft vom ${tagLang(e.tag)} bis ${tagLang(e.spann_bis)}`
+ ` (Tag ${e.spann_nr} von ${e.spann_tage})`
: '');
/* ---- LAEUFT UEBER MEHRERE TAGE (20.09.2026) --------------------
Drei Dinge unterscheiden die Kachel eines Zeitraums von der eines
Punkttermins, und alle drei sind noetig:
1. `data-spanne` -- daraus macht das Stilblatt einen
durchgehenden Balken: links angeschnitten, wo er gestern
schon lief, rechts angeschnitten, wo er morgen weiterlaeuft.
Man sieht an der FORM, dass es weitergeht, ohne ein Wort.
2. „Tag 2/4" statt der Uhrzeit auf den Folgetagen. Die Uhrzeit
gehoert zum Anfang; sie am Mittwoch zu wiederholen behauptet,
es ginge am Mittwoch um 20:00 wieder los.
3. Der ganze Zeitraum im Titel -- fuer Maus und Vorleseprogramm.
AUF DEM ANFANGSTAG BLEIBT ALLES WIE VORHER. Wer den Termin
eintraegt, sieht dort die Uhrzeit, die er eingetragen hat. */
if (e.spann_tage > 1) {
k.dataset.spanne = e.spann_pos;
k.style.setProperty('--spann-tage', String(e.spann_tage));
}
if (e.spann_tage > 1 && e.spann_pos !== 'start') {
k.append(el('span', 'k-pille__zeit k-pille__lauf',
`Tag ${e.spann_nr}/${e.spann_tage}`));
} else if (e.uhr) k.append(el('span', 'k-pille__zeit', e.uhr));
/* Das Zeichen steht im Raster VOR dem Titel, nicht dahinter: Eine
Zelle im Monatsraster ist gut 150 px breit, der Titel wird dort
abgeschnitten -- ein Zeichen am Ende wäre genau in der Ansicht
@@ -1355,7 +1467,16 @@
const liste = $('tagdialog-liste');
liste.replaceChildren();
const eintraege = sichtbare().filter((e) => e.tag === tag);
/* UEBER `nachTag()`, NICHT UEBER `e.tag` (20.09.2026).
Vorher stand hier ein eigener Filter auf den Anfangstag. Folge:
Im Monatsraster war die Aktion am Mittwoch markiert -- tippte man
die Zelle an, sagte der Tagesdialog „An diesem Tag steht
nichts." Zwei Antworten auf dieselbe Frage, und die zweite
widerspricht dem, was man gerade gesehen hat.
`nachTag()` ist die eine Stelle, die das entscheidet. */
const eintraege = nachTag().get(tag) || [];
if (!eintraege.length) {
liste.append(el('p', 'leise', 'An diesem Tag steht nichts.'));
} else {
+132
View File
@@ -1032,6 +1032,138 @@
const kopfRechts = document.querySelector('.kopfleiste__rechts');
if (kopfRechts) aufbauSuche(kopfRechts);
if (kopfRechts) aufbauChat(kopfRechts);
if (kopfRechts) aufbauInstallieren(kopfRechts);
/* =====================================================================
DIE SEITE ALS APP INSTALLIEREN (20.09.2026)
Filipe: „kannst du da dazwischen in der starseite oben, ein button
reinsetzen damit die leute die seite installieren koennen auf dem
handy oder pc. das soll auch verschwinden wenn die leute es
installiert haben."
WARUM ES DEN KNOPF BRAUCHT: Das Manifest ist seit Langem
vollstaendig -- die App LIESS sich installieren. Nur bot das
ausschliesslich der Browser selbst an, versteckt in seinem
Dreipunktemenue. Wer es nicht sucht, findet es nie. Und ohne
installierte App gibt es auf dem Handy keine verlaesslichen
Benachrichtigungen; genau daran hing im September das Telefonieren.
DREI ZUSTAENDE, UND JEDER BRAUCHT EINE ANDERE ANTWORT:
1. SCHON INSTALLIERT -> gar kein Knopf. Ein Angebot fuer etwas,
das man hat, ist Rauschen. Erkannt an `display-mode:
standalone` (und an Safaris eigenem `navigator.standalone`).
2. DER BROWSER BIETET ES AN (Chrome, Edge, Android) -> der Knopf
fragt ihn. `beforeinstallprompt` kommt EINMAL und muss
aufgehoben werden; wer ihn nicht festhaelt, kann spaeter
nicht mehr fragen.
3. SAFARI AUF DEM iPHONE -> dort gibt es `beforeinstallprompt`
NICHT, und es wird ihn nicht geben. Apple laesst nur den Weg
ueber „Teilen -> Zum Home-Bildschirm". Ein Knopf, der dort
nichts tut, waere schlimmer als keiner -- also sagt er in
diesem Fall, was zu tun ist, statt es zu versuchen.
WARUM IN DER KOPFLEISTE UND NICHT NUR AUF DER STARTSEITE: Die
Leiste steht auf allen 32 Seiten. Wer den Knopf einmal uebersieht,
sieht ihn beim naechsten Mal wieder -- und er verschwindet ohnehin,
sobald er ueberfluessig ist.
===================================================================== */
function aufbauInstallieren(wohin) {
const el = (tag, klasse, text) => {
const k = document.createElement(tag);
if (klasse) k.className = klasse;
if (text !== undefined) k.textContent = text;
return k;
};
/* ---- Zustand 1: schon installiert -> nichts tun --------------- */
const schonDrin = () =>
(window.matchMedia && window.matchMedia('(display-mode: standalone)').matches)
|| window.navigator.standalone === true;
if (schonDrin()) return;
/* Apple: kein `beforeinstallprompt`, aber ein Weg. */
const istApple = /iphone|ipad|ipod/i.test(navigator.userAgent)
|| (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
let angebot = null; // der aufgehobene Browser-Vorschlag
const knopf = el('button', 'install-knopf');
knopf.type = 'button';
knopf.hidden = true;
knopf.title = 'Diese Seite als App installieren';
/* DAS WORT VERSCHWINDET AM HANDY (siehe CSS) -- der Satz fuer
Vorleseprogramme nicht. Ein Knopf, der dort nur aus einem
Pfeil besteht, heisst sonst "Schaltflaeche". */
knopf.setAttribute('aria-label', 'Diese Seite als App installieren');
const zeichen = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
zeichen.setAttribute('viewBox', '0 0 24 24');
zeichen.setAttribute('class', 'install-knopf__zeichen');
zeichen.setAttribute('aria-hidden', 'true');
zeichen.innerHTML = '<path d="M12 3.5v11M8 11l4 4 4-4"/><path d="M5 18.5h14"/>';
knopf.append(zeichen, el('span', 'install-knopf__text', 'Installieren'));
knopf.addEventListener('click', async () => {
if (angebot) {
/* Zustand 2: den Browser fragen. Die Antwort interessiert uns
nur insofern, als ein angenommener Vorschlag den Knopf
ueberfluessig macht -- ein abgelehnter nicht: Vielleicht
ueberlegt man es sich morgen anders. */
knopf.disabled = true;
try {
angebot.prompt();
const { outcome } = await angebot.userChoice;
if (outcome === 'accepted') knopf.remove();
} catch { /* dann eben nicht */ }
angebot = null;
knopf.disabled = false;
return;
}
/* Zustand 3: erklaeren statt versuchen. */
window.frageNach?.({
titel: 'Als App auf dem Home-Bildschirm',
was: istApple
? 'Tippe unten in Safari auf das Teilen-Zeichen (Viereck mit Pfeil nach oben), '
+ 'dann auf „Zum Home-Bildschirm".'
: 'Öffne das Menü deines Browsers (die drei Punkte) und wähle dort '
+ '„App installieren" oder „Zum Startbildschirm hinzufügen".',
bleibt: 'Danach liegt die Seite wie eine App auf deinem Gerät – und '
+ 'Anrufe und Nachrichten kommen zuverlässiger an.',
ja: 'Alles klar',
nein: null,
});
});
wohin.prepend(knopf);
/* Der Browser meldet sich, wenn er es anbieten kann. */
window.addEventListener('beforeinstallprompt', (e) => {
/* Ohne `preventDefault` zeigt der Browser seine eigene Leiste --
zwei Angebote fuer dieselbe Sache sind eines zu viel. */
e.preventDefault();
angebot = e;
knopf.hidden = false;
});
/* Auf Apple gibt es diese Meldung nie -- dort steht der Knopf von
Anfang an da und erklaert den Weg. */
if (istApple) knopf.hidden = false;
/* Und wenn es geklappt hat, ist er fertig. */
window.addEventListener('appinstalled', () => knopf.remove());
/* Manche Browser melden `appinstalled` nicht -- dann faellt der
Knopf beim naechsten Oeffnen ueber `schonDrin()` weg. Und wer die
App waehrend der Sitzung installiert und zurueckwechselt, merkt
es hier: */
try {
window.matchMedia('(display-mode: standalone)')
.addEventListener('change', (m) => { if (m.matches) knopf.remove(); });
} catch { /* aeltere Browser koennen das nicht -- kein Grund zu scheitern */ }
}
/* ---------- Der Chat-Knopf mit Zähler -----------------------------------
+15 -15
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -291,14 +291,14 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/aufgaben.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/aufgaben.js?v=202609201909" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -168,13 +168,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/automation.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/automation.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -130,12 +130,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/befinden.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/befinden.js?v=202609201909" defer></script>
</body>
</html>
+19 -19
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -256,16 +256,16 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/checkliste.js?v=202609201907" defer></script>
<script src="assets/js/ampel.js?v=202609201907" defer></script>
<script src="assets/js/schulung.js?v=202609201907" defer></script>
<script src="assets/js/bereich.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/checkliste.js?v=202609201909" defer></script>
<script src="assets/js/ampel.js?v=202609201909" defer></script>
<script src="assets/js/schulung.js?v=202609201909" defer></script>
<script src="assets/js/bereich.js?v=202609201909" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</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=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/auskunft.js?v=202609201907" defer></script>
<script src="assets/js/bewerben.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/bewerben.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -80,13 +80,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/auskunft.js?v=202609201907" defer></script>
<script src="assets/js/bewerbungen.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/bewerbungen.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -89,14 +89,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/ki.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/calls.js?v=202609201907" defer></script>
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/calls.js?v=202609201909" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -384,18 +384,18 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609201907"></script>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907"></script>
<script src="assets/js/glocke.js?v=202609201907"></script>
<script src="assets/js/bereiche.js?v=202609201909"></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909"></script>
<script src="assets/js/glocke.js?v=202609201909"></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=202609201907"></script>
<script src="assets/js/chat.js?v=202609201907"></script>
<script src="assets/js/anruf.js?v=202609201909"></script>
<script src="assets/js/chat.js?v=202609201909"></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/content.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/content.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -179,14 +179,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/checkliste.js?v=202609201907" defer></script>
<script src="assets/js/content.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/checkliste.js?v=202609201909" defer></script>
<script src="assets/js/content.js?v=202609201909" defer></script>
</body>
</html>
+5 -5
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609201909" />
</head>
<body class="gate gate--crew">
@@ -358,6 +358,6 @@
␍
<script src="assets/js/gate.js?v=202609201907" defer></script>
<script src="assets/js/gate.js?v=202609201909" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609201907",
"src": "/assets/img/app-symbole/crew-192.png?v=202609201909",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609201907",
"src": "/assets/img/app-symbole/crew-512.png?v=202609201909",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609201907",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609201909",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609201907",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609201909",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -108,14 +108,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/dateien.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/dateien.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -106,12 +106,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/entwicklung.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/entwicklung.js?v=202609201909" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -146,12 +146,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/hilfe.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/hilfe.js?v=202609201909" defer></script>
</body>
</html>
+4 -4
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
</head>
<body class="gate">
@@ -411,6 +411,6 @@
</div>
␍␍
<script src="assets/js/gate.js?v=202609201907" defer></script>
<script src="assets/js/gate.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -383,14 +383,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/kalender.js?v=202609201907" defer></script>
<script src="assets/js/kalender-abo.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/kalender.js?v=202609201909" defer></script>
<script src="assets/js/kalender-abo.js?v=202609201909" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -444,12 +444,12 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609201907"></script>
<script src="assets/js/nachfrage.js?v=202609201907"></script>
<script src="assets/js/wahl.js?v=202609201907"></script>
<script src="assets/js/bereiche.js?v=202609201907"></script>
<script src="assets/js/kopf.js?v=202609201907"></script>
<script src="assets/js/glocke.js?v=202609201907"></script>
<script src="assets/js/leistung.js?v=202609201907"></script>
<script src="assets/js/meldung.js?v=202609201909"></script>
<script src="assets/js/nachfrage.js?v=202609201909"></script>
<script src="assets/js/wahl.js?v=202609201909"></script>
<script src="assets/js/bereiche.js?v=202609201909"></script>
<script src="assets/js/kopf.js?v=202609201909"></script>
<script src="assets/js/glocke.js?v=202609201909"></script>
<script src="assets/js/leistung.js?v=202609201909"></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -453,13 +453,13 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/personen.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/personen.js?v=202609201909" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -214,15 +214,15 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/steckbrief.js?v=202609201907" defer></script>
<script src="assets/js/profil.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/steckbrief.js?v=202609201909" defer></script>
<script src="assets/js/profil.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</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=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/rechte.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/rechte.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/report.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/report.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -106,14 +106,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/ki.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/report.js?v=202609201907" defer></script>
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/report.js?v=202609201909" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -173,13 +173,13 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/scouting.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/scouting.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -678,13 +678,13 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/start.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/start.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -85,14 +85,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/ki.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/startcheck.js?v=202609201907" defer></script>
<script src="assets/js/ki.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/startcheck.js?v=202609201909" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -150,15 +150,15 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/auskunft.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/steckbrief.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/steckbrief.js?v=202609201909" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -111,12 +111,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/talente.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/talente.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -110,12 +110,12 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/team.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/team.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/team.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</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=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/teamlage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/teamlage.js?v=202609201909" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -112,12 +112,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/teilen.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/teilen.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -126,12 +126,12 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/treff-moderation.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/treff-moderation.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</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=202609201907" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/auskunft.js?v=202609201907" defer></script>
<script src="assets/js/treff-regeln.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/auskunft.js?v=202609201909" defer></script>
<script src="assets/js/treff-regeln.js?v=202609201909" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -149,14 +149,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/uebersicht.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/uebersicht.js?v=202609201909" defer></script>
</body>
</html>
+12 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -217,11 +217,11 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609201909" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -144,11 +144,11 @@
</main>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>␍
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>␍
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/werdegang.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/werdegang.js?v=202609201909" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201907" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201907" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609201907" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201907" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609201909" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609201909" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/start.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609201909" />
<link rel="stylesheet" href="assets/css/module.css?v=202609201909" />
<!-- 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=202609201907" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609201909" />
</head>
<body class="start">
@@ -190,14 +190,14 @@
</main>
<script src="assets/js/meldung.js?v=202609201907" defer></script>
<script src="assets/js/hochladen.js?v=202609201907" defer></script>
<script src="assets/js/nachfrage.js?v=202609201907" defer></script>
<script src="assets/js/meldung.js?v=202609201909" defer></script>
<script src="assets/js/hochladen.js?v=202609201909" defer></script>
<script src="assets/js/nachfrage.js?v=202609201909" defer></script>
<script src="assets/js/wahl.js?v=202609201907" defer></script>
<script src="assets/js/bereiche.js?v=202609201907" defer></script>
<script src="assets/js/kopf.js?v=202609201907" defer></script>
<script src="assets/js/glocke.js?v=202609201907" defer></script>
<script src="assets/js/wissen.js?v=202609201907" defer></script>
<script src="assets/js/wahl.js?v=202609201909" defer></script>
<script src="assets/js/bereiche.js?v=202609201909" defer></script>
<script src="assets/js/kopf.js?v=202609201909" defer></script>
<script src="assets/js/glocke.js?v=202609201909" defer></script>
<script src="assets/js/wissen.js?v=202609201909" defer></script>
</body>
</html>