B4 + B5: Loeschen heisst Loeschen, die Schrift wechselt mit, und Blau wird Babyblau

Die beiden Auftraege gehoeren zusammen, und zwar in dieser Reihenfolge:
Eine babyblaue Kachel ist HELL. Ohne mitwechselnde Schrift waere sie
unlesbar (1,63:1 gemessen). Erst B4 macht B5 moeglich.

B4a -- LOESCHEN HEISST LOESCHEN
  "Geloeschte Nachrichten verschwinden vollstaendig - keine Spur, kein
   'wurde geloescht'-Hinweis, bei niemandem, auch nicht bei DogFather."

Bis heute blieb die Zeile stehen: Text geleert, weg_am gesetzt, und im
Chat stand "Nachricht zurueckgenommen". Das war ausdruecklich so
begruendet ("ein Loch im Verlauf wirft mehr Fragen auf"). Das Argument
beantwortet aber eine andere Frage: Ein Hinweis "hier stand etwas"
MARKIERT die Stelle. Wer etwas aus Versehen schreibt, will es weg
haben und nicht unterstrichen.

Jetzt ein echtes DELETE. Vier Raender, an denen eine Spur bleiben
koennte, alle gemessen:
  1. die Zeile selbst
  2. chat_reaktionen    (ON DELETE CASCADE - nachgesehen, nicht angenommen)
  3. chat_erwaehnungen  (ebenso)
  4. letzte_am am Raum  - wird neu gerechnet, sonst stuende er oben in
                          der Liste mit einem Zeitpunkt, zu dem es
                          nichts mehr gibt
Dazu: ein Zitat auf eine geloeschte Nachricht wird weggelassen; in der
Gespraechsliste steht kein Hinweis mehr; der Knopf heisst "loeschen".

Die 5 alten zurueckgenommenen Zeilen (Text bereits leer) raeumt eine
einmalige, wiederholbare Umstellung ab - mit Sicherung davor, und nur
wenn es wirklich etwas zu tun gibt.

B4b -- WER DARF WAS
  "jeder nur seine eigenen - ausser DogFather und rechte Hand"
`darfJedeNachrichtLoeschen` = admin oder hand. NICHT fuehrtTeamDogi
(das schloesse die linke Hand ein) und nicht istLeitung (das schloesse
Spicy Media ein, die private Chats nicht einmal sehen darf). Das Recht
kommt vom Server ins Skript, nicht aus einer Rolle im Browser: chat.js
bekommt jeder, der die Seite oeffnet.

B4c -- DIE SCHRIFT WECHSELT MIT
  "am besten schwarz auf hellen Kacheln - und weiss, wenn jemand eine
   schwarze Kachel waehlt"
`schriftFuer(farbe)` waehlt zwischen zwei Paaren, gerechnet aus der
Leuchtdichte, mit denselben Schwellen wie das Rechenwerkzeug (7:1 fuer
den Text, 4,5:1 fuer die Fusszeile). Keine dritte Spalte in
CHAT_KACHELN, die jemand pflegen muesste. Flaeche und Schrift werden
im Browser in EINEM Griff gesetzt (blaseFaerben) - zwei Stellen waeren
irgendwann eine helle Kachel mit heller Schrift.

B4d -- DIE NAMEN
Der Name ist jetzt ein eigener Streifen mit Kante darunter, .84rem,
und der Rollenpunkt wird ein 3x14-Balken. Vorher stand er als erste
ZEILE in der Blase und las sich wie der Anfang des Satzes.

B5 -- BABYBLAU
  "jedes normales blaues herz durch babyblaues herz ersetzen ... jeder
   normale blaue farbe, sei es die kachel im chat oder emojis, nur
   babyblau bitte."
* Herz: U+1F499 -> U+1FA75. Nicht geglaubt, sondern gemessen: 43,9 px
  breit wie die anderen Herzen, ein Ersatzkaestchen waere 20,7. Die
  vier vorhandenen blauen Herzen in der Datenbank wandern mit - sonst
  waeren es vier Reaktionen, die ERLAUBT nicht mehr kennt: still weg.
* Kachel: neue, HELLE Kachel "Babyblau" mit dem Wert von --akzent.
  Gemessen: Text 10,78:1, Fusszeile 4,87:1. Sie steht bewusst nicht in
  der Rechnung des Werkzeugs (das rechnet elf Toene auf EINE
  Leuchtdichte) - sie hat eine andere Leuchtdichte und dafuer ihre
  eigene Schrift. Dasselbe Versprechen, anderer Weg.

PRUEFUNGEN
  pruef-loeschen.mjs (NEU, 20/0): alle vier Raender, die vier Faelle
    der Rechtegrenze (auch: die linke Hand darf NICHT), das babyblaue
    Herz am laufenden Server, und dass der Satz "Nachricht
    zurueckgenommen" nur noch in Kommentaren steht - mit Gegenprobe,
    dass die Suche diesen Unterschied wirklich macht.
  pruef-chatkachel.mjs (33/0): misst jede Kachel mit IHRER Schrift und
    fragt dafuer dieselbe Funktion wie der Server. Neu: dass die
    Schrift ueberhaupt wechselt. Die Leuchtdichte-Regel gilt jetzt fuer
    die gerechneten Toene - das Versprechen dahinter loest die
    Kontrastzeile darueber direkt ein.
  Vier alte Pruefungen umgedreht, die den alten Zustand festgeschrieben
    hatten: pruef-chat, pruef-chat-ausbau, pruef-chat-aufloesen,
    pruef-chat-optik. Alle mit scharferer Messung als vorher (Zahl
    davor/danach statt "ein Hinweis ist da").
  Mitgelaufen und gruen: pruef-alle-sehen-es, pruef-treffchat (110/0).

