Telefonieren ging nur ueber UDP -- und die Seite sprang immer hoch

=== 1. WARUM TELEFONIEREN NICHT GING ===

Filipe: "es klingelt erscheint auch alles bei jedem aber telefonieren
klappt immer noch nicht."

GEMESSEN, BEVOR ETWAS GEAENDERT WURDE -- und alles war gruen:

  coturn laeuft                 aktiv
  STUN von aussen               antwortet, nennt meine oeffentliche Adresse
  echte Zuteilung von aussen    7/7, Testpaket kam an (Port 49183)
  Dreier-Anruf im Prueflauf     verbindet, alle hoeren alle

Vier Messungen, vier Mal in Ordnung -- und das Telefon ging trotzdem
nicht. Der Grund: Der Prueflauf faehrt BEIDE Seiten auf demselben
Rechner. Dort finden sie sich ueber die direkte Adresse, und die
Vermittlung wird nie gebraucht. Draussen sitzen sie in verschiedenen
Netzen.

DER FUND: Eingetragen war eine einzige Adresse --

    turn:159.195.212.167:3478

Ein `turn:` OHNE `?transport=` heisst UDP, und nur UDP. Nachgemessen
hoert coturn aber auf beidem: 3478/UDP offen, 3478/TCP offen (5349/TLS
ist zu). Angeboten wurde nur der halbe Server.

Wer in einem Netz sitzt, das UDP nach draussen sperrt -- Mobilfunk mit
strengem Profil, Gast-WLAN, Firmennetz --, bekam damit KEINEN
Vermittlungsweg. Es klingelt (das laeuft ueber die Website, also ueber
443), und danach passiert nichts. Genau das gemeldete Bild.

Aus einem Eintrag werden jetzt drei Wege:
  stun:host:port                die eigene Adresse finden, ohne Vermittlung
  turn:host:port?transport=udp  der schnelle Weg
  turn:host:port?transport=tcp  der Weg durch fast jede Sperre

ABGELEITET, NICHT EINGETRAGEN: Drei Zeilen von Hand waeren drei
Stellen, an die beim naechsten Serverumzug jemand denken muesste --
die abgeschriebene Liste, die hier schon zweimal teuer war. Ein
Eintrag MIT `?transport=` bleibt unangetastet, ein fremder Dienst mit
eigenem Passwort sowieso.

pruef-turn-wege (neu, 15/0) sichert beides: dass jeder Weg herauskommt
UND dass jeder turn:-Weg Zugangsdaten traegt. Das Zweite ist das
wichtigere -- auffaechern ohne anmelden haette den Fehler nur
verschoben.

=== 2. DIE SEITE SPRANG BEIM ZURUECKGEHEN IMMER HOCH ===

Filipe: "das nervt man muss dan immer wieder runter scrollen bis man
da ist wo man vorher war."

Der Browser versucht es sogar -- scrollRestoration steht ab Werk auf
"auto". Nur: Jede Seite hier kommt fast leer an und holt ihren Inhalt
danach per Abruf. In dem Moment, in dem der Browser die alte Position
wiederherstellen will, ist das Dokument ein paar hundert Pixel hoch.
Er kann nicht auf Zeile 900 springen, die es noch nicht gibt -- und er
versucht es kein zweites Mal.

Jetzt macht es kopf.js selbst (gilt damit auf allen 21 Seiten): Stelle
merken beim Verlassen, beim Oeffnen zurueckholen und jeden Bildaufbau
lang versuchen, bis das Dokument hoch genug ist. Nach drei Sekunden
wird aufgegeben.

Drei Dinge sind Absicht:
  - NUR beim Zurueckgehen, nicht bei jedem Oeffnen. Wer eine Kachel
    anklickt, will oben anfangen.
  - WER SELBST SCROLLT, GEWINNT. Rad, Wisch oder Taste beenden das
    Nachspringen sofort.
  - Nach einer Stunde vergessen -- auf Zeile 900 zu landen, weil man
    gestern dort war, ist keine Hilfe.

=== 3. DIE LISTE IST NACH ROLLE GETRENNT ===

Filipe: "die rechte hand rolle immer zuerst und dan die modis. die
sollen auch schoen getrennt sein und verschieden aussehen also die
rechte hand viel spezieller."

Die Reihenfolge macht der Server ueber ROLLEN_SORTIERUNG -- dieselbe
Konstante wie ueberall sonst im Haus, nicht eine zweite. Eine
Sortierung nach ROLLE ist ausdruecklich keine Rangliste: Sie sagt
nichts darueber, wie gut jemand ist, nur welche Aufgabe er hat.
Deshalb steht ueber jeder Gruppe ein Satz und keine Zahl.

"Spezieller" heisst hier Material, nicht Groesse: eigener Farbton als
Kante und Schimmer, hellere Flaeche, kraeftigerer Name. Beide Karten
sind GLEICH GROSS und tragen dieselben Zeilen -- zwei Sorten Aufgabe,
keine Rangfolge. Im Kontrastmodus traegt eine doppelte Kante die
Unterscheidung, weil dort keine Farbe mehr wirkt.

=== 4. DER ANRUFKASTEN ===

Vorher: vier gleich aussehende Pillen nebeneinander, darunter eine
Geraeteauswahl, die das breiteste Element war. Kein Name, keine
Ordnung, und der einzige Knopf mit Folgen sah aus wie die anderen.

  - MAN SAH NICHT, MIT WEM. Der wichtigste Satz eines Telefonats fehlte.
    Der Chat kennt den Namen und gibt ihn jetzt mit; wer rangeht, sieht
    den Anrufer.
  - "MIKRO AN" WAR ZWEIDEUTIG -- "ist an" oder "schalt an"? Wer falsch
    raet, sitzt stumm da. Jetzt traegt ein durchgestrichenes Zeichen
    den Zustand, das Wort nur die Sache. aria-pressed bleibt die
    Wahrheit, auch fuer Vorleseprogramme.
  - DIE GERAETEAUSWAHL liegt hinter einem kleinen Knopf, der nur
    erscheint, wenn es ueberhaupt etwas zu waehlen gibt.
  - AUFLEGEN ist als einziger Knopf farbig und steht immer rechts.
  - Ein ruhiger Puls atmet, solange die Verbindung aufbaut, und haelt
    an, sobald sie steht. Bei prefers-reduced-motion steht er still.

=== NEBENBEFUND, DEN DIE PRUEFUNG GEFUNDEN HAT ===

pruef-anruf wurde durch die Auffaecherung an vier Stellen rot: Sie
griff `adressen[0]` und erwartete dort Zugangsdaten. Das ist jetzt der
STUN-Weg, und der hat richtigerweise keine. Gesucht wird nicht mehr
nach PLATZ, sondern nach ART -- ein Index ist eine Annahme darueber,
wie die Liste aussieht, und die hat sich gerade geaendert.

Dazu angepasst: Die Pruefung "die Uhr laeuft" verlangte, dass die Uhr
schon beim Klingeln zaehlt. Seit heute frueh beginnt sie beim
Rangehen (sonst standen im Kasten und im Chat zwei verschiedene
Zahlen). Sie prueft jetzt das Gegenteil -- statt sie zu streichen,
denn eine Zeile weniger haette den Fehler beim naechsten Umbau wieder
durchgelassen.

