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:
@@ -542,15 +542,26 @@ console.log("=== Reaktionen ===");
|
||||
`ein erfundenes Zeichen wird abgewiesen (HTTP ${unsinn.status})`);
|
||||
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,
|
||||
`/workspace/api/chat/raeume/${g.raum_id}/nachrichten`, { text: "Weg gleich" }, "POST")).json();
|
||||
await rufe(eins.keks, `/workspace/api/chat/nachrichten/${weg.nachricht.id}`,
|
||||
undefined, "DELETE");
|
||||
const drauf = await rufe(zwei.keks,
|
||||
`/workspace/api/chat/nachrichten/${weg.nachricht.id}/reaktion`, { zeichen: daumen }, "PUT");
|
||||
ok(drauf.status === 409,
|
||||
`auf eine zurueckgenommene Nachricht geht es nicht (HTTP ${drauf.status})`);
|
||||
ok(drauf.status === 404,
|
||||
`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 ----------------------------- */
|
||||
const verlauf = await holen(zwei.keks,
|
||||
|
||||
@@ -212,16 +212,25 @@ melde("\n=== 2. Kopieren ===");
|
||||
".chat-nachricht:first-of-type .chat-nachricht__kopie-knopf", (b) => b.textContent);
|
||||
ok(zurueck === "kopieren", `und fällt danach zurück ("${zurueck}")`);
|
||||
|
||||
/* GEGENPROBE: An einer zurückgenommenen Nachricht gibt es nichts zu
|
||||
kopieren -- dort darf der Knopf nicht stehen. */
|
||||
/* GEGENPROBE, NEU GEFASST (22.09.2026 abends).
|
||||
------------------------------------------------------------------
|
||||
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(
|
||||
".chat-nachricht:last-of-type .chat-nachricht__weg-knopf"));
|
||||
await luna.seite.waitForTimeout(900);
|
||||
const anWeg = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"] .chat-nachricht__kopie-knopf',
|
||||
(b) => b.length);
|
||||
const wegDa = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"]', (b) => b.length);
|
||||
ok(wegDa === 1 && anWeg === 0,
|
||||
`an der zurückgenommenen Nachricht steht kein Kopier-Knopf (${wegDa} weg, ${anWeg} Knöpfe)`);
|
||||
const nachLoeschen = await luna.seite.$$eval('.chat-nachricht', (b) => b.length);
|
||||
const restWeg = await luna.seite.$$eval('.chat-nachricht[data-weg="ja"]', (b) => b.length);
|
||||
ok(vorLoeschen > 0 && nachLoeschen === vorLoeschen - 1 && restWeg === 0,
|
||||
`die geloeschte ist aus dem Bild (${vorLoeschen} -> ${nachLoeschen}),`
|
||||
+ ` und es bleibt keine Spur (${restWeg})`);
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
|
||||
@@ -285,18 +285,32 @@ melde("\n=== Zurücknehmen ===");
|
||||
".chat-nachricht[data-selbst='ja']:last-of-type .chat-nachricht__weg-knopf"));
|
||||
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;
|
||||
ok(nachher === vorher,
|
||||
`die Zeile bleibt stehen (${nachher} statt ${vorher}) — kein Loch im Verlauf`);
|
||||
ok(vorher > 0 && nachher === vorher - 1,
|
||||
`die Zeile ist weg (${vorher} -> ${nachher}) — und nur sie`);
|
||||
|
||||
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(
|
||||
() => !![...document.querySelectorAll(".chat-nachricht__weg")].length,
|
||||
{ timeout: 8000 }).then(() => true).catch(() => false);
|
||||
ok(beiPat, "auch bei Patrick ist der Text weg, ohne Neuladen");
|
||||
(wieViele) => document.querySelectorAll(".chat-nachricht").length === wieViele,
|
||||
vorher - 1, { timeout: 8000 }).then(() => true).catch(() => false);
|
||||
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();
|
||||
});
|
||||
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})`);
|
||||
|
||||
/* Und ein Text, der nie geschrieben wurde, darf NICHT gefunden
|
||||
|
||||
+18
-3
@@ -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");
|
||||
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 weg = verlauf.nachrichten.find((n) => n.id === nachricht.id);
|
||||
ok(weg && weg.zurueckgenommen && weg.text === null,
|
||||
`sie steht weiterhin im Verlauf, als zurückgenommen und ohne Text`);
|
||||
ok(!weg && verlauf.nachrichten.length > 0,
|
||||
`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"),
|
||||
"der Text ist wirklich weg, nicht nur ausgeblendet");
|
||||
}
|
||||
|
||||
+65
-17
@@ -53,7 +53,7 @@ const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t);
|
||||
console.log("\n=== Chat: Bild dahinter, Kachel davor ===\n");
|
||||
|
||||
/* ---- 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})`);
|
||||
|
||||
/* 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-leise", ".chat-nachricht__fuss", 4.5],
|
||||
];
|
||||
for (const [name, wo, noetig] of BLASEN_SCHRIFT) {
|
||||
const farbe = ausCss(name);
|
||||
if (!farbe) {
|
||||
ok(false, `KONNTE NICHT NACHSEHEN: --${name} steht nicht in chat.css`
|
||||
+ " — ohne sie lässt sich der Kontrast der Kacheln nicht prüfen");
|
||||
continue;
|
||||
}
|
||||
let schlecht = Infinity, wer = "";
|
||||
/* JEDE KACHEL MIT IHRER EIGENEN SCHRIFT (22.09.2026 abends).
|
||||
---------------------------------------------------------------------
|
||||
Hier stand eine feste Schriftfarbe aus chat.css, gegen ALLE Töne
|
||||
gemessen. Das galt, solange alle Töne dunkel waren.
|
||||
|
||||
Filipe: „Textfarbe soll mitwechseln, am besten schwarz auf hellen
|
||||
Kacheln – und weiß, wenn jemand eine schwarze Kachel wählt."
|
||||
|
||||
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) {
|
||||
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; }
|
||||
}
|
||||
/* 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
|
||||
einzigen Ton angesehen zu haben. */
|
||||
ok(CHAT_KACHELN.length >= 8 && schlecht >= noetig,
|
||||
`${wo} trägt auf allen ${CHAT_KACHELN.length} Tönen `
|
||||
ok(gemessen === CHAT_KACHELN.length && gemessen >= 8 && schlecht >= noetig,
|
||||
`${wo} trägt auf allen ${gemessen} Tönen `
|
||||
+ `(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.
|
||||
Ein absichtlich zu heller Ton MUSS durchfallen — sonst wäre das
|
||||
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
|
||||
ganze Bildpunkte. Ein Faktor über 1,1 hieße: jemand hat eine Farbe
|
||||
von Hand eingetragen und damit die Rechnung umgangen. */
|
||||
const spanne = Math.max(...CHAT_KACHELN.map((k) => helligkeit(k.farbe)))
|
||||
/ Math.max(1e-6, Math.min(...CHAT_KACHELN.map((k) => helligkeit(k.farbe))));
|
||||
ok(spanne < 1.1,
|
||||
`alle Töne liegen auf derselben Leuchtdichte (Faktor ${spanne.toFixed(3)}) `
|
||||
+ "— keiner ist heller oder dunkler als die anderen");
|
||||
/* SIE GILT FÜR DIE GERECHNETEN -- und nur für die (22.09.2026 abends).
|
||||
|
||||
Der Zweck dieser Zeile ist: „Niemand kann sich durch seine Wahl
|
||||
schlechter lesbar machen als die anderen." Solange alle Töne
|
||||
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
|
||||
drinstand: Buntheit 0,002 bis 0,048, im Mittel 0,028 — zwölf
|
||||
|
||||
@@ -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
@@ -235,6 +235,30 @@ function bildWegFuer(personId) {
|
||||
===================================================================== */
|
||||
export const CHAT_KACHELN = [
|
||||
{ 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: "veilchen", name: "Veilchen", farbe: "#6a01e5" },
|
||||
{ wert: "pflaume", name: "Pflaume", farbe: "#9301a2" },
|
||||
@@ -248,6 +272,71 @@ export const CHAT_KACHELN = [
|
||||
{ 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.
|
||||
*
|
||||
* 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) => {
|
||||
try {
|
||||
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
|
||||
Waehler ein Haken bei einer Farbe, die niemand gewaehlt hat. */
|
||||
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
|
||||
Ja/Nein verraet nichts ueber die Rollen dahinter. */
|
||||
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) => ({
|
||||
id: a.id,
|
||||
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) => {
|
||||
try {
|
||||
const id = Number(req.params.id);
|
||||
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);
|
||||
if (!n || !istDrin(n.raum_id, req.person)) {
|
||||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
}
|
||||
/* NUR EIGENE. DogFather ebenfalls nicht: Fremde Worte aus einem
|
||||
Gespräch zu nehmen, in dem Absprachen stehen, wäre ein Eingriff
|
||||
in die Geschichte -- und niemand könnte ihm nachher glauben. */
|
||||
if (n.person_id !== req.person.id) {
|
||||
const fremd = n.person_id !== req.person.id;
|
||||
if (fremd && !darfJedeNachrichtLoeschen(req.person)) {
|
||||
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;
|
||||
/* UND SIE FAELLT VOM AUSHANG (10.09.2026). Ohne diese zwei
|
||||
Spalten stuende die Nachricht weiter oben angeheftet -- mit dem
|
||||
Text "Nachricht zurueckgenommen", an der auffaelligsten Stelle
|
||||
des Raums. Die Anzeige filtert zwar auf `weg_am IS NULL`, aber
|
||||
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);
|
||||
/* ERST DIE ZEILE, DANN DIE DATEI. Scheitert das Entfernen (Datei
|
||||
schon weg), ist der Verweis trotzdem fort -- andersherum bliebe
|
||||
im schlechten Fall eine Zeile ohne Datei stehen. */
|
||||
d.prepare("DELETE FROM chat_nachrichten WHERE id = ?").run(id);
|
||||
if (dateiWeg) {
|
||||
try { unlinkSync(join(ANHANG_ORDNER, dateiWeg)); }
|
||||
catch (f) { if (f?.code !== "ENOENT") console.error("[chat] Anhang bleibt liegen:", f?.message); }
|
||||
}
|
||||
const empfaenger = teilnehmerVon(n.raum_id).map((t) => t.id);
|
||||
chatEreignis(n.raum_id, { id, raum_id: n.raum_id, zurueckgenommen: true }, [], "weg");
|
||||
/* DER RAUM RECHNET SEINEN LETZTEN ZEITPUNKT NEU. Ohne das stuende
|
||||
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),
|
||||
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) {
|
||||
console.error("[chat] Zurücknehmen:", fehler?.message);
|
||||
console.error("[chat] Löschen:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -62,7 +62,23 @@ export const KATALOG = [
|
||||
["\u{1F9E1}", "herz orange"],
|
||||
["\u{1F49B}", "herz gelb"],
|
||||
["\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{1F5A4}", "herz schwarz"],
|
||||
["\u{1F60D}", "verliebt herzaugen toll"],
|
||||
|
||||
@@ -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
|
||||
besteht. Aus der Recherche: 3-5 Saeulen nach der 70/20/10-Regel
|
||||
(70 % Wert, 20 % Community, 10 % Eigenwerbung); eine Saeule wird
|
||||
|
||||
@@ -16,15 +16,15 @@
|
||||
verdeckt. Gefunden hat es pruef-struktur.
|
||||
|
||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
||||
<link rel="manifest" href="/workspace/crew.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222333" />
|
||||
<style>
|
||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||
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/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/anruf-probe.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609222018",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609222333",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609222018",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609222333",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -444,17 +444,37 @@
|
||||
der Rolle sitzt daneben im Kreis und im Punkt davor, nicht in der
|
||||
Schrift -- eine Rollenfarbe als Schriftfarbe waere bei zwoelf
|
||||
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 {
|
||||
margin: 0 0 4px;
|
||||
display: flex; align-items: center; gap: 6px;
|
||||
font-size: .78rem; font-weight: 800;
|
||||
letter-spacing: .015em;
|
||||
margin: 0 0 7px;
|
||||
padding: 0 0 6px;
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
font-size: .84rem; font-weight: 800;
|
||||
letter-spacing: .02em;
|
||||
color: var(--blase-text);
|
||||
border-bottom: 1px solid color-mix(in srgb, var(--blase-text) 18%, transparent);
|
||||
}
|
||||
.chat-nachricht__von::before {
|
||||
content: ""; flex: none;
|
||||
width: 6px; height: 6px; border-radius: 50%;
|
||||
background: var(--rollenfarbe, rgba(255, 255, 255, .55));
|
||||
width: 3px; height: 14px; border-radius: 2px;
|
||||
background: var(--rollenfarbe, color-mix(in srgb, var(--blase-text) 55%, transparent));
|
||||
}
|
||||
/* Dieselbe Zuordnung wie beim Kreis mit den Anfangsbuchstaben. Sie
|
||||
steht zweimal, weil zwei verschiedene Eigenschaften gesetzt werden
|
||||
|
||||
+124
-26
@@ -48,6 +48,11 @@
|
||||
und ein vertippter oder boeswilliger Eintrag koennte faerben, was
|
||||
er will. So kommt nur durch, was in der Tabelle steht. */
|
||||
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 meineKachel = null;
|
||||
let autoKachel = null;
|
||||
@@ -64,7 +69,10 @@
|
||||
Zwei Rechnungen fuer dieselbe Farbe waeren zwei Stellen, an
|
||||
denen sie stimmen muss. */
|
||||
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();
|
||||
} catch { /* ohne die Liste bleibt alles beim Standard -- kein Grund
|
||||
zu scheitern, der Chat funktioniert weiter */ }
|
||||
@@ -107,7 +115,13 @@
|
||||
/* EINE VORSCHAU MIT ECHTEM TEXT, nicht nur ein Farbfleck: Gewaehlt
|
||||
wird ja nicht die Farbe, sondern wie die eigene Nachricht
|
||||
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));
|
||||
gitter.append(b);
|
||||
}
|
||||
@@ -144,11 +158,30 @@
|
||||
* OHNE NEU ZU LADEN: Der Verlauf neu zu holen hiesse, beim Faerben
|
||||
* nach unten zu springen und die Stelle zu verlieren, an der man
|
||||
* 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() {
|
||||
const farbe = KACHEL_FARBE[meineKachel] || null;
|
||||
for (const z of document.querySelectorAll('.chat-nachricht[data-selbst="ja"] .chat-nachricht__blase')) {
|
||||
if (farbe) z.style.setProperty('--kachel', farbe);
|
||||
else z.style.removeProperty('--kachel');
|
||||
blaseFaerben(z, meineKachel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,6 +218,7 @@
|
||||
ueber den Aufbau des Hauses an alle. Ein Ja/Nein ist keine. */
|
||||
let angeheftet = [];
|
||||
let darfAnheftenHier = false;
|
||||
let darfAllesLoeschen = false;
|
||||
let darfKanal = false;
|
||||
/* Was der Server ueber die Nachtruhe sagt. `null` heisst: Diese
|
||||
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. */
|
||||
const wer = r.letzte.von === ich.name ? 'Du: '
|
||||
: (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
|
||||
? `${wer}Nachricht zurückgenommen`
|
||||
? 'Noch nichts geschrieben'
|
||||
: wer + r.letzte.text;
|
||||
if (r.letzte.zurueckgenommen) vorschau.dataset.weg = 'ja';
|
||||
} else {
|
||||
@@ -729,6 +770,7 @@
|
||||
nachrichten = daten.nachrichten;
|
||||
angeheftet = daten.angeheftet || [];
|
||||
darfAnheftenHier = !!daten.darf_anheften;
|
||||
darfAllesLoeschen = !!daten.darf_alles_loeschen;
|
||||
/* DER STAND VON VORHIN, nicht der von jetzt. `gelesenMelden()`
|
||||
weiter unten setzt ihn gleich auf die letzte Nachricht -- die
|
||||
Linie muss also aus dem Wert gezogen werden, der beim OEFFNEN
|
||||
@@ -1242,8 +1284,7 @@
|
||||
der Rueckfall liegt im Stilblatt (`var(--kachel, …)`). Eine
|
||||
Zeile, die die Standardfarbe noch einmal hinschreibt, waere
|
||||
eine zweite Stelle, an der sie stimmen muss. */
|
||||
const kFarbe = KACHEL_FARBE[n.von_kachel];
|
||||
if (kFarbe) blase.style.setProperty('--kachel', kFarbe);
|
||||
blaseFaerben(blase, n.von_kachel);
|
||||
if (!gleicheFolge && !n.selbst && offen.art !== 'direkt') {
|
||||
/* DER NAME TRAEGT SEINE ROLLE MIT (22.09.2026).
|
||||
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
|
||||
Rollen mit und gehoert sichtbar zur Antwort -- eine Zeile
|
||||
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');
|
||||
z.type = 'button';
|
||||
z.append(el('span', 'chat-zitat__von', n.antwort.von));
|
||||
z.append(el('span', 'chat-zitat__text', n.antwort.zurueckgenommen
|
||||
? 'Nachricht zurückgenommen'
|
||||
: (window.Textform ? window.Textform.nurText(n.antwort.text) : n.antwort.text)));
|
||||
z.append(el('span', 'chat-zitat__text',
|
||||
window.Textform ? window.Textform.nurText(n.antwort.text) : n.antwort.text));
|
||||
z.title = 'Zur zitierten Nachricht springen';
|
||||
/* Ein Zitat, das nicht zur Stelle fuehrt, ist ein Bild von
|
||||
einer Nachricht. Der Klick springt hin und hebt sie kurz
|
||||
@@ -1274,9 +1320,19 @@
|
||||
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) {
|
||||
blase.append(el('p', 'chat-nachricht__text chat-nachricht__weg',
|
||||
'Nachricht zurückgenommen'));
|
||||
zeile.hidden = true;
|
||||
} else {
|
||||
/* DER ANHANG STEHT ÜBER DEM TEXT. Ein Begleitsatz gehört unter
|
||||
das Bild, nicht darüber -- man sieht zuerst, worum es geht. */
|
||||
@@ -1321,10 +1377,29 @@
|
||||
reag.addEventListener('click', () => auswahlZeigen(reag, n.id));
|
||||
fuss.append(reag);
|
||||
}
|
||||
if (n.selbst && !n.zurueckgenommen) {
|
||||
const weg = el('button', 'chat-nachricht__weg-knopf', 'zurücknehmen');
|
||||
/* LÖSCHEN HEISST LÖSCHEN (22.09.2026).
|
||||
|
||||
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.addEventListener('click', () => zuruecknehmen(n.id));
|
||||
if (fremd) weg.dataset.notfall = 'ja';
|
||||
weg.addEventListener('click', () => zuruecknehmen(n.id, fremd));
|
||||
fuss.append(weg);
|
||||
}
|
||||
/* ANHEFTEN steht an derselben Stelle wie "antworten" -- dieselbe
|
||||
@@ -1987,18 +2062,27 @@
|
||||
+ `mit „Nochmal senden" kannst du es gleich wiederholen.`);
|
||||
}
|
||||
|
||||
async function zuruecknehmen(id) {
|
||||
async function zuruecknehmen(id, fremd = false) {
|
||||
if (!await frageNach({
|
||||
titel: 'Nachricht zurücknehmen?',
|
||||
was: 'Der Text ist danach weg – auch bei allen anderen.',
|
||||
bleibt: 'Im Verlauf bleibt ein Hinweis stehen, dass hier etwas stand.',
|
||||
endgueltig: true, ja: 'Zurücknehmen',
|
||||
titel: fremd ? 'Diese Nachricht löschen?' : 'Nachricht löschen?',
|
||||
was: fremd
|
||||
? 'Sie ist danach bei allen weg – auch bei dem, der sie geschrieben hat.'
|
||||
: '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;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
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();
|
||||
raeumeLaden();
|
||||
} catch { /* umgeleitet */ }
|
||||
@@ -2176,10 +2260,24 @@
|
||||
strom.addEventListener('weg', (e) => {
|
||||
let n;
|
||||
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);
|
||||
if (i >= 0) {
|
||||
nachrichten[i].zurueckgenommen = true;
|
||||
nachrichten[i].text = null;
|
||||
nachrichten.splice(i, 1);
|
||||
/* 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();
|
||||
}
|
||||
raeumeLaden();
|
||||
@@ -2598,7 +2696,7 @@
|
||||
Satz eines setzen will, soll nicht erst umsortieren. */
|
||||
const EMOJIS = ['😀','😂','🥹','😍','😎','🤔','😅','🙃','😴','🤝',
|
||||
'👍','👏','🙌','💪','🙏','🔥','✨','⭐','💯','🎉',
|
||||
'❤️','💙','💚','🖤','👀','🎮','🎧','📈','⏰','✅'];
|
||||
'❤️','🩵','💚','🖤','👀','🎮','🎧','📈','⏰','✅'];
|
||||
function emojiTafelBauen() {
|
||||
const tafel = $('emoji-tafel');
|
||||
if (!tafel || tafel.childElementCount) return;
|
||||
|
||||
+18
-18
@@ -12,19 +12,19 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -367,17 +367,17 @@
|
||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609222018"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609222333"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -168,15 +168,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -180,15 +180,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+22
-22
@@ -12,24 +12,24 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
|
||||
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
|
||||
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
|
||||
Stelle, an der dieselbe Sache anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -304,19 +304,19 @@
|
||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609222018"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609222333"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -7,17 +7,17 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- 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>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,14 +108,14 @@
|
||||
</main>
|
||||
|
||||
<!-- 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/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -7,16 +7,16 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- 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>
|
||||
|
||||
<body class="start">
|
||||
@@ -80,15 +80,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -89,15 +89,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+19
-19
@@ -12,26 +12,26 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||||
Dialog zu sehen bekam. -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -415,25 +415,25 @@
|
||||
</form>
|
||||
</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
|
||||
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
||||
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
||||
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
||||
wirklich vor den anderen dasteht. -->
|
||||
<script src="assets/js/textform.js?v=202609222018"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018"></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018"></script>
|
||||
<script src="assets/js/textform.js?v=202609222333"></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333"></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333"></script>
|
||||
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
||||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||||
<script src="assets/js/anruf.js?v=202609222018"></script>
|
||||
<script src="assets/js/chat.js?v=202609222018"></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/anruf.js?v=202609222333"></script>
|
||||
<script src="assets/js/chat.js?v=202609222333"></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -179,15 +179,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/content.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/content.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -36,15 +36,15 @@
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
@@ -459,7 +459,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609222018",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609222333",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609222018",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609222333",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,15 +108,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -241,15 +241,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -146,13 +146,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -383,15 +383,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -444,13 +444,13 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018"></script>
|
||||
<script src="assets/js/wahl.js?v=202609222018"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018"></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018"></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018"></script>
|
||||
<script src="assets/js/leistung.js?v=202609222018"></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222333"></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333"></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333"></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333"></script>
|
||||
<script src="assets/js/leistung.js?v=202609222333"></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,13 +12,13 @@
|
||||
vergessen wird. -->
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
<body class="start" data-ton="42" data-buehne="studio">
|
||||
|
||||
@@ -138,14 +138,14 @@
|
||||
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/material.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/material.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -453,14 +453,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -214,16 +214,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -134,13 +134,13 @@
|
||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||
die seit dem 07.09. jede Seite danach absucht. -->
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -106,17 +106,17 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/report.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/report.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -173,14 +173,14 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,21 +12,21 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
||||
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -684,16 +684,16 @@
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/live.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/start.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/live.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/start.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -85,16 +85,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+18
-18
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -150,16 +150,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -7,18 +7,18 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
|
||||
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
||||
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
||||
anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -111,14 +111,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,20 +7,20 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -110,15 +110,15 @@
|
||||
|
||||
</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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/team.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/team.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -7,20 +7,20 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<!-- `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
|
||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-14
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -112,14 +112,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -126,13 +126,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -7,18 +7,18 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -221,13 +221,13 @@
|
||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||
die seit dem 07.09. jede Seite danach absucht. -->
|
||||
<script src="assets/js/nachfrage.js?v=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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-16
@@ -12,22 +12,22 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -149,16 +149,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" 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/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -335,13 +335,13 @@
|
||||
|
||||
</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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/live.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/live.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -7,15 +7,15 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -144,13 +144,13 @@
|
||||
|
||||
</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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-15
@@ -12,13 +12,13 @@
|
||||
vergessen wird. -->
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
|
||||
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
|
||||
@@ -75,13 +75,13 @@
|
||||
<p class="fehler" id="fehler" hidden></p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-17
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609222018" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609222333" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609222333" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222018" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609222333" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -190,15 +190,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609222333" 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/bereiche.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609222018" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609222333" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609222333" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user