Gesichert: workspace-vor-loeschumbau-20260922-233313.db
(946 KB, integrity_check ok, 111 Nachrichten, 49 Reaktionen).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-22 23:33:43 +02:00
co-authored by Claude Opus 5
parent 95da1345fc
commit 60802170a1
50 changed files with 1464 additions and 690 deletions
+14 -3
View File
@@ -542,15 +542,26 @@ console.log("=== Reaktionen ===");
`ein erfundenes Zeichen wird abgewiesen (HTTP ${unsinn.status})`); `ein erfundenes Zeichen wird abgewiesen (HTTP ${unsinn.status})`);
ok(zaehle() === 3, `und aendert nichts am Bestand (${zaehle()})`); ok(zaehle() === 3, `und aendert nichts am Bestand (${zaehle()})`);
/* ---- Eine zurueckgenommene Nachricht ----------------------------- */ /* ---- Eine GELOESCHTE Nachricht ----------------------------------
Hier stand 409 („zurueckgenommen"). Seit dem 22.09.2026 abends
wird wirklich geloescht -- Filipe: „Geloeschte Nachrichten
verschwinden vollstaendig." Die Zeile gibt es dann nicht mehr,
und die richtige Antwort ist 404: nicht gefunden.
Die Frage bleibt dieselbe und ist sogar schaerfer: Niemand darf
auf etwas reagieren, das es nicht gibt -- und der Bestand darf
sich dabei nicht aendern. */
const vorherBestand = zaehle();
const weg = await (await rufe(eins.keks, const weg = await (await rufe(eins.keks,
`/workspace/api/chat/raeume/${g.raum_id}/nachrichten`, { text: "Weg gleich" }, "POST")).json(); `/workspace/api/chat/raeume/${g.raum_id}/nachrichten`, { text: "Weg gleich" }, "POST")).json();
await rufe(eins.keks, `/workspace/api/chat/nachrichten/${weg.nachricht.id}`, await rufe(eins.keks, `/workspace/api/chat/nachrichten/${weg.nachricht.id}`,
undefined, "DELETE"); undefined, "DELETE");
const drauf = await rufe(zwei.keks, const drauf = await rufe(zwei.keks,
`/workspace/api/chat/nachrichten/${weg.nachricht.id}/reaktion`, { zeichen: daumen }, "PUT"); `/workspace/api/chat/nachrichten/${weg.nachricht.id}/reaktion`, { zeichen: daumen }, "PUT");
ok(drauf.status === 409, ok(drauf.status === 404,
`auf eine zurueckgenommene Nachricht geht es nicht (HTTP ${drauf.status})`); `auf eine geloeschte Nachricht geht es nicht -- es gibt sie nicht mehr (HTTP ${drauf.status})`);
ok(zaehle() === vorherBestand,
`und der Bestand bleibt unveraendert (${vorherBestand})`);
/* ---- Und sie ueberleben das Neuladen ----------------------------- */ /* ---- Und sie ueberleben das Neuladen ----------------------------- */
const verlauf = await holen(zwei.keks, const verlauf = await holen(zwei.keks,
+16 -7
View File
@@ -212,16 +212,25 @@ melde("\n=== 2. Kopieren ===");
".chat-nachricht:first-of-type .chat-nachricht__kopie-knopf", (b) => b.textContent); ".chat-nachricht:first-of-type .chat-nachricht__kopie-knopf", (b) => b.textContent);
ok(zurueck === "kopieren", `und fällt danach zurück ("${zurueck}")`); ok(zurueck === "kopieren", `und fällt danach zurück ("${zurueck}")`);
/* GEGENPROBE: An einer zurückgenommenen Nachricht gibt es nichts zu /* GEGENPROBE, NEU GEFASST (22.09.2026 abends).
kopieren -- dort darf der Knopf nicht stehen. */ ------------------------------------------------------------------
Hier wurde geprueft, dass an einer ZURUECKGENOMMENEN Nachricht kein
Kopier-Knopf steht. Es gibt keine zurueckgenommenen mehr -- Filipe:
„Geloeschte Nachrichten verschwinden vollstaendig."
Die Frage dahinter bleibt richtig und wird jetzt direkt gestellt:
Nach dem Loeschen ist die Nachricht WEG, samt allem, was an ihr
hing. Gemessen an der Zahl der Nachrichten davor und danach --
eine Zahl, die sich um genau eins aendern muss. */
const vorLoeschen = await luna.seite.$$eval('.chat-nachricht', (b) => b.length);
await bestaetige(luna.seite, () => luna.seite.click( await bestaetige(luna.seite, () => luna.seite.click(
".chat-nachricht:last-of-type .chat-nachricht__weg-knopf")); ".chat-nachricht:last-of-type .chat-nachricht__weg-knopf"));
await luna.seite.waitForTimeout(900); await luna.seite.waitForTimeout(900);
const anWeg = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"] .chat-nachricht__kopie-knopf', const nachLoeschen = await luna.seite.$$eval('.chat-nachricht', (b) => b.length);
(b) => b.length); const restWeg = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"]', (b) => b.length);
const wegDa = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"]', (b) => b.length); ok(vorLoeschen > 0 && nachLoeschen === vorLoeschen - 1 && restWeg === 0,
ok(wegDa === 1 && anWeg === 0, `die geloeschte ist aus dem Bild (${vorLoeschen} -> ${nachLoeschen}),`
`an der zurückgenommenen Nachricht steht kein Kopier-Knopf (${wegDa} weg, ${anWeg} Knöpfe)`); + ` und es bleibt keine Spur (${restWeg})`);
} }
/* ======================================================================= /* =======================================================================
+22 -8
View File
@@ -285,18 +285,32 @@ melde("\n=== Zurücknehmen ===");
".chat-nachricht[data-selbst='ja']:last-of-type .chat-nachricht__weg-knopf")); ".chat-nachricht[data-selbst='ja']:last-of-type .chat-nachricht__weg-knopf"));
await luna.seite.waitForTimeout(1000); await luna.seite.waitForTimeout(1000);
/* UMGEDREHT AM 22.09.2026 ABENDS.
------------------------------------------------------------------
Hier stand: „die Zeile bleibt stehen -- kein Loch im Verlauf", und
daneben „an ihrer Stelle steht 'Nachricht zurueckgenommen'".
Filipe: „Geloeschte Nachrichten verschwinden vollstaendig -- keine
Spur, kein ‚wurde geloescht'-Hinweis, bei niemandem, auch nicht
bei DogFather."
Die Zahl davor und danach ist der Beleg: Sie muss um genau eins
sinken. „Irgendwie weniger" waere auch dann gruen, wenn der ganze
Verlauf verschwaende. */
const nachher = (await luna.seite.$$(".chat-nachricht")).length; const nachher = (await luna.seite.$$(".chat-nachricht")).length;
ok(nachher === vorher, ok(vorher > 0 && nachher === vorher - 1,
`die Zeile bleibt stehen (${nachher} statt ${vorher}) — kein Loch im Verlauf`); `die Zeile ist weg (${vorher} -> ${nachher}) — und nur sie`);
const hinweis = await luna.seite.$(".chat-nachricht__weg"); const hinweis = await luna.seite.$(".chat-nachricht__weg");
ok(!!hinweis, "an ihrer Stelle steht 'Nachricht zurückgenommen'"); ok(!hinweis, "und es steht kein Hinweis an ihrer Stelle");
/* Und beim Gegenüber verschwindet der Text ebenfalls -- von selbst. */ /* UND BEIM GEGENUEBER EBENFALLS -- von selbst, ohne Neuladen. Das
ist der Teil, der ueber den Ereignisstrom laeuft; ohne ihn saehe
Patrick die Nachricht weiter, bis er die Seite neu laedt. */
const beiPat = await pat.seite.waitForFunction( const beiPat = await pat.seite.waitForFunction(
() => !![...document.querySelectorAll(".chat-nachricht__weg")].length, (wieViele) => document.querySelectorAll(".chat-nachricht").length === wieViele,
{ timeout: 8000 }).then(() => true).catch(() => false); vorher - 1, { timeout: 8000 }).then(() => true).catch(() => false);
ok(beiPat, "auch bei Patrick ist der Text weg, ohne Neuladen"); ok(beiPat, "auch bei Patrick verschwindet sie, ohne Neuladen");
} }
/* ======================================================================= /* =======================================================================
@@ -310,7 +324,7 @@ melde("\n=== Gegenprobe ===");
for (const n of document.querySelectorAll(".chat-nachricht")) n.remove(); for (const n of document.querySelectorAll(".chat-nachricht")) n.remove();
}); });
const nachher = (await luna.seite.$$(".chat-nachricht")).length; const nachher = (await luna.seite.$$(".chat-nachricht")).length;
ok(vorher >= 3 && nachher === 0, ok(vorher >= 2 && nachher === 0,
`der Selektor trifft (${vorher} gefunden, nach dem Entfernen ${nachher})`); `der Selektor trifft (${vorher} gefunden, nach dem Entfernen ${nachher})`);
/* Und ein Text, der nie geschrieben wurde, darf NICHT gefunden /* Und ein Text, der nie geschrieben wurde, darf NICHT gefunden
+18 -3
View File
@@ -337,11 +337,26 @@ console.log("\n=== Eine Nachricht zurücknehmen ===");
const e = await rufe(luna.keks, `/workspace/api/chat/nachrichten/${nachricht.id}`, undefined, "DELETE"); const e = await rufe(luna.keks, `/workspace/api/chat/nachrichten/${nachricht.id}`, undefined, "DELETE");
ok(e.ok, `die eigene: geht (${e.status})`); ok(e.ok, `die eigene: geht (${e.status})`);
/* UND SIE BLEIBT SICHTBAR -- als zurückgenommen, nicht als Loch. */ /* UND SIE IST WIRKLICH WEG (22.09.2026 abends).
------------------------------------------------------------------
Hier stand das Gegenteil: „sie bleibt sichtbar -- als
zurueckgenommen, nicht als Loch." Das war die bewusste
Entscheidung bis heute Nachmittag.
Filipe: „Geloeschte Nachrichten verschwinden vollstaendig -- keine
Spur, kein ‚wurde geloescht'-Hinweis, bei niemandem, auch nicht
bei DogFather."
Die Zeile misst jetzt beides: dass sie fehlt UND dass der Rest des
Verlaufs noch da ist. Ohne den zweiten Teil waere ein Verlauf, der
ueberhaupt nichts mehr liefert, ebenfalls gruen. */
const verlauf = await holen(pat.keks, `/workspace/api/chat/raeume/${raumLunaPat}/nachrichten`); const verlauf = await holen(pat.keks, `/workspace/api/chat/raeume/${raumLunaPat}/nachrichten`);
const weg = verlauf.nachrichten.find((n) => n.id === nachricht.id); const weg = verlauf.nachrichten.find((n) => n.id === nachricht.id);
ok(weg && weg.zurueckgenommen && weg.text === null, ok(!weg && verlauf.nachrichten.length > 0,
`sie steht weiterhin im Verlauf, als zurückgenommen und ohne Text`); `sie steht in keinem Verlauf mehr, und die uebrigen`
+ ` ${verlauf.nachrichten.length} stehen noch da`);
ok(!verlauf.nachrichten.some((n) => n.zurueckgenommen),
"und es steht nirgends ein Hinweis, dass hier etwas stand");
ok(!JSON.stringify(verlauf).includes("Das war ein Versehen"), ok(!JSON.stringify(verlauf).includes("Das war ein Versehen"),
"der Text ist wirklich weg, nicht nur ausgeblendet"); "der Text ist wirklich weg, nicht nur ausgeblendet");
} }
+65 -17
View File
@@ -53,7 +53,7 @@ const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t);
console.log("\n=== Chat: Bild dahinter, Kachel davor ===\n"); console.log("\n=== Chat: Bild dahinter, Kachel davor ===\n");
/* ---- 1. Die Töne, ohne Browser ----------------------------------- */ /* ---- 1. Die Töne, ohne Browser ----------------------------------- */
const { CHAT_KACHELN, kachelPruefen } = await import("./workspace-chat.js"); const { CHAT_KACHELN, kachelPruefen, schriftFuer } = await import("./workspace-chat.js");
ok(CHAT_KACHELN.length >= 8, `es gibt genug Töne zur Auswahl (${CHAT_KACHELN.length})`); ok(CHAT_KACHELN.length >= 8, `es gibt genug Töne zur Auswahl (${CHAT_KACHELN.length})`);
/* ALLE GLEICH DUNKEL. Nur dann ist der Kontrast zur Schrift bei jedem /* ALLE GLEICH DUNKEL. Nur dann ist der Kontrast zur Schrift bei jedem
@@ -100,26 +100,55 @@ const BLASEN_SCHRIFT = [
["blase-text", ".chat-nachricht__text", 7], ["blase-text", ".chat-nachricht__text", 7],
["blase-leise", ".chat-nachricht__fuss", 4.5], ["blase-leise", ".chat-nachricht__fuss", 4.5],
]; ];
for (const [name, wo, noetig] of BLASEN_SCHRIFT) { /* JEDE KACHEL MIT IHRER EIGENEN SCHRIFT (22.09.2026 abends).
const farbe = ausCss(name); ---------------------------------------------------------------------
if (!farbe) { Hier stand eine feste Schriftfarbe aus chat.css, gegen ALLE Töne
ok(false, `KONNTE NICHT NACHSEHEN: --${name} steht nicht in chat.css` gemessen. Das galt, solange alle Töne dunkel waren.
+ " — ohne sie lässt sich der Kontrast der Kacheln nicht prüfen");
continue; Filipe: „Textfarbe soll mitwechseln, am besten schwarz auf hellen
} Kacheln – und weiß, wenn jemand eine schwarze Kachel wählt."
let schlecht = Infinity, wer = "";
Seither entscheidet `schriftFuer()` im Server, welches Paar eine
Fläche trägt. Die Prüfung fragt jetzt dieselbe Funktion -- nicht,
weil das bequem ist, sondern weil alles andere eine zweite Wahrheit
wäre: Eine Prüfung mit eigener Rechnung könnte grün sein, während
der Chat etwas anderes anzeigt.
WAS SIE DAMIT NOCH PRÜFT: Dass das Ergebnis von `schriftFuer` die
Schwellen wirklich schafft. Die Funktion darf im Notfall auch das
schlechtere Paar zurückgeben (sie MUSS etwas liefern) -- genau dann
schlägt diese Zeile an, und das ist ihr Zweck. */
for (const [feld, wo, noetig] of [["text", ".chat-nachricht__text", 7],
["leise", ".chat-nachricht__fuss", 4.5]]) {
let schlecht = Infinity, wer = "", gemessen = 0;
for (const k of CHAT_KACHELN) { for (const k of CHAT_KACHELN) {
const c = kontrast(farbe, k.farbe); const paar = schriftFuer(k.farbe);
if (!paar || !paar[feld]) continue;
gemessen++;
const c = kontrast(paar[feld], k.farbe);
if (c < schlecht) { schlecht = c; wer = k.name; } if (c < schlecht) { schlecht = c; wer = k.name; }
} }
/* Die ANZAHL gehört in die Bedingung. Wäre CHAT_KACHELN je leer, /* Die ANZAHL gehört in die Bedingung. Wäre CHAT_KACHELN je leer,
bliebe `schlecht` auf Infinity und die Zeile wäre grün, ohne einen bliebe `schlecht` auf Infinity und die Zeile wäre grün, ohne einen
einzigen Ton angesehen zu haben. */ einzigen Ton angesehen zu haben. */
ok(CHAT_KACHELN.length >= 8 && schlecht >= noetig, ok(gemessen === CHAT_KACHELN.length && gemessen >= 8 && schlecht >= noetig,
`${wo} trägt auf allen ${CHAT_KACHELN.length} Tönen ` `${wo} trägt auf allen ${gemessen} Tönen `
+ `(schlechtester ${wer}: ${schlecht.toFixed(2)}:1, nötig ${noetig})`); + `(schlechtester ${wer}: ${schlecht.toFixed(2)}:1, nötig ${noetig})`);
} }
/* UND DIE SCHRIFT WECHSELT WIRKLICH. Ohne diese Zeile wäre nicht
bewiesen, dass `schriftFuer` mehr tut, als immer dasselbe Paar
zurückzugeben -- dann wäre die Schleife oben nur die alte Prüfung
mit mehr Umweg. */
{
const hell = CHAT_KACHELN.filter((k) => helligkeit(k.farbe) > 0.3);
const dunkel = CHAT_KACHELN.filter((k) => helligkeit(k.farbe) <= 0.3);
const hellDunkleSchrift = hell.every((k) => helligkeit(schriftFuer(k.farbe).text) < 0.2);
const dunkelHelleSchrift = dunkel.every((k) => helligkeit(schriftFuer(k.farbe).text) > 0.6);
ok(hell.length >= 1 && dunkel.length >= 1 && hellDunkleSchrift && dunkelHelleSchrift,
`${hell.length} helle Kacheln tragen dunkle Schrift, ${dunkel.length} dunkle tragen helle`);
}
/* GEGENPROBE: Eine Prüfung, die nur bestätigen kann, bestätigt nichts. /* GEGENPROBE: Eine Prüfung, die nur bestätigen kann, bestätigt nichts.
Ein absichtlich zu heller Ton MUSS durchfallen — sonst wäre das Ein absichtlich zu heller Ton MUSS durchfallen — sonst wäre das
Grün oben nur die Abwesenheit einer Messung. */ Grün oben nur die Abwesenheit einer Messung. */
@@ -136,11 +165,30 @@ for (const [name, wo, noetig] of BLASEN_SCHRIFT) {
werden, liegen sie auf einem Wert, und der Rest ist Rundung auf werden, liegen sie auf einem Wert, und der Rest ist Rundung auf
ganze Bildpunkte. Ein Faktor über 1,1 hieße: jemand hat eine Farbe ganze Bildpunkte. Ein Faktor über 1,1 hieße: jemand hat eine Farbe
von Hand eingetragen und damit die Rechnung umgangen. */ von Hand eingetragen und damit die Rechnung umgangen. */
const spanne = Math.max(...CHAT_KACHELN.map((k) => helligkeit(k.farbe))) /* SIE GILT FÜR DIE GERECHNETEN -- und nur für die (22.09.2026 abends).
/ Math.max(1e-6, Math.min(...CHAT_KACHELN.map((k) => helligkeit(k.farbe))));
ok(spanne < 1.1, Der Zweck dieser Zeile ist: „Niemand kann sich durch seine Wahl
`alle Töne liegen auf derselben Leuchtdichte (Faktor ${spanne.toFixed(3)}) ` schlechter lesbar machen als die anderen." Solange alle Töne
+ "— keiner ist heller oder dunkler als die anderen"); dieselbe feste Schrift trugen, war gleiche Leuchtdichte der einzige
Weg dorthin.
Seit die Schrift mitwechselt, gibt es einen zweiten -- und die
Prüfung darüber löst das Versprechen direkt ein: JEDE Kachel
erreicht mit IHRER Schrift 7:1 und 4,5:1. Das ist die Aussage, um
die es ging; die gleiche Leuchtdichte war nur ihr Mittel.
Für die elf gerechneten Töne bleibt das Mittel trotzdem stehen:
Sie kommen aus tools/chat-kacheln-rechnen.mjs, und ein Faktor über
1,1 hieße dort weiterhin, dass jemand eine Farbe von Hand
eingetragen und damit die Rechnung umgangen hat. Ausgenommen sind
die, die nachweislich eine andere Schrift tragen. */
const gerechnet = CHAT_KACHELN.filter(
(k) => helligkeit(schriftFuer(k.farbe).text) > 0.6);
const spanne = Math.max(...gerechnet.map((k) => helligkeit(k.farbe)))
/ Math.max(1e-6, Math.min(...gerechnet.map((k) => helligkeit(k.farbe))));
ok(gerechnet.length >= 8 && spanne < 1.1,
`die ${gerechnet.length} gerechneten Töne liegen auf derselben Leuchtdichte `
+ `(Faktor ${spanne.toFixed(3)}) — keiner ist heller oder dunkler als die anderen`);
/* UND SIE MÜSSEN BUNT SEIN. Gemessen an dem, was vor dem 22.09.2026 /* UND SIE MÜSSEN BUNT SEIN. Gemessen an dem, was vor dem 22.09.2026
drinstand: Buntheit 0,002 bis 0,048, im Mittel 0,028 — zwölf drinstand: Buntheit 0,002 bis 0,048, im Mittel 0,028 — zwölf
+296
View File
@@ -0,0 +1,296 @@
/* =====================================================================
LÖSCHEN HEISST LÖSCHEN — und wer es darf
=====================================================================
Filipe am 22.09.2026:
„Gelöschte Nachrichten verschwinden vollständig – keine Spur, kein
‚wurde gelöscht'-Hinweis, bei niemandem, auch nicht bei
DogFather."
„Löschen darf weiterhin jeder nur seine eigenen – außer DogFather
und rechte Hand: die dürfen jede Nachricht löschen, für den
Notfall."
---------------------------------------------------------------------
WARUM DAS NICHT „EIN STATUS WENIGER" IST
Vorher blieb die Zeile stehen: Text geleert, `weg_am` gesetzt, und
der Chat zeigte „Nachricht zurückgenommen". Es war so begründet --
„ein Loch im Verlauf wirft mehr Fragen auf als der Hinweis". Das
Argument beantwortet nur eine andere Frage: Ein Hinweis „hier stand
etwas" MARKIERT die Stelle. Wer etwas aus Versehen schreibt, will es
weg haben und nicht unterstrichen.
Ein echtes DELETE hat aber vier Ränder, und an jedem kann eine Spur
übrig bleiben. Genau die werden hier gemessen:
1. die Zeile selbst
2. Reaktionen darauf (chat_reaktionen, ON DELETE CASCADE)
3. Erwähnungen darin (chat_erwaehnungen, ON DELETE CASCADE)
4. `letzte_am` am Raum -- sonst stünde er in der Liste ganz
oben, mit einem Zeitpunkt, zu dem
es nichts mehr gibt
Die Punkte 2 und 3 hängen an `PRAGMA foreign_keys = ON`. Dass die
Regel dort steht, ist eine Behauptung im Quelltext; dass sie WIRKT,
sagt nur eine Messung.
---------------------------------------------------------------------
DIE RECHTEGRENZE HAT VIER FÄLLE, NICHT ZWEI
Eine Prüfung, die nur „der Eigene darf" und „ein Fremder darf nicht"
misst, übersieht die Hälfte: Die linke Hand führt Team Dogi mit
(`fuehrtTeamDogi`) und darf es trotzdem NICHT -- Filipe hat zwei
Rollen genannt, nicht drei. Und Spicy Media, das sonst fast alles
darf, darf private Chats nicht einmal sehen.
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { notbremse } from "./helfer-notbremse.mjs";
import { eigenerPort } from "./helfer-port.mjs";
const ordner = mkdtempSync(join(tmpdir(), "ws-loesch-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
const PORT = await eigenerPort(import.meta, "pruef-loeschen");
process.env.PORT = `${PORT}`;
process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const express = (await import("express")).default;
const ec = express.response.cookie;
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
await import("./index.js");
notbremse(120_000, "pruef-loeschen");
await new Promise((r) => setTimeout(r, 800));
let fehler = 0, geprueft = 0, offen = 0;
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
const unklar = (t) => { offen++; console.log(" -- " + t); };
/* ---------- Leute ------------------------------------------------------ */
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const jetzt = new Date().toISOString();
const schluessel = randomBytes(32).toString("hex");
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
.run("code_kennung_schluessel", schluessel, jetzt);
function anlegen(name, rolle, code) {
const salt = randomBytes(16).toString("hex");
const hash = scryptSync(code, salt, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
d.prepare("INSERT INTO personen"
+ " (name, rolle, code_hash, code_salt, code_n, code_kennung, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,?,1,?)")
.run(name, rolle, hash, salt, 32768,
createHmac("sha256", schluessel).update(code).digest("hex"), jetzt);
return d.prepare("SELECT last_insert_rowid() AS id").get().id;
}
const idChef = anlegen("Filipe", "admin", "CODE-DOGI-0001");
const idHand = anlegen("Rieke", "hand", "CODE-HAND-0001");
const idLinke = anlegen("Lino", "linke", "CODE-LINK-0001");
const idModi = anlegen("Frida", "modi", "CODE-MODI-0001");
const idModi2 = anlegen("Nele", "modi", "CODE-MODI-0002");
/* ---------- Anfragen (node:http wegen des Host-Kopfes) ----------------- */
const { request: httpAnfrage } = await import("node:http");
const CREW = "crew.dogfather-universe.com";
function anfrage(pfad, { methode = "GET", keks = "", rumpf = null } = {}) {
return new Promise((fertig, schief) => {
const daten = rumpf === null ? null : Buffer.from(JSON.stringify(rumpf));
const a = httpAnfrage({
host: "127.0.0.1", port: PORT, path: pfad, method: methode,
headers: {
Host: CREW, Origin: `https://${CREW}`, Referer: `https://${CREW}/workspace/`,
...(daten ? { "Content-Type": "application/json", "Content-Length": daten.length } : {}),
...(keks ? { Cookie: keks } : {}),
},
}, (antwort) => {
const st = [];
antwort.on("data", (x) => st.push(x));
antwort.on("end", () => {
const text = Buffer.concat(st).toString("utf8");
let json = null; try { json = JSON.parse(text); } catch { /* kein JSON */ }
fertig({ code: antwort.statusCode, json,
keks: [].concat(antwort.headers["set-cookie"] || [])
.map((c) => c.split(";")[0]).join("; ") });
});
});
a.on("error", schief);
if (daten) a.write(daten);
a.end();
});
}
const anmelden = async (rolle, code) =>
(await anfrage("/workspace/api/anmelden", { methode: "POST", rumpf: { rolle, code } })).keks;
const ruf = (keks, pfad, o = {}) => anfrage(pfad, { ...o, keks });
const keksChef = await anmelden("admin", "CODE-DOGI-0001");
const keksHand = await anmelden("hand", "CODE-HAND-0001");
const keksLinke = await anmelden("linke", "CODE-LINK-0001");
const keksModi = await anmelden("modi", "CODE-MODI-0001");
/* Nele schreibt die fremden Nachrichten -- sie ist in keinem der
vier Faelle die Loeschende, damit "fremd" fuer alle vier
wirklich fremd ist. */
const keksModi2 = await anmelden("modi", "CODE-MODI-0002");
console.log("=== Löschen heißt Löschen ===");
console.log("");
/* Ein Kanal, in dem alle drin sind -- die Kanalregel vom selben Tag
holt sie beim ersten Blick in die Liste hinein. */
const kanal = await ruf(keksChef, "/workspace/api/chat/kanal",
{ methode: "POST", rumpf: { kategorie: "chat", mit: [] } });
const raumId = kanal.json?.raum_id;
await ruf(keksChef, "/workspace/api/chat/raeume");
const drin = d.prepare(
"SELECT COUNT(*) AS n FROM chat_teilnehmer WHERE raum_id = ? AND raus_am IS NULL").get(raumId).n;
ok(kanal.code === 201 && drin === 5, `ein Kanal mit allen fünf steht (${drin})`);
const schreiben = async (keks, text) => {
const a = await ruf(keks, `/workspace/api/chat/raeume/${raumId}/nachrichten`,
{ methode: "POST", rumpf: { text } });
return a.json?.id || a.json?.nachricht?.id || null;
};
/* =====================================================================
1. EINE EIGENE NACHRICHT -- MIT ALLEM DRAN
===================================================================== */
console.log("--- Eine eigene löschen, mit Reaktion und Erwähnung ---");
const idNachricht = await schreiben(keksModi, "Hallo @Rieke, das hier ist ein Versehen");
ok(Number.isInteger(idNachricht), `sie ist geschrieben (#${idNachricht})`);
await ruf(keksChef, `/workspace/api/chat/nachrichten/${idNachricht}/reaktion`,
{ methode: "PUT", rumpf: { zeichen: "\u{1F44D}" } });
const vorher = {
zeile: d.prepare("SELECT COUNT(*) AS n FROM chat_nachrichten WHERE id = ?").get(idNachricht).n,
reaktion: d.prepare("SELECT COUNT(*) AS n FROM chat_reaktionen WHERE nachricht_id = ?")
.get(idNachricht).n,
erwaehnung: d.prepare("SELECT COUNT(*) AS n FROM chat_erwaehnungen WHERE nachricht_id = ?")
.get(idNachricht).n,
};
ok(vorher.zeile === 1 && vorher.reaktion === 1 && vorher.erwaehnung === 1,
`vorher: Zeile ${vorher.zeile}, Reaktion ${vorher.reaktion}, Erwähnung ${vorher.erwaehnung}`
+ " — es gibt also wirklich etwas zu löschen");
const weg = await ruf(keksModi, `/workspace/api/chat/nachrichten/${idNachricht}`,
{ methode: "DELETE" });
ok(weg.code === 200, `die eigene löschen geht (${weg.code})`);
const nachher = {
zeile: d.prepare("SELECT COUNT(*) AS n FROM chat_nachrichten WHERE id = ?").get(idNachricht).n,
reaktion: d.prepare("SELECT COUNT(*) AS n FROM chat_reaktionen WHERE nachricht_id = ?")
.get(idNachricht).n,
erwaehnung: d.prepare("SELECT COUNT(*) AS n FROM chat_erwaehnungen WHERE nachricht_id = ?")
.get(idNachricht).n,
};
ok(nachher.zeile === 0, "die Zeile ist weg — nicht geleert, weg");
ok(nachher.reaktion === 0 && nachher.erwaehnung === 0,
`und Reaktion (${nachher.reaktion}) und Erwähnung (${nachher.erwaehnung}) mit ihr`
+ " — ON DELETE CASCADE wirkt wirklich");
/* KEINE SPUR IM VERLAUF -- auch nicht bei DogFather. */
const verlaufChef = await ruf(keksChef, `/workspace/api/chat/raeume/${raumId}/nachrichten`);
const alle = verlaufChef.json?.nachrichten || [];
ok(!alle.some((n) => n.id === idNachricht),
"sie steht in keinem Verlauf mehr — auch nicht in dem von DogFather");
ok(!alle.some((n) => n.zurueckgenommen),
"und es steht nirgends eine zurückgenommene Nachricht");
/* =====================================================================
2. DIE VIER FÄLLE DER RECHTEGRENZE
===================================================================== */
console.log("");
console.log("--- Wer darf eine FREMDE löschen ---");
const faelle = [
["DogFather", keksChef, 200, "er ist einer der zwei, die es dürfen"],
["die rechte Hand", keksHand, 200, "sie ist die zweite"],
["die linke Hand", keksLinke, 403,
"sie führt Team Dogi mit und darf es trotzdem nicht — genannt waren zwei Rollen"],
["ein Modi", keksModi, 403, "er nicht"],
];
let geprueftFaelle = 0;
for (const [wer, keks, erwartet, warum] of faelle) {
const id = await schreiben(keksModi2, `Fremde Nachricht für ${wer}`);
if (!Number.isInteger(id)) { unklar(`für ${wer} ließ sich keine Nachricht anlegen`); continue; }
const a = await ruf(keks, `/workspace/api/chat/nachrichten/${id}`, { methode: "DELETE" });
const nochDa = d.prepare("SELECT COUNT(*) AS n FROM chat_nachrichten WHERE id = ?").get(id).n;
geprueftFaelle++;
ok(a.code === erwartet && (erwartet === 200 ? nochDa === 0 : nochDa === 1),
`${wer}: ${a.code} (erwartet ${erwartet}), Zeile danach ${nochDa} — ${warum}`);
}
ok(geprueftFaelle === faelle.length,
`alle ${faelle.length} Fälle wirklich durchgespielt (${geprueftFaelle})`);
/* =====================================================================
3. DER RAUM VERGISST DEN ZEITPUNKT
===================================================================== */
console.log("");
console.log("--- Was der Raum danach über sich sagt ---");
const letzteId = await schreiben(keksModi, "Die allerletzte");
const vorLoeschen = d.prepare("SELECT letzte_am FROM chat_raeume WHERE id = ?").get(raumId).letzte_am;
await ruf(keksModi, `/workspace/api/chat/nachrichten/${letzteId}`, { methode: "DELETE" });
const nachLoeschen = d.prepare("SELECT letzte_am FROM chat_raeume WHERE id = ?").get(raumId).letzte_am;
ok(!!vorLoeschen && vorLoeschen !== nachLoeschen,
`der Raum rechnet seinen letzten Zeitpunkt neu (${vorLoeschen} → ${nachLoeschen})`);
/* =====================================================================
4. DAS BABYBLAUE HERZ
===================================================================== */
console.log("");
console.log("--- Babyblau statt Blau ---");
const { ERLAUBT } = await import("./workspace-reaktionen.js");
ok(ERLAUBT.has("\u{1FA75}"), "das babyblaue Herz steht im Katalog");
ok(!ERLAUBT.has("\u{1F499}"), "das normale blaue nicht mehr");
/* GEGENPROBE AM LAUFENDEN SERVER: Was der Katalog sagt, muss auch der
Weg zum Setzen sagen. Zwei Listen, die auseinanderlaufen, wären hier
besonders unangenehm -- man setzt ein Zeichen und es verschwindet. */
const idFuerHerz = await schreiben(keksModi, "Ein Satz zum Liebhaben");
const babyOk = await ruf(keksChef, `/workspace/api/chat/nachrichten/${idFuerHerz}/reaktion`,
{ methode: "PUT", rumpf: { zeichen: "\u{1FA75}" } });
const blauAb = await ruf(keksHand, `/workspace/api/chat/nachrichten/${idFuerHerz}/reaktion`,
{ methode: "PUT", rumpf: { zeichen: "\u{1F499}" } });
ok(babyOk.code === 200, `ein babyblaues Herz geht durch (${babyOk.code})`);
ok(blauAb.code === 400, `ein blaues wird abgewiesen (${blauAb.code})`);
/* =====================================================================
5. IM CHAT-SKRIPT STEHT DER SATZ NICHT MEHR
===================================================================== */
console.log("");
console.log("--- Und im Browser ---");
const { readFileSync } = await import("node:fs");
const { dirname } = await import("node:path");
const { fileURLToPath } = await import("node:url");
const HIER = dirname(fileURLToPath(import.meta.url));
const chatJs = readFileSync(join(HIER, "..", "workspace", "assets", "js", "chat.js"), "utf8");
/* NUR AUSSERHALB VON KOMMENTAREN. Die Begründung, warum der Satz weg
ist, nennt ihn -- und muss das auch dürfen. Gesucht wird deshalb
nach ihm als Zeichenkette in Anführungszeichen, also so, wie er auf
den Bildschirm käme. */
const alsText = /(['"`])Nachricht zurückgenommen\1/.test(chatJs);
ok(!alsText, "der Satz steht in chat.js an keiner Stelle mehr,"
+ " an der ihn jemand lesen koennte");
ok(/Nachricht zurückgenommen/.test(chatJs),
"Gegenprobe: der Satz kommt in den Kommentaren durchaus vor —"
+ " die Suche oben unterscheidet also wirklich");
/* ---------- Ende ------------------------------------------------------ */
d.close();
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Windows haelt manchmal */ }
console.log("");
console.log(`${fehler === 0 ? "BESTANDEN" : "FEHLGESCHLAGEN"}`
+ ` -- ${geprueft} geprueft, ${fehler} Fehler, ${offen} nicht nachsehbar`);
process.exit(fehler === 0 ? 0 : 1);
+188 -34
View File
@@ -235,6 +235,30 @@ function bildWegFuer(personId) {
===================================================================== */ ===================================================================== */
export const CHAT_KACHELN = [ export const CHAT_KACHELN = [
{ wert: "grund", name: "Neutral", farbe: "#4f545c" }, { wert: "grund", name: "Neutral", farbe: "#4f545c" },
/* BABYBLAU -- die einzige helle Kachel (22.09.2026).
------------------------------------------------------------------
Filipe: „jeder normale blaue farbe, sei es die kachel im chat oder
emojis, nur babyblau bitte." Und im selben Auftrag: „Textfarbe
soll mitwechseln, am besten schwarz auf hellen Kacheln -- und
weiss, wenn jemand eine schwarze Kachel waehlt."
Die zwei Saetze gehoeren zusammen, und in dieser Reihenfolge.
Babyblau ist HELL (Leuchtdichte 0,547); die helle Schrift der
Blase kaeme darauf auf 1,63:1 -- unlesbar. Erst weil die Schrift
jetzt mitwechselt (schriftFuer weiter unten), ist diese Kachel
ueberhaupt moeglich.
Sie steht deshalb NICHT in der Rechnung von
tools/chat-kacheln-rechnen.mjs: Das Werkzeug rechnet elf bunte
Toene auf EINE gemeinsame Leuchtdichte, damit niemand sich durch
seine Wahl schlechter lesbar machen kann. Diese hier hat eine
andere Leuchtdichte und dafuer ihre eigene Schrift -- gemessen:
Text 10,78:1 (noetig 7), Fusszeile 4,87:1 (noetig 4,5). Dasselbe
Versprechen, auf anderem Weg eingeloest.
Der Wert ist exakt `--akzent` des Hauses. Eine zweite Zahl daneben
waere zwei Babyblau, und beim naechsten Mal drei. */
{ wert: "babyblau", name: "Babyblau", farbe: "#8ec9ff" },
{ wert: "tinte", name: "Tinte", farbe: "#0150af" }, { wert: "tinte", name: "Tinte", farbe: "#0150af" },
{ wert: "veilchen", name: "Veilchen", farbe: "#6a01e5" }, { wert: "veilchen", name: "Veilchen", farbe: "#6a01e5" },
{ wert: "pflaume", name: "Pflaume", farbe: "#9301a2" }, { wert: "pflaume", name: "Pflaume", farbe: "#9301a2" },
@@ -248,6 +272,71 @@ export const CHAT_KACHELN = [
{ wert: "ozean", name: "Ozean", farbe: "#045b74" }, { wert: "ozean", name: "Ozean", farbe: "#045b74" },
]; ];
/* =====================================================================
WELCHE SCHRIFT AUF WELCHER KACHEL (22.09.2026)
=====================================================================
Filipe: „Textfarbe soll mitwechseln, am besten schwarz auf hellen
Kacheln -- und weiss, wenn jemand eine schwarze Kachel waehlt."
GERECHNET, NICHT JE KACHEL EINGETRAGEN. Eine dritte Spalte in
CHAT_KACHELN waere eine Liste, die jemand pflegen muss -- und beim
naechsten Ton vergisst. Hier steht stattdessen die Regel, und die
Farbe folgt aus der Flaeche.
ZWEI PAARE, NICHT BELIEBIGE FARBEN: Ein frei gerechneter Grauwert je
Kachel ergaebe zwoelf verschiedene Schriften, und der Chat saehe aus
wie zwoelf verschiedene Programme. Es gibt ein helles Paar (das
bisherige, aus chat.css) und ein dunkles; genommen wird das, das die
noetigen Kontraste schafft.
DIE SCHWELLEN SIND DIESELBEN WIE IM RECHENWERKZEUG: 7:1 (AAA) fuer
den Text -- der Chat ist die Seite, auf der am laengsten gelesen
wird -- und 4,5:1 fuer die Fusszeile. Sie stehen hier einmal und
werden von pruef-chatkachel.mjs aus DIESER Datei gelesen; zwei
Zahlen in zwei Dateien waeren der Widerspruch, den niemand bemerkt.
===================================================================== */
export const SCHRIFT_NOETIG = { text: 7, leise: 4.5 };
/** Das helle Paar -- dieselben Werte wie `--blase-text` / `--blase-leise`
* in chat.css. Sie stehen dort als Rueckfall fuer den Fall, dass gar
* keine Kachel gesetzt ist. */
export const SCHRIFT_HELL = { text: "#f3f7fc", leise: "#c4d2e2" };
/** Das dunkle Paar fuer helle Kacheln. Gemessen auf Babyblau:
* 10,78:1 und 4,87:1. */
export const SCHRIFT_DUNKEL = { text: "#0b1119", leise: "#3b4e63" };
const alsLinear = (c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);
function leuchtdichte(hex) {
const z = String(hex).replace("#", "");
const [r, g, b] = [0, 2, 4]
.map((i) => parseInt(z.slice(i, i + 2), 16) / 255).map(alsLinear);
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}
function kontrastZwischen(a, b) {
const x = leuchtdichte(a), y = leuchtdichte(b);
return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05);
}
/** Welches Schriftpaar traegt auf dieser Flaeche?
*
* GIBT IMMER EINES ZURUECK. Ein dritter Ausgang ("keines passt")
* waere hier falsch: Der Chat muss etwas anzeigen. Dass beide Paare
* reichen, ist die Aufgabe von pruef-chatkachel.mjs -- sie misst
* jeden Ton der Liste gegen genau diese Funktion. Faellt einer durch,
* ist das ein Befund und keine Notlage zur Laufzeit. */
export function schriftFuer(farbe) {
const passt = (paar) =>
kontrastZwischen(paar.text, farbe) >= SCHRIFT_NOETIG.text
&& kontrastZwischen(paar.leise, farbe) >= SCHRIFT_NOETIG.leise;
if (passt(SCHRIFT_HELL)) return SCHRIFT_HELL;
if (passt(SCHRIFT_DUNKEL)) return SCHRIFT_DUNKEL;
/* Schafft keines beide Schwellen, entscheidet der TEXT -- er ist
das, was man liest. */
return kontrastZwischen(SCHRIFT_HELL.text, farbe)
>= kontrastZwischen(SCHRIFT_DUNKEL.text, farbe) ? SCHRIFT_HELL : SCHRIFT_DUNKEL;
}
/** Nur ein Ton aus der Liste kommt durch -- sonst nichts. /** Nur ein Ton aus der Liste kommt durch -- sonst nichts.
* *
* DIE PRUEFUNG STEHT HIER UND NICHT NUR IM FORMULAR. Was aus der * DIE PRUEFUNG STEHT HIER UND NICHT NUR IM FORMULAR. Was aus der
@@ -727,7 +816,10 @@ chatRouter.get("/workspace/api/chat/partner", (req, res) => {
chatRouter.get("/workspace/api/chat/kacheln", (req, res) => { chatRouter.get("/workspace/api/chat/kacheln", (req, res) => {
try { try {
res.json({ res.json({
kacheln: CHAT_KACHELN, /* DIE SCHRIFT GEHT MIT. Der Browser soll sie nicht selbst
rechnen -- dann staende die Regel zweimal da, und beim
naechsten Ton waere eine der beiden Fassungen aelter. */
kacheln: CHAT_KACHELN.map((k) => ({ ...k, schrift: schriftFuer(k.farbe) })),
/* Die eigene WAHL, nicht der getragene Ton -- sonst stuende im /* Die eigene WAHL, nicht der getragene Ton -- sonst stuende im
Waehler ein Haken bei einer Farbe, die niemand gewaehlt hat. */ Waehler ein Haken bei einer Farbe, die niemand gewaehlt hat. */
meine: gewaehlteKachelFuer(req.person.id), meine: gewaehlteKachelFuer(req.person.id),
@@ -1270,6 +1362,12 @@ chatRouter.get("/workspace/api/chat/raeume/:id/nachrichten", (req, res) => {
assets/js/chat.js bekommt jeder, der die Seite oeffnet. Ein assets/js/chat.js bekommt jeder, der die Seite oeffnet. Ein
Ja/Nein verraet nichts ueber die Rollen dahinter. */ Ja/Nein verraet nichts ueber die Rollen dahinter. */
darf_anheften: darfAnheften(req.person, raumId), darf_anheften: darfAnheften(req.person, raumId),
/* WER JEDE NACHRICHT LOESCHEN DARF -- vom Server, nicht aus
der Rolle im Browser geraten. assets/js/chat.js bekommt
JEDER, der die Seite oeffnet; ein `rolle === 'hand'` darin
waere eine Auskunft ueber das Haus an jeden Leser. Und es
waere eine zweite Wahrheit neben der Schranke im Server. */
darf_alles_loeschen: darfJedeNachrichtLoeschen(req.person),
angeheftet: angeheftet.map((a) => ({ angeheftet: angeheftet.map((a) => ({
id: a.id, id: a.id,
von: a.von || "Gelöscht", von: a.von || "Gelöscht",
@@ -2239,60 +2337,116 @@ chatRouter.put("/workspace/api/chat/nachrichten/:id/anheften", gleicheHerkunft,
} }
}); });
/** Eine eigene Nachricht zurücknehmen. */ /* =====================================================================
LÖSCHEN HEISST LÖSCHEN (22.09.2026)
=====================================================================
Filipe: „Gelöschte Nachrichten verschwinden vollständig – keine
Spur, kein ‚wurde gelöscht'-Hinweis, bei niemandem, auch nicht bei
DogFather." Und: „Löschen darf weiterhin jeder nur seine eigenen –
außer DogFather und rechte Hand: die dürfen jede Nachricht löschen,
für den Notfall."
---------------------------------------------------------------------
WAS SICH DAMIT UMDREHT
Hier stand bis heute das Gegenteil, und zwar begründet: „Ein Loch im
Verlauf wirft mehr Fragen auf als der Hinweis, dass hier etwas
zurückgenommen wurde." Die Zeile blieb, der Text wurde geleert, und
der Chat zeigte „Nachricht zurückgenommen".
Das Argument war nicht falsch -- es beantwortet nur eine andere
Frage als die, die Filipe stellt. Ein Hinweis „hier stand etwas"
ist für den, der gelöscht hat, oft schlimmer als der Satz selbst:
Er markiert die Stelle. Wer etwas aus Versehen schreibt, will es
weg haben und nicht unterstrichen.
DESHALB JETZT EIN ECHTES DELETE. Das geht sauber, weil die beiden
abhängigen Tabellen es mittragen:
chat_reaktionen ... REFERENCES chat_nachrichten(id) ON DELETE CASCADE
chat_erwaehnungen ... REFERENCES chat_nachrichten(id) ON DELETE CASCADE
und `PRAGMA foreign_keys = ON` beim Öffnen steht. Nachgesehen, nicht
angenommen.
DREI DINGE, DIE SONST EINE SPUR HINTERLIESSEN:
1. `antwort_auf` zeigt weiter auf die Nummer. Der Verlauf holt das
Zitat über einen LEFT JOIN -- es kommt nichts mehr zurück, und
die Anzeige lässt das Zitat dann weg. Ein Zitat auf etwas, das
es nicht gibt, wäre die Spur.
2. `letzte_am` am Raum. War die gelöschte die letzte Nachricht,
stünde die Gesprächsliste weiter auf ihrem Zeitpunkt -- ein
Raum, der ganz oben steht und nichts Neues hat. Wird neu
gerechnet.
3. Der Anhang auf der Platte. Das war schon vorher richtig gelöst
und bleibt so: erst die Zeile, dann die Datei.
WAS BLEIBT: die Protokollzeile. Sie nennt WER WESSEN Nachricht
gelöscht hat -- keinen Text, keinen Inhalt. Beim Notfall-Löschen
durch DogFather oder die rechte Hand ist das der Unterschied
zwischen einer Befugnis und einer unsichtbaren Macht. Das Protokoll
ist kein Chatverlauf; es steht an einer anderen Stelle und
beantwortet eine andere Frage.
===================================================================== */
/** Wer JEDE Nachricht löschen darf -- für den Notfall.
*
* NICHT `fuehrtTeamDogi`: Das schlösse die linke Hand ein, und Filipe
* hat ausdrücklich zwei genannt. Nicht `istLeitung`: Das schlösse
* Spicy Media ein -- die private Chats ausdrücklich nicht einmal
* sehen darf. Zwei Rollen, wörtlich die zwei aus dem Auftrag. */
const darfJedeNachrichtLoeschen = (person) =>
istDogFather(person) || person?.rolle === "hand";
chatRouter.delete("/workspace/api/chat/nachrichten/:id", gleicheHerkunft, (req, res) => { chatRouter.delete("/workspace/api/chat/nachrichten/:id", gleicheHerkunft, (req, res) => {
try { try {
const id = Number(req.params.id); const id = Number(req.params.id);
if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" }); if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" });
const n = db().prepare( const d = db();
const n = d.prepare(
"SELECT id, raum_id, person_id, anhang_datei FROM chat_nachrichten WHERE id = ?").get(id); "SELECT id, raum_id, person_id, anhang_datei FROM chat_nachrichten WHERE id = ?").get(id);
if (!n || !istDrin(n.raum_id, req.person)) { if (!n || !istDrin(n.raum_id, req.person)) {
return res.status(404).json({ fehler: "nicht_gefunden" }); return res.status(404).json({ fehler: "nicht_gefunden" });
} }
/* NUR EIGENE. DogFather ebenfalls nicht: Fremde Worte aus einem const fremd = n.person_id !== req.person.id;
Gespräch zu nehmen, in dem Absprachen stehen, wäre ein Eingriff if (fremd && !darfJedeNachrichtLoeschen(req.person)) {
in die Geschichte -- und niemand könnte ihm nachher glauben. */
if (n.person_id !== req.person.id) {
return res.status(403).json({ fehler: "Nur eigene Nachrichten." }); return res.status(403).json({ fehler: "Nur eigene Nachrichten." });
} }
/* EIN ANHANG WIRD WIRKLICH GELÖSCHT, nicht nur ausgeblendet.
Beim Text reicht das Leeren -- er steht nur in der Zeile. Eine
Datei liegt daneben auf der Platte und hätte ihre eigene Adresse
behalten. "Zurückgenommen" hiesse dann: im Verlauf weg, über den
Link weiter da. Das wäre keine Rücknahme, sondern der Anschein
einer. Erst die Zeile leeren, dann die Datei -- scheitert das
Entfernen (Datei schon weg), ist der Verweis trotzdem fort. */
const dateiWeg = n.anhang_datei; const dateiWeg = n.anhang_datei;
/* UND SIE FAELLT VOM AUSHANG (10.09.2026). Ohne diese zwei /* ERST DIE ZEILE, DANN DIE DATEI. Scheitert das Entfernen (Datei
Spalten stuende die Nachricht weiter oben angeheftet -- mit dem schon weg), ist der Verweis trotzdem fort -- andersherum bliebe
Text "Nachricht zurueckgenommen", an der auffaelligsten Stelle im schlechten Fall eine Zeile ohne Datei stehen. */
des Raums. Die Anzeige filtert zwar auf `weg_am IS NULL`, aber d.prepare("DELETE FROM chat_nachrichten WHERE id = ?").run(id);
der Platz waere belegt: PIN_MAX zaehlt mit, und niemand kaeme
darauf, warum sich nichts mehr anheften laesst. */
db().prepare(`UPDATE chat_nachrichten
SET text = '', weg_am = ?,
angeheftet_am = NULL, angeheftet_von = NULL,
anhang_datei = NULL, anhang_name = NULL, anhang_art = NULL,
anhang_typ = NULL, anhang_groesse = NULL,
anhang_breite = NULL, anhang_hoehe = NULL
WHERE id = ?`).run(jetzt(), id);
if (dateiWeg) { if (dateiWeg) {
try { unlinkSync(join(ANHANG_ORDNER, dateiWeg)); } try { unlinkSync(join(ANHANG_ORDNER, dateiWeg)); }
catch (f) { if (f?.code !== "ENOENT") console.error("[chat] Anhang bleibt liegen:", f?.message); } catch (f) { if (f?.code !== "ENOENT") console.error("[chat] Anhang bleibt liegen:", f?.message); }
} }
const empfaenger = teilnehmerVon(n.raum_id).map((t) => t.id); /* DER RAUM RECHNET SEINEN LETZTEN ZEITPUNKT NEU. Ohne das stuende
chatEreignis(n.raum_id, { id, raum_id: n.raum_id, zurueckgenommen: true }, [], "weg"); er in der Liste weiterhin ganz oben, mit einem Zeitpunkt, zu dem
es nichts mehr gibt. */
d.prepare(`UPDATE chat_raeume
SET letzte_am = (SELECT MAX(erstellt) FROM chat_nachrichten WHERE raum_id = ?)
WHERE id = ?`).run(n.raum_id, n.raum_id);
protokolliere("chat_zurueckgenommen", { const empfaenger = teilnehmerVon(n.raum_id).map((t) => t.id);
/* `geloescht: true` STATT `zurueckgenommen`. Das Wort entscheidet,
was der Browser tut: Das alte hiess "zeig einen Hinweis", das
neue heisst "nimm es aus dem Bild". Beides gleichzeitig zu
schicken waere die Fassung, bei der eine alte Seite den Hinweis
weiter anzeigt. */
chatEreignis(n.raum_id, { id, raum_id: n.raum_id, geloescht: true }, [], "weg");
protokolliere("chat_geloescht", {
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req), personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
detail: `#${id}`, detail: fremd ? `#${id} (fremde Nachricht von #${n.person_id})` : `#${id}`,
}); });
res.json({ ok: true, empfaenger: empfaenger.length }); res.json({ ok: true, geloescht: true, empfaenger: empfaenger.length });
} catch (fehler) { } catch (fehler) {
console.error("[chat] Zurücknehmen:", fehler?.message); console.error("[chat] Löschen:", fehler?.message);
res.status(503).json({ fehler: "nicht_verfuegbar" }); res.status(503).json({ fehler: "nicht_verfuegbar" });
} }
}); });
+17 -1
View File
@@ -62,7 +62,23 @@ export const KATALOG = [
["\u{1F9E1}", "herz orange"], ["\u{1F9E1}", "herz orange"],
["\u{1F49B}", "herz gelb"], ["\u{1F49B}", "herz gelb"],
["\u{1F49A}", "herz gruen"], ["\u{1F49A}", "herz gruen"],
["\u{1F499}", "herz blau"], /* BABYBLAU STATT BLAU (22.09.2026). Filipe: "jedes normales
blaues herz durch babyblaues herz ersetzen ... jeder
normale blaue farbe, sei es die kachel im chat oder
emojis, nur babyblau bitte."
U+1FA75 gibt es seit Emoji 15.0 (2022). Nicht geglaubt,
sondern gemessen: In Chromium auf diesem Rechner ist es
43,9 px breit -- genauso breit wie die anderen Herzen und
deutlich breiter als ein Ersatzkaestchen (20,7 px). Waere
es nicht da, stuende im Chat ein leeres Viereck, und das
waere schlimmer als ein blaues Herz.
Die vier vorhandenen blauen Herzen in der Datenbank
wandern mit -- die Umstellung steht in workspace.js.
Ohne sie waeren es vier Reaktionen, die ERLAUBT nicht
mehr kennt: still weg, ohne dass jemand etwas bemerkt. */
["\u{1FA75}", "herz babyblau hellblau blau"],
["\u{1F49C}", "herz lila"], ["\u{1F49C}", "herz lila"],
["\u{1F5A4}", "herz schwarz"], ["\u{1F5A4}", "herz schwarz"],
["\u{1F60D}", "verliebt herzaugen toll"], ["\u{1F60D}", "verliebt herzaugen toll"],
+93
View File
@@ -3459,6 +3459,99 @@ function umstellungen(d) {
} }
} }
/* =====================================================================
DIE ALTEN ZURUECKGENOMMENEN NACHRICHTEN GEHEN GANZ (22.09.2026)
=====================================================================
Filipe: „Geloeschte Nachrichten verschwinden vollstaendig -- keine
Spur, kein ‚wurde geloescht'-Hinweis, bei niemandem, auch nicht
bei DogFather."
Seit heute loescht der Chat wirklich (DELETE). Was davor
zurueckgenommen wurde, steht aber noch als Zeile da: Text leer,
`weg_am` gesetzt. Die Anzeige zeigt sie nicht mehr -- in der
Datenbank waere sie trotzdem. „Keine Spur" gilt dann fuer alles,
was ab heute passiert, und nicht fuer das, was ihn zu dem Satz
gebracht hat.
ES GEHT NUR UM ZEILEN OHNE INHALT. `text = ''` ist die Bedingung,
nicht bloss `weg_am IS NOT NULL`: Der Text wurde beim Zuruecknehmen
geleert, also ist hier nichts zu verlieren. Stuende irgendwo doch
noch Text in einer zurueckgenommenen Zeile, bliebe sie liegen --
lieber ein Rest, den jemand ansehen kann, als ein stiller Verlust.
WIEDERHOLBAR: Beim zweiten Start gibt es nichts mehr zu tun, und
es passiert nichts. Deshalb steht es hier bei den Umstellungen
und nicht in einem einmaligen Skript, das jemand vergessen
koennte.
GESICHERT WIRD VORHER -- aber nur, wenn es wirklich etwas zu tun
gibt. Eine Sicherung bei jedem Start waere eine Datei je Neustart
und damit kein Schutz, sondern Muell. */
try {
const spalten = d.prepare("PRAGMA table_info(chat_nachrichten)").all().map((x) => x.name);
if (spalten.includes("weg_am")) {
const offen = d.prepare(
"SELECT COUNT(*) AS n FROM chat_nachrichten WHERE weg_am IS NOT NULL AND text = ''").get().n;
if (offen > 0) {
const stempel = new Date().toISOString().replace(/[-:T]/g, "").slice(0, 14);
const sicherung = `${DB_PFAD}.vor-loeschspuren-${stempel}`;
d.exec(`VACUUM INTO '${sicherung.replace(/'/g, "''")}'`);
console.log("[workspace] Sicherung vor dem Aufraeumen:", sicherung);
/* Reaktionen und Erwaehnungen haengen mit ON DELETE CASCADE
daran und gehen von selbst mit -- `PRAGMA foreign_keys = ON`
steht beim Oeffnen. Nachgesehen, nicht angenommen. */
const weg = d.prepare(
"DELETE FROM chat_nachrichten WHERE weg_am IS NOT NULL AND text = ''").changes;
/* Und die Raeume rechnen ihren letzten Zeitpunkt neu -- sonst
stuende einer oben in der Liste, zu dessen Zeitpunkt es
nichts mehr gibt. */
d.exec(`UPDATE chat_raeume SET letzte_am =
(SELECT MAX(erstellt) FROM chat_nachrichten WHERE raum_id = chat_raeume.id)`);
console.log(`[workspace] ${weg} zurueckgenommene Nachrichten endgueltig entfernt.`);
}
}
} catch (fehler) {
console.error("[workspace] Aufraeumen der Loeschspuren:", fehler?.message);
}
/* =====================================================================
DIE BLAUEN HERZEN WERDEN BABYBLAU (22.09.2026)
=====================================================================
Filipe: "jedes normales blaues herz durch babyblaues herz
ersetzen ... jeder normale blaue farbe, sei es die kachel im chat
oder emojis, nur babyblau bitte."
Der Katalog (workspace-reaktionen.js) kennt seit heute nur noch
das babyblaue. WAS SCHON IN DER DATENBANK STEHT, WANDERT MIT --
ohne diese Zeilen waeren es vier Reaktionen, die `ERLAUBT` nicht
mehr kennt. Der Verlauf filtert danach: Sie verschwaenden still,
und niemand koennte sagen, wann und warum.
`UPDATE OR IGNORE`, DANN `DELETE`: Der Primaerschluessel ist
(nachricht_id, person_id, zeichen). Hat jemand auf dieselbe
Nachricht BEIDES gesetzt, liefe ein blankes UPDATE auf den
Schluessel auf. So gewinnt das vorhandene babyblaue, und das
blaue faellt weg -- zweimal dasselbe Herz an einer Nachricht
waere ohnehin keine zwei Reaktionen.
WIEDERHOLBAR: Beim zweiten Start gibt es nichts mehr zu tun. */
try {
const blau = "\u{1F499}", babyblau = "\u{1FA75}";
const offen = d.prepare(
"SELECT COUNT(*) AS n FROM chat_reaktionen WHERE zeichen = ?").get(blau).n;
if (offen > 0) {
d.prepare("UPDATE OR IGNORE chat_reaktionen SET zeichen = ? WHERE zeichen = ?")
.run(babyblau, blau);
const rest = d.prepare("DELETE FROM chat_reaktionen WHERE zeichen = ?").run(blau).changes;
console.log(`[workspace] ${offen} blaue Herzen auf babyblau umgestellt`
+ (rest ? ` (${rest} doppelte entfernt)` : ""));
}
} catch (fehler) {
console.error("[workspace] Herzen umstellen:", fehler?.message);
}
/* Content-Saeulen: die drei bis fuenf Themen, aus denen der Kanal /* Content-Saeulen: die drei bis fuenf Themen, aus denen der Kanal
besteht. Aus der Recherche: 3-5 Saeulen nach der 70/20/10-Regel besteht. Aus der Recherche: 3-5 Saeulen nach der 70/20/10-Regel
(70 % Wert, 20 % Community, 10 % Eigenwerbung); eine Saeule wird (70 % Wert, 20 % Community, 10 % Eigenwerbung); eine Saeule wird
+5 -5
View File
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur. verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als <!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll, ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
WARUM das Telefon nicht klingelt, ist das besonders unpassend. --> WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
<link rel="manifest" href="/workspace/crew.webmanifest" /> <link rel="manifest" href="/workspace/crew.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<style> <style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite /* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht, soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -126,7 +126,7 @@
<script src="assets/js/anruf-probe.js?v=202609222018" defer></script> <script src="assets/js/anruf-probe.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -23,25 +23,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/workspace-192.png?v=202609222018", "src": "/assets/img/app-symbole/workspace-192.png?v=202609222333",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512.png?v=202609222018", "src": "/assets/img/app-symbole/workspace-512.png?v=202609222333",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609222018", "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609222333",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609222018", "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609222333",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+26 -6
View File
@@ -444,17 +444,37 @@
der Rolle sitzt daneben im Kreis und im Punkt davor, nicht in der der Rolle sitzt daneben im Kreis und im Punkt davor, nicht in der
Schrift -- eine Rollenfarbe als Schriftfarbe waere bei zwoelf Schrift -- eine Rollenfarbe als Schriftfarbe waere bei zwoelf
waehlbaren Flaechen nicht mehr zu garantieren. */ waehlbaren Flaechen nicht mehr zu garantieren. */
/* NOCH EINMAL STAERKER (22.09.2026 abends).
---------------------------------------------------------------------
Filipe, zum zweiten Mal an derselben Stelle: "Namen viel spezieller
und besser erkennbar."
Am Nachmittag war der Name hell und fett geworden -- er stand aber
weiterhin als erste ZEILE in der Blase und las sich dadurch wie der
Anfang des Satzes. Jetzt ist er ein eigener Streifen mit einer Kante
darunter: Er gehoert sichtbar zur Blase, ist aber nicht mehr Teil
des Textes.
DER PUNKT WIRD EIN BALKEN. Sechs Pixel rund sind auf einem Handy
fast nichts; 3x14 senkrecht daneben liest sich als Markierung und
ist bei gleicher Flaeche deutlich besser zu sehen.
DIE SCHRIFTFARBE BLEIBT `--blase-text` -- und die wechselt seit
heute mit der Kachel. Auf Babyblau steht der Name also dunkel, auf
allen anderen hell. Eine feste Farbe waere genau hier der Fehler. */
.chat-nachricht__von { .chat-nachricht__von {
margin: 0 0 4px; margin: 0 0 7px;
display: flex; align-items: center; gap: 6px; padding: 0 0 6px;
font-size: .78rem; font-weight: 800; display: flex; align-items: center; gap: 8px;
letter-spacing: .015em; font-size: .84rem; font-weight: 800;
letter-spacing: .02em;
color: var(--blase-text); color: var(--blase-text);
border-bottom: 1px solid color-mix(in srgb, var(--blase-text) 18%, transparent);
} }
.chat-nachricht__von::before { .chat-nachricht__von::before {
content: ""; flex: none; content: ""; flex: none;
width: 6px; height: 6px; border-radius: 50%; width: 3px; height: 14px; border-radius: 2px;
background: var(--rollenfarbe, rgba(255, 255, 255, .55)); background: var(--rollenfarbe, color-mix(in srgb, var(--blase-text) 55%, transparent));
} }
/* Dieselbe Zuordnung wie beim Kreis mit den Anfangsbuchstaben. Sie /* Dieselbe Zuordnung wie beim Kreis mit den Anfangsbuchstaben. Sie
steht zweimal, weil zwei verschiedene Eigenschaften gesetzt werden steht zweimal, weil zwei verschiedene Eigenschaften gesetzt werden
+124 -26
View File
@@ -48,6 +48,11 @@
und ein vertippter oder boeswilliger Eintrag koennte faerben, was und ein vertippter oder boeswilliger Eintrag koennte faerben, was
er will. So kommt nur durch, was in der Tabelle steht. */ er will. So kommt nur durch, was in der Tabelle steht. */
const KACHEL_FARBE = Object.create(null); const KACHEL_FARBE = Object.create(null);
/* WELCHE SCHRIFT AUF WELCHER KACHEL -- vom Server gerechnet
(schriftFuer in workspace-chat.js). Hier wird sie nur
nachgeschlagen: Eine zweite Rechnung im Browser waere die
Fassung, die beim naechsten Ton aelter ist als die andere. */
const KACHEL_SCHRIFT = Object.create(null);
let kachelListe = []; let kachelListe = [];
let meineKachel = null; let meineKachel = null;
let autoKachel = null; let autoKachel = null;
@@ -64,7 +69,10 @@
Zwei Rechnungen fuer dieselbe Farbe waeren zwei Stellen, an Zwei Rechnungen fuer dieselbe Farbe waeren zwei Stellen, an
denen sie stimmen muss. */ denen sie stimmen muss. */
autoKachel = d.automatisch || null; autoKachel = d.automatisch || null;
for (const k of kachelListe) KACHEL_FARBE[k.wert] = k.farbe; for (const k of kachelListe) {
KACHEL_FARBE[k.wert] = k.farbe;
if (k.schrift) KACHEL_SCHRIFT[k.wert] = k.schrift;
}
kachelKnopfZeigen(); kachelKnopfZeigen();
} catch { /* ohne die Liste bleibt alles beim Standard -- kein Grund } catch { /* ohne die Liste bleibt alles beim Standard -- kein Grund
zu scheitern, der Chat funktioniert weiter */ } zu scheitern, der Chat funktioniert weiter */ }
@@ -107,7 +115,13 @@
/* EINE VORSCHAU MIT ECHTEM TEXT, nicht nur ein Farbfleck: Gewaehlt /* EINE VORSCHAU MIT ECHTEM TEXT, nicht nur ein Farbfleck: Gewaehlt
wird ja nicht die Farbe, sondern wie die eigene Nachricht wird ja nicht die Farbe, sondern wie die eigene Nachricht
aussieht. */ aussieht. */
b.append(el('span', 'chat-kachelwahl__wort', 'Aa')); /* DAS „Aa" TRAEGT DIE SCHRIFT DIESER KACHEL (22.09.2026).
Sonst stuende in der Auswahl ein helles Aa auf Babyblau --
also genau das Bild, das es zu vermeiden gilt, und zwar an der
Stelle, an der man sich entscheidet. */
const wort = el('span', 'chat-kachelwahl__wort', 'Aa');
if (k.schrift) wort.style.color = k.schrift.text;
b.append(wort);
b.addEventListener('click', () => kachelSetzen(k.wert, b)); b.addEventListener('click', () => kachelSetzen(k.wert, b));
gitter.append(b); gitter.append(b);
} }
@@ -144,11 +158,30 @@
* OHNE NEU ZU LADEN: Der Verlauf neu zu holen hiesse, beim Faerben * OHNE NEU ZU LADEN: Der Verlauf neu zu holen hiesse, beim Faerben
* nach unten zu springen und die Stelle zu verlieren, an der man * nach unten zu springen und die Stelle zu verlieren, an der man
* gerade liest. Die Farbe steht ohnehin nur an der Kachel. */ * gerade liest. Die Farbe steht ohnehin nur an der Kachel. */
/** Flaeche UND Schrift in einem Griff.
*
* ZUSAMMEN UND NICHT NACHEINANDER (22.09.2026): Wer die Farbe an
* einer Stelle setzt und die Schrift an einer anderen, hat
* irgendwann eine helle Kachel mit heller Schrift -- und merkt es
* erst, wenn jemand nichts mehr lesen kann. Es gibt deshalb genau
* diesen einen Weg, eine Blase einzufaerben. */
function blaseFaerben(blase, wert) {
const farbe = KACHEL_FARBE[wert] || null;
const schrift = KACHEL_SCHRIFT[wert] || null;
if (farbe) blase.style.setProperty('--kachel', farbe);
else blase.style.removeProperty('--kachel');
if (schrift) {
blase.style.setProperty('--blase-text', schrift.text);
blase.style.setProperty('--blase-leise', schrift.leise);
} else {
blase.style.removeProperty('--blase-text');
blase.style.removeProperty('--blase-leise');
}
}
function eigeneKachelnFaerben() { function eigeneKachelnFaerben() {
const farbe = KACHEL_FARBE[meineKachel] || null;
for (const z of document.querySelectorAll('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase')) { for (const z of document.querySelectorAll('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase')) {
if (farbe) z.style.setProperty('--kachel', farbe); blaseFaerben(z, meineKachel);
else z.style.removeProperty('--kachel');
} }
} }
@@ -185,6 +218,7 @@
ueber den Aufbau des Hauses an alle. Ein Ja/Nein ist keine. */ ueber den Aufbau des Hauses an alle. Ein Ja/Nein ist keine. */
let angeheftet = []; let angeheftet = [];
let darfAnheftenHier = false; let darfAnheftenHier = false;
let darfAllesLoeschen = false;
let darfKanal = false; let darfKanal = false;
/* Was der Server ueber die Nachtruhe sagt. `null` heisst: Diese /* Was der Server ueber die Nachtruhe sagt. `null` heisst: Diese
Person hat mit dem Treff nichts zu tun -- dann gibt es auch Person hat mit dem Treff nichts zu tun -- dann gibt es auch
@@ -603,8 +637,15 @@
die einzige Stelle ohne Absender in der Vorschau gewesen. */ die einzige Stelle ohne Absender in der Vorschau gewesen. */
const wer = r.letzte.von === ich.name ? 'Du: ' const wer = r.letzte.von === ich.name ? 'Du: '
: (r.art !== 'direkt' ? `${r.letzte.von}: ` : ''); : (r.art !== 'direkt' ? `${r.letzte.von}: ` : '');
/* KEIN „Nachricht zurueckgenommen" MEHR (22.09.2026). Hier
stand genau dieser Satz -- und die Gespraechsliste ist die
auffaelligste Stelle der ganzen Seite. Geloescht heisst
geloescht: Der Server liefert eine geloeschte Nachricht gar
nicht mehr als letzte, weil es die Zeile nicht mehr gibt.
Sollte doch einmal eine alte, zurueckgenommene durchkommen,
steht hier lieber nichts als ein Hinweis auf sie. */
vorschau.textContent = r.letzte.zurueckgenommen vorschau.textContent = r.letzte.zurueckgenommen
? `${wer}Nachricht zurückgenommen` ? 'Noch nichts geschrieben'
: wer + r.letzte.text; : wer + r.letzte.text;
if (r.letzte.zurueckgenommen) vorschau.dataset.weg = 'ja'; if (r.letzte.zurueckgenommen) vorschau.dataset.weg = 'ja';
} else { } else {
@@ -729,6 +770,7 @@
nachrichten = daten.nachrichten; nachrichten = daten.nachrichten;
angeheftet = daten.angeheftet || []; angeheftet = daten.angeheftet || [];
darfAnheftenHier = !!daten.darf_anheften; darfAnheftenHier = !!daten.darf_anheften;
darfAllesLoeschen = !!daten.darf_alles_loeschen;
/* DER STAND VON VORHIN, nicht der von jetzt. `gelesenMelden()` /* DER STAND VON VORHIN, nicht der von jetzt. `gelesenMelden()`
weiter unten setzt ihn gleich auf die letzte Nachricht -- die weiter unten setzt ihn gleich auf die letzte Nachricht -- die
Linie muss also aus dem Wert gezogen werden, der beim OEFFNEN Linie muss also aus dem Wert gezogen werden, der beim OEFFNEN
@@ -1242,8 +1284,7 @@
der Rueckfall liegt im Stilblatt (`var(--kachel, …)`). Eine der Rueckfall liegt im Stilblatt (`var(--kachel, …)`). Eine
Zeile, die die Standardfarbe noch einmal hinschreibt, waere Zeile, die die Standardfarbe noch einmal hinschreibt, waere
eine zweite Stelle, an der sie stimmen muss. */ eine zweite Stelle, an der sie stimmen muss. */
const kFarbe = KACHEL_FARBE[n.von_kachel]; blaseFaerben(blase, n.von_kachel);
if (kFarbe) blase.style.setProperty('--kachel', kFarbe);
if (!gleicheFolge && !n.selbst && offen.art !== 'direkt') { if (!gleicheFolge && !n.selbst && offen.art !== 'direkt') {
/* DER NAME TRAEGT SEINE ROLLE MIT (22.09.2026). /* DER NAME TRAEGT SEINE ROLLE MIT (22.09.2026).
Filipe: „die namen so dass man sie gut erkennt." Filipe: „die namen so dass man sie gut erkennt."
@@ -1259,13 +1300,18 @@
/* DAS ZITAT STEHT IN DER BLASE, NICHT DARUEBER. So wandert es beim /* DAS ZITAT STEHT IN DER BLASE, NICHT DARUEBER. So wandert es beim
Rollen mit und gehoert sichtbar zur Antwort -- eine Zeile Rollen mit und gehoert sichtbar zur Antwort -- eine Zeile
darueber liest sich als eigene Nachricht. */ darueber liest sich als eigene Nachricht. */
if (n.antwort) { /* EIN ZITAT AUF ETWAS, DAS ES NICHT MEHR GIBT, WIRD WEGGELASSEN
(22.09.2026). Vorher stand darin „Nachricht zurueckgenommen"
-- und damit die Spur an der einen Stelle, an der sie am
meisten auffaellt: mitten in einer fremden Nachricht. Der
Server liefert `antwort` gar nicht mehr, wenn die zitierte
Zeile geloescht wurde; diese Bedingung faengt den Rest. */
if (n.antwort && !n.antwort.zurueckgenommen) {
const z = el('button', 'chat-zitat'); const z = el('button', 'chat-zitat');
z.type = 'button'; z.type = 'button';
z.append(el('span', 'chat-zitat__von', n.antwort.von)); z.append(el('span', 'chat-zitat__von', n.antwort.von));
z.append(el('span', 'chat-zitat__text', n.antwort.zurueckgenommen z.append(el('span', 'chat-zitat__text',
? 'Nachricht zurückgenommen' window.Textform ? window.Textform.nurText(n.antwort.text) : n.antwort.text));
: (window.Textform ? window.Textform.nurText(n.antwort.text) : n.antwort.text)));
z.title = 'Zur zitierten Nachricht springen'; z.title = 'Zur zitierten Nachricht springen';
/* Ein Zitat, das nicht zur Stelle fuehrt, ist ein Bild von /* Ein Zitat, das nicht zur Stelle fuehrt, ist ein Bild von
einer Nachricht. Der Klick springt hin und hebt sie kurz einer Nachricht. Der Klick springt hin und hebt sie kurz
@@ -1274,9 +1320,19 @@
blase.append(z); blase.append(z);
} }
/* HIER STAND „Nachricht zurückgenommen" (bis 22.09.2026).
Filipe: „Gelöschte Nachrichten verschwinden vollständig –
keine Spur, kein ‚wurde gelöscht'-Hinweis, bei niemandem,
auch nicht bei DogFather."
Eine gelöschte Nachricht kommt gar nicht mehr hier an -- die
Zeile gibt es nicht mehr. Der Zweig bleibt trotzdem stehen,
aber ohne Text: Sollte aus einer alten Fassung noch eine
zurückgenommene Zeile durchkommen, zeigt die Blase nichts
statt eines Hinweises darauf, dass hier etwas stand. */
if (n.zurueckgenommen) { if (n.zurueckgenommen) {
blase.append(el('p', 'chat-nachricht__text chat-nachricht__weg', zeile.hidden = true;
'Nachricht zurückgenommen'));
} else { } else {
/* DER ANHANG STEHT ÜBER DEM TEXT. Ein Begleitsatz gehört unter /* DER ANHANG STEHT ÜBER DEM TEXT. Ein Begleitsatz gehört unter
das Bild, nicht darüber -- man sieht zuerst, worum es geht. */ das Bild, nicht darüber -- man sieht zuerst, worum es geht. */
@@ -1321,10 +1377,29 @@
reag.addEventListener('click', () => auswahlZeigen(reag, n.id)); reag.addEventListener('click', () => auswahlZeigen(reag, n.id));
fuss.append(reag); fuss.append(reag);
} }
if (n.selbst && !n.zurueckgenommen) { /* LÖSCHEN HEISST LÖSCHEN (22.09.2026).
const weg = el('button', 'chat-nachricht__weg-knopf', 'zurücknehmen');
Filipe: „Löschen darf weiterhin jeder nur seine eigenen –
außer DogFather und rechte Hand: die dürfen jede Nachricht
löschen, für den Notfall."
Der Knopf heisst deshalb auch „löschen" und nicht mehr
„zurücknehmen". Zurücknehmen klingt nach „ich nehme mein Wort
zurück" -- es passte, solange ein Hinweis stehen blieb. Jetzt
ist es weg, und das Wort soll das sagen.
AN FREMDEN NACHRICHTEN STEHT ES ANDERS DA: „löschen (Notfall)".
Wer fremde Worte entfernt, soll im selben Moment sehen, dass
das kein gewöhnlicher Handgriff ist. Die Schranke steht
ohnehin im Server; hier geht es darum, sie nicht aus Versehen
zu benutzen. */
if (n.id > 0 && (n.selbst || darfAllesLoeschen)) {
const fremd = !n.selbst;
const weg = el('button', 'chat-nachricht__weg-knopf',
fremd ? 'löschen (Notfall)' : 'löschen');
weg.type = 'button'; weg.type = 'button';
weg.addEventListener('click', () => zuruecknehmen(n.id)); if (fremd) weg.dataset.notfall = 'ja';
weg.addEventListener('click', () => zuruecknehmen(n.id, fremd));
fuss.append(weg); fuss.append(weg);
} }
/* ANHEFTEN steht an derselben Stelle wie "antworten" -- dieselbe /* ANHEFTEN steht an derselben Stelle wie "antworten" -- dieselbe
@@ -1987,18 +2062,27 @@
+ `mit „Nochmal senden" kannst du es gleich wiederholen.`); + `mit „Nochmal senden" kannst du es gleich wiederholen.`);
} }
async function zuruecknehmen(id) { async function zuruecknehmen(id, fremd = false) {
if (!await frageNach({ if (!await frageNach({
titel: 'Nachricht zurücknehmen?', titel: fremd ? 'Diese Nachricht löschen?' : 'Nachricht löschen?',
was: 'Der Text ist danach weg – auch bei allen anderen.', was: fremd
bleibt: 'Im Verlauf bleibt ein Hinweis stehen, dass hier etwas stand.', ? 'Sie ist danach bei allen weg – auch bei dem, der sie geschrieben hat.'
endgueltig: true, ja: 'Zurücknehmen', : 'Sie ist danach bei allen weg.',
/* KEIN „ein Hinweis bleibt stehen" MEHR -- es bleibt keiner.
Ein Rückfragetext, der etwas anderes verspricht als das, was
passiert, ist schlimmer als keiner: Man entscheidet auf
falscher Grundlage. */
bleibt: fremd
? 'Dass DU sie gelöscht hast, steht im Protokoll – der Text nirgends.'
: 'Es bleibt keine Spur im Verlauf.',
endgueltig: true, ja: 'Löschen',
})) return; })) return;
try { try {
const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' });
if (!a.ok) { melde('Ging nicht.'); return; } if (!a.ok) { melde('Ging nicht.'); return; }
const i = nachrichten.findIndex((n) => n.id === id); const i = nachrichten.findIndex((n) => n.id === id);
if (i >= 0) { nachrichten[i].zurueckgenommen = true; nachrichten[i].text = null; } if (i >= 0) nachrichten.splice(i, 1);
for (const x of nachrichten) if (x.antwort?.id === id) x.antwort = null;
verlaufZeichnen(); verlaufZeichnen();
raeumeLaden(); raeumeLaden();
} catch { /* umgeleitet */ } } catch { /* umgeleitet */ }
@@ -2176,10 +2260,24 @@
strom.addEventListener('weg', (e) => { strom.addEventListener('weg', (e) => {
let n; let n;
try { n = JSON.parse(e.data); } catch { return; } try { n = JSON.parse(e.data); } catch { return; }
/* SIE VERSCHWINDET, sie wird nicht durchgestrichen (22.09.2026).
Filipe: „Gelöschte Nachrichten verschwinden vollständig –
keine Spur, kein ‚wurde gelöscht'-Hinweis, bei niemandem,
auch nicht bei DogFather."
Hier stand `zurueckgenommen = true` -- die Zeile blieb und
trug den Hinweis. Ein Hinweis „hier stand etwas" markiert die
Stelle; wer etwas aus Versehen schreibt, will es weg haben
und nicht unterstrichen. */
const i = nachrichten.findIndex((x) => x.id === n.id); const i = nachrichten.findIndex((x) => x.id === n.id);
if (i >= 0) { if (i >= 0) {
nachrichten[i].zurueckgenommen = true; nachrichten.splice(i, 1);
nachrichten[i].text = null; /* Auch ein Zitat darauf: Die zitierte Nachricht gibt es nicht
mehr, also gibt es auch nichts zu zeigen. Der Server liefert
beim nächsten Laden ohnehin nichts; hier passt sich nur das
Bild sofort an. */
for (const x of nachrichten) if (x.antwort?.id === n.id) x.antwort = null;
verlaufZeichnen(); verlaufZeichnen();
} }
raeumeLaden(); raeumeLaden();
@@ -2598,7 +2696,7 @@
Satz eines setzen will, soll nicht erst umsortieren. */ Satz eines setzen will, soll nicht erst umsortieren. */
const EMOJIS = ['😀','😂','🥹','😍','😎','🤔','😅','🙃','😴','🤝', const EMOJIS = ['😀','😂','🥹','😍','😎','🤔','😅','🙃','😴','🤝',
'👍','👏','🙌','💪','🙏','🔥','✨','⭐','💯','🎉', '👍','👏','🙌','💪','🙏','🔥','✨','⭐','💯','🎉',
'❤️','💙','💚','🖤','👀','🎮','🎧','📈','⏰','✅']; '❤️','🩵','💚','🖤','👀','🎮','🎧','📈','⏰','✅'];
function emojiTafelBauen() { function emojiTafelBauen() {
const tafel = $('emoji-tafel'); const tafel = $('emoji-tafel');
if (!tafel || tafel.childElementCount) return; if (!tafel || tafel.childElementCount) return;
+18 -18
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -367,17 +367,17 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach <!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne `window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. --> Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609222018"></script> <script src="assets/js/textform.js?v=202609222333"></script>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/zuteilung.js?v=202609222018" defer></script> <script src="assets/js/zuteilung.js?v=202609222333" defer></script>
<script src="assets/js/aufgaben.js?v=202609222018" defer></script> <script src="assets/js/aufgaben.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/automation.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -168,15 +168,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/automation.js?v=202609222018" defer></script> <script src="assets/js/automation.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -180,15 +180,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/befinden.js?v=202609222018" defer></script> <script src="assets/js/befinden.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+22 -22
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett <!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite „Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. --> Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -304,19 +304,19 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach <!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne `window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. --> Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609222018"></script> <script src="assets/js/textform.js?v=202609222333"></script>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/checkliste.js?v=202609222018" defer></script> <script src="assets/js/checkliste.js?v=202609222333" defer></script>
<script src="assets/js/ampel.js?v=202609222018" defer></script> <script src="assets/js/ampel.js?v=202609222333" defer></script>
<script src="assets/js/schulung.js?v=202609222018" defer></script> <script src="assets/js/schulung.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/bereich.js?v=202609222018" defer></script> <script src="assets/js/bereich.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. --> <!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -108,14 +108,14 @@
</main> </main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. --> <!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/auskunft.js?v=202609222018" defer></script> <script src="assets/js/auskunft.js?v=202609222333" defer></script>
<script src="assets/js/bewerben.js?v=202609222018" defer></script> <script src="assets/js/bewerben.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. --> <!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -80,15 +80,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/auskunft.js?v=202609222018" defer></script> <script src="assets/js/auskunft.js?v=202609222333" defer></script>
<script src="assets/js/bewerbungen.js?v=202609222018" defer></script> <script src="assets/js/bewerbungen.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/calls.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -89,15 +89,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/ki.js?v=202609222018" defer></script> <script src="assets/js/ki.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/calls.js?v=202609222018" defer></script> <script src="assets/js/calls.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+19 -19
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog, <!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem .neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html. zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. --> Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/chat.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -415,25 +415,25 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/bereiche.js?v=202609222018"></script> <script src="assets/js/bereiche.js?v=202609222333"></script>
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js <!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter, fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
wirklich vor den anderen dasteht. --> wirklich vor den anderen dasteht. -->
<script src="assets/js/textform.js?v=202609222018"></script> <script src="assets/js/textform.js?v=202609222333"></script>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018"></script> <script src="assets/js/kopf.js?v=202609222333"></script>
<script src="assets/js/glocke.js?v=202609222018"></script> <script src="assets/js/glocke.js?v=202609222333"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten` <!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt. bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit -- Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. --> die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609222018"></script> <script src="assets/js/anruf.js?v=202609222333"></script>
<script src="assets/js/chat.js?v=202609222018"></script> <script src="assets/js/chat.js?v=202609222333"></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/content.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/content.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -179,15 +179,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/checkliste.js?v=202609222018" defer></script> <script src="assets/js/checkliste.js?v=202609222333" defer></script>
<script src="assets/js/content.js?v=202609222018" defer></script> <script src="assets/js/content.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp" <link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" /> type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst <!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen 404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es: statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. --> die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/crew-haus.css?v=202609222333" />
</head> </head>
<body class="gate gate--crew"> <body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609222018" defer></script> <script src="assets/js/gate.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -23,25 +23,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/crew-192.png?v=202609222018", "src": "/assets/img/app-symbole/crew-192.png?v=202609222333",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512.png?v=202609222018", "src": "/assets/img/app-symbole/crew-512.png?v=202609222333",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609222018", "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609222333",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609222018", "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609222333",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/dateien.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -108,15 +108,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/dateien.js?v=202609222018" defer></script> <script src="assets/js/dateien.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -241,15 +241,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/entwicklung.js?v=202609222018" defer></script> <script src="assets/js/entwicklung.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/hilfe.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -146,13 +146,13 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/hilfe.js?v=202609222018" defer></script> <script src="assets/js/hilfe.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+5 -5
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp" <link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" /> type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
</head> </head>
<body class="gate"> <body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609222018" defer></script> <script src="assets/js/gate.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/kalender.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -383,15 +383,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/kalender.js?v=202609222018" defer></script> <script src="assets/js/kalender.js?v=202609222333" defer></script>
<script src="assets/js/kalender-abo.js?v=202609222018" defer></script> <script src="assets/js/kalender-abo.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/leistung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -444,13 +444,13 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/meldung.js?v=202609222018"></script> <script src="assets/js/meldung.js?v=202609222333"></script>
<script src="assets/js/nachfrage.js?v=202609222018"></script> <script src="assets/js/nachfrage.js?v=202609222333"></script>
<script src="assets/js/wahl.js?v=202609222018"></script> <script src="assets/js/wahl.js?v=202609222333"></script>
<script src="assets/js/bereiche.js?v=202609222018"></script> <script src="assets/js/bereiche.js?v=202609222333"></script>
<script src="assets/js/kopf.js?v=202609222018"></script> <script src="assets/js/kopf.js?v=202609222333"></script>
<script src="assets/js/glocke.js?v=202609222018"></script> <script src="assets/js/glocke.js?v=202609222333"></script>
<script src="assets/js/leistung.js?v=202609222018"></script> <script src="assets/js/leistung.js?v=202609222333"></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,13 +12,13 @@
vergessen wird. --> vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/material.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/material.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start" data-ton="42" data-buehne="studio"> <body class="start" data-ton="42" data-buehne="studio">
@@ -138,14 +138,14 @@
<p class="m-laedt" id="laedt">Einen Moment …</p> <p class="m-laedt" id="laedt">Einen Moment …</p>
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/material.js?v=202609222018" defer></script> <script src="assets/js/material.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/personen.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -453,14 +453,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/personen.js?v=202609222018" defer></script> <script src="assets/js/personen.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -214,16 +214,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/steckbrief.js?v=202609222018" defer></script> <script src="assets/js/steckbrief.js?v=202609222333" defer></script>
<script src="assets/js/profil.js?v=202609222018" defer></script> <script src="assets/js/profil.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -134,13 +134,13 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. --> die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/rechte.js?v=202609222018" defer></script> <script src="assets/js/rechte.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/report.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/report.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -106,17 +106,17 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/ki.js?v=202609222018" defer></script> <script src="assets/js/ki.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/report.js?v=202609222018" defer></script> <script src="assets/js/report.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/scouting.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -173,14 +173,14 @@
</div> </div>
</div> </div>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/scouting.js?v=202609222018" defer></script> <script src="assets/js/scouting.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe <!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. --> den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/heim.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -684,16 +684,16 @@
</p> </p>
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/live.js?v=202609222018" defer></script> <script src="assets/js/live.js?v=202609222333" defer></script>
<script src="assets/js/start.js?v=202609222018" defer></script> <script src="assets/js/start.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/startcheck.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -85,16 +85,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/ki.js?v=202609222018" defer></script> <script src="assets/js/ki.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/startcheck.js?v=202609222018" defer></script> <script src="assets/js/startcheck.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -150,16 +150,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/auskunft.js?v=202609222018" defer></script> <script src="assets/js/auskunft.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/steckbrief.js?v=202609222018" defer></script> <script src="assets/js/steckbrief.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie <!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. --> anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -111,14 +111,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/talente.js?v=202609222018" defer></script> <script src="assets/js/talente.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/team.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/team.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -110,15 +110,15 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/team.js?v=202609222018" defer></script> <script src="assets/js/team.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/team.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/team.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu <!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,14 +84,14 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. --> ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/holen.js?v=202609222018" defer></script> <script src="assets/js/holen.js?v=202609222333" defer></script>
<script src="assets/js/teamlage.js?v=202609222018" defer></script> <script src="assets/js/teamlage.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -112,14 +112,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/teilen.js?v=202609222018" defer></script> <script src="assets/js/teilen.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -126,13 +126,13 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/treff-moderation.js?v=202609222018" defer></script> <script src="assets/js/treff-moderation.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des <!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. --> Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -221,13 +221,13 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen, Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. --> die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/auskunft.js?v=202609222018" defer></script> <script src="assets/js/auskunft.js?v=202609222333" defer></script>
<script src="assets/js/treff-regeln.js?v=202609222018" defer></script> <script src="assets/js/treff-regeln.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+16 -16
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der <!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". --> Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/uebersicht.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -149,16 +149,16 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/uebersicht.js?v=202609222018" defer></script> <script src="assets/js/uebersicht.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -335,13 +335,13 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/live.js?v=202609222018" defer></script> <script src="assets/js/live.js?v=202609222333" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609222018" defer></script> <script src="assets/js/unsere-seiten.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/werdegang.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -144,13 +144,13 @@
</main> </main>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/werdegang.js?v=202609222018" defer></script> <script src="assets/js/werdegang.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+15 -15
View File
@@ -12,13 +12,13 @@
vergessen wird. --> vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/willkommen.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026). <!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`, `body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
@@ -75,13 +75,13 @@
<p class="fehler" id="fehler" hidden></p> <p class="fehler" id="fehler" hidden></p>
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/willkommen.js?v=202609222018" defer></script> <script src="assets/js/willkommen.js?v=202609222333" defer></script>
</body> </body>
</html> </html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222333" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/wissen.css?v=202609222333" />
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026). <!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an -- kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. --> ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
</head> </head>
<body class="start"> <body class="start">
@@ -190,15 +190,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609222018" defer></script> <script src="assets/js/meldung.js?v=202609222333" defer></script>
<script src="assets/js/hochladen.js?v=202609222018" defer></script> <script src="assets/js/hochladen.js?v=202609222333" defer></script>
<script src="assets/js/nachfrage.js?v=202609222018" defer></script> <script src="assets/js/nachfrage.js?v=202609222333" defer></script>
<script src="assets/js/wahl.js?v=202609222018" defer></script> <script src="assets/js/wahl.js?v=202609222333" defer></script>
<script src="assets/js/bereiche.js?v=202609222018" defer></script> <script src="assets/js/bereiche.js?v=202609222333" defer></script>
<script src="assets/js/installieren.js?v=202609222018" defer></script> <script src="assets/js/installieren.js?v=202609222333" defer></script>
<script src="assets/js/kopf.js?v=202609222018" defer></script> <script src="assets/js/kopf.js?v=202609222333" defer></script>
<script src="assets/js/glocke.js?v=202609222018" defer></script> <script src="assets/js/glocke.js?v=202609222333" defer></script>
<script src="assets/js/wissen.js?v=202609222018" defer></script> <script src="assets/js/wissen.js?v=202609222333" defer></script>
</body> </body>
</html> </html>