Support: melden mit Bild, und für die Leitung ein Eingang
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
benutzen kann. jeder kann da probleme von der seite melden und
hinweisen. fotos mit schicken mit einem text. … so einfach wie
möglich, will nichts kompliziertes oder zu viel. kurz und knapp …
bei dogfather und der rechten hand soll die kachel anders gebaut sein
weil die sind die die sich um die probleme kümmern."
WARUM DAS NICHT DER VORHANDENE MELDEWEG IST. Es gibt ihn schon
(hilfe.html) und er sieht aehnlich aus. Drei Unterschiede machen ihn
zu etwas anderem:
1. Er ist NICHT fuer alle -- in rechte.js steht
`["gast","hand","admin"]`. Modis, Creator, Scouts, Manager und
die linke Hand hatten gar keinen Weg, einen kaputten Knopf zu
melden.
2. Er kann keine Bilder. Bei „der Knopf tut nichts" ist ein
Bildschirmfoto die halbe Antwort.
3. Er ist bewusst schwer: strikter Wechsel, hoechstens drei offene
Faelle, ein Betreff. Richtig bei einem Vorfall zwischen
Menschen, zu viel fuer „das Datum steht falsch da".
Deshalb eigen und sehr kurz: EIN Feld, EIN Bild, fertig. Kein
Betreff, keine Kategorie, keine Dringlichkeitsstufe -- wer ein
Formular mit fuenf Feldern sieht, meldet den kleinen Fehler nicht,
und genau die kleinen erfaehrt sonst niemand.
DIE LEITUNG SIEHT ETWAS ANDERES: einen Eingang mit Zahlenband
(neu / in Arbeit / erledigt), drei Filtern und zwei Handgriffen --
„Ich kuemmere mich" und „Erledigt …". Zwei, nicht fuenf; eine
Zuweisung an eine Person und Prioritaeten waeren ein Ticketsystem
fuer zwei Menschen, die nebeneinander sitzen. Das Melde-Feld bleibt
auch fuer sie da, rutscht aber unter den Eingang.
Wer zumacht, schreibt einen Satz dazu -- der Melder sieht nur diesen
Satz, und ohne ihn weiss er nicht, ob etwas behoben wurde oder ob
niemand Zeit hatte. Beide Seiten bekommen eine Benachrichtigung.
UEBERNOMMEN STATT NEU ERFUNDEN:
* `dateiErkennen` aus workspace-chat.js -- EXPORTIERT, nicht
abgeschrieben. An ihr haengt die ganze Sicherheit der Uploads
(der Typ kommt aus den ersten Bytes, nicht aus Name oder
Content-Type), und eine zweite Fassung waere die, die beim
naechsten Dateiformat vergessen wird.
* Die zweigeteilte Sicht und `meldungFuer()` (gibt den Datensatz
oder null zurueck, nie true/false) aus dem vertraulichen
Meldeweg.
* Der Upload-Weg (express.raw, Text im Kopf, Ordner unter
DATEN_ORDNER, damit die Sicherungspruefung ihn findet).
DIE KACHEL BEKOMMT JEDER -- an EINER Stelle angehaengt: `bereicheFuer`
haengt sie an jede Rollenliste, statt sie in fuenf Listen
einzutragen. Genau so ist heute der Benachrichtigungs-Knopf auf 14
Seiten verschwunden. Dazu der Eintrag in rechte.js (ohne ihn
verschwindet die Kachel lautlos, `nurOffeneKacheln` filtert dagegen)
und in der Browser-Kachelliste fuer die Agentur-Rollen.
TON 44 GERECHNET, NICHT GEWAEHLT -- und dabei zweimal danebengelegen:
* Ich habe erst einen eigenen Modus in kachel-farben.mjs gebaut.
`tools/kachel-farbe-einzeln.mjs` gibt es aber seit dem 22.09. fuer
genau diesen Zweck. Meine Dopplung ist wieder weg.
* Von Hand hatte ich #bcdbff eingetragen. pruef-kachelfarben lehnte
es ab (Buntheit 0,060, verlangt sind 0,12) -- und das vorhandene
Werkzeug verteidigte es trotzdem, weil sein Abstand gut war. Ein
Werkzeug, das einen regelwidrigen Zustand haelt, weil er zufaellig
gut misst, behebt genau den Fehler nicht, fuer den es da ist.
Behoben: Zuerst die Regeln, dann der Abstand. Ergebnis #fd6401,
Abstand 0,0914 (engstes vorhandenes Paar: 0,0154).
DREI MESSFEHLER VON MIR, die wie schwere Befunde aussahen: `fetch`
verwirft den Host-Kopf (die Community kommt nur auf crew. herein),
die Community bestaetigt ihr Alter (`alter_ok`), und die Startroute
heisst /api/ich. Alle drei stehen in pruef-treff.mjs richtig.
Ein ECHTER Fehler kam dazu: support.html lud bereiche.js nicht, und
kopf.js stuerzte mit „Cannot read properties of undefined (reading
'LEITUNG')" ab -- sichtbar nur in der Browserkonsole. Und
pruef-css-klassen fand sofort, dass auch wahl.js fehlte.
Gemessen: pruef-support 45 Pruefungen, 0 Fehler (alle neun Rollen
kommen herein, jede sieht die Kachel, als Bild getarntes HTML wird
abgelehnt, eine fremde Meldung bleibt fremd, erledigt bleibt
erledigt). Dazu 24 Messungen am Bild in drei Groessen. Gruen:
pruef-kachelfarben (22), pruef-css-klassen.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -37,6 +37,7 @@ import { auskunftRouter } from "./workspace-auskunft.js";
|
|||||||
import { uebernahmeRouter } from "./workspace-uebernahme.js";
|
import { uebernahmeRouter } from "./workspace-uebernahme.js";
|
||||||
import { befindenRouter } from "./workspace-befinden.js";
|
import { befindenRouter } from "./workspace-befinden.js";
|
||||||
import { hilfeRouter } from "./workspace-hilfe.js";
|
import { hilfeRouter } from "./workspace-hilfe.js";
|
||||||
|
import { supportRouter } from "./workspace-support.js";
|
||||||
import { reportRouter } from "./workspace-reports.js";
|
import { reportRouter } from "./workspace-reports.js";
|
||||||
import { scoutRouter } from "./workspace-scouts.js";
|
import { scoutRouter } from "./workspace-scouts.js";
|
||||||
import { callRouter } from "./workspace-calls.js";
|
import { callRouter } from "./workspace-calls.js";
|
||||||
@@ -309,6 +310,7 @@ app.use(auskunftRouter);
|
|||||||
app.use(uebernahmeRouter);
|
app.use(uebernahmeRouter);
|
||||||
app.use(befindenRouter);
|
app.use(befindenRouter);
|
||||||
app.use(hilfeRouter);
|
app.use(hilfeRouter);
|
||||||
|
app.use(supportRouter);
|
||||||
app.use(bewerbungRouter);
|
app.use(bewerbungRouter);
|
||||||
app.use(reportRouter);
|
app.use(reportRouter);
|
||||||
app.use(scoutRouter);
|
app.use(scoutRouter);
|
||||||
|
|||||||
@@ -0,0 +1,457 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
DER SUPPORT (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
|
||||||
|
benutzen kann. jeder kann da probleme von der seite melden und
|
||||||
|
hinweisen. fotos mit schicken mit einem text. … also bei dogfather
|
||||||
|
und der rechten hand soll die kachel anders gebaut sein weil die
|
||||||
|
sind die die sich um die probleme kümmern."
|
||||||
|
|
||||||
|
GEPRUEFT WIRD, WAS ER BESTELLT HAT — und drei Dinge, die er nicht
|
||||||
|
bestellt hat, weil sie sonst niemandem auffallen:
|
||||||
|
|
||||||
|
* JEDE Rolle sieht die Kachel und kommt auf die Seite. Nicht vier
|
||||||
|
von acht -- genau daran ist heute der Benachrichtigungs-Knopf
|
||||||
|
gescheitert.
|
||||||
|
* Eine fremde Meldung bleibt fremd. Wer meldet, sieht seine
|
||||||
|
eigene; alles andere gehoert der Leitung.
|
||||||
|
* Eine als Bild getarnte HTML-Datei kommt nicht herein. Das ist
|
||||||
|
der Standardfehler bei selbstgebauten Uploads und von aussen
|
||||||
|
nicht zu sehen.
|
||||||
|
===================================================================== */
|
||||||
|
import { mkdtempSync, rmSync } from "node:fs";
|
||||||
|
import { tmpdir } from "node:os";
|
||||||
|
import { join } from "node:path";
|
||||||
|
|
||||||
|
const ordner = mkdtempSync(join(tmpdir(), "ws-sup-"));
|
||||||
|
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
|
||||||
|
|
||||||
|
import { notbremse } from "./helfer-notbremse.mjs";
|
||||||
|
const { eigenerPort } = await import("./helfer-port.mjs");
|
||||||
|
const PORT = await eigenerPort(import.meta, "die Supportpruefung");
|
||||||
|
|
||||||
|
process.env.PORT = `${PORT}`;
|
||||||
|
process.env.SITE_ACCESS_SECRET = "lokaler-test";
|
||||||
|
process.env.SITE_ACCESS_CODE_DOGI = "DOGI-TEST-1";
|
||||||
|
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
|
||||||
|
|
||||||
|
const express = (await import("express")).default;
|
||||||
|
const ec = express.response.cookie;
|
||||||
|
express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); };
|
||||||
|
await import("./index.js");
|
||||||
|
notbremse(240_000, "pruef-support");
|
||||||
|
await new Promise((r) => setTimeout(r, 900));
|
||||||
|
const BASIS = `http://127.0.0.1:${PORT}`;
|
||||||
|
|
||||||
|
let fehler = 0, geprueft = 0;
|
||||||
|
const ok = (b, t) => { geprueft++; console.log((b ? " ok " : " FEHL ") + t); if (!b) fehler++; };
|
||||||
|
const melde = (t) => console.log(t);
|
||||||
|
|
||||||
|
const { DatabaseSync } = await import("node:sqlite");
|
||||||
|
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||||
|
const d = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||||
|
const jetzt = new Date().toISOString();
|
||||||
|
const kennSchluessel = randomBytes(32).toString("hex");
|
||||||
|
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
|
||||||
|
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
|
||||||
|
.run("code_kennung_schluessel", kennSchluessel, jetzt);
|
||||||
|
function anlegen(name, rolle, code) {
|
||||||
|
const salt = randomBytes(16).toString("hex");
|
||||||
|
const hash = scryptSync(code, salt, 64,
|
||||||
|
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
|
||||||
|
d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n,"
|
||||||
|
+ " code_kennung, aktiv, erstellt) VALUES (?,?,?,?,?,?,1,?)")
|
||||||
|
.run(name, rolle, hash, salt, 32768,
|
||||||
|
createHmac("sha256", kennSchluessel).update(code).digest("hex"), jetzt);
|
||||||
|
return d.prepare("SELECT last_insert_rowid() AS id").get().id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ALLE ACHT ROLLEN. „Die jeder sieht" heisst jede -- und die Liste
|
||||||
|
steht hier vollstaendig, damit eine fehlende auffaellt. */
|
||||||
|
const ROLLEN = [
|
||||||
|
["admin", "Filipe"], ["hand", "VanVan"], ["linke", "Funny"],
|
||||||
|
["modi", "Miss"], ["spicy", "Spicy Media"], ["manager", "Patrick"],
|
||||||
|
["scout", "Kevin"], ["creator", "Luna"], ["gast", "Community-Mitglied"],
|
||||||
|
];
|
||||||
|
const CODES = {};
|
||||||
|
for (const [i, [rolle, name]] of ROLLEN.entries()) {
|
||||||
|
CODES[rolle] = `CODE-S${String(i).padStart(2, "0")}-000001`;
|
||||||
|
anlegen(name, rolle, CODES[rolle]);
|
||||||
|
}
|
||||||
|
d.close();
|
||||||
|
|
||||||
|
/* ---------- Anmelden ohne Browser ------------------------------------
|
||||||
|
Die Sitzung kommt aus einem echten Anmelde-Aufruf; danach reist sie
|
||||||
|
als Keks mit. Ein Browser waere hier Aufwand ohne Gewinn -- geprueft
|
||||||
|
werden Wege, nicht Aussehen. */
|
||||||
|
/* DIE COMMUNITY KOMMT NUR AUF EINER ADRESSE HEREIN (gemessen, nicht
|
||||||
|
geraten): `crew.dogfather-universe.com`. Auf 127.0.0.1 antwortet
|
||||||
|
die Anmeldung mit 401 -- beim ersten Lauf stand deshalb
|
||||||
|
"gast: kommt nicht herein", und das sah aus wie ein schwerer
|
||||||
|
Befund am Support. Es war einer an meiner Messung.
|
||||||
|
|
||||||
|
Versucht wird zuerst ohne Host, dann mit -- so faellt auch auf,
|
||||||
|
wenn eine Rolle PLOETZLICH einen braucht. */
|
||||||
|
const CREW_HOST = "crew.dogfather-universe.com";
|
||||||
|
|
||||||
|
/* ZWEI DINGE, DIE ICH ERST NACH DREI FEHLLAEUFEN GEMESSEN HABE --
|
||||||
|
beide stehen in pruef-treff.mjs, das sie seit dem 15.09. richtig
|
||||||
|
macht:
|
||||||
|
|
||||||
|
1. `fetch` VERWIRFT DEN Host-KOPF. Er steht auf der Liste der
|
||||||
|
verbotenen Kopfzeilen; Node setzt stattdessen die Adresse des
|
||||||
|
Ziels. Wer eine Hausadresse braucht, muss node:http nehmen.
|
||||||
|
2. DIE COMMUNITY BESTAETIGT IHR ALTER (`alter_ok`). Ohne das Feld
|
||||||
|
antwortet die Anmeldung mit 401 -- und das sah aus wie ein
|
||||||
|
Zugangsproblem am Support.
|
||||||
|
|
||||||
|
Beim ersten Lauf stand deshalb dreimal rot, und kein einziges Mal
|
||||||
|
lag es am Support. */
|
||||||
|
const { request } = await import("node:http");
|
||||||
|
function roh(pfad, host, koerper) {
|
||||||
|
return new Promise((fertig, schief) => {
|
||||||
|
const daten = koerper ? JSON.stringify(koerper) : null;
|
||||||
|
const a = request({
|
||||||
|
host: "127.0.0.1", port: PORT, path: pfad,
|
||||||
|
method: daten ? "POST" : "GET",
|
||||||
|
headers: {
|
||||||
|
...(host ? { Host: host } : {}),
|
||||||
|
Origin: host ? `https://${host}` : BASIS,
|
||||||
|
...(daten ? { "Content-Type": "application/json",
|
||||||
|
"Content-Length": Buffer.byteLength(daten) } : {}),
|
||||||
|
},
|
||||||
|
}, (antwort) => {
|
||||||
|
let text = "";
|
||||||
|
antwort.on("data", (t) => { text += t; });
|
||||||
|
antwort.on("end", () => fertig({
|
||||||
|
code: antwort.statusCode, kopf: antwort.headers, text,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
a.on("error", schief);
|
||||||
|
if (daten) a.write(daten);
|
||||||
|
a.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function anmeldeVersuch(rolle, host) {
|
||||||
|
const r = await roh("/workspace/api/anmelden", host,
|
||||||
|
rolle === "gast"
|
||||||
|
? { rolle, code: CODES[rolle], alter_ok: true }
|
||||||
|
: { rolle, code: CODES[rolle] });
|
||||||
|
if (r.code !== 200) return null;
|
||||||
|
const keks = [].concat(r.kopf["set-cookie"] || [])
|
||||||
|
.map((z) => z.split(";")[0]).join("; ");
|
||||||
|
return keks || null;
|
||||||
|
}
|
||||||
|
const HOST_FUER = {};
|
||||||
|
async function anmelden(rolle) {
|
||||||
|
const ohne = await anmeldeVersuch(rolle, null);
|
||||||
|
if (ohne) { HOST_FUER[rolle] = null; return ohne; }
|
||||||
|
const mit = await anmeldeVersuch(rolle, CREW_HOST);
|
||||||
|
if (mit) { HOST_FUER[rolle] = CREW_HOST; return mit; }
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Ein winziges, gueltiges PNG (1x1, schwarz) -- echte Kopfbytes,
|
||||||
|
* damit die Erkennung wirklich etwas zu erkennen hat. */
|
||||||
|
const PNG = Buffer.from(
|
||||||
|
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk"
|
||||||
|
+ "YPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==", "base64");
|
||||||
|
|
||||||
|
const kekse = {};
|
||||||
|
melde("\n=== Alle neun Rollen kommen herein ===");
|
||||||
|
for (const [rolle] of ROLLEN) {
|
||||||
|
kekse[rolle] = await anmelden(rolle);
|
||||||
|
ok(!!kekse[rolle], `${rolle}: angemeldet`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fuer Rollen OHNE Hausadresse genuegt fetch -- es ist kuerzer und
|
||||||
|
kann Buffer als Rumpf. Wer eine Adresse braucht, geht ueber
|
||||||
|
node:http (siehe oben, `fetch` verwirft den Host-Kopf). */
|
||||||
|
async function hol(rolle, pfad, einst = {}) {
|
||||||
|
if (HOST_FUER[rolle]) {
|
||||||
|
const r = await rohMitKeks(rolle, pfad, einst);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
return fetch(BASIS + pfad, {
|
||||||
|
...einst,
|
||||||
|
headers: { Cookie: kekse[rolle] || "", Origin: BASIS, ...(einst.headers || {}) },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Derselbe Aufruf ueber node:http -- mit Hausadresse und Sitzung.
|
||||||
|
* Gibt etwas zurueck, das sich wie eine fetch-Antwort benutzen
|
||||||
|
* laesst: `status`, `ok`, `json()`, `headers.get()`. */
|
||||||
|
function rohMitKeks(rolle, pfad, einst = {}) {
|
||||||
|
return new Promise((fertig, schief) => {
|
||||||
|
const rumpf = einst.body === undefined ? null
|
||||||
|
: (Buffer.isBuffer(einst.body) ? einst.body : Buffer.from(String(einst.body)));
|
||||||
|
const a = request({
|
||||||
|
host: "127.0.0.1", port: PORT, path: pfad,
|
||||||
|
method: einst.method || "GET",
|
||||||
|
headers: {
|
||||||
|
Host: HOST_FUER[rolle],
|
||||||
|
Origin: `https://${HOST_FUER[rolle]}`,
|
||||||
|
Cookie: kekse[rolle] || "",
|
||||||
|
...(rumpf ? { "Content-Length": rumpf.length } : {}),
|
||||||
|
...(einst.headers || {}),
|
||||||
|
},
|
||||||
|
}, (antwort) => {
|
||||||
|
const teile = [];
|
||||||
|
antwort.on("data", (t) => teile.push(t));
|
||||||
|
antwort.on("end", () => {
|
||||||
|
const text = Buffer.concat(teile).toString("utf8");
|
||||||
|
fertig({
|
||||||
|
status: antwort.statusCode,
|
||||||
|
ok: antwort.statusCode >= 200 && antwort.statusCode < 300,
|
||||||
|
headers: { get: (n) => antwort.headers[String(n).toLowerCase()] || null },
|
||||||
|
json: async () => JSON.parse(text),
|
||||||
|
text: async () => text,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
a.on("error", schief);
|
||||||
|
if (rumpf) a.write(rumpf);
|
||||||
|
a.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
1. DIE KACHEL SIEHT JEDER
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Die Kachel steht bei jeder Rolle ===");
|
||||||
|
{
|
||||||
|
const ohne = [];
|
||||||
|
for (const [rolle] of ROLLEN) {
|
||||||
|
/* DIE ROUTE HEISST /api/ich, nicht /api/start. Beim ersten Lauf
|
||||||
|
stand hier ein erfundener Name, und alle neun Rollen meldeten
|
||||||
|
"Kachel fehlt (HTTP 404)" -- ein Messfehler, der wie ein
|
||||||
|
Totalausfall aussah. */
|
||||||
|
const a = await hol(rolle, "/workspace/api/ich");
|
||||||
|
if (!a.ok) { ohne.push(`${rolle} (HTTP ${a.status})`); continue; }
|
||||||
|
const r = await a.json();
|
||||||
|
/* `bereiche` ist null, wenn die Oberflaeche ihre eigene Liste
|
||||||
|
nimmt -- dann steht die Kachel in assets/js/bereiche.js und
|
||||||
|
wird eine Pruefung weiter unten geprueft. */
|
||||||
|
if (r.bereiche === null) { ohne.push(`${rolle} (eigene Liste im Browser)`); continue; }
|
||||||
|
const da = (r.bereiche || []).some((k) => k?.ziel === "support.html");
|
||||||
|
if (!da) ohne.push(rolle);
|
||||||
|
}
|
||||||
|
/* DIE AGENTUR-ROLLEN bekommen `bereiche: null` und ihre Liste aus
|
||||||
|
dem Browser. Das ist kein Mangel, aber es muss genannt werden --
|
||||||
|
sonst sieht "alle haben sie" gruen aus, obwohl vier gar nicht
|
||||||
|
geprueft wurden. */
|
||||||
|
const ausBrowser = ohne.filter((x) => x.includes("eigene Liste"));
|
||||||
|
const echtOhne = ohne.filter((x) => !x.includes("eigene Liste"));
|
||||||
|
ok(echtOhne.length === 0,
|
||||||
|
"jede Rolle mit Server-Liste hat die Support-Kachel"
|
||||||
|
+ (echtOhne.length ? ` -- FEHLT bei: ${echtOhne.join(", ")}` : ""));
|
||||||
|
melde(` (${ausBrowser.length} Rollen nehmen ihre Liste aus dem Browser)`);
|
||||||
|
|
||||||
|
/* UND DIE BROWSER-LISTE AUCH. Ohne diese Zeile waere die Haelfte
|
||||||
|
der Rollen ungeprueft -- und genau dort hat heute schon einmal
|
||||||
|
etwas gefehlt. */
|
||||||
|
const { readFileSync } = await import("node:fs");
|
||||||
|
const { fileURLToPath } = await import("node:url");
|
||||||
|
const bereicheJs = readFileSync(fileURLToPath(
|
||||||
|
new URL("../workspace/assets/js/bereiche.js", import.meta.url)), "utf8");
|
||||||
|
ok(/ziel:\s*'support\.html'/.test(bereicheJs),
|
||||||
|
"auch die Kachelliste im Browser kennt den Support");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
2. AUF DIE SEITE DARF JEDER
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Die Seite ist fuer jede Rolle offen ===");
|
||||||
|
{
|
||||||
|
const zu = [];
|
||||||
|
for (const [rolle] of ROLLEN) {
|
||||||
|
const a = await hol(rolle, "/workspace/support.html", { redirect: "manual" });
|
||||||
|
if (a.status !== 200) zu.push(`${rolle}=${a.status}`);
|
||||||
|
}
|
||||||
|
ok(zu.length === 0,
|
||||||
|
"support.html antwortet jeder Rolle mit 200"
|
||||||
|
+ (zu.length ? ` -- nicht bei: ${zu.join(", ")}` : ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
3. MELDEN — mit Text, mit Bild, und was nicht geht
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Melden ===");
|
||||||
|
let meldungMitBild = 0;
|
||||||
|
{
|
||||||
|
/* Ohne Text geht nichts -- sonst stehen leere Zeilen im Eingang. */
|
||||||
|
const leer = await hol("creator", "/workspace/api/support", {
|
||||||
|
method: "POST", headers: { "x-text": encodeURIComponent("hm") },
|
||||||
|
});
|
||||||
|
ok(leer.status === 400, `ein Wort reicht nicht (${leer.status})`);
|
||||||
|
|
||||||
|
const nurText = await hol("creator", "/workspace/api/support", {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "x-text": encodeURIComponent("Der Haken auf der Aufgabenseite geht nicht.") },
|
||||||
|
});
|
||||||
|
ok(nurText.status === 201, `Text allein genuegt (${nurText.status})`);
|
||||||
|
|
||||||
|
const mitBild = await hol("modi", "/workspace/api/support", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"x-text": encodeURIComponent("Hier stimmt die Farbe nicht, siehe Bild."),
|
||||||
|
"x-seite": "/workspace/chat.html",
|
||||||
|
"Content-Type": "application/octet-stream",
|
||||||
|
},
|
||||||
|
body: PNG,
|
||||||
|
});
|
||||||
|
ok(mitBild.status === 201, `mit Bild geht auch (${mitBild.status})`);
|
||||||
|
if (mitBild.status === 201) {
|
||||||
|
const j = await mitBild.json();
|
||||||
|
meldungMitBild = j.meldung?.id || 0;
|
||||||
|
ok(!!j.meldung?.bild, "und die Antwort nennt die Adresse des Bildes");
|
||||||
|
} else { ok(false, "kein Bild in der Antwort"); }
|
||||||
|
|
||||||
|
/* DER STANDARDFEHLER BEI UPLOADS: eine HTML-Datei mit Bildnamen.
|
||||||
|
Sie liefe im Browser als Seite DIESER Domain, mit Zugriff auf die
|
||||||
|
Sitzung des Empfaengers. */
|
||||||
|
const getarnt = await hol("scout", "/workspace/api/support", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"x-text": encodeURIComponent("Test mit einer getarnten Datei."),
|
||||||
|
"Content-Type": "image/png",
|
||||||
|
},
|
||||||
|
body: Buffer.from("<html><script>alert(1)</script></html>"),
|
||||||
|
});
|
||||||
|
ok(getarnt.status === 415,
|
||||||
|
`als Bild getarntes HTML wird abgelehnt (${getarnt.status})`);
|
||||||
|
|
||||||
|
/* Und ein PDF ebenfalls -- dateiErkennen kennt es, der Support
|
||||||
|
will es nicht. */
|
||||||
|
const pdf = await hol("scout", "/workspace/api/support", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"x-text": encodeURIComponent("Test mit einem PDF im Anhang."),
|
||||||
|
"Content-Type": "application/pdf",
|
||||||
|
},
|
||||||
|
body: Buffer.concat([Buffer.from("%PDF-1.4\n"), Buffer.alloc(64, 0x20)]),
|
||||||
|
});
|
||||||
|
ok(pdf.status === 415, `ein PDF ist kein Foto (${pdf.status})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
4. WER SIEHT WAS
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Wer sieht was ===");
|
||||||
|
{
|
||||||
|
const alsCreator = await (await hol("creator", "/workspace/api/support")).json();
|
||||||
|
ok(alsCreator.leitung === false, "ein Creator ist nicht die Leitung");
|
||||||
|
ok(alsCreator.meldungen.length === 1,
|
||||||
|
`und sieht genau seine eigene (${alsCreator.meldungen.length})`);
|
||||||
|
|
||||||
|
const alsModi = await (await hol("modi", "/workspace/api/support")).json();
|
||||||
|
ok(alsModi.meldungen.length === 1 && alsModi.meldungen[0].id === meldungMitBild,
|
||||||
|
"ein Modi sieht seine eigene und nicht die des Creators");
|
||||||
|
|
||||||
|
for (const rolle of ["admin", "hand"]) {
|
||||||
|
const r = await (await hol(rolle, "/workspace/api/support")).json();
|
||||||
|
ok(r.leitung === true && r.meldungen.length >= 2,
|
||||||
|
`${rolle} sieht alle (${r.meldungen.length})`);
|
||||||
|
}
|
||||||
|
for (const rolle of ["linke", "modi", "spicy", "manager", "scout", "creator", "gast"]) {
|
||||||
|
const r = await (await hol(rolle, "/workspace/api/support")).json();
|
||||||
|
ok(r.leitung !== true, `${rolle} ist NICHT die Leitung`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* DAS BILD EINER FREMDEN MELDUNG bleibt fremd. */
|
||||||
|
const fremd = await hol("creator", `/workspace/api/support/${meldungMitBild}/bild`);
|
||||||
|
ok(fremd.status === 404,
|
||||||
|
`das Bild einer fremden Meldung gibt es fuer andere nicht (${fremd.status})`);
|
||||||
|
|
||||||
|
const eigen = await hol("modi", `/workspace/api/support/${meldungMitBild}/bild`);
|
||||||
|
ok(eigen.status === 200, `der Melder sieht sein eigenes Bild (${eigen.status})`);
|
||||||
|
ok(eigen.headers.get("content-type") === "image/png",
|
||||||
|
`ausgeliefert wird der ERKANNTE Typ (${eigen.headers.get("content-type")})`);
|
||||||
|
ok((eigen.headers.get("x-content-type-options") || "") === "nosniff",
|
||||||
|
"mit nosniff");
|
||||||
|
ok(/sandbox/.test(eigen.headers.get("content-security-policy") || ""),
|
||||||
|
"und einer Richtlinie, die jede Ausfuehrung nimmt");
|
||||||
|
|
||||||
|
const leitungSieht = await hol("hand", `/workspace/api/support/${meldungMitBild}/bild`);
|
||||||
|
ok(leitungSieht.status === 200, "die Leitung sieht es auch");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
5. SICH KUEMMERN
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Sich kuemmern ===");
|
||||||
|
{
|
||||||
|
/* Wer nicht Leitung ist, kann nichts aendern -- 404 und nicht 403:
|
||||||
|
Wer keine Zustaendigkeit hat, soll nicht erfahren, dass es sie
|
||||||
|
gibt. */
|
||||||
|
const versuch = await hol("creator", `/workspace/api/support/${meldungMitBild}`, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ stand: "erledigt", antwort: "einfach mal zu" }),
|
||||||
|
});
|
||||||
|
ok(versuch.status === 404, `ein Creator kann nichts erledigen (${versuch.status})`);
|
||||||
|
|
||||||
|
const dran = await hol("hand", `/workspace/api/support/${meldungMitBild}`, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ stand: "in_arbeit" }),
|
||||||
|
});
|
||||||
|
ok(dran.status === 200, `die rechte Hand uebernimmt (${dran.status})`);
|
||||||
|
|
||||||
|
/* ZUMACHEN OHNE SATZ GEHT NICHT. Der Melder sieht nur diesen Satz. */
|
||||||
|
const ohneSatz = await hol("hand", `/workspace/api/support/${meldungMitBild}`, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ stand: "erledigt" }),
|
||||||
|
});
|
||||||
|
ok(ohneSatz.status === 400, `erledigen ohne Satz wird abgelehnt (${ohneSatz.status})`);
|
||||||
|
|
||||||
|
const zu = await hol("hand", `/workspace/api/support/${meldungMitBild}`, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ stand: "erledigt", antwort: "Behoben, die Farbe stimmt wieder." }),
|
||||||
|
});
|
||||||
|
ok(zu.status === 200, `mit Satz geht es (${zu.status})`);
|
||||||
|
|
||||||
|
/* ERLEDIGT IST ERLEDIGT -- auch fuer die Leitung. */
|
||||||
|
const nochmal = await hol("admin", `/workspace/api/support/${meldungMitBild}`, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ stand: "in_arbeit", antwort: "doch nicht" }),
|
||||||
|
});
|
||||||
|
ok(nochmal.status === 409,
|
||||||
|
`eine erledigte Meldung wird nicht wieder geoeffnet (${nochmal.status})`);
|
||||||
|
|
||||||
|
/* Und der Melder sieht die Antwort. */
|
||||||
|
const beimMelder = await (await hol("modi", "/workspace/api/support")).json();
|
||||||
|
const meine = beimMelder.meldungen.find((m) => m.id === meldungMitBild);
|
||||||
|
ok(meine?.stand === "erledigt" && /Behoben/.test(meine?.antwort || ""),
|
||||||
|
"der Melder sieht Stand und Antwort");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
6. GEGENPROBEN — kann diese Pruefung ueberhaupt rot werden?
|
||||||
|
===================================================================== */
|
||||||
|
melde("\n=== Gegenproben (jede MUSS anschlagen) ===");
|
||||||
|
{
|
||||||
|
/* Eine Meldung, die es nicht gibt. */
|
||||||
|
const nichts = await hol("admin", "/workspace/api/support/999999");
|
||||||
|
ok(nichts.status === 404, "eine erfundene Nummer gibt es nicht");
|
||||||
|
|
||||||
|
/* Ohne Anmeldung kommt niemand an die Liste. */
|
||||||
|
const ohne = await fetch(BASIS + "/workspace/api/support");
|
||||||
|
ok(ohne.status === 401 || ohne.status === 302 || ohne.status === 404,
|
||||||
|
`ohne Anmeldung keine Liste (${ohne.status})`);
|
||||||
|
|
||||||
|
/* Und ohne Anmeldung auch nicht an ein Bild. */
|
||||||
|
const ohneBild = await fetch(BASIS + `/workspace/api/support/${meldungMitBild}/bild`);
|
||||||
|
ok(ohneBild.status !== 200, `ohne Anmeldung kein Bild (${ohneBild.status})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }
|
||||||
|
|
||||||
|
console.log("");
|
||||||
|
console.log(`${geprueft} Pruefungen, ${fehler} Fehler`);
|
||||||
|
console.log(fehler ? "NICHT IN ORDNUNG" : "ALLES IN ORDNUNG");
|
||||||
|
process.exit(fehler ? 1 : 0);
|
||||||
@@ -455,6 +455,23 @@ export const SEITEN = {
|
|||||||
eigenen Faelle, die Leitung alle. */
|
eigenen Faelle, die Leitung alle. */
|
||||||
"/workspace/hilfe.html": ["gast", "hand", "admin"],
|
"/workspace/hilfe.html": ["gast", "hand", "admin"],
|
||||||
|
|
||||||
|
/* DER SUPPORT: WIRKLICH JEDER (24.09.2026).
|
||||||
|
|
||||||
|
Filipe: „da fehlt auch eine support kachel. die jeder sieht.
|
||||||
|
jeder benutzen kann."
|
||||||
|
|
||||||
|
Das ist der Unterschied zum vertraulichen Meldeweg eine Zeile
|
||||||
|
darueber: Der gilt nur fuer gast, hand und admin -- Modis,
|
||||||
|
Creator, Scouts, Manager und die linke Hand hatten gar keinen
|
||||||
|
Weg, einen kaputten Knopf zu melden.
|
||||||
|
|
||||||
|
ALLE ROLLEN AUSGESCHRIEBEN und nicht „* " oder ein Weglassen:
|
||||||
|
Diese Tafel ist die Stelle, an der man nachsieht, wer wohin darf.
|
||||||
|
Eine Abkuerzung hier hiesse, dass der Support in der Uebersicht
|
||||||
|
„Wer sieht was" als Luecke erscheint. */
|
||||||
|
"/workspace/support.html": ["gast", "modi", "creator", "scout", "manager",
|
||||||
|
"linke", "hand", "spicy", "admin"],
|
||||||
|
|
||||||
/* WER SIEHT WAS. DogFather und die rechte Hand (Filipe, 11.09.2026:
|
/* WER SIEHT WAS. DogFather und die rechte Hand (Filipe, 11.09.2026:
|
||||||
"ich will die kategorie auch auf der team dogi seite fuer die
|
"ich will die kategorie auch auf der team dogi seite fuer die
|
||||||
dogfather und rechte hand rollen").
|
dogfather und rechte hand rollen").
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
DER SUPPORT — Tabellen (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
|
||||||
|
benutzen kann. jeder kann da probleme von der seite melden und
|
||||||
|
hinweisen. fotos mit schicken mit einem text. … es geht drum dass
|
||||||
|
die leute einfach ein text mit einem foto schicken und dan die
|
||||||
|
rechte hand und dogfather es bekommen. es sehen in dieser support
|
||||||
|
kachel. also bei dogfather und der rechten hand soll die kachel
|
||||||
|
anders gebaut sein weil die sind die die sich um die probleme
|
||||||
|
kümmern."
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
WARUM DAS NICHT DER VERTRAULICHE MELDEWEG IST
|
||||||
|
|
||||||
|
Es gibt ihn schon (hilfe.html, hilfe_faelle) und er sieht auf den
|
||||||
|
ersten Blick gleich aus. Drei Unterschiede machen ihn zu etwas
|
||||||
|
anderem:
|
||||||
|
|
||||||
|
1. ER IST NICHT FÜR ALLE. In rechte.js steht
|
||||||
|
`"/workspace/hilfe.html": ["gast", "hand", "admin"]` — Modis,
|
||||||
|
Creator, Scouts, Manager und die linke Hand haben ihn nicht.
|
||||||
|
Das Team selbst hatte damit gar keinen Weg, einen kaputten
|
||||||
|
Knopf zu melden.
|
||||||
|
2. ER KANN KEINE BILDER. Bei „der Knopf oben rechts tut nichts"
|
||||||
|
ist ein Bildschirmfoto die halbe Antwort. Ein Meldeweg ohne
|
||||||
|
Bild führt zu drei Rückfragen.
|
||||||
|
3. ER IST BEWUSST SCHWER. Strikter Wechsel (melden → warten →
|
||||||
|
antworten → warten), drei offene Fälle höchstens, ein Betreff.
|
||||||
|
Das ist richtig, wenn es um einen Vorfall zwischen Menschen
|
||||||
|
geht. Für „das Datum steht falsch da" ist es zu viel.
|
||||||
|
|
||||||
|
Deshalb eine eigene, sehr kurze Sache: EIN Feld, EIN Bild, fertig.
|
||||||
|
Kein Betreff, keine Kategorie, keine Dringlichkeitsstufe. Wer ein
|
||||||
|
Formular mit fünf Feldern sieht, meldet den kleinen Fehler nicht —
|
||||||
|
und genau die kleinen sind es, die sonst niemand erfährt.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
DREI STÄNDE, NICHT FÜNF
|
||||||
|
|
||||||
|
„neu" Niemand hat es angesehen.
|
||||||
|
„in_arbeit" Jemand kümmert sich — sichtbar auch für den Melder,
|
||||||
|
damit er weiß, dass es angekommen ist.
|
||||||
|
„erledigt" Zu. Mit einer Antwort, wenn es etwas zu sagen gab.
|
||||||
|
|
||||||
|
Eine vierte Stufe („abgelehnt") gibt es absichtlich nicht. Ein
|
||||||
|
Hinweis, den man nicht umsetzt, wird trotzdem erledigt — mit einem
|
||||||
|
Satz warum. „Abgelehnt" ist eine Tür, die man dem zuschlägt, der
|
||||||
|
sich die Mühe gemacht hat.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
DAS BILD LIEGT AUF DER PLATTE, NICHT IN DER DATENBANK
|
||||||
|
|
||||||
|
Dieselbe Entscheidung wie bei Chat-Anhängen und der Dateiablage: Ein
|
||||||
|
Bildschirmfoto sind ein bis fünf Megabyte, und eine SQLite-Datei,
|
||||||
|
die man täglich sichert, soll das nicht tragen. In der Tabelle steht
|
||||||
|
nur der Dateiname; der Ordner steht in workspace-support.js über
|
||||||
|
`join(DATEN_ORDNER, …)` — genau dieses Muster liest
|
||||||
|
tools/wiederherstellung-proben.mjs, um zu prüfen, ob die Sicherung
|
||||||
|
ihn mitnimmt.
|
||||||
|
|
||||||
|
DIESE DATEI IMPORTIERT NICHTS — derselbe Grund wie bei
|
||||||
|
hilfe-tabellen.js und treff-tabellen.js: Sie wird aus dem Bauplan in
|
||||||
|
workspace.js aufgerufen und darf keinen Kreis erzeugen.
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Die drei Stände einer Meldung.
|
||||||
|
*
|
||||||
|
* Hier und nicht als Zeichenkette an zwanzig Stellen — ein Tippfehler
|
||||||
|
* in einem `WHERE stand = 'neu'` findet lautlos nichts. */
|
||||||
|
export const SUPPORT_STAND = {
|
||||||
|
neu: "neu",
|
||||||
|
inArbeit: "in_arbeit",
|
||||||
|
erledigt: "erledigt",
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Wie lange eine erledigte Meldung aufbewahrt wird.
|
||||||
|
*
|
||||||
|
* Neunzig Tage. Lang genug, um ein wiederkehrendes Problem zu
|
||||||
|
* erkennen („das hatten wir im Juli schon"), kurz genug, dass
|
||||||
|
* Bildschirmfotos aus dem Arbeitsalltag nicht ewig herumliegen.
|
||||||
|
* Aufgeräumt wird im Rundgang, nicht beim Lesen — sonst hängt das
|
||||||
|
* Löschen davon ab, dass jemand die Seite öffnet. */
|
||||||
|
export const AUFBEWAHRUNG_TAGE = 90;
|
||||||
|
|
||||||
|
export function supportTabellen(d) {
|
||||||
|
d.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS support_meldungen (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
/* ON DELETE SET NULL und nicht CASCADE: Wird ein Zugang
|
||||||
|
gelöscht, ist der gemeldete Fehler immer noch da. Die Meldung
|
||||||
|
verliert ihren Absender, nicht ihren Inhalt. */
|
||||||
|
person_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||||||
|
/* Der Name wird MITGESCHRIEBEN, nicht nur verknüpft. Sonst steht
|
||||||
|
nach einem Rollenwechsel oder einer Löschung „—" neben einer
|
||||||
|
Meldung, zu der jemand etwas fragen möchte. */
|
||||||
|
von_name TEXT,
|
||||||
|
von_rolle TEXT,
|
||||||
|
text TEXT NOT NULL,
|
||||||
|
/* WO ES PASSIERT IST. Kommt nicht aus einem Auswahlfeld, sondern
|
||||||
|
aus der Adresse, von der aus gemeldet wurde — eine Angabe, die
|
||||||
|
niemand tippen muss und die trotzdem stimmt. */
|
||||||
|
seite TEXT,
|
||||||
|
/* Was der Browser über sich sagt, gekürzt. Bei „geht bei mir
|
||||||
|
nicht" ist das die erste Frage, und sie erübrigt sich damit. */
|
||||||
|
geraet TEXT,
|
||||||
|
bild_datei TEXT,
|
||||||
|
bild_typ TEXT,
|
||||||
|
bild_breite INTEGER,
|
||||||
|
bild_hoehe INTEGER,
|
||||||
|
stand TEXT NOT NULL DEFAULT 'neu'
|
||||||
|
CHECK (stand IN ('neu','in_arbeit','erledigt')),
|
||||||
|
antwort TEXT,
|
||||||
|
erstellt TEXT NOT NULL,
|
||||||
|
geaendert TEXT NOT NULL,
|
||||||
|
erledigt_am TEXT,
|
||||||
|
erledigt_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Die Leitung fragt „was ist offen?", der Melder „was ist meins?".
|
||||||
|
Zwei Indizes für zwei Fragen. */
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_support_stand
|
||||||
|
ON support_meldungen(stand, id DESC);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_support_person
|
||||||
|
ON support_meldungen(person_id, id DESC);
|
||||||
|
`);
|
||||||
|
}
|
||||||
@@ -557,7 +557,12 @@ function direktRaum(personA, idB, { anlegen = true } = {}) {
|
|||||||
Laden nicht. Lassen sie sich nicht ablesen, ist das kein Grund zur
|
Laden nicht. Lassen sie sich nicht ablesen, ist das kein Grund zur
|
||||||
Ablehnung -- dann steht eben 0, und der Platz wird geschätzt.
|
Ablehnung -- dann steht eben 0, und der Platz wird geschätzt.
|
||||||
===================================================================== */
|
===================================================================== */
|
||||||
function dateiErkennen(b) {
|
/* EXPORTIERT SEIT DEM 24.09.2026 -- der Support braucht dieselbe
|
||||||
|
Erkennung fuer seine Bildschirmfotos. Eine zweite Fassung dort waere
|
||||||
|
die, die beim naechsten Dateiformat vergessen wird, und an dieser
|
||||||
|
Funktion haengt die ganze Sicherheit der Uploads (siehe der Kopf
|
||||||
|
darueber). Eine Wahrheit, zwei Benutzer. */
|
||||||
|
export function dateiErkennen(b) {
|
||||||
if (!Buffer.isBuffer(b) || b.length < 16) return null;
|
if (!Buffer.isBuffer(b) || b.length < 16) return null;
|
||||||
const kopf = (von, bis) => b.toString("latin1", von, bis);
|
const kopf = (von, bis) => b.toString("latin1", von, bis);
|
||||||
|
|
||||||
|
|||||||
@@ -141,6 +141,18 @@ export const ARTEN = [
|
|||||||
{ schluessel: "bewerbung_antwort",
|
{ schluessel: "bewerbung_antwort",
|
||||||
name: "Antwort auf deine eigene Bewerbung", vorgabe: true },
|
name: "Antwort auf deine eigene Bewerbung", vorgabe: true },
|
||||||
|
|
||||||
|
/* DER SUPPORT (24.09.2026).
|
||||||
|
|
||||||
|
EINE ART FUER BEIDE RICHTUNGEN -- die neue Meldung an die Leitung
|
||||||
|
und die Antwort an den Melder. Zwei Schluessel waeren zwei
|
||||||
|
Schalter in den Einstellungen fuer dieselbe Sache, und wer den
|
||||||
|
einen abschaltet, wundert sich ueber den anderen.
|
||||||
|
|
||||||
|
NICHT DRINGEND: Ein kaputter Knopf weckt niemanden um drei Uhr
|
||||||
|
nachts; die Ruhezeit gilt. */
|
||||||
|
{ schluessel: "support",
|
||||||
|
name: "Support: neue Meldung oder Antwort darauf", vorgabe: true },
|
||||||
|
|
||||||
/* ER IST LIVE (22.09.2026).
|
/* ER IST LIVE (22.09.2026).
|
||||||
|
|
||||||
Filipe: "die leute sollen auch automatisch eine benarichtigung
|
Filipe: "die leute sollen auch automatisch eine benarichtigung
|
||||||
|
|||||||
@@ -0,0 +1,436 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
DER SUPPORT (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
|
||||||
|
benutzen kann. jeder kann da probleme von der seite melden und
|
||||||
|
hinweisen. fotos mit schicken mit einem text. es soll alles hoch
|
||||||
|
profissionell gemacht werden aber so einfach wie möglich, will
|
||||||
|
nichts kompliziertes oder zu viel. kurz und knapp … also bei
|
||||||
|
dogfather und der rechten hand soll die kachel anders gebaut sein
|
||||||
|
weil die sind die die sich um die probleme kümmern."
|
||||||
|
|
||||||
|
Die Regeln und ihre Begründung stehen im Kopf von
|
||||||
|
support-tabellen.js. Hier sind die Wege — und die vier Stellen, an
|
||||||
|
denen etwas schiefgehen kann:
|
||||||
|
|
||||||
|
1. EINE MELDUNG DARF NIE BEIM FALSCHEN LANDEN. Jede Leseroute geht
|
||||||
|
über `meldungFuer()`, das den Datensatz zurückgibt oder `null` —
|
||||||
|
nie `true`/`false`. So kann keine Route „darf sehen" beantworten
|
||||||
|
und danach trotzdem den falschen Datensatz laden. Dasselbe
|
||||||
|
Muster wie im vertraulichen Meldeweg.
|
||||||
|
|
||||||
|
2. DER TYP EINES BILDES KOMMT AUS DEM INHALT. `dateiErkennen()`
|
||||||
|
liest die ersten Bytes; Dateiname und Content-Type kommen vom
|
||||||
|
Absender und sind frei erfunden. Die Funktion wird aus
|
||||||
|
workspace-chat.js IMPORTIERT und nicht abgeschrieben: Eine
|
||||||
|
zweite Fassung wäre die, die beim nächsten Dateiformat vergessen
|
||||||
|
wird — und an ihr hängt die ganze Sicherheit der Uploads.
|
||||||
|
|
||||||
|
3. DER RUMPF WIRD ERST ANGENOMMEN, WENN DIE BERECHTIGUNG STEHT.
|
||||||
|
Wer nicht angemeldet ist, kommt gar nicht bis zur Datei.
|
||||||
|
|
||||||
|
4. ERLEDIGT IST ERLEDIGT. Auch für die Leitung — eine geschlossene
|
||||||
|
Meldung wird nicht stillschweigend wieder geöffnet und anders
|
||||||
|
beantwortet.
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
import express from "express";
|
||||||
|
import { createReadStream, statSync, writeFileSync, mkdirSync, unlinkSync } from "node:fs";
|
||||||
|
import { join } from "node:path";
|
||||||
|
import { randomBytes } from "node:crypto";
|
||||||
|
import { db, protokolliere, DATEN_ORDNER, echteIp } from "./workspace.js";
|
||||||
|
import { SUPPORT_STAND, AUFBEWAHRUNG_TAGE } from "./support-tabellen.js";
|
||||||
|
import { dateiErkennen } from "./workspace-chat.js";
|
||||||
|
import { benachrichtige } from "./workspace-push.js";
|
||||||
|
|
||||||
|
export const supportRouter = express.Router();
|
||||||
|
|
||||||
|
/** Wer alle Meldungen sieht und sie bearbeitet.
|
||||||
|
*
|
||||||
|
* GENAU ZWEI ROLLEN, wie bestellt: DogFather und die rechte Hand.
|
||||||
|
* Dieselbe Menge wie im vertraulichen Meldeweg — und aus einem
|
||||||
|
* ähnlichen Grund: Wer sich kümmert, muss alles sehen; wer nur
|
||||||
|
* meldet, sieht seine eigene Meldung. */
|
||||||
|
const LEITUNG = new Set(["admin", "hand"]);
|
||||||
|
const istLeitung = (person) => LEITUNG.has(person?.rolle);
|
||||||
|
|
||||||
|
const TEXT_MAX = 2000;
|
||||||
|
const SEITE_MAX = 120;
|
||||||
|
const GERAET_MAX = 200;
|
||||||
|
const ANTWORT_MAX = 2000;
|
||||||
|
|
||||||
|
/** Zwölf Megabyte — dieselbe Grenze wie bei Chat-Anhängen.
|
||||||
|
* Ein Bildschirmfoto vom Handy liegt bei 2 bis 5 MB. */
|
||||||
|
const BILD_MAX = 12 * 1024 * 1024;
|
||||||
|
|
||||||
|
/** Wie viele offene Meldungen eine Person gleichzeitig haben darf.
|
||||||
|
*
|
||||||
|
* Zehn, und damit deutlich großzügiger als die drei im vertraulichen
|
||||||
|
* Meldeweg. Dort ist die Grenze ein Schutz vor Überforderung auf
|
||||||
|
* beiden Seiten; hier wäre sie eine Bremse für genau die Person, die
|
||||||
|
* sich die Mühe macht, fünf kleine Fehler einzeln zu melden. Sie
|
||||||
|
* steht nur da, damit ein hängendes Skript nicht tausend Zeilen
|
||||||
|
* anlegt. */
|
||||||
|
const OFFEN_MAX = 10;
|
||||||
|
|
||||||
|
/* Der Ordner steht über join(DATEN_ORDNER, …) — genau dieses Muster
|
||||||
|
liest tools/wiederherstellung-proben.mjs aus, um zu prüfen, ob die
|
||||||
|
Sicherung ihn mitnimmt. Eine gepflegte Liste wäre die, die beim
|
||||||
|
nächsten Ordner vergessen wird. */
|
||||||
|
const BILD_ORDNER = join(DATEN_ORDNER, "support-bilder");
|
||||||
|
|
||||||
|
const jetzt = () => new Date().toISOString();
|
||||||
|
|
||||||
|
function sauber(s, max) {
|
||||||
|
return String(s ?? "").replace(/\s+/g, " ").trim().slice(0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Mehrzeiliger Text: Absätze bleiben, Leerzeilenwüsten nicht.
|
||||||
|
*
|
||||||
|
* Beim Melden schreibt man „Schritt 1 … Schritt 2 …" untereinander.
|
||||||
|
* Das über `\s+` plattzumachen wie einen Betreff würde genau die
|
||||||
|
* Struktur zerstören, die den Fehler nachvollziehbar macht. */
|
||||||
|
function textSauber(s, max) {
|
||||||
|
return String(s ?? "")
|
||||||
|
.replace(/\r\n/g, "\n")
|
||||||
|
.replace(/[ \t]+/g, " ")
|
||||||
|
.replace(/\n{3,}/g, "\n\n")
|
||||||
|
.trim()
|
||||||
|
.slice(0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Darf diese Person diese Meldung sehen?
|
||||||
|
*
|
||||||
|
* Gibt die Meldung zurück oder `null`. NIE `true`/`false` — dasselbe
|
||||||
|
* Muster wie `fallFuer()` im vertraulichen Meldeweg, und aus
|
||||||
|
* demselben Grund. */
|
||||||
|
function meldungFuer(person, id) {
|
||||||
|
const m = db().prepare("SELECT * FROM support_meldungen WHERE id = ?").get(Number(id));
|
||||||
|
if (!m) return null;
|
||||||
|
if (istLeitung(person)) return m;
|
||||||
|
return m.person_id === person?.id ? m : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Wie eine Meldung nach draußen aussieht.
|
||||||
|
*
|
||||||
|
* AN EINER STELLE, weil vier Routen sie ausgeben. Vier Stellen wären
|
||||||
|
* vier Gelegenheiten, ein Feld zu vergessen — oder eines zu viel
|
||||||
|
* mitzuschicken.
|
||||||
|
*
|
||||||
|
* `fuerLeitung` entscheidet nur über die Zusatzangaben, nicht über
|
||||||
|
* den Inhalt: Wer meldet, sieht seine eigene Meldung vollständig,
|
||||||
|
* auch den Namen, den er selbst trägt. */
|
||||||
|
function nachDraussen(m, fuerLeitung) {
|
||||||
|
return {
|
||||||
|
id: m.id,
|
||||||
|
text: m.text,
|
||||||
|
stand: m.stand,
|
||||||
|
antwort: m.antwort || null,
|
||||||
|
erstellt: m.erstellt,
|
||||||
|
geaendert: m.geaendert,
|
||||||
|
erledigt_am: m.erledigt_am || null,
|
||||||
|
seite: m.seite || null,
|
||||||
|
/* Das Bild 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
|
||||||
|
Chat-Anhang. */
|
||||||
|
bild: m.bild_datei ? `/workspace/api/support/${m.id}/bild` : null,
|
||||||
|
bild_breite: m.bild_breite || 0,
|
||||||
|
bild_hoehe: m.bild_hoehe || 0,
|
||||||
|
von: m.von_name || null,
|
||||||
|
von_rolle: m.von_rolle || null,
|
||||||
|
/* Nur die Leitung braucht zu wissen, mit welchem Gerät gemeldet
|
||||||
|
wurde. Für den Melder ist es seine eigene Angabe und nur
|
||||||
|
Rauschen. */
|
||||||
|
geraet: fuerLeitung ? (m.geraet || null) : undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
LESEN
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Die eigenen Meldungen — oder für die Leitung alle.
|
||||||
|
*
|
||||||
|
* EINE ROUTE FÜR BEIDE, nicht zwei. Zwei Routen hießen zwei Stellen,
|
||||||
|
* an denen die Sichtbarkeitsregel gepflegt werden muss — und eine
|
||||||
|
* davon läuft irgendwann auseinander. */
|
||||||
|
supportRouter.get("/workspace/api/support", (req, res) => {
|
||||||
|
try {
|
||||||
|
const leitung = istLeitung(req.person);
|
||||||
|
const zeilen = leitung
|
||||||
|
? db().prepare(`SELECT * FROM support_meldungen ORDER BY
|
||||||
|
/* Offene zuerst, und darin die ältesten oben: Was am
|
||||||
|
längsten wartet, gehört nach vorn. Erledigte danach, das
|
||||||
|
Neueste zuerst. */
|
||||||
|
CASE stand WHEN 'neu' THEN 0 WHEN 'in_arbeit' THEN 1 ELSE 2 END,
|
||||||
|
CASE WHEN stand = 'erledigt' THEN -id ELSE id END
|
||||||
|
LIMIT 300`).all()
|
||||||
|
: db().prepare(`SELECT * FROM support_meldungen WHERE person_id = ?
|
||||||
|
ORDER BY id DESC LIMIT 100`).all(req.person.id);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
leitung,
|
||||||
|
meldungen: zeilen.map((m) => nachDraussen(m, leitung)),
|
||||||
|
/* Die Zahlen stehen in der Antwort und werden nicht im Browser
|
||||||
|
nachgezählt: Die Liste ist bei 300 abgeschnitten, eine Zählung
|
||||||
|
darauf wäre ab der 301. Meldung still falsch. */
|
||||||
|
offen: leitung
|
||||||
|
? db().prepare("SELECT COUNT(*) AS n FROM support_meldungen WHERE stand <> 'erledigt'")
|
||||||
|
.get().n
|
||||||
|
: db().prepare(`SELECT COUNT(*) AS n FROM support_meldungen
|
||||||
|
WHERE person_id = ? AND stand <> 'erledigt'`).get(req.person.id).n,
|
||||||
|
hoechstens_bytes: BILD_MAX,
|
||||||
|
text_max: TEXT_MAX,
|
||||||
|
});
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[support] Liste:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Das Bild einer Meldung.
|
||||||
|
*
|
||||||
|
* Dieselben Kopfzeilen wie beim Chat-Anhang: der Typ aus der
|
||||||
|
* ERKENNUNG (nicht der eingeschickte), nosniff, und eine Richtlinie,
|
||||||
|
* die dem Dokument jede Ausführung nimmt. */
|
||||||
|
supportRouter.get("/workspace/api/support/:id(\\d+)/bild", (req, res) => {
|
||||||
|
try {
|
||||||
|
const m = meldungFuer(req.person, req.params.id);
|
||||||
|
if (!m || !m.bild_datei) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||||
|
const pfad = join(BILD_ORDNER, m.bild_datei);
|
||||||
|
try { statSync(pfad); } catch {
|
||||||
|
return res.status(410).json({ fehler: "Das Bild fehlt auf der Platte." });
|
||||||
|
}
|
||||||
|
res.setHeader("Content-Type", m.bild_typ || "image/png");
|
||||||
|
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("[support] Bild:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
MELDEN
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Vor express.raw: Darf diese Person überhaupt melden?
|
||||||
|
*
|
||||||
|
* Angemeldet sein genügt — „die jeder sieht, jeder benutzen kann".
|
||||||
|
* Die Prüfung steht trotzdem VOR der Annahme des Rumpfes, sonst
|
||||||
|
* wanderten zwölf Megabyte durch die Leitung, bevor irgendjemand
|
||||||
|
* fragt, wer da schickt. */
|
||||||
|
function darfMelden(req, res, next) {
|
||||||
|
if (!req.person?.id) return res.status(401).json({ fehler: "nicht_angemeldet" });
|
||||||
|
const offen = db().prepare(`SELECT COUNT(*) AS n FROM support_meldungen
|
||||||
|
WHERE person_id = ? AND stand <> 'erledigt'`).get(req.person.id).n;
|
||||||
|
if (offen >= OFFEN_MAX) {
|
||||||
|
return res.status(429).json({
|
||||||
|
fehler: `Du hast schon ${offen} offene Meldungen. Warte kurz ab, `
|
||||||
|
+ "bis sich jemand darum gekümmert hat.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Eine Meldung abschicken.
|
||||||
|
*
|
||||||
|
* EIN WEG FÜR BEIDES — mit Bild und ohne. Der Text reist im Kopf
|
||||||
|
* (`x-text`, prozentkodiert), das Bild im Rumpf. Zwei Routen zu
|
||||||
|
* bauen („/support" für Text, "/support/bild" für Bild) wäre die
|
||||||
|
* naheliegende Aufteilung und hätte einen Zustand dazwischen: eine
|
||||||
|
* Meldung, die schon existiert, während das Bild noch hochlädt —
|
||||||
|
* und bei einem Abbruch für immer ohne Bild dasteht.
|
||||||
|
*
|
||||||
|
* Ein leerer Rumpf ist zulässig: Dann gibt es eben kein Bild. */
|
||||||
|
supportRouter.post("/workspace/api/support",
|
||||||
|
darfMelden,
|
||||||
|
express.raw({ type: "*/*", limit: BILD_MAX }),
|
||||||
|
(req, res) => {
|
||||||
|
let geschrieben = null;
|
||||||
|
try {
|
||||||
|
let text = "";
|
||||||
|
try { text = decodeURIComponent(req.get("x-text") || ""); } catch { text = ""; }
|
||||||
|
text = textSauber(text, TEXT_MAX);
|
||||||
|
if (text.length < 5) {
|
||||||
|
return res.status(400).json({
|
||||||
|
fehler: "Schreib bitte kurz, was los ist – ein Satz reicht.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let bildDatei = null, bildTyp = null, bildBreite = 0, bildHoehe = 0;
|
||||||
|
if (Buffer.isBuffer(req.body) && req.body.length) {
|
||||||
|
const erkannt = dateiErkennen(req.body);
|
||||||
|
/* NUR BILDER. dateiErkennen kennt auch PDF und Ton — hier geht
|
||||||
|
es um Bildschirmfotos, und alles andere wäre eine Tür, die
|
||||||
|
niemand bestellt hat. */
|
||||||
|
if (!erkannt || erkannt.art !== "bild") {
|
||||||
|
return res.status(415).json({
|
||||||
|
fehler: "Als Anhang geht ein Foto – PNG, JPEG, WebP oder GIF.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
mkdirSync(BILD_ORDNER, { recursive: true });
|
||||||
|
bildDatei = `${Date.now()}-${randomBytes(8).toString("hex")}${erkannt.endung}`;
|
||||||
|
writeFileSync(join(BILD_ORDNER, bildDatei), req.body);
|
||||||
|
geschrieben = join(BILD_ORDNER, bildDatei);
|
||||||
|
bildTyp = erkannt.typ;
|
||||||
|
bildBreite = erkannt.breite || 0;
|
||||||
|
bildHoehe = erkannt.hoehe || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const n = jetzt();
|
||||||
|
const info = db().prepare(`INSERT INTO support_meldungen
|
||||||
|
(person_id, von_name, von_rolle, text, seite, geraet,
|
||||||
|
bild_datei, bild_typ, bild_breite, bild_hoehe,
|
||||||
|
stand, erstellt, geaendert)
|
||||||
|
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`)
|
||||||
|
.run(req.person.id, req.person.name || null, req.person.rolle || null,
|
||||||
|
text, sauber(req.get("x-seite"), SEITE_MAX) || null,
|
||||||
|
sauber(req.get("user-agent"), GERAET_MAX) || null,
|
||||||
|
bildDatei, bildTyp, bildBreite, bildHoehe,
|
||||||
|
SUPPORT_STAND.neu, n, n);
|
||||||
|
const id = Number(info.lastInsertRowid);
|
||||||
|
|
||||||
|
protokolliere("support_gemeldet", {
|
||||||
|
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||||
|
detail: `#${id} ${text.slice(0, 80)}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
/* DIE LEITUNG ERFÄHRT ES SOFORT. Eine Meldung, die erst auffällt,
|
||||||
|
wenn jemand die Seite zufällig öffnet, ist keine Meldung,
|
||||||
|
sondern ein Zettel im Schrank.
|
||||||
|
|
||||||
|
NICHT DRINGEND: Ein kaputter Knopf weckt niemanden um drei Uhr
|
||||||
|
nachts. Die Ruhezeit gilt (siehe workspace-push.js). */
|
||||||
|
for (const p of db().prepare(
|
||||||
|
`SELECT id FROM personen WHERE aktiv = 1 AND rolle IN ('admin','hand')`).all()) {
|
||||||
|
benachrichtige(p.id, "support", {
|
||||||
|
titel: "Neue Support-Meldung",
|
||||||
|
text: text.slice(0, 120),
|
||||||
|
ziel: `/workspace/support.html?meldung=${id}`,
|
||||||
|
}).catch(() => { /* eine ausgefallene Benachrichtigung darf die
|
||||||
|
Meldung nicht verhindern */ });
|
||||||
|
}
|
||||||
|
|
||||||
|
const frisch = db().prepare("SELECT * FROM support_meldungen WHERE id = ?").get(id);
|
||||||
|
res.status(201).json({ meldung: nachDraussen(frisch, istLeitung(req.person)) });
|
||||||
|
} catch (fehler) {
|
||||||
|
/* DIE DATEI GEHT MIT, WENN DIE ZEILE NICHT ZUSTANDE KAM. Sonst
|
||||||
|
sammelt der Ordner Bilder an, zu denen es keine Meldung gibt —
|
||||||
|
und niemand merkt es, weil nichts darauf zeigt. */
|
||||||
|
if (geschrieben) { try { unlinkSync(geschrieben); } catch { /* egal */ } }
|
||||||
|
console.error("[support] Melden:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
SICH KÜMMERN — nur die Leitung
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Stand ändern und antworten.
|
||||||
|
*
|
||||||
|
* EINE ROUTE FÜR BEIDES, weil es in der Oberfläche eine Handlung ist:
|
||||||
|
* „erledigt, und zwar deshalb". Zwei Routen hießen zwei Anfragen, und
|
||||||
|
* bei der zweiten kann das Netz abbrechen — dann steht die Meldung
|
||||||
|
* auf „erledigt" ohne den Satz, der sie erklärt. */
|
||||||
|
supportRouter.patch("/workspace/api/support/:id(\\d+)", express.json(), (req, res) => {
|
||||||
|
try {
|
||||||
|
if (!istLeitung(req.person)) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||||
|
const m = db().prepare("SELECT * FROM support_meldungen WHERE id = ?")
|
||||||
|
.get(Number(req.params.id));
|
||||||
|
if (!m) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||||
|
|
||||||
|
/* ERLEDIGT IST ERLEDIGT. Eine geschlossene Meldung wird nicht
|
||||||
|
stillschweigend wieder geöffnet und anders beantwortet — sonst
|
||||||
|
ist „zugemacht" eine Meinung und keine Tatsache. Dieselbe Regel
|
||||||
|
wie im vertraulichen Meldeweg. */
|
||||||
|
if (m.stand === SUPPORT_STAND.erledigt) {
|
||||||
|
return res.status(409).json({
|
||||||
|
fehler: "Diese Meldung ist erledigt. Für etwas Neues bitte eine neue.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const wunsch = String(req.body?.stand || "");
|
||||||
|
if (!Object.values(SUPPORT_STAND).includes(wunsch)) {
|
||||||
|
return res.status(400).json({ fehler: "ungueltiger_stand" });
|
||||||
|
}
|
||||||
|
const antwort = textSauber(req.body?.antwort, ANTWORT_MAX);
|
||||||
|
/* WER ZUMACHT, SAGT WARUM. Nicht als Schikane: Der Melder sieht
|
||||||
|
nur, dass seine Sache zu ist — ohne einen Satz weiß er nicht, ob
|
||||||
|
sie behoben wurde oder ob niemand Lust hatte. */
|
||||||
|
if (wunsch === SUPPORT_STAND.erledigt && antwort.length < 3) {
|
||||||
|
return res.status(400).json({
|
||||||
|
fehler: "Schreib kurz dazu, was daraus geworden ist – der Melder sieht nur das.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const n = jetzt();
|
||||||
|
db().prepare(`UPDATE support_meldungen
|
||||||
|
SET stand = ?, antwort = ?, geaendert = ?,
|
||||||
|
erledigt_am = ?, erledigt_von = ?
|
||||||
|
WHERE id = ?`)
|
||||||
|
.run(wunsch, antwort || m.antwort || null, n,
|
||||||
|
wunsch === SUPPORT_STAND.erledigt ? n : null,
|
||||||
|
wunsch === SUPPORT_STAND.erledigt ? req.person.id : null,
|
||||||
|
m.id);
|
||||||
|
|
||||||
|
protokolliere("support_bearbeitet", {
|
||||||
|
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||||
|
detail: `#${m.id} -> ${wunsch}`,
|
||||||
|
});
|
||||||
|
|
||||||
|
/* DER MELDER ERFÄHRT ES. Wer etwas meldet und nie wieder davon
|
||||||
|
hört, meldet beim nächsten Mal nichts mehr. */
|
||||||
|
if (m.person_id && m.person_id !== req.person.id) {
|
||||||
|
benachrichtige(m.person_id, "support", {
|
||||||
|
titel: wunsch === SUPPORT_STAND.erledigt
|
||||||
|
? "Deine Meldung ist erledigt" : "Jemand kümmert sich",
|
||||||
|
text: antwort ? antwort.slice(0, 120) : m.text.slice(0, 120),
|
||||||
|
ziel: `/workspace/support.html?meldung=${m.id}`,
|
||||||
|
}).catch(() => { /* siehe oben */ });
|
||||||
|
}
|
||||||
|
|
||||||
|
const frisch = db().prepare("SELECT * FROM support_meldungen WHERE id = ?").get(m.id);
|
||||||
|
res.json({ meldung: nachDraussen(frisch, true) });
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[support] Bearbeiten:", fehler?.message);
|
||||||
|
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =====================================================================
|
||||||
|
AUFRÄUMEN
|
||||||
|
===================================================================== */
|
||||||
|
|
||||||
|
/** Erledigte Meldungen nach der Aufbewahrungsfrist entfernen.
|
||||||
|
*
|
||||||
|
* Wird aus dem Rundgang aufgerufen, nicht beim Lesen — sonst hängt
|
||||||
|
* das Aufräumen davon ab, dass jemand die Seite öffnet, und auf einem
|
||||||
|
* ruhigen System wächst der Bilderordner still weiter.
|
||||||
|
*
|
||||||
|
* DIE DATEI GEHT MIT DER ZEILE. Ein Bild ohne Meldung zeigt auf
|
||||||
|
* nichts und niemand findet es je wieder. */
|
||||||
|
export function supportAufraeumen() {
|
||||||
|
try {
|
||||||
|
const grenze = new Date(Date.now() - AUFBEWAHRUNG_TAGE * 86400000).toISOString();
|
||||||
|
const alt = db().prepare(`SELECT id, bild_datei FROM support_meldungen
|
||||||
|
WHERE stand = 'erledigt' AND erledigt_am IS NOT NULL AND erledigt_am < ?`).all(grenze);
|
||||||
|
if (!alt.length) return 0;
|
||||||
|
for (const m of alt) {
|
||||||
|
if (m.bild_datei) {
|
||||||
|
try { unlinkSync(join(BILD_ORDNER, m.bild_datei)); } catch { /* schon weg */ }
|
||||||
|
}
|
||||||
|
db().prepare("DELETE FROM support_meldungen WHERE id = ?").run(m.id);
|
||||||
|
}
|
||||||
|
console.log(`[support] ${alt.length} erledigte Meldungen aelter als `
|
||||||
|
+ `${AUFBEWAHRUNG_TAGE} Tage entfernt.`);
|
||||||
|
return alt.length;
|
||||||
|
} catch (fehler) {
|
||||||
|
console.error("[support] Aufraeumen:", fehler?.message);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -140,6 +140,10 @@ const LANG = {
|
|||||||
"hilfe.html":
|
"hilfe.html":
|
||||||
"Wenn etwas vorgefallen ist, das niemand mitlesen soll. Nur DogFather "
|
"Wenn etwas vorgefallen ist, das niemand mitlesen soll. Nur DogFather "
|
||||||
+ "und die rechte Hand sehen diese Meldungen.",
|
+ "und die rechte Hand sehen diese Meldungen.",
|
||||||
|
"support.html":
|
||||||
|
"Etwas an der Seite funktioniert nicht oder sieht falsch aus? Schreib "
|
||||||
|
+ "einen Satz dazu und häng ein Bildschirmfoto an — DogFather und die "
|
||||||
|
+ "rechte Hand bekommen es sofort und melden sich, wenn es erledigt ist.",
|
||||||
"treff-regeln.html":
|
"treff-regeln.html":
|
||||||
"Wie wir hier miteinander umgehen. Kurz, und es lohnt sich einmal.",
|
"Wie wir hier miteinander umgehen. Kurz, und es lohnt sich einmal.",
|
||||||
"unsere-seiten.html":
|
"unsere-seiten.html":
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import { darfSeite, OHNE_ANMELDUNG, seitenFuer } from "./rechte.js";
|
|||||||
Begruendung im Kopf von treff-tabellen.js. */
|
Begruendung im Kopf von treff-tabellen.js. */
|
||||||
import { treffTabellen, treffSperreLesen, MINDESTALTER } from "./treff-tabellen.js";
|
import { treffTabellen, treffSperreLesen, MINDESTALTER } from "./treff-tabellen.js";
|
||||||
import { hilfeTabellen } from "./hilfe-tabellen.js";
|
import { hilfeTabellen } from "./hilfe-tabellen.js";
|
||||||
|
import { supportTabellen } from "./support-tabellen.js";
|
||||||
import { sitzungPasstZurAdresse, istOhneModiAdresse, istCrewAdresse, istPruefAdresse, AUSSEN_ROLLEN,
|
import { sitzungPasstZurAdresse, istOhneModiAdresse, istCrewAdresse, istPruefAdresse, AUSSEN_ROLLEN,
|
||||||
TEAM_DOGI_ROLLEN, CREW_ADRESSE } from "./crew-adresse.js";
|
TEAM_DOGI_ROLLEN, CREW_ADRESSE } from "./crew-adresse.js";
|
||||||
/* Weitergereicht, damit die Fachmodule sie wie alles andere aus
|
/* Weitergereicht, damit die Fachmodule sie wie alles andere aus
|
||||||
@@ -1569,6 +1570,31 @@ export const TREFF_ROLLEN = new Set(["gast", "modi", "hand", "linke", "admin"]);
|
|||||||
SIE STEHT VOR "FUER DICH": Ein Problem ist dringender als der eigene
|
SIE STEHT VOR "FUER DICH": Ein Problem ist dringender als der eigene
|
||||||
Steckbrief. Die Reihenfolge innerhalb der Gruppe "Fuer dich" ergibt
|
Steckbrief. Die Reihenfolge innerhalb der Gruppe "Fuer dich" ergibt
|
||||||
sich aus der Liste, die Sortierung in start.js fasst beide ans Ende. */
|
sich aus der Liste, die Sortierung in start.js fasst beide ans Ende. */
|
||||||
|
/* DER SUPPORT (24.09.2026).
|
||||||
|
|
||||||
|
Filipe: „da fehlt auch eine support kachel. die jeder sieht. jeder
|
||||||
|
benutzen kann. jeder kann da probleme von der seite melden und
|
||||||
|
hinweisen. fotos mit schicken mit einem text."
|
||||||
|
|
||||||
|
SIE STEHT NICHT IN EINER ROLLENLISTE, sondern wird in
|
||||||
|
`bereicheFuer()` an JEDE angehaengt -- siehe dort. Sie in fuenf
|
||||||
|
Listen einzutragen waere fuenf Gelegenheiten, sie bei der sechsten
|
||||||
|
Rolle zu vergessen; und genau so ist heute der
|
||||||
|
Benachrichtigungs-Knopf auf 14 Seiten verschwunden.
|
||||||
|
|
||||||
|
TON 44: gezaehlt in start.css, wo die Farben wirklich stehen (bis
|
||||||
|
43 vergeben). Danach laeuft `node tools/kachel-farben.mjs
|
||||||
|
--schreiben`, das alle Toene neu gegeneinander rechnet.
|
||||||
|
|
||||||
|
ZEICHEN "schutz" wie beim vertraulichen Meldeweg -- beides sind
|
||||||
|
Wege, auf denen man sich meldet, wenn etwas nicht stimmt. Ein
|
||||||
|
eigenes Zeichen zu erfinden hiesse, zwei Dinge zu unterscheiden,
|
||||||
|
die sich fuer den Benutzer gleich anfuehlen. */
|
||||||
|
const SUPPORT_KACHEL = {
|
||||||
|
name: "Support", unter: "Etwas kaputt? Schreib es mit Bild",
|
||||||
|
zeichen: "schutz", ton: 44, ziel: "support.html", szene: "studio",
|
||||||
|
};
|
||||||
|
|
||||||
const HILFE_KACHEL = {
|
const HILFE_KACHEL = {
|
||||||
gruppe: "Für dich", gruppeUnter: "Deine eigene Seite",
|
gruppe: "Für dich", gruppeUnter: "Deine eigene Seite",
|
||||||
name: "Vertraulich melden", unter: "Nur DogFather und die rechte Hand",
|
name: "Vertraulich melden", unter: "Nur DogFather und die rechte Hand",
|
||||||
@@ -1858,7 +1884,28 @@ const STECKBRIEF_KACHEL_TREFF = {
|
|||||||
/* Die Community: der Treff und ihre eigene Seite. Sonst nichts. */
|
/* Die Community: der Treff und ihre eigene Seite. Sonst nichts. */
|
||||||
const TREFF_MIT_EIGENEM = [...TREFF_BEREICHE, HILFE_KACHEL, STECKBRIEF_KACHEL_TREFF];
|
const TREFF_MIT_EIGENEM = [...TREFF_BEREICHE, HILFE_KACHEL, STECKBRIEF_KACHEL_TREFF];
|
||||||
|
|
||||||
|
/* DIE SUPPORT-KACHEL BEKOMMT JEDER -- an genau einer Stelle
|
||||||
|
angehaengt (24.09.2026).
|
||||||
|
|
||||||
|
`bereicheFuer` gibt je nach Rolle eine von fuenf Listen zurueck,
|
||||||
|
dazu `null` ("nimm die Liste aus dem Browser") und `[]` ("nichts").
|
||||||
|
Die Kachel in jede Liste einzutragen waeren fuenf Aenderungen und
|
||||||
|
fuenf kuenftige Gelegenheiten, eine zu vergessen. Stattdessen
|
||||||
|
haengt diese Huelle sie an das an, was herauskommt.
|
||||||
|
|
||||||
|
`null` UND `[]` BLEIBEN UNANGETASTET, und das ist Absicht:
|
||||||
|
`null` heisst "der Browser hat die Liste" -- dort steht sie in
|
||||||
|
assets/js/bereiche.js und wird dort ergaenzt. `[]` heisst "diese
|
||||||
|
Rolle bekommt gar nichts"; ihr eine einzelne Kachel zu geben waere
|
||||||
|
die Ausnahme, die spaeter niemand mehr erklaeren kann. */
|
||||||
export function bereicheFuer(person) {
|
export function bereicheFuer(person) {
|
||||||
|
const liste = bereicheRoh(person);
|
||||||
|
if (liste === null || !Array.isArray(liste) || !liste.length) return liste;
|
||||||
|
return liste.some((k) => k?.ziel === "support.html")
|
||||||
|
? liste : [...liste, SUPPORT_KACHEL];
|
||||||
|
}
|
||||||
|
|
||||||
|
function bereicheRoh(person) {
|
||||||
if (person?.rolle === "modi") return MODI_MIT_TREFF;
|
if (person?.rolle === "modi") return MODI_MIT_TREFF;
|
||||||
/* Die linke Hand vor der allgemeinen Hand-Regel -- sonst faenge
|
/* Die linke Hand vor der allgemeinen Hand-Regel -- sonst faenge
|
||||||
`istHand()` sie ab, und der Filter darunter liefe nie. */
|
`istHand()` sie ab, und der Filter darunter liefe nie. */
|
||||||
@@ -5261,6 +5308,7 @@ export function db() {
|
|||||||
/* Der vertrauliche Meldeweg (19.09.2026). Haengt an personen und
|
/* Der vertrauliche Meldeweg (19.09.2026). Haengt an personen und
|
||||||
kommt deshalb hierher, nicht in den Bauplan darueber. */
|
kommt deshalb hierher, nicht in den Bauplan darueber. */
|
||||||
hilfeTabellen(d);
|
hilfeTabellen(d);
|
||||||
|
supportTabellen(d);
|
||||||
umstellungen(d);
|
umstellungen(d);
|
||||||
_db = d;
|
_db = d;
|
||||||
return d;
|
return d;
|
||||||
|
|||||||
@@ -234,7 +234,36 @@ for (const ziel of nummern) {
|
|||||||
const alt = Math.min(...andere.map((t) => abstand(vorher.lab, t.lab)));
|
const alt = Math.min(...andere.map((t) => abstand(vorher.lab, t.lab)));
|
||||||
const neu = beste(andere);
|
const neu = beste(andere);
|
||||||
|
|
||||||
if (neu.abstand <= alt) {
|
/* EIN UNGUELTIGER IST-WERT IST KEINE MESSLATTE (24.09.2026).
|
||||||
|
|
||||||
|
Gefunden beim Eintragen von Ton 44 -- und es war GENAU DERSELBE
|
||||||
|
FEHLER wie am 22.09., nur eine Ebene hoeher.
|
||||||
|
|
||||||
|
Damals: Die Suche lief bis Buntheit 0,04 herunter, die Pruefung
|
||||||
|
verlangt 0,12. Behoben, indem beide dieselbe Zahl lesen.
|
||||||
|
|
||||||
|
Heute: Ich hatte fuer Ton 44 von Hand ein zu blasses #bcdbff
|
||||||
|
eingetragen (Buntheit 0,060). Dieses Werkzeug las es als
|
||||||
|
Ausgangswert, verglich den besten NEUEN Vorschlag dagegen -- und
|
||||||
|
meldete "bleibt #bcdbff, nichts Besseres gefunden". Der Abstand
|
||||||
|
war tatsaechlich groesser; nur war der Ist-Wert gar nicht
|
||||||
|
zulaessig. Ein Werkzeug, das einen regelwidrigen Zustand
|
||||||
|
verteidigt, weil er zufaellig gut misst, haelt genau den Fehler
|
||||||
|
fest, den es beheben soll.
|
||||||
|
|
||||||
|
Geprueft werden deshalb ZUERST die Regeln, dann der Abstand. */
|
||||||
|
const istBuntheit = Math.hypot(vorher.lab[1], vorher.lab[2]);
|
||||||
|
const istGueltig = istBuntheit >= MINDEST_BUNTHEIT
|
||||||
|
&& kontrast(vorher.hex) >= MINDEST_KONTRAST;
|
||||||
|
if (!istGueltig) {
|
||||||
|
console.log(`
|
||||||
|
Ton ${ziel} (${vorher.wofuer}): ${vorher.hex} haelt die Regeln `
|
||||||
|
+ `nicht ein (Buntheit ${istBuntheit.toFixed(3)}, `
|
||||||
|
+ `Kontrast ${kontrast(vorher.hex).toFixed(2)}:1) -- er wird ersetzt, `
|
||||||
|
+ "egal wie gut sein Abstand ist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (istGueltig && neu.abstand <= alt) {
|
||||||
console.log(`\nTon ${ziel} (${vorher.wofuer}): bleibt ${vorher.hex} — `
|
console.log(`\nTon ${ziel} (${vorher.wofuer}): bleibt ${vorher.hex} — `
|
||||||
+ `nichts Besseres gefunden (${alt.toFixed(4)}).`);
|
+ `nichts Besseres gefunden (${alt.toFixed(4)}).`);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -16,15 +16,15 @@
|
|||||||
verdeckt. Gefunden hat es pruef-struktur.
|
verdeckt. Gefunden hat es pruef-struktur.
|
||||||
|
|
||||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||||
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
||||||
<link rel="manifest" href="/workspace/crew.webmanifest" />
|
<link rel="manifest" href="/workspace/crew.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<style>
|
<style>
|
||||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/anruf-probe.js?v=202609240105" defer></script>
|
<script src="assets/js/anruf-probe.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -23,25 +23,25 @@
|
|||||||
},
|
},
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609240105",
|
"src": "/assets/img/app-symbole/workspace-192.png?v=202609240132",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609240105",
|
"src": "/assets/img/app-symbole/workspace-512.png?v=202609240132",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609240105",
|
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609240132",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609240105",
|
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609240132",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
|
|||||||
+111
-94
@@ -1136,6 +1136,20 @@ body.start > main { position: relative; z-index: 1; }
|
|||||||
[data-ton="41"] { --ton: #6d8cfe; } /* Treff-Chat */
|
[data-ton="41"] { --ton: #6d8cfe; } /* Treff-Chat */
|
||||||
[data-ton="42"] { --ton: #918a01; } /* Material (Platzhalter, wird gerechnet) */
|
[data-ton="42"] { --ton: #918a01; } /* Material (Platzhalter, wird gerechnet) */
|
||||||
[data-ton="43"] { --ton: #027afb; } /* Calls & Protokolle (gerechnet 22.09.2026) */
|
[data-ton="43"] { --ton: #027afb; } /* Calls & Protokolle (gerechnet 22.09.2026) */
|
||||||
|
/* GERECHNET, NICHT GEWAEHLT (24.09.2026) -- mit
|
||||||
|
`node tools/kachel-farben.mjs --neu 44`, das die Farbe sucht, die
|
||||||
|
von den 43 vorhandenen am weitesten entfernt liegt, ohne eine
|
||||||
|
einzige davon anzufassen.
|
||||||
|
|
||||||
|
Abstand zur naechsten vorhandenen Farbe 0,1339 -- das engste
|
||||||
|
vorhandene Paar liegt bei 0,0154, sie ist also fast neunmal weiter
|
||||||
|
weg als das schwaechste Glied. Kontrast 13,16:1.
|
||||||
|
|
||||||
|
HELL, ABER NICHT DIE HELLSTE: nachgemessen liegen Ton 30 (15,56:1),
|
||||||
|
36 (15,19), 26 (14,83), 22 (14,77) und 37 (14,14) darueber. Die
|
||||||
|
Sorge, eine fast weisse Kachel koennte blenden, war unbegruendet --
|
||||||
|
gemessen statt vermutet. */
|
||||||
|
[data-ton="44"] { --ton: #fd6401; } /* Support (gerechnet 24.09.2026) */
|
||||||
|
|
||||||
/* Rückfallwert für alles, was einen Ton braucht, aber keine Nummer hat.
|
/* Rückfallwert für alles, was einen Ton braucht, aber keine Nummer hat.
|
||||||
Steht bewusst in :where() -- damit zählt die Zeile beim Wettstreit der
|
Steht bewusst in :where() -- damit zählt die Zeile beim Wettstreit der
|
||||||
@@ -8416,8 +8430,8 @@ body.start .k-leiste .feldschild::after {
|
|||||||
|
|
||||||
/* ---- ANFANG GERECHNET: kachel-regenbogen.mjs ---- */
|
/* ---- ANFANG GERECHNET: kachel-regenbogen.mjs ---- */
|
||||||
/* ERZEUGT VON tools/kachel-regenbogen.mjs — NICHT VON HAND ÄNDERN.
|
/* ERZEUGT VON tools/kachel-regenbogen.mjs — NICHT VON HAND ÄNDERN.
|
||||||
96 Punkte in drei Größen, jede Größe einmal alle
|
99 Punkte in drei Größen, jede Größe einmal alle
|
||||||
32 benutzten Kacheltöne. Die Liste ist aus den
|
33 benutzten Kacheltöne. Die Liste ist aus den
|
||||||
Kachellisten abgeleitet; wer eine Kachel hinzufügt, lässt das
|
Kachellisten abgeleitet; wer eine Kachel hinzufügt, lässt das
|
||||||
Werkzeug erneut laufen. pruef-kachelfarben zählt nach, ob beides
|
Werkzeug erneut laufen. pruef-kachelfarben zählt nach, ob beides
|
||||||
noch zusammenpasst. */
|
noch zusammenpasst. */
|
||||||
@@ -8446,109 +8460,112 @@ body.start .k-leiste .feldschild::after {
|
|||||||
zwischen einem Licht und einem gestanzten Kreis. Dieselbe
|
zwischen einem Licht und einem gestanzten Kreis. Dieselbe
|
||||||
Bauart wie die „nahen Sterne" auf jeder anderen Kachel. */
|
Bauart wie die „nahen Sterne" auf jeder anderen Kachel. */
|
||||||
radial-gradient(4.82px 4.82px at 21.3px 22.8px, color-mix(in srgb, #07fff1 88%, #ffffff), color-mix(in srgb, #07fff1 88%, #ffffff) 34%, color-mix(in srgb, #07fff1 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.82px 4.82px at 21.3px 22.8px, color-mix(in srgb, #07fff1 88%, #ffffff), color-mix(in srgb, #07fff1 88%, #ffffff) 34%, color-mix(in srgb, #07fff1 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.48px 5.48px at 50.6px 7.0px, color-mix(in srgb, #e701c1 88%, #ffffff), color-mix(in srgb, #e701c1 88%, #ffffff) 34%, color-mix(in srgb, #e701c1 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.48px 5.48px at 50.6px 7.0px, color-mix(in srgb, #fe8ebe 88%, #ffffff), color-mix(in srgb, #fe8ebe 88%, #ffffff) 34%, color-mix(in srgb, #fe8ebe 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.57px 6.57px at 81.2px 6.7px, color-mix(in srgb, #eeef08 88%, #ffffff), color-mix(in srgb, #eeef08 88%, #ffffff) 34%, color-mix(in srgb, #eeef08 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.57px 6.57px at 81.2px 6.7px, color-mix(in srgb, #72d512 88%, #ffffff), color-mix(in srgb, #72d512 88%, #ffffff) 34%, color-mix(in srgb, #72d512 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.71px 4.71px at 110.3px 23.0px, color-mix(in srgb, #0ed1d0 88%, #ffffff), color-mix(in srgb, #0ed1d0 88%, #ffffff) 34%, color-mix(in srgb, #0ed1d0 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.71px 4.71px at 110.3px 23.0px, color-mix(in srgb, #b699fe 88%, #ffffff), color-mix(in srgb, #b699fe 88%, #ffffff) 34%, color-mix(in srgb, #b699fe 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.88px 4.88px at 154.3px 8.0px, color-mix(in srgb, #ff57ba 88%, #ffffff), color-mix(in srgb, #ff57ba 88%, #ffffff) 34%, color-mix(in srgb, #ff57ba 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.88px 4.88px at 154.3px 8.0px, color-mix(in srgb, #c16302 88%, #ffffff), color-mix(in srgb, #c16302 88%, #ffffff) 34%, color-mix(in srgb, #c16302 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.83px 4.83px at 185.7px 11.5px, color-mix(in srgb, #cace02 88%, #ffffff), color-mix(in srgb, #cace02 88%, #ffffff) 34%, color-mix(in srgb, #cace02 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.83px 4.83px at 185.7px 11.5px, color-mix(in srgb, #12b37e 88%, #ffffff), color-mix(in srgb, #12b37e 88%, #ffffff) 34%, color-mix(in srgb, #12b37e 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.33px 4.33px at 16.5px 42.0px, color-mix(in srgb, #0687bc 88%, #ffffff), color-mix(in srgb, #0687bc 88%, #ffffff) 34%, color-mix(in srgb, #0687bc 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.33px 4.33px at 16.5px 42.0px, color-mix(in srgb, #ff57ba 88%, #ffffff), color-mix(in srgb, #ff57ba 88%, #ffffff) 34%, color-mix(in srgb, #ff57ba 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.17px 5.17px at 49.7px 52.7px, color-mix(in srgb, #fe8ebe 88%, #ffffff), color-mix(in srgb, #fe8ebe 88%, #ffffff) 34%, color-mix(in srgb, #fe8ebe 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.17px 5.17px at 49.7px 52.7px, color-mix(in srgb, #a2af10 88%, #ffffff), color-mix(in srgb, #a2af10 88%, #ffffff) 34%, color-mix(in srgb, #a2af10 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.63px 4.63px at 82.5px 47.6px, color-mix(in srgb, #a2af10 88%, #ffffff), color-mix(in srgb, #a2af10 88%, #ffffff) 34%, color-mix(in srgb, #a2af10 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.63px 4.63px at 82.5px 47.6px, color-mix(in srgb, #6d8cfe 88%, #ffffff), color-mix(in srgb, #6d8cfe 88%, #ffffff) 34%, color-mix(in srgb, #6d8cfe 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.55px 4.55px at 105.1px 54.1px, color-mix(in srgb, #08b5fc 88%, #ffffff), color-mix(in srgb, #08b5fc 88%, #ffffff) 34%, color-mix(in srgb, #08b5fc 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.55px 4.55px at 105.1px 54.1px, color-mix(in srgb, #fd6401 88%, #ffffff), color-mix(in srgb, #fd6401 88%, #ffffff) 34%, color-mix(in srgb, #fd6401 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.07px 6.07px at 149.6px 56.3px, color-mix(in srgb, #f10778 88%, #ffffff), color-mix(in srgb, #f10778 88%, #ffffff) 34%, color-mix(in srgb, #f10778 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.07px 6.07px at 149.6px 56.3px, color-mix(in srgb, #08eb9f 88%, #ffffff), color-mix(in srgb, #08eb9f 88%, #ffffff) 34%, color-mix(in srgb, #08eb9f 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.34px 4.34px at 182.8px 53.3px, color-mix(in srgb, #72d512 88%, #ffffff), color-mix(in srgb, #72d512 88%, #ffffff) 34%, color-mix(in srgb, #72d512 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.34px 4.34px at 182.8px 53.3px, color-mix(in srgb, #e701c1 88%, #ffffff), color-mix(in srgb, #e701c1 88%, #ffffff) 34%, color-mix(in srgb, #e701c1 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.58px 5.58px at 14.4px 89.8px, color-mix(in srgb, #027afb 88%, #ffffff), color-mix(in srgb, #027afb 88%, #ffffff) 34%, color-mix(in srgb, #027afb 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.58px 5.58px at 14.4px 89.8px, color-mix(in srgb, #cace02 88%, #ffffff), color-mix(in srgb, #cace02 88%, #ffffff) 34%, color-mix(in srgb, #cace02 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.55px 4.55px at 56.4px 81.9px, color-mix(in srgb, #ff6877 88%, #ffffff), color-mix(in srgb, #ff6877 88%, #ffffff) 34%, color-mix(in srgb, #ff6877 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.55px 4.55px at 56.4px 81.9px, color-mix(in srgb, #027afb 88%, #ffffff), color-mix(in srgb, #027afb 88%, #ffffff) 34%, color-mix(in srgb, #027afb 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.65px 5.65px at 78.8px 88.9px, color-mix(in srgb, #61ff09 88%, #ffffff), color-mix(in srgb, #61ff09 88%, #ffffff) 34%, color-mix(in srgb, #61ff09 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.65px 5.65px at 78.8px 88.9px, color-mix(in srgb, #ff9d82 88%, #ffffff), color-mix(in srgb, #ff9d82 88%, #ffffff) 34%, color-mix(in srgb, #ff9d82 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.85px 4.85px at 113.3px 78.4px, color-mix(in srgb, #6d8cfe 88%, #ffffff), color-mix(in srgb, #6d8cfe 88%, #ffffff) 34%, color-mix(in srgb, #6d8cfe 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.85px 4.85px at 113.3px 78.4px, color-mix(in srgb, #069511 88%, #ffffff), color-mix(in srgb, #069511 88%, #ffffff) 34%, color-mix(in srgb, #069511 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.40px 4.40px at 142.4px 90.0px, color-mix(in srgb, #ff1a1a 88%, #ffffff), color-mix(in srgb, #ff1a1a 88%, #ffffff) 34%, color-mix(in srgb, #ff1a1a 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.40px 4.40px at 142.4px 90.0px, color-mix(in srgb, #f4acff 88%, #ffffff), color-mix(in srgb, #f4acff 88%, #ffffff) 34%, color-mix(in srgb, #f4acff 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.65px 4.65px at 190.5px 85.8px, color-mix(in srgb, #a7ff98 88%, #ffffff), color-mix(in srgb, #a7ff98 88%, #ffffff) 34%, color-mix(in srgb, #a7ff98 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.65px 4.65px at 190.5px 85.8px, color-mix(in srgb, #eeef08 88%, #ffffff), color-mix(in srgb, #eeef08 88%, #ffffff) 34%, color-mix(in srgb, #eeef08 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.19px 6.19px at 20.7px 123.9px, color-mix(in srgb, #b699fe 88%, #ffffff), color-mix(in srgb, #b699fe 88%, #ffffff) 34%, color-mix(in srgb, #b699fe 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.19px 6.19px at 20.7px 123.9px, color-mix(in srgb, #08b5fc 88%, #ffffff), color-mix(in srgb, #08b5fc 88%, #ffffff) 34%, color-mix(in srgb, #08b5fc 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.44px 5.44px at 56.7px 116.6px, color-mix(in srgb, #ff9d82 88%, #ffffff), color-mix(in srgb, #ff9d82 88%, #ffffff) 34%, color-mix(in srgb, #ff9d82 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.44px 5.44px at 56.7px 116.6px, color-mix(in srgb, #ff1a1a 88%, #ffffff), color-mix(in srgb, #ff1a1a 88%, #ffffff) 34%, color-mix(in srgb, #ff1a1a 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.28px 6.28px at 89.2px 122.9px, color-mix(in srgb, #18b803 88%, #ffffff), color-mix(in srgb, #18b803 88%, #ffffff) 34%, color-mix(in srgb, #18b803 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.28px 6.28px at 89.2px 122.9px, color-mix(in srgb, #18b803 88%, #ffffff), color-mix(in srgb, #18b803 88%, #ffffff) 34%, color-mix(in srgb, #18b803 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.52px 4.52px at 105.6px 108.9px, color-mix(in srgb, #ab68ff 88%, #ffffff), color-mix(in srgb, #ab68ff 88%, #ffffff) 34%, color-mix(in srgb, #ab68ff 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.52px 4.52px at 105.6px 108.9px, color-mix(in srgb, #e871ff 88%, #ffffff), color-mix(in srgb, #e871ff 88%, #ffffff) 34%, color-mix(in srgb, #e871ff 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.31px 4.31px at 150.4px 108.8px, color-mix(in srgb, #c16302 88%, #ffffff), color-mix(in srgb, #c16302 88%, #ffffff) 34%, color-mix(in srgb, #c16302 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.31px 4.31px at 150.4px 108.8px, color-mix(in srgb, #918a01 88%, #ffffff), color-mix(in srgb, #918a01 88%, #ffffff) 34%, color-mix(in srgb, #918a01 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.83px 5.83px at 189.4px 117.4px, color-mix(in srgb, #069511 88%, #ffffff), color-mix(in srgb, #069511 88%, #ffffff) 34%, color-mix(in srgb, #069511 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.83px 5.83px at 189.4px 117.4px, color-mix(in srgb, #0687bc 88%, #ffffff), color-mix(in srgb, #0687bc 88%, #ffffff) 34%, color-mix(in srgb, #0687bc 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.38px 4.38px at 10.9px 139.1px, color-mix(in srgb, #d21afd 88%, #ffffff), color-mix(in srgb, #d21afd 88%, #ffffff) 34%, color-mix(in srgb, #d21afd 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.38px 4.38px at 10.9px 139.1px, color-mix(in srgb, #ff6877 88%, #ffffff), color-mix(in srgb, #ff6877 88%, #ffffff) 34%, color-mix(in srgb, #ff6877 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.29px 6.29px at 54.7px 155.9px, color-mix(in srgb, #db8908 88%, #ffffff), color-mix(in srgb, #db8908 88%, #ffffff) 34%, color-mix(in srgb, #db8908 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.29px 6.29px at 54.7px 155.9px, color-mix(in srgb, #a7ff98 88%, #ffffff), color-mix(in srgb, #a7ff98 88%, #ffffff) 34%, color-mix(in srgb, #a7ff98 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.12px 6.12px at 75.1px 154.0px, color-mix(in srgb, #08eb9f 88%, #ffffff), color-mix(in srgb, #08eb9f 88%, #ffffff) 34%, color-mix(in srgb, #08eb9f 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.12px 6.12px at 75.1px 154.0px, color-mix(in srgb, #d21afd 88%, #ffffff), color-mix(in srgb, #d21afd 88%, #ffffff) 34%, color-mix(in srgb, #d21afd 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(6.08px 6.08px at 123.3px 154.7px, color-mix(in srgb, #e871ff 88%, #ffffff), color-mix(in srgb, #e871ff 88%, #ffffff) 34%, color-mix(in srgb, #e871ff 55%, transparent) 52%, transparent 100%),
|
radial-gradient(6.08px 6.08px at 123.3px 154.7px, color-mix(in srgb, #ffbd4a 88%, #ffffff), color-mix(in srgb, #ffbd4a 88%, #ffffff) 34%, color-mix(in srgb, #ffbd4a 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.81px 5.81px at 141.2px 142.7px, color-mix(in srgb, #ffbd4a 88%, #ffffff), color-mix(in srgb, #ffbd4a 88%, #ffffff) 34%, color-mix(in srgb, #ffbd4a 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.81px 5.81px at 141.2px 142.7px, color-mix(in srgb, #0ed1d0 88%, #ffffff), color-mix(in srgb, #0ed1d0 88%, #ffffff) 34%, color-mix(in srgb, #0ed1d0 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.42px 4.42px at 177.4px 144.5px, color-mix(in srgb, #12b37e 88%, #ffffff), color-mix(in srgb, #12b37e 88%, #ffffff) 34%, color-mix(in srgb, #12b37e 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.42px 4.42px at 177.4px 144.5px, color-mix(in srgb, #f10778 88%, #ffffff), color-mix(in srgb, #f10778 88%, #ffffff) 34%, color-mix(in srgb, #f10778 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(5.16px 5.16px at 17.7px 183.1px, color-mix(in srgb, #f4acff 88%, #ffffff), color-mix(in srgb, #f4acff 88%, #ffffff) 34%, color-mix(in srgb, #f4acff 55%, transparent) 52%, transparent 100%),
|
radial-gradient(5.16px 5.16px at 17.7px 183.1px, color-mix(in srgb, #61ff09 88%, #ffffff), color-mix(in srgb, #61ff09 88%, #ffffff) 34%, color-mix(in srgb, #61ff09 55%, transparent) 52%, transparent 100%),
|
||||||
radial-gradient(4.80px 4.80px at 46.6px 182.2px, color-mix(in srgb, #918a01 88%, #ffffff), color-mix(in srgb, #918a01 88%, #ffffff) 34%, color-mix(in srgb, #918a01 55%, transparent) 52%, transparent 100%),
|
radial-gradient(4.80px 4.80px at 46.6px 182.2px, color-mix(in srgb, #ab68ff 88%, #ffffff), color-mix(in srgb, #ab68ff 88%, #ffffff) 34%, color-mix(in srgb, #ab68ff 55%, transparent) 52%, transparent 100%),
|
||||||
|
radial-gradient(5.00px 5.00px at 80.1px 179.7px, color-mix(in srgb, #db8908 88%, #ffffff), color-mix(in srgb, #db8908 88%, #ffffff) 34%, color-mix(in srgb, #db8908 55%, transparent) 52%, transparent 100%),
|
||||||
|
|
||||||
/* 4. DIE MITTLEREN — die Masse des Feldes. */
|
/* 4. DIE MITTLEREN — die Masse des Feldes. */
|
||||||
radial-gradient(3.21px 3.21px at 5.1px 5.6px, color-mix(in srgb, #07fff1 82%, #ffffff), color-mix(in srgb, #07fff1 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.21px 3.21px at 5.1px 5.6px, color-mix(in srgb, #07fff1 82%, #ffffff), color-mix(in srgb, #07fff1 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.60px 3.60px at 30.9px 16.4px, color-mix(in srgb, #e871ff 82%, #ffffff), color-mix(in srgb, #e871ff 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.60px 3.60px at 30.9px 16.4px, color-mix(in srgb, #d21afd 82%, #ffffff), color-mix(in srgb, #d21afd 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.00px 3.00px at 52.4px 11.5px, color-mix(in srgb, #c16302 82%, #ffffff), color-mix(in srgb, #c16302 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.00px 3.00px at 52.4px 11.5px, color-mix(in srgb, #ff1a1a 82%, #ffffff), color-mix(in srgb, #ff1a1a 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.86px 2.86px at 82.4px 14.9px, color-mix(in srgb, #a7ff98 82%, #ffffff), color-mix(in srgb, #a7ff98 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.86px 2.86px at 82.4px 14.9px, color-mix(in srgb, #cace02 82%, #ffffff), color-mix(in srgb, #cace02 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.96px 2.96px at 98.8px 9.3px, color-mix(in srgb, #027afb 82%, #ffffff), color-mix(in srgb, #027afb 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.96px 2.96px at 98.8px 9.3px, color-mix(in srgb, #12b37e 82%, #ffffff), color-mix(in srgb, #12b37e 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.65px 2.65px at 121.0px 14.2px, color-mix(in srgb, #fe8ebe 82%, #ffffff), color-mix(in srgb, #fe8ebe 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.65px 2.65px at 121.0px 14.2px, color-mix(in srgb, #ab68ff 82%, #ffffff), color-mix(in srgb, #ab68ff 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.49px 2.49px at 11.8px 26.8px, color-mix(in srgb, #eeef08 82%, #ffffff), color-mix(in srgb, #eeef08 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.49px 2.49px at 11.8px 26.8px, color-mix(in srgb, #ff6877 82%, #ffffff), color-mix(in srgb, #ff6877 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.92px 2.92px at 33.8px 37.3px, color-mix(in srgb, #12b37e 82%, #ffffff), color-mix(in srgb, #12b37e 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.92px 2.92px at 33.8px 37.3px, color-mix(in srgb, #eeef08 82%, #ffffff), color-mix(in srgb, #eeef08 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.47px 2.47px at 55.5px 38.6px, color-mix(in srgb, #d21afd 82%, #ffffff), color-mix(in srgb, #d21afd 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.47px 2.47px at 55.5px 38.6px, color-mix(in srgb, #08eb9f 82%, #ffffff), color-mix(in srgb, #08eb9f 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.55px 2.55px at 74.8px 28.0px, color-mix(in srgb, #ff9d82 82%, #ffffff), color-mix(in srgb, #ff9d82 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.55px 2.55px at 74.8px 28.0px, color-mix(in srgb, #b699fe 82%, #ffffff), color-mix(in srgb, #b699fe 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.43px 2.43px at 103.9px 38.4px, color-mix(in srgb, #61ff09 82%, #ffffff), color-mix(in srgb, #61ff09 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.43px 2.43px at 103.9px 38.4px, color-mix(in srgb, #f10778 82%, #ffffff), color-mix(in srgb, #f10778 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.62px 2.62px at 124.3px 27.3px, color-mix(in srgb, #08b5fc 82%, #ffffff), color-mix(in srgb, #08b5fc 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.62px 2.62px at 124.3px 27.3px, color-mix(in srgb, #918a01 82%, #ffffff), color-mix(in srgb, #918a01 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.61px 2.61px at 6.8px 55.0px, color-mix(in srgb, #ff57ba 82%, #ffffff), color-mix(in srgb, #ff57ba 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.61px 2.61px at 6.8px 55.0px, color-mix(in srgb, #069511 82%, #ffffff), color-mix(in srgb, #069511 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.19px 3.19px at 36.1px 60.1px, color-mix(in srgb, #918a01 82%, #ffffff), color-mix(in srgb, #918a01 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.19px 3.19px at 36.1px 60.1px, color-mix(in srgb, #6d8cfe 82%, #ffffff), color-mix(in srgb, #6d8cfe 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.63px 3.63px at 56.8px 55.5px, color-mix(in srgb, #08eb9f 82%, #ffffff), color-mix(in srgb, #08eb9f 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.63px 3.63px at 56.8px 55.5px, color-mix(in srgb, #fe8ebe 82%, #ffffff), color-mix(in srgb, #fe8ebe 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.62px 2.62px at 82.6px 57.2px, color-mix(in srgb, #ab68ff 82%, #ffffff), color-mix(in srgb, #ab68ff 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.62px 2.62px at 82.6px 57.2px, color-mix(in srgb, #ffbd4a 82%, #ffffff), color-mix(in srgb, #ffbd4a 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.89px 2.89px at 97.7px 59.0px, color-mix(in srgb, #ff1a1a 82%, #ffffff), color-mix(in srgb, #ff1a1a 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.89px 2.89px at 97.7px 59.0px, color-mix(in srgb, #18b803 82%, #ffffff), color-mix(in srgb, #18b803 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.29px 3.29px at 125.8px 57.6px, color-mix(in srgb, #72d512 82%, #ffffff), color-mix(in srgb, #72d512 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.29px 3.29px at 125.8px 57.6px, color-mix(in srgb, #027afb 82%, #ffffff), color-mix(in srgb, #027afb 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.52px 2.52px at 10.9px 83.0px, color-mix(in srgb, #0687bc 82%, #ffffff), color-mix(in srgb, #0687bc 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.52px 2.52px at 10.9px 83.0px, color-mix(in srgb, #ff57ba 82%, #ffffff), color-mix(in srgb, #ff57ba 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.37px 2.37px at 33.1px 72.6px, color-mix(in srgb, #e701c1 82%, #ffffff), color-mix(in srgb, #e701c1 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.37px 2.37px at 33.1px 72.6px, color-mix(in srgb, #db8908 82%, #ffffff), color-mix(in srgb, #db8908 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.21px 3.21px at 54.6px 78.8px, color-mix(in srgb, #ffbd4a 82%, #ffffff), color-mix(in srgb, #ffbd4a 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.21px 3.21px at 54.6px 78.8px, color-mix(in srgb, #a7ff98 82%, #ffffff), color-mix(in srgb, #a7ff98 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.43px 3.43px at 71.0px 71.9px, color-mix(in srgb, #069511 82%, #ffffff), color-mix(in srgb, #069511 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.43px 3.43px at 71.0px 71.9px, color-mix(in srgb, #08b5fc 82%, #ffffff), color-mix(in srgb, #08b5fc 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.16px 3.16px at 92.6px 70.6px, color-mix(in srgb, #b699fe 82%, #ffffff), color-mix(in srgb, #b699fe 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.16px 3.16px at 92.6px 70.6px, color-mix(in srgb, #e701c1 82%, #ffffff), color-mix(in srgb, #e701c1 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.22px 3.22px at 118.9px 78.1px, color-mix(in srgb, #ff6877 82%, #ffffff), color-mix(in srgb, #ff6877 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.22px 3.22px at 118.9px 78.1px, color-mix(in srgb, #c16302 82%, #ffffff), color-mix(in srgb, #c16302 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.50px 2.50px at 16.0px 101.8px, color-mix(in srgb, #a2af10 82%, #ffffff), color-mix(in srgb, #a2af10 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.50px 2.50px at 16.0px 101.8px, color-mix(in srgb, #61ff09 82%, #ffffff), color-mix(in srgb, #61ff09 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.80px 2.80px at 33.8px 102.3px, color-mix(in srgb, #0ed1d0 82%, #ffffff), color-mix(in srgb, #0ed1d0 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.80px 2.80px at 33.8px 102.3px, color-mix(in srgb, #0687bc 82%, #ffffff), color-mix(in srgb, #0687bc 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.52px 2.52px at 49.8px 93.9px, color-mix(in srgb, #f4acff 82%, #ffffff), color-mix(in srgb, #f4acff 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.52px 2.52px at 49.8px 93.9px, color-mix(in srgb, #f4acff 82%, #ffffff), color-mix(in srgb, #f4acff 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.87px 2.87px at 77.0px 95.8px, color-mix(in srgb, #db8908 82%, #ffffff), color-mix(in srgb, #db8908 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.87px 2.87px at 77.0px 95.8px, color-mix(in srgb, #fd6401 82%, #ffffff), color-mix(in srgb, #fd6401 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.37px 2.37px at 101.9px 95.3px, color-mix(in srgb, #18b803 82%, #ffffff), color-mix(in srgb, #18b803 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.37px 2.37px at 101.9px 95.3px, color-mix(in srgb, #72d512 82%, #ffffff), color-mix(in srgb, #72d512 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.42px 3.42px at 113.5px 91.8px, color-mix(in srgb, #6d8cfe 82%, #ffffff), color-mix(in srgb, #6d8cfe 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.42px 3.42px at 113.5px 91.8px, color-mix(in srgb, #0ed1d0 82%, #ffffff), color-mix(in srgb, #0ed1d0 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(3.22px 3.22px at 12.7px 116.5px, color-mix(in srgb, #f10778 82%, #ffffff), color-mix(in srgb, #f10778 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(3.22px 3.22px at 12.7px 116.5px, color-mix(in srgb, #e871ff 82%, #ffffff), color-mix(in srgb, #e871ff 82%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.35px 2.35px at 26.5px 120.2px, color-mix(in srgb, #cace02 82%, #ffffff), color-mix(in srgb, #cace02 82%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.35px 2.35px at 26.5px 120.2px, color-mix(in srgb, #ff9d82 82%, #ffffff), color-mix(in srgb, #ff9d82 82%, #ffffff) 34%, transparent 100%),
|
||||||
|
radial-gradient(3.34px 3.34px at 53.1px 119.0px, color-mix(in srgb, #a2af10 82%, #ffffff), color-mix(in srgb, #a2af10 82%, #ffffff) 34%, transparent 100%),
|
||||||
|
|
||||||
/* 5. DER FEINE STAUB. Er füllt die Lücken: Ein Feld aus nur
|
/* 5. DER FEINE STAUB. Er füllt die Lücken: Ein Feld aus nur
|
||||||
großen Punkten sieht aus wie aufgeklebt. */
|
großen Punkten sieht aus wie aufgeklebt. */
|
||||||
radial-gradient(1.70px 1.70px at 6.2px 11.0px, color-mix(in srgb, #07fff1 74%, #ffffff), color-mix(in srgb, #07fff1 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.70px 1.70px at 6.2px 11.0px, color-mix(in srgb, #07fff1 74%, #ffffff), color-mix(in srgb, #07fff1 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.00px 2.00px at 19.0px 4.4px, color-mix(in srgb, #ab68ff 74%, #ffffff), color-mix(in srgb, #ab68ff 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.00px 2.00px at 19.0px 4.4px, color-mix(in srgb, #ab68ff 74%, #ffffff), color-mix(in srgb, #ab68ff 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.88px 1.88px at 38.0px 4.6px, color-mix(in srgb, #f10778 74%, #ffffff), color-mix(in srgb, #f10778 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.88px 1.88px at 38.0px 4.6px, color-mix(in srgb, #f10778 74%, #ffffff), color-mix(in srgb, #f10778 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.78px 1.78px at 49.4px 2.8px, color-mix(in srgb, #918a01 74%, #ffffff), color-mix(in srgb, #918a01 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.78px 1.78px at 49.4px 2.8px, color-mix(in srgb, #ffbd4a 74%, #ffffff), color-mix(in srgb, #ffbd4a 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.68px 1.68px at 65.7px 3.2px, color-mix(in srgb, #18b803 74%, #ffffff), color-mix(in srgb, #18b803 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.68px 1.68px at 65.7px 3.2px, color-mix(in srgb, #a7ff98 74%, #ffffff), color-mix(in srgb, #a7ff98 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.75px 1.75px at 77.7px 7.7px, color-mix(in srgb, #08b5fc 74%, #ffffff), color-mix(in srgb, #08b5fc 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.75px 1.75px at 77.7px 7.7px, color-mix(in srgb, #0687bc 74%, #ffffff), color-mix(in srgb, #0687bc 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.44px 1.44px at 3.7px 23.9px, color-mix(in srgb, #f4acff 74%, #ffffff), color-mix(in srgb, #f4acff 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.44px 1.44px at 3.7px 23.9px, color-mix(in srgb, #e871ff 74%, #ffffff), color-mix(in srgb, #e871ff 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.64px 1.64px at 23.7px 21.2px, color-mix(in srgb, #ff9d82 74%, #ffffff), color-mix(in srgb, #ff9d82 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.64px 1.64px at 23.7px 21.2px, color-mix(in srgb, #ff1a1a 74%, #ffffff), color-mix(in srgb, #ff1a1a 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.53px 1.53px at 30.8px 17.1px, color-mix(in srgb, #a2af10 74%, #ffffff), color-mix(in srgb, #a2af10 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.53px 1.53px at 30.8px 17.1px, color-mix(in srgb, #eeef08 74%, #ffffff), color-mix(in srgb, #eeef08 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.69px 1.69px at 46.6px 21.7px, color-mix(in srgb, #12b37e 74%, #ffffff), color-mix(in srgb, #12b37e 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.69px 1.69px at 46.6px 21.7px, color-mix(in srgb, #069511 74%, #ffffff), color-mix(in srgb, #069511 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(2.03px 2.03px at 64.3px 18.5px, color-mix(in srgb, #b699fe 74%, #ffffff), color-mix(in srgb, #b699fe 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(2.03px 2.03px at 64.3px 18.5px, color-mix(in srgb, #027afb 74%, #ffffff), color-mix(in srgb, #027afb 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.36px 1.36px at 77.2px 20.7px, color-mix(in srgb, #fe8ebe 74%, #ffffff), color-mix(in srgb, #fe8ebe 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.36px 1.36px at 77.2px 20.7px, color-mix(in srgb, #e701c1 74%, #ffffff), color-mix(in srgb, #e701c1 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.40px 1.40px at 3.8px 31.4px, color-mix(in srgb, #ffbd4a 74%, #ffffff), color-mix(in srgb, #ffbd4a 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.40px 1.40px at 3.8px 31.4px, color-mix(in srgb, #fd6401 74%, #ffffff), color-mix(in srgb, #fd6401 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.36px 1.36px at 17.0px 32.1px, color-mix(in srgb, #a7ff98 74%, #ffffff), color-mix(in srgb, #a7ff98 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.36px 1.36px at 17.0px 32.1px, color-mix(in srgb, #a2af10 74%, #ffffff), color-mix(in srgb, #a2af10 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.84px 1.84px at 32.1px 35.9px, color-mix(in srgb, #0687bc 74%, #ffffff), color-mix(in srgb, #0687bc 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.84px 1.84px at 32.1px 35.9px, color-mix(in srgb, #12b37e 74%, #ffffff), color-mix(in srgb, #12b37e 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.63px 1.63px at 48.3px 34.6px, color-mix(in srgb, #e871ff 74%, #ffffff), color-mix(in srgb, #e871ff 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.63px 1.63px at 48.3px 34.6px, color-mix(in srgb, #b699fe 74%, #ffffff), color-mix(in srgb, #b699fe 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.47px 1.47px at 61.7px 38.8px, color-mix(in srgb, #ff1a1a 74%, #ffffff), color-mix(in srgb, #ff1a1a 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.47px 1.47px at 61.7px 38.8px, color-mix(in srgb, #fe8ebe 74%, #ffffff), color-mix(in srgb, #fe8ebe 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.59px 1.59px at 73.2px 36.6px, color-mix(in srgb, #cace02 74%, #ffffff), color-mix(in srgb, #cace02 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.59px 1.59px at 73.2px 36.6px, color-mix(in srgb, #db8908 74%, #ffffff), color-mix(in srgb, #db8908 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.34px 1.34px at 2.9px 51.3px, color-mix(in srgb, #08eb9f 74%, #ffffff), color-mix(in srgb, #08eb9f 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.34px 1.34px at 2.9px 51.3px, color-mix(in srgb, #61ff09 74%, #ffffff), color-mix(in srgb, #61ff09 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.78px 1.78px at 17.6px 52.6px, color-mix(in srgb, #6d8cfe 74%, #ffffff), color-mix(in srgb, #6d8cfe 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.78px 1.78px at 17.6px 52.6px, color-mix(in srgb, #0ed1d0 74%, #ffffff), color-mix(in srgb, #0ed1d0 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.72px 1.72px at 35.6px 46.1px, color-mix(in srgb, #ff57ba 74%, #ffffff), color-mix(in srgb, #ff57ba 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.72px 1.72px at 35.6px 46.1px, color-mix(in srgb, #d21afd 74%, #ffffff), color-mix(in srgb, #d21afd 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.87px 1.87px at 50.9px 49.3px, color-mix(in srgb, #db8908 74%, #ffffff), color-mix(in srgb, #db8908 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.87px 1.87px at 50.9px 49.3px, color-mix(in srgb, #ff6877 74%, #ffffff), color-mix(in srgb, #ff6877 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.44px 1.44px at 59.6px 52.2px, color-mix(in srgb, #61ff09 74%, #ffffff), color-mix(in srgb, #61ff09 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.44px 1.44px at 59.6px 52.2px, color-mix(in srgb, #918a01 74%, #ffffff), color-mix(in srgb, #918a01 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.77px 1.77px at 73.3px 49.9px, color-mix(in srgb, #0ed1d0 74%, #ffffff), color-mix(in srgb, #0ed1d0 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.77px 1.77px at 73.3px 49.9px, color-mix(in srgb, #18b803 74%, #ffffff), color-mix(in srgb, #18b803 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.76px 1.76px at 3.5px 65.0px, color-mix(in srgb, #d21afd 74%, #ffffff), color-mix(in srgb, #d21afd 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.76px 1.76px at 3.5px 65.0px, color-mix(in srgb, #08b5fc 74%, #ffffff), color-mix(in srgb, #08b5fc 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.72px 1.72px at 25.0px 58.0px, color-mix(in srgb, #ff6877 74%, #ffffff), color-mix(in srgb, #ff6877 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.72px 1.72px at 25.0px 58.0px, color-mix(in srgb, #f4acff 74%, #ffffff), color-mix(in srgb, #f4acff 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.77px 1.77px at 30.9px 65.9px, color-mix(in srgb, #eeef08 74%, #ffffff), color-mix(in srgb, #eeef08 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.77px 1.77px at 30.9px 65.9px, color-mix(in srgb, #ff9d82 74%, #ffffff), color-mix(in srgb, #ff9d82 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.87px 1.87px at 51.0px 65.4px, color-mix(in srgb, #069511 74%, #ffffff), color-mix(in srgb, #069511 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.87px 1.87px at 51.0px 65.4px, color-mix(in srgb, #cace02 74%, #ffffff), color-mix(in srgb, #cace02 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.38px 1.38px at 61.3px 65.1px, color-mix(in srgb, #027afb 74%, #ffffff), color-mix(in srgb, #027afb 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.38px 1.38px at 61.3px 65.1px, color-mix(in srgb, #08eb9f 74%, #ffffff), color-mix(in srgb, #08eb9f 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.79px 1.79px at 78.3px 63.7px, color-mix(in srgb, #e701c1 74%, #ffffff), color-mix(in srgb, #e701c1 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.79px 1.79px at 78.3px 63.7px, color-mix(in srgb, #6d8cfe 74%, #ffffff), color-mix(in srgb, #6d8cfe 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.34px 1.34px at 9.8px 74.9px, color-mix(in srgb, #c16302 74%, #ffffff), color-mix(in srgb, #c16302 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.34px 1.34px at 9.8px 74.9px, color-mix(in srgb, #ff57ba 74%, #ffffff), color-mix(in srgb, #ff57ba 74%, #ffffff) 34%, transparent 100%),
|
||||||
radial-gradient(1.54px 1.54px at 20.7px 75.9px, color-mix(in srgb, #72d512 74%, #ffffff), color-mix(in srgb, #72d512 74%, #ffffff) 34%, transparent 100%),
|
radial-gradient(1.54px 1.54px at 20.7px 75.9px, color-mix(in srgb, #c16302 74%, #ffffff), color-mix(in srgb, #c16302 74%, #ffffff) 34%, transparent 100%),
|
||||||
|
radial-gradient(1.61px 1.61px at 31.6px 74.4px, color-mix(in srgb, #72d512 74%, #ffffff), color-mix(in srgb, #72d512 74%, #ffffff) 34%, transparent 100%),
|
||||||
|
|
||||||
/* 6. EIN SCHRÄGER SCHLEIER quer über das Feld. Er bindet die
|
/* 6. EIN SCHRÄGER SCHLEIER quer über das Feld. Er bindet die
|
||||||
96 Punkte zu einer Fläche zusammen — ohne ihn
|
99 Punkte zu einer Fläche zusammen — ohne ihn
|
||||||
schweben sie einzeln. Sehr blass; er soll Richtung geben,
|
schweben sie einzeln. Sehr blass; er soll Richtung geben,
|
||||||
nicht auffallen. */
|
nicht auffallen. */
|
||||||
linear-gradient(104deg,
|
linear-gradient(104deg,
|
||||||
@@ -8562,11 +8579,11 @@ body.start .k-leiste .feldschild::after {
|
|||||||
linear-gradient(180deg, #0b1020 0%, #070b14 100%);
|
linear-gradient(180deg, #0b1020 0%, #070b14 100%);
|
||||||
background-size:
|
background-size:
|
||||||
100% 100%, 100% 100%,
|
100% 100%, 100% 100%,
|
||||||
197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px,
|
197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 197px 197px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 131px 131px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px, 83px 83px,
|
||||||
100% 100%, 100% 100%;
|
100% 100%, 100% 100%;
|
||||||
background-repeat:
|
background-repeat:
|
||||||
no-repeat, no-repeat,
|
no-repeat, no-repeat,
|
||||||
repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat,
|
repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat, repeat,
|
||||||
no-repeat, no-repeat;
|
no-repeat, no-repeat;
|
||||||
/* Die Kante trägt den Kachelton mit — sonst wäre ausgerechnet die
|
/* Die Kante trägt den Kachelton mit — sonst wäre ausgerechnet die
|
||||||
farbigste Kachel der Wand einfarbig umrandet. */
|
farbigste Kachel der Wand einfarbig umrandet. */
|
||||||
|
|||||||
@@ -0,0 +1,217 @@
|
|||||||
|
/* ===================================================================
|
||||||
|
SUPPORT (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „es soll alles hoch profissionell gemacht werden aber so
|
||||||
|
einfach wie möglich, will nichts kompliziertes oder zu viel. kurz
|
||||||
|
und knapp und extrem geil."
|
||||||
|
|
||||||
|
Deshalb kein eigenes Aussehen: Kästen, Knöpfe und Marken kommen aus
|
||||||
|
start.css und module.css, so wie auf jeder anderen Seite. Hier steht
|
||||||
|
nur, was es woanders nicht gibt — das Melde-Feld, die Bildvorschau,
|
||||||
|
die Karte einer Meldung und das Zahlenband des Eingangs.
|
||||||
|
|
||||||
|
Eine eigene Farbwelt hätte die Seite fremd wirken lassen. Wer im
|
||||||
|
schlechtesten Moment etwas meldet, soll nicht zusätzlich merken,
|
||||||
|
dass er woanders ist.
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
.s-titel {
|
||||||
|
font-size: 1.05rem; font-weight: 700; letter-spacing: .01em;
|
||||||
|
margin: 0 0 12px;
|
||||||
|
}
|
||||||
|
.s-zahl {
|
||||||
|
display: inline-block; margin-left: 8px; padding: 1px 9px;
|
||||||
|
border-radius: 999px; font-size: .8rem; font-weight: 700;
|
||||||
|
background: color-mix(in srgb, var(--akzent) 15%, transparent);
|
||||||
|
color: var(--akzent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- Melden ------------------------------------------------- */
|
||||||
|
|
||||||
|
.s-melden {
|
||||||
|
background: var(--flaeche);
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
padding: 18px 18px 16px;
|
||||||
|
margin-bottom: 22px;
|
||||||
|
}
|
||||||
|
/* Für die Leitung rutscht der Melde-Kasten unter den Eingang.
|
||||||
|
|
||||||
|
NICHT ueber `order` (24.09.2026, nachgemessen): `.inhalt` ist in
|
||||||
|
start.css ein gewoehnlicher Block, kein Flex-Behaelter -- `order`
|
||||||
|
haette dort gar nichts getan, und die Klasse waere eine Regel
|
||||||
|
gewesen, die aussieht, als wirke sie. Verschoben wird der Kasten
|
||||||
|
deshalb im DOM (support.js), und dieser Abstand gilt dann. */
|
||||||
|
.s-melden--unten { margin-top: 26px; margin-bottom: 0; }
|
||||||
|
|
||||||
|
.s-feld { display: block; }
|
||||||
|
.s-feld__schild {
|
||||||
|
display: block; margin-bottom: 6px;
|
||||||
|
font-size: .78rem; font-weight: 700; letter-spacing: .07em;
|
||||||
|
text-transform: uppercase; color: var(--text-still);
|
||||||
|
}
|
||||||
|
.s-melden textarea {
|
||||||
|
width: 100%; box-sizing: border-box;
|
||||||
|
padding: 11px 12px;
|
||||||
|
font: inherit; font-size: .95rem; line-height: 1.5;
|
||||||
|
color: var(--text);
|
||||||
|
background: var(--grund);
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
resize: vertical; min-height: 96px;
|
||||||
|
}
|
||||||
|
.s-melden textarea:focus {
|
||||||
|
outline: 2px solid var(--akzent); outline-offset: 1px;
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-bild {
|
||||||
|
display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
|
||||||
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
.s-bild__name { font-size: .8rem; color: var(--text-still); }
|
||||||
|
|
||||||
|
.s-vorschau { margin-top: 12px; }
|
||||||
|
.s-vorschau img {
|
||||||
|
display: block; max-width: 100%; max-height: 260px;
|
||||||
|
width: auto; height: auto;
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-knopfreihe {
|
||||||
|
display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
|
||||||
|
margin-top: 14px;
|
||||||
|
}
|
||||||
|
.s-hinweis { font-size: .83rem; color: var(--text-still); }
|
||||||
|
|
||||||
|
/* ---------- Der Eingang -------------------------------------------- */
|
||||||
|
|
||||||
|
.s-eingang__kopf {
|
||||||
|
display: flex; align-items: flex-start; justify-content: space-between;
|
||||||
|
gap: 16px; flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Das Zahlenband: je Stand eine Zahl gross, das Wort klein darunter.
|
||||||
|
Dieselbe Bauart wie in den Personenkacheln -- man vergleicht mit dem
|
||||||
|
Auge, statt eine Zeile zu lesen. */
|
||||||
|
.s-bilanz { display: flex; gap: 18px; }
|
||||||
|
.s-bilanz__feld { display: flex; flex-direction: column; gap: 1px; }
|
||||||
|
.s-bilanz__zahl {
|
||||||
|
font-size: 1.3rem; font-weight: 700; line-height: 1.1; color: var(--text);
|
||||||
|
}
|
||||||
|
.s-bilanz__wort { font-size: .75rem; color: var(--text-still); }
|
||||||
|
.s-bilanz__feld[data-stand="neu"] .s-bilanz__zahl { color: var(--warn); }
|
||||||
|
|
||||||
|
.s-filter { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 16px; }
|
||||||
|
.s-filter__knopf {
|
||||||
|
display: inline-flex; align-items: center; gap: 8px;
|
||||||
|
padding: 6px 13px; border-radius: 999px;
|
||||||
|
font: inherit; font-size: .84rem; font-weight: 600;
|
||||||
|
color: var(--text-still);
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.s-filter__knopf:hover { color: var(--text); border-color: var(--akzent); }
|
||||||
|
.s-filter__knopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||||
|
.s-filter__knopf[aria-pressed="true"] {
|
||||||
|
color: var(--akzent);
|
||||||
|
border-color: var(--akzent);
|
||||||
|
background: color-mix(in srgb, var(--akzent) 12%, transparent);
|
||||||
|
}
|
||||||
|
.s-filter__zahl { font-size: .78rem; opacity: .8; }
|
||||||
|
|
||||||
|
/* ---------- Eine Meldung ------------------------------------------- */
|
||||||
|
|
||||||
|
.s-karte {
|
||||||
|
background: var(--flaeche);
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
padding: 15px 16px 14px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
/* Ein schmaler Streifen links sagt den Stand, bevor man liest --
|
||||||
|
gedeckt beigemischt, nicht als Leuchtbalken. */
|
||||||
|
.s-karte { --s: var(--text-still); border-left: 3px solid color-mix(in srgb, var(--s) 55%, transparent); }
|
||||||
|
.s-karte[data-stand="neu"] { --s: var(--warn); }
|
||||||
|
.s-karte[data-stand="in_arbeit"] { --s: var(--akzent); }
|
||||||
|
/* --k-gut ist die Hausfarbe fuer "passt, erledigt, freigegeben"
|
||||||
|
(gate.css). Gemessen nachgesehen, nicht geraten: --gut gibt es
|
||||||
|
nicht, und ein Ersatzwert in Klammern haette hier still eine
|
||||||
|
sechste Gruenschattierung ins Haus gebracht. */
|
||||||
|
.s-karte[data-stand="erledigt"] { --s: var(--k-gut); opacity: .82; }
|
||||||
|
|
||||||
|
/* Wer aus einer Benachrichtigung kommt, soll sehen, welche gemeint
|
||||||
|
ist -- ohne Blinken, ohne Bewegung. */
|
||||||
|
.s-karte[data-hervor="ja"] {
|
||||||
|
border-color: var(--akzent);
|
||||||
|
box-shadow: 0 0 0 1px color-mix(in srgb, var(--akzent) 45%, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-karte__kopf {
|
||||||
|
display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
|
||||||
|
margin-bottom: 9px;
|
||||||
|
}
|
||||||
|
.s-marke {
|
||||||
|
padding: 2px 10px; border-radius: 999px;
|
||||||
|
font-size: .75rem; font-weight: 700; letter-spacing: .05em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: color-mix(in srgb, var(--s) 16%, transparent);
|
||||||
|
color: var(--s);
|
||||||
|
}
|
||||||
|
.s-karte__von { font-size: .88rem; font-weight: 600; color: var(--text); }
|
||||||
|
.s-karte__zeit { font-size: .78rem; color: var(--text-still); margin-left: auto; }
|
||||||
|
|
||||||
|
.s-karte__text {
|
||||||
|
margin: 0; font-size: .95rem; line-height: 1.55; color: var(--text);
|
||||||
|
/* Absätze bleiben erhalten. Wer „Schritt 1 … Schritt 2 …"
|
||||||
|
untereinander schreibt, soll es so wiederfinden. */
|
||||||
|
white-space: pre-wrap; overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
.s-karte__wo { margin: 8px 0 0; font-size: .78rem; color: var(--text-still); }
|
||||||
|
|
||||||
|
.s-karte__bild { margin-top: 11px; }
|
||||||
|
.s-karte__bild img {
|
||||||
|
display: block; max-width: 100%; max-height: 300px;
|
||||||
|
width: auto; height: auto;
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
border: 1px solid var(--rand);
|
||||||
|
}
|
||||||
|
.s-karte__bild a:focus-visible img { outline: 2px solid var(--akzent); outline-offset: 2px; }
|
||||||
|
|
||||||
|
.s-antwort {
|
||||||
|
margin-top: 12px; padding: 10px 12px;
|
||||||
|
background: color-mix(in srgb, var(--akzent) 8%, transparent);
|
||||||
|
border-left: 2px solid color-mix(in srgb, var(--akzent) 50%, transparent);
|
||||||
|
border-radius: 0 var(--radius-klein) var(--radius-klein) 0;
|
||||||
|
}
|
||||||
|
.s-antwort__schild {
|
||||||
|
display: block; margin-bottom: 4px;
|
||||||
|
font-size: .75rem; font-weight: 700; letter-spacing: .06em;
|
||||||
|
text-transform: uppercase; color: var(--akzent);
|
||||||
|
}
|
||||||
|
.s-antwort__text {
|
||||||
|
margin: 0; font-size: .9rem; line-height: 1.5; color: var(--text);
|
||||||
|
white-space: pre-wrap; overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
.s-karte__tun { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 13px; }
|
||||||
|
|
||||||
|
.s-leer {
|
||||||
|
padding: 22px 16px; text-align: center;
|
||||||
|
font-size: .92rem; color: var(--text-still);
|
||||||
|
background: var(--flaeche);
|
||||||
|
border: 1px dashed var(--rand);
|
||||||
|
border-radius: var(--radius-klein);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- Am Handy ------------------------------------------------ */
|
||||||
|
|
||||||
|
@media (max-width: 560px) {
|
||||||
|
.s-melden { padding: 15px 14px 14px; }
|
||||||
|
.s-karte { padding: 13px 14px 12px; }
|
||||||
|
.s-karte__zeit { margin-left: 0; width: 100%; }
|
||||||
|
.s-bilanz { gap: 14px; }
|
||||||
|
.s-eingang__kopf { gap: 10px; }
|
||||||
|
}
|
||||||
@@ -599,6 +599,22 @@
|
|||||||
das gehört in dieselbe Hand wie die Rollenvergabe. */
|
das gehört in dieselbe Hand wie die Rollenvergabe. */
|
||||||
{ name: 'Automationen', unter: 'Was von allein passiert', zeichen: 'automation', ton: 18,
|
{ name: 'Automationen', unter: 'Was von allein passiert', zeichen: 'automation', ton: 18,
|
||||||
rollen: ['admin'], ziel: 'automation.html', szene: 'garage' },
|
rollen: ['admin'], ziel: 'automation.html', szene: 'garage' },
|
||||||
|
/* DER SUPPORT (24.09.2026) -- fuer jede Rolle, die diese Liste
|
||||||
|
ueberhaupt bekommt.
|
||||||
|
|
||||||
|
DIE ZWEITE HAELFTE DERSELBEN KACHEL: Im Server haengt sie
|
||||||
|
`bereicheFuer()` an jede Rollenliste an; diese Liste hier
|
||||||
|
bekommt der Browser fuer die fuenf Agentur-Rollen, und sie
|
||||||
|
kommt nicht durch den Server. Beide Stellen zusammen ergeben
|
||||||
|
„jeder" -- deshalb prueft pruef-support ausdruecklich JEDE
|
||||||
|
Rolle und nicht nur eine.
|
||||||
|
|
||||||
|
Ton 44 und Zeichen „schutz" wie im Server; zwei verschiedene
|
||||||
|
Werte fuer dieselbe Kachel waeren derselbe Knopf in zwei
|
||||||
|
Farben. */
|
||||||
|
{ name: 'Support', unter: 'Etwas kaputt? Schreib es mit Bild', zeichen: 'schutz', ton: 44,
|
||||||
|
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'],
|
||||||
|
ziel: 'support.html', szene: 'studio' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,433 @@
|
|||||||
|
/* =====================================================================
|
||||||
|
SUPPORT (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „jeder kann da probleme von der seite melden und hinweisen.
|
||||||
|
fotos mit schicken mit einem text. … so einfach wie möglich, will
|
||||||
|
nichts kompliziertes oder zu viel. kurz und knapp."
|
||||||
|
|
||||||
|
EINE SEITE, ZWEI ANSICHTEN. Wer meldet, sieht ein Feld und seine
|
||||||
|
eigenen Meldungen. DogFather und die rechte Hand sehen den Eingang:
|
||||||
|
alles, nach Stand sortiert, mit Bild und zwei Knöpfen.
|
||||||
|
|
||||||
|
WELCHE ANSICHT GILT, ENTSCHEIDET DER SERVER. Er schickt `leitung`
|
||||||
|
in der Antwort — diese Datei fragt nicht nach der Rolle. Eine
|
||||||
|
Rollenprüfung im Browser wäre eine zweite Stelle mit derselben
|
||||||
|
Regel, und es wäre die, an der man sie umgehen kann.
|
||||||
|
|
||||||
|
KEIN innerHTML MIT FREMDEM TEXT. Alles, was jemand geschrieben hat,
|
||||||
|
geht durch `textContent`. Hier landet Text aus einem Fehlerbericht —
|
||||||
|
und genau dort steht irgendwann ein `<script>`, weil jemand es
|
||||||
|
ausprobiert.
|
||||||
|
===================================================================== */
|
||||||
|
(() => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const $ = (id) => document.getElementById(id);
|
||||||
|
const el = (was, klasse, text) => {
|
||||||
|
const e = document.createElement(was);
|
||||||
|
if (klasse) e.className = klasse;
|
||||||
|
if (text !== undefined) e.textContent = text;
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
|
||||||
|
let leitung = false;
|
||||||
|
let meldungen = [];
|
||||||
|
let filter = 'offen';
|
||||||
|
let gewaehltesBild = null;
|
||||||
|
|
||||||
|
/* Anzeige-Wörter, keine Regel. Der Server schickt den Schlüssel; was
|
||||||
|
daraus auf dem Bildschirm wird, ist eine Frage der Sprache. */
|
||||||
|
const STAND_WORT = {
|
||||||
|
neu: 'neu',
|
||||||
|
in_arbeit: 'wird bearbeitet',
|
||||||
|
erledigt: 'erledigt',
|
||||||
|
};
|
||||||
|
|
||||||
|
function melde(id, text) {
|
||||||
|
const f = $(id);
|
||||||
|
if (!f) return;
|
||||||
|
f.textContent = text || '';
|
||||||
|
f.hidden = !text;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function hole(pfad, einstellungen) {
|
||||||
|
const a = await fetch(pfad, { credentials: 'same-origin', ...einstellungen });
|
||||||
|
if (a.status === 401) { location.href = 'index.html'; throw new Error('weg'); }
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Was der Server als Fehler geschickt hat — oder ein Ersatz.
|
||||||
|
*
|
||||||
|
* Die Antwort wegzuwerfen und „Ging nicht" zu schreiben schickt
|
||||||
|
* einen auf die Suche nach etwas, das der Server längst gesagt hat. */
|
||||||
|
async function fehlerText(a, ersatz) {
|
||||||
|
try {
|
||||||
|
const j = await a.json();
|
||||||
|
return typeof j?.fehler === 'string' && j.fehler ? j.fehler : ersatz;
|
||||||
|
} catch { return ersatz; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/** „vor 3 Tagen" statt eines Zeitstempels.
|
||||||
|
*
|
||||||
|
* Bei einer Meldung ist die Frage „wie lange liegt das schon?",
|
||||||
|
* nicht „wann genau war das?". Das genaue Datum bleibt als Titel. */
|
||||||
|
function herZeit(iso) {
|
||||||
|
if (!iso) return '';
|
||||||
|
const ms = Date.now() - Date.parse(iso);
|
||||||
|
if (!Number.isFinite(ms)) return '';
|
||||||
|
const min = Math.floor(ms / 60000);
|
||||||
|
if (min < 2) return 'gerade eben';
|
||||||
|
if (min < 60) return `vor ${min} Min.`;
|
||||||
|
const std = Math.floor(min / 60);
|
||||||
|
if (std < 24) return `vor ${std} Std.`;
|
||||||
|
const tage = Math.floor(std / 24);
|
||||||
|
if (tage === 1) return 'gestern';
|
||||||
|
if (tage < 31) return `vor ${tage} Tagen`;
|
||||||
|
const monate = Math.floor(tage / 30.44);
|
||||||
|
return monate < 12 ? `vor ${monate} Mon.` : 'vor über einem Jahr';
|
||||||
|
}
|
||||||
|
|
||||||
|
function genau(iso) {
|
||||||
|
if (!iso) return '';
|
||||||
|
const d = new Date(iso);
|
||||||
|
if (Number.isNaN(d.getTime())) return '';
|
||||||
|
const z = (n) => String(n).padStart(2, '0');
|
||||||
|
return `${z(d.getDate())}.${z(d.getMonth() + 1)}.${d.getFullYear()} `
|
||||||
|
+ `${z(d.getHours())}:${z(d.getMinutes())}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===================================================================
|
||||||
|
MELDEN
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
function bildZeigen(datei) {
|
||||||
|
gewaehltesBild = datei || null;
|
||||||
|
const name = $('bild-name');
|
||||||
|
const weg = $('bild-weg');
|
||||||
|
const vorschau = $('vorschau');
|
||||||
|
if (!datei) {
|
||||||
|
name.textContent = '';
|
||||||
|
weg.hidden = true;
|
||||||
|
vorschau.hidden = true;
|
||||||
|
$('vorschau-bild').removeAttribute('src');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
name.textContent = `${datei.name} · ${Math.round(datei.size / 1024)} KB`;
|
||||||
|
weg.hidden = false;
|
||||||
|
/* DIE VORSCHAU KOMMT AUS DER DATEI SELBST, nicht vom Server: Sie
|
||||||
|
ist noch gar nicht hochgeladen. `URL.createObjectURL` zeigt das
|
||||||
|
Bild aus dem Arbeitsspeicher — wer sieht, was er anhängt, hängt
|
||||||
|
nicht versehentlich das falsche an. */
|
||||||
|
const url = URL.createObjectURL(datei);
|
||||||
|
const img = $('vorschau-bild');
|
||||||
|
img.onload = () => URL.revokeObjectURL(url);
|
||||||
|
img.src = url;
|
||||||
|
vorschau.hidden = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function meldenEinrichten() {
|
||||||
|
$('bild-waehlen').addEventListener('click', () => $('bild').click());
|
||||||
|
$('bild-weg').addEventListener('click', () => {
|
||||||
|
$('bild').value = '';
|
||||||
|
bildZeigen(null);
|
||||||
|
});
|
||||||
|
$('bild').addEventListener('change', (e) => {
|
||||||
|
const datei = e.target.files?.[0] || null;
|
||||||
|
if (!datei) { bildZeigen(null); return; }
|
||||||
|
/* DIE GRENZE STEHT HIER NUR ALS FREUNDLICHKEIT. Abgelehnt wird
|
||||||
|
am Server; dieser Hinweis erspart es, zwölf Megabyte erst
|
||||||
|
hochzuladen, um danach eine Absage zu lesen. */
|
||||||
|
if (datei.size > 12 * 1024 * 1024) {
|
||||||
|
melde('melden-fehler', 'Das Bild ist größer als 12 MB – bitte ein kleineres.');
|
||||||
|
$('bild').value = '';
|
||||||
|
bildZeigen(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
melde('melden-fehler', '');
|
||||||
|
bildZeigen(datei);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('melden').addEventListener('submit', async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const text = $('text').value.trim();
|
||||||
|
if (text.length < 5) {
|
||||||
|
melde('melden-fehler', 'Schreib bitte kurz, was los ist – ein Satz reicht.');
|
||||||
|
$('text').focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const knopf = $('senden');
|
||||||
|
knopf.disabled = true;
|
||||||
|
melde('melden-fehler', '');
|
||||||
|
$('melden-hinweis').textContent = 'wird geschickt …';
|
||||||
|
try {
|
||||||
|
/* DER TEXT REIST IM KOPF, das Bild im Rumpf — derselbe Weg wie
|
||||||
|
bei Chat-Anhängen. Ein Weg für beides, damit es keinen
|
||||||
|
Zustand „Meldung da, Bild fehlt noch" gibt. */
|
||||||
|
const kopf = { 'x-text': encodeURIComponent(text), 'x-seite': location.pathname };
|
||||||
|
const a = await hole('/workspace/api/support', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: kopf,
|
||||||
|
body: gewaehltesBild || new Blob([]),
|
||||||
|
});
|
||||||
|
if (!a.ok) {
|
||||||
|
melde('melden-fehler', await fehlerText(a, 'Das hat nicht geklappt.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$('text').value = '';
|
||||||
|
$('bild').value = '';
|
||||||
|
bildZeigen(null);
|
||||||
|
$('melden-hinweis').textContent = 'Danke – ist angekommen.';
|
||||||
|
setTimeout(() => { $('melden-hinweis').textContent = ''; }, 6000);
|
||||||
|
await laden();
|
||||||
|
} catch { /* umgeleitet */ } finally {
|
||||||
|
knopf.disabled = false;
|
||||||
|
if ($('melden-hinweis').textContent === 'wird geschickt …') {
|
||||||
|
$('melden-hinweis').textContent = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===================================================================
|
||||||
|
EINE MELDUNG ALS KARTE
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
function bildAnhaengen(karte, m) {
|
||||||
|
if (!m.bild) return;
|
||||||
|
const kasten = el('div', 's-karte__bild');
|
||||||
|
const a = el('a');
|
||||||
|
a.href = m.bild;
|
||||||
|
a.target = '_blank';
|
||||||
|
a.rel = 'noopener';
|
||||||
|
a.title = 'In voller Größe ansehen';
|
||||||
|
const img = document.createElement('img');
|
||||||
|
img.src = m.bild;
|
||||||
|
img.alt = 'Bild zur Meldung';
|
||||||
|
img.loading = 'lazy';
|
||||||
|
/* BREITE UND HÖHE STEHEN DRAN, wenn der Server sie kennt: Dann
|
||||||
|
reserviert der Browser den Platz, bevor das Bild da ist, und die
|
||||||
|
Liste springt beim Laden nicht. */
|
||||||
|
if (m.bild_breite > 0 && m.bild_hoehe > 0) {
|
||||||
|
img.width = m.bild_breite;
|
||||||
|
img.height = m.bild_hoehe;
|
||||||
|
}
|
||||||
|
a.append(img);
|
||||||
|
kasten.append(a);
|
||||||
|
karte.append(kasten);
|
||||||
|
}
|
||||||
|
|
||||||
|
function karteBauen(m) {
|
||||||
|
const k = el('article', 's-karte');
|
||||||
|
k.dataset.stand = m.stand;
|
||||||
|
k.id = `meldung-${m.id}`;
|
||||||
|
|
||||||
|
const kopf = el('div', 's-karte__kopf');
|
||||||
|
const marke = el('span', 's-marke', STAND_WORT[m.stand] || m.stand);
|
||||||
|
marke.dataset.stand = m.stand;
|
||||||
|
kopf.append(marke);
|
||||||
|
if (leitung && m.von) {
|
||||||
|
kopf.append(el('span', 's-karte__von', m.von));
|
||||||
|
}
|
||||||
|
const zeit = el('span', 's-karte__zeit', herZeit(m.erstellt));
|
||||||
|
zeit.title = genau(m.erstellt);
|
||||||
|
kopf.append(zeit);
|
||||||
|
k.append(kopf);
|
||||||
|
|
||||||
|
/* `textContent` mit erhaltenen Zeilenumbrüchen (das CSS setzt
|
||||||
|
`white-space: pre-wrap`). Kein innerHTML, siehe der Kopf. */
|
||||||
|
k.append(el('p', 's-karte__text', m.text));
|
||||||
|
bildAnhaengen(k, m);
|
||||||
|
|
||||||
|
if (leitung && m.seite) {
|
||||||
|
const wo = el('p', 's-karte__wo', 'gemeldet auf ' + m.seite);
|
||||||
|
if (m.geraet) wo.title = m.geraet;
|
||||||
|
k.append(wo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m.antwort) {
|
||||||
|
const ant = el('div', 's-antwort');
|
||||||
|
ant.append(el('span', 's-antwort__schild', 'Antwort'));
|
||||||
|
ant.append(el('p', 's-antwort__text', m.antwort));
|
||||||
|
k.append(ant);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (leitung && m.stand !== 'erledigt') k.append(knoepfeFuerLeitung(m));
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Die zwei Handgriffe der Leitung.
|
||||||
|
*
|
||||||
|
* ZWEI, NICHT FÜNF. „Ich kümmere mich" und „erledigt". Eine
|
||||||
|
* Zuweisung an eine bestimmte Person, Prioritäten, Kategorien — das
|
||||||
|
* wäre ein Ticketsystem für zwei Menschen, die nebeneinander
|
||||||
|
* sitzen. */
|
||||||
|
function knoepfeFuerLeitung(m) {
|
||||||
|
const reihe = el('div', 's-karte__tun');
|
||||||
|
|
||||||
|
if (m.stand === 'neu') {
|
||||||
|
const dran = el('button', 'schritt', 'Ich kümmere mich');
|
||||||
|
dran.type = 'button';
|
||||||
|
dran.addEventListener('click', () => aendern(m, 'in_arbeit', ''));
|
||||||
|
reihe.append(dran);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fertig = el('button', 'schritt', 'Erledigt …');
|
||||||
|
fertig.type = 'button';
|
||||||
|
fertig.addEventListener('click', async () => {
|
||||||
|
/* WER ZUMACHT, SAGT WARUM. Der Melder sieht nur diesen Satz —
|
||||||
|
ohne ihn weiß er nicht, ob etwas behoben wurde oder ob
|
||||||
|
niemand Zeit hatte. Der Server verlangt ihn ohnehin; hier
|
||||||
|
wird er gefragt, statt eine Absage zu kassieren. */
|
||||||
|
const antwort = await window.frageNach?.({
|
||||||
|
titel: 'Meldung erledigen?',
|
||||||
|
was: 'Sie verschwindet aus dem offenen Eingang.',
|
||||||
|
bleibt: 'Der Melder bekommt eine Nachricht mit deinem Satz – '
|
||||||
|
+ 'das ist alles, was er davon sieht.',
|
||||||
|
ja: 'Erledigt',
|
||||||
|
grund: 'Was ist daraus geworden?',
|
||||||
|
grundPflicht: true,
|
||||||
|
grundMin: 3,
|
||||||
|
platzhalter: 'z. B. Behoben, der Knopf geht wieder.',
|
||||||
|
});
|
||||||
|
if (!antwort) return;
|
||||||
|
await aendern(m, 'erledigt', antwort.grund || '');
|
||||||
|
});
|
||||||
|
reihe.append(fertig);
|
||||||
|
return reihe;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function aendern(m, stand, antwort) {
|
||||||
|
melde('eingang-fehler', '');
|
||||||
|
try {
|
||||||
|
const a = await hole(`/workspace/api/support/${m.id}`, {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ stand, antwort }),
|
||||||
|
});
|
||||||
|
if (!a.ok) {
|
||||||
|
melde('eingang-fehler', await fehlerText(a, 'Das hat nicht geklappt.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await laden();
|
||||||
|
} catch { /* umgeleitet */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===================================================================
|
||||||
|
ZEICHNEN
|
||||||
|
=================================================================== */
|
||||||
|
|
||||||
|
function bilanzZeichnen() {
|
||||||
|
const ziel = $('bilanz');
|
||||||
|
ziel.textContent = '';
|
||||||
|
const zahl = (stand) => meldungen.filter((m) => m.stand === stand).length;
|
||||||
|
for (const [stand, wort] of [
|
||||||
|
['neu', 'neu'], ['in_arbeit', 'in Arbeit'], ['erledigt', 'erledigt'],
|
||||||
|
]) {
|
||||||
|
const kasten = el('div', 's-bilanz__feld');
|
||||||
|
kasten.dataset.stand = stand;
|
||||||
|
kasten.append(el('span', 's-bilanz__zahl', String(zahl(stand))));
|
||||||
|
kasten.append(el('span', 's-bilanz__wort', wort));
|
||||||
|
ziel.append(kasten);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterZeichnen() {
|
||||||
|
const ziel = $('filter');
|
||||||
|
ziel.textContent = '';
|
||||||
|
const zaehl = (welche) => welche === 'alle'
|
||||||
|
? meldungen.length
|
||||||
|
: welche === 'offen'
|
||||||
|
? meldungen.filter((m) => m.stand !== 'erledigt').length
|
||||||
|
: meldungen.filter((m) => m.stand === welche).length;
|
||||||
|
for (const [wert, wort] of [
|
||||||
|
['offen', 'Offen'], ['erledigt', 'Erledigt'], ['alle', 'Alle'],
|
||||||
|
]) {
|
||||||
|
const k = el('button', 's-filter__knopf');
|
||||||
|
k.type = 'button';
|
||||||
|
k.dataset.wert = wert;
|
||||||
|
k.setAttribute('aria-pressed', String(filter === wert));
|
||||||
|
k.append(el('span', null, wort));
|
||||||
|
k.append(el('span', 's-filter__zahl', String(zaehl(wert))));
|
||||||
|
k.addEventListener('click', () => { filter = wert; listeZeichnen(); });
|
||||||
|
ziel.append(k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function listeZeichnen() {
|
||||||
|
if (leitung) {
|
||||||
|
filterZeichnen();
|
||||||
|
const ziel = $('eingang-liste');
|
||||||
|
ziel.textContent = '';
|
||||||
|
const drin = meldungen.filter((m) => filter === 'alle' ? true
|
||||||
|
: filter === 'offen' ? m.stand !== 'erledigt' : m.stand === filter);
|
||||||
|
if (!drin.length) {
|
||||||
|
/* EIN LEERER EINGANG IST EINE GUTE NACHRICHT und soll auch so
|
||||||
|
aussehen — nicht wie eine Seite, die nicht fertig geladen
|
||||||
|
hat. */
|
||||||
|
ziel.append(el('p', 's-leer', filter === 'offen'
|
||||||
|
? 'Nichts offen. Alles abgearbeitet.'
|
||||||
|
: 'Hier steht nichts.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (const m of drin) ziel.append(karteBauen(m));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const block = $('meine-block');
|
||||||
|
const ziel = $('meine-liste');
|
||||||
|
ziel.textContent = '';
|
||||||
|
$('meine-zahl').textContent = String(meldungen.length);
|
||||||
|
block.hidden = meldungen.length === 0;
|
||||||
|
for (const m of meldungen) ziel.append(karteBauen(m));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function laden() {
|
||||||
|
try {
|
||||||
|
const a = await hole('/workspace/api/support');
|
||||||
|
if (!a.ok) { melde('eingang-fehler', 'Die Meldungen ließen sich nicht laden.'); return; }
|
||||||
|
const r = await a.json();
|
||||||
|
leitung = r.leitung === true;
|
||||||
|
meldungen = Array.isArray(r.meldungen) ? r.meldungen : [];
|
||||||
|
|
||||||
|
/* DIE SEITE STELLT SICH AUF DEN UM, DER SIE ÖFFNET. */
|
||||||
|
$('eingang-block').hidden = !leitung;
|
||||||
|
$('meine-block').hidden = leitung || meldungen.length === 0;
|
||||||
|
if (leitung) {
|
||||||
|
$('seiten-titel').textContent = 'Support';
|
||||||
|
$('seiten-unter').textContent =
|
||||||
|
'Was aus dem Team und der Community gemeldet wurde. '
|
||||||
|
+ 'Das Älteste steht oben – was am längsten wartet, gehört nach vorn.';
|
||||||
|
/* MELDEN KANN DIE LEITUNG AUCH. Filipe findet selbst Fehler,
|
||||||
|
und ein Weg, der für ihn nicht gilt, ist ein zweiter Weg,
|
||||||
|
den er dann anders benutzt. Das Feld rutscht nur nach
|
||||||
|
unten: Wer den Eingang aufmacht, will zuerst sehen, was
|
||||||
|
liegt. */
|
||||||
|
/* WIRKLICH VERSCHIEBEN, nicht nur eine Klasse setzen.
|
||||||
|
`order` wirkt nur in einem Flex- oder Rasterbehaelter, und
|
||||||
|
`.inhalt` ist keiner -- nachgemessen in start.css. Ein
|
||||||
|
`append` an denselben Elternteil bewegt den Kasten ans
|
||||||
|
Ende, ohne ihn neu zu bauen: Der Text im Feld bleibt
|
||||||
|
stehen, falls gerade jemand tippt. */
|
||||||
|
const kasten = $('melden-block');
|
||||||
|
kasten.classList.add('s-melden--unten');
|
||||||
|
kasten.parentElement?.append(kasten);
|
||||||
|
bilanzZeichnen();
|
||||||
|
}
|
||||||
|
listeZeichnen();
|
||||||
|
|
||||||
|
/* AUS EINER BENACHRICHTIGUNG KOMMT MAN MIT ?meldung=… — dann
|
||||||
|
gehört der Blick genau dorthin und nicht an den Seitenanfang. */
|
||||||
|
const wohin = new URLSearchParams(location.search).get('meldung');
|
||||||
|
if (wohin) {
|
||||||
|
const karte = document.getElementById(`meldung-${Number(wohin)}`);
|
||||||
|
if (karte) {
|
||||||
|
karte.scrollIntoView({ behavior: window.sanft?.() || 'auto', block: 'center' });
|
||||||
|
karte.dataset.hervor = 'ja';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch { /* umgeleitet */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
meldenEinrichten();
|
||||||
|
laden();
|
||||||
|
})();
|
||||||
+19
-19
@@ -12,19 +12,19 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -391,22 +391,22 @@
|
|||||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||||
<script src="assets/js/textform.js?v=202609240105"></script>
|
<script src="assets/js/textform.js?v=202609240132"></script>
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/zuteilung.js?v=202609240105" defer></script>
|
<script src="assets/js/zuteilung.js?v=202609240132" defer></script>
|
||||||
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
|
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
|
||||||
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
|
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
|
||||||
eigene Datei; hier zeigt er den Creator-Katalog.
|
eigene Datei; hier zeigt er den Creator-Katalog.
|
||||||
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
|
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
|
||||||
<script src="assets/js/vorlagenbrett.js?v=202609240105" defer></script>
|
<script src="assets/js/vorlagenbrett.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/aufgaben.js?v=202609240105" defer></script>
|
<script src="assets/js/aufgaben.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/automation.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -168,15 +168,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/automation.js?v=202609240105" defer></script>
|
<script src="assets/js/automation.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -197,16 +197,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/befinden.js?v=202609240105" defer></script>
|
<script src="assets/js/befinden.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+22
-22
@@ -12,24 +12,24 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240132" />
|
||||||
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
|
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
|
||||||
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
|
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
|
||||||
Stelle, an der dieselbe Sache anders aussieht. -->
|
Stelle, an der dieselbe Sache anders aussieht. -->
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -304,19 +304,19 @@
|
|||||||
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
|
||||||
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
|
||||||
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
|
||||||
<script src="assets/js/textform.js?v=202609240105"></script>
|
<script src="assets/js/textform.js?v=202609240132"></script>
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/checkliste.js?v=202609240105" defer></script>
|
<script src="assets/js/checkliste.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/ampel.js?v=202609240105" defer></script>
|
<script src="assets/js/ampel.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/schulung.js?v=202609240105" defer></script>
|
<script src="assets/js/schulung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereich.js?v=202609240105" defer></script>
|
<script src="assets/js/bereich.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+19
-19
@@ -7,17 +7,17 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -108,15 +108,15 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202609240105" defer></script>
|
<script src="assets/js/auskunft.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bewerben.js?v=202609240105" defer></script>
|
<script src="assets/js/bewerben.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -7,16 +7,16 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -80,16 +80,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202609240105" defer></script>
|
<script src="assets/js/auskunft.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bewerbungen.js?v=202609240105" defer></script>
|
<script src="assets/js/bewerbungen.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/calls.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -89,15 +89,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202609240105" defer></script>
|
<script src="assets/js/ki.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/calls.js?v=202609240105" defer></script>
|
<script src="assets/js/calls.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+19
-19
@@ -12,26 +12,26 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||||||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||||||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||||||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||||||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||||||
Dialog zu sehen bekam. -->
|
Dialog zu sehen bekam. -->
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/chat.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -592,25 +592,25 @@
|
|||||||
</form>
|
</form>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
<script src="assets/js/bereiche.js?v=202609240105"></script>
|
<script src="assets/js/bereiche.js?v=202609240132"></script>
|
||||||
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
|
||||||
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
|
||||||
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
|
||||||
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
|
||||||
wirklich vor den anderen dasteht. -->
|
wirklich vor den anderen dasteht. -->
|
||||||
<script src="assets/js/textform.js?v=202609240105"></script>
|
<script src="assets/js/textform.js?v=202609240132"></script>
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105"></script>
|
<script src="assets/js/kopf.js?v=202609240132"></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105"></script>
|
<script src="assets/js/glocke.js?v=202609240132"></script>
|
||||||
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
|
||||||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||||||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||||||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||||||
<script src="assets/js/anruf.js?v=202609240105"></script>
|
<script src="assets/js/anruf.js?v=202609240132"></script>
|
||||||
<script src="assets/js/chat.js?v=202609240105"></script>
|
<script src="assets/js/chat.js?v=202609240132"></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/content.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/content.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -179,15 +179,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/checkliste.js?v=202609240105" defer></script>
|
<script src="assets/js/checkliste.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/content.js?v=202609240105" defer></script>
|
<script src="assets/js/content.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -36,15 +36,15 @@
|
|||||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||||
type="image/webp" media="(max-width: 899px)" />
|
type="image/webp" media="(max-width: 899px)" />
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="gate gate--crew">
|
<body class="gate gate--crew">
|
||||||
@@ -459,7 +459,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/gate.js?v=202609240105" defer></script>
|
<script src="assets/js/gate.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -23,25 +23,25 @@
|
|||||||
},
|
},
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609240105",
|
"src": "/assets/img/app-symbole/crew-192.png?v=202609240132",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609240105",
|
"src": "/assets/img/app-symbole/crew-512.png?v=202609240132",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "any"
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609240105",
|
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609240132",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609240105",
|
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609240132",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png",
|
"type": "image/png",
|
||||||
"purpose": "maskable"
|
"purpose": "maskable"
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/dateien.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -108,15 +108,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/dateien.js?v=202609240105" defer></script>
|
<script src="assets/js/dateien.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -297,20 +297,20 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
|
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
|
||||||
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
|
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
|
||||||
in Dokumentreihenfolge. -->
|
in Dokumentreihenfolge. -->
|
||||||
<script src="assets/js/vorlagenbrett.js?v=202609240105" defer></script>
|
<script src="assets/js/vorlagenbrett.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/entwicklung.js?v=202609240105" defer></script>
|
<script src="assets/js/entwicklung.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+15
-15
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -146,14 +146,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hilfe.js?v=202609240105" defer></script>
|
<script src="assets/js/hilfe.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||||
type="image/webp" media="(max-width: 899px)" />
|
type="image/webp" media="(max-width: 899px)" />
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="gate">
|
<body class="gate">
|
||||||
@@ -427,7 +427,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/gate.js?v=202609240105" defer></script>
|
<script src="assets/js/gate.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/kalender.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -383,15 +383,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kalender.js?v=202609240105" defer></script>
|
<script src="assets/js/kalender.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kalender-abo.js?v=202609240105" defer></script>
|
<script src="assets/js/kalender-abo.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/leistung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -444,13 +444,13 @@
|
|||||||
</form>
|
</form>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105"></script>
|
<script src="assets/js/meldung.js?v=202609240132"></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105"></script>
|
<script src="assets/js/nachfrage.js?v=202609240132"></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105"></script>
|
<script src="assets/js/wahl.js?v=202609240132"></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105"></script>
|
<script src="assets/js/bereiche.js?v=202609240132"></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105"></script>
|
<script src="assets/js/kopf.js?v=202609240132"></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105"></script>
|
<script src="assets/js/glocke.js?v=202609240132"></script>
|
||||||
<script src="assets/js/leistung.js?v=202609240105"></script>
|
<script src="assets/js/leistung.js?v=202609240132"></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,13 +12,13 @@
|
|||||||
vergessen wird. -->
|
vergessen wird. -->
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/material.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/material.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
<body class="start" data-ton="42" data-buehne="studio">
|
<body class="start" data-ton="42" data-buehne="studio">
|
||||||
|
|
||||||
@@ -138,14 +138,14 @@
|
|||||||
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
<p class="m-laedt" id="laedt">Einen Moment …</p>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/material.js?v=202609240105" defer></script>
|
<script src="assets/js/material.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/personen.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -453,14 +453,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/personen.js?v=202609240105" defer></script>
|
<script src="assets/js/personen.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/profil.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -214,16 +214,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/steckbrief.js?v=202609240105" defer></script>
|
<script src="assets/js/steckbrief.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/profil.js?v=202609240105" defer></script>
|
<script src="assets/js/profil.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -134,14 +134,14 @@
|
|||||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||||
die seit dem 07.09. jede Seite danach absucht. -->
|
die seit dem 07.09. jede Seite danach absucht. -->
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/rechte.js?v=202609240105" defer></script>
|
<script src="assets/js/rechte.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/report.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/report.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -106,17 +106,17 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202609240105" defer></script>
|
<script src="assets/js/ki.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/report.js?v=202609240105" defer></script>
|
<script src="assets/js/report.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/scouting.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -173,14 +173,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/scouting.js?v=202609240105" defer></script>
|
<script src="assets/js/scouting.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,21 +12,21 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
|
||||||
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
|
||||||
<link rel="stylesheet" href="assets/css/heim.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/heim.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -684,16 +684,16 @@
|
|||||||
</p>
|
</p>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/live.js?v=202609240105" defer></script>
|
<script src="assets/js/live.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/start.js?v=202609240105" defer></script>
|
<script src="assets/js/start.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -85,16 +85,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/ki.js?v=202609240105" defer></script>
|
<script src="assets/js/ki.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/startcheck.js?v=202609240105" defer></script>
|
<script src="assets/js/startcheck.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+18
-18
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/profil.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -150,16 +150,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202609240105" defer></script>
|
<script src="assets/js/auskunft.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/steckbrief.js?v=202609240105" defer></script>
|
<script src="assets/js/steckbrief.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
|
<title>Support · Spicy & Dogi</title>
|
||||||
|
<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=202609240132" />
|
||||||
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
|
<link rel="stylesheet" href="assets/css/support.css?v=202609240132" />
|
||||||
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="start">
|
||||||
|
|
||||||
|
<div class="schleier" aria-hidden="true"></div>
|
||||||
|
|
||||||
|
<header class="kopfleiste">
|
||||||
|
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||||
|
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||||
|
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||||
|
</svg>
|
||||||
|
<span class="zurueck-knopf__text">Zurück</span>
|
||||||
|
</button>
|
||||||
|
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Support</span></p>
|
||||||
|
<div class="kopfleiste__rechts">
|
||||||
|
<span class="wer" id="wer">…</span>
|
||||||
|
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main class="inhalt inhalt--breit">
|
||||||
|
|
||||||
|
<section class="kopf-zeile">
|
||||||
|
<div>
|
||||||
|
<p class="marke">Support</p>
|
||||||
|
<h1 class="titel" id="seiten-titel">Etwas stimmt nicht?</h1>
|
||||||
|
<p class="unterzeile" id="seiten-unter">
|
||||||
|
Schreib es hin, häng ein Bild dran, fertig. DogFather und die
|
||||||
|
rechte Hand kümmern sich darum.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ==================================================================
|
||||||
|
ZWEI SEITEN, EINE DATEI (24.09.2026)
|
||||||
|
|
||||||
|
Filipe: „bei dogfather und der rechten hand soll die kachel
|
||||||
|
anders gebaut sein weil die sind die die sich um die probleme
|
||||||
|
kümmern."
|
||||||
|
|
||||||
|
Beide Ansichten stehen hier, und support.js blendet die aus, die
|
||||||
|
nicht gilt. Zwei getrennte Dateien wären die naheliegende
|
||||||
|
Aufteilung — und die zweite wäre die, in der ein Umbau vergessen
|
||||||
|
wird. Dieselbe Entscheidung wie bei hilfe.html.
|
||||||
|
|
||||||
|
Was der SERVER liefert, entscheidet das ohnehin: Wer nicht zur
|
||||||
|
Leitung gehört, bekommt fremde Meldungen gar nicht erst. Das
|
||||||
|
Ausblenden hier ist Aufräumen, keine Sicherung.
|
||||||
|
================================================================== -->
|
||||||
|
|
||||||
|
<!-- ---------- MELDEN: sehen und benutzen alle --------------------- -->
|
||||||
|
<section class="s-melden" id="melden-block">
|
||||||
|
<h2 class="s-titel">Was ist los?</h2>
|
||||||
|
<form id="melden" novalidate>
|
||||||
|
<label class="s-feld">
|
||||||
|
<span class="s-feld__schild">Beschreib es kurz</span>
|
||||||
|
<textarea id="text" rows="4" maxlength="2000"
|
||||||
|
placeholder="z. B. Auf der Aufgabenseite lässt sich der Haken nicht setzen – der Knopf reagiert nicht."></textarea>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<!-- EIN BILD, NICHT FÜNF. Wer drei Bildschirmfotos anhängt,
|
||||||
|
erklärt damit nichts besser — er verschiebt die Arbeit nur
|
||||||
|
zu dem, der sie ansehen muss. -->
|
||||||
|
<div class="s-bild">
|
||||||
|
<input type="file" id="bild" accept="image/png,image/jpeg,image/webp,image/gif" hidden />
|
||||||
|
<button type="button" class="schritt" id="bild-waehlen">Bild anhängen</button>
|
||||||
|
<span class="s-bild__name" id="bild-name"></span>
|
||||||
|
<button type="button" class="schritt" id="bild-weg" hidden>Bild weg</button>
|
||||||
|
</div>
|
||||||
|
<div class="s-vorschau" id="vorschau" hidden>
|
||||||
|
<img id="vorschau-bild" alt="Vorschau des angehängten Bildes" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="fehler" id="melden-fehler" role="alert" aria-live="polite"></p>
|
||||||
|
<div class="s-knopfreihe">
|
||||||
|
<button type="submit" class="knopf" id="senden">Abschicken</button>
|
||||||
|
<span class="s-hinweis" id="melden-hinweis"></span>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ---------- MEINE MELDUNGEN: für alle außer der Leitung --------- -->
|
||||||
|
<section class="s-meine" id="meine-block" hidden>
|
||||||
|
<h2 class="s-titel">Deine Meldungen <span class="s-zahl" id="meine-zahl">0</span></h2>
|
||||||
|
<div id="meine-liste" aria-live="polite"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ---------- DER EINGANG: nur DogFather und die rechte Hand ------ -->
|
||||||
|
<section class="s-eingang" id="eingang-block" hidden>
|
||||||
|
<div class="s-eingang__kopf">
|
||||||
|
<h2 class="s-titel">Eingang</h2>
|
||||||
|
<!-- Die Zahlen stehen VOR der Liste, nicht darunter: Wer
|
||||||
|
hereinkommt, will zuerst wissen, ob etwas liegen geblieben
|
||||||
|
ist — und erst dann, was genau. -->
|
||||||
|
<div class="s-bilanz" id="bilanz"></div>
|
||||||
|
</div>
|
||||||
|
<div class="s-filter" id="filter" role="group" aria-label="Nach Stand filtern"></div>
|
||||||
|
<p class="fehler" id="eingang-fehler" role="alert" aria-live="polite"></p>
|
||||||
|
<div id="eingang-liste" aria-live="polite"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und
|
||||||
|
kopf.js liest daraus die Leitungsrollen. Ohne sie stuerzt jede
|
||||||
|
Seite mit der Meldung „Cannot read properties of undefined
|
||||||
|
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
|
||||||
|
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
|
||||||
|
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
|
||||||
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
|
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
|
||||||
|
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
|
||||||
|
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
|
||||||
|
uebersicht.html, und heute hier. -->
|
||||||
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
|
<script src="assets/js/support.js?v=202609240132" defer></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+18
-18
@@ -7,18 +7,18 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240132" />
|
||||||
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
||||||
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
||||||
anders aussieht. -->
|
anders aussieht. -->
|
||||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -111,15 +111,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/talente.js?v=202609240105" defer></script>
|
<script src="assets/js/talente.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,20 +7,20 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/team.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/team.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -110,15 +110,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/team.js?v=202609240105" defer></script>
|
<script src="assets/js/team.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -7,20 +7,20 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/team.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/team.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||||
@@ -84,15 +84,15 @@
|
|||||||
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
||||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/holen.js?v=202609240105" defer></script>
|
<script src="assets/js/holen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/teamlage.js?v=202609240105" defer></script>
|
<script src="assets/js/teamlage.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+15
-15
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/bereich.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -112,15 +112,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/teilen.js?v=202609240105" defer></script>
|
<script src="assets/js/teilen.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -126,14 +126,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/treff-moderation.js?v=202609240105" defer></script>
|
<script src="assets/js/treff-moderation.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,18 +7,18 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/treff.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||||
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
|
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -248,14 +248,14 @@
|
|||||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||||
die seit dem 07.09. jede Seite danach absucht. -->
|
die seit dem 07.09. jede Seite danach absucht. -->
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/auskunft.js?v=202609240105" defer></script>
|
<script src="assets/js/auskunft.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/treff-regeln.js?v=202609240105" defer></script>
|
<script src="assets/js/treff-regeln.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -12,22 +12,22 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||||
Dialog "Creator anlegen". -->
|
Dialog "Creator anlegen". -->
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -149,16 +149,16 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/uebersicht.js?v=202609240105" defer></script>
|
<script src="assets/js/uebersicht.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -335,14 +335,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/live.js?v=202609240105" defer></script>
|
<script src="assets/js/live.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/unsere-seiten.js?v=202609240105" defer></script>
|
<script src="assets/js/unsere-seiten.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+16
-16
@@ -7,15 +7,15 @@
|
|||||||
<meta name="robots" content="noindex, nofollow" />
|
<meta name="robots" content="noindex, nofollow" />
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -144,14 +144,14 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/werdegang.js?v=202609240105" defer></script>
|
<script src="assets/js/werdegang.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+15
-15
@@ -12,13 +12,13 @@
|
|||||||
vergessen wird. -->
|
vergessen wird. -->
|
||||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
|
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
|
||||||
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
|
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
|
||||||
@@ -75,13 +75,13 @@
|
|||||||
<p class="fehler" id="fehler" hidden></p>
|
<p class="fehler" id="fehler" hidden></p>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/willkommen.js?v=202609240105" defer></script>
|
<script src="assets/js/willkommen.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+17
-17
@@ -12,20 +12,20 @@
|
|||||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||||
eine Flaeche sind statt zweier. -->
|
eine Flaeche sind statt zweier. -->
|
||||||
<meta name="theme-color" content="#06090f" />
|
<meta name="theme-color" content="#06090f" />
|
||||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240105" />
|
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609240132" />
|
||||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240105" />
|
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/gate.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/start.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/start.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/wissen.css?v=202609240132" />
|
||||||
<link rel="stylesheet" href="assets/css/module.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/module.css?v=202609240132" />
|
||||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609240105" />
|
<link rel="stylesheet" href="assets/css/haus.css?v=202609240132" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="start">
|
<body class="start">
|
||||||
@@ -190,15 +190,15 @@
|
|||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script src="assets/js/meldung.js?v=202609240105" defer></script>
|
<script src="assets/js/meldung.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/hochladen.js?v=202609240105" defer></script>
|
<script src="assets/js/hochladen.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/nachfrage.js?v=202609240105" defer></script>
|
<script src="assets/js/nachfrage.js?v=202609240132" defer></script>
|
||||||
|
|
||||||
<script src="assets/js/wahl.js?v=202609240105" defer></script>
|
<script src="assets/js/wahl.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/bereiche.js?v=202609240105" defer></script>
|
<script src="assets/js/bereiche.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/installieren.js?v=202609240105" defer></script>
|
<script src="assets/js/installieren.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/kopf.js?v=202609240105" defer></script>
|
<script src="assets/js/kopf.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/glocke.js?v=202609240105" defer></script>
|
<script src="assets/js/glocke.js?v=202609240132" defer></script>
|
||||||
<script src="assets/js/wissen.js?v=202609240105" defer></script>
|
<script src="assets/js/wissen.js?v=202609240132" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user