GEMESSEN: pruef-anruf 114/0 (vorher 111 -- drei MEHR, weil die
Auffaecherung mitgeprueft wird), pruef-turn-wege 15/0,
pruef-meldungen 8/0, pruef-css-klassen ALLES IN ORDNUNG,
pruef-rechtetafel 19/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-19 15:23:15 +02:00
co-authored by Claude Opus 5
parent 18a5231b70
commit d6df590224
48 changed files with 1439 additions and 520 deletions
+63 -10
View File
@@ -686,10 +686,42 @@ melde("=== 6b. Zugangsdaten fuer die Vermittlung ===");
const a = await roh("/workspace/api/anruf/adressen", CREW, { cookie: kModi });
const r = json(a);
ok(r.turn_gesamt === 1 && r.turn_bereit === 1,
`der Modi bekommt einen einsatzbereiten Eintrag (${r.turn_bereit}/${r.turn_gesamt})`);
ok(!!r.adressen?.[0]?.credential && !!r.adressen?.[0]?.username,
"mit Benutzername und Passwort");
/* AUS EINEM EINTRAG WERDEN DREI WEGE (angepasst 19.09.2026).
Bis heute stand hier `adressen[0]` -- und das war der einzige
Eintrag. Seit ein schlichtes `turn:host:port` in stun + turn/udp
+ turn/tcp aufgefaechert wird (workspace-turn.js), ist
`adressen[0]` der STUN-Weg, und der hat RICHTIGERWEISE kein
Passwort. Die Pruefung suchte also am falschen Eintrag.
WARUM ES DIESE AUFFAECHERUNG GIBT: Ein `turn:` ohne
`?transport=` heisst UDP, und nur UDP. Wer in einem Netz sitzt,
das UDP sperrt, bekam damit keinen Vermittlungsweg -- es
klingelte, und danach passierte nichts. Genau der Fehler, den
Filipe am 19.09. gemeldet hat.
Gesucht wird jetzt nach ART, nicht nach Platz. Ein Index ist
eine Annahme darueber, wie die Liste aussieht -- und die hat
sich schon einmal geaendert. */
const turnWege = (r.adressen || []).filter(
(e) => /^turns?:/.test(String(e.urls || "")));
const stunWege = (r.adressen || []).filter(
(e) => /^stun:/.test(String(e.urls || "")));
const ersterTurn = turnWege[0];
ok(r.turn_gesamt === 2 && r.turn_bereit === 2,
`der Modi bekommt zwei einsatzbereite Wege (${r.turn_bereit}/${r.turn_gesamt})`);
ok(turnWege.length === 2
&& turnWege.some((e) => /transport=udp/.test(String(e.urls)))
&& turnWege.some((e) => /transport=tcp/.test(String(e.urls))),
`naemlich UDP und TCP (${turnWege.map((e) => e.urls).join(", ")})`);
ok(stunWege.length === 1, "dazu ein STUN-Weg, der ohne Vermittlung auskommt");
/* Die ZAHL in die Bedingung, nicht nur in den Meldetext: `every()`
auf einer leeren Liste waere sonst trivial wahr. */
ok(turnWege.length === 2 && turnWege.every((e) => e.credential && e.username),
"und beide tragen Benutzername und Passwort");
ok(!stunWege[0]?.credential,
"STUN bekommt keins -- es kennt keine Anmeldung");
/* DIE WICHTIGSTE PRUEFUNG DES ABSCHNITTS. Im ROHEN Text gesucht,
nicht im ausgewerteten Objekt. */
@@ -699,12 +731,14 @@ melde("=== 6b. Zugangsdaten fuer die Vermittlung ===");
/* Jeder bekommt EIGENE Zugangsdaten -- im coturn-Protokoll steht
damit die Nummer, nicht ein Sammelkonto. */
const rDogi = json(await roh("/workspace/api/anruf/adressen", HAUS, { cookie: kDogi }));
ok(rDogi.adressen?.[0]?.username !== r.adressen?.[0]?.username,
const dogiTurn = (rDogi.adressen || []).find(
(e) => /^turns?:/.test(String(e.urls || "")));
ok(!!dogiTurn?.username && dogiTurn.username !== ersterTurn?.username,
"DogFather und der Modi bekommen verschiedene Zugangsdaten");
/* Der Ablauf muss fuer den Browser LESBAR sein -- darauf beruht das
Auffrischen vor jedem Anruf in anruf.js. */
const ablauf = Number(String(r.adressen?.[0]?.username || "").split(":")[0]);
const ablauf = Number(String(ersterTurn?.username || "").split(":")[0]);
ok(ablauf > Math.floor(Date.now() / 1000) + 3600,
`der Ablauf steht vorn im Benutzernamen und liegt in der Zukunft (${ablauf})`);
}
@@ -812,7 +846,20 @@ melde("=== 7. Im Browser ===");
ok(kasten.da, `der Anrufkasten erscheint ("${kasten.lage}")`);
ok(/klingelt|Verbind/i.test(kasten.lage),
`und sagt, was gerade passiert ("${kasten.lage}")`);
ok(/^\d\d:\d\d$/.test(kasten.zeit), `die Uhr laeuft (${kasten.zeit})`);
/* WAEHREND ES KLINGELT, ZAEHLT DIE UHR NICHT (geaendert 19.09.2026).
Vorher stand hier, die Uhr MUESSE laufen -- und sie tat es,
ab dem Waehlen. Wer 30 Sekunden klingeln liess und 12
Sekunden sprach, las im Kasten "00:42" und danach im Chat
"Anruf . 12 Sekunden". Zwei Zahlen fuer dieselbe Sache.
Jetzt beginnt sie beim Rangehen. Solange es klingelt, ist
das Feld leer -- und GENAU DAS wird hier geprueft, statt
die Pruefung einfach zu streichen: Eine Zeile weniger
haette denselben Fehler beim naechsten Umbau wieder
durchgelassen. */
ok(kasten.zeit === "" || kasten.zeit === "–",
`waehrend es klingelt zaehlt die Uhr NICHT ("${kasten.zeit}")`);
/* Und es klingelt hoerbar. Waere der Ton wieder ausgebaut,
stuende hier 0. */
@@ -979,7 +1026,13 @@ melde("=== 8. Zu dritt ===");
const k = document.getElementById("anruf-hoeren");
return k ? { text: k.textContent.trim(), an: k.getAttribute("aria-pressed") } : null;
});
ok(knopf?.text === "Lautsprecher an" && knopf?.an === "true",
/* DER ZUSTAND STEHT IN aria-pressed, NICHT MEHR IM TEXT
(geaendert 19.09.2026). Die Aufschrift "Lautsprecher an" war
zweideutig -- "ist an" oder "schalt an"? Jetzt traegt das
durchgestrichene Zeichen den Zustand und das Wort nur die
Sache. Geprueft wird deshalb aria-pressed; der Text bleibt
gleich und beweist nichts mehr. */
ok(knopf?.an === "true",
`der Lautsprecher-Knopf ist da und steht auf an („${knopf?.text}")`);
await a.se.click("#anruf-hoeren");
@@ -991,8 +1044,8 @@ melde("=== 8. Zu dritt ===");
const k = document.getElementById("anruf-hoeren");
return { text: k.textContent.trim(), an: k.getAttribute("aria-pressed") };
});
ok(knopf2.text === "Lautsprecher aus" && knopf2.an === "false",
`und der Knopf sagt es auch („${knopf2.text}")`);
ok(knopf2.an === "false",
`und der Knopf steht auf aus (aria-pressed="${knopf2.an}")`);
/* NUR BEI IHM. Ein Schalter, der bei den anderen mitwirkt,
waere kein Lautsprecher, sondern eine Fernbedienung. */
+142
View File
@@ -0,0 +1,142 @@
/* =====================================================================
pruef-turn-wege.mjs — Es klingelt, aber es verbindet nicht.
Filipe, 19.09.2026: „es klingelt erscheint auch alles bei jedem aber
telefonieren klappt immer noch nicht was läuft ich will es heute an
die leute bringen also los."
---------------------------------------------------------------------
WAS VORHER GEMESSEN WURDE — UND WARUM ALLES GRÜN WAR
Der Reihe nach, bevor eine Zeile Code angefasst wurde:
coturn läuft aktiv
STUN von außen antwortet, nennt die eigene Adresse
echte Zuteilung von außen 7/7, das Testpaket kam an
Dreier-Anruf im Prüflauf verbindet, alle hören alle
Vier Messungen, vier Mal in Ordnung — und das Telefon ging trotzdem
nicht. Das ist die unangenehmste Lage überhaupt, und sie hat genau
einen Grund: Der Prüflauf fährt BEIDE Seiten auf demselben Rechner.
Dort finden sie sich über die direkte Adresse, und die Vermittlung
wird nie gebraucht. Draußen sitzen sie in verschiedenen Netzen.
---------------------------------------------------------------------
DER FUND
Eingetragen war eine einzige Adresse: `turn:159.195.212.167:3478`.
Ein `turn:` OHNE `?transport=` heißt **UDP**, und nur UDP. Gemessen
hört coturn aber auf beidem — 3478/UDP offen, 3478/TCP offen.
Angeboten wurde nur der halbe Server.
Wer in einem Netz sitzt, das UDP nach draußen sperrt (Mobilfunk mit
strengem Profil, Gast-WLAN, Firmennetz), bekommt damit KEINEN
Vermittlungsweg. Es klingelt — das läuft über die Website, also über
443 — und danach passiert nichts.
---------------------------------------------------------------------
WAS DIESE PRÜFUNG SICHERT
Nicht „gibt es einen TURN-Server" — das war schon vorher grün und hat
nichts genützt. Sondern: **Kommt aus einem eingetragenen Eintrag
wirklich jeder Weg heraus, und trägt jeder davon Zugangsdaten?**
Der zweite Teil ist der wichtigere. Würde aufgefächert, ohne danach
anzumelden, hätten zwei von drei Wegen kein Passwort — coturn weist
sie ab, und wir hätten den Fehler nur verschoben.
AUFRUF: node server/pruef-turn-wege.mjs
Läuft in unter einer Sekunde, ohne Server, ohne Netz.
===================================================================== */
import { writeFileSync, unlinkSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { wegeAusfaechern, mitZugangsdaten, turnZugang } from "./workspace-turn.js";
let ok = 0, fehl = 0;
const pruef = (name, bedingung, zusatz = "") => {
if (bedingung) { ok++; console.log(` OK ${name}`); }
else { fehl++; console.log(` FEHL ${name}${zusatz ? " — " + zusatz : ""}`); }
};
console.log("\n=== Vermittlungswege: kommt jeder heraus, und trägt jeder ein Passwort? ===\n");
/* Ein Geheimnis nur für diese Prüfung -- nie das echte. Es wandert in
eine Datei, weil mitZugangsdaten aus einer Datei liest; sie wird am
Ende wieder entfernt. */
const DATEI = join(tmpdir(), `turn-pruef-${process.pid}.geheimnis`);
writeFileSync(DATEI, "x".repeat(48), "utf8");
try {
/* ---- 1. Ein schlichter Eintrag wird zu drei Wegen ---------------- */
const raus = wegeAusfaechern([{ urls: "turn:beispiel.de:3478" }]);
const urls = raus.map((e) => String(e.urls));
pruef("aus einem Eintrag werden genau drei Wege", raus.length === 3,
`es sind ${raus.length}: ${urls.join(", ")}`);
pruef("darunter STUN — der Weg, der ohne Vermittlung auskommt",
urls.includes("stun:beispiel.de:3478"));
pruef("darunter der schnelle Weg (UDP)",
urls.includes("turn:beispiel.de:3478?transport=udp"));
pruef("darunter der Weg durch fast jede Sperre (TCP)",
urls.includes("turn:beispiel.de:3478?transport=tcp"),
"GENAU DIESER hat gefehlt — deshalb ging es nicht");
pruef("STUN steht vorn, TCP hinten", /^stun:/.test(urls[0]) && /transport=tcp$/.test(urls[2]),
urls.join(" → "));
/* ---- 2. Und jeder turn:-Weg bekommt Zugangsdaten ----------------- */
const { adressen, turn_gesamt, turn_bereit } =
mitZugangsdaten(raus, "w1", Date.now(), DATEI);
pruef("beide turn:-Wege werden gezählt", turn_gesamt === 2, `gezählt: ${turn_gesamt}`);
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG, nicht nur in den Meldetext:
Bei einer leeren Liste waere "alle haben ein Passwort" sonst
trivialerweise wahr. */
pruef("und beide haben auch eins", turn_bereit === 2 && turn_gesamt === 2,
`bereit: ${turn_bereit} von ${turn_gesamt}`);
const mitPasswort = adressen.filter(
(e) => /^turns?:/.test(String(e.urls)) && e.credential);
pruef("nachgezählt an der ausgelieferten Liste", mitPasswort.length === 2,
`${mitPasswort.length} von 2`);
pruef("STUN bekommt KEINS — es kennt keine Anmeldung",
!adressen.find((e) => /^stun:/.test(String(e.urls)))?.credential);
/* ---- 3. Was ausdrücklich gemeint war, bleibt unangetastet -------- */
const fremd = wegeAusfaechern([
{ urls: "turn:eigen.de:3478?transport=tcp" },
{ urls: "stun:schon.da:3478" },
{ urls: "turn:fremder-dienst.de:3478", username: "a", credential: "b" },
]);
pruef("ein Eintrag MIT transport bleibt, wie er ist",
fremd.length === 3 && fremd.some((e) => e.urls === "turn:eigen.de:3478?transport=tcp"));
pruef("ein fremder Dienst mit eigenem Passwort wird nicht angefasst",
fremd.some((e) => e.urls === "turn:fremder-dienst.de:3478" && e.credential === "b"));
/* ---- 4. Die Zugangsdaten sind zeitlich begrenzt ------------------ */
const z = turnZugang("w1", "x".repeat(48), Date.parse("2026-09-19T12:00:00Z"));
pruef("der Benutzername trägt seinen Ablauf", /^\d+:w1$/.test(z.username), z.username);
pruef("und er läuft wirklich ab", z.ablauf > Math.floor(Date.parse("2026-09-19T12:00:00Z") / 1000));
/* ---- DIE GEGENPROBEN ---------------------------------------------
Eine Prüfung, die immer bestätigt, bestätigt nichts. */
console.log("\n --- Gegenproben (jede MUSS anschlagen) ---");
const ohneTcp = wegeAusfaechern([{ urls: "turn:x:1" }])
.filter((e) => !/transport=tcp/.test(String(e.urls)));
pruef("Gegenprobe: fehlte der TCP-Weg, schlüge Prüfung 1 an",
!ohneTcp.some((e) => /transport=tcp/.test(String(e.urls))));
const ohneGeheimnis = mitZugangsdaten(raus, "w1", Date.now(),
join(tmpdir(), "gibt-es-nicht-" + process.pid));
pruef("Gegenprobe: ohne Geheimnis meldet die Rechnung 0 bereit und nennt den Grund",
ohneGeheimnis.turn_bereit === 0 && !!ohneGeheimnis.grund,
`bereit ${ohneGeheimnis.turn_bereit}, Grund "${ohneGeheimnis.grund}"`);
} finally {
try { unlinkSync(DATEI); } catch { /* egal */ }
}
console.log(`\n ${ok} bestanden, ${fehl} fehlgeschlagen\n`);
process.exit(fehl ? 1 : 0);
+17 -2
View File
@@ -73,7 +73,7 @@ import {
} from "./workspace.js";
import { chatEreignis, istDrinFuerAnruf, teilnehmerFuerAnruf } from "./workspace-chat.js";
import { darfTelefonieren } from "./workspace-treffchat.js";
import { mitZugangsdaten } from "./workspace-turn.js";
import { mitZugangsdaten, wegeAusfaechern } from "./workspace-turn.js";
export const anrufRouter = express.Router();
@@ -324,8 +324,23 @@ anrufRouter.get("/workspace/api/anruf/adressen", (req, res) => {
Als Kennung die PERSONENNUMMER, nicht der Name -- sie landet im
Protokoll von coturn, und das ist kein Ort fuer Klarnamen. */
/* ERST AUFFAECHERN, DANN ANMELDEN (19.09.2026).
Ein eingetragenes `turn:host:port` ohne `?transport=` heisst
UDP -- und nur UDP. Wer in einem Netz sitzt, das UDP nach
draussen sperrt, bekommt damit keinen Vermittlungsweg: Es
klingelt (das laeuft ueber 443), und danach passiert nichts.
Nachgemessen hoert coturn auf beidem. Aus einem Eintrag werden
deshalb drei Wege -- stun, turn/udp, turn/tcp. Die Reihenfolge
ist Absicht, siehe workspace-turn.js.
VOR mitZugangsdaten, nicht danach: Die neuen turn:-Eintraege
brauchen dieselben gerechneten Zugangsdaten wie der Eintrag, aus
dem sie entstanden sind. Andersherum waeren zwei von drei ohne
Passwort -- also genau der Zustand, den wir beheben wollen. */
const { adressen, turn_gesamt, turn_bereit, grund } =
mitZugangsdaten(liste, `w${req.person.id}`);
mitZugangsdaten(wegeAusfaechern(liste), `w${req.person.id}`);
if (grund) {
/* DER DRITTE AUSGANG. „Kann nicht nachsehen" ist etwas anderes
+102
View File
@@ -181,3 +181,105 @@ export function mitZugangsdaten(liste, kennung, jetzt = Date.now(),
grund: "",
};
}
/* =====================================================================
EIN EINTRAG, DREI WEGE — 19.09.2026
Filipe: „es klingelt erscheint auch alles bei jedem aber telefonieren
klappt immer noch nicht."
---------------------------------------------------------------------
WAS GEMESSEN WURDE, BEVOR ETWAS GEÄNDERT WURDE
Der Reihe nach, und jeder Schritt war grün:
coturn läuft aktiv
STUN von außen antwortet, nennt meine Adresse
echte Zuteilung von außen 7 von 7 Prüfungen, Paket kam an
Dreier-Anruf im Prüflauf verbindet, alle hören alle
Es war also weder der Server noch die Logik. Der Unterschied zwischen
Prüflauf und Wirklichkeit ist das NETZ: Im Prüflauf sitzen beide
Seiten auf demselben Rechner und finden sich über die direkte
Adresse. Draußen sitzen sie in verschiedenen Netzen.
---------------------------------------------------------------------
DER FUND
Eingetragen war genau eine Adresse:
turn:159.195.212.167:3478
Ein `turn:` OHNE `?transport=` heißt **UDP**. Nachgemessen hört
coturn aber auf beidem: 3478/UDP offen, 3478/TCP offen (5349/TLS ist
zu). Angeboten wurde nur der UDP-Weg.
Wer in einem Netz sitzt, das UDP nach draußen sperrt — Mobilfunk mit
strengem Profil, Gast-WLAN, Firmennetz, manche Hotspots —, bekommt
damit KEINEN Vermittlungsweg. Es klingelt (das läuft über die
Website, also über 443), und danach passiert nichts. Genau das
Bild, das Filipe beschreibt.
---------------------------------------------------------------------
WARUM ABGELEITET UND NICHT EINGETRAGEN
Man könnte die drei Zeilen von Hand in die Einstellung schreiben.
Dann stünden dort drei Adressen, die denselben Host meinen, und beim
nächsten Serverumzug müsste jemand an drei Stellen denken — die
abgeschriebene Liste, die dieses Haus schon zweimal teuer bezahlt
hat.
Stattdessen: Aus einem eingetragenen `turn:host:port` entstehen
automatisch
stun:host:port damit jeder seine öffentliche
Adresse findet (das ist der Weg,
der in den meisten Fällen reicht
und KEINE Vermittlung kostet)
turn:host:port?transport=udp der schnelle Weg
turn:host:port?transport=tcp der Weg, der durch fast jede
Sperre kommt
Wer eine Adresse MIT `?transport=` einträgt, meint sie genau so —
die bleibt unangetastet. Und ein fremder Dienst mit eigenem Passwort
sowieso (siehe mitZugangsdaten).
DIE REIHENFOLGE IST ABSICHT: STUN zuerst, dann UDP, dann TCP. Der
Browser probiert alle gleichzeitig und nimmt den ersten, der trägt —
aber bei Gleichstand gewinnt der frühere, und TCP-Vermittlung ist
der langsamste der drei.
===================================================================== */
/** Aus jedem schlichten `turn:`-Eintrag drei Wege machen.
*
* @param liste wie eingetragen
* @returns {object[]} die erweiterte Liste
*/
export function wegeAusfaechern(liste) {
const rein = Array.isArray(liste) ? liste : [];
const raus = [];
const schon = new Set();
const dazu = (e) => {
const s = String(e?.urls || "");
if (!s || schon.has(s)) return;
schon.add(s);
raus.push(e);
};
for (const e of rein) {
const url = String(e?.urls || "");
const m = /^turn:([^?]+)$/.exec(url);
/* Kein schlichter turn:-Eintrag -- unverändert übernehmen. Das
trifft stun:, turns:, alles mit ?transport= und jeden fremden
Dienst mit eigenen Zugangsdaten. */
if (!m || e?.credential) { dazu(e); continue; }
const ziel = m[1];
/* STUN braucht keine Anmeldung und bekommt deshalb auch keine --
mitZugangsdaten lässt stun:-Einträge ohnehin in Ruhe. */
dazu({ urls: `stun:${ziel}` });
dazu({ ...e, urls: `turn:${ziel}?transport=udp` });
dazu({ ...e, urls: `turn:${ziel}?transport=tcp` });
}
return raus;
}
+23 -2
View File
@@ -104,7 +104,7 @@
import express from "express";
import {
db, sitzungLesen, fuehrtTeamDogi, ROLLEN_NAME,
db, sitzungLesen, fuehrtTeamDogi, ROLLEN_NAME, ROLLEN_SORTIERUNG,
} from "./workspace.js";
import {
ENTWICKLUNG_BLOECKE, ENTWICKLUNG_PUNKTE, ENTWICKLUNG_STUFEN,
@@ -587,10 +587,26 @@ werdegangRouter.use("/workspace/api/werdegang", angemeldet);
------------------------------------------------------------------- */
werdegangRouter.get("/workspace/api/werdegang/liste", nurLeitung, (req, res) => {
try {
/* NACH ROLLE, DANN NACH NAMEN (19.09.2026).
Filipe: „die reihenfolge der listen soll immer angepasst sein
hatten wir doch schon. die rechte hand rolle immer zuerst und
dan die modis."
Vorher stand hier nur `ORDER BY name` mit der Begründung, eine
Sortierung nach Aktivität wäre eine Rangliste mit anderem Namen.
Das gilt weiter — aber eine Sortierung nach ROLLE ist keine:
Sie sagt nichts darüber, wie gut jemand ist, sondern nur, welche
Aufgabe er hat. Genau dieselbe Reihenfolge benutzt das Haus in
`ROLLEN_SORTIERUNG` schon überall sonst.
ABGELEITET, NICHT ABGESCHRIEBEN: Die Reihenfolge kommt aus
derselben Konstante wie in der Personenliste. Wer dort eine
Rolle verschiebt, verschiebt sie hier mit. */
const leute = db().prepare(
`SELECT id, name, rolle FROM personen
WHERE aktiv = 1 AND rolle IN (${KARTEN_ROLLEN.map(() => "?").join(",")})
ORDER BY name COLLATE NOCASE`).all(...KARTEN_ROLLEN);
ORDER BY ${ROLLEN_SORTIERUNG}, name COLLATE NOCASE`).all(...KARTEN_ROLLEN);
const spalten = monatsspalten();
const liste = leute.map((p) => {
@@ -604,6 +620,11 @@ werdegangRouter.get("/workspace/api/werdegang/liste", nurLeitung, (req, res) =>
return {
id: p.id,
name: p.name,
/* DIE ROLLE SELBST KOMMT MIT, nicht nur ihr Name: Die
Oberfläche gruppiert danach und zeichnet die Leitung anders.
Über den NAMEN zu gruppieren wäre die Stelle, die beim
nächsten Umbenennen auseinanderfällt. */
rolle: p.rolle,
rolle_name: ROLLEN_NAME[p.rolle] ?? p.rolle,
gesetzt: stand.length,
gesamt: ENTWICKLUNG_FREMD.length,
+5 -5
View File
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
<link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -119,8 +119,8 @@
<p class="probe__ende" id="rat"></p>
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/anruf-probe.js?v=202609191506" defer></script>
<script src="assets/js/anruf-probe.js?v=202609191522" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191506",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191522",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191506",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191522",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191506",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191522",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191506",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191522",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+158
View File
@@ -1777,3 +1777,161 @@
.chat__nachtruhe { border: 1px solid CanvasText; }
.chat__nachtruhe-zeichen svg { fill: CanvasText; }
}
/* =====================================================================
DER ANRUFKASTEN, NEU GEBAUT — 19.09.2026
Filipe: „das soll viel besser und geiler aussehen bitte."
Vorher: vier gleich aussehende Pillen nebeneinander („Mikro an",
„Lautsprecher an", „Kamera an", „Auflegen"), darunter eine
Geräteauswahl, die das breiteste Element des Kastens war. Kein
Name, keine Ordnung, und der einzige Knopf mit Folgen sah aus wie
die anderen drei.
Jetzt drei Ebenen, und jede hat eine Aufgabe:
OBEN wen habe ich am Apparat, was macht die Verbindung gerade,
wie lange läuft es schon
MITTE die Gegenstellen (Ton oder Bild)
UNTEN zwei Schalter links, Auflegen rechts — als einziges mit
Farbe
AUGENSCHONEND BLEIBT AUGENSCHONEND: kein Neon, keine harte Kante,
der Puls ist eine ruhige Atembewegung und steht still, sobald
`prefers-reduced-motion` gesetzt ist.
===================================================================== */
/* ---- Oben: wer, was, wie lange ------------------------------------- */
.anruf__kopf {
display: flex; align-items: center; gap: 10px;
padding-bottom: 12px; margin-bottom: 12px;
border-bottom: 1px solid var(--rand);
}
.anruf__kopftext { flex: 1; min-width: 0; display: grid; gap: 1px; }
.anruf__wer {
font-size: 1rem; font-weight: 680; color: var(--text);
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.anruf__lage { font-size: .8rem; color: var(--text-still); }
.anruf__zeit {
font-size: .9rem; color: var(--text-leise);
font-variant-numeric: tabular-nums;
}
/* Der Puls. Er ersetzt das, was vorher gar nichts sagte: Solange die
Verbindung noch nicht steht, atmet er; steht sie, wird er ruhig. */
.anruf__puls {
flex: none; width: 10px; height: 10px; border-radius: 999px;
background: color-mix(in srgb, var(--gut, #79d1a2) 75%, transparent);
box-shadow: 0 0 0 0 color-mix(in srgb, var(--gut, #79d1a2) 45%, transparent);
animation: anruf-puls 2s ease-out infinite;
}
.anruf[data-steht="ja"] .anruf__puls { animation: none; }
@keyframes anruf-puls {
0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--gut, #79d1a2) 40%, transparent); }
70% { box-shadow: 0 0 0 9px rgba(0, 0, 0, 0); }
100% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); }
}
@media (prefers-reduced-motion: reduce) { .anruf__puls { animation: none; } }
/* ---- Unten: die Knopfreihe ----------------------------------------- */
.anruf__knoepfe {
display: flex; align-items: center; gap: 8px;
margin-top: 12px;
}
/* Die Schalter. Zeichen oben, Wort darunter — und der Zustand steckt
im Zeichen, nicht in der Aufschrift. Ein Knopf, auf dem „Mikro an"
steht, ist zweideutig; ein durchgestrichenes Mikrofon ist es nicht. */
.anruf__schalter {
display: grid; justify-items: center; gap: 3px;
min-width: 56px; min-height: 52px;
padding: 6px 8px;
border: 1px solid var(--rand); border-radius: var(--radius-klein);
background: rgba(255, 255, 255, .03);
color: var(--text-leise);
cursor: pointer;
transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.anruf__schalter:hover,
.anruf__schalter:focus-visible {
background: rgba(255, 255, 255, .07); color: var(--text);
}
.anruf__schalter-text { font-size: .68rem; letter-spacing: .02em; }
.anruf__zeichen {
width: 20px; height: 20px;
fill: none; stroke: currentColor; stroke-width: 1.7;
stroke-linecap: round; stroke-linejoin: round;
}
/* Der Strich liegt immer im Zeichen und wird nur sichtbar, wenn der
Schalter aus ist — so muss das Zeichen nicht ausgetauscht werden. */
.anruf__strich { opacity: 0; transition: opacity .15s ease; }
.anruf__schalter[aria-pressed="false"] {
color: var(--text-still);
border-color: color-mix(in srgb, var(--warn, #d8a76a) 38%, var(--rand));
background: color-mix(in srgb, var(--warn, #d8a76a) 9%, transparent);
}
.anruf__schalter[aria-pressed="false"] .anruf__strich { opacity: 1; }
/* Die drei Punkte: alles, was man einmal im Jahr braucht. */
.anruf__mehr {
display: grid; place-items: center;
width: 38px; min-height: 52px;
border: 1px solid transparent; border-radius: var(--radius-klein);
background: none; color: var(--text-still); cursor: pointer;
}
.anruf__mehr:hover, .anruf__mehr:focus-visible {
color: var(--text-leise); border-color: var(--rand);
}
.anruf__mehr svg { width: 18px; height: 18px; fill: currentColor; }
/* Auflegen. Der einzige Knopf mit Farbe — weil er der einzige ist,
der etwas beendet. Ganz rechts, immer an derselben Stelle. */
.anruf__auf {
margin-inline-start: auto;
display: inline-flex; align-items: center; gap: 7px;
min-height: 52px; padding: 0 16px;
border: 1px solid color-mix(in srgb, #c96a6a 55%, transparent);
border-radius: var(--radius-klein);
background: color-mix(in srgb, #c96a6a 18%, transparent);
color: #f0c9c9; font-size: .88rem; font-weight: 640;
cursor: pointer;
transition: background .15s ease;
}
.anruf__auf:hover, .anruf__auf:focus-visible {
background: color-mix(in srgb, #c96a6a 28%, transparent);
}
/* Der Hörer zeigt nach unten — aufgelegt. */
.anruf__auf .anruf__zeichen {
width: 18px; height: 18px; fill: currentColor; stroke: none;
transform: rotate(133deg);
}
/* ---- Die Geräteauswahl, versteckt bis man sie sucht ---------------- */
.anruf__mehrzeile {
margin-top: 10px; padding-top: 10px;
border-top: 1px solid var(--rand);
display: grid; gap: 4px;
}
.anruf__mehrschild {
font-size: .7rem; letter-spacing: .06em; text-transform: uppercase;
color: var(--text-still);
}
.anruf__ausgabe { width: 100%; }
/* Auf schmalen Bildschirmen dürfen die Wörter unter den Zeichen weg —
die Zeichen bleiben, und der Zustand steckt ohnehin in ihnen. */
@media (max-width: 380px) {
.anruf__schalter { min-width: 48px; }
.anruf__schalter-text { display: none; }
.anruf__auf span { display: none; }
.anruf__auf { padding: 0 14px; }
}
/* Im Kontrastmodus trägt keine Farbe. Dann muss die Kante sagen, was
aus ist — sonst sehen an und aus gleich aus. */
@media (forced-colors: active) {
.anruf__schalter[aria-pressed="false"] { border-style: dashed; border-width: 2px; }
.anruf__auf { border-width: 2px; }
}
+94
View File
@@ -421,3 +421,97 @@
color: var(--text-leise);
}
.w-weg--leise:hover { color: var(--text); border-color: var(--rand-hell); }
/* =====================================================================
DIE LISTE IST NACH ROLLE GETRENNT — 19.09.2026
Filipe: „die rechte hand rolle immer zuerst und dan die modis. die
sollen auch schön getrennt sein und verschieden aussehen also die
rechte hand viel spezieller."
---------------------------------------------------------------------
WAS „SPEZIELLER" HIER HEISST — UND WAS NICHT
Nicht: größer, lauter, wichtiger. Die Hausregel gilt weiter —
DogFather steht nicht über seinem Team, und die rechte Hand auch
nicht. Was sie unterscheidet, ist die AUFGABE: Sie koordiniert den
Alltag und schaut mit auf die anderen. Genau das darf man sehen.
Umgesetzt wird es deshalb über MATERIAL, nicht über Größe:
Rechte Hand eigener Farbton als Kante und Schimmer, hellere
Fläche, kräftigerer Name, breiterer linker Rand
Modis die ruhige Grundform des Hauses
Beide Karten sind gleich groß und tragen dieselben Zeilen. Wer sie
nebeneinander sieht, erkennt zwei Sorten Aufgabe — keine Rangfolge.
DER TON IST DER DER KACHEL. `--ton` steht am <body> (data-ton),
gesetzt von kopf.js aus derselben Kachelliste, aus der auch die
Farbe der Kachel kommt. Eine eigene Farbe hier wäre eine zweite
Quelle, die beim nächsten Farblauf auseinanderfällt.
===================================================================== */
.w-liste { display: grid; gap: 0; }
.w-gruppe {
margin: 26px 0 10px;
padding-left: 12px;
border-left: 3px solid var(--rand);
}
/* Die erste Gruppe braucht oben keinen Abstand — darüber steht schon
die Überschrift der Seite. */
.w-liste > .w-gruppe:first-child { margin-top: 4px; }
.w-gruppe__name {
margin: 0;
font-size: .82rem; font-weight: 700;
letter-spacing: .09em; text-transform: uppercase;
color: var(--text-leise);
}
.w-gruppe__satz {
margin: 3px 0 0; max-width: 60ch;
font-size: .84rem; line-height: 1.55; color: var(--text-still);
}
/* Die Leitung bekommt den Ton der Kachel — als Kante und als leiser
Schimmer, nicht als Fläche. Eine gefüllte Fläche würde den Namen
darauf schlechter lesbar machen, und das ist der einzige Text, der
hier wirklich zählt. */
.w-gruppe[data-rolle="hand"] {
border-left-color: color-mix(in srgb, var(--ton, #8ec9ff) 70%, transparent);
}
.w-gruppe[data-rolle="hand"] .w-gruppe__name {
color: color-mix(in srgb, var(--ton, #8ec9ff) 72%, #dbe4ef);
}
.w-karte[data-rolle="hand"] {
border-left-width: 4px;
border-left-color: color-mix(in srgb, var(--ton, #8ec9ff) 70%, transparent);
border-color: color-mix(in srgb, var(--ton, #8ec9ff) 26%, var(--rand));
background:
linear-gradient(115deg,
color-mix(in srgb, var(--ton, #8ec9ff) 7%, transparent) 0%,
transparent 58%),
color-mix(in srgb, var(--tinte) 91%, #ffffff 9%);
}
.w-karte[data-rolle="hand"]:hover,
.w-karte[data-rolle="hand"]:focus-visible {
border-color: color-mix(in srgb, var(--ton, #8ec9ff) 46%, var(--rand));
background:
linear-gradient(115deg,
color-mix(in srgb, var(--ton, #8ec9ff) 11%, transparent) 0%,
transparent 58%),
color-mix(in srgb, var(--tinte) 87%, #ffffff 13%);
}
.w-karte[data-rolle="hand"] .w-karte__name { font-weight: 700; }
.w-karte[data-rolle="hand"] .w-karte__rolle {
color: color-mix(in srgb, var(--ton, #8ec9ff) 62%, var(--text-still));
}
/* Im Windows-Kontrastmodus trägt keine Farbe mehr etwas. Dann muss die
Kante die Unterscheidung allein machen — sonst sehen beide Sorten
Karte gleich aus und die Trennung ist weg. */
@media (forced-colors: active) {
.w-karte[data-rolle="hand"] { border-left-width: 4px; border-left-style: double; }
.w-gruppe[data-rolle="hand"] { border-left-style: double; }
}
+143 -26
View File
@@ -110,20 +110,86 @@
k.setAttribute('role', 'dialog');
k.setAttribute('aria-label', 'Anruf');
k.innerHTML = `
<!-- ============================================================
NEU GEBAUT AM 19.09.2026.
Filipe: „das soll viel besser und geiler aussehen bitte."
Was vorher nicht stimmte, der Reihe nach:
1. MAN SAH NICHT, MIT WEM. Oben stand „Es klingelt …" und
sonst nichts. Der wichtigste Satz eines Telefonats ist,
wen man am Apparat hat.
2. „MIKRO AN" WAR ZWEIDEUTIG. Ein Knopf mit dieser
Aufschrift kann heißen „das Mikro IST an" oder „drück
hier, um es anzuschalten". Beides ist plausibel, und wer
falsch rät, schaltet sich stumm, ohne es zu merken.
Jetzt trägt jeder Knopf ein Zeichen für den Zustand UND
ein Wort für die Sache — „Mikro" mit durchgestrichenem
Zeichen heißt aus, fertig.
3. DIE GERÄTEAUSWAHL WAR DAS GRÖSSTE ELEMENT im Kasten,
obwohl man sie einmal im Jahr braucht. Sie liegt jetzt
hinter einem kleinen Knopf.
4. ES GAB KEINE ORDNUNG. Vier gleich aussehende Pillen
nebeneinander, darunter „Auflegen" in derselben Form.
Jetzt: die beiden Schalter links, Auflegen rechts und
als einziger Knopf mit Farbe.
============================================================= -->
<div class="anruf__kopf">
<span class="anruf__lage" id="anruf-lage">Verbindung …</span>
<span class="anruf__puls" id="anruf-puls" aria-hidden="true"></span>
<span class="anruf__kopftext">
<span class="anruf__wer" id="anruf-wer">Anruf</span>
<span class="anruf__lage" id="anruf-lage">Verbindung …</span>
</span>
<span class="anruf__zeit" id="anruf-zeit"></span>
</div>
<div class="anruf__leute" id="anruf-leute"></div>
<div class="anruf__knoepfe">
<button type="button" class="anruf__knopf anruf__knopf--ton" id="anruf-ton"
aria-pressed="true">Mikro an</button>
<button type="button" class="anruf__knopf anruf__knopf--hoeren" id="anruf-hoeren"
aria-pressed="true">Lautsprecher an</button>
<button type="button" class="anruf__knopf anruf__knopf--video" id="anruf-video"
aria-pressed="false" hidden>Kamera an</button>
<button type="button" class="anruf__knopf anruf__knopf--auf" id="anruf-auflegen">Auflegen</button>
<button type="button" class="anruf__schalter" id="anruf-ton" aria-pressed="true">
<svg class="anruf__zeichen" viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 3.5a3 3 0 0 1 3 3v5a3 3 0 0 1-6 0v-5a3 3 0 0 1 3-3z"/>
<path d="M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21"/>
<path class="anruf__strich" d="M4 4l16 16"/>
</svg>
<span class="anruf__schalter-text">Mikro</span>
</button>
<button type="button" class="anruf__schalter" id="anruf-hoeren" aria-pressed="true">
<svg class="anruf__zeichen" viewBox="0 0 24 24" aria-hidden="true">
<path d="M4 9.5h3.5L12 5.5v13L7.5 14.5H4z"/>
<path d="M16 9a4.5 4.5 0 0 1 0 6M18.5 6.5a8 8 0 0 1 0 11"/>
<path class="anruf__strich" d="M4 4l16 16"/>
</svg>
<span class="anruf__schalter-text">Ton</span>
</button>
<button type="button" class="anruf__schalter" id="anruf-video"
aria-pressed="false" hidden>
<svg class="anruf__zeichen" viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.5 7h11v10h-11z"/><path d="M14.5 11l6-3.5v9l-6-3.5z"/>
<path class="anruf__strich" d="M4 4l16 16"/>
</svg>
<span class="anruf__schalter-text">Kamera</span>
</button>
<button type="button" class="anruf__mehr" id="anruf-mehr"
aria-expanded="false" aria-label="Toneinstellungen">
<svg viewBox="0 0 24 24" aria-hidden="true">
<circle cx="12" cy="5" r="1.6"/><circle cx="12" cy="12" r="1.6"/>
<circle cx="12" cy="19" r="1.6"/>
</svg>
</button>
<button type="button" class="anruf__auf" id="anruf-auflegen">
<svg class="anruf__zeichen" viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.2 10.2c5-3.4 12.6-3.4 17.6 0l-2 3.2-4.2-1.1-.4-2.6a13 13 0 0 0-4.4 0l-.4 2.6-4.2 1.1z"/>
</svg>
<span>Auflegen</span>
</button>
</div>
<!-- Die Geräteauswahl wird erst gebaut, wenn es mehr als ein
Ausgabegerät gibt (siehe ausgabeAnbieten). Sie liegt hier in
einer eigenen Zeile, damit sie die Knopfreihe nicht sprengt. -->
<div class="anruf__mehrzeile" id="anruf-mehrzeile" hidden></div>
<!-- DER WEG ZUR PROBE (19.09.2026).
Filipe: „geht es nicht auf der app?" -- Nein, und das war
@@ -137,6 +203,16 @@
findet sie. -->
<a class="anruf__probe" id="anruf-probe" href="anruf-probe.html">Klingelt nichts?</a>`;
document.body.append(k);
/* Die Toneinstellungen liegen hinter einem kleinen Knopf: Man
braucht sie einmal im Jahr, und vorher war die Geraeteauswahl
das groesste Element im Kasten. */
$('anruf-mehr').hidden = true;
$('anruf-mehr').addEventListener('click', () => {
const z = $('anruf-mehrzeile');
const auf = z.hidden;
z.hidden = !auf;
$('anruf-mehr').setAttribute('aria-expanded', String(auf));
});
$('anruf-ton').addEventListener('click', tonSchalten);
$('anruf-hoeren').addEventListener('click', hoerenSchalten);
$('anruf-video').addEventListener('click', videoSchalten);
@@ -146,6 +222,25 @@
const lage = (text) => { const l = $('anruf-lage'); if (l) l.textContent = text; };
/** Wen habe ich am Apparat? Steht ganz oben und gross.
*
* DER WICHTIGSTE SATZ EINES TELEFONATS. Vorher stand dort nur „Es
* klingelt …" -- man sah nicht, wen man anruft. */
const wer = (text) => { const w = $('anruf-wer'); if (w) w.textContent = text; };
/** Einen Schalter auf an/aus stellen.
*
* Die Aufschrift bleibt IMMER dieselbe (die Sache), der Zustand
* steht in `aria-pressed` und wird vom Zeichen getragen -- ein
* durchgestrichenes Mikrofon heisst aus. Fuer Vorleseprogramme
* kommt der Zustand ueber aria-label mit, denn ein Strich im Bild
* ist nichts, was man hoeren kann. */
function schalterSetzen(k, an, sache) {
if (!k) return;
k.setAttribute('aria-pressed', String(!!an));
k.setAttribute('aria-label', `${sache} ${an ? 'an' : 'aus'} – zum Umschalten antippen`);
}
/* ---------- Die Gegenstelle ------------------------------------------- */
function verbindungFuer(wer) {
@@ -177,6 +272,10 @@
tonAus();
klingelWache(); // niemand-geht-ran-Wecker abbestellen
if (anruf && !anruf.beginn) anruf.beginn = Date.now();
/* Der Puls hoert auf zu atmen, sobald die Verbindung steht --
eine Bewegung, die nie aufhoert, wird nach zwei Minuten zur
Belaestigung. */
$('anruf')?.setAttribute('data-steht', 'ja');
lage('Verbunden');
}
/* `failed` heisst: Es kommt nichts mehr. Das gehoert gesagt --
@@ -284,7 +383,11 @@
}
}
async function starten(raumId, mitVideo) {
async function starten(raumId, mitVideo, raumName) {
/* WEN RUFE ICH AN? Der Chat weiss es und gibt es mit. Faellt
der Name aus (aelterer Aufruf), bleibt es bei „Anruf" --
das ist immer noch richtig, nur weniger. */
wer(raumName || 'Anruf');
if (anruf) return;
kastenBauen();
$('anruf').hidden = false;
@@ -380,6 +483,10 @@
$('anruf-video').hidden = !d.video;
if (d.video) $('anruf-video').setAttribute('aria-pressed', 'true');
klingelnAus();
/* Wer angerufen hat, steht im Klingel-Ereignis und wurde dort
schon gemerkt -- sonst staende beim Angerufenen „Anruf" und
beim Anrufer der Name, also zweierlei fuer dasselbe Gespraech. */
wer(letzterAnrufer || 'Anruf');
lage('Verbindung …');
uhrLaufen();
@@ -397,6 +504,8 @@
async function auflegen(melden) {
tonAus();
klingelWache();
$('anruf')?.removeAttribute('data-steht');
klingelnAus();
if (!anruf) { const k = $('anruf'); if (k) k.hidden = true; return; }
const raumId = anruf.raumId;
@@ -472,9 +581,12 @@
if (!anruf) return;
const an = anruf.eigener.getAudioTracks().some((s) => s.enabled);
for (const s of anruf.eigener.getAudioTracks()) s.enabled = !an;
const k = $('anruf-ton');
k.textContent = an ? 'Mikro aus' : 'Mikro an';
k.setAttribute('aria-pressed', String(!an));
/* DER ZUSTAND STEHT IN aria-pressed, NICHT IM TEXT (19.09.2026).
Ein Knopf mit der Aufschrift „Mikro an" kann zweierlei heissen --
„ist an" oder „schalt es an". Wer falsch raet, sitzt stumm da.
Jetzt sagt das durchgestrichene Zeichen den Zustand, und das
Wort sagt nur, worum es geht. */
schalterSetzen($('anruf-ton'), !an, 'Mikrofon');
}
/* ---------- DER LAUTSPRECHER (18.09.2026) ------------------------------
@@ -529,11 +641,7 @@
function hoerenSchalten() {
hoeren = !hoeren;
const k = $('anruf-hoeren');
if (k) {
k.textContent = hoeren ? 'Lautsprecher an' : 'Lautsprecher aus';
k.setAttribute('aria-pressed', String(hoeren));
}
schalterSetzen($('anruf-hoeren'), hoeren, 'Ton der anderen');
hoerenAnwenden();
}
@@ -569,27 +677,36 @@
}
w.value = ausgabe || geraete[0].deviceId;
w.addEventListener('change', () => { ausgabe = w.value; hoerenAnwenden(); });
const reihe = kasten.querySelector('.anruf__knoepfe');
/* VOR „Auflegen", nicht dahinter: Der Auflegen-Knopf sitzt per
`margin-inline-start: auto` ganz rechts. Wer danach anhaengt,
schiebt die Auswahl hinter den einzigen Knopf, der immer an
derselben Stelle stehen soll. */
if (reihe) reihe.insertBefore(w, reihe.querySelector('.anruf__knopf--auf'));
/* IN DIE EIGENE ZEILE, NICHT IN DIE KNOPFREIHE (19.09.2026).
Dort war sie das breiteste Element des Kastens -- fuer etwas,
das man einmal im Jahr braucht. Jetzt liegt sie hinter dem
Knopf mit den drei Punkten und ist erst da, wenn man sie sucht.
Der Knopf selbst erscheint nur, wenn es hier auch etwas zu
waehlen gibt. */
const zeile = $('anruf-mehrzeile');
if (!zeile) return;
zeile.append(el('span', 'anruf__mehrschild', 'Ton geht an'));
zeile.append(w);
const mehr = $('anruf-mehr');
if (mehr) mehr.hidden = false;
}
function videoSchalten() {
if (!anruf) return;
const an = anruf.eigener.getVideoTracks().some((s) => s.enabled);
for (const s of anruf.eigener.getVideoTracks()) s.enabled = !an;
const k = $('anruf-video');
k.textContent = an ? 'Kamera aus' : 'Kamera an';
k.setAttribute('aria-pressed', String(!an));
schalterSetzen($('anruf-video'), !an, 'Kamera');
}
/* ---------- Es klingelt ------------------------------------------------ */
/* Wer zuletzt angerufen hat -- fuer die Kopfzeile des Kastens, wenn
man rangeht. */
let letzterAnrufer = '';
function klingelnZeigen(raumId, von, mitVideo) {
klingelnAus();
letzterAnrufer = von?.name || '';
/* UND ES KLINGELT WIRKLICH. Vorher stand hier nur ein Kasten --
wer nicht zufaellig hinsah, merkte nichts. */
klingelTon();
+5 -2
View File
@@ -151,7 +151,10 @@
+ 'a2 2 0 0 1-2.2 2A16.5 16.5 0 0 1 4.5 5.7 2 2 0 0 1 6.5 3.5z"/></svg>';
ton.addEventListener('click', () => {
if (!offen) return;
window.anrufStarten(offen.id, false);
/* DEN NAMEN MITGEBEN (19.09.2026): Der Anrufkasten zeigte
vorher nur „Es klingelt …" -- man sah nicht, wen man
anruft. Der Name steht hier ohnehin schon. */
window.anrufStarten(offen.id, false, offen.name);
});
video = document.createElement('button');
video.type = 'button';
@@ -164,7 +167,7 @@
+ '<path d="M15 10.5 21 7v10l-6-3.5z"/></svg>';
video.addEventListener('click', () => {
if (!offen) return;
window.anrufStarten(offen.id, true);
window.anrufStarten(offen.id, true, offen.name);
});
ziel.prepend(video);
ziel.prepend(ton);
+171
View File
@@ -1692,3 +1692,174 @@
if (e.persisted) location.reload();
});
})();
/* =====================================================================
DIE SEITE MERKT SICH, WO DU WARST — 19.09.2026
Filipe: „wenn ich von einer seite auf die andere zurück gehe, swipt
die seite immer wieder komplett hoch. das nervt man muss dan immer
wieder runter scrollen bis man da ist wo man vorher war."
---------------------------------------------------------------------
WARUM DER BROWSER ES NICHT VON SELBST HINBEKOMMT
Er versucht es sogar — `history.scrollRestoration` steht ab Werk auf
„auto", und bei einer gewöhnlichen Seite klappt das.
Hier nicht, und der Grund ist die Bauweise des ganzen Hauses: Jede
Seite kommt fast leer an und holt ihren Inhalt danach per Abruf
(Aufgaben, Termine, Einträge, Karten). In dem Moment, in dem der
Browser die alte Position wiederherstellen will, ist das Dokument
ein paar hundert Pixel hoch. Er kann nicht auf Zeile 900 springen,
die es noch nicht gibt — also bleibt er oben. Eine halbe Sekunde
später ist der Inhalt da, aber der Browser versucht es kein zweites
Mal.
---------------------------------------------------------------------
WIE ES HIER GELÖST IST
Wir übernehmen die Aufgabe selbst (`manual`) und warten, bis die
Seite WIRKLICH hoch genug ist:
1. Beim Verlassen wird die Position gemerkt — je Adresse einzeln,
inklusive Frageteil (`bereich.html?b=treff` ist eine andere
Seite als `bereich.html?b=wunsch`).
2. Beim Öffnen wird sie zurückgelesen und dann jeden Bildaufbau
lang versucht, bis das Dokument die nötige Höhe hat.
3. Nach längstens drei Sekunden wird aufgegeben — eine Seite, die
ewig nachspringt, ist schlimmer als eine, die oben steht.
---------------------------------------------------------------------
DREI DINGE, DIE ABSICHT SIND
NUR BEIM ZURÜCKGEHEN, NICHT BEI JEDEM ÖFFNEN. Wer eine Kachel
anklickt, will oben anfangen. Wer zurückgeht, will dorthin, wo er
war. Unterschieden wird über `performance.navigation`: Nur bei
`back_forward` wird wiederhergestellt. Ein eigener Merker fängt den
Fall ab, dass der Zurück-Knopf der Kopfleiste benutzt wurde.
WER SELBST SCROLLT, GEWINNT. Sobald der Mensch das Rad dreht oder
wischt, hört das Nachspringen sofort auf. Nichts ist ärgerlicher
als eine Seite, die einen zurückzieht.
UND SIE VERGISST NACH EINER STUNDE. `sessionStorage` überlebt den
Reiter ohnehin nicht; der Zeitstempel fängt den Fall ab, dass
jemand denselben Reiter am nächsten Morgen weiterbenutzt. Auf
Zeile 900 zu landen, weil man gestern dort war, ist keine Hilfe.
===================================================================== */
(function () {
'use strict';
/* Nach so vielen Millisekunden wird nicht mehr versucht. Drei
Sekunden sind großzügig für einen Abruf und kurz genug, dass es
nie nach „die Seite hängt" aussieht. */
var FRIST_MS = 3000;
/* Nach einer Stunde gilt die gemerkte Stelle nicht mehr. */
var ALTER_MS = 3600000;
/* Unter dieser Höhe lohnt das Merken nicht -- wer zehn Pixel
gescrollt hat, merkt vom Wiederherstellen nichts. */
var MINDEST_PX = 80;
var SCHLUESSEL = 'ws-stelle:' + location.pathname + location.search;
function merken() {
try {
var y = window.scrollY || document.documentElement.scrollTop || 0;
if (y < MINDEST_PX) { sessionStorage.removeItem(SCHLUESSEL); return; }
sessionStorage.setItem(SCHLUESSEL, JSON.stringify({ y: Math.round(y), am: Date.now() }));
} catch (e) { /* Kein Speicher -> dann eben ohne. */ }
}
/* MEHRERE ANLÄSSE, NICHT NUR EINER.
`beforeunload` feuert auf iOS oft gar nicht, `pagehide` dafür
zuverlässig; `visibilitychange` fängt den Fall ab, dass jemand die
App in den Hintergrund schiebt und das Gerät sie später beendet.
Dreimal dasselbe zu schreiben ist hier billiger als ein Fall, in
dem nichts gemerkt wird. */
window.addEventListener('pagehide', merken);
window.addEventListener('beforeunload', merken);
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'hidden') merken();
});
/* Und der Zurück-Knopf der Kopfleiste: Er ruft `history.back()`, und
dabei ist `pagehide` je nach Browser zu spät dran. */
document.addEventListener('click', function (e) {
var a = e.target && e.target.closest
&& e.target.closest('a[href], .zurueck-knopf, .zurueck');
if (a) merken();
}, true);
/* ---- Und zurück ------------------------------------------------- */
function kamVonZurueck() {
try {
var e = performance.getEntriesByType('navigation')[0];
if (e && e.type) return e.type === 'back_forward';
/* Ältere Browser: die alte Zählweise (2 = TYPE_BACK_FORWARD). */
return performance.navigation && performance.navigation.type === 2;
} catch (f) { return false; }
}
function wiederherstellen() {
var roh;
try { roh = sessionStorage.getItem(SCHLUESSEL); } catch (e) { return; }
if (!roh) return;
var stand;
try { stand = JSON.parse(roh); } catch (e) { return; }
if (!stand || typeof stand.y !== 'number') return;
if (Date.now() - (stand.am || 0) > ALTER_MS) {
try { sessionStorage.removeItem(SCHLUESSEL); } catch (f) { /* egal */ }
return;
}
var bis = Date.now() + FRIST_MS;
var abgebrochen = false;
/* WER SELBST SCROLLT, GEWINNT. `wheel`, `touchstart` und die
Tastatur -- alle drei, weil es alle drei Arten gibt, eine Seite
zu bewegen. */
var aufhoeren = function () { abgebrochen = true; };
window.addEventListener('wheel', aufhoeren, { passive: true, once: true });
window.addEventListener('touchstart', aufhoeren, { passive: true, once: true });
window.addEventListener('keydown', aufhoeren, { once: true });
(function versuchen() {
if (abgebrochen) return;
var hoch = Math.max(
document.body ? document.body.scrollHeight : 0,
document.documentElement ? document.documentElement.scrollHeight : 0);
/* Reicht die Höhe schon? Dann hin und fertig. */
if (hoch >= stand.y + window.innerHeight * 0.5) {
window.scrollTo(0, stand.y);
/* NOCH EINMAL IM NÄCHSTEN BILD. Manche Listen wachsen beim
Zeichnen noch ein Stück (Bilder, Schriften), und dann sitzt
der erste Sprung ein paar Pixel daneben. */
requestAnimationFrame(function () {
if (!abgebrochen) window.scrollTo(0, stand.y);
});
return;
}
if (Date.now() > bis) return; /* Aufgeben ist auch eine Antwort. */
requestAnimationFrame(versuchen);
})();
}
if ('scrollRestoration' in history) {
/* Wir machen es selbst -- sonst springt der Browser erst nach oben
und wir gleich danach wieder hinunter, und das sieht man. */
history.scrollRestoration = 'manual';
}
if (kamVonZurueck()) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', wiederherstellen);
} else {
wiederherstellen();
}
} else {
/* Ein frisch geöffneter Bereich fängt oben an -- und die alte
Stelle wird vergessen, damit sie nicht in einer halben Stunde
überraschend zuschlägt. */
try { sessionStorage.removeItem(SCHLUESSEL); } catch (e) { /* egal */ }
}
})();
+45 -2
View File
@@ -360,11 +360,54 @@
meisten Bewegung nach oben stellt, ist eine Rangliste mit einem
anderen Namen. Der Server sortiert nach Namen, und dabei bleibt es.
===================================================================== */
/* Was über einer Gruppe steht. Aus der Rolle abgeleitet, nicht
abgeschrieben -- der Rollenname kommt vom Server. */
const GRUPPENSATZ = {
hand: 'Koordiniert den Alltag und schaut mit dir zusammen auf das Team.',
modi: 'Die Leute, die im Chat und im Live stehen.',
};
function listeBauen(d) {
const wurzel = el('div', 'w-liste__gitter');
const wurzel = el('div', 'w-liste');
/* ---- NACH ROLLE GRUPPIERT (19.09.2026) -------------------------
Filipe: „die reihenfolge der listen soll immer angepasst sein
... die rechte hand rolle immer zuerst und dan die modis. die
sollen auch schoen getrennt sein und verschieden aussehen also
die rechte hand viel spezieller."
Die REIHENFOLGE macht der Server (ROLLEN_SORTIERUNG) -- hier
wird nur gruppiert, wo sie wechselt. Eine eigene Sortierung im
Browser waere die zweite Wahrheit, und die zweite ist die, die
beim naechsten Umbau abweicht.
DAS IST KEINE RANGLISTE. Eine Sortierung nach Rolle sagt nichts
darueber, wie gut jemand ist -- nur, welche Aufgabe er hat.
Deshalb steht ueber jeder Gruppe ein Satz, der genau das
erklaert, und keine Zahl. */
let letzteRolle = null;
let gitter = null;
for (const p of d.liste) {
if (p.rolle !== letzteRolle) {
letzteRolle = p.rolle;
const kopf = el('div', 'w-gruppe');
kopf.dataset.rolle = p.rolle;
kopf.append(el('h3', 'w-gruppe__name', p.rolle_name));
if (GRUPPENSATZ[p.rolle]) {
kopf.append(el('p', 'w-gruppe__satz', GRUPPENSATZ[p.rolle]));
}
wurzel.append(kopf);
gitter = el('div', 'w-liste__gitter');
gitter.dataset.rolle = p.rolle;
wurzel.append(gitter);
}
const karte = el('button', 'w-karte');
karte.type = 'button';
/* Die Rolle haengt an der Karte, nicht an einer Klasse: So kann
das CSS sie einfaerben, ohne dass hier eine zweite Liste von
Rollennamen entsteht. */
karte.dataset.rolle = p.rolle;
karte.append(el('span', 'w-karte__name', p.name));
karte.append(el('span', 'w-karte__rolle', p.rolle_name));
@@ -390,7 +433,7 @@
}
karte.append(zeilen);
karte.addEventListener('click', () => karteZeigen(p.id).catch(() => {}));
wurzel.append(karte);
(gitter || wurzel).append(karte);
}
return wurzel;
}
+13 -13
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -291,12 +291,12 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/aufgaben.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/aufgaben.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -168,12 +168,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/automation.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/automation.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -130,11 +130,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/befinden.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/befinden.js?v=202609191522" defer></script>
</body>
</html>
+19 -19
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191522" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -251,16 +251,16 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/checkliste.js?v=202609191506" defer></script>
<script src="assets/js/ampel.js?v=202609191506" defer></script>
<script src="assets/js/schulung.js?v=202609191506" defer></script>
<script src="assets/js/vorlagen.js?v=202609191506" defer></script>
<script src="assets/js/bereich.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/checkliste.js?v=202609191522" defer></script>
<script src="assets/js/ampel.js?v=202609191522" defer></script>
<script src="assets/js/schulung.js?v=202609191522" defer></script>
<script src="assets/js/vorlagen.js?v=202609191522" defer></script>
<script src="assets/js/bereich.js?v=202609191522" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -108,11 +108,11 @@
</main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/auskunft.js?v=202609191506" defer></script>
<script src="assets/js/bewerben.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/auskunft.js?v=202609191522" defer></script>
<script src="assets/js/bewerben.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -80,12 +80,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/auskunft.js?v=202609191506" defer></script>
<script src="assets/js/bewerbungen.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/auskunft.js?v=202609191522" defer></script>
<script src="assets/js/bewerbungen.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -89,13 +89,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/ki.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/calls.js?v=202609191506" defer></script>
<script src="assets/js/ki.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/calls.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -367,16 +367,16 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609191506"></script>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506"></script>
<script src="assets/js/glocke.js?v=202609191506"></script>
<script src="assets/js/bereiche.js?v=202609191522"></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522"></script>
<script src="assets/js/glocke.js?v=202609191522"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609191506"></script>
<script src="assets/js/chat.js?v=202609191506"></script>
<script src="assets/js/anruf.js?v=202609191522"></script>
<script src="assets/js/chat.js?v=202609191522"></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/content.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/content.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -179,14 +179,14 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/checkliste.js?v=202609191506" defer></script>
<script src="assets/js/vorlagen.js?v=202609191506" defer></script>
<script src="assets/js/content.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/checkliste.js?v=202609191522" defer></script>
<script src="assets/js/vorlagen.js?v=202609191522" defer></script>
<script src="assets/js/content.js?v=202609191522" defer></script>
</body>
</html>
+6 -6
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191522" />
</head>
<body class="gate gate--crew">
@@ -348,8 +348,8 @@
</main>
</div>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/gate.js?v=202609191506" defer></script>
<script src="assets/js/gate.js?v=202609191522" defer></script>
</body>
</html>
+4 -4
View File
@@ -22,25 +22,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609191506",
"src": "/assets/img/app-symbole/crew-192.png?v=202609191522",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609191506",
"src": "/assets/img/app-symbole/crew-512.png?v=202609191522",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191506",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191522",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191506",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191522",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -108,12 +108,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/dateien.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/dateien.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -106,11 +106,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/entwicklung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/entwicklung.js?v=202609191522" defer></script>
</body>
</html>
+12 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -141,11 +141,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/hilfe.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/hilfe.js?v=202609191522" defer></script>
</body>
</html>
+5 -5
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
</head>
<body class="gate">
@@ -410,8 +410,8 @@
</main>
</div>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/gate.js?v=202609191506" defer></script>
<script src="assets/js/gate.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -377,13 +377,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/kalender.js?v=202609191506" defer></script>
<script src="assets/js/kalender-abo.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/kalender.js?v=202609191522" defer></script>
<script src="assets/js/kalender-abo.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -444,11 +444,11 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609191506"></script>
<script src="assets/js/wahl.js?v=202609191506"></script>
<script src="assets/js/bereiche.js?v=202609191506"></script>
<script src="assets/js/kopf.js?v=202609191506"></script>
<script src="assets/js/glocke.js?v=202609191506"></script>
<script src="assets/js/leistung.js?v=202609191506"></script>
<script src="assets/js/meldung.js?v=202609191522"></script>
<script src="assets/js/wahl.js?v=202609191522"></script>
<script src="assets/js/bereiche.js?v=202609191522"></script>
<script src="assets/js/kopf.js?v=202609191522"></script>
<script src="assets/js/glocke.js?v=202609191522"></script>
<script src="assets/js/leistung.js?v=202609191522"></script>
</body>
</html>
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -449,12 +449,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/personen.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/personen.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -214,13 +214,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/steckbrief.js?v=202609191506" defer></script>
<script src="assets/js/profil.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/steckbrief.js?v=202609191522" defer></script>
<script src="assets/js/profil.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -134,10 +134,10 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/rechte.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/rechte.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/report.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/report.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -106,13 +106,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/ki.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/report.js?v=202609191506" defer></script>
<script src="assets/js/ki.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/report.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -173,12 +173,12 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/scouting.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/scouting.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -678,12 +678,12 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/start.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/start.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -85,13 +85,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/ki.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/startcheck.js?v=202609191506" defer></script>
<script src="assets/js/ki.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/startcheck.js?v=202609191522" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -150,13 +150,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/auskunft.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/steckbrief.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/auskunft.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/steckbrief.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191522" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -111,11 +111,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/talente.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/talente.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -110,12 +110,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/team.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/team.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,10 +84,10 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/teamlage.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/teamlage.js?v=202609191522" defer></script>
</body>
</html>
+12 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -112,11 +112,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/teilen.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/teilen.js?v=202609191522" defer></script>
</body>
</html>
+13 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -126,11 +126,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/treff-moderation.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/treff-moderation.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -221,11 +221,11 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/auskunft.js?v=202609191506" defer></script>
<script src="assets/js/treff-regeln.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/auskunft.js?v=202609191522" defer></script>
<script src="assets/js/treff-regeln.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -149,13 +149,13 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/uebersicht.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/uebersicht.js?v=202609191522" defer></script>
</body>
</html>
+12 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -217,11 +217,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -144,11 +144,11 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/werdegang.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/werdegang.js?v=202609191522" defer></script>
</body>
</html>
+14 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191506" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191506" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191506" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191522" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191522" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191522" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191522" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609191506" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191522" />
</head>
<body class="start">
@@ -190,12 +190,12 @@
</main>
<script src="assets/js/meldung.js?v=202609191506" defer></script>
<script src="assets/js/meldung.js?v=202609191522" defer></script>
<script src="assets/js/wahl.js?v=202609191506" defer></script>
<script src="assets/js/bereiche.js?v=202609191506" defer></script>
<script src="assets/js/kopf.js?v=202609191506" defer></script>
<script src="assets/js/glocke.js?v=202609191506" defer></script>
<script src="assets/js/wissen.js?v=202609191506" defer></script>
<script src="assets/js/wahl.js?v=202609191522" defer></script>
<script src="assets/js/bereiche.js?v=202609191522" defer></script>
<script src="assets/js/kopf.js?v=202609191522" defer></script>
<script src="assets/js/glocke.js?v=202609191522" defer></script>
<script src="assets/js/wissen.js?v=202609191522" defer></script>
</body>
</html>