Chat: die GIF-Kiste des Rudels -- und eine Luecke in der Sicherung
Filipe: "dan will ich auch dass man im chat auch sprachnachrichten und
gifts reinschicken kann. also nur die modis rechte linke hand und
dogfather."
ICH LESE "gifts" ALS GIFs -- die bewegten Bildchen -- und sage das
ausdruecklich, statt es stillschweigend anzunehmen. Im Zusammenhang
("im chat reinschicken", direkt neben Sprachnachrichten) passt nichts
anderes. Sollte er Geschenke gemeint haben, sagt er es, und dann baue
ich das.
EINE EIGENE KISTE STATT GIPHY ODER TENOR
----------------------------------------
Beide brauchen ein Konto und einen Schluessel und bekommen bei jedem
Tastendruck mit, wonach hier gesucht wird -- an eine fremde Firma, aus
einem Arbeitsplatz heraus, in dem sonst nichts nach aussen geht. Dazu
kosten sie ab einer Menge Geld. Beides steht quer zu dem, wie dieses
Haus gebaut ist.
Die Kiste laeuft auf demselben Server wie alles andere, kostet nichts
und wird mit der Zeit besser statt schlechter: Was darin liegt, hat das
Team ausgesucht. Zehn gute GIFs, die alle kennen, sind im Alltag mehr
wert als zehn Millionen fremde -- ein Katalog mit allem ist nicht mehr
Auswahl, sondern weniger.
HABEN WIR DAS SCHON? WIRD AM INHALT BEANTWORTET
-----------------------------------------------
Der Schluessel ist der SHA-256 der Datei. Ueber den NAMEN zu
vergleichen waere die naheliegende Abkuerzung -- und sie versagt genau
dort, wo Dateien "giphy.gif", "giphy(1).gif" und "download.gif"
heissen, also fast immer. Dasselbe Bild waere dreimal dieselbe Kachel.
Dasselbe GIF zweimal hineinzulegen ist deshalb KEIN Fehler: Es ist
drin, und genau das wollte man. Eine Absage waere formal richtig und im
Erleben falsch.
DAS WICHTIGSTE STUECK: ES WIRD KOPIERT, NICHT VERWIESEN
-------------------------------------------------------
Eine Nachricht zurueckzunehmen entfernt ihre Datei von der Platte. Laege
ein Kachel-GIF in demselben Ordner und mehrere Nachrichten zeigten
darauf, naehme das Zuruecknehmen EINER Nachricht das GIF fuer alle
anderen mit -- und in drei Gespraechen stuende ab da ein kaputtes Bild.
Das ist die Sorte Fehler, die erst Wochen spaeter auffaellt und dann
nicht mehr zu reparieren ist.
Deshalb liegt die Kiste in einem eigenen Ordner (chat-gifs/), und beim
Verschicken wird kopiert. Danach ist es ein ganz normaler Anhang: im
Verlauf, in der Suche, zuruecknehmbar, unter derselben Nachtruhe. Keine
zweite Sorte Nachricht mit eigenen Rechten und eigenem Loeschen.
Geprueft wird genau das: GIF hineinlegen, verschicken, aus der Kiste
nehmen -- und danach steht das verschickte immer noch im Gespraech.
"ALSO NUR" GILT AUCH HIER
-------------------------
Ansehen, hineinlegen, verschicken: alle drei nur fuer Team Dogi und
DogFather (istTeamDogi). Der Satz stand im selben Atemzug wie die
Sprachnachrichten; es gibt keinen Grund, warum er fuer das eine gelten
sollte und fuer das andere nicht. Gemessen auch am Knopf vorbei:
403/403/403.
AUGENSCHONEND -- HIER EINE ECHTE FRAGE, KEINE FORMSACHE
--------------------------------------------------------
Zwoelf gleichzeitig laufende Bildchen sind das Gegenteil von ruhig. Wer
"Bewegung reduzieren" gesetzt hat, bekommt deshalb STEHENDE Bilder: das
erste Einzelbild, im Browser auf eine Zeichenflaeche gemalt (kostet
keine zweite Datei), und es laeuft erst, wenn man es anfasst oder mit
der Tastatur darauf steht.
Fuer alle anderen laufen sie. Eine GIF-Auswahl, in der sich nichts
bewegt, ist eine, in der man nicht sieht, was man verschickt -- deshalb
steht dazu eine Gegenprobe in der Pruefung.
NEBENBEFUND, UND ER WIEGT SCHWERER ALS DIE GIFS
-----------------------------------------------
Weil die Kiste einen neuen Datenordner braucht, lief
tools/wiederherstellung-proben.mjs -- und meldete, dass der Ordner
"material" seit dem 22.09. NICHT gesichert wird. 2,4 MB
Materialbibliothek auf dem Server, nach einem Plattenausfall weg, ohne
dass die taegliche Meldung je etwas gesagt haette. Genau die Luecke,
wegen der diese Probe ueberhaupt gebaut wurde -- und sie hat sie
gefunden, weil sie die Ordner aus dem QUELLTEXT liest statt aus einer
gepflegten Liste.
Eingetragen. Danach frisch geholt und zurueckgespielt: 18 von 18 gruen,
"DIE SICHERUNG LAESST SICH ZURUECKSPIELEN" (vorher 3 Fehler).
Dabei war die Gegenprobe daneben selbst kaputt: Sie prueft, ob ein
erfundener Ordner als fehlend erkannt wird, und verlangte dafuer
`=== 1`. Das setzt voraus, dass sonst nichts fehlt. An dem Tag, an dem
wirklich etwas fehlte, wurde sie rot und zeigte damit auf sich selbst
statt auf den Fund -- zwei Meldungen, eine Ursache, und die zweite
lenkt von der ersten ab. Jetzt zaehlt sie die Differenz.
GEPRUEFT
--------
pruef-chat-anhaenge: 109 Pruefungen, 0 Fehler (vorher 86, davor 60).
pruef-chat, pruef-chat-aufloesen (126), pruef-chat-optik: gruen.
tools/wiederherstellung-proben: 18 von 18.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -49,6 +49,11 @@ notbremse(600_000, "pruef-chat-anhaenge");
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
const BASIS = `http://127.0.0.1:${PORT}`;
|
||||
const ANHANG_ORDNER = join(ordner, "chat-anhaenge");
|
||||
/* Der Datenordner dieses Laufs. Gebraucht wird er, um nachzusehen, WO
|
||||
eine Datei liegt: in der GIF-Kiste oder bei den Anhaengen. Genau
|
||||
dieser Unterschied ist der Kern des GIF-Abschnitts -- ein
|
||||
verschicktes GIF ist eine KOPIE, kein Verweis. */
|
||||
const DATEN_ORDNER_P = ordner;
|
||||
|
||||
const PROTOKOLL = join(process.cwd(), "pruef-chat-anhaenge-lauf.txt");
|
||||
try { rmSync(PROTOKOLL, { force: true }); } catch { /* gab es noch nicht */ }
|
||||
@@ -834,7 +839,192 @@ async function tonAufnehmen(seite, ms) {
|
||||
`ein Video im Ton-Behälter wird abgelehnt (HTTP ${alsVideo}) — sonst liefe es ohne Bild und niemand wüsste es`);
|
||||
}
|
||||
|
||||
melde("\n=== 10. Stille Fehler ===");
|
||||
/* =======================================================================
|
||||
DIE GIF-KISTE (23.09.2026)
|
||||
|
||||
Filipe: „dan will ich auch dass man im chat auch sprachnachrichten
|
||||
und gifts reinschicken kann. also nur die modis rechte linke hand
|
||||
und dogfather."
|
||||
|
||||
„gifts" ist hier als GIFs gelesen -- die bewegten Bildchen.
|
||||
|
||||
DIE WICHTIGSTE PRUEFUNG IN DIESEM ABSCHNITT IST DIE VORLETZTE: Ein
|
||||
GIF aus der Kiste zu verschicken KOPIERT die Datei. Verwiese die
|
||||
Nachricht auf dieselbe Datei, dann naehme das Zuruecknehmen EINER
|
||||
Nachricht das GIF fuer alle anderen mit -- und in drei Gespraechen
|
||||
stuende ab da ein kaputtes Bild. Das ist die Sorte Fehler, die erst
|
||||
Wochen spaeter auffaellt und dann nicht mehr zu reparieren ist.
|
||||
======================================================================= */
|
||||
melde("\n=== 10. Die GIF-Kiste ===");
|
||||
|
||||
/* EIN ECHTES GIF, kein gebasteltes Muster: Diese 43 Bytes sind das
|
||||
bekannte durchsichtige 1x1-GIF89a -- jedes Programm der Welt oeffnet
|
||||
es. Es geht hier nicht um das Bild, sondern um den Weg. */
|
||||
const GIF_B64 = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
|
||||
|
||||
{
|
||||
await oeffne(dogi.seite, raumDogi);
|
||||
|
||||
/* ---- Der Knopf ist da -- und bei Patrick nicht ------------------ */
|
||||
ok(await dogi.seite.locator("#gif-auf").isVisible(), "DogFather sieht den GIF-Knopf");
|
||||
await oeffne(pat.seite, raumId);
|
||||
ok(!(await pat.seite.locator("#gif-auf").isVisible()),
|
||||
"der Scout sieht ihn nicht — dieselbe Regel wie bei den Sprachnachrichten");
|
||||
|
||||
/* ---- Die Kiste ist leer, und sie sagt das auch ------------------- */
|
||||
await dogi.seite.click("#gif-auf");
|
||||
await dogi.seite.waitForSelector("#gif-tafel:not([hidden])", { timeout: 8000 });
|
||||
const leerSatz = (await dogi.seite.locator("#gif-leer").innerText()).trim();
|
||||
ok(/noch leer/.test(leerSatz), `die leere Kiste sagt, was zu tun ist ("${leerSatz.slice(0, 48)}…")`);
|
||||
|
||||
/* ---- Ein GIF hineinlegen, ueber den echten Knopf ----------------- */
|
||||
await dogi.seite.setInputFiles("#gif-feld", {
|
||||
name: "daumen-hoch.gif", mimeType: "image/gif", buffer: Buffer.from(GIF_B64, "base64"),
|
||||
});
|
||||
await dogi.seite.waitForTimeout(2200);
|
||||
const kacheln = await dogi.seite.locator(".gif-kachel").count();
|
||||
ok(kacheln === 1, `es liegt ein GIF in der Kiste (${kacheln})`);
|
||||
|
||||
const db4 = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||
const inKiste = db4.prepare(
|
||||
"SELECT id, datei, name, typ, breite, hoehe, von_id FROM chat_gifs ORDER BY id DESC LIMIT 1").get();
|
||||
db4.close();
|
||||
ok(inKiste?.typ === "image/gif", `erkannt als ${inKiste?.typ}`);
|
||||
ok(inKiste?.name === "daumen-hoch", `der Name bleibt ohne Endung ("${inKiste?.name}")`);
|
||||
ok(inKiste?.breite === 1 && inKiste?.hoehe === 1,
|
||||
`die Maße kommen aus der Datei (${inKiste?.breite}×${inKiste?.hoehe})`);
|
||||
ok(existsSync(join(DATEN_ORDNER_P, "chat-gifs", inKiste?.datei || "-")),
|
||||
"die Datei liegt in der eigenen Kiste, nicht bei den Anhängen");
|
||||
|
||||
/* ---- DASSELBE NOCH EINMAL IST KEIN FEHLER ------------------------ */
|
||||
await dogi.seite.setInputFiles("#gif-feld", {
|
||||
/* ANDERER NAME, GLEICHER INHALT -- genau der Fall, der über den
|
||||
Namen nicht zu erkennen wäre: "giphy.gif", "giphy(1).gif",
|
||||
"download.gif" sind fast immer dasselbe Bild. */
|
||||
name: "giphy(1).gif", mimeType: "image/gif", buffer: Buffer.from(GIF_B64, "base64"),
|
||||
});
|
||||
await dogi.seite.waitForTimeout(1800);
|
||||
const nachZweitem = await dogi.seite.locator(".gif-kachel").count();
|
||||
ok(nachZweitem === 1,
|
||||
`dasselbe GIF unter anderem Namen ergibt KEINE zweite Kachel (${nachZweitem}) — verglichen wird der Inhalt`);
|
||||
const hinweis = (await dogi.seite.locator("#fehler").innerText()).trim();
|
||||
ok(/schon in der Kiste/.test(hinweis), ` und es steht als Hinweis da, nicht als Fehler ("${hinweis}")`);
|
||||
|
||||
/* ---- Verschicken ------------------------------------------------- */
|
||||
const vorher = await dogi.seite.locator(".chat-nachricht").count();
|
||||
await dogi.seite.click(".gif-kachel__knopf");
|
||||
await dogi.seite.waitForTimeout(2200);
|
||||
const nachher = await dogi.seite.locator(".chat-nachricht").count();
|
||||
ok(nachher === vorher + 1, `das GIF steht im Verlauf (${vorher} -> ${nachher})`);
|
||||
ok(!(await dogi.seite.locator("#gif-tafel").isVisible()),
|
||||
" und die Kiste geht zu — sonst steht sie vor dem, was man gerade geschickt hat");
|
||||
|
||||
const db5 = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||
const alsNachricht = db5.prepare(`SELECT anhang_art, anhang_typ, anhang_datei, anhang_name
|
||||
FROM chat_nachrichten WHERE anhang_typ = 'image/gif' ORDER BY id DESC LIMIT 1`).get();
|
||||
db5.close();
|
||||
ok(alsNachricht?.anhang_art === "bild",
|
||||
"es ist ein ganz normaler Anhang geworden — keine zweite Sorte Nachricht");
|
||||
ok(alsNachricht?.anhang_name === "daumen-hoch.gif",
|
||||
`mit seinem Namen (${alsNachricht?.anhang_name})`);
|
||||
|
||||
/* ---- DIE EIGENTLICHE AUSSAGE: ES WURDE KOPIERT ------------------- */
|
||||
ok(alsNachricht?.anhang_datei !== inKiste?.datei,
|
||||
"die verschickte Datei ist eine KOPIE, kein Verweis auf die Kiste");
|
||||
ok(existsSync(join(DATEN_ORDNER_P, "chat-anhaenge", alsNachricht?.anhang_datei || "-")),
|
||||
" sie liegt bei den Anhängen");
|
||||
|
||||
/* ---- Aus der Kiste nehmen: das Verschickte bleibt ---------------- */
|
||||
await dogi.seite.evaluate(() => { window.confirm = () => true; });
|
||||
await dogi.seite.click("#gif-auf");
|
||||
await dogi.seite.waitForTimeout(600);
|
||||
await dogi.seite.click(".gif-kachel__weg");
|
||||
await dogi.seite.waitForTimeout(1500);
|
||||
const restKacheln = await dogi.seite.locator(".gif-kachel").count();
|
||||
ok(restKacheln === 0, `aus der Kiste genommen (${restKacheln} übrig)`);
|
||||
ok(!existsSync(join(DATEN_ORDNER_P, "chat-gifs", inKiste?.datei || "-")),
|
||||
" die Datei der Kiste ist weg");
|
||||
/* UND DAS IST DER PUNKT: Das verschickte GIF steht weiter im
|
||||
Gespräch. Wäre es ein Verweis gewesen, stünde dort jetzt ein
|
||||
kaputtes Bild -- in jedem Gespräch, in das es je geschickt wurde. */
|
||||
ok(existsSync(join(DATEN_ORDNER_P, "chat-anhaenge", alsNachricht?.anhang_datei || "-")),
|
||||
" das bereits verschickte GIF bleibt unberührt");
|
||||
|
||||
/* ---- Die Gegenprobe: der Scout kommt an die Kiste nicht heran ---- */
|
||||
const absagen = await absichtlich([pat], () => pat.seite.evaluate(async ([r, b64]) => {
|
||||
const roh = atob(b64);
|
||||
const puffer = new Uint8Array(roh.length);
|
||||
for (let i = 0; i < roh.length; i++) puffer[i] = roh.charCodeAt(i);
|
||||
const liste = await fetch("/workspace/api/chat/gifs");
|
||||
const rein = await fetch("/workspace/api/chat/gifs", {
|
||||
method: "POST", headers: { "Content-Type": "image/gif", "X-Dateiname": "x.gif" },
|
||||
body: puffer });
|
||||
const raus = await fetch(`/workspace/api/chat/raeume/${r}/gif`, {
|
||||
method: "POST", headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ gif_id: 1 }) });
|
||||
return { liste: liste.status, rein: rein.status, raus: raus.status };
|
||||
}, [raumId, GIF_B64]));
|
||||
ok(absagen.liste === 403 && absagen.rein === 403 && absagen.raus === 403,
|
||||
`am Knopf vorbei: ansehen ${absagen.liste}, hineinlegen ${absagen.rein}, schicken ${absagen.raus}`);
|
||||
|
||||
/* ---- Nur GIFs kommen hinein -------------------------------------- */
|
||||
const keinGif = await absichtlich([dogi], () => dogi.seite.evaluate(async () => {
|
||||
const a = await fetch("/workspace/api/chat/gifs", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "image/gif", "X-Dateiname": "eigentlich.png" },
|
||||
body: new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
|
||||
0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1]),
|
||||
});
|
||||
return { status: a.status, text: (await a.json())?.fehler || "" };
|
||||
}));
|
||||
ok(keinGif.status === 415,
|
||||
`ein PNG mit dem Etikett "image/gif" kommt nicht hinein (HTTP ${keinGif.status}) — entschieden wird am Inhalt`);
|
||||
|
||||
/* ---- Augenschonend: bei Bewegungsverzicht stehen sie still ------- */
|
||||
const ruhig = await browser.newContext({
|
||||
viewport: { width: 1280, height: 900 }, reducedMotion: "reduce",
|
||||
});
|
||||
const rs = await ruhig.newPage();
|
||||
await rs.goto(BASIS + "/workspace/", { waitUntil: "networkidle" });
|
||||
await rs.click('.rolle[data-rolle="admin"]');
|
||||
await rs.fill("#code", "CODE-DOGI-0001");
|
||||
await rs.click("button[type=submit]");
|
||||
await rs.waitForURL("**/start.html", { timeout: 25000 });
|
||||
/* Noch ein GIF in die Kiste, sonst ist nichts zu sehen. */
|
||||
await rs.goto(`${BASIS}/workspace/chat.html?raum=${raumDogi}`, { waitUntil: "networkidle" });
|
||||
await rs.waitForSelector("#schreiben:not([hidden])", { timeout: 8000 });
|
||||
await rs.click("#gif-auf");
|
||||
await rs.waitForTimeout(500);
|
||||
await rs.setInputFiles("#gif-feld", {
|
||||
name: "ruhig.gif", mimeType: "image/gif", buffer: Buffer.from(GIF_B64, "base64"),
|
||||
});
|
||||
await rs.waitForTimeout(2200);
|
||||
const ruhigeKachel = await rs.evaluate(() => {
|
||||
const k = document.querySelector(".gif-kachel__knopf");
|
||||
return { tag: k?.firstElementChild?.tagName || "", da: !!k };
|
||||
});
|
||||
ok(ruhigeKachel.da && ruhigeKachel.tag === "CANVAS",
|
||||
`bei „Bewegung reduzieren" steht das GIF still (${ruhigeKachel.tag}) — zwölf laufende Bildchen sind das Gegenteil von ruhig`);
|
||||
/* GEGENPROBE: Im normalen Fall LAEUFT es. Sonst bewiese die Zeile
|
||||
darüber nur, dass die Kachel immer stillsteht -- und dann sähe
|
||||
niemand, was er verschickt. */
|
||||
/* NEU LADEN, WEIL DIE KISTE SICH GEAENDERT HAT. Dieses Fenster hat
|
||||
die Liste zuletzt geholt, als sie leer war -- ohne das Neuladen
|
||||
zeigte die Gegenprobe auf ein leeres Gitter und wuerde rot, ohne
|
||||
dass irgendetwas kaputt waere. (Beim Bauen genau so passiert.) */
|
||||
await oeffne(dogi.seite, raumDogi);
|
||||
await dogi.seite.click("#gif-auf");
|
||||
await dogi.seite.waitForTimeout(1200);
|
||||
const normaleKachel = await dogi.seite.evaluate(() => ({
|
||||
tag: document.querySelector(".gif-kachel__knopf")?.firstElementChild?.tagName || "",
|
||||
kacheln: document.querySelectorAll(".gif-kachel").length,
|
||||
}));
|
||||
ok(normaleKachel.kacheln === 1 && normaleKachel.tag === "IMG",
|
||||
`Gegenprobe: ohne diese Einstellung läuft es (${normaleKachel.kacheln} Kachel, ${normaleKachel.tag})`);
|
||||
await ruhig.close();
|
||||
}
|
||||
|
||||
melde("\n=== 11. Stille Fehler ===");
|
||||
{
|
||||
/* ABSICHTLICH PROVOZIERTE ABSAGEN ZÄHLEN NICHT.
|
||||
|
||||
|
||||
+287
-2
@@ -38,9 +38,10 @@
|
||||
===================================================================== */
|
||||
|
||||
import express from "express";
|
||||
import { randomBytes } from "node:crypto";
|
||||
import { randomBytes, createHash } from "node:crypto";
|
||||
import { join, extname, basename } from "node:path";
|
||||
import { mkdirSync, writeFileSync, createReadStream, statSync, unlinkSync } from "node:fs";
|
||||
import { mkdirSync, writeFileSync, createReadStream, statSync, unlinkSync,
|
||||
copyFileSync } from "node:fs";
|
||||
import {
|
||||
db, protokolliere, echteIp, sitzungLesen, istDogFather,
|
||||
schreibbareIds, darfSchreibenMit, ROLLEN_SORTIERUNG, DATEN_ORDNER,
|
||||
@@ -95,6 +96,49 @@ const ANHANG_NAME_MAX = 200;
|
||||
sind -- eine Dauer waere eine Behauptung des Absenders. */
|
||||
const TON_MAX = 4 * 1024 * 1024;
|
||||
|
||||
/* DIE GIF-KISTE DES RUDELS (23.09.2026) -- eigener Ordner, und das ist
|
||||
kein Ordnungssinn.
|
||||
|
||||
Eine Nachricht loeschen entfernt ihre Datei von der Platte (siehe
|
||||
das Zuruecknehmen weiter unten). Laege ein Kachel-GIF in demselben
|
||||
Ordner und mehrere Nachrichten zeigten darauf, wuerde das Loeschen
|
||||
EINER Nachricht das GIF fuer alle anderen mitnehmen -- und in drei
|
||||
Gespraechen stuende ab da ein kaputtes Bild. Deshalb liegt die
|
||||
Kiste fuer sich, und beim Verschicken wird KOPIERT. Ein GIF ist
|
||||
klein genug, dass die Kopie nichts kostet; ein kaputtes Bild in
|
||||
einem fremden Gespraech ist teuer.
|
||||
|
||||
Der Ordner steht ueber join(DATEN_ORDNER, ...) -- genau dieses
|
||||
Muster liest tools/wiederherstellung-proben.mjs aus, um zu pruefen,
|
||||
ob die Sicherung ihn mitnimmt. Eine gepflegte Liste waere die, die
|
||||
beim naechsten Ordner vergessen wird. */
|
||||
const GIF_ORDNER = join(DATEN_ORDNER, "chat-gifs");
|
||||
|
||||
/* ACHT MEGABYTE. Ein GIF darueber ist kein GIF mehr, sondern ein
|
||||
Video mit einem falschen Hut auf -- und es laeuft in der Auswahl
|
||||
dauerhaft im Kreis, waehrend das Handy heiss wird. */
|
||||
const GIF_MAX = 8 * 1024 * 1024;
|
||||
|
||||
/** Alle GIFs der Kiste, das Neueste zuerst.
|
||||
* An einer Stelle, weil drei danach fragen: die Liste, das
|
||||
* Hineinlegen (es gibt die frische zurueck) und das Herausnehmen. */
|
||||
function gifListe() {
|
||||
return db().prepare(`SELECT g.id, g.name, g.groesse, g.breite, g.hoehe,
|
||||
g.erstellt, p.name AS von
|
||||
FROM chat_gifs g LEFT JOIN personen p ON p.id = g.von_id
|
||||
ORDER BY g.id DESC LIMIT 200`).all()
|
||||
.map((g) => ({
|
||||
id: g.id, name: g.name, groesse: g.groesse,
|
||||
breite: g.breite || 0, hoehe: g.hoehe || 0,
|
||||
von: g.von || null, erstellt: g.erstellt,
|
||||
/* Als fertige ADRESSE, nicht als Dateiname -- sonst setzt jede
|
||||
Stelle im Browser denselben Pfad zusammen, und eine davon
|
||||
setzt ihn irgendwann anders. Dieselbe Entscheidung wie beim
|
||||
Anhang. */
|
||||
weg: `/workspace/api/chat/gifs/${g.id}/bild`,
|
||||
}));
|
||||
}
|
||||
|
||||
const jetzt = () => new Date().toISOString();
|
||||
|
||||
/* ---------- Schranke ---------------------------------------------------- */
|
||||
@@ -1500,6 +1544,9 @@ chatRouter.get("/workspace/api/chat/raeume/:id/nachrichten", (req, res) => {
|
||||
so einem Raum niemanden -- deshalb dort die zweite Bedingung
|
||||
und hier nicht. */
|
||||
darf_ton: istTeamDogi(req.person),
|
||||
/* DIE GIF-KISTE, aus derselben Regel. Filipes „also nur" stand
|
||||
im selben Satz wie die Sprachnachrichten. */
|
||||
darf_gif: istTeamDogi(req.person),
|
||||
angeheftet: angeheftet.map((a) => ({
|
||||
id: a.id,
|
||||
von: a.von || "Gelöscht",
|
||||
@@ -1923,6 +1970,244 @@ chatRouter.post("/workspace/api/chat/raeume/:id/anhang",
|
||||
}
|
||||
});
|
||||
|
||||
/* =====================================================================
|
||||
DIE GIF-KISTE (23.09.2026)
|
||||
|
||||
Filipe: „dan will ich auch dass man im chat auch sprachnachrichten
|
||||
und gifts reinschicken kann. also nur die modis rechte linke hand
|
||||
und dogfather."
|
||||
|
||||
ICH LESE „gifts" ALS GIFs -- die bewegten Bildchen -- und sage das
|
||||
hier ausdruecklich, statt es stillschweigend anzunehmen. Im
|
||||
Zusammenhang („im chat reinschicken", direkt neben Sprachnachrichten)
|
||||
passt nichts anderes; sollte er Geschenke gemeint haben, steht das
|
||||
hier als Stelle, an der man es sieht.
|
||||
|
||||
WARUM EINE EIGENE KISTE UND KEIN GIPHY: Die Begruendung steht bei
|
||||
der Tabelle in workspace.js -- kurz: fremder Schluessel, fremde
|
||||
Firma, jede Suche geht hinaus, und ab einer Menge kostet es. Die
|
||||
Kiste laeuft hier, kostet nichts und wird mit der Zeit besser:
|
||||
Was darin liegt, hat das Team ausgesucht.
|
||||
|
||||
DIE VIER GELTEN AUCH HIER. „also nur die modis rechte linke hand und
|
||||
dogfather" stand im selben Satz wie die Sprachnachrichten; es gibt
|
||||
keinen Grund, warum es fuer das eine gelten sollte und fuer das
|
||||
andere nicht.
|
||||
===================================================================== */
|
||||
|
||||
/** Vor jeder GIF-Route: Gehoere ich dazu? */
|
||||
function nurRudel(req, res, next) {
|
||||
if (!istTeamDogi(req.person)) {
|
||||
return res.status(403).json({ fehler: "Die GIF-Kiste gehört Team Dogi." });
|
||||
}
|
||||
next();
|
||||
}
|
||||
|
||||
chatRouter.get("/workspace/api/chat/gifs", nurRudel, (req, res) => {
|
||||
try {
|
||||
res.json({ gifs: gifListe(), hoechstens: GIF_MAX });
|
||||
} catch (fehler) {
|
||||
console.error("[chat] GIF-Liste:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Ein GIF in die Kiste legen. */
|
||||
chatRouter.post("/workspace/api/chat/gifs", gleicheHerkunft, nurRudel,
|
||||
express.raw({ type: "*/*", limit: GIF_MAX }), (req, res) => {
|
||||
try {
|
||||
if (!Buffer.isBuffer(req.body) || !req.body.length) {
|
||||
return res.status(400).json({ fehler: "Keine Datei empfangen." });
|
||||
}
|
||||
/* AUS DEM INHALT, nicht aus dem Namen und nicht aus dem
|
||||
Content-Type -- beide kommen vom Absender. */
|
||||
const erkannt = dateiErkennen(req.body);
|
||||
if (!erkannt || erkannt.typ !== "image/gif") {
|
||||
return res.status(415).json({ fehler: "In die Kiste kommen nur GIFs." });
|
||||
}
|
||||
|
||||
/* HABEN WIR DAS SCHON? Beantwortet am INHALT, nicht am Namen.
|
||||
Ueber den Namen zu vergleichen waere die naheliegende
|
||||
Abkuerzung -- und sie versagt genau dort, wo Dateien
|
||||
"giphy.gif", "giphy(1).gif" und "download.gif" heissen, also
|
||||
fast immer. Dasselbe GIF waere dreimal dieselbe Kachel. */
|
||||
const pruef = createHash("sha256").update(req.body).digest("hex");
|
||||
const d = db();
|
||||
const schon = d.prepare("SELECT id FROM chat_gifs WHERE pruef = ?").get(pruef);
|
||||
if (schon) {
|
||||
/* KEIN FEHLER. Wer dasselbe GIF noch einmal hineinlegt, wollte
|
||||
es in der Kiste haben -- und es ist drin. Eine Absage waere
|
||||
formal richtig und im Erleben falsch. */
|
||||
return res.status(200).json({ gif: gifListe().find((g) => g.id === schon.id) || null,
|
||||
schon: true });
|
||||
}
|
||||
|
||||
const name = anhangName(req.get("x-dateiname"), ".gif").replace(/\.gif$/i, "") || "GIF";
|
||||
mkdirSync(GIF_ORDNER, { recursive: true });
|
||||
const aufPlatte = `${Date.now().toString(36)}-${randomBytes(8).toString("hex")}.gif`;
|
||||
writeFileSync(join(GIF_ORDNER, aufPlatte), req.body, { flag: "wx" });
|
||||
|
||||
const n = jetzt();
|
||||
d.prepare(`INSERT INTO chat_gifs
|
||||
(datei, name, pruef, typ, groesse, breite, hoehe, von_id, erstellt)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)`)
|
||||
.run(aufPlatte, name.slice(0, 60), pruef, erkannt.typ, req.body.length,
|
||||
erkannt.breite || null, erkannt.hoehe || null, req.person.id, n);
|
||||
const id = d.prepare("SELECT last_insert_rowid() AS id").get().id;
|
||||
|
||||
protokolliere("chat_gif_dazu", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${id} ${name} ${Math.round(req.body.length / 1024)} kB`.slice(0, 120),
|
||||
});
|
||||
res.status(201).json({ gif: gifListe().find((g) => g.id === id) || null, schon: false });
|
||||
} catch (fehler) {
|
||||
console.error("[chat] GIF hineinlegen:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Ein GIF aus der Kiste ansehen. */
|
||||
chatRouter.get("/workspace/api/chat/gifs/:id/bild", nurRudel, (req, res) => {
|
||||
try {
|
||||
const id = Number(req.params.id);
|
||||
if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" });
|
||||
const g = db().prepare("SELECT datei, name, typ FROM chat_gifs WHERE id = ?").get(id);
|
||||
if (!g) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
const pfad = join(GIF_ORDNER, g.datei);
|
||||
try { statSync(pfad); } catch { return res.status(410).json({ fehler: "Datei fehlt auf der Platte." }); }
|
||||
/* Dieselben Kopfzeilen wie beim Anhang -- der Typ aus der
|
||||
Erkennung, nosniff, und eine Richtlinie, die dem Dokument jede
|
||||
Ausfuehrung nimmt. Ein GIF kostet das nichts. */
|
||||
res.setHeader("Content-Type", g.typ || "image/gif");
|
||||
res.setHeader("X-Content-Type-Options", "nosniff");
|
||||
res.setHeader("Content-Security-Policy", "default-src 'none'; sandbox");
|
||||
res.setHeader("Cache-Control", "private, max-age=86400");
|
||||
createReadStream(pfad).pipe(res);
|
||||
} catch (fehler) {
|
||||
console.error("[chat] GIF ausliefern:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Ein GIF wieder aus der Kiste nehmen.
|
||||
*
|
||||
* WER: der, der es hineingelegt hat -- und wer ohnehin jede Nachricht
|
||||
* wegnehmen darf (DogFather und die rechte Hand). Die Kiste gehoert
|
||||
* allen; ein GIF, das nicht mehr passt, muss jemand herausnehmen
|
||||
* koennen, ohne den zu suchen, der es damals gebracht hat.
|
||||
*
|
||||
* DIE DATEI GEHT MIT. Anders als bei einer Nachricht gibt es hier
|
||||
* keinen Verlauf, den man lesbar halten muesste -- was aus der Kiste
|
||||
* ist, ist aus der Kiste. Bereits verschickte GIFs bleiben
|
||||
* unberuehrt: Sie sind Kopien (siehe oben). */
|
||||
chatRouter.delete("/workspace/api/chat/gifs/:id", gleicheHerkunft, nurRudel, (req, res) => {
|
||||
try {
|
||||
const id = Number(req.params.id);
|
||||
if (!Number.isInteger(id)) return res.status(400).json({ fehler: "ungueltig" });
|
||||
const d = db();
|
||||
const g = d.prepare("SELECT id, datei, name, von_id FROM chat_gifs WHERE id = ?").get(id);
|
||||
if (!g) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
if (g.von_id !== req.person.id && !darfJedeNachrichtLoeschen(req.person)) {
|
||||
return res.status(403).json({ fehler: "Das hat jemand anderes hineingelegt." });
|
||||
}
|
||||
const weg = d.prepare("DELETE FROM chat_gifs WHERE id = ?").run(id).changes;
|
||||
if (weg) {
|
||||
try { unlinkSync(join(GIF_ORDNER, g.datei)); } catch { /* war schon weg */ }
|
||||
}
|
||||
protokolliere("chat_gif_weg", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${id} ${g.name}`.slice(0, 120),
|
||||
});
|
||||
res.json({ weg: weg > 0, gifs: gifListe() });
|
||||
} catch (fehler) {
|
||||
console.error("[chat] GIF herausnehmen:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Ein GIF aus der Kiste in ein Gespraech schicken.
|
||||
*
|
||||
* ES WIRD KOPIERT, NICHT VERWIESEN -- die Begruendung steht oben bei
|
||||
* GIF_ORDNER: Eine geloeschte Nachricht nimmt ihre Datei mit, und ein
|
||||
* gemeinsamer Verweis waere ein kaputtes Bild in drei Gespraechen.
|
||||
*
|
||||
* DANACH IST ES EIN GANZ NORMALER ANHANG. Keine zweite Sorte
|
||||
* Nachricht: Es steht im Verlauf, es laesst sich zuruecknehmen, es
|
||||
* faellt unter dieselbe Nachtruhe. Eine eigene Sorte haette eigene
|
||||
* Rechte, eigene Suche, eigenes Loeschen -- drei Dinge, die es schon
|
||||
* gibt. */
|
||||
chatRouter.post("/workspace/api/chat/raeume/:id/gif", gleicheHerkunft, nurRudel,
|
||||
express.json({ limit: "2kb" }), (req, res) => {
|
||||
try {
|
||||
const raumId = Number(req.params.id);
|
||||
if (!Number.isInteger(raumId)) return res.status(400).json({ fehler: "ungueltig" });
|
||||
if (!istDrin(raumId, req.person)) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
/* DIE NACHTRUHE GILT AUCH HIER. Sie nur beim Text und beim
|
||||
Anhang zu pruefen hiesse, dass man nachts zwar nicht schreiben,
|
||||
aber ein GIF schicken kann -- der Weg, den jeder findet, der
|
||||
es einmal versucht. */
|
||||
if (istTreffRaum(raumId) && istNachtruhe()) {
|
||||
const stand = nachtruheStand();
|
||||
return res.status(403).json({ fehler: stand.satz, nachtruhe: stand });
|
||||
}
|
||||
|
||||
const gifId = Number(req.body?.gif_id);
|
||||
const d = db();
|
||||
const g = Number.isInteger(gifId)
|
||||
? d.prepare("SELECT id, datei, name, typ, groesse, breite, hoehe FROM chat_gifs WHERE id = ?")
|
||||
.get(gifId) : null;
|
||||
if (!g) return res.status(404).json({ fehler: "Dieses GIF gibt es nicht mehr." });
|
||||
|
||||
const quelle = join(GIF_ORDNER, g.datei);
|
||||
try { statSync(quelle); } catch {
|
||||
return res.status(410).json({ fehler: "Die Datei fehlt auf der Platte." });
|
||||
}
|
||||
mkdirSync(ANHANG_ORDNER, { recursive: true });
|
||||
const aufPlatte = `${Date.now().toString(36)}-${randomBytes(8).toString("hex")}.gif`;
|
||||
copyFileSync(quelle, join(ANHANG_ORDNER, aufPlatte));
|
||||
|
||||
let begleittext = String(req.body?.text ?? "").trim().slice(0, TEXT_MAX);
|
||||
const n = jetzt();
|
||||
d.prepare(`INSERT INTO chat_nachrichten
|
||||
(raum_id, person_id, text, erstellt,
|
||||
anhang_datei, anhang_name, anhang_art, anhang_typ,
|
||||
anhang_groesse, anhang_breite, anhang_hoehe)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)`)
|
||||
.run(raumId, req.person.id, begleittext, n,
|
||||
aufPlatte, `${g.name}.gif`, "bild", g.typ,
|
||||
g.groesse, g.breite || null, g.hoehe || null);
|
||||
const id = d.prepare("SELECT last_insert_rowid() AS id").get().id;
|
||||
d.prepare("UPDATE chat_raeume SET letzte_am = ? WHERE id = ?").run(n, raumId);
|
||||
d.prepare("UPDATE chat_teilnehmer SET gelesen_bis = ? WHERE raum_id = ? AND person_id = ?")
|
||||
.run(id, raumId, req.person.id);
|
||||
|
||||
const nachricht = {
|
||||
id, raum_id: raumId, von_id: req.person.id, von: req.person.name,
|
||||
von_bild: bildWegFuer(req.person.id),
|
||||
von_kachel: kachelFuer(req.person.id),
|
||||
rolle: req.person.rolle, text: begleittext, erstellt: n,
|
||||
zurueckgenommen: false, antwort: null, rudel: false,
|
||||
anhang: {
|
||||
art: "bild", typ: g.typ, name: `${g.name}.gif`,
|
||||
groesse: g.groesse, breite: g.breite || 0, hoehe: g.hoehe || 0,
|
||||
dauer: 0,
|
||||
weg: `/workspace/api/chat/anhang/${id}`,
|
||||
},
|
||||
};
|
||||
const empfaenger = teilnehmerVon(raumId).filter((t) => t.id !== req.person.id);
|
||||
chatEreignis(raumId, nachricht, empfaenger.map((t) => t.id));
|
||||
|
||||
protokolliere("chat_gif", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
detail: `#${id} aus Kiste #${g.id}`.slice(0, 120),
|
||||
});
|
||||
res.status(201).json({ nachricht });
|
||||
} catch (fehler) {
|
||||
console.error("[chat] GIF schicken:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
}
|
||||
});
|
||||
|
||||
/** Einen Anhang ansehen oder laden.
|
||||
*
|
||||
* Die Kennung ist die der NACHRICHT, nicht die der Datei. Damit
|
||||
|
||||
@@ -4505,6 +4505,59 @@ export function db() {
|
||||
CREATE INDEX IF NOT EXISTS idx_chat_erwaehnungen_person
|
||||
ON chat_erwaehnungen (person_id, nachricht_id);
|
||||
|
||||
/* DIE GIF-KISTE DES RUDELS (23.09.2026).
|
||||
|
||||
Filipe: "dan will ich auch dass man im chat auch
|
||||
sprachnachrichten und gifts reinschicken kann. also nur die
|
||||
modis rechte linke hand und dogfather."
|
||||
|
||||
WARUM EINE EIGENE KISTE UND KEIN ANSCHLUSS AN GIPHY ODER
|
||||
TENOR: Beide brauchen ein Konto, einen Schluessel und schicken
|
||||
bei jedem Tastendruck mit, wonach hier gesucht wird -- an eine
|
||||
fremde Firma, aus einem Arbeitsplatz heraus, in dem sonst
|
||||
nichts nach aussen geht. Dazu kosten sie ab einer Menge Geld.
|
||||
Beides steht quer zu dem, wie dieses Haus gebaut ist.
|
||||
|
||||
Die Kiste kostet nichts, laeuft auf demselben Server wie alles
|
||||
andere, und sie wird mit der Zeit besser statt schlechter: Was
|
||||
das Team hineinlegt, hat das Team ausgesucht. Ein fremder
|
||||
Katalog mit zehn Millionen Eintraegen ist nicht mehr Auswahl,
|
||||
sondern weniger -- man sucht laenger und findet Fremdes.
|
||||
|
||||
WARUM EINE EIGENE TABELLE UND NICHT EINFACH ALTE NACHRICHTEN
|
||||
DURCHSUCHEN: Ein GIF in der Kiste ist etwas anderes als ein
|
||||
GIF, das jemand einmal geschickt hat. Die Kiste ist eine
|
||||
Entscheidung ("das wollen wir wieder benutzen"), der Verlauf
|
||||
ist eine Geschichte. Und ein Verlauf laesst sich wegraeumen --
|
||||
die Kiste duerfte davon nicht leer werden.
|
||||
|
||||
"pruef" IST DER INHALTSSCHLUESSEL (SHA-256 der Datei). Er
|
||||
beantwortet "haben wir das schon?" richtig, naemlich am
|
||||
Inhalt: Dasselbe GIF unter drei Namen ist dreimal dieselbe
|
||||
Kachel in der Auswahl. Ueber den Namen zu vergleichen waere
|
||||
die naheliegende Abkuerzung -- und sie versagt genau dort, wo
|
||||
Dateien "giphy.gif", "giphy(1).gif", "download.gif" heissen,
|
||||
also fast immer.
|
||||
|
||||
KEIN ON DELETE CASCADE AUF personen: Wer das Haus verlaesst,
|
||||
nimmt die GIFs des Teams nicht mit. "von_id" wird null, die
|
||||
Kachel bleibt. */
|
||||
CREATE TABLE IF NOT EXISTS chat_gifs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
datei TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
pruef TEXT NOT NULL UNIQUE,
|
||||
typ TEXT NOT NULL,
|
||||
groesse INTEGER NOT NULL,
|
||||
breite INTEGER,
|
||||
hoehe INTEGER,
|
||||
von_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||||
erstellt TEXT NOT NULL
|
||||
);
|
||||
/* Gezeigt wird "das Neueste zuerst" -- wer gerade etwas
|
||||
hineingelegt hat, findet es oben. */
|
||||
CREATE INDEX IF NOT EXISTS idx_chat_gifs_neu ON chat_gifs (id DESC);
|
||||
|
||||
/* REAKTIONEN (14.09.2026).
|
||||
|
||||
Filipe: "ich will dass man auf die nachrichten auch reagieren
|
||||
|
||||
@@ -60,11 +60,33 @@ scp -q dogfather-server:/home/dogiweb/workspace-daten/sicherungen/*.db "$ZIEL/"
|
||||
# Zug eingetragen -- nicht spaeter, wenn es auffaellt: Genau so ist die
|
||||
# Luecke bei den Profilbildern entstanden.
|
||||
#
|
||||
# MATERIAL FEHLTE -- GEFUNDEN AM 23.09.2026, NICHT BEMERKT SEIT DEM
|
||||
# 22.09.
|
||||
#
|
||||
# server/workspace-material.js legt seit dem 22.09. einen Ordner
|
||||
# "material" an (2,4 MB auf dem Server). Er stand hier nicht. Nach
|
||||
# einem Plattenausfall waere die Materialbibliothek weg gewesen, ohne
|
||||
# dass die taegliche Meldung je etwas gesagt haette -- genau die
|
||||
# Luecke, wegen der diese Probe ueberhaupt gebaut wurde.
|
||||
#
|
||||
# Gefunden hat es nicht das Lesen, sondern tools/wiederherstellung-
|
||||
# proben.mjs: Sie liest die Ordner aus dem Quelltext (join(DATEN_ORDNER,
|
||||
# "...")) und vergleicht sie mit dieser Zeile. Das ist der Unterschied
|
||||
# zwischen einer Liste, die jemand pflegen muss, und einer, die
|
||||
# nachgezaehlt wird.
|
||||
#
|
||||
# DIE GIF-KISTE GEHOERT DAZU (ergaenzt 23.09.2026, im selben Zug wie
|
||||
# die Funktion -- nicht spaeter, wenn es auffaellt). Sie liegt in
|
||||
# chat-gifs/ und ist das einzige, was NUR dort liegt: Verschickte GIFs
|
||||
# sind Kopien in chat-anhaenge/, die Kiste selbst nicht. Ginge die
|
||||
# Platte kaputt, waere ohne diesen Eintrag die gesammelte Auswahl des
|
||||
# Teams weg, und die Nachrichten damit auch nicht mehr nachlegbar.
|
||||
#
|
||||
# Wer hier einen Ordner ergaenzt, traegt ihn auch in ORDNER unten ein;
|
||||
# die Probe vergleicht die Liste gegen die Ordner, die der Server
|
||||
# wirklich benutzt, und schlaegt bei einem vergessenen an.
|
||||
echo "Hole hochgeladene Dateien, Bilder, Anhaenge und die Bibliothek ..."
|
||||
ORDNER="dateien wissen profilbilder chat-anhaenge"
|
||||
ORDNER="dateien wissen profilbilder chat-anhaenge chat-gifs material"
|
||||
for o in $ORDNER; do
|
||||
mkdir -p "$ZIEL/$o"
|
||||
scp -qr "dogfather-server:/home/dogiweb/workspace-daten/$o/." "$ZIEL/$o/" 2>/dev/null || true
|
||||
|
||||
@@ -212,9 +212,22 @@ ok(dateienZahl > 0,
|
||||
: `alle ${benutzt.size} holt tools/sicherung-holen.sh (${geholt.join(", ")})`);
|
||||
|
||||
/* GEGENPROBE: Erkennt der Vergleich einen fehlenden Ordner ueberhaupt?
|
||||
Ohne sie bewiese "nichts fehlt" nur, dass die Suche nichts findet. */
|
||||
ok([...benutzt, "erfundenerordner"].filter((o) => !geholt.includes(o)).length === 1,
|
||||
"Gegenprobe: ein erfundener Ordner WIRD als fehlend erkannt");
|
||||
Ohne sie bewiese "nichts fehlt" nur, dass die Suche nichts findet.
|
||||
|
||||
GEZAEHLT WIRD DIE DIFFERENZ, NICHT DIE SUMME (berichtigt am
|
||||
23.09.2026). Hier stand `=== 1` -- und das setzte voraus, dass
|
||||
sonst nichts fehlt. An dem Tag, an dem wirklich etwas fehlte
|
||||
(material), wurde die Gegenprobe rot und zeigte damit auf sich
|
||||
selbst statt auf den Fund: zwei Meldungen, eine Ursache, und die
|
||||
zweite lenkt von der ersten ab.
|
||||
|
||||
Eine Gegenprobe soll beweisen, dass der Vergleich REAGIERT. Das
|
||||
tut sie, wenn ein zusaetzlicher Ordner die Zahl um genau eins
|
||||
erhoeht -- unabhaengig davon, wie sie vorher stand. */
|
||||
const fehlendJetzt = fehlend.length;
|
||||
ok([...benutzt, "erfundenerordner"].filter((o) => !geholt.includes(o)).length
|
||||
=== fehlendJetzt + 1,
|
||||
`Gegenprobe: ein erfundener Ordner WIRD als fehlend erkannt (${fehlendJetzt} -> ${fehlendJetzt + 1})`);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
|
||||
@@ -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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<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=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/anruf-probe.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609230207",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609230207",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609230207",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609230207",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -2838,3 +2838,148 @@
|
||||
.tonleiste__punkt { background: CanvasText; }
|
||||
.chat__ton[data-laeuft="ja"] { border: 2px solid Highlight; }
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE GIF-KISTE (23.09.2026)
|
||||
|
||||
Filipe: „dan will ich auch dass man im chat auch sprachnachrichten
|
||||
und gifts reinschicken kann."
|
||||
|
||||
AUGENSCHONEND IST HIER EINE ECHTE FRAGE, keine Formsache: Zwölf
|
||||
gleichzeitig laufende Bildchen sind das Gegenteil von ruhig. Wer
|
||||
`prefers-reduced-motion` gesetzt hat, bekommt deshalb stehende
|
||||
Bilder (chat.js malt das erste Einzelbild auf eine Zeichenfläche)
|
||||
und sieht eines erst laufen, wenn er es anfasst. Für alle anderen
|
||||
laufen sie -- eine GIF-Auswahl, in der sich nichts bewegt, ist eine,
|
||||
in der man nicht sieht, was man verschickt.
|
||||
|
||||
DIE TAFEL IST GEDECKELT (48 vh). Ohne Deckel wächst sie mit der
|
||||
Kiste, und irgendwann steht sie über dem ganzen Verlauf.
|
||||
===================================================================== */
|
||||
|
||||
.chat__gif {
|
||||
flex: none;
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
/* Dieselben 40 px wie Büroklammer und Mikrofon daneben. */
|
||||
width: 40px; height: 40px;
|
||||
border: 0; border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--text-leise);
|
||||
font: 700 .68rem/1 var(--schrift, inherit);
|
||||
letter-spacing: .04em;
|
||||
cursor: pointer;
|
||||
transition: background var(--tempo, .18s) ease, color var(--tempo, .18s) ease;
|
||||
}
|
||||
.chat__gif:hover { background: rgba(255, 255, 255, .07); color: var(--text); }
|
||||
.chat__gif:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||
.chat__gif[aria-expanded="true"] {
|
||||
background: color-mix(in srgb, var(--akzent) 20%, transparent);
|
||||
color: color-mix(in srgb, var(--akzent) 60%, #ffffff);
|
||||
}
|
||||
|
||||
/* Dieselbe Verankerung wie Emoji-Tafel und Erwähnliste: über der
|
||||
Schreibzeile, damit sie dort aufgeht, wo man schreibt. */
|
||||
.gif-tafel {
|
||||
position: absolute;
|
||||
bottom: 100%; left: 0; right: 0;
|
||||
z-index: 30;
|
||||
margin-bottom: 8px;
|
||||
padding: 10px;
|
||||
max-height: 48vh;
|
||||
overflow: auto;
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: var(--radius-klein, 12px);
|
||||
background: var(--flaeche, rgba(14, 20, 30, .98));
|
||||
box-shadow: 0 12px 30px -12px rgba(0, 0, 0, .7);
|
||||
}
|
||||
.gif-tafel__kopf {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
margin: 0 0 9px;
|
||||
}
|
||||
.gif-tafel__suchschild {
|
||||
/* Für Vorleseprogramme da, für das Auge nicht -- daneben steht schon
|
||||
ein Platzhalter, und zwei Beschriftungen für ein Feld sind eine zu
|
||||
viel. */
|
||||
position: absolute; width: 1px; height: 1px;
|
||||
overflow: hidden; clip-path: inset(50%); white-space: nowrap;
|
||||
}
|
||||
.gif-tafel__suche {
|
||||
flex: 1 1 auto; min-width: 0;
|
||||
padding: 8px 10px;
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: 9px;
|
||||
background: rgba(255, 255, 255, .04);
|
||||
color: var(--text);
|
||||
font-size: .9rem;
|
||||
}
|
||||
.gif-tafel__suche:focus-visible { outline: 2px solid var(--akzent); outline-offset: -1px; }
|
||||
.gif-tafel__dazu {
|
||||
flex: none;
|
||||
/* 40 px hoch wie alles, was ein Daumen trifft. */
|
||||
min-height: 40px;
|
||||
padding: 0 12px;
|
||||
border: 1px solid color-mix(in srgb, var(--akzent) 40%, transparent);
|
||||
border-radius: 9px;
|
||||
background: color-mix(in srgb, var(--akzent) 14%, transparent);
|
||||
color: color-mix(in srgb, var(--akzent) 58%, #ffffff);
|
||||
font-size: .82rem; font-weight: 600;
|
||||
cursor: pointer;
|
||||
}
|
||||
.gif-tafel__dazu:hover { background: color-mix(in srgb, var(--akzent) 24%, transparent); }
|
||||
.gif-tafel__dazu:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||
|
||||
.gif-tafel__gitter {
|
||||
display: grid;
|
||||
/* auto-fill statt auto-fit: Bei zwei GIFs sollen zwei Kacheln
|
||||
dastehen und nicht zwei auf halbe Bildschirmbreite gezogene --
|
||||
derselbe Unterschied wie bei der Personenwahl am 22.09. */
|
||||
grid-template-columns: repeat(auto-fill, minmax(112px, 1fr));
|
||||
gap: 8px;
|
||||
}
|
||||
.gif-kachel { position: relative; }
|
||||
.gif-kachel__knopf {
|
||||
display: block; width: 100%;
|
||||
padding: 0;
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: 10px;
|
||||
background: rgba(255, 255, 255, .03);
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
/* Feste Höhe: Ohne sie springt das Gitter, während die Bilder
|
||||
nacheinander ankommen -- und man tippt auf das, was gerade
|
||||
weggerutscht ist. */
|
||||
aspect-ratio: 1 / 1;
|
||||
}
|
||||
.gif-kachel__knopf:hover { border-color: color-mix(in srgb, var(--akzent) 50%, transparent); }
|
||||
.gif-kachel__knopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||
.gif-kachel__bild {
|
||||
display: block; width: 100%; height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
.gif-kachel__weg {
|
||||
position: absolute; top: 4px; right: 4px;
|
||||
/* 28 px, und das ist eine Abwägung: Ein Daumenziel von 44 px würde
|
||||
hier die halbe Kachel verdecken und beim Verschicken im Weg
|
||||
stehen. Ein Fehlgriff kostet nichts -- es kommt eine Rückfrage. */
|
||||
width: 28px; height: 28px;
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
border: 0; border-radius: 50%;
|
||||
background: rgba(8, 12, 20, .78);
|
||||
color: #e6edf6;
|
||||
font-size: .74rem; line-height: 1;
|
||||
cursor: pointer;
|
||||
}
|
||||
.gif-kachel__weg:hover { background: rgba(8, 12, 20, .94); }
|
||||
.gif-kachel__weg:focus-visible { outline: 2px solid var(--akzent); outline-offset: 1px; }
|
||||
|
||||
.gif-tafel__leer {
|
||||
margin: 10px 4px 4px;
|
||||
font-size: .86rem; line-height: 1.55;
|
||||
color: var(--text-leise);
|
||||
}
|
||||
|
||||
@media (forced-colors: active) {
|
||||
.gif-tafel { border: 1px solid CanvasText; }
|
||||
.gif-kachel__knopf { border: 1px solid CanvasText; }
|
||||
.chat__gif[aria-expanded="true"] { border: 2px solid Highlight; }
|
||||
}
|
||||
|
||||
@@ -786,6 +786,8 @@
|
||||
Ueberlegung wie bei darf_anheften und darf_alles_loeschen. */
|
||||
const mikro = $('ton-auf');
|
||||
if (mikro) mikro.hidden = !daten.darf_ton;
|
||||
const gifKnopf = $('gif-auf');
|
||||
if (gifKnopf) gifKnopf.hidden = !daten.darf_gif;
|
||||
/* 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
|
||||
@@ -2797,6 +2799,236 @@
|
||||
z.dataset.eng = rest <= 100 ? 'ja' : 'nein';
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE GIF-KISTE DES RUDELS (23.09.2026)
|
||||
=====================================================================
|
||||
|
||||
Filipe: „dan will ich auch dass man im chat auch sprachnachrichten
|
||||
und gifts reinschicken kann. also nur die modis rechte linke hand
|
||||
und dogfather."
|
||||
|
||||
Ich lese „gifts" als GIFs -- die bewegten Bildchen -- und sage das
|
||||
ausdruecklich, statt es stillschweigend anzunehmen.
|
||||
|
||||
WARUM EINE EIGENE KISTE UND KEIN GIPHY: Die Begruendung steht im
|
||||
Server bei der Tabelle. Kurz: fremder Schluessel, fremde Firma,
|
||||
jede Suche geht hinaus, und ab einer Menge kostet es. Was hier
|
||||
liegt, hat das Team hineingelegt -- und zehn gute GIFs, die alle
|
||||
kennen, sind im Alltag mehr wert als zehn Millionen fremde.
|
||||
|
||||
AUGENSCHONEND, UND DAS IST HIER EINE ECHTE FRAGE: Eine Wand aus
|
||||
zwoelf gleichzeitig laufenden Bildchen ist das Gegenteil von
|
||||
ruhig. Wer `prefers-reduced-motion` gesetzt hat, bekommt deshalb
|
||||
STEHENDE Bilder (das erste Einzelbild, im Browser auf eine
|
||||
Zeichenflaeche gemalt) und sieht ein GIF erst dann laufen, wenn er
|
||||
es anfasst oder mit der Tastatur darauf steht. Fuer alle anderen
|
||||
laufen sie -- eine GIF-Auswahl, in der sich nichts bewegt, ist
|
||||
eine, in der man nicht sieht, was man verschickt.
|
||||
===================================================================== */
|
||||
|
||||
let gifs = [];
|
||||
let gifsGeholt = false;
|
||||
|
||||
const ruhigerModus = () => {
|
||||
try { return window.matchMedia('(prefers-reduced-motion: reduce)').matches; }
|
||||
catch { return false; }
|
||||
};
|
||||
|
||||
async function gifsHolen({ frisch = false } = {}) {
|
||||
if (gifsGeholt && !frisch) return;
|
||||
try {
|
||||
const a = await hole('/workspace/api/chat/gifs');
|
||||
if (!a.ok) return;
|
||||
const j = await a.json();
|
||||
gifs = Array.isArray(j.gifs) ? j.gifs : [];
|
||||
gifsGeholt = true;
|
||||
} catch { /* ohne Kiste geht der Chat weiter */ }
|
||||
}
|
||||
|
||||
/** Das erste Einzelbild auf eine Zeichenflaeche malen.
|
||||
*
|
||||
* So steht ein GIF still, ohne dass irgendwo eine zweite Datei
|
||||
* liegen muesste. Der Browser malt beim Zeichnen das Bild, das
|
||||
* gerade dran ist -- unmittelbar nach dem Laden ist das das erste. */
|
||||
function standbildBauen(g) {
|
||||
const flaeche = document.createElement('canvas');
|
||||
flaeche.className = 'gif-kachel__bild';
|
||||
const bild = new Image();
|
||||
bild.addEventListener('load', () => {
|
||||
flaeche.width = bild.naturalWidth || 1;
|
||||
flaeche.height = bild.naturalHeight || 1;
|
||||
try { flaeche.getContext('2d').drawImage(bild, 0, 0); } catch { /* egal */ }
|
||||
});
|
||||
bild.src = g.weg;
|
||||
return flaeche;
|
||||
}
|
||||
|
||||
function bewegtBauen(g) {
|
||||
const bild = document.createElement('img');
|
||||
bild.className = 'gif-kachel__bild';
|
||||
bild.src = g.weg;
|
||||
bild.alt = g.name || 'GIF';
|
||||
bild.loading = 'lazy';
|
||||
bild.decoding = 'async';
|
||||
return bild;
|
||||
}
|
||||
|
||||
function gifTafelZeichnen() {
|
||||
const gitter = $('gif-gitter');
|
||||
const leer = $('gif-leer');
|
||||
if (!gitter) return;
|
||||
const suche = ($('gif-suche')?.value || '').trim().toLowerCase();
|
||||
const zeigen = suche
|
||||
? gifs.filter((g) => String(g.name || '').toLowerCase().includes(suche))
|
||||
: gifs;
|
||||
gitter.replaceChildren();
|
||||
if (leer) {
|
||||
leer.hidden = zeigen.length > 0;
|
||||
/* DER SATZ PASST ZUR LAGE. „Die Kiste ist leer" waere falsch,
|
||||
wenn nur die Suche nichts findet -- und man legte ein GIF
|
||||
hinein, das schon drin ist. */
|
||||
leer.textContent = gifs.length === 0
|
||||
? 'Die Kiste ist noch leer. Leg das erste GIF hinein – alle aus dem Team sehen es dann auch.'
|
||||
: `Nichts gefunden zu „${suche}". Insgesamt liegen ${gifs.length} GIFs in der Kiste.`;
|
||||
}
|
||||
const ruhig = ruhigerModus();
|
||||
for (const g of zeigen) {
|
||||
const kachel = el('div', 'gif-kachel');
|
||||
const knopf = el('button', 'gif-kachel__knopf');
|
||||
knopf.type = 'button';
|
||||
knopf.title = `${g.name}${g.von ? ' · von ' + g.von : ''}`;
|
||||
knopf.setAttribute('aria-label', `GIF ${g.name} schicken`);
|
||||
knopf.append(ruhig ? standbildBauen(g) : bewegtBauen(g));
|
||||
if (ruhig) {
|
||||
/* Beim Anfassen laeuft es doch -- sonst waehlt man blind. */
|
||||
const bewegen = () => {
|
||||
if (knopf.dataset.bewegt === 'ja') return;
|
||||
knopf.dataset.bewegt = 'ja';
|
||||
knopf.replaceChildren(bewegtBauen(g));
|
||||
};
|
||||
knopf.addEventListener('mouseenter', bewegen);
|
||||
knopf.addEventListener('focus', bewegen);
|
||||
}
|
||||
knopf.addEventListener('click', () => void gifSchicken(g));
|
||||
kachel.append(knopf);
|
||||
|
||||
/* HERAUSNEHMEN: Der Knopf steht an jeder Kachel und nicht in
|
||||
einem Menue dahinter. Die Kiste gehoert allen; ein GIF, das
|
||||
nicht mehr passt, muss man wegnehmen koennen, ohne zu suchen,
|
||||
wie das geht. Der Server sagt Nein, wenn man nicht darf --
|
||||
dann steht es als Satz da, nicht als nichts. */
|
||||
const weg = el('button', 'gif-kachel__weg', '\u2715');
|
||||
weg.type = 'button';
|
||||
weg.title = 'Aus der Kiste nehmen';
|
||||
weg.setAttribute('aria-label', `GIF ${g.name} aus der Kiste nehmen`);
|
||||
weg.addEventListener('click', async (e) => {
|
||||
e.stopPropagation();
|
||||
if (!confirm(`„${g.name}" aus der Kiste nehmen? Verschickte GIFs bleiben stehen.`)) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/gifs/${g.id}`, { method: 'DELETE' });
|
||||
const j = await a.json().catch(() => ({}));
|
||||
if (!a.ok) { melde(sagWas(j.fehler, 'Ging nicht.')); return; }
|
||||
gifs = Array.isArray(j.gifs) ? j.gifs : gifs.filter((x) => x.id !== g.id);
|
||||
gifTafelZeichnen();
|
||||
melde('Aus der Kiste genommen.', 'hinweis');
|
||||
} catch { melde('Keine Verbindung.'); }
|
||||
});
|
||||
kachel.append(weg);
|
||||
gitter.append(kachel);
|
||||
}
|
||||
}
|
||||
|
||||
async function gifSchicken(g) {
|
||||
if (!offen || schicktGerade) return;
|
||||
schicktGerade = true;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/raeume/${offen.id}/gif`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ gif_id: g.id, text: $('text').value.trim() }),
|
||||
});
|
||||
const j = await a.json().catch(() => ({}));
|
||||
if (!a.ok) { melde(sagWas(j.fehler, 'Ging nicht.')); return; }
|
||||
/* DIE TAFEL GEHT ZU. Wer ein GIF geschickt hat, will sehen, wie
|
||||
es ankommt -- und die Tafel steht genau davor. */
|
||||
const tafel = $('gif-tafel');
|
||||
if (tafel) { tafel.hidden = true; $('gif-auf')?.setAttribute('aria-expanded', 'false'); }
|
||||
nachrichtUebernehmen(j.nachricht);
|
||||
} catch {
|
||||
melde('Keine Verbindung – das GIF wurde nicht geschickt.');
|
||||
} finally {
|
||||
schicktGerade = false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Ein GIF in die Kiste legen. */
|
||||
async function gifDazu(datei) {
|
||||
if (!datei) return;
|
||||
if (datei.type !== 'image/gif') { melde('In die Kiste kommen nur GIFs.'); return; }
|
||||
let anzeige = null;
|
||||
try {
|
||||
let lauf = null;
|
||||
anzeige = hochladeAnzeige($('anhang-fortschritt'), datei.name || 'GIF',
|
||||
() => lauf && lauf.abbrechen());
|
||||
lauf = hochladen('/workspace/api/chat/gifs', datei, {
|
||||
kopf: {
|
||||
'Content-Type': 'image/gif',
|
||||
'X-Dateiname': encodeURIComponent(datei.name || 'GIF'),
|
||||
},
|
||||
beiFortschritt: anzeige.fortschritt,
|
||||
beiVerarbeitung: anzeige.verarbeiten,
|
||||
});
|
||||
const ergebnis = await lauf.fertig;
|
||||
if (ergebnis.abgebrochen) { anzeige.abschluss('Abgebrochen.'); anzeige = null; return; }
|
||||
if (!ergebnis.ok) {
|
||||
melde(ergebnis.netz ? 'Keine Verbindung – das GIF wurde nicht hinterlegt.'
|
||||
: sagWas(ergebnis.daten?.fehler, 'Ging nicht.'));
|
||||
return;
|
||||
}
|
||||
await gifsHolen({ frisch: true });
|
||||
gifTafelZeichnen();
|
||||
melde(ergebnis.daten?.schon
|
||||
/* DASSELBE GIF ZWEIMAL IST KEIN FEHLER -- es ist drin, und
|
||||
genau das wollte man. Verglichen wird am INHALT, nicht am
|
||||
Namen: "giphy.gif", "giphy(1).gif" und "download.gif" sind
|
||||
sonst drei Kacheln fuer ein Bild. */
|
||||
? 'Das lag schon in der Kiste.'
|
||||
: 'In die Kiste gelegt – alle aus dem Team sehen es jetzt auch.', 'hinweis');
|
||||
} catch {
|
||||
melde('Keine Verbindung – das GIF wurde nicht hinterlegt.');
|
||||
} finally {
|
||||
if (anzeige) anzeige.weg();
|
||||
}
|
||||
}
|
||||
|
||||
$('gif-auf')?.addEventListener('click', async () => {
|
||||
const tafel = $('gif-tafel');
|
||||
if (!tafel) return;
|
||||
const auf = tafel.hidden;
|
||||
if (auf) {
|
||||
await gifsHolen();
|
||||
gifTafelZeichnen();
|
||||
}
|
||||
tafel.hidden = !auf;
|
||||
$('gif-auf').setAttribute('aria-expanded', String(auf));
|
||||
if (auf) $('gif-suche')?.focus();
|
||||
});
|
||||
$('gif-suche')?.addEventListener('input', gifTafelZeichnen);
|
||||
$('gif-dazu')?.addEventListener('click', () => $('gif-feld')?.click());
|
||||
$('gif-feld')?.addEventListener('change', () => {
|
||||
const datei = $('gif-feld').files?.[0];
|
||||
$('gif-feld').value = '';
|
||||
if (datei) void gifDazu(datei);
|
||||
});
|
||||
/* Ein Klick daneben schliesst die Kiste -- wie bei der Emoji-Tafel. */
|
||||
document.addEventListener('click', (e) => {
|
||||
const tafel = $('gif-tafel');
|
||||
if (!tafel || tafel.hidden) return;
|
||||
if (tafel.contains(e.target) || e.target.closest('#gif-auf')) return;
|
||||
tafel.hidden = true;
|
||||
$('gif-auf')?.setAttribute('aria-expanded', 'false');
|
||||
});
|
||||
|
||||
/* ---------- Emoji-Auswahl -------------------------------------------------
|
||||
Eine kleine, feste Auswahl statt einer vollstaendigen Tafel: Diese
|
||||
dreissig decken den Alltag ab, und sie laden nichts nach. Eine
|
||||
|
||||
+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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609230207"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/zuteilung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -168,15 +168,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -197,15 +197,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/textform.js?v=202609230207"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -80,15 +80,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -89,15 +89,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609230207" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+55
-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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -352,6 +352,42 @@
|
||||
<path d="M6.4 11a5.6 5.6 0 0 0 11.2 0M12 16.6V20M9.2 20h5.6" />
|
||||
</svg>
|
||||
</button>
|
||||
<!-- DIE GIF-KISTE (23.09.2026)
|
||||
Filipe: „dan will ich auch dass man im chat auch
|
||||
sprachnachrichten und gifts reinschicken kann."
|
||||
|
||||
Ich lese „gifts" als GIFs und sage das ausdrücklich.
|
||||
|
||||
EIGENE KISTE STATT GIPHY: Ein fremder Anbieter bräuchte
|
||||
einen Schlüssel, ein Konto und bekäme bei jedem
|
||||
Tastendruck mit, wonach hier gesucht wird — aus einem
|
||||
Arbeitsplatz heraus, in dem sonst nichts nach außen geht.
|
||||
Was in dieser Kiste liegt, hat das Team selbst
|
||||
hineingelegt.
|
||||
|
||||
Der Knopf steht von Haus aus auf `hidden`; ob er
|
||||
erscheint, sagt der Server mit `darf_gif`. -->
|
||||
<button type="button" class="chat__gif" id="gif-auf" hidden
|
||||
aria-expanded="false" aria-controls="gif-tafel"
|
||||
aria-label="GIF schicken" title="GIF schicken">GIF</button>
|
||||
<input type="file" id="gif-feld" class="chat__anhang-feld"
|
||||
accept="image/gif" tabindex="-1" aria-hidden="true" />
|
||||
<div class="gif-tafel" id="gif-tafel" hidden role="group"
|
||||
aria-label="GIF aus der Kiste schicken">
|
||||
<div class="gif-tafel__kopf">
|
||||
<label class="gif-tafel__suchschild" for="gif-suche">Suchen</label>
|
||||
<input type="search" id="gif-suche" class="gif-tafel__suche"
|
||||
placeholder="Suchen …" autocomplete="off" />
|
||||
<button type="button" class="gif-tafel__dazu" id="gif-dazu">
|
||||
+ GIF hinzufügen
|
||||
</button>
|
||||
</div>
|
||||
<div class="gif-tafel__gitter" id="gif-gitter"></div>
|
||||
<p class="gif-tafel__leer" id="gif-leer" hidden>
|
||||
Die Kiste ist noch leer. Leg das erste GIF hinein – alle aus dem
|
||||
Team sehen es dann auch.
|
||||
</p>
|
||||
</div>
|
||||
<textarea id="text" rows="1" maxlength="4000"
|
||||
placeholder="Nachricht schreiben …"
|
||||
title="Enter schickt ab, Umschalt+Enter macht eine neue Zeile, @ erwähnt jemanden"></textarea>
|
||||
@@ -460,25 +496,25 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609230151"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207"></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=202609230151"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151"></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151"></script>
|
||||
<script src="assets/js/textform.js?v=202609230207"></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207"></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207"></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=202609230151"></script>
|
||||
<script src="assets/js/chat.js?v=202609230151"></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/anruf.js?v=202609230207"></script>
|
||||
<script src="assets/js/chat.js?v=202609230207"></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -179,15 +179,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/content.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/content.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
@@ -459,7 +459,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,25 +23,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609230207",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609230207",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609230207",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609230151",
|
||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609230207",
|
||||
"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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,15 +108,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -262,15 +262,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -146,13 +146,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
|
||||
|
||||
<script src="assets/js/gate.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/gate.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -383,15 +383,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -444,13 +444,13 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151"></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151"></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151"></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151"></script>
|
||||
<script src="assets/js/leistung.js?v=202609230151"></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207"></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207"></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207"></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207"></script>
|
||||
<script src="assets/js/leistung.js?v=202609230207"></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/material.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/material.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/material.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -453,14 +453,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -214,16 +214,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -106,17 +106,17 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/ki.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/report.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/report.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -173,14 +173,14 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -684,16 +684,16 @@
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/live.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/start.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/live.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/start.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -85,16 +85,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/ki.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -150,16 +150,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -111,14 +111,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -110,15 +110,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/team.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/team.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/holen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -112,14 +112,14 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -126,13 +126,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -248,13 +248,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=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -149,16 +149,16 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -335,13 +335,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/live.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/live.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -144,13 +144,13 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</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=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/willkommen.js?v=202609230207" 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=202609230151" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230151" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609230207" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609230207" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609230207" />
|
||||
<!-- 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=202609230151" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609230207" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -190,15 +190,15 @@
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/meldung.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/hochladen.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609230207" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609230151" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/installieren.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609230207" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609230207" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user