Benachrichtigungen: die Reaction laedt ein, jedes Haus bekommt sein Gesicht -- und die Videos haengen nicht mehr

Filipe, 29.09.2026: „ich will dass du die benarichtigungen
perfektionierst. dogfather und alle anderen sollen die
benachrichtigungen perfekt von dieser seite hier bekommen."
Und dazu, mit einer Bildschirmaufnahme: „wieso haengen die videos
immer."

=====================================================================
1. WARUM DIE VIDEOS HAENGEN -- zwei Zeilen, eine Rueckkopplung
=====================================================================

Die Aufnahme zeigt den YouTube-Zaehler bei 0:13 von 31:34, vier
Bilder lang unbewegt, in der Mitte der Ladering.

  a) `hostMelden()` rechnete `laeuft = getPlayerState() === 1`.
     Zustand 3 heisst PUFFERN -- „ich will spielen, mir fehlen
     gerade Daten". Der Host meldete in diesem Moment „laeuft
     nicht", und zwar sofort, weil `onStateChange` bei jedem
     Zustandswechsel meldet.

  b) `empfaenger()` fuegt den Host ausdruecklich hinzu, und
     `folgen(d)` lief im Ereignisstrom fuer alle -- auch fuer ihn.
     Seine eigene Meldung kam zurueck und traf dort auf
         if (!stand.laeuft && getPlayerState() === 1) pauseVideo();

  Der Host puffert eine halbe Sekunde, laeuft weiter -- und wird vom
  Echo seines eigenen Pufferers angehalten. Bei einem 31-Minuten-Video
  passiert das in den ersten Sekunden zuverlaessig.

  Und alle Zuschauer bekamen bei JEDEM Pufferer des Hosts ein
  Pause-Play-Paar. Das ist das Ruckeln, das man fuer die eigene
  Leitung haelt.

GEMESSEN, NICHT HERGELEITET (mess-reaktion):
    vorher   Host=laeuft -> Pufferer gemeldet -> Host=pause
    nachher  Host=laeuft -> Pufferer gemeldet -> Host=laeuft

Drei neue Messungen, jede mit Gegenprobe:
  · ein gemeldeter Pufferer haelt den Host nicht an
  · ein ECHTES Anhalten (Knopf gedrueckt) haelt alle an -- sonst
    waere das Erste mit kaputtem Gleichlauf bezahlt
  · beim Puffern meldet der Server `laeuft=true`; ist der Pufferer
    nicht herzustellen, sagt die Messung das (dritter Ausgang)
Beide Behebungen einzeln zurueckgenommen: beide Male rot.

Die erste Fassung der Gegenprobe war selbst falsch -- sie hielt das
Selbstheilen des Systems (der Host meldet alle fuenf Sekunden die
Wahrheit) fuer einen Fehler. Deshalb drueckt sie jetzt den Knopf,
statt eine Meldung zu faelschen.

=====================================================================
2. DIE REACTION LAEDT EIN
=====================================================================

Nachgemessen war `workspace-reaktion.js` STUMM: kein einziges
`benachrichtige`. Beim Einschalten lief `melden("reaktion", ...)`
ueber den Ereignisstrom -- also nur an Leute, die die Seite ohnehin
offen haben. Das Kino machte auf, und die Einladung verliess das Haus
nie. Dasselbe Muster wie bei den Bewerbungen am 23.09.

Neue Art `reaktion_live`, eigene neben `dogfather_live`: Das eine ist
sein Stream auf TikTok, das andere das Kino hier im Haus.

Eingeladen wird, wer ein Geraet hat und NICHT der Agentur gehoert
(`AGENTUR_ROLLEN` -- keine neue Liste). Nicht der, der eingeschaltet
hat. Und nicht zweimal: Eine Bremse von zwei Stunden faengt den
Neustart ab, denn das Merkmal haengt an `gestartet_am` und das wird
bei jedem Wechsel nach live neu gesetzt.

Geprueft Ende zu Ende in pruef-reaktion (+10): Sendung geht auf
Sendung, danach stehen genau fuenf Einladungen in `push_verschickt` --
rechte Hand, linke Hand, Modi, zweimal Community. Nicht der Host,
nicht die Creatorin. Einladung abgeschaltet: sechs Fehlschlaege.

=====================================================================
3. DARF DAS NACHTS KOMMEN? -- drei Antworten statt zwei
=====================================================================

Hier stand `art === "test" || art === "anruf"`, 230 Zeilen von der
Artenliste entfernt. Am 18.09. hat das eine Nacht lang alle Anrufe
verschluckt; behoben wurde damals dieser eine Fall.

GEMESSEN AM LIVE-BESTAND: `dogfather_live` ging an allen sieben
Abenden vom 22. bis 28.09. zwischen 20:28 und 21:06 raus -- jedes Mal
knapp vor der Sperre um 22 Uhr. Geht Filipe einmal um 22:05 live,
bekommt niemand etwas, und niemand erfaehrt warum.

`ruhe` steht jetzt an der ART:
  "immer" (Vorgabe)  22-7 gesperrt   -- Erinnerungen
  "spaet"            nur 1-7         -- etwas laeuft GERADE
  "nie"              nie             -- ein Mensch wartet am Hoerer

=====================================================================
4. JEDES HAUS BEKOMMT SEIN GESICHT
=====================================================================

Im Service Worker stand fest `workspace-192.png`. Von acht Menschen
mit angemeldetem Geraet gehoeren fuenf ins Crew-Haus -- die sahen auf
jeder Benachrichtigung das Symbol des Hauses, in dem sie nicht
arbeiten.

Entschieden wird es auf dem SERVER: Im Browser stuende sonst die
verborgene Crew-Adresse in einer Datei ohne Anmeldung (der Befund vom
21.09. bei crew-haus.css) -- und es waere eine zweite Fassung der
Hausteilung. Zweistufig, beide Stufen gibt es schon: die Zielseite,
wenn sie in genau ein Haus gehoert (GEHOERT_ZU_ADRESSE), sonst
`AGENTUR_ROLLEN`.

=====================================================================
5. DAS ABZEICHEN WAR EIN KLOTZ
=====================================================================

`badge` ist das winzige Zeichen in der Statusleiste; Android benutzt
davon NUR den Alphakanal. Dort stand dasselbe `workspace-192.png` --
ein vollflaechiges Quadrat ohne Transparenz, also ein ausgefuellter
Klotz. Es stuerzt nichts ab, deshalb faellt es niemandem auf.

`assets/img/abzeichen-96.png`: der gefuellte Umriss des Huskys, weiss
auf durchsichtig, 3,5 KB. Drei Fassungen gebaut und bei ECHTER Groesse
(24 px) verglichen -- Strichbild zerfaellt, Flaeche traegt.

`server/helfer-png-alpha.mjs` liest den Alphakanal wirklich (PNG
auspacken, Zeilenfilter zuruecknehmen). Eine Pruefung auf „die Datei
gibt es" haette den Klotz nie gefunden -- die Datei gab es ja. Die
Gegenprobe ist der alte Zustand selbst: dieselbe Rechnung meldet auf
`workspace-192.png` „kein Alphakanal, Deckung 100 %".

Das Abzeichen liegt NICHT bei den App-Symbolen -- `pruef-struktur`
verlangt dort zu jedem Namen den vollen Satz und hielt es fuer eine
neue App. Der Waechter hat recht: Ein Abzeichen ist kein App-Symbol.

=====================================================================
Gemessen: mess-reaktion 0, pruef-reaktion 393/0 (+10),
pruef-push-ziel 38/0 (+27), pruef-push 24/0, pruef-push-weg 20/0,
pruef-glocke 36/0, pruef-struktur 44/0, pruef-haus-trennung 100/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-29 23:48:46 +02:00
co-authored by Claude Opus 5
parent a43bc565ec
commit 2c3b90d75c
55 changed files with 1851 additions and 692 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+157
View File
@@ -0,0 +1,157 @@
/* =====================================================================
helfer-png-alpha.mjs — wie viel von einem PNG ist überhaupt da?
---------------------------------------------------------------------
WOFÜR
Das Abzeichen einer Benachrichtigung (`badge`) wird von Android
AUSSCHLIESSLICH über seinen Alphakanal gelesen und einfarbig weiß
gemalt. Alles Bunte daran geht verloren.
Bis zum 29.09.2026 stand dort ein vollflächiges App-Symbol ohne
Transparenz. Dessen Alphakanal ist überall voll — in der
Statusleiste erschien deshalb ein ausgefüllter Klotz. Es stürzt
nichts ab, es sieht nur billig aus, und genau deshalb fällt so
etwas niemandem als Fehler auf.
Eine Prüfung, die nur nachsieht, ob die DATEI existiert, hätte den
Klotz nie gefunden — sie existierte ja. Gefragt ist der Inhalt:
Deckt das Bild 12 Prozent seiner Fläche (ein Zeichen) oder 100
(ein Klotz)?
---------------------------------------------------------------------
WARUM SELBST GERECHNET
Im Haus gibt es keine Bildbibliothek für Node, und eine dafür zu
installieren wäre eine Abhängigkeit für vierzig Zeilen. PNG ist an
dieser Stelle einfach: Kopf lesen, die Datenblöcke
zusammenhängen, auspacken, die Zeilenfilter rückgängig machen.
`zlib` liegt in Node bei.
---------------------------------------------------------------------
DREI AUSGÄNGE, NICHT ZWEI
Diese Datei kann ein PNG auch NICHT lesen können — ein anderes
Farbformat, 16 Bit je Kanal, ein verschachteltes Bild. Dann sagt
sie das (`lesbar: false, grund: "…"`) und behauptet nicht, die
Deckung sei null. Eine Null sähe aus wie ein Befund und wäre eine
Ausrede.
===================================================================== */
import { readFileSync } from "node:fs";
import { inflateSync } from "node:zlib";
const MAGIE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
/** Wie viel eines PNG ist sichtbar?
*
* @returns {{lesbar: boolean, grund?: string, breite?: number,
* hoch?: number, deckung?: number, hatAlpha?: boolean}}
* `deckung` ist der Anteil der Bildpunkte mit Alpha über 127.
*/
export function pngDeckung(pfad) {
let roh;
try {
roh = readFileSync(pfad);
} catch (f) {
return { lesbar: false, grund: `nicht zu öffnen: ${f?.code || f?.message}` };
}
if (roh.length < 8 || !roh.subarray(0, 8).equals(MAGIE)) {
return { lesbar: false, grund: "kein PNG" };
}
/* ---- Die Blöcke durchgehen ---- */
let stelle = 8;
let kopf = null;
const daten = [];
while (stelle + 8 <= roh.length) {
const laenge = roh.readUInt32BE(stelle);
const art = roh.toString("ascii", stelle + 4, stelle + 8);
const inhalt = roh.subarray(stelle + 8, stelle + 8 + laenge);
if (art === "IHDR") {
kopf = {
breite: inhalt.readUInt32BE(0),
hoch: inhalt.readUInt32BE(4),
tiefe: inhalt[8],
farbe: inhalt[9],
verschachtelt: inhalt[12],
};
} else if (art === "IDAT") {
daten.push(inhalt);
} else if (art === "IEND") {
break;
}
stelle += 12 + laenge; // Länge + Art + Inhalt + Prüfsumme
}
if (!kopf) return { lesbar: false, grund: "kein Kopf (IHDR)" };
/* ---- Was diese Datei kann, und was nicht ---- */
const hatAlpha = kopf.farbe === 6 || kopf.farbe === 4;
if (!hatAlpha) {
/* KEIN ALPHAKANAL heißt: das Bild ist überall voll. Das ist eine
Antwort und kein Unvermögen -- genau dieser Fall war der Klotz
in der Statusleiste. */
return { lesbar: true, hatAlpha: false, deckung: 1,
breite: kopf.breite, hoch: kopf.hoch };
}
if (kopf.tiefe !== 8) {
return { lesbar: false, grund: `${kopf.tiefe} Bit je Kanal, ich kann nur 8` };
}
if (kopf.verschachtelt) {
return { lesbar: false, grund: "verschachtelt (Adam7)" };
}
if (!daten.length) return { lesbar: false, grund: "keine Bilddaten" };
let aus;
try {
aus = inflateSync(Buffer.concat(daten));
} catch (f) {
return { lesbar: false, grund: `nicht auszupacken: ${f?.message}` };
}
/* ---- Die Zeilenfilter rückgängig machen ----
PNG speichert jede Zeile mit einem Filterbyte davor. Ohne das
Rückrechnen stünden dort Differenzen und keine Farbwerte -- und
eine Deckung, die aus Differenzen gerechnet ist, wäre eine Zahl
ohne Bedeutung, die trotzdem plausibel aussieht. */
const kanaele = kopf.farbe === 6 ? 4 : 2; // RGBA oder Grau+Alpha
const zeileBytes = kopf.breite * kanaele;
const noetig = (zeileBytes + 1) * kopf.hoch;
if (aus.length < noetig) {
return { lesbar: false, grund: `zu wenig Daten (${aus.length} statt ${noetig})` };
}
let voll = 0;
let vorige = Buffer.alloc(zeileBytes);
let p = 0;
for (let y = 0; y < kopf.hoch; y++) {
const filter = aus[p++];
const zeile = Buffer.from(aus.subarray(p, p + zeileBytes));
p += zeileBytes;
for (let i = 0; i < zeileBytes; i++) {
const a = i >= kanaele ? zeile[i - kanaele] : 0; // links
const b = vorige[i]; // oben
const c = i >= kanaele ? vorige[i - kanaele] : 0; // oben links
let w = zeile[i];
if (filter === 1) w += a;
else if (filter === 2) w += b;
else if (filter === 3) w += (a + b) >> 1;
else if (filter === 4) {
const s = a + b - c;
const da = Math.abs(s - a), dbb = Math.abs(s - b), dc = Math.abs(s - c);
w += (da <= dbb && da <= dc) ? a : (dbb <= dc ? b : c);
}
zeile[i] = w & 0xff;
}
for (let x = kanaele - 1; x < zeileBytes; x += kanaele) {
if (zeile[x] > 127) voll++;
}
vorige = zeile;
}
return {
lesbar: true, hatAlpha: true,
breite: kopf.breite, hoch: kopf.hoch,
deckung: voll / (kopf.breite * kopf.hoch),
};
}
+144
View File
@@ -393,6 +393,150 @@ if (stehen) {
ausgang = 1; ausgang = 1;
} }
/* =====================================================================
HAENGT DAS VIDEO? -- der Host darf sich nicht selbst anhalten
===================================================================== */
console.log("");
console.log("=== Der Gleichlauf des Videos ===");
{
/* Wie ein Pufferer aussieht, wenn er gemeldet wird: `laeuft:false`
bei einem Spieler, der in Wahrheit laeuft. Genau das schickt
`hostMelden()` im YouTube-Zustand 3. */
const pufferer = (seite) => seite.evaluate(async () => {
const stelle = document.getElementById("video-platz")?.dataset.spieler;
const a = await fetch("/workspace/api/reaktion/video", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ laeuft: false, sekunde: 7 }),
});
return { vorher: stelle, code: a.status };
});
const stand = (seite) => seite.evaluate(
() => document.getElementById("video-platz")?.dataset.spieler || "(nichts)");
/* Erst sicherstellen, dass ueberhaupt etwas laeuft -- sonst misst
die Pruefung ein stehendes Video und nennt das Erfolg. */
const vorHost = await stand(host.seite);
const vorZu = await stand(zuschauer.seite);
console.log(` Vorher: Host=${vorHost} Zuschauerin=${vorZu}`);
const laeuftVorher = (w) => w === "laeuft" || w === "puffert";
if (!laeuftVorher(vorHost) || !laeuftVorher(vorZu)) {
console.log(" ACHTUNG: Vor der Messung laeuft schon nichts -- "
+ "die Frage laesst sich so nicht beantworten.");
ausgang = 1;
} else {
const p = await pufferer(host.seite);
console.log(` Ein Pufferer wird gemeldet: ${p.code}`);
await host.seite.waitForTimeout(2000);
await zuschauer.seite.waitForTimeout(500);
const nachHost = await stand(host.seite);
const nachZu = await stand(zuschauer.seite);
console.log(` Danach: Host=${nachHost} Zuschauerin=${nachZu}`);
/* DER BEFUND. Der Host hat nichts angehalten -- er hat nur
gemeldet, dass gerade Daten fehlen. Steht sein Video danach,
hat sein eigenes Echo es angehalten. */
if (!laeuftVorher(nachHost)) {
console.log(" ACHTUNG: Der Host haelt sich selbst an. Ein kurzer "
+ "Pufferer meldet 'laeuft nicht', das Echo kommt zurueck und "
+ "drueckt Pause -- deshalb haengt das Video.");
ausgang = 1;
}
/* ---- DIE GEGENPROBE: ein ECHTES Anhalten wirkt weiter ------
Ohne sie waere „der Host folgt sich nicht selbst" womoeglich
mit einem kaputten Gleichlauf fuer alle bezahlt.
GEDRUECKT WIRD DER KNOPF, nicht eine Meldung gefaelscht. Bei
einem echten Anhalten meldet der Host durchgehend „steht" --
die Antwort haengt damit nicht am Zufall seines
Fuenf-Sekunden-Taktes. Die erste Fassung dieser Gegenprobe hat
genau daran Alarm geschlagen: Sie hielt das Selbstheilen des
Systems fuer einen Fehler. */
await host.seite.evaluate(() => document.getElementById("v-spiel")?.click());
await host.seite.waitForTimeout(1800);
const haltHost = await stand(host.seite);
const haltZu = await stand(zuschauer.seite);
console.log(` Host haelt wirklich an: Host=${haltHost} Zuschauerin=${haltZu}`);
if (haltHost === "laeuft" || haltZu === "laeuft") {
console.log(" ACHTUNG: Ein echtes Anhalten des Hosts kommt nicht an -- "
+ "dann laeuft niemand mehr synchron.");
ausgang = 1;
}
/* Und wieder los, mit demselben Knopf. */
await host.seite.evaluate(() => document.getElementById("v-spiel")?.click());
await host.seite.waitForTimeout(2000);
const weiterHost = await stand(host.seite);
const weiterZu = await stand(zuschauer.seite);
console.log(` Und wieder los: Host=${weiterHost} Zuschauerin=${weiterZu}`);
if (!laeuftVorher(weiterHost) || !laeuftVorher(weiterZu)) {
console.log(" ACHTUNG: Nach dem Anhalten laeuft es nicht wieder an.");
ausgang = 1;
}
/* ---- DER KERN: was meldet der Host, WAEHREND er puffert? ----
Die beiden Teile darueber pruefen die Folge. Sie blieben auch
gruen, wenn der Host beim Puffern weiter „steht" meldete --
die Zuschauer ruckelten dann bei jedem Pufferer, und niemand
saehe es hier.
Puffern wird hergestellt: weit nach vorn springen, wohin noch
nichts geladen ist. Ob das GELINGT, ist nicht sicher -- auf
einer schnellen Leitung kann der Sprung fertig sein, bevor
jemand hinsieht. Deshalb der dritte Ausgang. */
let gesehen = null;
for (let i = 0; i < 8 && !gesehen; i++) {
await host.seite.evaluate(() => {
for (let n = 0; n < 12; n++) document.getElementById("v-vor")?.click();
});
for (let t = 0; t < 14 && !gesehen; t++) {
const w = await host.seite.evaluate(() => ({
spieler: document.getElementById("video-platz")?.dataset.spieler,
}));
if (w.spieler === "puffert") {
/* SOFORT NACHSEHEN, was der Server jetzt weiss. Eine
Sekunde spaeter ist der Pufferer vorbei und die Antwort
nichts mehr wert. */
gesehen = await host.seite.evaluate(async () => {
const a = await fetch("/workspace/api/reaktion", { credentials: "same-origin" });
const j = await a.json();
return { laeuft: j.laeuft, stand: document.getElementById("video-platz")?.dataset.spieler };
});
}
await host.seite.waitForTimeout(120);
}
}
if (!gesehen) {
console.log(" HINWEIS: Ein Pufferer war hier nicht herzustellen "
+ "(schnelle Leitung) -- was der Host dabei meldet, konnte ich "
+ "nicht nachsehen.");
offenePunkte.push("Was der Host beim Puffern meldet, war in diesem "
+ "Lauf nicht messbar -- der Sprung war zu schnell geladen.");
} else {
console.log(` Beim Puffern meldet der Server: laeuft=${gesehen.laeuft} `
+ `(Spieler: ${gesehen.stand})`);
if (!gesehen.laeuft) {
console.log(" ACHTUNG: Der Host meldet beim Puffern 'laeuft nicht'. "
+ "Dann bekommt jeder Zuschauer bei jedem Stocken der Hostleitung "
+ "ein Pause-Play-Paar -- das ist das Ruckeln.");
ausgang = 1;
}
}
/* Und wieder anlaufen lassen, damit die folgenden Messungen ein
laufendes Video vorfinden. */
await host.seite.evaluate(() => fetch("/workspace/api/reaktion/video", {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ laeuft: true, sekunde: 7 }),
}));
await host.seite.waitForTimeout(1200);
}
}
/* ---- Die Regie --------------------------------------------------- /* ---- Die Regie ---------------------------------------------------
NICHT UMSCHALTEN, SONDERN HERSTELLEN. Ein Klick auf „Griff" heisst NICHT UMSCHALTEN, SONDERN HERSTELLEN. Ein Klick auf „Griff" heisst
„das Gegenteil von dem, was gerade ist" -- und setzt damit voraus, „das Gegenteil von dem, was gerade ist" -- und setzt damit voraus,
+201
View File
@@ -48,6 +48,27 @@ process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
/* ---- DIE RUHEZEIT WIRD HERGESTELLT, NICHT ABGEWARTET -------------
Ab dem 29.09.2026 traegt jede Art ihre eigene Ruheregel. Um zu
pruefen, dass sie wirkt, muss Ruhezeit sein -- und darauf bis 22
Uhr zu warten waere keine Pruefung, sondern ein Kalendereintrag.
PUSH_RUHE_AB = 0 „gesperrt ab Stunde 0“ -> „immer“ ist IMMER
Ruhezeit, zu jeder Tageszeit.
PUSH_SPAET_AB = 24 „gesperrt ab Stunde 24" -- die es nicht gibt
-> „spaet“ ist NIE gesperrt.
Beides zusammen macht den Unterschied zwischen den Regeln
unabhaengig von der Uhr sichtbar. Ohne das waere diese Pruefung
eine Zeitbombe: gruen am Nachmittag, rot um halb drei nachts, und
beides ohne Aussage ueber die Software.
DIE VORHANDENEN ELF PRUEFUNGEN BLEIBEN UNBERUEHRT -- sie benutzen
alle die Art „test“, und die traegt `ruhe: "nie"`. */
process.env.PUSH_RUHE_AB = "0";
process.env.PUSH_SPAET_AB = "24";
const express = (await import("express")).default; const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
@@ -213,6 +234,186 @@ melde("=== 4. Der Weg ===");
} }
/* ------------------------------------------------------------------- */ /* ------------------------------------------------------------------- */
/* =======================================================================
DAS GESICHT DES HAUSES (29.09.2026)
=======================================================================
Im Service Worker stand fest `workspace-192.png` -- das Symbol der
Agentur. Gemessen am Live-Bestand gehoeren fuenf von acht Menschen
mit angemeldetem Geraet ins Crew-Haus; die sahen auf JEDER
Benachrichtigung das Symbol des Hauses, in dem sie nicht arbeiten.
Entschieden wird es auf dem Server und nicht im Browser: Dort
stuende sonst die verborgene Crew-Adresse in einer Datei, die ohne
Anmeldung abrufbar ist -- genau der Befund vom 21.09. bei
crew-haus.css.
======================================================================= */
melde("");
melde("=== Das Gesicht des Hauses ===");
{
const m = await push.benachrichtige(idModi, "test",
{ titel: "x", text: "y", ziel: "/workspace/start.html" });
ok(m.haus === "crew", `ein Modi bekommt das Crew-Gesicht (${m.haus})`);
const g = await push.benachrichtige(idMana, "test",
{ titel: "x", text: "y", ziel: "/workspace/start.html" });
ok(g.haus === "agentur", `eine Managerin das der Agentur (${g.haus})`);
/* Dass die beiden VERSCHIEDEN sind, ist die eigentliche Aussage --
eine Funktion, die immer „agentur“ sagt, haette die zweite Zeile
bestanden und die erste nicht. */
ok(m.haus !== g.haus, "die beiden Haeuser bekommen nicht dasselbe Gesicht");
/* DIE SEITE SCHLAEGT DIE ROLLE. DogFather arbeitet in beiden
Haeusern; eine Einladung ins Crew-Kino traegt trotzdem das
Crew-Gesicht, weil `/workspace/reaktion.html` in genau ein Haus
gehoert (GEHOERT_ZU_ADRESSE). */
const r = await push.benachrichtige(idDogi, "test",
{ titel: "x", text: "y", ziel: "/workspace/reaktion.html" });
ok(r.haus === "crew",
`eine Einladung zur Reaction traegt das Crew-Gesicht (${r.haus})`);
/* Gegenprobe zur Zeile darueber: Dieselbe Person, ein neutrales
Ziel -- die Seite entscheidet also wirklich, nicht die Person
allein. Waere es umgekehrt, stuende hier zweimal dasselbe. */
const n = await push.benachrichtige(idMana, "test",
{ titel: "x", text: "y", ziel: "/workspace/reaktion.html" });
ok(n.haus === "crew",
`auch fuer die Agentur, wenn das ZIEL im Crew-Haus liegt (${n.haus})`);
}
/* =======================================================================
DAS ABZEICHEN -- ein Zeichen oder ein Klotz?
=======================================================================
Das `badge` ist das winzige Zeichen oben in der Statusleiste. Android
liest davon AUSSCHLIESSLICH den Alphakanal und malt ihn einfarbig
weiss.
Bis zum 29.09.2026 stand dort dasselbe `workspace-192.png` wie beim
Symbol -- ein vollflaechiges Quadrat OHNE Alphakanal. In der
Statusleiste erschien deshalb ein ausgefuellter Klotz. Es stuerzt
nichts ab, es sieht nur billig aus, und genau deshalb faellt so
etwas niemandem als Fehler auf.
EINE PRUEFUNG AUF „DIE DATEI GIBT ES“ HAETTE DAS NIE GEFUNDEN -- die
Datei gab es ja. Gefragt ist der INHALT.
======================================================================= */
melde("");
melde("=== Das Abzeichen ===");
{
const { readFileSync } = await import("node:fs");
const { dirname, join: fuege } = await import("node:path");
const { fileURLToPath } = await import("node:url");
const { pngDeckung } = await import("./helfer-png-alpha.mjs");
const HIER = dirname(fileURLToPath(import.meta.url));
const REPO = fuege(HIER, "..");
const sw = readFileSync(fuege(REPO, "workspace", "sw.js"), "utf8");
/* ABGELESEN, NICHT ABGESCHRIEBEN: Der Pfad kommt aus dem Service
Worker selbst. Stuende hier der Name noch einmal, pruefte die
Zeile ihre eigene Kopie. */
const wo = /badge:\s*"([^"]+)"/.exec(sw);
ok(!!wo, `der Service Worker nennt ein Abzeichen (${wo?.[1] || "keins"})`);
const datei = fuege(REPO, (wo?.[1] || "").replace(/^\//, ""));
const e = pngDeckung(datei);
ok(e.lesbar, `es liegt als lesbares PNG vor (${e.grund || `${e.breite}x${e.hoch}`})`);
ok(e.hatAlpha === true, "es hat einen Alphakanal -- sonst ist es ein Klotz");
/* ZWISCHEN STAUBKORN UND KLOTZ. Unter 10 % ist in der Statusleiste
nichts mehr zu sehen, ueber 80 % ist es wieder die Flaeche, die
wir gerade abgeschafft haben. */
ok(e.deckung > 0.10 && e.deckung < 0.80,
`und deckt ${(e.deckung * 100).toFixed(0)} % seiner Flaeche (10-80 erwartet)`);
/* ---- DIE GEGENPROBE, und sie ist der alte Zustand selbst -------
Dieselbe Rechnung auf das App-Symbol, das bis zum 29.09. als
Abzeichen diente. Meldet sie dort nicht „kein Alphakanal, 100 %",
kann sie den Unterschied nicht sehen -- und alles darueber waere
wertlos. */
const alt = pngDeckung(fuege(REPO, "assets/img/app-symbole/workspace-192.png"));
ok(alt.lesbar && alt.hatAlpha === false && alt.deckung === 1,
`Gegenprobe: das alte Abzeichen wird als Klotz erkannt `
+ `(Alpha ${alt.hatAlpha}, Deckung ${alt.deckung})`);
/* Und die zwei Gesichter muss es wirklich geben -- ein Symbol, das
404 antwortet, zeigt Android gar nicht an. */
for (const n of ["crew-192.png", "workspace-192.png"]) {
const g = pngDeckung(fuege(REPO, "assets/img/app-symbole", n));
ok(g.lesbar, `${n} liegt vor (${g.grund || `${g.breite}x${g.hoch}`})`);
ok(sw.includes(n), `und der Service Worker nennt es`);
}
}
/* =======================================================================
DARF DAS NACHTS KOMMEN? -- drei Antworten statt zwei
=======================================================================
Bis zum 29.09.2026 stand die Antwort als fest verdrahtete
Aufzaehlung in `benachrichtige`, 230 Zeilen von der Artenliste
entfernt:
const dringend = art === "test" || art === "anruf";
Am 18.09. hat genau das eine Nacht lang alle Anrufe verschluckt.
Behoben wurde damals dieser eine Fall; die Frage dahinter blieb
stehen, und `dogfather_live` fiel bis heute in dieselbe Falle.
======================================================================= */
melde("");
melde("=== Darf das nachts kommen? ===");
{
/* FESTE STUNDEN ALS EINGABE, nicht als Annahme ueber „jetzt". Ein
Datum, das der Kalender einholt, waere eine Zeitbombe -- so wie
die Weckerpruefung am 07.09. */
const um23 = new Date(2026, 8, 29, 23, 0, 0);
const um3 = new Date(2026, 8, 30, 3, 0, 0);
const um15 = new Date(2026, 8, 29, 15, 0, 0);
/* Die Umgebung ist oben umgestellt; fuer die reine Rechnung wird
hier die Vorgabe gefragt -- die drei Regeln, nicht die Zahlen. */
ok(push.ruheRegel("aufgabe_faellig") === "immer",
"eine Erinnerung traegt „immer“");
ok(push.ruheRegel("anruf") === "nie", "ein Anruf traegt „nie“");
ok(push.ruheRegel("dogfather_live") === "spaet",
"„DogFather ist live“ traegt „spaet“");
ok(push.ruheRegel("reaktion_live") === "spaet",
"die Reaction-Einladung auch");
ok(push.ruheRegel("gibtsnicht") === "immer",
"eine unbekannte Art bekommt die strengste Regel");
/* Die Rechnung selbst -- mit den Grenzen dieses Laufs (ab 0 bzw.
nie). Dass die Vorgaben 22 und 1 sind, steht in der Artenliste;
hier wird geprueft, dass die REGELN verschieden wirken. */
ok(push.istRuhezeit(um23, "immer") === true, "um 23 Uhr ist „immer“ gesperrt");
ok(push.istRuhezeit(um23, "nie") === false, "„nie“ nicht");
ok(push.istRuhezeit(um15, "immer") === true,
"in diesem Lauf ist „immer“ rund um die Uhr gesperrt (hergestellt)");
ok(push.istRuhezeit(um3, "spaet") === false,
"und „spaet“ nie (hergestellt)");
/* ---- UND JETZT DAS VERHALTEN, nicht die Rechnung --------------
Eine Prüfung der Formel allein sagt nichts darueber, ob
`benachrichtige` sie auch BENUTZT. Genau diese Luecke war der
Fehler: Die Formel war richtig, die Aufzaehlung daneben nicht. */
const erinnerung = await push.benachrichtige(idHand, "aufgabe_faellig",
{ titel: "x", text: "y", ziel: "/workspace/aufgaben.html" });
ok(erinnerung.grund === "ruhezeit",
`eine Erinnerung wird nachts zurueckgehalten (${erinnerung.grund})`);
const live = await push.benachrichtige(idHand, "dogfather_live",
{ titel: "x", text: "y", ziel: "/workspace/unsere-seiten.html" });
ok(live.verschickt === 1,
`„DogFather ist live“ geht trotzdem raus (${live.verschickt}, ${live.grund})`);
const kino = await push.benachrichtige(idHand, "reaktion_live",
{ titel: "x", text: "y", ziel: "/workspace/reaktion.html" });
ok(kino.verschickt === 1,
`die Einladung zur Reaction auch (${kino.verschickt}, ${kino.grund})`);
const ruf = await push.benachrichtige(idHand, "anruf",
{ titel: "x", text: "y", ziel: "/workspace/chat.html" });
ok(ruf.verschickt === 1, `und ein Anruf erst recht (${ruf.verschickt})`);
}
melde(""); melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`); melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler ? "NICHT IN ORDNUNG" : "ALLES IN ORDNUNG"); melde(fehler ? "NICHT IN ORDNUNG" : "ALLES IN ORDNUNG");
+135
View File
@@ -45,6 +45,19 @@ process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
den niemand prueft, weil das Pruefen zu lange dauert, ist ein den niemand prueft, weil das Pruefen zu lange dauert, ist ein
ungeprueftes Verhalten. */ ungeprueftes Verhalten. */
process.env.REAKTION_LISTE_MAX = "3"; process.env.REAKTION_LISTE_MAX = "3";
/* DIE EINLADUNG DARF NICHT AN DER UHR SCHEITERN.
`reaktion_live` traegt die Ruheregel „spaet" -- gesperrt ist damit
nur zwischen 1 und 7 Uhr. Liefe diese Pruefung um halb drei nachts,
waere sie rot, ohne dass an der Software etwas kaputt ist: genau die
Zeitbombe, die in den Hausregeln steht und die am 07.09. schon die
Weckerpruefung getroffen hat.
`PUSH_SPAET_AB = 24` heisst: „gesperrt ab Stunde 24" -- die es nicht
gibt. Damit ist „spaet" hier NIE gesperrt, zu jeder Tageszeit. Die
Grenze selbst wird in pruef-push-ziel mit festen Stunden geprueft,
wo sie hingehoert: als EINGABE, nicht als Annahme ueber „jetzt". */
process.env.PUSH_SPAET_AB = "24";
const express = (await import("express")).default; const express = (await import("express")).default;
const ec = express.response.cookie; const ec = express.response.cookie;
@@ -2424,6 +2437,128 @@ melde("=== 21. Alles zuruecksetzen ===");
}); });
} }
/* =======================================================================
DIE EINLADUNG -- geht sie raus, und an die Richtigen?
=======================================================================
Filipe, 29.09.2026: „dogfather und alle anderen sollen die
benachrichtigungen perfekt von dieser seite hier bekommen."
Bis zu diesem Tag verliess die Reaction das Haus nie. Sie rief beim
Einschalten `melden("reaktion", ...)`, und das laeuft ueber den
Ereignisstrom -- also NUR zu Leuten, die die Seite ohnehin offen
haben. Wer nicht hinschaut, erfuhr nichts.
GEPRUEFT WIRD DAS VERHALTEN, NICHT DER QUELLTEXT. Eine Textsuche
nach „benachrichtige" waere gruen gewesen, sobald das Wort irgendwo
steht -- auch in einem Zweig, den nichts aufruft. Hier geht die
Sendung wirklich auf Sendung, und danach wird nachgesehen, was in
`push_verschickt` steht.
======================================================================= */
melde("");
melde("=== Die Einladung ===");
{
const { createServer } = await import("node:http");
const { createECDH } = await import("node:crypto");
/* Ein Push-Dienst, der alles annimmt. Er muss nichts entschluesseln
-- gefragt ist, WER eine bekommt. Dass der Inhalt unterwegs heil
bleibt, beweist pruef-push-weg mit einem nachgebauten Browser. */
const dienstPort = await eigenerPort(import.meta, "pruef-reaktion (Push-Dienst)", 1);
const dienst = createServer((q, a) => {
q.on("data", () => {});
q.on("end", () => { a.writeHead(201); a.end(); });
});
await new Promise((r) => dienst.listen(dienstPort, "127.0.0.1", r));
/* Erst zu -- sonst waere der naechste Schritt kein UEBERGANG nach
live, und eingeladen wird nur beim Uebergang. */
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "zu" } });
const db2 = new DatabaseSync(process.env.WORKSPACE_DB);
/* Je ein Geraet fuer JEDEN -- auch fuer die, die keine Einladung
bekommen sollen. Ohne ihr Geraet waere „hat nichts bekommen" die
Antwort auf die falsche Frage: Man wuesste nicht, ob die Auswahl
greift oder ob nur kein Telefon da war. */
for (const rolle of ["admin", "hand", "linke", "modi", "gast", "gast2", "creator"]) {
const kk = createECDH("prime256v1");
kk.generateKeys();
db2.prepare(`INSERT INTO push_anmeldungen (person_id, endpunkt, p256dh, auth, erstellt)
VALUES (?,?,?,?,?)`)
.run(IDS[rolle], `http://127.0.0.1:${dienstPort}/push/${rolle}`,
kk.getPublicKey().toString("base64url"),
randomBytes(16).toString("base64url"), nun);
}
db2.close();
const anSendung = await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "live" } });
ok(anSendung.code === 200, `auf Sendung (${anSendung.code})`);
/* Die Einladung wird losgeschickt und nicht abgewartet -- der Knopf
„Auf Sendung" soll sofort reagieren. Also hier warten, wo Warten
nichts kostet. */
await new Promise((r) => setTimeout(r, 2500));
const lies = () => {
const db3 = new DatabaseSync(process.env.WORKSPACE_DB);
const z = db3.prepare(
`SELECT person_id FROM push_verschickt WHERE merkmal LIKE 'reaktion_live:%'`).all();
db3.close();
return new Set(z.map((x) => x.person_id));
};
const bekommen = lies();
const sollen = [["hand", "die rechte Hand"], ["linke", "die linke Hand"],
["modi", "ein Modi"], ["gast", "die Community"], ["gast2", "noch jemand aus der Community"]];
for (const [rolle, wort] of sollen) {
ok(bekommen.has(IDS[rolle]), `${wort} wird eingeladen`);
}
/* WER EINGESCHALTET HAT, BEKOMMT KEINE. Er hat gerade den Knopf
gedrueckt; eine Einladung zu etwas, das man selbst aufgemacht
hat, ist Rauschen. */
ok(!bekommen.has(IDS.admin),
"wer eingeschaltet hat, bekommt keine Einladung");
/* DAS ANDERE HAUS BLEIBT AUSSEN VOR. Fuer eine Creatorin gibt es
`reaktion.html` nicht -- sie bekaeme eine Meldung, die sie auf
ihre Startseite wirft. Eine Benachrichtigung, die nirgendwohin
fuehrt, ist schlimmer als keine. */
ok(!bekommen.has(IDS.creator),
"die Agentur bekommt keine Einladung ins Crew-Kino");
ok(bekommen.size === 5,
`genau fuenf Einladungen, nicht mehr (${bekommen.size})`);
/* ---- Die Bremse gegen den Neustart ---------------------------
Wer aus Versehen auf „Vorbereitung" und gleich wieder auf „Auf
Sendung" drueckt, laedt sonst zweimal ein. Fuenf Menschen
bekaemen zwei Meldungen fuer dieselbe Sendung -- der schnellste
Weg, dass jemand die Art abschaltet, und dann fehlt auch die
naechste. */
const db4 = new DatabaseSync(process.env.WORKSPACE_DB);
const vorher = db4.prepare(
`SELECT COUNT(*) AS n FROM push_verschickt WHERE merkmal LIKE 'reaktion_live:%'`).get().n;
db4.close();
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "vorbereitung" } });
await roh(CREW, "/workspace/api/reaktion/stand",
{ method: "POST", keks: k.admin, rumpf: { stand: "live" } });
await new Promise((r) => setTimeout(r, 2000));
const db5 = new DatabaseSync(process.env.WORKSPACE_DB);
const nachher = db5.prepare(
`SELECT COUNT(*) AS n FROM push_verschickt WHERE merkmal LIKE 'reaktion_live:%'`).get().n;
db5.close();
ok(nachher === vorher,
`ein Neustart laedt nicht noch einmal ein (${vorher} -> ${nachher})`);
await new Promise((r) => dienst.close(r));
}
melde(""); melde("");
melde(`${geprueft} Pruefungen, ${fehler} Fehler`); melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG"); melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
+170 -18
View File
@@ -58,6 +58,10 @@ import {
gehoertAufDieseAdresse, TEAM_DOGI_ROLLEN, gehoertAufDieseAdresse, TEAM_DOGI_ROLLEN,
} from "./workspace.js"; } from "./workspace.js";
import { schluesselErzeugen, schicken } from "./workspace-push-krypto.js"; import { schluesselErzeugen, schicken } from "./workspace-push-krypto.js";
/* Die Hausteilung kommt aus der Datei, in der sie steht -- nicht aus
einer zweiten Fassung hier. `crew-adresse.js` haengt von nichts ab
(nur von node:fs/path), ein Kreis entsteht also nicht. */
import { AGENTUR_ROLLEN, GEHOERT_ZU_ADRESSE, istCrewAdresse } from "./crew-adresse.js";
import { rhythmus as befindenRhythmus } from "./workspace-befinden.js"; import { rhythmus as befindenRhythmus } from "./workspace-befinden.js";
import { SEITEN } from "./rechte.js"; import { SEITEN } from "./rechte.js";
@@ -70,6 +74,41 @@ const jetzt = () => new Date().toISOString();
eine bewusste Auswahl, keine Nutzdaten. Wer eine neue Art braucht, eine bewusste Auswahl, keine Nutzdaten. Wer eine neue Art braucht,
traegt sie hier ein und sie erscheint von selbst in den traegt sie hier ein und sie erscheint von selbst in den
Einstellungen. Einstellungen.
---------------------------------------------------------------------
`ruhe` -- DARF DAS NACHTS KOMMEN? (29.09.2026)
Bis hierher stand das als fest verdrahtete Aufzaehlung 230 Zeilen
weiter unten in `benachrichtige`:
const dringend = art === "test" || art === "anruf";
Wer eine neue Art eintrug, sah sie nicht -- und diese Liste sagte
ueber die Ruhezeit kein Wort, obwohl sie darueber entscheidet, ob
eine Meldung jemals ankommt. Am 18.09. hat genau das eine Nacht
lang alle Anrufe verschluckt; damals wurde EINE Art ausgenommen,
statt die Frage zu stellen.
DREI ANTWORTEN, WEIL ES DREI FAELLE GIBT:
"immer" (Vorgabe) 22-7 gesperrt.
Erinnerungen. Der Server schickt sie von sich aus, weil
eine Frist naeher rueckt -- die kann bis morgen warten.
"spaet" nur 1-7 gesperrt.
Etwas LAEUFT GERADE und ist in zwei Stunden vorbei. Eine
Einladung um 22:30 will man haben; um vier Uhr nachts
ist die Sendung laengst aus, und die Meldung waere nur
noch eine Stoerung.
"nie" immer durch.
Ein Mensch drueckt gerade auf den Hoerer und wartet.
Ein Telefon, das nachts stumm bleibt, ist kein Telefon.
GEMESSEN, WARUM "spaet" gebraucht wird: An allen sieben Abenden vom
22. bis 28.09.2026 ging der Live-Ruf zwischen 20:28 und 21:06 raus.
Jedes Mal knapp vor der Sperre. Geht Filipe einmal um 22:05 live,
bekommt niemand etwas -- und niemand erfaehrt, warum.
------------------------------------------------------------------ */ ------------------------------------------------------------------ */
export const ARTEN = [ export const ARTEN = [
{ schluessel: "aufgabe_faellig", name: "Aufgabe wird morgen fällig", vorgabe: true }, { schluessel: "aufgabe_faellig", name: "Aufgabe wird morgen fällig", vorgabe: true },
@@ -166,7 +205,41 @@ export const ARTEN = [
Eine eigene Art und nicht "termin_gleich": Das eine ist ein Eine eigene Art und nicht "termin_gleich": Das eine ist ein
Kalendereintrag, das andere ein Stream, der JETZT laeuft. Wer das Kalendereintrag, das andere ein Stream, der JETZT laeuft. Wer das
eine stumm stellt, meint selten das andere. */ eine stumm stellt, meint selten das andere. */
{ schluessel: "dogfather_live", name: "DogFather ist live", vorgabe: true }, { schluessel: "dogfather_live", name: "DogFather ist live", vorgabe: true,
/* „spaet", nicht „immer": Ein Stream, der um 22:05 anfaengt, ist um
22:05 interessant. Mit der alten Regel waere er stumm geblieben,
und die Meldung, die Filipe ausdruecklich bestellt hat („die
leute sollen auch automatisch eine benarichtigung bekommen"),
haette an genau den Abenden nicht funktioniert, an denen es
spaeter wurde. */
ruhe: "spaet" },
/* ---- DIE REACTION LAEDT EIN (29.09.2026) ------------------------
Filipe: „ich will dass du die benarichtigungen perfektionierst.
dogfather und alle anderen sollen die benachrichtigungen perfekt
von dieser seite hier bekommen."
NACHGEMESSEN WAR DIE REACTION STUMM. `workspace-reaktion.js`
enthielt kein einziges `benachrichtige`. Geht die Sendung auf
Sendung, ruft sie `melden("reaktion", ...)` -- und das geht ueber
den Ereignisstrom, also NUR an Leute, die die Seite ohnehin schon
offen haben. Das Kino macht auf, und die Einladung verlaesst das
Haus nie.
Dasselbe Muster wie bei den Bewerbungen am 23.09.: beide Wege
gebaut, beide stumm.
EIGENE ART UND NICHT `dogfather_live`. Das eine ist sein Stream
auf TikTok (gemessen ueber `liveStatusHolen` beim Postfach), das
andere das Kino hier im Haus. Wer abends nicht auf TikTok geht,
aber zur Reaction kommt, will genau das eine und nicht das
andere -- und umgekehrt.
`ruhe: "spaet"` aus demselben Grund wie oben: Eine Reaction um
22:30 ist der Normalfall, keine Ausnahme. */
{ schluessel: "reaktion_live",
name: "Die Reaction geht auf Sendung", vorgabe: true, ruhe: "spaet" },
/* ---- ANRUFE SIND EINE EIGENE ART (18.09.2026) ------------------ /* ---- ANRUFE SIND EINE EIGENE ART (18.09.2026) ------------------
Filipe: „sie bekommt nur eine benarichtigung das eine neue Filipe: „sie bekommt nur eine benarichtigung das eine neue
@@ -191,7 +264,7 @@ export const ARTEN = [
ist kein Telefon. Wer nachts nicht gestoert werden will, schaltet ist kein Telefon. Wer nachts nicht gestoert werden will, schaltet
jetzt diese Art ab -- eine Entscheidung, die man selbst trifft, jetzt diese Art ab -- eine Entscheidung, die man selbst trifft,
statt einer Regel, die man nicht kennt. */ statt einer Regel, die man nicht kennt. */
{ schluessel: "anruf", name: "Jemand ruft an", vorgabe: true }, { schluessel: "anruf", name: "Jemand ruft an", vorgabe: true, ruhe: "nie" },
/* DER TAGESRUF (08.09.2026, screen10). Filipe: "eine taetige meldung /* DER TAGESRUF (08.09.2026, screen10). Filipe: "eine taetige meldung
einmal am tag zu aktivieren wenn noch aufgaben auf sind." einmal am tag zu aktivieren wenn noch aufgaben auf sind."
@@ -232,7 +305,9 @@ export const ARTEN = [
IM TEXT STEHT NIE, WORUM ES GEHT. Eine Benachrichtigung erscheint IM TEXT STEHT NIE, WORUM ES GEHT. Eine Benachrichtigung erscheint
auf einem Sperrbildschirm, den auch andere sehen. */ auf einem Sperrbildschirm, den auch andere sehen. */
{ schluessel: "hilfe", name: "Vertrauliche Meldung: neu oder beantwortet", vorgabe: true }, { schluessel: "hilfe", name: "Vertrauliche Meldung: neu oder beantwortet", vorgabe: true },
{ schluessel: "test", name: "Probe-Benachrichtigung", vorgabe: true }, /* Die Probe beantwortet „kommt ueberhaupt etwas an?" -- und die
stellt man sich auch um 23 Uhr. */
{ schluessel: "test", name: "Probe-Benachrichtigung", vorgabe: true, ruhe: "nie" },
]; ];
const ARTEN_SCHLUESSEL = new Set(ARTEN.map((a) => a.schluessel)); const ARTEN_SCHLUESSEL = new Set(ARTEN.map((a) => a.schluessel));
@@ -274,8 +349,32 @@ export function vorlauf(minuten) {
eine Umgebungsvariable und kein Programmierauftrag. */ eine Umgebungsvariable und kein Programmierauftrag. */
const RUHE_AB = Number(process.env.PUSH_RUHE_AB ?? 22); const RUHE_AB = Number(process.env.PUSH_RUHE_AB ?? 22);
const RUHE_BIS = Number(process.env.PUSH_RUHE_BIS ?? 7); const RUHE_BIS = Number(process.env.PUSH_RUHE_BIS ?? 7);
export function istRuhezeit(d = new Date()) { /* Wann eine „spaet"-Meldung aufhoert. Ein Uhr und nicht zwei: Was um
ein Uhr anfaengt, ist um drei vorbei -- eine Einladung dazu erreicht
niemanden mehr, sie weckt nur. */
const SPAET_AB = Number(process.env.PUSH_SPAET_AB ?? 1);
/** Welche Ruheregel gilt fuer diese Art?
*
* ABGELEITET AUS DER ARTENLISTE, nicht danebengeschrieben. Eine
* zweite Aufzaehlung waere genau die, die beim naechsten Eintrag
* vergessen wird -- so ist es am 18.09. beim Anruf gewesen. */
export function ruheRegel(art) {
return ARTEN.find((a) => a.schluessel === art)?.ruhe || "immer";
}
/** Ist gerade Ruhezeit -- fuer diese Regel?
*
* `regel` steht hinten und hat eine Vorgabe, damit vorhandene
* Aufrufer (und die Pruefungen) unveraendert weiterlaufen. */
export function istRuhezeit(d = new Date(), regel = "immer") {
if (regel === "nie") return false;
const s = d.getHours(); const s = d.getHours();
/* „spaet" ist EIN Bereich und nicht zwei -- SPAET_AB liegt vor
RUHE_BIS. Die Rechnung von „immer" (zwei Bereiche um Mitternacht
herum) gilt hier also nicht, und sie hier mitzubenutzen waere ein
Fehler, den man erst um ein Uhr nachts sieht. */
if (regel === "spaet") return s >= SPAET_AB && s < RUHE_BIS;
return s >= RUHE_AB || s < RUHE_BIS; return s >= RUHE_AB || s < RUHE_BIS;
} }
@@ -420,25 +519,67 @@ function zielFuer(personId, ziel) {
} }
} }
/** Welches Haus traegt diese Meldung? -> "crew" oder "agentur"
*
* Nur fuer das GESICHT der Benachrichtigung (Symbol und Abzeichen).
* Ueber Rechte entscheidet das hier nichts -- das tut `zielFuer` eine
* Funktion weiter oben, und zwar unveraendert.
*
* ZWEISTUFIG, UND BEIDE STUFEN GIBT ES SCHON:
*
* 1. Die Zielseite, wenn sie in genau ein Haus gehoert. Damit
* traegt die Einladung zur Reaction das Crew-Gesicht -- auch
* fuer DogFather, der in beiden Haeusern arbeitet und sonst
* ueberall dasselbe Symbol saehe.
*
* 2. Sonst das Haus der Person. `AGENTUR_ROLLEN` ist die
* vorhandene Menge; wer nicht darin steht, arbeitet im
* Crew-Haus. Wortgleich zu `nurAnderesHaus()`.
*
* IM ZWEIFEL "agentur" -- das ist der Stand von vor dem 29.09.2026.
* Ein Fehler hier darf das Gesicht aendern, nie die Zustellung. */
export function hausFuerMeldung(personId, ziel) {
try {
const pfad = String(ziel || "").split("?")[0].split("#")[0];
const eintrag = GEHOERT_ZU_ADRESSE.find((e) => e.datei === pfad);
if (eintrag) return eintrag.zuhause === istCrewAdresse ? "crew" : "agentur";
const p = db().prepare("SELECT rolle FROM personen WHERE id = ?").get(personId);
if (!p) return "agentur";
return AGENTUR_ROLLEN.has(p.rolle) ? "agentur" : "crew";
} catch (f) {
console.error("[push] Haus bestimmen:", f?.message);
return "agentur";
}
}
export async function benachrichtige(personId, art, { titel, text, ziel, merkmal }) { export async function benachrichtige(personId, art, { titel, text, ziel, merkmal }) {
if (!ARTEN_SCHLUESSEL.has(art)) return { verschickt: 0, grund: "unbekannte_art" }; if (!ARTEN_SCHLUESSEL.has(art)) return { verschickt: 0, grund: "unbekannte_art" };
if (!willHaben(personId, art)) return { verschickt: 0, grund: "abgeschaltet" }; if (!willHaben(personId, art)) return { verschickt: 0, grund: "abgeschaltet" };
/* Die Probe darf immer durch -- sie beantwortet die Frage "kommt /* WELCHE RUHEREGEL GILT, STEHT AN DER ART (29.09.2026). Hier stand
ueberhaupt etwas an?", und die stellt man sich auch um 23 Uhr. bis dahin `art === "test" || art === "anruf"` -- eine Aufzaehlung
230 Zeilen von der Artenliste entfernt, die niemand sieht, der
eine Art eintraegt.
UND EIN ANRUF AUCH (18.09.2026). Die Ruhezeit ist gegen Gefunden hat den Fall Filipes Satz „sie bekommt nur eine
Erinnerungen gebaut: Dinge, die der Server von sich aus schickt,
weil eine Frist naeher rueckt. Ein Anruf ist das Gegenteil -- ein
Mensch drueckt gerade auf den Hoerer und wartet.
Gefunden hat das Filipes Satz „sie bekommt nur eine
benarichtigung ... irgendwas laeuft da gewaltig schief", um 23:44 benarichtigung ... irgendwas laeuft da gewaltig schief", um 23:44
Uhr. Serverseitig war alles in Ordnung; der Anruf wurde nur nie Uhr. Serverseitig war alles in Ordnung; der Anruf wurde nur nie
ausgeliefert, weil es nach 22 Uhr war. Wer nachts seine Ruhe will, ausgeliefert, weil es nach 22 Uhr war. Behoben wurde damals genau
schaltet die Art „Jemand ruft an" ab. */ dieser eine Fall -- die Frage dahinter blieb stehen, und
const dringend = art === "test" || art === "anruf"; `dogfather_live` faellt bis heute in dieselbe Falle.
if (!dringend && istRuhezeit()) return { verschickt: 0, grund: "ruhezeit" };
WER NACHTS SEINE RUHE WILL, schaltet die Art ab. Das ist eine
Entscheidung, die man selbst trifft, statt einer Regel, die man
nicht kennt. */
const regel = ruheRegel(art);
if (istRuhezeit(new Date(), regel)) return { verschickt: 0, grund: "ruhezeit" };
/* DRAENGELN IST ETWAS ANDERES ALS NACHTS STOEREN. Der Push-Dienst
kennt eine Dringlichkeit, die darueber entscheidet, ob ein
schlafendes Geraet dafuer aufwacht. Das gilt fuer den Anruf und
die Probe -- nicht fuer eine Einladung: Die soll ankommen, wenn
das Geraet ohnehin wach wird, und keinen Akku dafuer verbrennen. */
const dringend = regel === "nie";
/* Schon einmal geschickt? */ /* Schon einmal geschickt? */
if (merkmal) { if (merkmal) {
@@ -456,7 +597,13 @@ export async function benachrichtige(personId, art, { titel, text, ziel, merkmal
nachsehen kann, wohin wirklich geschickt wurde, ohne die nachsehen kann, wohin wirklich geschickt wurde, ohne die
Nachricht aufmachen zu muessen. */ Nachricht aufmachen zu muessen. */
const zielEcht = zielFuer(personId, ziel); const zielEcht = zielFuer(personId, ziel);
const inhalt = JSON.stringify({ titel, text, art, ziel: zielEcht }); /* DAS HAUS WIRD AUS DEM ECHTEN ZIEL BESTIMMT, nicht aus dem
gewuenschten. Wird jemand von `zielFuer` auf die Startseite
umgeleitet, weil die Seite fuer ihn nicht existiert, soll auch das
Gesicht dazu passen -- sonst steht das Crew-Symbol ueber einer
Meldung, die auf der Agenturstartseite landet. */
const haus = hausFuerMeldung(personId, zielEcht);
const inhalt = JSON.stringify({ titel, text, art, ziel: zielEcht, haus });
let raus = 0; let raus = 0;
for (const a of anmeldungen) { for (const a of anmeldungen) {
@@ -487,7 +634,12 @@ export async function benachrichtige(personId, art, { titel, text, ziel, merkmal
db().prepare("INSERT OR REPLACE INTO push_verschickt (person_id, merkmal, zeit) VALUES (?,?,?)") db().prepare("INSERT OR REPLACE INTO push_verschickt (person_id, merkmal, zeit) VALUES (?,?,?)")
.run(personId, merkmal, jetzt()); .run(personId, merkmal, jetzt());
} }
return { verschickt: raus, grund: raus ? "ok" : "nicht_zugestellt", ziel: zielEcht }; /* `haus` kommt mit zurueck, damit eine Pruefung nachsehen kann,
welches Gesicht verschickt wurde, ohne die verschluesselte
Nachricht aufmachen zu muessen -- derselbe Gedanke wie beim
Ziel. */
return { verschickt: raus, grund: raus ? "ok" : "nicht_zugestellt",
ziel: zielEcht, haus };
} }
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
+110
View File
@@ -66,6 +66,10 @@ import {
Sendung weiterschreibt -- genau die Luecke, die man erst bemerkt, Sendung weiterschreibt -- genau die Luecke, die man erst bemerkt,
wenn sie benutzt wird. */ wenn sie benutzt wird. */
import { treffSperreLesen } from "./treff-tabellen.js"; import { treffSperreLesen } from "./treff-tabellen.js";
/* Wer zum Crew-Haus gehoert, steht in `crew-adresse.js` -- die
Einladung liest dieselbe Menge wie die Hausweiche, statt eine
zweite danebenzustellen. */
import { AGENTUR_ROLLEN } from "./crew-adresse.js";
export const reaktionRouter = express.Router(); export const reaktionRouter = express.Router();
@@ -677,6 +681,13 @@ reaktionRouter.post("/workspace/api/reaktion/stand", nurHost, express.json({ lim
}); });
const l = lage(req.person); const l = lage(req.person);
melden("reaktion", { was: "stand", lage: oeffentlich(l) }); melden("reaktion", { was: "stand", lage: oeffentlich(l) });
/* ERST JETZT EINLADEN, nach dem Schreiben und nach `melden`.
Wer die Meldung antippt, landet auf einer Seite, die den
neuen Stand schon kennt -- sonst sieht der Schnellste einen
Saal, der noch zu ist. */
if (neu === "live" && s.stand !== "live") einladen(sendung(), req.person.id);
res.json(l); res.json(l);
} catch (fehler) { } catch (fehler) {
console.error("[reaktion] Stand:", fehler?.message); console.error("[reaktion] Stand:", fehler?.message);
@@ -1495,6 +1506,105 @@ reaktionRouter.post("/workspace/api/reaktion/werbung", nurHost,
} }
}); });
/* =====================================================================
DIE EINLADUNG -- wenn die Sendung aufgeht (29.09.2026)
Filipe: „ich will dass du die benarichtigungen perfektionierst.
dogfather und alle anderen sollen die benachrichtigungen perfekt
von dieser seite hier bekommen."
NACHGEMESSEN WAR DIESE DATEI STUMM: kein einziges `benachrichtige`.
Geht die Sendung auf Sendung, ruft sie `melden("reaktion", ...)` --
und das laeuft ueber den Ereignisstrom, also NUR zu Leuten, die die
Seite ohnehin schon offen haben. Wer nicht hinschaut, erfaehrt
nichts. Das Kino macht auf, und die Einladung verlaesst das Haus
nie.
Genau dasselbe Muster wie bei den Bewerbungen am 23.09.: beide Wege
gebaut, beide stumm.
===================================================================== */
/** Wer wird eingeladen?
*
* Alle mit einem angemeldeten Geraet, deren Rolle NICHT der Agentur
* gehoert -- das ist woertlich die Hausteilung aus `crew-adresse.js`
* und keine neue Liste. Ein Scout bekaeme sonst eine Einladung in
* ein Kino, dessen Tuer fuer ihn nicht existiert: `zielFuer` schickt
* ihn auf die Startseite, und er stuende vor einer Meldung, die
* nirgendwohin fuehrt.
*
* OHNE DEN, DER EINGESCHALTET HAT. Er hat gerade den Knopf
* gedrueckt. */
function eingeladene(ausser) {
return db().prepare(`SELECT DISTINCT a.person_id AS id, p.rolle
FROM push_anmeldungen a JOIN personen p ON p.id = a.person_id`).all()
.filter((z) => z.id !== ausser && !AGENTUR_ROLLEN.has(z.rolle))
.map((z) => z.id);
}
/** Lief eben schon eine Einladung raus?
*
* DIE BREMSE GEGEN DEN NEUSTART. Das Merkmal allein reicht nicht:
* Es haengt an `gestartet_am`, und das wird bei jedem Wechsel nach
* „live" neu gesetzt. Wer aus Versehen auf „Vorbereitung" und gleich
* wieder auf „Auf Sendung" drueckt -- oder wem der Rechner
* abstuerzt --, laedt sonst zweimal ein. Acht Menschen bekommen dann
* zwei Meldungen fuer dieselbe Sendung, und das ist der schnellste
* Weg, dass jemand die Art abschaltet.
*
* ZWEI STUNDEN, weil eine Reaction etwa so lange dauert. Wer danach
* eine zweite, wirklich neue Sendung aufmacht, laedt zu Recht neu
* ein.
*
* Gefragt wird `push_verschickt` -- also das, was WIRKLICH rausging.
* Wurde die erste Einladung verschluckt (Ruhezeit, kein Geraet),
* steht dort nichts, und der zweite Versuch darf. */
function ebenSchonEingeladen() {
const z = db().prepare(
`SELECT MAX(zeit) AS zuletzt FROM push_verschickt
WHERE merkmal LIKE 'reaktion_live:%'`).get();
if (!z?.zuletzt) return false;
return (Date.now() - Date.parse(z.zuletzt)) < 2 * 60 * 60 * 1000;
}
/** Die Einladung verschicken -- ohne die Antwort aufzuhalten.
*
* Der Knopf „Auf Sendung" muss sofort reagieren. Acht
* Verschluesselungen und acht Netzwege dauern laenger als die
* Antwort dauern darf, und wenn ein Push-Dienst gerade klemmt,
* haenge die ganze Sendung daran. Deshalb losgeschickt und nicht
* abgewartet -- ein Fehler dabei steht im Protokoll, nicht im Weg. */
function einladen(sendungJetzt, hostId) {
(async () => {
try {
if (ebenSchonEingeladen()) {
console.log("[reaktion] Einladung uebersprungen -- vor weniger als "
+ "zwei Stunden lief schon eine.");
return;
}
const { benachrichtige } = await import("./workspace-push.js");
const wer = eingeladene(hostId);
const titel = String(sendungJetzt.video_titel || sendungJetzt.titel || "").trim();
let raus = 0;
for (const id of wer) {
const e = await benachrichtige(id, "reaktion_live", {
titel: "Die Reaction läuft",
/* WAS GESCHAUT WIRD, STEHT DRIN -- das ist der Unterschied
zwischen „komm rein" und „komm rein, wir schauen X". Ist
kein Titel da, wird keiner erfunden. */
text: titel ? `Wir schauen: ${titel}` : "DogFather hat die Sendung aufgemacht.",
ziel: "/workspace/reaktion.html",
merkmal: `reaktion_live:${sendungJetzt.gestartet_am || jetzt()}`,
});
if (e?.verschickt) raus++;
}
console.log(`[reaktion] Einladung an ${raus} von ${wer.length} verschickt.`);
} catch (f) {
console.error("[reaktion] Einladung:", f?.message);
}
})();
}
/* Der Stand der Einblendung -- an EINER Stelle gerechnet. Drei /* Der Stand der Einblendung -- an EINER Stelle gerechnet. Drei
Aufrufer (setzen, anlegen, aendern) brauchen dasselbe Ergebnis; Aufrufer (setzen, anlegen, aendern) brauchen dasselbe Ergebnis;
dreimal abgeschrieben waere die Gelegenheit, dass einer davon dreimal abgeschrieben waere die Gelegenheit, dass einer davon
+172
View File
@@ -0,0 +1,172 @@
/* =====================================================================
tools/abzeichen-bauen.mjs — das Abzeichen der Benachrichtigungen.
WAS EIN ABZEICHEN IST, UND WAS NICHT
Eine Benachrichtigung hat unter Android ZWEI Bilder:
`icon` — das bunte Symbol im aufgeklappten Meldungskasten.
`badge` — das winzige Zeichen oben in der Statusleiste, 24 dp.
Vom `badge` benutzt das System AUSSCHLIESSLICH den Alphakanal und
malt ihn einfarbig weiß. Alles Bunte daran geht verloren.
Bis zum 29.09.2026 stand dort `workspace-192.png` — ein
vollflächiges, quadratisches Bild OHNE Transparenz. Dessen
Alphakanal ist überall voll. In der Statusleiste erschien deshalb
ein ausgefüllter Klotz und kein Zeichen. Das fällt nicht als Fehler
auf, weil nichts abstürzt; es sieht nur billig aus.
---------------------------------------------------------------------
WARUM EINE FLÄCHE UND KEIN STRICHBILD
Drei Fassungen gebaut und bei echter Größe verglichen, statt zu
raten:
A) die Tinte des Logos (Strichbild) — bei 24 px ein Gekrissel
B) dieselbe, verdickt — besser, immer noch unruhig
C) der geschlossene Umriss, gefüllt — trägt
Die Ohrkerbe des Huskys ist bei 512 px zwei Prozent der Breite. Bei
24 px ist sie ein halber Pixel und wird zu Grau. Eine Fläche
überlebt das Verkleinern, ein Strich nicht.
---------------------------------------------------------------------
EIN ABZEICHEN FÜR BEIDE HÄUSER — UND ZWAR ABSICHTLICH
Crew und Agentur sind getrennt, und das gilt auch hier: Das bunte
`icon` ist je Haus ein anderes (crew-192 / workspace-192). Das
Abzeichen ist es NICHT, und das ist keine vergessene Trennung.
Es ist 24 Pixel groß und einfarbig. Der Unterschied zwischen den
beiden Symbolen ist die Chili der Agentur — bei 24 px ein Fleck von
zwei Pixeln, der nicht als Chili lesbar ist, sondern als Schmutz
neben dem Kopf. Der Husky ist die Marke beider Häuser; ihn zu
teilen verrät nichts über das jeweils andere.
---------------------------------------------------------------------
WARUM DAS EIN SKRIPT IST UND KEIN EINMALIGER HANDGRIFF
Ändert sich das Logo, wird das Abzeichen mit einem Befehl neu
gebaut. Ein von Hand zugeschnittenes PNG wäre in dem Moment eine
Kopie, die niemand mehr pflegt — dieselbe Falle wie eine
abgeschriebene Liste.
node tools/abzeichen-bauen.mjs
===================================================================== */
import { spawnSync } from "node:child_process";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
import { existsSync, statSync } from "node:fs";
const HIER = dirname(fileURLToPath(import.meta.url));
const REPO = join(HIER, "..");
const QUELLE = join(REPO, "assets", "img", "marke", "logo-kopf-frei.png");
const ZIEL = join(REPO, "assets", "img", "abzeichen-96.png");
/* Die Rechnung steht in Python, weil dort Pillow liegt — Node hat im
Haus keine Bildbibliothek, und eine dafür zu installieren wäre eine
Abhängigkeit für 40 Zeilen. */
const RECHNUNG = String.raw`
import sys
from collections import deque
from PIL import Image
import numpy as np
quelle, ziel = sys.argv[1], sys.argv[2]
i = Image.open(quelle).convert("RGBA")
# DIE ZEICHNUNG STECKT IM ALPHAKANAL. Gemessen: RGB ist in dieser
# Datei ueberall schwarz, das weisse Fell ist DURCHSICHTIG, nicht
# weiss. Wer hier auf Helligkeit schwellt, bekommt ein leeres Bild.
tinte = np.array(i.split()[3]) > 90
h, w = tinte.shape
if not tinte.any():
sys.exit("Die Quelle hat keine Zeichnung im Alphakanal.")
# ---- Von aussen fluten: was der Rand erreicht, ist aussen ----------
aussen = np.zeros((h, w), bool)
st = deque()
for x in range(w):
for y in (0, h - 1):
if not tinte[y, x] and not aussen[y, x]:
aussen[y, x] = True; st.append((y, x))
for y in range(h):
for x in (0, w - 1):
if not tinte[y, x] and not aussen[y, x]:
aussen[y, x] = True; st.append((y, x))
while st:
y, x = st.pop()
for dy, dx in ((1, 0), (-1, 0), (0, 1), (0, -1)):
ny, nx = y + dy, x + dx
if 0 <= ny < h and 0 <= nx < w and not tinte[ny, nx] and not aussen[ny, nx]:
aussen[ny, nx] = True; st.append((ny, nx))
voll = ~aussen
# ---- Nur die groesste zusammenhaengende Flaeche -------------------
# Im Logo liegen unter dem Kinn 18 lose Sprenkel. Bei 512 px sind sie
# Beiwerk, bei 24 px sind sie Schmutz neben dem Zeichen. Gezaehlt
# statt weggefiltert: Ein Filter muesste raten, wie dick ein Sprenkel
# hoechstens ist.
marke = np.zeros((h, w), np.int32)
nr, gr = 0, {}
for sy in range(h):
for sx in range(w):
if voll[sy, sx] and marke[sy, sx] == 0:
nr += 1; n = 0
s2 = deque([(sy, sx)]); marke[sy, sx] = nr
while s2:
y, x = s2.pop(); n += 1
for dy, dx in ((1, 0), (-1, 0), (0, 1), (0, -1)):
ny, nx = y + dy, x + dx
if 0 <= ny < h and 0 <= nx < w and voll[ny, nx] and marke[ny, nx] == 0:
marke[ny, nx] = nr; s2.append((ny, nx))
gr[nr] = n
best = max(gr, key=gr.get)
kopf = Image.fromarray(((marke == best) * 255).astype(np.uint8), "L")
# ---- Zuschneiden, mittig, etwas Luft ------------------------------
k = kopf.getbbox()
aus = kopf.crop(k)
s = max(aus.size); rand = int(s * 0.06)
feld = Image.new("L", (s + 2 * rand, s + 2 * rand), 0)
feld.paste(aus, (rand + (s - aus.width) // 2, rand + (s - aus.height) // 2))
# ---- 96 px, weiss, Form im Alphakanal -----------------------------
maske = feld.resize((96, 96), Image.LANCZOS)
bild = Image.new("RGBA", (96, 96), (255, 255, 255, 255))
bild.putalpha(maske)
bild.save(ziel, optimize=True)
deckung = (np.array(maske) > 127).sum() / (96 * 96)
print(" %d Flaechen, %d Sprenkel verworfen, Deckung %.0f %%"
% (nr, nr - 1, 100 * deckung))
# DIE ZAHL GEHOERT IN DIE BEDINGUNG. Ein Abzeichen, das 2 % deckt, ist
# ein Staubkorn; eines mit 90 % ist der Klotz, den wir gerade
# abschaffen. Beides faellt hier auf, nicht erst auf dem Telefon.
if not (0.15 <= deckung <= 0.75):
sys.exit("Deckung %.0f %% liegt ausserhalb des Sinnvollen." % (100 * deckung))
`;
if (!existsSync(QUELLE)) {
console.error(`Die Quelle fehlt: ${QUELLE}`);
process.exit(2);
}
const lauf = spawnSync("python", ["-c", RECHNUNG, QUELLE, ZIEL], { encoding: "utf8" });
if (lauf.error?.code === "ENOENT") {
/* DER DRITTE AUSGANG. „Python ist nicht da" ist etwas anderes als
„das Abzeichen ist falsch" — und darf nicht wie ein Befund
aussehen. */
console.error("Python ist auf diesem Rechner nicht im Pfad — das Abzeichen "
+ "wurde NICHT neu gebaut. Die vorhandene Datei bleibt, wie sie ist.");
process.exit(2);
}
if (lauf.stdout) process.stdout.write(lauf.stdout);
if (lauf.status !== 0) {
console.error(lauf.stderr?.trim() || "Der Bau ist gescheitert.");
process.exit(1);
}
const gross = statSync(ZIEL).size;
console.log(` ${ZIEL.replace(REPO, "").replace(/\\/g, "/")} — ${gross} Bytes`);
+5 -5
View File
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur. verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als <!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll, ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
@@ -33,7 +33,7 @@
schreibt jede Seite app.webmanifest -- auch die hier. --> schreibt jede Seite app.webmanifest -- auch die hier. -->
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<style> <style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite /* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht, soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -135,7 +135,7 @@
<script src="assets/js/anruf-probe.js?v=202609291714" defer></script> <script src="assets/js/anruf-probe.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -23,25 +23,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/workspace-192.png?v=202609291714", "src": "/assets/img/app-symbole/workspace-192.png?v=202609292348",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512.png?v=202609291714", "src": "/assets/img/app-symbole/workspace-512.png?v=202609292348",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609291714", "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609292348",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609291714", "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609292348",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+44 -2
View File
@@ -953,10 +953,33 @@
clearInterval(hostUhr); clearInterval(hostUhr);
hostUhr = setInterval(hostMelden, 5000); hostUhr = setInterval(hostMelden, 5000);
} }
/* Die Zustände des YouTube-Spielers, bei ihrem Namen.
Zahlen im Programmtext sind die Sorte Wissen, die genau einmal
nachgeschlagen und danach falsch erinnert wird. */
const SPIELT = 1, PUFFERT = 3;
async function hostMelden() { async function hostMelden() {
if (!spielerBereit || !lage || lage.stand !== 'live') return; if (!spielerBereit || !lage || lage.stand !== 'live') return;
try { try {
const laeuft = spieler.getPlayerState() === 1; /* PUFFERN IST KEIN ANHALTEN (29.09.2026).
Hier stand `=== 1`. Zustand 3 heißt „ich will spielen, mir
fehlen gerade Daten" — der Host hat nichts angehalten, seine
Leitung stockt eine halbe Sekunde. Gemeldet wurde trotzdem
„läuft nicht", und zwar sofort, weil `onStateChange` bei
jedem Zustandswechsel meldet.
Zwei Folgen, und die zweite ist die schlimmere:
· Alle Zuschauer bekamen bei JEDEM Pufferer des Hosts ein
Pause-Play-Paar. Das ist das Ruckeln, das man für eine
schlechte eigene Leitung hält.
· Der Host bekam seine eigene Meldung zurück (er steht in
`empfaenger()`) und hielt sich damit selbst an.
Gemessen in mess-reaktion: `Host=laeuft` → ein gemeldeter
Pufferer → `Host=pause`. */
const zustand = spieler.getPlayerState();
const laeuft = zustand === SPIELT || zustand === PUFFERT;
const sekunde = spieler.getCurrentTime(); const sekunde = spieler.getCurrentTime();
await hole('/workspace/api/reaktion/video', { await hole('/workspace/api/reaktion/video', {
method: 'POST', method: 'POST',
@@ -3226,7 +3249,26 @@
try { try {
const d = JSON.parse(e.data); const d = JSON.parse(e.data);
if (d.was === 'video') { if (d.was === 'video') {
folgen(d); /* WER STEUERT, FOLGT SEINEM EIGENEN ECHO NICHT (29.09.2026).
`empfaenger()` fügt den Host ausdrücklich hinzu, damit
ein zweites Gerät von ihm mitläuft. Dadurch kam seine
eigene Meldung auch bei ihm selbst an — und `folgen()`
hat sie auf ihn angewandt. Meldete er einmal „läuft
nicht" (etwa beim Puffern), hielt ihn eine Sekunde später
sein eigenes Echo an.
GEPRÜFT WIRD DIE KENNUNG, NICHT DIE ROLLE. `ich.host` ist
bei DogFather UND bei seiner rechten Hand wahr — beide
dürfen die Sendung führen. Geführt wird sie aber von
genau einem, und nur der darf sein Echo ausschlagen. Wer
danebensteht, muss weiter folgen, sonst sieht er etwas
anderes als alle übrigen.
DAS TEMPO ZIEHT TROTZDEM MIT — es steht darunter und
kommt nicht von seinem eigenen Spieler, sondern aus dem
Regiepult. */
if (!(lage?.host?.id && lage.host.id === meineId)) folgen(d);
/* DAS SCHILD MUSS MIT. `folgen()` stellt den Spieler, aber /* DAS SCHILD MUSS MIT. `folgen()` stellt den Spieler, aber
der Rundruf geht hier mit `return` heraus -- ohne diese der Rundruf geht hier mit `return` heraus -- ohne diese
zwei Zeilen stuende beim Zuschauer weiter „1x", waehrend zwei Zeilen stuende beim Zuschauer weiter „1x", waehrend
+19 -19
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -391,22 +391,22 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach <!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne `window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. --> Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609291714"></script> <script src="assets/js/textform.js?v=202609292348"></script>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/zuteilung.js?v=202609291714" defer></script> <script src="assets/js/zuteilung.js?v=202609292348" defer></script>
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in <!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
eigene Datei; hier zeigt er den Creator-Katalog. eigene Datei; hier zeigt er den Creator-Katalog.
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. --> Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
<script src="assets/js/vorlagenbrett.js?v=202609291714" defer></script> <script src="assets/js/vorlagenbrett.js?v=202609292348" defer></script>
<script src="assets/js/aufgaben.js?v=202609291714" defer></script> <script src="assets/js/aufgaben.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/automation.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -168,15 +168,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/automation.js?v=202609291714" defer></script> <script src="assets/js/automation.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -197,16 +197,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/befinden.js?v=202609291714" defer></script> <script src="assets/js/befinden.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+22 -22
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett <!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite „Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. --> Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -304,19 +304,19 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach <!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne `window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. --> Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609291714"></script> <script src="assets/js/textform.js?v=202609292348"></script>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/checkliste.js?v=202609291714" defer></script> <script src="assets/js/checkliste.js?v=202609292348" defer></script>
<script src="assets/js/ampel.js?v=202609291714" defer></script> <script src="assets/js/ampel.js?v=202609292348" defer></script>
<script src="assets/js/schulung.js?v=202609291714" defer></script> <script src="assets/js/schulung.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/bereich.js?v=202609291714" defer></script> <script src="assets/js/bereich.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+19 -19
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. --> <!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -108,15 +108,15 @@
</main> </main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. --> <!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609291714" defer></script> <script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/bewerben.js?v=202609291714" defer></script> <script src="assets/js/bewerben.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. --> <!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -80,16 +80,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609291714" defer></script> <script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/bewerbungen.js?v=202609291714" defer></script> <script src="assets/js/bewerbungen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+3 -3
View File
@@ -59,11 +59,11 @@
<!-- DIE WERBEEINBLENDUNG. Dieselbe Datei wie in der Reaction-Seite: <!-- DIE WERBEEINBLENDUNG. Dieselbe Datei wie in der Reaction-Seite:
Zwei Fassungen altern unterschiedlich, und dann sieht der Stream Zwei Fassungen altern unterschiedlich, und dann sieht der Stream
anders aus als das, worueber geredet wird. --> anders aus als das, worueber geredet wird. -->
<link rel="stylesheet" href="assets/css/werbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/werbung.css?v=202609292348" />
</head> </head>
<body class="obs-buehne"> <body class="obs-buehne">
<div id="platz"></div> <div id="platz"></div>
<script src="assets/js/werbung.js?v=202609291714" defer></script> <script src="assets/js/werbung.js?v=202609292348" defer></script>
<script src="assets/js/buehne.js?v=202609291714" defer></script> <script src="assets/js/buehne.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/calls.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -89,15 +89,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609291714" defer></script> <script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/calls.js?v=202609291714" defer></script> <script src="assets/js/calls.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+20 -20
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog, <!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem .neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html. zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. --> Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/chat.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -739,24 +739,24 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/bereiche.js?v=202609291714"></script> <script src="assets/js/bereiche.js?v=202609292348"></script>
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js <!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter, fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
wirklich vor den anderen dasteht. --> wirklich vor den anderen dasteht. -->
<script src="assets/js/textform.js?v=202609291714"></script> <script src="assets/js/textform.js?v=202609292348"></script>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714"></script> <script src="assets/js/kopf.js?v=202609292348"></script>
<script src="assets/js/glocke.js?v=202609291714"></script> <script src="assets/js/glocke.js?v=202609292348"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten` <!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt. bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit -- Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. --> die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609291714"></script> <script src="assets/js/anruf.js?v=202609292348"></script>
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom <!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
@@ -767,8 +767,8 @@
sie beim ersten Foto noch nicht da -- und der erste Klick ginge sie beim ersten Foto noch nicht da -- und der erste Klick ginge
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
auftritt, ist der, den man nie nachstellen kann. --> auftritt, ist der, den man nie nachstellen kann. -->
<script src="assets/js/bildschau.js?v=202609291714"></script> <script src="assets/js/bildschau.js?v=202609292348"></script>
<script src="assets/js/chat.js?v=202609291714"></script> <script src="assets/js/chat.js?v=202609292348"></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/content.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/content.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -179,15 +179,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/checkliste.js?v=202609291714" defer></script> <script src="assets/js/checkliste.js?v=202609292348" defer></script>
<script src="assets/js/content.js?v=202609291714" defer></script> <script src="assets/js/content.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp" <link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" /> type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst <!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen 404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es: statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. --> die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/crew-haus.css?v=202609292348" />
</head> </head>
<body class="gate gate--crew"> <body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609291714" defer></script> <script src="assets/js/gate.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -23,25 +23,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/crew-192.png?v=202609291714", "src": "/assets/img/app-symbole/crew-192.png?v=202609292348",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512.png?v=202609291714", "src": "/assets/img/app-symbole/crew-512.png?v=202609292348",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609291714", "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609292348",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609291714", "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609292348",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/dateien.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -108,15 +108,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/dateien.js?v=202609291714" defer></script> <script src="assets/js/dateien.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -297,20 +297,20 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein, <!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
in Dokumentreihenfolge. --> in Dokumentreihenfolge. -->
<script src="assets/js/vorlagenbrett.js?v=202609291714" defer></script> <script src="assets/js/vorlagenbrett.js?v=202609292348" defer></script>
<script src="assets/js/entwicklung.js?v=202609291714" defer></script> <script src="assets/js/entwicklung.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/hilfe.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -146,14 +146,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/hilfe.js?v=202609291714" defer></script> <script src="assets/js/hilfe.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+5 -5
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp" <link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" /> type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
</head> </head>
<body class="gate"> <body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609291714" defer></script> <script src="assets/js/gate.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/kalender.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -383,15 +383,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/kalender.js?v=202609291714" defer></script> <script src="assets/js/kalender.js?v=202609292348" defer></script>
<script src="assets/js/kalender-abo.js?v=202609291714" defer></script> <script src="assets/js/kalender-abo.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/leistung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -444,13 +444,13 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/meldung.js?v=202609291714"></script> <script src="assets/js/meldung.js?v=202609292348"></script>
<script src="assets/js/nachfrage.js?v=202609291714"></script> <script src="assets/js/nachfrage.js?v=202609292348"></script>
<script src="assets/js/wahl.js?v=202609291714"></script> <script src="assets/js/wahl.js?v=202609292348"></script>
<script src="assets/js/bereiche.js?v=202609291714"></script> <script src="assets/js/bereiche.js?v=202609292348"></script>
<script src="assets/js/kopf.js?v=202609291714"></script> <script src="assets/js/kopf.js?v=202609292348"></script>
<script src="assets/js/glocke.js?v=202609291714"></script> <script src="assets/js/glocke.js?v=202609292348"></script>
<script src="assets/js/leistung.js?v=202609291714"></script> <script src="assets/js/leistung.js?v=202609292348"></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,13 +12,13 @@
vergessen wird. --> vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/material.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/material.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start" data-ton="42" data-buehne="studio"> <body class="start" data-ton="42" data-buehne="studio">
@@ -138,14 +138,14 @@
<p class="m-laedt" id="laedt">Einen Moment …</p> <p class="m-laedt" id="laedt">Einen Moment …</p>
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/material.js?v=202609291714" defer></script> <script src="assets/js/material.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/notizen.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/notizen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start" data-ton="46"> <body class="start" data-ton="46">
@@ -181,12 +181,12 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js <!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. --> liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/notizen.js?v=202609291714" defer></script> <script src="assets/js/notizen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/personen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -453,14 +453,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/personen.js?v=202609291714" defer></script> <script src="assets/js/personen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -214,16 +214,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/steckbrief.js?v=202609291714" defer></script> <script src="assets/js/steckbrief.js?v=202609292348" defer></script>
<script src="assets/js/profil.js?v=202609291714" defer></script> <script src="assets/js/profil.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+19 -19
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/reaktion.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/reaktion.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/werbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/werbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start reaktion-seite" data-stand="laedt"> <body class="start reaktion-seite" data-stand="laedt">
@@ -867,15 +867,15 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js <!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. --> liest daraus die Leitungsrollen. -->
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/spendenkarte.js?v=202609291714" defer></script> <script src="assets/js/spendenkarte.js?v=202609292348" defer></script>
<script src="assets/js/werbung.js?v=202609291714" defer></script> <script src="assets/js/werbung.js?v=202609292348" defer></script>
<script src="assets/js/reaktion.js?v=202609291714" defer></script> <script src="assets/js/reaktion.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -134,14 +134,14 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. --> die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/rechte.js?v=202609291714" defer></script> <script src="assets/js/rechte.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/report.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/report.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -106,17 +106,17 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609291714" defer></script> <script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/report.js?v=202609291714" defer></script> <script src="assets/js/report.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/scouting.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -173,14 +173,14 @@
</div> </div>
</div> </div>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/scouting.js?v=202609291714" defer></script> <script src="assets/js/scouting.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe <!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. --> den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/heim.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -732,16 +732,16 @@
</p> </p>
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/live.js?v=202609291714" defer></script> <script src="assets/js/live.js?v=202609292348" defer></script>
<script src="assets/js/start.js?v=202609291714" defer></script> <script src="assets/js/start.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/startcheck.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -85,16 +85,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/ki.js?v=202609291714" defer></script> <script src="assets/js/ki.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/startcheck.js?v=202609291714" defer></script> <script src="assets/js/startcheck.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -150,16 +150,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609291714" defer></script> <script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/steckbrief.js?v=202609291714" defer></script> <script src="assets/js/steckbrief.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/support.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/support.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -128,16 +128,16 @@
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese (reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
trotzdem, deshalb sah man es nur in der Browserkonsole. --> trotzdem, deshalb sah man es nur in der Browserkonsole. -->
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der <!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
uebersicht.html, und heute hier. --> uebersicht.html, und heute hier. -->
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/support.js?v=202609291714" defer></script> <script src="assets/js/support.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+48 -2
View File
@@ -154,10 +154,56 @@ self.addEventListener("push", (e) => {
============================================================== */ ============================================================== */
const istAnruf = d.art === "anruf"; const istAnruf = d.art === "anruf";
/* =================================================================
ZWEI HAEUSER, ZWEI GESICHTER (29.09.2026)
Hier stand fest `workspace-192.png` -- das Symbol der Agentur.
Gemessen am Live-Bestand: von acht Menschen mit angemeldetem
Geraet gehoeren fuenf ins Crew-Haus (vier Modis, eine rechte
Hand). Die sahen auf JEDER Benachrichtigung das Symbol des
Hauses, in dem sie nicht arbeiten.
WELCHES HAUS ES IST, SAGT DER SERVER. Hier `self.location.hostname`
zu lesen waere zweierlei falsch gewesen: Es stuende die verborgene
Crew-Adresse in einer Datei, die ohne Anmeldung abrufbar ist
(genau der Befund vom 21.09. bei crew-haus.css) -- und es waere
eine zweite Fassung der Hausteilung, die beim naechsten Umzug von
der ersten abweicht.
IM ZWEIFEL DIE AGENTUR. Das ist der Stand von vorher; eine
Nachricht ohne `haus` (etwa eine, die noch unterwegs war, als
diese Fassung kam) sieht damit aus wie bisher, statt gar kein
Symbol zu haben. */
const SYMBOL = {
crew: "/assets/img/app-symbole/crew-192.png",
agentur: "/assets/img/app-symbole/workspace-192.png",
};
e.waitUntil(self.registration.showNotification(d.titel, { e.waitUntil(self.registration.showNotification(d.titel, {
body: d.text, body: d.text,
icon: "/assets/img/app-symbole/workspace-192.png", icon: SYMBOL[d.haus] || SYMBOL.agentur,
badge: "/assets/img/app-symbole/workspace-192.png", /* DAS ABZEICHEN IST ETWAS ANDERES ALS DAS SYMBOL.
Es ist das winzige Zeichen oben in der Statusleiste, 24 dp
gross, und Android benutzt davon AUSSCHLIESSLICH den
Alphakanal -- gemalt wird es einfarbig weiss.
Hier stand dasselbe `workspace-192.png`: ein vollflaechiges
Quadrat ohne Transparenz. Dessen Alphakanal ist ueberall voll,
in der Statusleiste erschien deshalb ein ausgefuellter Klotz
und kein Zeichen. Es stuerzt nichts ab, es sieht nur billig aus
-- und deshalb faellt es auch niemandem als Fehler auf.
`abzeichen-96.png` ist der gefuellte Umriss des Huskys, weiss
auf durchsichtig, gebaut von `tools/abzeichen-bauen.mjs`.
EIN ABZEICHEN FUER BEIDE HAEUSER, und das ist keine vergessene
Trennung: Der Unterschied zwischen den zwei Symbolen ist die
Chili der Agentur -- bei 24 Pixeln ein Fleck von zweien, der
nicht als Chili lesbar ist, sondern als Schmutz neben dem Kopf.
Der Husky ist die Marke beider Haeuser; ihn zu teilen verraet
nichts ueber das jeweils andere. */
badge: "/assets/img/abzeichen-96.png",
/* Gleiche Art ersetzt sich gegenseitig, statt sich zu stapeln -- /* Gleiche Art ersetzt sich gegenseitig, statt sich zu stapeln --
drei Meldungen "Aufgabe ueberfaellig" untereinander helfen drei Meldungen "Aufgabe ueberfaellig" untereinander helfen
niemandem. niemandem.
+3 -3
View File
@@ -23,7 +23,7 @@
„Eigenes CSS" leer lassen (der Grund ist schon „Eigenes CSS" leer lassen (der Grund ist schon
durchsichtig). durchsichtig).
====================================================================== --> ====================================================================== -->
<link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/spendenkarte.css?v=202609292348" />
<style> <style>
/* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das /* DURCHSICHTIG BIS AUF DIE KARTEN. OBS legt die Quelle über das
Bild; jede Fläche, die hier steht, deckt dort etwas zu. */ Bild; jede Fläche, die hier steht, deckt dort etwas zu. */
@@ -80,7 +80,7 @@
<body> <body>
<div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div> <div class="obs-tafel spendentafel" id="tafel" aria-live="polite"></div>
<script src="assets/js/spendenkarte.js?v=202609291714" defer></script> <script src="assets/js/spendenkarte.js?v=202609292348" defer></script>
<script src="assets/js/tafel.js?v=202609291714" defer></script> <script src="assets/js/tafel.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie <!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. --> anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -111,15 +111,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/talente.js?v=202609291714" defer></script> <script src="assets/js/talente.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/team.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/team.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -110,15 +110,15 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/team.js?v=202609291714" defer></script> <script src="assets/js/team.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/team.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/team.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu <!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,15 +84,15 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. --> ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<script src="assets/js/teamlage.js?v=202609291714" defer></script> <script src="assets/js/teamlage.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -112,15 +112,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/teilen.js?v=202609291714" defer></script> <script src="assets/js/teilen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -126,14 +126,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/treff-moderation.js?v=202609291714" defer></script> <script src="assets/js/treff-moderation.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des <!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. --> Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -248,14 +248,14 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. --> die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/auskunft.js?v=202609291714" defer></script> <script src="assets/js/auskunft.js?v=202609292348" defer></script>
<script src="assets/js/treff-regeln.js?v=202609291714" defer></script> <script src="assets/js/treff-regeln.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der <!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". --> Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/uebersicht.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -149,16 +149,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/uebersicht.js?v=202609291714" defer></script> <script src="assets/js/uebersicht.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -335,14 +335,14 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/live.js?v=202609291714" defer></script> <script src="assets/js/live.js?v=202609292348" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609291714" defer></script> <script src="assets/js/unsere-seiten.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -106,17 +106,17 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js <!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit
„Cannot read properties of undefined (reading 'LEITUNG')" ab. --> „Cannot read properties of undefined (reading 'LEITUNG')" ab. -->
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/holen.js?v=202609291714" defer></script> <script src="assets/js/holen.js?v=202609292348" defer></script>
<!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort <!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort
des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet
von pruef-meldungen, nicht beim Ansehen. --> von pruef-meldungen, nicht beim Ansehen. -->
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609291714" defer></script> <script src="assets/js/unterstuetzen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/werdegang.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -144,14 +144,14 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/werdegang.js?v=202609291714" defer></script> <script src="assets/js/werdegang.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -12,13 +12,13 @@
vergessen wird. --> vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/willkommen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026). <!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`, `body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
@@ -75,13 +75,13 @@
<p class="fehler" id="fehler" hidden></p> <p class="fehler" id="fehler" hidden></p>
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/willkommen.js?v=202609291714" defer></script> <script src="assets/js/willkommen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609291714" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609292348" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609291714" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609292348" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/start.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/start.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/wissen.css?v=202609292348" />
<link rel="stylesheet" href="assets/css/module.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/module.css?v=202609292348" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609291714" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609292348" />
</head> </head>
<body class="start"> <body class="start">
@@ -190,15 +190,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609291714" defer></script> <script src="assets/js/meldung.js?v=202609292348" defer></script>
<script src="assets/js/hochladen.js?v=202609291714" defer></script> <script src="assets/js/hochladen.js?v=202609292348" defer></script>
<script src="assets/js/nachfrage.js?v=202609291714" defer></script> <script src="assets/js/nachfrage.js?v=202609292348" defer></script>
<script src="assets/js/wahl.js?v=202609291714" defer></script> <script src="assets/js/wahl.js?v=202609292348" defer></script>
<script src="assets/js/bereiche.js?v=202609291714" defer></script> <script src="assets/js/bereiche.js?v=202609292348" defer></script>
<script src="assets/js/installieren.js?v=202609291714" defer></script> <script src="assets/js/installieren.js?v=202609292348" defer></script>
<script src="assets/js/kopf.js?v=202609291714" defer></script> <script src="assets/js/kopf.js?v=202609292348" defer></script>
<script src="assets/js/glocke.js?v=202609291714" defer></script> <script src="assets/js/glocke.js?v=202609292348" defer></script>
<script src="assets/js/wissen.js?v=202609291714" defer></script> <script src="assets/js/wissen.js?v=202609292348" defer></script>
</body> </body>
</html> </html>