Nichts verschwindet mehr ohne eine Nachfrage, die sagt was passiert

Filipe: "Es darf vor allem keine Stellen geben, an denen ein Benutzer
etwas falsch machen kann, nur weil die Seite es nicht verstaendlich
genug erklaert."

Gemessen: 30 Stellen in 16 Dateien benutzten confirm() oder prompt().
Das Haus hatte die richtige Bauweise laengst -- einen <dialog>, in
aufgaben.html sogar ausfuehrlich begruendet -- aber sie stand IN EINER
SEITE. Wer anderswo etwas loeschen liess, hatte sie nicht.

confirm('Wirklich loeschen?') stellt die falsche Frage: Es fragt, ob
man sicher ist, und nennt nicht, WAS passiert, was BLEIBT und ob es
ZURUECK geht. Jetzt beantwortet jeder der 41 Dialoge alle drei.

Neu: workspace/assets/js/nachfrage.js -- window.frageNach() mit
Pflichtgrund, Zahlenfeld, einzeiliger Eingabe und Abtippsicherung.
Drei Ausgaenge: <dialog> / confirm()-Notnagel fuer Safari vor 15.4 /
Abbruch (Esc, Klick daneben, "Doch nicht" -- immer false).

DREIMAL DERSELBE FALLSTRICK, dreimal nachgemessen statt vermutet:
  .dialog stand in aufgaben.css und leistung.css -> auf dateien.html
    waere der Dialog ein weisser Systemkasten gewesen. 14 Regeln
    klammergenau nach module.css verschoben (Klammern gezaehlt, nicht
    per Muster geschnitten -- heute frueh hat ein nicht-gieriges
    Muster schon einmal CSS zerrissen).
  Das Formular trug .neu neu--blank -- und .neu gibt seine Abstaende
    nur in aufgaben.css. Gemessen: padding 0px, und die Felder
    verloren ihre height:44px. Jetzt steht alles unter
    .nachfrage__form in module.css; der Dialog borgt nichts mehr.
  Die erste Fassung der Pruefung zaehlte nachfrage.js SELBST als
    Nutzer -- damit war jede Seite trivialerweise "Nutzer" und die
    Pruefung gruen ohne Inhalt. Jetzt ausdruecklich ausgenommen.

ZWEI FUNDE NEBENBEI:
  hilfeAufraeumen() wird im Betrieb NIE aufgerufen. Der Kommentar
    behauptete "wird beim Start aufgerufen (siehe index.js)" -- das
    war nie wahr; einziger Aufrufer ist die eigene Pruefung. Folge:
    geschlossene vertrauliche Faelle bleiben unbegrenzt stehen. NICHT
    eingeschaltet (das loescht echte Daten und ist Filipes
    Entscheidung), sondern der Kommentar richtiggestellt.
  Einen Hilfe-Fall zu schliessen ist endgueltig -- es gibt keine
    Route, die ihn wieder oeffnet. Vorher stand darueber nur die
    Frage nach einem Schlusswort. Jetzt sagt der Dialog es.

pruef-struktur hat meine eigene Pruefung von heute Nachmittag
erwischt: Sie bildete ihr Datum aus UTC. Beim Beheben erst
heuteLokal(datum) genommen -- die Funktion nimmt gar kein Argument
und haette still "heute" statt "+3 Tage" geliefert. Jetzt tagLokal(3),
nachgerechnet: Abstand 3 Tage.

Am Bildschirm angesehen (Rechner 1280, Handy 390): passt rein, Esc
ergibt false, Fokus liegt auf dem harmlosen Knopf, Knoepfe 44px auf
Touch. Der Platzhalter im Abtippfeld zeigte den erwarteten Namen --
das sah aus wie ein schon ausgefuelltes Feld, entfernt.

Neu: server/pruef-nachfrage.mjs -- 17/0, mit sechs Gegenproben und
beiden Richtungen (wer fragt, laedt die Datei; wer nie fragt, laedt
sie nicht -- sonst truege die Anmeldewand 4,8 KB fuer nichts).

pruef-meldungen 8/0, pruef-css-klassen gruen, pruef-struktur gruen,
pruef-leistung gruen.
This commit is contained in:
2026-09-19 19:57:43 +02:00
parent 26937dda16
commit c516aad4ed
65 changed files with 5099 additions and 4111 deletions
+6 -1
View File
@@ -97,6 +97,7 @@
Dauer: rund drei Minuten (4 Rollen × 2 Breiten × ~20 Seiten). Dauer: rund drei Minuten (4 Rollen × 2 Breiten × ~20 Seiten).
===================================================================== */ ===================================================================== */
import { tagLokal } from "./helfer-zeit.mjs";
import { mkdtempSync, rmSync } from "node:fs"; import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join, dirname } from "node:path"; import { join, dirname } from "node:path";
@@ -182,7 +183,11 @@ for (const [titel, wer] of [
+ " erstellt, frist) VALUES (?,?,?,?,?,?,?)", + " erstellt, frist) VALUES (?,?,?,?,?,?,?)",
titel, "Beschreibung mit genug Text, dass die Karte wirklich Höhe bekommt " titel, "Beschreibung mit genug Text, dass die Karte wirklich Höhe bekommt "
+ "und ein Umbruch entstehen kann.", "offen", wer, idDogi, jetzt, + "und ein Umbruch entstehen kann.", "offen", wer, idDogi, jetzt,
new Date(Date.now() + 3 * 86400000).toISOString().slice(0, 10)); /* Ortszeit, nicht UTC: Zwischen 00:00 und 02:00 deutscher Zeit
liegt UTC noch im Vortag -- die Frist waere dann um einen Tag
verschoben, und die Pruefung schluege nachts falsch an.
Gefunden hat das `pruef-struktur`, nicht ich. */
tagLokal(3));
} }
for (const [bereich, titel] of [ for (const [bereich, titel] of [
+274
View File
@@ -0,0 +1,274 @@
/* =====================================================================
pruef-nachfrage.mjs — Nichts verschwindet ohne Nachfrage.
Filipe, 19.09.2026: „Es darf vor allem keine Stellen geben, an denen
ein Benutzer etwas falsch machen kann, nur weil die Seite es nicht
verständlich genug erklärt." Und: „Fehler möglichst verhindern,
bevor sie entstehen."
---------------------------------------------------------------------
WAS DAS PROBLEM WAR
Das Haus hatte die richtige Bauweise — einen <dialog> statt
`confirm()` — und begründete sie in `aufgaben.html` sogar ausführlich.
Nur stand sie IN EINER SEITE. Gemessen am 19.09.2026: **30 Stellen**
in 16 Dateien griffen weiterhin zu `confirm()` oder `prompt()`.
Der Unterschied ist nicht Geschmack. `confirm('Wirklich löschen?')`
stellt die falsche Frage: Es fragt, ob man sicher ist, und nennt
nicht, WAS passiert, was BLEIBT und ob es ZURÜCK geht. Genau das
sind die drei Dinge, die man vor einem Löschen wissen will.
---------------------------------------------------------------------
VIER DINGE WERDEN GEPRÜFT
1. KEIN NATIVER DIALOG mehr in einer Seiten-Datei. Ausgenommen ist
allein der Notnagel in `nachfrage.js` selbst — für Browser ohne
<dialog>. (Ein Verbot ohne diese Ausnahme wäre falsch: Ein
iPhone vor Safari 15.4 bekäme sonst gar nichts angezeigt.)
2. ANGESCHLOSSEN — jede Seite, deren Skripte `frageNach` benutzen,
lädt auch `nachfrage.js`. Ohne die Datei wäre `frageNach` nicht
definiert, und aus einer Rückfrage würde ein Absturz: Der Knopf
täte stillschweigend nichts.
ACHTUNG, hier steckte beim Bauen schon eine Falle: Die erste
Fassung dieser Prüfung zählte `nachfrage.js` SELBST als Nutzer
(die Datei enthält das Wort natürlich) — damit war jede Seite
„Nutzer", die Prüfung immer grün und sie bewies nichts. Deshalb
ist die Datei unten ausdrücklich ausgenommen.
3. GESTALTET — `.dialog` wird in einer Datei gestaltet, die JEDE
Seite lädt. Vorher stand sie in `aufgaben.css`; auf `dateien.html`
wäre der Dialog ein weißer Systemkasten auf dunkler Seite
gewesen. Das ist keine Schönheitsfrage: Ein Kasten, der aussieht
wie eine Browser-Warnung, wird weggeklickt statt gelesen.
4. VOLLSTÄNDIG — jeder Aufruf hat einen `titel` und sagt, was
passiert (`was`). Ein Dialog ohne diese Angabe ist ein
`confirm()` mit mehr Zeilen Code.
Dazu GEGENPROBEN: Jede Prüfung muss beweisen, dass sie auch
„nicht in Ordnung" sagen kann.
AUFRUF: node server/pruef-nachfrage.mjs
Läuft in unter zwei Sekunden, ohne Server.
===================================================================== */
import { readFileSync, readdirSync } from "node:fs";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const HIER = dirname(fileURLToPath(import.meta.url));
const WURZEL = join(HIER, "..");
const SEITEN_ORDNER = join(WURZEL, "workspace");
const JS_ORDNER = join(SEITEN_ORDNER, "assets", "js");
const CSS_ORDNER = join(SEITEN_ORDNER, "assets", "css");
/* Die eine Datei, die `confirm`/`prompt` benutzen DARF -- sie ist der
Notnagel fuer Browser ohne <dialog>. */
const DER_NOTNAGEL = "nachfrage.js";
let ok = 0, fehl = 0;
const pruef = (name, bedingung, zusatz = "") => {
if (bedingung) { ok++; console.log(` OK ${name}`); }
else { fehl++; console.log(` FEHL ${name}${zusatz ? "\n " + zusatz : ""}`); }
};
const lies = (p) => readFileSync(p, "utf8");
const seiten = readdirSync(SEITEN_ORDNER).filter((f) => f.endsWith(".html"));
const skripte = readdirSync(JS_ORDNER).filter((f) => f.endsWith(".js"));
console.log("\n=== Nachfragen: kein nativer Dialog, und keiner ohne Erklärung ===\n");
/* ---------------------------------------------------------------------
1. KEIN NATIVER DIALOG
------------------------------------------------------------------ */
/** Entfernt Kommentare, bevor gesucht wird. Ohne das zaehlt jeder
* Kommentar, der `confirm()` ERWAEHNT, als Fund -- und davon gibt es
* in diesem Haus absichtlich mehrere (die Begruendungen). */
function ohneKommentare(js) {
return js.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:])\/\/.*$/gm, "$1");
}
const nativ = [];
for (const f of skripte) {
if (f === DER_NOTNAGEL) continue;
const code = ohneKommentare(lies(join(JS_ORDNER, f)));
for (const m of code.matchAll(/(?:^|[^.\w])(confirm|prompt)\s*\(/g)) {
const zeile = code.slice(0, m.index).split("\n").length;
nativ.push(`${f}:${zeile} → ${m[1]}()`);
}
}
pruef("keine Seite benutzt noch confirm() oder prompt()", nativ.length === 0,
nativ.slice(0, 8).join("\n "));
/* Und der Notnagel ist da -- sonst haetten Browser ohne <dialog> gar
nichts. Die ZAHL gehoert in die Bedingung, nicht nur in den Text. */
const notnagel = lies(join(JS_ORDNER, DER_NOTNAGEL));
pruef("der Notnagel für alte Browser ist vorhanden",
/HTMLDialogElement/.test(notnagel) && /window\.confirm\(/.test(notnagel));
/* ---------------------------------------------------------------------
2. ANGESCHLOSSEN
------------------------------------------------------------------ */
/** Welche Skripte rufen frageNach auf? OHNE die Datei, die es
* DEFINIERT -- sonst ist die Antwort immer „alle". */
const nutzer = new Set();
for (const f of skripte) {
if (f === DER_NOTNAGEL) continue;
if (/\bfrageNach\s*\(/.test(ohneKommentare(lies(join(JS_ORDNER, f))))) nutzer.add(f);
}
pruef("es gibt überhaupt Seiten, die nachfragen", nutzer.size > 0,
`gefunden: ${nutzer.size}`);
const ohneDatei = [], totesGewicht = [], fragendeSeiten = [];
let mitNutzung = 0;
for (const s of seiten) {
const html = lies(join(SEITEN_ORDNER, s));
const geladen = [...html.matchAll(/<script src="assets\/js\/([a-z0-9-]+\.js)/g)]
.map((m) => m[1]);
const kannFragen = geladen.some((g) => nutzer.has(g));
const hatDatei = html.includes("assets/js/nachfrage.js");
if (kannFragen) { mitNutzung++; fragendeSeiten.push(s); if (!hatDatei) ohneDatei.push(s); }
else if (hatDatei) totesGewicht.push(s);
}
pruef("jede Seite, die nachfragt, lädt auch nachfrage.js",
mitNutzung > 0 && ohneDatei.length === 0,
`${mitNutzung} Seiten nutzen es, ohne Datei: ${ohneDatei.join(", ") || "keine"}`);
/* UND DIE GEGENRICHTUNG. Ohne sie waere „ueberall einbinden" die
bequeme Antwort -- und die Anmeldewand, die jeder Besucher als
erste laedt, truege 4,8 KB fuer einen Dialog, den sie nie zeigt.
Zwei Richtungen, eine Regel: Die Datei liegt genau dort, wo sie
gebraucht wird. */
pruef("und keine Seite lädt sie, ohne je nachzufragen",
totesGewicht.length === 0,
`unnötig geladen auf: ${totesGewicht.join(", ")}`);
/* ---------------------------------------------------------------------
3. GESTALTET, UND ZWAR ÜBERALL
------------------------------------------------------------------ */
/** In welchen CSS-Dateien wird `.dialog` gestaltet? */
const dialogCss = readdirSync(CSS_ORDNER).filter((f) => f.endsWith(".css"))
.filter((f) => /^\.dialog[\s,{:]/m.test(lies(join(CSS_ORDNER, f))));
/** Und welche davon laedt jede Seite, DIE NACHFRAGEN KANN? Abgeleitet,
* nicht behauptet -- eine Liste „module.css laedt ueberall" waere genau
* die abgeschriebene Liste, vor der die Hausregeln warnen.
*
* Gemessen wird gegen die fragenden Seiten, nicht gegen alle: Die zwei
* Anmeldewaende zeigen nie einen Dialog. Von ihnen die Dialog-
* Gestaltung zu verlangen hiesse, 12 KB auf die Seite zu legen, die
* jeder Besucher als erste laedt -- fuer nichts. */
const ueberall = new Set(dialogCss);
for (const s of fragendeSeiten) {
const html = lies(join(SEITEN_ORDNER, s));
const css = new Set([...html.matchAll(/href="assets\/css\/([a-z0-9-]+\.css)/g)]
.map((m) => m[1]));
for (const d of [...ueberall]) if (!css.has(d)) ueberall.delete(d);
}
pruef(".dialog wird dort gestaltet, wo jede fragende Seite es lädt",
ueberall.size > 0 && fragendeSeiten.length > 0,
`.dialog steht in: ${dialogCss.join(", ")} — von allen `
+ `${fragendeSeiten.length} fragenden Seiten geladen: `
+ `${[...ueberall].join(", ") || "KEINE"}`);
/* Die zwei eigenen Bauteile des Nachfrage-Dialogs gehoeren in dieselbe
Datei -- sonst waere der wichtigste Satz ("nicht rueckgaengig")
ungestaltet. */
const gemeinsam = [...ueberall][0];
const gCss = gemeinsam ? lies(join(CSS_ORDNER, gemeinsam)) : "";
pruef("auch die Warnzeile und die Fehlerzeile sind dort gestaltet",
/\.nachfrage__endgueltig/.test(gCss) && /\.nachfrage__fehler/.test(gCss));
/* Und sie traegt ihre Aussage nicht nur ueber Farbe. */
pruef("die Warnzeile hat ein Zeichen, nicht nur eine Farbe",
/\.nachfrage__endgueltig::before\s*{[^}]*content/.test(gCss),
"Farbe allein trägt keine Aussage — Rot-Grün-Schwäche, Kontrastmodus");
/* ---------------------------------------------------------------------
4. VOLLSTÄNDIG: jeder Aufruf sagt, was passiert
------------------------------------------------------------------ */
/** Schneidet den Objektliteral-Teil eines frageNach-Aufrufs heraus,
* klammergenau. Ein Muster „bis zur naechsten }" wuerde bei jedem
* verschachtelten Ausdruck danebengreifen. */
function aufrufe(js) {
const out = [];
for (const m of js.matchAll(/frageNach\s*\(\s*{/g)) {
let i = m.index + m[0].length - 1, tiefe = 0, j = i;
for (; j < js.length; j++) {
if (js[j] === "{") tiefe++;
else if (js[j] === "}") { tiefe--; if (tiefe === 0) { j++; break; } }
}
out.push(js.slice(i, j));
}
return out;
}
let gezaehlt = 0;
const ohneTitel = [], ohneWas = [];
for (const f of skripte) {
if (f === DER_NOTNAGEL) continue;
const code = ohneKommentare(lies(join(JS_ORDNER, f)));
for (const a of aufrufe(code)) {
gezaehlt++;
if (!/\btitel\s*:/.test(a)) ohneTitel.push(f);
if (!/\bwas\s*:/.test(a)) ohneWas.push(f);
}
}
/* DIE ZAHL GEHOERT IN DIE BEDINGUNG: Bei null Aufrufen waere
„alle haben einen Titel" trivialerweise wahr. */
pruef("jeder Aufruf hat einen Titel", gezaehlt > 0 && ohneTitel.length === 0,
`${gezaehlt} Aufrufe geprüft, ohne Titel: ${ohneTitel.join(", ") || "keiner"}`);
pruef("jeder Aufruf sagt, WAS passiert", gezaehlt > 0 && ohneWas.length === 0,
`ohne „was": ${ohneWas.join(", ") || "keiner"}`);
/* Und die gefaehrlichste Handlung im Haus -- eine Person loeschen --
verlangt das Abtippen des Namens. Das ist keine Schikane: Der
Loeschknopf sitzt neben dem Sperrknopf. */
pruef("eine Person löschen verlangt den Namen abgetippt",
/tippen:\s*v\.person\.name/.test(lies(join(JS_ORDNER, "personen.js"))));
/* ---------------------------------------------------------------------
DIE GEGENPROBEN — jede muss anschlagen
------------------------------------------------------------------ */
console.log("\n --- Gegenproben (jede MUSS anschlagen) ---");
pruef("Gegenprobe: ein erfundenes confirm() würde gefunden",
/(?:^|[^.\w])(confirm|prompt)\s*\(/.test(
ohneKommentare("function x(){ if (!confirm('weg?')) return; }")));
pruef("Gegenprobe: ein confirm() im KOMMENTAR wird NICHT gemeldet",
!/(?:^|[^.\w])(confirm|prompt)\s*\(/.test(
ohneKommentare("/* frueher stand hier confirm('weg?') */")));
pruef("Gegenprobe: nachfrage.js selbst zählt nicht als Nutzer",
!nutzer.has(DER_NOTNAGEL),
'sonst wäre jede Seite trivialerweise Nutzer und die Prüfung grün ohne Inhalt');
pruef("Gegenprobe: die Gestaltung-Prüfung kann auch NEIN sagen",
(() => {
/* Eine erfundene Seite, die nachfragt, aber die Datei nicht laedt:
Die Schnittmenge muss dadurch leer werden. */
const probe = new Set(dialogCss);
for (const d of [...probe]) if (!new Set(["gibt-es-nicht.css"]).has(d)) probe.delete(d);
return probe.size === 0;
})());
pruef("Gegenprobe: ein Aufruf ohne Titel würde auffallen",
aufrufe("frageNach({ was: 'x' })").length === 1
&& !/\btitel\s*:/.test(aufrufe("frageNach({ was: 'x' })")[0]));
pruef("Gegenprobe: der Klammerzähler findet das Ende auch bei Verschachtelung",
aufrufe("frageNach({ titel: f({a:1}), was: 'x' }) ; danach")[0]
=== "{ titel: f({a:1}), was: 'x' }");
console.log(`\n ${ok} bestanden, ${fehl} fehlgeschlagen`);
console.log(` (${gezaehlt} Rückfragen in ${nutzer.size} Dateien, `
+ `${mitNutzung} Seiten)\n`);
process.exit(fehl ? 1 : 0);
+22 -3
View File
@@ -322,9 +322,28 @@ async function schlussBenachrichtigen(fall) {
/** Löscht geschlossene Fälle, die älter sind als die Aufbewahrung. /** Löscht geschlossene Fälle, die älter sind als die Aufbewahrung.
* *
* Wird beim Start aufgerufen (siehe index.js). Läuft still: Wenn es * ACHTUNG, NACHGEMESSEN AM 19.09.2026: Diese Funktion wird im Betrieb
* nichts zu tun gibt, sagt es auch nichts -- eine Meldung, die jeden * NICHT aufgerufen. Hier stand vorher "Wird beim Start aufgerufen
* Start begleitet, wird nach einer Woche nicht mehr gelesen. */ * (siehe index.js)" -- das war nie wahr. Gesucht im ganzen Verzeichnis:
* der einzige Aufrufer ist `pruef-hilfe.mjs`, also ihre eigene Prüfung.
*
* Die Prüfung ist deshalb grün und beweist nichts über den Betrieb:
* Sie zeigt, dass die Funktion richtig löscht -- nicht, dass jemand
* sie aufruft. Genau das Muster, vor dem die Hausregeln warnen.
*
* FOLGE: Geschlossene Fälle bleiben derzeit unbegrenzt stehen. Das ist
* die sichere Richtung (nichts geht verloren), aber nicht die
* gewollte -- ein vertraulicher Fall über einen Menschen soll nicht
* ewig gespeichert bleiben.
*
* Das EINZUSCHALTEN löscht echte Daten und ist deshalb keine
* Reparatur, die nebenbei passiert, sondern Filipes Entscheidung:
* Wie lange sollen abgeschlossene Fälle stehen bleiben? Die Prüfung
* rechnet mit 90 Tagen, das ist aber nur ihre Annahme.
*
* Läuft still: Wenn es nichts zu tun gibt, sagt es auch nichts --
* eine Meldung, die jeden Start begleitet, wird nach einer Woche
* nicht mehr gelesen. */
export function hilfeAufraeumen(tage) { export function hilfeAufraeumen(tage) {
try { try {
const grenze = new Date(Date.now() - tage * 86400000).toISOString(); const grenze = new Date(Date.now() - tage * 86400000).toISOString();
+131 -131
View File
@@ -1,131 +1,131 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de" data-haus="crew"> <html lang="de" data-haus="crew">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Anruf-Probe · Team Dogi</title> <title>Anruf-Probe · Team Dogi</title>
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<!-- KORRIGIERT AM 19.09.2026. Hier standen `basis.css` und `kopf.css` -- <!-- KORRIGIERT AM 19.09.2026. Hier standen `basis.css` und `kopf.css` --
zwei Dateien, die es im Haus gar nicht gibt. Die Seite lud sie bei zwei Dateien, die es im Haus gar nicht gibt. Die Seite lud sie bei
jedem Aufruf ins Leere und stand damit OHNE die Hausfarben da; die jedem Aufruf ins Leere und stand damit OHNE die Hausfarben da; die
Angaben darunter (var(--text-leise) usw.) liefen ins Nichts. Angaben darunter (var(--text-leise) usw.) liefen ins Nichts.
Ausgerechnet auf dieser Seite faellt das nicht auf: Sie hat ihre Ausgerechnet auf dieser Seite faellt das nicht auf: Sie hat ihre
eigene Stilangabe im Kopf, damit sie auch dann noch etwas anzeigt, eigene Stilangabe im Kopf, damit sie auch dann noch etwas anzeigt,
wenn die Stilvorlagen klemmen -- und genau die hat den Mangel wenn die Stilvorlagen klemmen -- und genau die hat den Mangel
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=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
<!-- 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?v=202609191018" /> <link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
<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=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<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,
was sie untersucht -- eine Stilvorlage, die aus dem was sie untersucht -- eine Stilvorlage, die aus dem
Zwischenspeicher kommt. */ Zwischenspeicher kommt. */
/* DIE KOPFLEISTE WAR NIE GESTALTET (nachgetragen 19.09.2026). /* DIE KOPFLEISTE WAR NIE GESTALTET (nachgetragen 19.09.2026).
Gefunden von pruef-css-klassen: `.kopfleiste`, `.kopfleiste__zurueck`, Gefunden von pruef-css-klassen: `.kopfleiste`, `.kopfleiste__zurueck`,
`.kopfleiste__mitte` und `.kopfleiste__titel` stehen in KEINER `.kopfleiste__mitte` und `.kopfleiste__titel` stehen in KEINER
Stilvorlage des Hauses -- sie leben in start.css bzw. crew-haus.css, Stilvorlage des Hauses -- sie leben in start.css bzw. crew-haus.css,
und genau die lädt diese Seite absichtlich nicht. und genau die lädt diese Seite absichtlich nicht.
Ergebnis war eine Leiste aus nacktem Text: der Zurück-Weg ein Ergebnis war eine Leiste aus nacktem Text: der Zurück-Weg ein
blasser Link irgendwo links oben, der Titel daneben in Fließtext. blasser Link irgendwo links oben, der Titel daneben in Fließtext.
Ausgerechnet auf der Seite, die man aufruft, WEIL schon etwas nicht Ausgerechnet auf der Seite, die man aufruft, WEIL schon etwas nicht
funktioniert -- da sieht unfertig aus wie kaputt. funktioniert -- da sieht unfertig aus wie kaputt.
Sie stehen hier und nicht in einer Datei, aus demselben Grund wie Sie stehen hier und nicht in einer Datei, aus demselben Grund wie
alles andere auf dieser Seite: Sie soll auch dann noch etwas alles andere auf dieser Seite: Sie soll auch dann noch etwas
anzeigen, wenn genau das schiefgeht, was sie untersucht. */ anzeigen, wenn genau das schiefgeht, was sie untersucht. */
.kopfleiste { .kopfleiste {
display: flex; align-items: center; gap: .6rem; display: flex; align-items: center; gap: .6rem;
padding: .55rem .9rem; padding: .55rem .9rem;
border-bottom: 1px solid var(--rand); border-bottom: 1px solid var(--rand);
background: color-mix(in srgb, var(--tinte) 92%, #ffffff 8%); background: color-mix(in srgb, var(--tinte) 92%, #ffffff 8%);
} }
.kopfleiste__zurueck { .kopfleiste__zurueck {
/* 44 px hoch: Das ist die Größe, die ein Daumen sicher trifft. /* 44 px hoch: Das ist die Größe, die ein Daumen sicher trifft.
Auf einem Handy ist dieser Knopf der einzige Weg zurück. */ Auf einem Handy ist dieser Knopf der einzige Weg zurück. */
display: inline-flex; align-items: center; display: inline-flex; align-items: center;
min-height: 44px; padding: 0 .7rem 0 .2rem; min-height: 44px; padding: 0 .7rem 0 .2rem;
color: var(--text-leise); text-decoration: none; color: var(--text-leise); text-decoration: none;
font-size: .92rem; border-radius: .5rem; font-size: .92rem; border-radius: .5rem;
} }
.kopfleiste__zurueck:hover, .kopfleiste__zurueck:hover,
.kopfleiste__zurueck:focus-visible { color: var(--text); } .kopfleiste__zurueck:focus-visible { color: var(--text); }
.kopfleiste__mitte { flex: 1; min-width: 0; text-align: center; } .kopfleiste__mitte { flex: 1; min-width: 0; text-align: center; }
.kopfleiste__titel { .kopfleiste__titel {
font-size: .92rem; font-weight: 600; color: var(--text); font-size: .92rem; font-weight: 600; color: var(--text);
letter-spacing: .01em; letter-spacing: .01em;
} }
/* Gleich breit wie der Zurück-Weg, damit der Titel wirklich mittig /* Gleich breit wie der Zurück-Weg, damit der Titel wirklich mittig
steht statt nur ungefähr. */ steht statt nur ungefähr. */
.kopfleiste__rechts { flex: 0 0 4.5rem; } .kopfleiste__rechts { flex: 0 0 4.5rem; }
@media (max-width: 420px) { @media (max-width: 420px) {
.kopfleiste__rechts { flex-basis: 0; } .kopfleiste__rechts { flex-basis: 0; }
.kopfleiste__mitte { text-align: right; } .kopfleiste__mitte { text-align: right; }
} }
.probe { max-width: 46rem; margin: 0 auto; padding: 1.4rem 1rem 3rem; } .probe { max-width: 46rem; margin: 0 auto; padding: 1.4rem 1rem 3rem; }
.probe h1 { margin: .2rem 0 .3rem; } .probe h1 { margin: .2rem 0 .3rem; }
.probe__unter { color: var(--text-leise); margin: 0 0 1.4rem; } .probe__unter { color: var(--text-leise); margin: 0 0 1.4rem; }
.punkt { .punkt {
display: flex; gap: .8rem; align-items: flex-start; display: flex; gap: .8rem; align-items: flex-start;
padding: .85rem 1rem; margin-bottom: .6rem; padding: .85rem 1rem; margin-bottom: .6rem;
border: 1px solid var(--rand); border-radius: .7rem; border: 1px solid var(--rand); border-radius: .7rem;
background: rgba(255,255,255,.02); background: rgba(255,255,255,.02);
} }
.punkt__zeichen { font-size: 1.1rem; line-height: 1.4; flex: 0 0 1.4rem; } .punkt__zeichen { font-size: 1.1rem; line-height: 1.4; flex: 0 0 1.4rem; }
.punkt__text { flex: 1; min-width: 0; } .punkt__text { flex: 1; min-width: 0; }
.punkt__titel { font-weight: 600; margin: 0 0 .15rem; } .punkt__titel { font-weight: 600; margin: 0 0 .15rem; }
.punkt__satz { margin: 0; color: var(--text-leise); font-size: .9rem; } .punkt__satz { margin: 0; color: var(--text-leise); font-size: .9rem; }
.punkt[data-stand="gut"] { border-color: rgba(120, 200, 150, .4); } .punkt[data-stand="gut"] { border-color: rgba(120, 200, 150, .4); }
.punkt[data-stand="warn"] { border-color: rgba(220, 180, 110, .45); } .punkt[data-stand="warn"] { border-color: rgba(220, 180, 110, .45); }
.punkt[data-stand="schlecht"] { border-color: rgba(230, 140, 140, .5); } .punkt[data-stand="schlecht"] { border-color: rgba(230, 140, 140, .5); }
/* 44 px auf Geraeten, die mit dem Finger bedient werden /* 44 px auf Geraeten, die mit dem Finger bedient werden
(19.09.2026). Diese Seite laedt module.css bewusst nicht -- (19.09.2026). Diese Seite laedt module.css bewusst nicht --
sie soll auch dann noch stehen, wenn Stilvorlagen klemmen. sie soll auch dann noch stehen, wenn Stilvorlagen klemmen.
Also gilt die Regel hier eigens. */ Also gilt die Regel hier eigens. */
.probe__knopf { margin: 1.2rem 0 .4rem; } .probe__knopf { margin: 1.2rem 0 .4rem; }
@media (pointer: coarse) { .probe__knopf { min-height: 44px; } } @media (pointer: coarse) { .probe__knopf { min-height: 44px; } }
.probe__ende { .probe__ende {
margin-top: 1.6rem; padding: 1rem; margin-top: 1.6rem; padding: 1rem;
border-radius: .7rem; border: 1px dashed var(--rand-hell); border-radius: .7rem; border: 1px dashed var(--rand-hell);
color: var(--text-leise); font-size: .92rem; color: var(--text-leise); font-size: .92rem;
} }
</style> </style>
</head> </head>
<body class="haus"> <body class="haus">
<header class="kopfleiste"> <header class="kopfleiste">
<a class="kopfleiste__zurueck" id="zurueck-weg" href="start.html">‹ Zurück</a> <a class="kopfleiste__zurueck" id="zurueck-weg" href="start.html">‹ Zurück</a>
<div class="kopfleiste__mitte"><span class="kopfleiste__titel">Anruf-Probe</span></div> <div class="kopfleiste__mitte"><span class="kopfleiste__titel">Anruf-Probe</span></div>
<div class="kopfleiste__rechts"></div> <div class="kopfleiste__rechts"></div>
</header> </header>
<main class="probe"> <main class="probe">
<h1>Warum klingelt es nicht?</h1> <h1>Warum klingelt es nicht?</h1>
<p class="probe__unter"> <p class="probe__unter">
Diese Seite geht der Reihe nach durch, was ein Anruf braucht – und sagt, Diese Seite geht der Reihe nach durch, was ein Anruf braucht – und sagt,
an welcher Stelle es hakt. Sie ruft niemanden an. an welcher Stelle es hakt. Sie ruft niemanden an.
</p> </p>
<div id="ergebnis"></div> <div id="ergebnis"></div>
<button type="button" class="knopf probe__knopf" id="ton-probe">Klingelton anhören</button> <button type="button" class="knopf probe__knopf" id="ton-probe">Klingelton anhören</button>
<p class="probe__ende" id="rat"></p> <p class="probe__ende" id="rat"></p>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/anruf-probe.js?v=202609191915" defer></script> <script src="assets/js/anruf-probe.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -22,25 +22,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191915", "src": "/assets/img/app-symbole/workspace-192.png?v=202609191956",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191915", "src": "/assets/img/app-symbole/workspace-512.png?v=202609191956",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191915", "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609191956",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191915", "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609191956",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
-129
View File
@@ -269,132 +269,10 @@
/* ---------- Bearbeiten-Dialog ------------------------------------------ */ /* ---------- Bearbeiten-Dialog ------------------------------------------ */
/* =====================================================================
DIALOGE (07.09.2026 überarbeitet)
Filipe zu zwei davon: "lass alles in dieser kachel viel spezieller und
geiler aussehen" und "dass soll auch viel besser aussehen".
Er hatte recht, und der Grund war nicht Geschmack: Ein Dialog war
bisher ein grauer Kasten (`background: #0b1018`, ein Rand, fertig) --
während die Seite dahinter aus beleuchteten Platten mit Schienen,
Körnung und Glanz besteht. Beim Öffnen fiel man aus dem einen
Material ins andere.
Jetzt trägt er dieselbe Sprache wie alles übrige:
- Leuchtschiene links, im Hausakzent
- Kopfzeile abgesetzt mit einer feinen Fuge
- Körnung und ein fester Glanz von links oben
- Materialstärke: Licht oben, Schatten unten
Und er ist deutlich TIEFER als vorher (#0b1018 war ein helles Grau
gegen das, was jetzt hinter ihm liegt) -- ein Dialog muss sich vom
Untergrund abheben, sonst schwimmt er darin.
Der Hintergrund dahinter wird STÄRKER abgedunkelt und weicher
gezeichnet: Ein Dialog ist der einzige Ort, an dem ein Weichzeichner
richtig ist -- er soll das Dahinter ausdrücklich zurücktreten
lassen. Genau dafür ist er gemacht, und genau deshalb war er unter
den Kacheln falsch.
===================================================================== */
.dialog {
position: relative;
width: min(580px, calc(100vw - 32px));
padding: 0;
border: 1px solid rgba(150, 186, 220, .16);
/* DIE FASE STATT RUNDER ECKEN (08.09.2026).
Filipe: "alles was sie sehen soll dan auch nach der neuen struktur
aufgebaut sein" -- und ein Dialog ist das, was man am genauesten
ansieht, weil er alles andere verdeckt.
Er kann NICHT in die Modulliste von module.css: Die belegt
`::before` und `::after` fuer die Eckwinkel, und beide sind hier
schon vergeben -- an die Leuchtschiene links und den Lichtsaum.
Beides gegen zwei Winkel zu tauschen waere ein Rueckschritt.
Deshalb hier nur der Zuschnitt, von Hand, mit derselben Groesse
`--fase` wie ueberall. Wer die Fase spaeter aendert, aendert sie
hier mit. */
clip-path: polygon(var(--fase, 18px) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase, 18px));
border-radius: 0;
background:
linear-gradient(90deg,
color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
color-mix(in srgb, var(--akzent) 5%, transparent) 14%,
transparent 40%),
linear-gradient(163deg, #141c29 0%, #0a0e17 58%, #070a11 100%);
color: var(--text);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .10),
inset 0 -1px 0 rgba(0, 0, 0, .55),
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
0 30px 70px -24px rgba(0, 0, 0, .92),
0 4px 12px -6px rgba(0, 0, 0, .7);
overflow: hidden;
}
/* Die Leuchtschiene -- dieselbe wie an jeder Kachel. */
.dialog::before {
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
border-radius: 4px 0 0 4px;
background: linear-gradient(180deg,
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
var(--akzent) 26%,
color-mix(in srgb, var(--akzent) 48%, transparent) 100%);
box-shadow:
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
z-index: 2;
}
/* Glanz und Körnung. `pointer-events: none` ist Pflicht: Ohne das läge
eine unsichtbare Fläche über dem ganzen Formular, und kein einziges
Feld wäre anklickbar. */
.dialog::after {
content: ""; position: absolute; inset: 0; pointer-events: none;
border-radius: inherit;
background:
linear-gradient(122deg,
rgba(255, 255, 255, .075) 0%,
rgba(255, 255, 255, .020) 15%,
transparent 34%);
/* Ohne Körnung -- siehe die Begründung in automation.css: Auf einer
Ebene mit der Spiegelung erbt sie deren Deckkraft und wird zum
grauen Schleier. */
opacity: .55;
z-index: 1;
}
.dialog > * { position: relative; z-index: 2; }
.dialog::backdrop {
background: rgba(2, 4, 8, .78);
backdrop-filter: blur(6px) saturate(80%);
}
.neu--blank { margin: 0; border: 0; background: none; padding: 22px 24px 20px; } .neu--blank { margin: 0; border: 0; background: none; padding: 22px 24px 20px; }
/* Der Kopf steht auf einer eigenen Stufe: Überschrift, darunter der
erklärende Satz, darunter eine feine Fuge. Ohne diese Trennung
verschwimmt die Ansage mit dem ersten Feld -- und genau die Ansage
ist das, was den Dialog erklärt. */
.dialog__titel {
margin: 0 0 4px;
font-size: 1.24rem; font-weight: 700; letter-spacing: -.015em;
color: #f2f7fd;
}
.dialog__unter {
margin: 0 0 16px; padding-bottom: 16px;
border-bottom: 1px solid rgba(150, 186, 220, .12);
font-size: .87rem; line-height: 1.55;
color: var(--text-leise);
}
/* Hat ein Dialog keine Erklärung, muss die Fuge trotzdem da sein --
sonst hängt die Überschrift am ersten Feld. */
.dialog__titel:last-of-type,
.dialog__unter:empty { border-bottom: 0; }
.dialog__unter:empty {
margin: 0 0 16px; padding-bottom: 16px;
border-bottom: 1px solid rgba(150, 186, 220, .12);
}
.dialog__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
.dialog__knoepfe #b-loeschen { margin-left: auto; } .dialog__knoepfe #b-loeschen { margin-left: auto; }
.abmelden--warnung { color: var(--warn); border-color: rgba(255, 154, 162, .35); } .abmelden--warnung { color: var(--warn); border-color: rgba(255, 154, 162, .35); }
@@ -858,13 +736,6 @@
} }
.abbruch-karte .schritt { font-size: .8rem; padding: 7px 13px; } .abbruch-karte .schritt { font-size: .8rem; padding: 7px 13px; }
/* ---------- Der Dialog --------------------------------------------------- */
.dialog__unter {
margin: -4px 0 14px;
font-size: .85rem; color: var(--text-still);
max-width: 60ch; line-height: 1.5;
}
#abbruch-grund { #abbruch-grund {
width: 100%; width: 100%;
-8
View File
@@ -225,9 +225,6 @@
color: var(--text); border-color: var(--rand-hell); color: var(--text); border-color: var(--rand-hell);
} }
/* ---------- Der Import --------------------------------------------------- */
.dialog--breit { max-width: 720px; }
.import-vorschau { .import-vorschau {
margin: 4px 0 14px; padding: 16px; margin: 4px 0 14px; padding: 16px;
@@ -355,7 +352,6 @@
.anleitung li::marker { color: var(--akzent); font-weight: 700; } .anleitung li::marker { color: var(--akzent); font-weight: 700; }
.anleitung strong { color: var(--text-leise); } .anleitung strong { color: var(--text-leise); }
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
/* ---- EINGEKLAPPTE HILFE (11.09.2026) ------------------------------ /* ---- EINGEKLAPPTE HILFE (11.09.2026) ------------------------------
Filipe zum Backstage-Fenster: "die sieht so scheisse aus." Filipe zum Backstage-Fenster: "die sieht so scheisse aus."
@@ -426,10 +422,6 @@
} }
.feld-datei { flex: 1 1 220px; min-width: 0; font-size: .76rem; } .feld-datei { flex: 1 1 220px; min-width: 0; font-size: .76rem; }
/* Ein Fenster, das laenger ist als der Bildschirm, versteckt seine
eigenen Knoepfe. Gerollt wird INNEN, damit "Uebernehmen" immer
erreichbar bleibt. */
.dialog--breit .neu { max-height: min(86vh, 900px); overflow-y: auto; }
/* ===================================================================== /* =====================================================================
ZEITRÄUME AUS BACKSTAGE — dritte Fassung (16.09.2026) ZEITRÄUME AUS BACKSTAGE — dritte Fassung (16.09.2026)
+256
View File
@@ -559,3 +559,259 @@
der Rundgang sechsmal gemeldet hat. */ der Rundgang sechsmal gemeldet hat. */
.filterreihe__knopf, .k-chip { min-width: 44px; } .filterreihe__knopf, .k-chip { min-width: 44px; }
} }
/* =====================================================================
DER DIALOG — hierher verschoben am 19.09.2026
Er stand in `aufgaben.css` und `leistung.css`. Das war richtig,
solange nur diese zwei Seiten einen Dialog hatten. Seit es
`nachfrage.js` gibt, kann JEDE Seite nachfragen, bevor etwas weg
ist -- und auf einer Seite, die `aufgaben.css` nicht laedt, waere
der Dialog ungestaltet gewesen: weisser Kasten, Systemschrift,
mitten auf einer dunklen Seite.
`module.css` laedt auf jeder Seite (vorletzte Datei, direkt vor
`haus.css`). Was mehr als eine Seite benutzt, gehoert hierher.
In `aufgaben.css` bleibt genau eine Regel: `.dialog__knoepfe
#b-loeschen` -- die haengt an einer ID, die es nur dort gibt.
===================================================================== */
/* =====================================================================
DIALOGE (07.09.2026 überarbeitet)
Filipe zu zwei davon: "lass alles in dieser kachel viel spezieller und
geiler aussehen" und "dass soll auch viel besser aussehen".
Er hatte recht, und der Grund war nicht Geschmack: Ein Dialog war
bisher ein grauer Kasten (`background: #0b1018`, ein Rand, fertig) --
während die Seite dahinter aus beleuchteten Platten mit Schienen,
Körnung und Glanz besteht. Beim Öffnen fiel man aus dem einen
Material ins andere.
Jetzt trägt er dieselbe Sprache wie alles übrige:
- Leuchtschiene links, im Hausakzent
- Kopfzeile abgesetzt mit einer feinen Fuge
- Körnung und ein fester Glanz von links oben
- Materialstärke: Licht oben, Schatten unten
Und er ist deutlich TIEFER als vorher (#0b1018 war ein helles Grau
gegen das, was jetzt hinter ihm liegt) -- ein Dialog muss sich vom
Untergrund abheben, sonst schwimmt er darin.
Der Hintergrund dahinter wird STÄRKER abgedunkelt und weicher
gezeichnet: Ein Dialog ist der einzige Ort, an dem ein Weichzeichner
richtig ist -- er soll das Dahinter ausdrücklich zurücktreten
lassen. Genau dafür ist er gemacht, und genau deshalb war er unter
den Kacheln falsch.
===================================================================== */
.dialog {
position: relative;
width: min(580px, calc(100vw - 32px));
padding: 0;
border: 1px solid rgba(150, 186, 220, .16);
/* DIE FASE STATT RUNDER ECKEN (08.09.2026).
Filipe: "alles was sie sehen soll dan auch nach der neuen struktur
aufgebaut sein" -- und ein Dialog ist das, was man am genauesten
ansieht, weil er alles andere verdeckt.
Er kann NICHT in die Modulliste von module.css: Die belegt
`::before` und `::after` fuer die Eckwinkel, und beide sind hier
schon vergeben -- an die Leuchtschiene links und den Lichtsaum.
Beides gegen zwei Winkel zu tauschen waere ein Rueckschritt.
Deshalb hier nur der Zuschnitt, von Hand, mit derselben Groesse
`--fase` wie ueberall. Wer die Fase spaeter aendert, aendert sie
hier mit. */
clip-path: polygon(var(--fase, 18px) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase, 18px));
border-radius: 0;
background:
linear-gradient(90deg,
color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
color-mix(in srgb, var(--akzent) 5%, transparent) 14%,
transparent 40%),
linear-gradient(163deg, #141c29 0%, #0a0e17 58%, #070a11 100%);
color: var(--text);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .10),
inset 0 -1px 0 rgba(0, 0, 0, .55),
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
0 30px 70px -24px rgba(0, 0, 0, .92),
0 4px 12px -6px rgba(0, 0, 0, .7);
overflow: hidden;
}
/* Die Leuchtschiene -- dieselbe wie an jeder Kachel. */
.dialog::before {
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
border-radius: 4px 0 0 4px;
background: linear-gradient(180deg,
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
var(--akzent) 26%,
color-mix(in srgb, var(--akzent) 48%, transparent) 100%);
box-shadow:
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
z-index: 2;
}
/* Glanz und Körnung. `pointer-events: none` ist Pflicht: Ohne das läge
eine unsichtbare Fläche über dem ganzen Formular, und kein einziges
Feld wäre anklickbar. */
.dialog::after {
content: ""; position: absolute; inset: 0; pointer-events: none;
border-radius: inherit;
background:
linear-gradient(122deg,
rgba(255, 255, 255, .075) 0%,
rgba(255, 255, 255, .020) 15%,
transparent 34%);
/* Ohne Körnung -- siehe die Begründung in automation.css: Auf einer
Ebene mit der Spiegelung erbt sie deren Deckkraft und wird zum
grauen Schleier. */
opacity: .55;
z-index: 1;
}
.dialog > * { position: relative; z-index: 2; }
.dialog::backdrop {
background: rgba(2, 4, 8, .78);
backdrop-filter: blur(6px) saturate(80%);
}
/* Der Kopf steht auf einer eigenen Stufe: Überschrift, darunter der
erklärende Satz, darunter eine feine Fuge. Ohne diese Trennung
verschwimmt die Ansage mit dem ersten Feld -- und genau die Ansage
ist das, was den Dialog erklärt. */
.dialog__titel {
margin: 0 0 4px;
font-size: 1.24rem; font-weight: 700; letter-spacing: -.015em;
color: #f2f7fd;
}
.dialog__unter {
margin: 0 0 16px; padding-bottom: 16px;
border-bottom: 1px solid rgba(150, 186, 220, .12);
font-size: .87rem; line-height: 1.55;
color: var(--text-leise);
}
/* Hat ein Dialog keine Erklärung, muss die Fuge trotzdem da sein --
sonst hängt die Überschrift am ersten Feld. */
.dialog__titel:last-of-type,
.dialog__unter:empty { border-bottom: 0; }
.dialog__unter:empty {
margin: 0 0 16px; padding-bottom: 16px;
border-bottom: 1px solid rgba(150, 186, 220, .12);
}
.dialog__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
/* ---------- Der Dialog --------------------------------------------------- */
.dialog__unter {
margin: -4px 0 14px;
font-size: .85rem; color: var(--text-still);
max-width: 60ch; line-height: 1.5;
}
/* ---------- Der Import --------------------------------------------------- */
.dialog--breit { max-width: 720px; }
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
/* Ein Fenster, das laenger ist als der Bildschirm, versteckt seine
eigenen Knoepfe. Gerollt wird INNEN, damit "Uebernehmen" immer
erreichbar bleibt. */
.dialog--breit .neu { max-height: min(86vh, 900px); overflow-y: auto; }
/* ---- Die zwei Zeilen, die confirm() nicht kann ---------------------
`nachfrage.js` baut den Dialog; diese beiden Teile gibt es nur dort.
Die Endgueltig-Zeile ist der wichtigste Satz im ganzen Dialog --
sie beantwortet die einzige Frage, die vor einem Loeschen zaehlt.
Deshalb bekommt sie eine eigene Farbe UND ein Zeichen davor: Farbe
allein traegt keine Aussage (Rot-Gruen-Schwaeche, Kontrastmodus),
und im Kontrastmodus wird `color` ohnehin ersetzt. Das Zeichen
bleibt in jedem Fall. */
.nachfrage__endgueltig {
margin: 0 0 4px;
padding: 8px 10px;
font-size: .86rem;
line-height: 1.45;
color: #ffd9d2;
background: rgba(190, 74, 60, .13);
border-left: 3px solid rgba(214, 96, 80, .62);
}
.nachfrage__endgueltig::before { content: "! "; font-weight: 800; }
/* Der Fehler IM Dialog (z. B. fehlender Grund). Er darf nicht
aussehen wie der Fehlerstreifen der Seite dahinter -- der ist
verdeckt, dieser hier gehoert zum Formular. Leer nimmt er keinen
Platz weg, sonst rutschten die Knoepfe beim ersten Fehler. */
.nachfrage__fehler { margin: 0; font-size: .86rem; color: #ffb4a8; }
.nachfrage__fehler:empty { display: none; }
/* Am Handy klebt der Dialog sonst am oberen Rand und die Knoepfe
liegen unter der Tastatur. Er waechst von unten, wie ein Blatt,
das hochgezogen wird -- das ist dort die gewohnte Richtung. */
@media (max-width: 560px) {
.nachfrage { margin: auto auto 0; width: 100vw; max-width: 100vw; }
}
@media (forced-colors: active) {
.nachfrage__endgueltig { border-left: 3px solid CanvasText; background: Canvas; }
}
/* Der kleine Hinweis unter einem Feld im Nachfrage-Dialog ("Du kannst
bis zu 14 Tage geben"). Er steht UNTER dem Feld, nicht daneben:
daneben rutscht er am Handy weg, und dort liest ihn niemand. */
.nachfrage__hinweis { margin: 4px 0 0; font-size: .8rem; color: var(--text-still); }
.nachfrage__hinweis:empty { display: none; }
/* ---- Der Dialog steht auf eigenen Füßen ---------------------------
NACHGEMESSEN AM 19.09.2026, und es war genau derselbe Fehler wie
bei `.dialog` selbst: Das Formular trug erst die Klassen
`neu neu--blank` — und `.neu` gibt seine Abstände NUR in
`aufgaben.css`. Gemessen auf einer Seite ohne diese Datei:
`padding: 0px`. Der Text klebte am Rand, und die Eingabefelder
verloren ihre `height: 44px` — also ausgerechnet die Größe, die
ein Daumen trifft.
Am Bildschirm sah es trotzdem "irgendwie richtig" aus, weil die
Schrift und die Farben aus `gate.css` kamen. Solche Abhängigkeiten
sieht man nicht, man misst sie.
Deshalb steht hier alles, was der Dialog braucht — er borgt nichts
mehr aus einer Seitendatei. `.knopf`, `.abmelden` und `.feld-schild`
bleiben: die stehen in `gate.css` bzw. `start.css`, und die lädt
jede Seite. */
.nachfrage__form { margin: 0; padding: 20px; display: grid; gap: 10px; }
.nachfrage__zeile { display: grid; gap: 5px; }
.nachfrage__form input,
.nachfrage__form textarea {
width: 100%;
box-sizing: border-box;
font: inherit;
color: var(--text);
background: var(--tinte);
border: 1px solid var(--rand);
border-radius: var(--radius, 10px);
padding: 8px 10px;
}
/* 44 Pixel, weil ein Daumen weniger nicht sicher trifft. Dieselbe Zahl
wie überall im Haus -- sie steht hier, damit sie nicht davon abhängt,
welche Seitendatei zufällig geladen ist. */
.nachfrage__form input { height: 44px; }
.nachfrage__form textarea { min-height: 62px; resize: vertical; }
.nachfrage__form input:focus,
.nachfrage__form textarea:focus {
outline: none;
box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .75),
0 0 0 3px rgba(63, 189, 245, .16);
}
/* Die Knöpfe unten bekommen Luft nach oben -- sonst sitzt "Löschen"
direkt unter dem Satz, der davor warnt. */
.nachfrage .dialog__knoepfe { margin-top: 6px; }
+17 -4
View File
@@ -110,9 +110,17 @@
es sonst ab, und das ist richtig so. Hier wird deshalb es sonst ab, und das ist richtig so. Hier wird deshalb
gleich danach gefragt statt eine Fehlermeldung zu zeigen. */ gleich danach gefragt statt eine Fehlermeldung zu zeigen. */
if (wert === 'verbessern') { if (wert === 'verbessern') {
grund = prompt('Was genau soll verbessert werden?\n\n' const ag = await frageNach({
+ 'Ohne diesen Satz kann der Creator nichts damit anfangen.', grund) || ''; titel: 'Noch verbessern',
if (grund.trim().length < 5) return; was: 'Der Creator sieht diesen Satz an seinem Eintrag.',
bleibt: 'Der Eintrag bleibt stehen – er wird nur als „noch '
+ 'verbessern" markiert und kann überarbeitet werden.',
ja: 'Zurückgeben',
grund: 'Was genau soll verbessert werden?', grundPflicht: true,
platzhalter: 'z. B. Das Licht ist zu dunkel – bitte heller nachdrehen.',
});
if (!ag) return;
grund = ag.grund;
} }
k.disabled = true; k.disabled = true;
try { try {
@@ -204,7 +212,12 @@
weg.type = 'button'; weg.type = 'button';
weg.title = 'Eigene Nachricht zurücknehmen'; weg.title = 'Eigene Nachricht zurücknehmen';
weg.addEventListener('click', async () => { weg.addEventListener('click', async () => {
if (!confirm('Diese Nachricht zurücknehmen?')) return; if (!await frageNach({
titel: 'Nachricht zurücknehmen?',
was: 'Der Text verschwindet für alle, die ihn noch nicht gelesen haben.',
bleibt: 'Wer ihn schon gelesen hat, erinnert sich trotzdem daran.',
endgueltig: true, ja: 'Zurücknehmen',
})) return;
try { try {
const a = await hole(`/workspace/api/eintrag/${eintragId}/nachricht/${n.id}`, const a = await hole(`/workspace/api/eintrag/${eintragId}/nachricht/${n.id}`,
{ method: 'DELETE' }); { method: 'DELETE' });
+15 -6
View File
@@ -129,7 +129,12 @@
weg.title = 'Rückmeldung entfernen'; weg.title = 'Rückmeldung entfernen';
weg.setAttribute('aria-label', 'Rückmeldung entfernen'); weg.setAttribute('aria-label', 'Rückmeldung entfernen');
weg.addEventListener('click', async () => { weg.addEventListener('click', async () => {
if (!confirm('Diese Rückmeldung entfernen?')) return; if (!await frageNach({
titel: 'Rückmeldung entfernen?',
was: 'Sie verschwindet aus der Aufgabe.',
bleibt: 'Die Aufgabe selbst bleibt unverändert stehen.',
endgueltig: true, ja: 'Entfernen',
})) return;
const r = await hole('/workspace/api/notizen/' + n.id, { method: 'DELETE' }); const r = await hole('/workspace/api/notizen/' + n.id, { method: 'DELETE' });
if (!r.ok) { melde('Entfernen hat nicht geklappt.'); return; } if (!r.ok) { melde('Entfernen hat nicht geklappt.'); return; }
await laden(); await laden();
@@ -997,11 +1002,15 @@
}); });
$('b-loeschen').addEventListener('click', async () => { $('b-loeschen').addEventListener('click', async () => {
if (!confirm(`Aufgabe wirklich loeschen? /* Loeschen ist hier fast nie das Richtige -- deshalb nennt der
Dialog den sanfteren Weg beim Namen, statt nur zu warnen. */
"${bearbeitet.titel}" if (!await frageNach({
titel: `„${bearbeitet.titel}" löschen?`,
Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerweise stehen bleiben.`)) return; was: 'Die Aufgabe wird samt Rückmeldungen und Verlauf entfernt.',
bleibt: 'Wenn sie nur nicht mehr stören soll: „Abbrechen" legt sie '
+ 'beiseite, ohne etwas wegzuwerfen – dort ist sie später noch da.',
endgueltig: true, ja: 'Endgültig löschen',
})) return;
try { try {
const a = await hole(`/workspace/api/aufgaben/${bearbeitet.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/aufgaben/${bearbeitet.id}`, { method: 'DELETE' });
if (!a.ok) { $('b-fehler').textContent = 'Loeschen ging nicht.'; return; } if (!a.ok) { $('b-fehler').textContent = 'Loeschen ging nicht.'; return; }
+42 -10
View File
@@ -518,8 +518,13 @@
b.type = 'button'; b.type = 'button';
b.title = 'Schickt Art, Titel und Text als Nachricht in den Chat.'; b.title = 'Schickt Art, Titel und Text als Nachricht in den Chat.';
b.addEventListener('click', async () => { b.addEventListener('click', async () => {
if (!confirm(`„${e.titel}“ als Nachricht schicken?\n\n` if (!await frageNach({
+ 'Die Person bekommt Art, Titel und Text im Chat – einmalig.')) return; titel: `„${e.titel}" als Nachricht schicken?`,
was: 'Die Person bekommt Art, Titel und Text im Chat – einmalig.',
bleibt: 'Der Eintrag bleibt hier stehen. Zurückholen lässt sich '
+ 'die Nachricht nicht, sobald sie unterwegs ist.',
ja: 'Schicken',
})) return;
b.disabled = true; b.disabled = true;
const a = await hole(`/workspace/api/bereich/entwicklung/${e.id}/senden`, const a = await hole(`/workspace/api/bereich/entwicklung/${e.id}/senden`,
{ method: 'POST', headers: { 'Content-Type': 'application/json' } }); { method: 'POST', headers: { 'Content-Type': 'application/json' } });
@@ -897,9 +902,17 @@
const vomTeam = !!e.erstellt_rolle && e.erstellt_rolle !== 'gast'; const vomTeam = !!e.erstellt_rolle && e.erstellt_rolle !== 'gast';
if (!lage.team && e.erstellt_von !== ich.id && !vomTeam) { if (!lage.team && e.erstellt_von !== ich.id && !vomTeam) {
zeile.append(tuKnopf('melden', async () => { zeile.append(tuKnopf('melden', async () => {
const grund = prompt('Was ist daran nicht in Ordnung?\n\n' const a0 = await frageNach({
+ 'Bitte schreib es in einem Satz – sonst können wir es nicht prüfen.'); titel: 'Diesen Beitrag melden?',
if (grund === null) return; was: 'Das Team sieht sich den Beitrag an. Du bleibst dabei ungenannt.',
bleibt: 'Der Beitrag bleibt vorerst stehen – gemeldet heißt noch '
+ 'nicht entfernt.',
ja: 'Melden',
grund: 'Was ist daran nicht in Ordnung?', grundPflicht: true,
platzhalter: 'Bitte in einem Satz – sonst können wir es nicht prüfen.',
});
if (!a0) return;
const grund = a0.grund;
const a = await hole('/workspace/api/treff/eintrag/' + e.id + '/melden', { const a = await hole('/workspace/api/treff/eintrag/' + e.id + '/melden', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ grund }), body: JSON.stringify({ grund }),
@@ -956,7 +969,13 @@
dass er einer wird, entscheidet ein Mensch. */ dass er einer wird, entscheidet ein Mensch. */
if (bereich === 'mitmachen' && e.erstellt_rolle === 'gast') { if (bereich === 'mitmachen' && e.erstellt_rolle === 'gast') {
zeile.append(tuKnopf('zu den Talenten', async () => { zeile.append(tuKnopf('zu den Talenten', async () => {
if (!confirm('„' + e.titel + '“ zu den Talenten übernehmen?')) return; if (!await frageNach({
titel: '„' + e.titel + '" zu den Talenten übernehmen?',
was: 'Die Person erscheint danach in der Talente-Liste.',
bleibt: 'Der Beitrag hier bleibt stehen. Übernehmen heißt noch '
+ 'keine Zusage – es entscheidet weiterhin ein Mensch.',
ja: 'Übernehmen',
})) return;
const a = await hole('/workspace/api/treff/mitmachen/' + e.id + '/uebernehmen', const a = await hole('/workspace/api/treff/mitmachen/' + e.id + '/uebernehmen',
{ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' }); { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' });
const j = await a.json().catch(() => ({})); const j = await a.json().catch(() => ({}));
@@ -971,9 +990,17 @@
fuer den eigenen Beitrag, und der braucht keine Begruendung. */ fuer den eigenen Beitrag, und der braucht keine Begruendung. */
if (e.erstellt_von !== ich.id) { if (e.erstellt_von !== ich.id) {
zeile.append(tuKnopf('entfernen', async () => { zeile.append(tuKnopf('entfernen', async () => {
const grund = prompt('Warum wird „' + e.titel + '“ entfernt?\n\n' const a1 = await frageNach({
+ 'Der Grund wird festgehalten – die Person hat ein Recht darauf.'); titel: '„' + e.titel + '" entfernen?',
if (grund === null) return; was: 'Der Beitrag verschwindet vom Brett.',
bleibt: 'Der Grund wird festgehalten und der Person mitgeteilt – '
+ 'sie hat ein Recht darauf (DSA Art. 17).',
endgueltig: true, ja: 'Entfernen',
grund: 'Warum wird er entfernt?', grundPflicht: true,
platzhalter: 'z. B. Beleidigende Sprache gegenüber einem anderen Mitglied.',
});
if (!a1) return;
const grund = a1.grund;
/* DER GRUND REIST IN DER ADRESSE, nicht im Koerper -- aus /* DER GRUND REIST IN DER ADRESSE, nicht im Koerper -- aus
demselben gemessenen Grund wie oben. Er ist kein demselben gemessenen Grund wie oben. Er ist kein
Geheimnis: Er wird der Person, die den Beitrag Geheimnis: Er wird der Person, die den Beitrag
@@ -1208,7 +1235,12 @@
if (LEITUNG.has(ich.rolle) || e.erstellt_von === ich.id) { if (LEITUNG.has(ich.rolle) || e.erstellt_von === ich.id) {
knoepfe.append(tuKnopf('löschen', async () => { knoepfe.append(tuKnopf('löschen', async () => {
if (!confirm(`„${e.titel}" wirklich löschen?`)) return; if (!await frageNach({
titel: `„${e.titel}" löschen?`,
was: 'Der Eintrag verschwindet vom Brett – für alle.',
bleibt: 'Nachrichten, die dazu geschrieben wurden, gehen mit.',
endgueltig: true, ja: 'Löschen',
})) return;
const a = await hole(`/workspace/api/bereich/${bereich}/${e.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/bereich/${bereich}/${e.id}`, { method: 'DELETE' });
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; } if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
await laden(); await laden();
+7 -5
View File
@@ -368,11 +368,13 @@
if (ich?.rolle === 'admin') { if (ich?.rolle === 'admin') {
const weg = el('div', 'kk__knoepfe'); const weg = el('div', 'kk__knoepfe');
weg.append(tuKnopf('Protokoll löschen', async () => { weg.append(tuKnopf('Protokoll löschen', async () => {
if (!confirm('Protokoll zu „' + c.titel + '" löschen?\n\n' if (!await frageNach({
+ 'Der Text ist danach weg und lässt sich nicht wiederholen.\n\n' titel: 'Protokoll zu „' + c.titel + '" löschen?',
+ 'Das Gespräch selbst bleibt im Kalender und steht danach ' was: 'Der Text ist danach weg und lässt sich nicht wiederholen.',
+ 'wieder unter „Protokoll fehlt".\n\n' bleibt: 'Das Gespräch bleibt im Kalender und steht danach wieder '
+ 'Bereits daraus entstandene Aufgaben bleiben ebenfalls stehen.')) return; + 'unter „Protokoll fehlt". Daraus entstandene Aufgaben bleiben auch.',
endgueltig: true, ja: 'Protokoll löschen',
})) return;
const a = await hole('/workspace/api/calls/' + c.id + '/protokoll', { method: 'DELETE' }); const a = await hole('/workspace/api/calls/' + c.id + '/protokoll', { method: 'DELETE' });
if (!a.ok) { if (!a.ok) {
melde(sagWas((await a.json().catch(() => ({}))).fehler, 'Löschen ging nicht.')); melde(sagWas((await a.json().catch(() => ({}))).fehler, 'Löschen ging nicht.'));
+21 -14
View File
@@ -1418,8 +1418,12 @@
} }
async function zuruecknehmen(id) { async function zuruecknehmen(id) {
if (!window.confirm('Diese Nachricht zurücknehmen? Der Text ist dann weg, ' if (!await frageNach({
+ 'im Verlauf bleibt ein Hinweis stehen.')) return; titel: 'Nachricht zurücknehmen?',
was: 'Der Text ist danach weg – auch bei allen anderen.',
bleibt: 'Im Verlauf bleibt ein Hinweis stehen, dass hier etwas stand.',
endgueltig: true, ja: 'Zurücknehmen',
})) return;
try { try {
const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' });
if (!a.ok) { melde('Ging nicht.'); return; } if (!a.ok) { melde('Ging nicht.'); return; }
@@ -2220,11 +2224,13 @@
$('gespraech-weg').addEventListener('click', async () => { $('gespraech-weg').addEventListener('click', async () => {
if (!offen) return; if (!offen) return;
const wer = offen.name; const wer = offen.name;
if (!window.confirm( if (!await frageNach({
`Gespräch mit ${wer} wegräumen?\n\n` titel: `Gespräch mit ${wer} wegräumen?`,
+ 'Es verschwindet nur bei dir. Der Verlauf beim Gegenüber bleibt ' was: 'Es verschwindet nur bei dir aus der Liste.',
+ 'vollständig.\n\nSchreibt euch jemand wieder, kommt das Gespräch ' bleibt: `Der Verlauf bei ${wer} bleibt vollständig. Schreibt ihr euch `
+ 'mit dem Neuen zurück – das Alte bleibt weg.')) return; + 'wieder, kommt das Gespräch mit dem Neuen zurück – das Alte bleibt weg.',
ja: 'Wegräumen',
})) return;
try { try {
const a = await hole(`/workspace/api/chat/raeume/${offen.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/chat/raeume/${offen.id}`, { method: 'DELETE' });
if (!a.ok) { melde('Ging nicht.'); return; } if (!a.ok) { melde('Ging nicht.'); return; }
@@ -2252,13 +2258,14 @@
if (!offen || !offen.darf_aufloesen) return; if (!offen || !offen.darf_aufloesen) return;
const wasIstEs = offen.art === 'kanal' ? 'Kanal' : 'Gruppe'; const wasIstEs = offen.art === 'kanal' ? 'Kanal' : 'Gruppe';
const andere = Math.max(0, (offen.teilnehmer?.length || 1) - 1); const andere = Math.max(0, (offen.teilnehmer?.length || 1) - 1);
if (!window.confirm( if (!await frageNach({
`${wasIstEs} „${offen.name}" für alle auflösen?\n\n` titel: `${wasIstEs} „${offen.name}" für alle auflösen?`,
+ `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1 was: `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1
? 'der anderen Person' : `den ${andere} anderen`}, samt aller ` ? 'der anderen Person' : `den ${andere} anderen`}, samt aller Anhänge.`,
+ 'Anhänge. Das lässt sich nicht rückgängig machen.\n\n' bleibt: 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf '
+ 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf ' + 'daneben – dann behalten die anderen alles.',
+ 'daneben – dann behalten die anderen alles.')) return; endgueltig: true, ja: 'Für alle auflösen',
})) return;
const knopf = $('raum-aufloesen'); const knopf = $('raum-aufloesen');
knopf.disabled = true; knopf.disabled = true;
try { try {
+17 -4
View File
@@ -440,9 +440,17 @@
const neu = stufe === wert ? 'offen' : wert; const neu = stufe === wert ? 'offen' : wert;
let grund = stand?.begruendung || ''; let grund = stand?.begruendung || '';
if (neu === 'verbessern') { if (neu === 'verbessern') {
grund = prompt(`„${p.titel}“\n\nWas genau soll verbessert werden?\n\n` const ag = await frageNach({
+ 'Ohne diesen Satz kann er nichts damit anfangen.', grund) || ''; titel: `„${p.titel}" – noch verbessern`,
if (grund.trim().length < 5) return; was: 'Dein Satz steht danach an diesem Punkt.',
bleibt: 'Der Punkt bleibt offen und kann jederzeit wieder '
+ 'auf „in Ordnung" gesetzt werden.',
ja: 'Zurückgeben',
grund: 'Was genau soll verbessert werden?', grundPflicht: true,
platzhalter: 'z. B. Fehlt noch das Impressum unten auf der Seite.',
});
if (!ag) return;
grund = ag.grund;
} }
b.disabled = true; b.disabled = true;
try { try {
@@ -549,7 +557,12 @@
weg.type = 'button'; weg.type = 'button';
weg.title = 'Eigene Nachricht zurücknehmen'; weg.title = 'Eigene Nachricht zurücknehmen';
weg.addEventListener('click', async () => { weg.addEventListener('click', async () => {
if (!confirm('Diese Nachricht zurücknehmen?')) return; if (!await frageNach({
titel: 'Nachricht zurücknehmen?',
was: 'Der Text verschwindet aus diesem Punkt.',
bleibt: 'Der Punkt selbst und sein Stand bleiben unverändert.',
endgueltig: true, ja: 'Zurücknehmen',
})) return;
try { try {
const a = await hole(`/workspace/api/checkliste/nachricht/${n.id}`, const a = await hole(`/workspace/api/checkliste/nachricht/${n.id}`,
{ method: 'DELETE' }); { method: 'DELETE' });
+13 -2
View File
@@ -213,7 +213,12 @@
knoepfe.append(tuKnopf('→ LIVE', 'Als LIVE-Thema vormerken', () => uebernehmen(e, 'live'))); knoepfe.append(tuKnopf('→ LIVE', 'Als LIVE-Thema vormerken', () => uebernehmen(e, 'live')));
} }
knoepfe.append(tuKnopf('löschen', 'Dieses Video entfernen', async () => { knoepfe.append(tuKnopf('löschen', 'Dieses Video entfernen', async () => {
if (!confirm(`„${e.titel}" wirklich löschen?`)) return; if (!await frageNach({
titel: `„${e.titel}" löschen?`,
was: 'Die Idee verschwindet aus der Planung.',
bleibt: 'Ein schon eingetragener Drehtermin im Kalender bleibt stehen.',
endgueltig: true, ja: 'Löschen',
})) return;
const a = await hole(`/workspace/api/bereich/content/${e.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/bereich/content/${e.id}`, { method: 'DELETE' });
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; } if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
await laden(); await laden();
@@ -383,7 +388,13 @@
Ausgeblendet ist nicht dasselbe wie nicht vorhanden. */ Ausgeblendet ist nicht dasselbe wie nicht vorhanden. */
if (!darfEintragen()) { ziel.append(z); continue; } if (!darfEintragen()) { ziel.append(z); continue; }
z.append(tuKnopf('löschen', 'Säule entfernen, Videos bleiben', async () => { z.append(tuKnopf('löschen', 'Säule entfernen, Videos bleiben', async () => {
if (!confirm(`Säule „${s.name}" entfernen? Die Videos bleiben, sie verlieren nur die Zuordnung.`)) return; if (!await frageNach({
titel: `Säule „${s.name}" entfernen?`,
was: 'Die Säule verschwindet aus der Auswahl.',
bleibt: 'Alle Videos bleiben – sie stehen danach nur ohne Säule da '
+ 'und lassen sich jederzeit einer anderen zuordnen.',
ja: 'Säule entfernen',
})) return;
const a = await hole(`/workspace/api/content/saeulen/${s.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/content/saeulen/${s.id}`, { method: 'DELETE' });
if (!a.ok) { melde('Ging nicht.'); return; } if (!a.ok) { melde('Ging nicht.'); return; }
await laden(); await laden();
+6 -1
View File
@@ -220,7 +220,12 @@
} }
if (LEITUNG.has(ich.rolle) || (d.hochgeladen_von === ich.id && d.status !== 'freigegeben')) { if (LEITUNG.has(ich.rolle) || (d.hochgeladen_von === ich.id && d.status !== 'freigegeben')) {
knoepfe.append(tuKnopf('löschen', async () => { knoepfe.append(tuKnopf('löschen', async () => {
if (!confirm(`„${d.name_original}" wirklich löschen?`)) return; if (!await frageNach({
titel: `„${d.name_original}" löschen?`,
was: 'Die Datei wird vom Server entfernt.',
bleibt: 'Wer sie schon heruntergeladen hat, behält seine Kopie.',
endgueltig: true, ja: 'Löschen',
})) return;
const a = await hole(`/workspace/api/dateien/${d.id}`, { method: 'DELETE' }); const a = await hole(`/workspace/api/dateien/${d.id}`, { method: 'DELETE' });
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; } if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
await laden(); await laden();
+19 -2
View File
@@ -287,8 +287,25 @@
} }
async function fallSchliessen(id) { async function fallSchliessen(id) {
const wort = prompt('Ein Schlusswort? (Kann auch leer bleiben)'); /* DER EINZIGE WEG IST VORWAERTS. Gemessen am 19.09.2026: Es gibt
if (wort === null) return; keine Route, die einen geschlossenen Fall wieder oeffnet -- weder
fuer die Leitung noch fuer die meldende Person. Ein Klick hier
ist also endgueltig, und vorher stand darueber nur die Frage
nach einem Schlusswort. Wer sie las, konnte nicht ahnen, dass
damit der Fall zugeht. */
const antwort = await frageNach({
titel: 'Diesen Fall abschließen?',
was: 'Der Fall gilt danach als erledigt. Es kann niemand mehr '
+ 'antworten – auch die Person nicht, die ihn gemeldet hat.',
bleibt: 'Der ganze Verlauf bleibt lesbar. Wieder aufmachen lässt '
+ 'sich der Fall aber nicht – dafür müsste er neu gemeldet werden.',
endgueltig: true,
ja: 'Abschließen',
grund: 'Ein Schlusswort für die Person? (darf leer bleiben)',
platzhalter: 'z. B. Wir haben mit beiden gesprochen, es ist geklärt.',
});
if (!antwort) return;
const wort = antwort.grund;
try { try {
const a = await hole('/workspace/api/hilfe/' + id + '/schliessen', { const a = await hole('/workspace/api/hilfe/' + id + '/schliessen', {
method: 'POST', method: 'POST',
+14 -7
View File
@@ -64,10 +64,13 @@
} }
async function erzeugen(erneuern) { async function erzeugen(erneuern) {
if (erneuern && !window.confirm( if (erneuern && !await frageNach({
'Neuen Link erzeugen?\n\nDer alte hört im selben Moment auf zu funktionieren. ' titel: 'Neuen Link erzeugen?',
+ 'Ein Kalender, der ihn abonniert hat, bekommt danach keine Termine mehr, ' was: 'Der alte hört im selben Moment auf zu funktionieren.',
+ 'bis du ihm den neuen gibst.')) return; bleibt: 'Deine Termine selbst bleiben. Ein Kalender, der den alten Link '
+ 'abonniert hat, bekommt aber keine mehr – bis du ihm den neuen gibst.',
endgueltig: true, ja: 'Neuen Link erzeugen',
})) return;
melde(''); melde('');
try { try {
const a = await hole('/workspace/api/ics', { const a = await hole('/workspace/api/ics', {
@@ -83,9 +86,13 @@
} }
async function abschalten() { async function abschalten() {
if (!window.confirm( if (!await frageNach({
'Abschalten?\n\nDeine Termine verschwinden dann aus jedem Kalender, ' titel: 'Kalender-Link abschalten?',
+ 'der sie abonniert hat.')) return; was: 'Deine Termine verschwinden aus jedem Kalender, der sie abonniert hat.',
bleibt: 'Die Termine selbst bleiben hier im Workspace vollständig stehen. '
+ 'Du kannst jederzeit einen neuen Link erzeugen.',
ja: 'Abschalten',
})) return;
melde(''); melde('');
try { try {
const a = await hole('/workspace/api/ics', { method: 'DELETE' }); const a = await hole('/workspace/api/ics', { method: 'DELETE' });
+30 -15
View File
@@ -949,11 +949,14 @@
if (s.darf_aendern) { if (s.darf_aendern) {
const knoepfe = el('div', 'k-serie__knoepfe'); const knoepfe = el('div', 'k-serie__knoepfe');
knoepfe.append(tuKnopf(s.aktiv ? 'abstellen' : 'wieder starten', async () => { knoepfe.append(tuKnopf(s.aktiv ? 'abstellen' : 'wieder starten', async () => {
if (s.aktiv && !confirm( if (s.aktiv && !await frageNach({
'Wiederholung „' + s.titel + '" abstellen?\n\n' titel: 'Wiederholung „' + s.titel + '" abstellen?',
+ 'Kommende Termine, die noch niemand angefasst hat, werden aus dem ' was: 'Kommende Termine, die noch niemand angefasst hat, werden aus '
+ 'Kalender genommen. Vergangene und bearbeitete Termine bleiben stehen.\n\n' + 'dem Kalender genommen.',
+ 'Du kannst sie jederzeit wieder starten.')) return; bleibt: 'Vergangene und bearbeitete Termine bleiben stehen. Du kannst '
+ 'die Wiederholung jederzeit wieder starten.',
ja: 'Abstellen',
})) return;
const a = await hole('/workspace/api/serien/' + s.id, { const a = await hole('/workspace/api/serien/' + s.id, {
method: 'PATCH', method: 'PATCH',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -963,10 +966,14 @@
await laden(); await laden();
})); }));
knoepfe.append(tuKnopf('löschen', async () => { knoepfe.append(tuKnopf('löschen', async () => {
if (!confirm('Wiederholung „' + s.titel + '" ganz löschen?\n\n' if (!await frageNach({
+ 'Die Regel ist damit weg. Kommende, unangetastete Termine werden ' titel: 'Wiederholung „' + s.titel + '" ganz löschen?',
+ 'entfernt; vergangene und bearbeitete bleiben als normale Termine ' was: 'Die Regel ist damit weg. Kommende, noch unangetastete Termine '
+ 'stehen.')) return; + 'werden entfernt.',
bleibt: 'Vergangene und schon bearbeitete Termine bleiben als '
+ 'normale Termine stehen.',
endgueltig: true, ja: 'Wiederholung löschen',
})) return;
const a = await hole('/workspace/api/serien/' + s.id, { method: 'DELETE' }); const a = await hole('/workspace/api/serien/' + s.id, { method: 'DELETE' });
if (!a.ok) { melde('Löschen ging nicht.'); return; } if (!a.ok) { melde('Löschen ging nicht.'); return; }
await laden(); await laden();
@@ -1221,12 +1228,20 @@
dass NUR dieser eine Tag entfällt. Sonst löscht jemand ihn dass NUR dieser eine Tag entfällt. Sonst löscht jemand ihn
in der Annahme, die Wiederholung sei damit abgestellt -- in der Annahme, die Wiederholung sei damit abgestellt --
und wundert sich nächste Woche. */ und wundert sich nächste Woche. */
const frage = e.serie_id
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?\n\n' if (!await frageNach({
+ 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen ' titel: e.serie_id
+ 'den Schalter unter „Läuft von allein" benutzen.' ? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?'
: 'Termin „' + e.titel + '" löschen?'; : 'Termin „' + e.titel + '" löschen?',
if (!confirm(frage)) return; was: e.serie_id
? 'Nur dieser eine Tag entfällt.'
: 'Der Termin verschwindet aus dem Kalender.',
bleibt: e.serie_id
? 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
+ 'den Schalter unter „Läuft von allein" benutzen.'
: 'Alle anderen Termine bleiben stehen.',
endgueltig: true, ja: e.serie_id ? 'Diesen Tag streichen' : 'Löschen',
})) return;
const a = await hole('/workspace/api/termine/' + e.id, { method: 'DELETE' }); const a = await hole('/workspace/api/termine/' + e.id, { method: 'DELETE' });
if (!a.ok) { melde('Löschen ging nicht.'); return; } if (!a.ok) { melde('Löschen ging nicht.'); return; }
await laden(); await laden();
+7 -1
View File
@@ -404,7 +404,13 @@
async function tagLoeschen() { async function tagLoeschen() {
const d = $('tag-dialog'); const d = $('tag-dialog');
if (!window.confirm('Diese Zeile wirklich löschen? Die Zahlen des Tages sind dann weg.')) return; if (!await frageNach({
titel: 'Zahlen dieses Tages löschen?',
was: 'Die eingetragenen Zahlen für diesen Tag werden entfernt.',
bleibt: 'Alle anderen Tage bleiben unverändert. Du kannst den Tag '
+ 'jederzeit neu eintragen.',
endgueltig: true, ja: 'Zeile löschen',
})) return;
try { try {
const a = await hole(`/workspace/api/leistung/${offenerCreator}/${d.dataset.tag}`, const a = await hole(`/workspace/api/leistung/${offenerCreator}/${d.dataset.tag}`,
{ method: 'DELETE' }); { method: 'DELETE' });
+326
View File
@@ -0,0 +1,326 @@
/* =====================================================================
NACHFRAGEN, BEVOR ETWAS WEG IST — window.frageNach()
Filipe, 19.09.2026: „Es darf vor allem keine Stellen geben, an denen
ein Benutzer etwas falsch machen kann, nur weil die Seite es nicht
verstaendlich genug erklaert." Und: „Fehler moeglichst verhindern,
bevor sie entstehen."
---------------------------------------------------------------------
WARUM ES DIESE DATEI GIBT
Das Haus hatte die richtige Bauweise laengst -- in `aufgaben.html`
steht sie sogar begruendet: ein <dialog>, kein confirm(), weil
confirm die ganze Seite anhaelt, kein Textfeld aufnimmt und auf
jedem Rechner anders aussieht.
Nur stand diese Bauweise IN EINER SEITE. Wer auf einer anderen Seite
etwas loeschen liess, hatte sie nicht -- und griff zu confirm().
Gemessen am 19.09.2026: 30 Stellen im Workspace, in 16 Dateien.
Also wandert sie hierher, wo jede Seite sie hat.
Das ist dieselbe Lehre wie bei den Fehlermeldungen (`meldung.js`)
und bei den Kachelfarben: Was an 30 Stellen gepflegt werden muss,
wird an 30 Stellen unterschiedlich. Eine Stelle, die alle benutzen,
kann nicht auseinanderlaufen.
---------------------------------------------------------------------
WAS EIN GUTER NACHFRAGE-DIALOG SAGT
confirm('Wirklich loeschen?') stellt die falsche Frage. Es fragt, ob
man sicher ist -- und wer soll das wissen, wenn nicht dasteht, was
danach passiert? Der Dialog hier beantwortet drei Dinge:
1. WAS passiert -- "Die Datei wird geloescht."
2. Was NICHT passiert -- "Der Chat-Verlauf bleibt."
3. Ob es ZURUECK geht -- "Das laesst sich nicht rueckgaengig machen."
Punkt 3 ist der wichtigste und in confirm() gar nicht ausdrueckbar.
Deshalb traegt der Bestaetigungsknopf bei `endgueltig: true` eine
sichtbare Warnfarbe UND der Text sagt es noch einmal in Worten --
Farbe allein traegt keine Aussage (Rot-Gruen-Schwaeche, Kontrastmodus).
---------------------------------------------------------------------
DREI AUSGAENGE, wie ueberall im Haus
<dialog> vorhanden -> der richtige Dialog
<dialog> fehlt (alt) -> confirm() als Notnagel, mit DEMSELBEN
Text, damit der Nutzer dieselbe
Auskunft bekommt -- nur haesslicher
Nutzer bricht ab -> false, und zwar immer: bei Esc, beim
Klick daneben und beim "Doch nicht"
Der mittlere Ausgang ist nicht theoretisch: showModal gibt es erst ab
Safari 15.4. Ein iPhone, das nicht aktualisiert wurde, wuerde ohne
Notnagel gar nichts anzeigen -- und der Knopf taete stillschweigend
nichts. Das waere schlimmer als ein haesslicher Dialog.
---------------------------------------------------------------------
AUFRUF
if (!await frageNach({
titel: 'Datei loeschen?',
was: 'Die Datei wird vom Server entfernt.',
bleibt:'Die Nachricht im Chat bleibt stehen.',
endgueltig: true,
ja: 'Loeschen',
})) return;
Mit Grund (gibt dann { grund } statt true zurueck):
const a = await frageNach({ titel: '...', grund: 'Warum?',
grundPflicht: true });
if (!a) return; // abgebrochen
... a.grund ...
===================================================================== */
(function () {
'use strict';
/* Ein einziger Dialog fuer die ganze Seite. Er wird beim ersten
Gebrauch gebaut und danach wiederverwendet -- zwei offene Dialoge
gleichzeitig kann der Browser ohnehin nicht, und ein neuer je
Aufruf wuerde den Fokus verlieren. */
var dlg = null, feld = null, tippfeld = null, zahlfeld = null, fehlerZeile = null;
function bauen() {
if (dlg) return dlg;
dlg = document.createElement('dialog');
dlg.className = 'dialog nachfrage';
dlg.innerHTML =
'<form method="dialog" class="nachfrage__form">'
+ '<h2 class="dialog__titel" data-teil="titel"></h2>'
+ '<p class="dialog__unter" data-teil="was"></p>'
+ '<p class="dialog__unter dialog__unter--still" data-teil="bleibt"></p>'
+ '<p class="nachfrage__endgueltig" data-teil="endgueltig" hidden>'
+ 'Das lässt sich danach nicht mehr rückgängig machen.</p>'
+ '<div class="nachfrage__zeile" data-teil="tippzeile" hidden>'
+ '<label class="feld-schild" data-teil="tippschild" for="nachfrage-tipp"></label>'
+ '<input id="nachfrage-tipp" type="text" autocomplete="off"'
+ ' autocapitalize="off" spellcheck="false" />'
+ '</div>'
+ '<div class="nachfrage__zeile" data-teil="grundzeile" hidden>'
+ '<label class="feld-schild" data-teil="grundschild" for="nachfrage-grund"></label>'
+ '<textarea id="nachfrage-grund" rows="3" maxlength="500"></textarea>'
+ '</div>'
+ '<div class="nachfrage__zeile" data-teil="zahlzeile" hidden>'
+ '<label class="feld-schild" data-teil="zahlschild" for="nachfrage-zahl"></label>'
+ '<input id="nachfrage-zahl" type="number" min="1" inputmode="numeric" />'
+ '<p class="nachfrage__hinweis" data-teil="zahlhinweis"></p>'
+ '</div>'
+ '<p class="nachfrage__fehler" data-teil="fehler" role="alert"></p>'
+ '<div class="dialog__knoepfe">'
+ '<button type="submit" class="knopf knopf--klein" data-teil="ja"></button>'
+ '<button type="button" class="abmelden" data-teil="nein">Doch nicht</button>'
+ '</div></form>';
document.body.appendChild(dlg);
feld = dlg.querySelector('#nachfrage-grund');
tippfeld = dlg.querySelector('#nachfrage-tipp');
zahlfeld = dlg.querySelector('#nachfrage-zahl');
fehlerZeile = dlg.querySelector('[data-teil="fehler"]');
return dlg;
}
function teil(name) { return dlg.querySelector('[data-teil="' + name + '"]'); }
/** Setzt Text und blendet die Zeile aus, wenn es keinen gibt.
* Eine leere Zeile, die Platz einnimmt, sieht aus wie ein Fehler. */
function zeile(name, text) {
var e = teil(name);
e.textContent = text || '';
e.hidden = !text;
}
window.frageNach = function frageNach(o) {
o = o || {};
var titel = o.titel || 'Sicher?';
var was = o.was || '';
var bleibt = o.bleibt || '';
var ja = o.ja || 'Ja, machen';
var nein = o.nein || 'Doch nicht';
var endgueltig = !!o.endgueltig;
var grund = o.grund || '';
var grundPflicht = !!o.grundPflicht;
var platzhalter = o.platzhalter || '';
/* ABTIPPEN STATT ANKLICKEN. Fuer die Handgriffe, bei denen ein
Fehlklick nicht zu reparieren ist (eine Person loeschen). Wer den
Namen abtippt, hat ihn gelesen -- das ist der eigentliche Zweck,
nicht die Huerde. */
var tippen = o.tippen || '';
/* EIN EINZEILIGES FELD, wenn nach einem Namen gefragt wird und
nicht nach einem Grund. Ein Textfeld ueber drei Zeilen fuer einen
Vornamen sieht aus, als erwarte jemand einen Aufsatz. Benutzt
dasselbe Feld wie `tippen` -- beides gleichzeitig kommt nicht vor
und waere auch nicht sinnvoll. */
var eingabe = o.eingabe || '';
var eingabeWert = o.eingabeWert || '';
var eingabeMin = o.eingabeMin === undefined ? 2 : o.eingabeMin;
/* EINE ZAHL IM SELBEN DIALOG. Vorher fragte die Moderation zweimal
hintereinander (Grund, dann Dauer) -- zwei Kaesten nacheinander,
und wer beim zweiten abbrach, hatte den ersten umsonst getippt.
Reihenfolge bleibt: erst WARUM, dann WIE LANGE. Wer zuerst nach
der Dauer gefragt wird, hat die Strafe festgelegt, bevor er sie
begruendet hat. */
var zahl = o.zahl || '';
var zahlWert = o.zahlWert === undefined ? '' : String(o.zahlWert);
var zahlMax = o.zahlMax || 0;
var zahlLeer = !!o.zahlLeer;
var zahlHinweis = o.zahlHinweis || '';
var NIE_ZURUECK = 'Das lässt sich danach nicht mehr rückgängig machen.';
/* ---- Ausgang 2: kein <dialog> -> confirm() mit DEMSELBEN Text ----
Nicht "Sicher?" -- wer den Notnagel bekommt, soll dieselbe
Auskunft haben wie alle anderen. */
if (typeof HTMLDialogElement === 'undefined'
|| !HTMLDialogElement.prototype.showModal) {
var text = [titel, was, bleibt, endgueltig ? NIE_ZURUECK : '']
.filter(Boolean).join('\n\n');
if (!window.confirm(text)) return Promise.resolve(false);
if (tippen) {
var t0 = window.prompt('Zum Bestätigen genau eingeben: ' + tippen, '');
if (t0 === null || t0.trim() !== tippen) return Promise.resolve(false);
}
var erg = {};
if (eingabe) {
var e0 = window.prompt(eingabe, eingabeWert);
if (e0 === null || e0.trim().length < eingabeMin) return Promise.resolve(false);
erg.eingabe = e0.trim();
}
if (grund) {
var g0 = window.prompt(grund, '');
if (g0 === null) return Promise.resolve(false);
if (grundPflicht && g0.trim().length < 3) return Promise.resolve(false);
erg.grund = g0.trim();
}
if (zahl) {
var z0 = window.prompt(zahl + (zahlHinweis ? ' (' + zahlHinweis + ')' : ''),
zahlWert);
if (z0 === null) return Promise.resolve(false);
erg.zahl = z0.trim() === '' ? null : Number(z0);
}
return Promise.resolve((grund || zahl || eingabe) ? erg : true);
}
bauen();
teil('titel').textContent = titel;
zeile('was', was);
zeile('bleibt', bleibt);
teil('endgueltig').hidden = !endgueltig;
teil('ja').textContent = ja;
teil('nein').textContent = nein;
/* Warnfarbe NUR zusaetzlich zum Satz oben, nie statt seiner. */
teil('ja').classList.toggle('knopf--warn', endgueltig);
teil('tippzeile').hidden = !(tippen || eingabe);
if (eingabe) {
teil('tippschild').textContent = eingabe;
tippfeld.value = eingabeWert;
tippfeld.placeholder = '';
} else if (tippen) {
teil('tippschild').textContent = 'Zum Bestätigen genau eingeben: ' + tippen;
tippfeld.value = '';
/* KEIN Platzhalter mit dem erwarteten Wort. Er sieht in einem
leeren Feld aus wie ein bereits eingetragener Text -- und wer
glaubt, es stehe schon da, drueckt auf "Loeschen" und wundert
sich ueber die Fehlermeldung. Der Name steht ohnehin in der
Beschriftung direkt darueber. */
tippfeld.placeholder = '';
}
teil('grundzeile').hidden = !grund;
if (grund) {
teil('grundschild').textContent = grund;
feld.value = '';
feld.placeholder = platzhalter;
}
teil('zahlzeile').hidden = !zahl;
if (zahl) {
teil('zahlschild').textContent = zahl;
teil('zahlhinweis').textContent = zahlHinweis;
zahlfeld.value = zahlWert;
if (zahlMax) zahlfeld.max = String(zahlMax); else zahlfeld.removeAttribute('max');
zahlfeld.required = !zahlLeer;
}
fehlerZeile.textContent = '';
return new Promise(function (fertig) {
var antwort = false;
var form = dlg.querySelector('form');
function aufraeumen() {
dlg.removeEventListener('close', beiSchliessen);
form.removeEventListener('submit', beiJa);
teil('nein').removeEventListener('click', beiNein);
dlg.removeEventListener('click', beiDaneben);
}
function beiSchliessen() { aufraeumen(); fertig(antwort); }
function beiNein() { antwort = false; dlg.close(); }
function beiDaneben(e) {
/* Klick auf den abgedunkelten Rand = abbrechen. Das erwartet
jeder, und ohne es bleibt der Dialog am Handy gefuehlt
haengen, weil dort kein Esc zur Verfuegung steht. */
if (e.target === dlg) { antwort = false; dlg.close(); }
}
function beiJa(e) {
e.preventDefault();
if (eingabe && tippfeld.value.trim().length < eingabeMin) {
fehlerZeile.textContent = eingabeMin > 1
? 'Bitte mindestens ' + eingabeMin + ' Zeichen eintragen.'
: 'Bitte etwas eintragen.';
tippfeld.focus(); return;
}
if (tippen && tippfeld.value.trim() !== tippen) {
/* Sagt, WAS nicht stimmt -- "falsch" allein hilft niemandem,
der sich vertippt hat. */
fehlerZeile.textContent = 'Das stimmt noch nicht. Erwartet wird genau: '
+ tippen;
tippfeld.focus();
tippfeld.select();
return;
}
var erg2 = {};
if (eingabe) erg2.eingabe = tippfeld.value.trim();
if (grund) {
var g = feld.value.trim();
if (grundPflicht && g.length < 3) {
fehlerZeile.textContent = 'Bitte kurz sagen, warum.';
feld.focus();
return; /* NICHT schliessen -- sonst waere die Eingabe weg */
}
erg2.grund = g;
}
if (zahl) {
var roh = zahlfeld.value.trim();
if (roh === '' && !zahlLeer) {
fehlerZeile.textContent = 'Bitte eine Anzahl eintragen.';
zahlfeld.focus(); return;
}
var n = roh === '' ? null : Number(roh);
if (n !== null && !(n > 0)) {
fehlerZeile.textContent = 'Das ist keine gültige Anzahl.';
zahlfeld.focus(); return;
}
if (n !== null && zahlMax && n > zahlMax) {
fehlerZeile.textContent = 'Mehr als ' + zahlMax + ' geht hier nicht.';
zahlfeld.focus(); return;
}
erg2.zahl = n;
}
antwort = (grund || zahl || eingabe) ? erg2 : true;
dlg.close();
}
dlg.addEventListener('close', beiSchliessen);
form.addEventListener('submit', beiJa);
teil('nein').addEventListener('click', beiNein);
dlg.addEventListener('click', beiDaneben);
dlg.showModal();
/* Der Fokus liegt auf dem harmlosen Knopf, nicht auf "Loeschen".
Wer aus Gewohnheit Enter drueckt, bricht damit ab -- das ist
die richtige Richtung fuer einen Fehlgriff. Ausser es gibt ein
Textfeld, dann gehoert der Fokus dorthin. */
if (tippen || eingabe) tippfeld.focus();
else if (grund) feld.focus();
else teil('nein').focus();
});
};
})();
+53 -43
View File
@@ -311,8 +311,14 @@
allein sagt nicht, WAS sich ändert -- und es ist der Handgriff, allein sagt nicht, WAS sich ändert -- und es ist der Handgriff,
der jemandem den Zugang zu einer ganzen Seite nimmt oder gibt. */ der jemandem den Zugang zu einer ganzen Seite nimmt oder gibt. */
const name = $('rolle-wahl').querySelector('.rollenwahl__knopf[data-an="ja"] .rollenwahl__name')?.textContent || gewaehlt; const name = $('rolle-wahl').querySelector('.rollenwahl__knopf[data-an="ja"] .rollenwahl__name')?.textContent || gewaehlt;
if (!confirm(`${rolleFuer.name} wird von "${ROLLENNAME[rolleFuer.rolle] || rolleFuer.rolle}" zu "${name}".\n\n` if (!await frageNach({
+ 'Der Zugangscode bleibt derselbe. Offene Sitzungen werden beendet.')) return; titel: `${rolleFuer.name}: Rolle ändern?`,
was: `Von „${ROLLENNAME[rolleFuer.rolle] || rolleFuer.rolle}" zu „${name}".`
+ ' Damit ändert sich, welche Seiten die Person öffnen darf.',
bleibt: 'Der Zugangscode bleibt derselbe. Offene Sitzungen werden beendet, '
+ 'danach kann sie sich mit dem alten Code wieder anmelden.',
ja: `Zu „${name}" machen`,
})) return;
const a = await hole(`/workspace/api/verwaltung/personen/${rolleFuer.id}/rolle`, { const a = await hole(`/workspace/api/verwaltung/personen/${rolleFuer.id}/rolle`, {
method: 'PUT', method: 'PUT',
@@ -577,18 +583,17 @@ Der Code gilt einmal fuer die `
knoepfe.append(tuKnopf('Neuer Code', async () => { knoepfe.append(tuKnopf('Neuer Code', async () => {
const eigen = p.id === ich.id; const eigen = p.id === ich.id;
const frage = eigen if (!await frageNach({
/* Der Satz stimmte bis zum 02.09.2026 -- und beschrieb genau die titel: eigen ? 'Neuer Code für dich selbst?' : `Neuer Code für ${p.name}?`,
Falle: Man bestätigte, der Code erschien, und im selben Moment was: 'Der alte Code gilt danach nicht mehr.',
war die Sitzung weg. Jetzt bleibt sie bestehen, und der Text bleibt: eigen
sagt, was wirklich passiert. */ ? 'Alle ANDEREN Geräte werden abgemeldet – hier bleibst du '
? 'Neuer Code für dich selbst?\n\n' + 'angemeldet. Der neue Code steht danach auf dem Bildschirm, '
+ 'Der alte Code gilt danach nicht mehr, und alle ANDEREN Geräte ' + 'bis du ihn selbst wegklickst.'
+ 'werden abgemeldet.\n\n' : `Offene Sitzungen von ${p.name} werden beendet. Alles andere `
+ 'Hier bleibst du angemeldet – der neue Code steht danach auf dem ' + 'bleibt unverändert – nur der Code ist neu.',
+ 'Bildschirm, bis du ihn selbst wegklickst.' endgueltig: true, ja: 'Neuen Code erzeugen',
: `Neuer Code für ${p.name}?\n\nDer alte Code gilt dann nicht mehr, offene Sitzungen werden beendet.`; })) return;
if (!confirm(frage)) return;
const a = await hole(`/workspace/api/verwaltung/personen/${p.id}/code`, { const a = await hole(`/workspace/api/verwaltung/personen/${p.id}/code`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -601,7 +606,13 @@ Der Code gilt einmal fuer die `
if (p.id !== ich.id) { if (p.id !== ich.id) {
knoepfe.append(tuKnopf(p.aktiv ? 'Sperren' : 'Entsperren', async () => { knoepfe.append(tuKnopf(p.aktiv ? 'Sperren' : 'Entsperren', async () => {
if (p.aktiv && !confirm(`${p.name} sperren?\n\nOffene Sitzungen werden sofort beendet.`)) return; if (p.aktiv && !await frageNach({
titel: `${p.name} sperren?`,
was: 'Offene Sitzungen werden sofort beendet. Anmelden geht danach nicht mehr.',
bleibt: 'Alle Daten bleiben stehen – Aufgaben, Nachrichten, Steckbrief. '
+ 'Entsperren geht jederzeit mit demselben Knopf.',
ja: 'Sperren',
})) return;
const a = await hole(`/workspace/api/verwaltung/personen/${p.id}`, { const a = await hole(`/workspace/api/verwaltung/personen/${p.id}`, {
method: 'PATCH', method: 'PATCH',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -704,43 +715,42 @@ Der Code gilt einmal fuer die `
if (v.hindernis) { melde(v.hindernis); return; } if (v.hindernis) { melde(v.hindernis); return; }
const zeilen = [];
const mit = Object.entries(v.mit).filter(([, n]) => n > 0); const mit = Object.entries(v.mit).filter(([, n]) => n > 0);
const bleibt = Object.entries(v.bleibt).filter(([, n]) => n > 0); const bleibt = Object.entries(v.bleibt).filter(([, n]) => n > 0);
zeilen.push(`„${v.person.name}" wirklich löschen?`, ''); /* Was mitgeht und was bleibt, sind ZWEI Aussagen -- deshalb stehen
if (mit.length) { sie im Dialog auch in zwei Zeilen und nicht in einer Liste, die
zeilen.push('Wird MITGELÖSCHT:'); man von oben nach unten durchliest und in der Mitte aufgibt. */
for (const [was, n] of mit) zeilen.push(` · ${was}: ${n}`); const wasWeg = mit.length
zeilen.push(''); ? 'Mitgelöscht wird: ' + mit.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
} : 'An dieser Person hängt nichts, was mitgelöscht würde.';
if (bleibt.length) { const wasBleibt = [
zeilen.push('BLEIBT erhalten, verliert nur die Zuordnung:'); bleibt.length
for (const [was, n] of bleibt) zeilen.push(` · ${was}: ${n}`); ? 'Erhalten bleibt, verliert aber die Zuordnung: '
zeilen.push(''); + bleibt.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
} : '',
if (v.verliertBetreuung.length) { v.verliertBetreuung.length
zeilen.push(`ACHTUNG: ${v.verliertBetreuung.join(', ')} ` ? `${v.verliertBetreuung.join(', ')} `
+ `${v.verliertBetreuung.length === 1 ? 'steht' : 'stehen'} danach ohne zuständige Person da.`, ''); + `${v.verliertBetreuung.length === 1 ? 'steht' : 'stehen'} danach `
} + 'ohne zuständige Person da.'
if (!mit.length && !bleibt.length && !v.verliertBetreuung.length) { : '',
zeilen.push('An dieser Person hängt nichts.', ''); 'Vorher wird automatisch eine Sicherung geschrieben.',
} ].filter(Boolean).join(' ');
zeilen.push('Vorher wird automatisch eine Sicherung geschrieben.', '',
`Zum Bestätigen den Namen genau eingeben: ${v.person.name}`);
const eingabe = prompt(zeilen.join('\n'), ''); if (!await frageNach({
if (eingabe === null) return; titel: `„${v.person.name}" löschen?`,
if (eingabe.trim() !== v.person.name) { was: wasWeg,
melde('Der Name stimmt nicht – es wurde nichts gelöscht.'); bleibt: wasBleibt,
return; endgueltig: true,
} ja: 'Endgültig löschen',
tippen: v.person.name,
})) return;
try { try {
const a = await hole(`/workspace/api/verwaltung/personen/${person.id}`, { const a = await hole(`/workspace/api/verwaltung/personen/${person.id}`, {
method: 'DELETE', method: 'DELETE',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: eingabe.trim() }), body: JSON.stringify({ name: v.person.name }),
}); });
const d = await a.json().catch(() => ({})); const d = await a.json().catch(() => ({}));
if (!a.ok) { melde(sagWas(d.fehler, 'Löschen hat nicht geklappt.')); return; } if (!a.ok) { melde(sagWas(d.fehler, 'Löschen hat nicht geklappt.')); return; }
+14 -5
View File
@@ -109,9 +109,13 @@
sieht sofort jemand. Etwas aufzumachen merkt unter Umständen sieht sofort jemand. Etwas aufzumachen merkt unter Umständen
lange niemand — und genau das ist der Klick, bei dem eine lange niemand — und genau das ist der Klick, bei dem eine
Sekunde Nachdenken etwas wert ist. */ Sekunde Nachdenken etwas wert ist. */
if (erlaubt && !confirm( if (erlaubt && !await frageNach({
`„${rolle.name}" darf danach ${seite.datei} öffnen.\n\n` titel: `„${rolle.name}" darf danach ${seite.datei} öffnen`,
+ 'Das gilt sofort, für alle mit dieser Rolle. Sicher?')) return; was: 'Das gilt sofort, für alle mit dieser Rolle.',
bleibt: 'Zurücknehmen geht jederzeit mit demselben Schalter – aber bis '
+ 'dahin hat jeder mit dieser Rolle Zugang.',
ja: 'Freigeben',
})) return;
knopf.disabled = true; knopf.disabled = true;
try { try {
@@ -167,8 +171,13 @@
const b = el('button', 'schritt', 'Alles zurück auf Grundstand'); const b = el('button', 'schritt', 'Alles zurück auf Grundstand');
b.type = 'button'; b.type = 'button';
b.addEventListener('click', async () => { b.addEventListener('click', async () => {
if (!confirm(`${daten.abweichungen} Änderungen zurücknehmen?\n\n` if (!await frageNach({
+ 'Danach gilt wieder genau das, was im Code steht.')) return; titel: `${daten.abweichungen} Änderungen zurücknehmen?`,
was: 'Danach gilt wieder genau das, was im Code steht.',
bleibt: 'Die Rechte selbst gehen nicht verloren – nur die von Hand '
+ 'gesetzten Abweichungen. Du kannst sie jederzeit neu setzen.',
ja: 'Auf Grundstand zurück',
})) return;
b.disabled = true; b.disabled = true;
const a = await hole('/workspace/api/rechte/abweichungen', { method: 'DELETE' }); const a = await hole('/workspace/api/rechte/abweichungen', { method: 'DELETE' });
b.disabled = false; b.disabled = false;
+8 -3
View File
@@ -166,9 +166,14 @@
const b = el('button', 'knopf knopf--klein', 'Durchgegangen und bestätigt'); const b = el('button', 'knopf knopf--klein', 'Durchgegangen und bestätigt');
b.type = 'button'; b.type = 'button';
b.addEventListener('click', async () => { b.addEventListener('click', async () => {
if (!confirm('Bestätigen, dass ihr das Dokument gemeinsam durchgegangen seid?\n\n' if (!await frageNach({
+ 'Sobald BEIDE bestätigt haben, ist der Nachweis endgültig und lässt sich ' titel: 'Gemeinsam durchgegangen?',
+ 'nicht mehr ändern.')) return; was: 'Deine Bestätigung wird mit Datum festgehalten.',
bleibt: 'Sobald BEIDE bestätigt haben, ist der Nachweis endgültig '
+ 'und lässt sich nicht mehr ändern. Solange nur du bestätigt '
+ 'hast, ist noch nichts festgeschrieben.',
ja: 'Ja, bestätigen',
})) return;
b.disabled = true; b.disabled = true;
b.textContent = 'wird gespeichert …'; b.textContent = 'wird gespeichert …';
try { try {
+13 -2
View File
@@ -329,7 +329,12 @@
const wg = el('button', 'knopf-still knopf-still--warn', 'Löschen'); const wg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
wg.type = 'button'; wg.type = 'button';
wg.addEventListener('click', async () => { wg.addEventListener('click', async () => {
if (!confirm(`„${l.name}" wirklich aus der Pipeline entfernen?`)) return; if (!await frageNach({
titel: `„${l.name}" aus der Pipeline entfernen?`,
was: 'Der Lead verschwindet aus der Liste, samt Notizen und Verlauf.',
bleibt: 'Andere Leads bleiben unberührt.',
endgueltig: true, ja: 'Entfernen',
})) return;
if (await schicke('/workspace/api/leads/' + l.id, 'DELETE')) { offen.delete(l.id); await laden(); } if (await schicke('/workspace/api/leads/' + l.id, 'DELETE')) { offen.delete(l.id); await laden(); }
}); });
unten.append(wg); unten.append(wg);
@@ -344,7 +349,13 @@
} }
async function onboarding(l, knopf) { async function onboarding(l, knopf) {
if (!confirm(`Aus „${l.name}" jetzt einen Creator mit eigenem Zugang anlegen?`)) return; if (!await frageNach({
titel: `Aus „${l.name}" einen Creator mit eigenem Zugang anlegen?`,
was: 'Es entsteht ein Konto mit eigenem Zugangscode.',
bleibt: 'Der Lead bleibt in der Pipeline stehen und wird als '
+ 'übernommen markiert.',
ja: 'Creator anlegen',
})) return;
knopf.disabled = true; knopf.disabled = true;
const r = await schicke('/workspace/api/leads/' + l.id + '/onboarding', 'POST', { name: l.name }); const r = await schicke('/workspace/api/leads/' + l.id + '/onboarding', 'POST', { name: l.name });
knopf.disabled = false; knopf.disabled = false;
+8 -1
View File
@@ -160,7 +160,14 @@
}); });
$('sb-bild-weg').addEventListener('click', async () => { $('sb-bild-weg').addEventListener('click', async () => {
if (!confirm('Profilbild entfernen?')) return; if (!await frageNach({
titel: 'Profilbild entfernen?',
was: 'Dein Bild verschwindet überall – aus der Liste, aus dem Chat, '
+ 'aus deinem Steckbrief.',
bleibt: 'Alles andere an deinem Steckbrief bleibt stehen. Du kannst '
+ 'jederzeit ein neues Bild hochladen.',
ja: 'Bild entfernen',
})) return;
try { try {
const a = await hole('/workspace/api/steckbrief/bild', { method: 'DELETE' }); const a = await hole('/workspace/api/steckbrief/bild', { method: 'DELETE' });
if (!a.ok) { melde('Entfernen ging nicht.'); return; } if (!a.ok) { melde('Entfernen ging nicht.'); return; }
+12 -6
View File
@@ -650,12 +650,18 @@
if (!darfAnlegen()) { melde('Zugänge legt DogFather an.'); return null; } if (!darfAnlegen()) { melde('Zugänge legt DogFather an.'); return null; }
const vorschlag = String(k.titel || '').split(/[\s,(–-]+/)[0] || ''; const vorschlag = String(k.titel || '').split(/[\s,(–-]+/)[0] || '';
const name = prompt( const an = await frageNach({
'Wie soll die Person im Workspace heißen?\n\n' titel: 'Zugang anlegen',
+ 'Das ist der Name, den euer Team sieht. Gleich danach bekommst du ' was: 'Die Person bekommt ein eigenes Konto im Workspace.',
+ 'einmalig ihren Zugangscode – danach nie wieder.', bleibt: 'Gleich danach siehst du einmalig ihren Zugangscode – danach '
vorschlag); + 'nie wieder. Schreib ihn dir vorher auf oder hab den Chat offen.',
if (name === null) return null; // abgebrochen ja: 'Zugang anlegen',
eingabe: 'Wie soll die Person im Workspace heißen?',
eingabeWert: vorschlag,
eingabeMin: 2,
});
if (!an) return null; // abgebrochen
const name = an.eingabe;
if (String(name).trim().length < 2) { melde('Der Name ist zu kurz.'); return null; } if (String(name).trim().length < 2) { melde('Der Name ist zu kurz.'); return null; }
let a; let a;
+55 -23
View File
@@ -181,10 +181,24 @@
} }
async function entscheiden(id, status) { async function entscheiden(id, status) {
const entscheid = prompt(status === 'erledigt' const ae = await frageNach({
? 'Was hast du getan?\n\nEin Satz genügt – er wird zur Meldung festgehalten.' titel: status === 'erledigt' ? 'Meldung als erledigt schließen'
: 'Warum ist daran nichts dran?\n\nEin Satz genügt – er wird festgehalten.'); : 'Meldung als unbegründet schließen',
if (entscheid === null) return; was: status === 'erledigt'
? 'Die Meldung gilt danach als bearbeitet.'
: 'Die Meldung gilt danach als geprüft, ohne Folgen für die Person.',
bleibt: 'Dein Satz wird zur Meldung festgehalten und bleibt im Verlauf '
+ 'lesbar. Der Beitrag selbst ändert sich dadurch nicht.',
ja: 'Schließen',
grund: status === 'erledigt' ? 'Was hast du getan?'
: 'Warum ist daran nichts dran?',
grundPflicht: true,
platzhalter: status === 'erledigt'
? 'z. B. Beitrag entfernt und die Person angeschrieben.'
: 'z. B. Der Beitrag verstößt gegen keine Regel.',
});
if (!ae) return;
const entscheid = ae.grund;
const a = await hole('/workspace/api/treff/meldung/' + id, { const a = await hole('/workspace/api/treff/meldung/' + id, {
method: 'PATCH', method: 'PATCH',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
@@ -270,24 +284,36 @@
wird, hat die Strafe schon festgelegt, bevor er sie begründet hat. wird, hat die Strafe schon festgelegt, bevor er sie begründet hat.
So steht am Anfang die Frage, was eigentlich passiert ist. */ So steht am Anfang die Frage, was eigentlich passiert ist. */
async function massnahme(m, art, darf) { async function massnahme(m, art, darf) {
const grund = prompt(art === 'hinweis' const istHinweis = art === 'hinweis';
? `Hinweis an ${m.name} – worum geht es?` const wieLang = istHinweis ? null : (darf?.frist_tage || 0);
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name} – warum?\n\n` const a0 = await frageNach({
+ 'Der Grund wird festgehalten, und die Person hat ein Recht darauf.'); titel: istHinweis
if (grund === null) return; ? `Hinweis an ${m.name}`
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name}`,
let tage; was: istHinweis
if (art !== 'hinweis') { ? 'Die Person bekommt deinen Text zu lesen. Sie darf weiter mitmachen.'
const hinweis = darf?.frist_tage : (art === 'pause'
? `Du kannst bis zu ${darf.frist_tage} Tage geben.` ? 'Die Person kann für die eingetragene Zeit nichts schreiben.'
: 'Leer lassen = dauerhaft (nur bei Ausschluss).'; : 'Die Person kann nichts mehr schreiben.'),
const ein = prompt(`Für wie viele Tage?\n\n${hinweis}`, bleibt: 'Der Grund wird festgehalten und der Person mitgeteilt – sie hat '
darf?.frist_tage ? String(darf.frist_tage) : '7'); + 'ein Recht darauf. Aufheben geht jederzeit.',
if (ein === null) return; ja: istHinweis ? 'Hinweis schicken' : 'Eintragen',
tage = ein.trim() === '' ? null : Number(ein); grund: istHinweis ? 'Worum geht es?' : 'Warum?', grundPflicht: true,
if (tage !== null && !(tage > 0)) { melde('Das ist keine Anzahl Tage.'); return; } platzhalter: istHinweis
if (tage === null && art === 'pause') { melde('Eine Pause braucht eine Dauer.'); return; } ? 'z. B. Bitte nicht mehrfach dasselbe posten.'
} : 'z. B. Wiederholte Beleidigungen trotz Hinweis.',
zahl: istHinweis ? '' : 'Für wie viele Tage?',
zahlWert: wieLang ? String(wieLang) : '7',
zahlMax: wieLang || 0,
/* Leer = dauerhaft, aber NUR beim Ausschluss -- eine Pause ohne
Ende waere ein Ausschluss unter falschem Namen. */
zahlLeer: art === 'ausschluss' && !wieLang,
zahlHinweis: wieLang ? `Höchstens ${wieLang} Tage.`
: (art === 'ausschluss' ? 'Leer lassen = dauerhaft.' : ''),
});
if (!a0) return;
const grund = a0.grund;
const tage = istHinweis ? undefined : a0.zahl;
const a = await hole('/workspace/api/treff/massnahme', { const a = await hole('/workspace/api/treff/massnahme', {
method: 'POST', method: 'POST',
@@ -324,7 +350,13 @@
+ ' am ' + datum(m.zeitpunkt)], + ' am ' + datum(m.zeitpunkt)],
], laeuft && m.art !== 'hinweis' ? [ ], laeuft && m.art !== 'hinweis' ? [
knopf('aufheben', async () => { knopf('aufheben', async () => {
if (!confirm(`Maßnahme gegen ${m.person_name} aufheben?`)) return; if (!await frageNach({
titel: `Maßnahme gegen ${m.person_name} aufheben?`,
was: 'Die Person darf danach sofort wieder mitmachen.',
bleibt: 'Die Maßnahme bleibt im Verlauf sichtbar – sie wird nur '
+ 'beendet, nicht gelöscht.',
ja: 'Aufheben',
})) return;
const r = await hole('/workspace/api/treff/massnahme/' + m.id, { method: 'DELETE' }); const r = await hole('/workspace/api/treff/massnahme/' + m.id, { method: 'DELETE' });
if (!r.ok) { if (!r.ok) {
melde(sagWas((await r.json().catch(() => ({}))).fehler, 'Ging nicht.')); melde(sagWas((await r.json().catch(() => ({}))).fehler, 'Ging nicht.'));
+7 -2
View File
@@ -146,8 +146,13 @@
: `Alle ${liste.length} Punkte übernehmen`); : `Alle ${liste.length} Punkte übernehmen`);
allesNehmen.type = 'button'; allesNehmen.type = 'button';
allesNehmen.addEventListener('click', async () => { allesNehmen.addEventListener('click', async () => {
if (!confirm(`Wirklich alle ${liste.length} übernehmen? ` if (!await frageNach({
+ 'Sie landen als eigene Einträge in der Liste und lassen sich einzeln löschen.')) return; titel: `Alle ${liste.length} übernehmen?`,
was: 'Sie landen als eigene Einträge in deiner Liste.',
bleibt: 'Die Vorlage bleibt unverändert. Jeder übernommene Eintrag '
+ 'lässt sich einzeln wieder löschen.',
ja: `Alle ${liste.length} übernehmen`,
})) return;
allesNehmen.disabled = true; allesNehmen.disabled = true;
allesNehmen.textContent = 'wird übernommen …'; allesNehmen.textContent = 'wird übernommen …';
try { try {
+7 -1
View File
@@ -251,7 +251,13 @@
const weg = el('button', 'knopf-still knopf-still--warn', 'Löschen'); const weg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
weg.type = 'button'; weg.type = 'button';
weg.addEventListener('click', async () => { weg.addEventListener('click', async () => {
if (!confirm(`„${e.titel}" wirklich löschen?\n\nDie PDF wird dabei auch vom Server entfernt.`)) return; if (!await frageNach({
titel: `„${e.titel}" löschen?`,
was: 'Der Eintrag verschwindet aus dem Wissen. Die PDF wird dabei '
+ 'auch vom Server entfernt.',
bleibt: 'Wer sie schon heruntergeladen hat, behält seine Kopie.',
endgueltig: true, ja: 'Löschen',
})) return;
const a = await hole('/workspace/api/wissen/' + e.id, { method: 'DELETE' }); const a = await hole('/workspace/api/wissen/' + e.id, { method: 'DELETE' });
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; } if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
await laden_(); await laden_();
+14 -13
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -291,12 +291,13 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/aufgaben.js?v=202609191915" defer></script> <script src="assets/js/aufgaben.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+179 -179
View File
@@ -1,179 +1,179 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Automationen · Spicy & Dogi</title> <title>Automationen · Spicy & Dogi</title>
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/automation.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren <!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
Ecken, siehe start.css). Ein eigenes Element statt eines dritten Ecken, siehe start.css). Ein eigenes Element statt eines dritten
Pseudo-Elements -- body hat nur ::before und ::after. --> Pseudo-Elements -- body hat nur ::before und ::after. -->
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Automationen</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Automationen</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Was von allein passiert</p> <p class="marke">Was von allein passiert</p>
<h1 class="titel">Automationen</h1> <h1 class="titel">Automationen</h1>
<p class="unterzeile"> <p class="unterzeile">
Alles hier läuft ohne Zutun. Diese Seite zeigt, was gerade greift – Alles hier läuft ohne Zutun. Diese Seite zeigt, was gerade greift –
und wo du es abschalten kannst. und wo du es abschalten kannst.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- Die KI ist die einzige Automation mit Schalter: Sie kostet <!-- Die KI ist die einzige Automation mit Schalter: Sie kostet
Rechenzeit, die der Website gehört. --> Rechenzeit, die der Website gehört. -->
<section class="ki-kasten" id="ki-kasten"> <section class="ki-kasten" id="ki-kasten">
<div class="ki-kasten__kopf"> <div class="ki-kasten__kopf">
<div> <div>
<p class="marke">Lokale KI</p> <p class="marke">Lokale KI</p>
<h2 class="ki-kasten__titel">Vorschläge in Calls, Start-Check und Report</h2> <h2 class="ki-kasten__titel">Vorschläge in Calls, Start-Check und Report</h2>
<p class="ki-kasten__text" id="ki-text">Zustand wird geprüft …</p> <p class="ki-kasten__text" id="ki-text">Zustand wird geprüft …</p>
</div> </div>
<label class="schalter" id="ki-schalter-block" hidden> <label class="schalter" id="ki-schalter-block" hidden>
<input type="checkbox" id="ki-schalter" /> <input type="checkbox" id="ki-schalter" />
<span class="schalter__gleis"><span class="schalter__punkt"></span></span> <span class="schalter__gleis"><span class="schalter__punkt"></span></span>
<span class="schalter__text"><strong id="ki-schalter-text">Angeschaltet</strong></span> <span class="schalter__text"><strong id="ki-schalter-text">Angeschaltet</strong></span>
</label> </label>
</div> </div>
<ul class="ki-kasten__daten" id="ki-daten"></ul> <ul class="ki-kasten__daten" id="ki-daten"></ul>
</section> </section>
<!-- Was gerade tatsächlich anliegt: dieselbe Quelle wie auf dem <!-- Was gerade tatsächlich anliegt: dieselbe Quelle wie auf dem
Dashboard, hier aber vollständig statt gekürzt. --> Dashboard, hier aber vollständig statt gekürzt. -->
<section class="block"> <section class="block">
<div class="block__kopf"> <div class="block__kopf">
<h2 class="block__titel">Was gerade anliegt</h2> <h2 class="block__titel">Was gerade anliegt</h2>
<span class="block__zahl" id="hinweis-zahl">–</span> <span class="block__zahl" id="hinweis-zahl">–</span>
</div> </div>
<p class="block__frage"> <p class="block__frage">
Dieselben Hinweise wie auf der Übersicht, hier vollständig. Sie führen keine Dieselben Hinweise wie auf der Übersicht, hier vollständig. Sie führen keine
eigene Liste – jeder verschwindet, sobald die Sache erledigt ist. eigene Liste – jeder verschwindet, sobald die Sache erledigt ist.
</p> </p>
<div id="hinweise"><p class="leise">Wird geprüft …</p></div> <div id="hinweise"><p class="leise">Wird geprüft …</p></div>
</section> </section>
<!-- Sicherung und Zustand. Steht bewusst weit oben: Es ist die einzige <!-- Sicherung und Zustand. Steht bewusst weit oben: Es ist die einzige
Automation, deren Ausfall alles auf einmal kosten würde. --> Automation, deren Ausfall alles auf einmal kosten würde. -->
<section class="zustand" id="zustand-kasten"> <section class="zustand" id="zustand-kasten">
<div class="zustand__kopf"> <div class="zustand__kopf">
<div> <div>
<p class="marke">Sicherung &amp; Zustand</p> <p class="marke">Sicherung &amp; Zustand</p>
<h2 class="zustand__titel" id="zustand-titel">Wird geprüft …</h2> <h2 class="zustand__titel" id="zustand-titel">Wird geprüft …</h2>
<p class="zustand__text" id="zustand-text"></p> <p class="zustand__text" id="zustand-text"></p>
</div> </div>
<button type="button" class="knopf knopf--klein" id="jetzt-sichern">Jetzt sichern</button> <button type="button" class="knopf knopf--klein" id="jetzt-sichern">Jetzt sichern</button>
</div> </div>
<ul class="zustand__daten" id="zustand-daten"></ul> <ul class="zustand__daten" id="zustand-daten"></ul>
<div class="klapp-kopf zustand__listenkopf"> <div class="klapp-kopf zustand__listenkopf">
<p class="feldschild">Vorhandene Sicherungen</p> <p class="feldschild">Vorhandene Sicherungen</p>
<button type="button" class="knopf-still" id="sicherungen-schalter" <button type="button" class="knopf-still" id="sicherungen-schalter"
aria-expanded="false" aria-controls="sicherungen" hidden> aria-expanded="false" aria-controls="sicherungen" hidden>
<span id="sicherungen-schalter-text">Alle zeigen</span> <span id="sicherungen-schalter-text">Alle zeigen</span>
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 9.5 6 6 6-6" /> <path d="m6 9.5 6 6 6-6" />
</svg> </svg>
</button> </button>
</div> </div>
<div id="sicherungen" data-klapp="zu"></div> <div id="sicherungen" data-klapp="zu"></div>
</section> </section>
<section class="block"> <section class="block">
<div class="block__kopf"> <div class="block__kopf">
<h2 class="block__titel">Läuft dauerhaft im Hintergrund</h2> <h2 class="block__titel">Läuft dauerhaft im Hintergrund</h2>
</div> </div>
<div class="regeln" id="regeln"></div> <div class="regeln" id="regeln"></div>
</section> </section>
<!-- ==== DAS LÖSCHKONZEPT (15.09.2026) ========================= <!-- ==== DAS LÖSCHKONZEPT (15.09.2026) =========================
Stufe 8 aus dem Plan. Es steht auf DIESER Seite, weil hier Stufe 8 aus dem Plan. Es steht auf DIESER Seite, weil hier
alles steht, was ohne Zutun läuft – und weil es genau das ist: alles steht, was ohne Zutun läuft – und weil es genau das ist:
eine Automatik, die täglich Daten entfernt. eine Automatik, die täglich Daten entfernt.
Sichtbar zu sein ist die halbe Sache. Ein Löschkonzept, von dem Sichtbar zu sein ist die halbe Sache. Ein Löschkonzept, von dem
niemand weiß, ob es greift, ist ein Dokument; eines mit Zahlen niemand weiß, ob es greift, ist ein Dokument; eines mit Zahlen
daneben ist eine Zusicherung. Deshalb steht bei jeder Zeile, daneben ist eine Zusicherung. Deshalb steht bei jeder Zeile,
wie viele Datensätze sie gerade betrifft. --> wie viele Datensätze sie gerade betrifft. -->
<section class="block"> <section class="block">
<div class="block__kopf"> <div class="block__kopf">
<h2 class="block__titel">Was gelöscht wird – und was bleibt</h2> <h2 class="block__titel">Was gelöscht wird – und was bleibt</h2>
<button type="button" class="knopf-still" id="aufb-jetzt">Jetzt aufräumen</button> <button type="button" class="knopf-still" id="aufb-jetzt">Jetzt aufräumen</button>
</div> </div>
<p class="block__frage"> <p class="block__frage">
Personenbezogene Daten werden nicht aufgehoben, weil Platz da ist, sondern Personenbezogene Daten werden nicht aufgehoben, weil Platz da ist, sondern
solange es einen Grund gibt. Läuft täglich von selbst. solange es einen Grund gibt. Läuft täglich von selbst.
</p> </p>
<div id="aufbewahrung"><p class="leise">Wird geladen …</p></div> <div id="aufbewahrung"><p class="leise">Wird geladen …</p></div>
</section> </section>
<section class="block"> <section class="block">
<!-- Wie im Personen-Bereich: zugeklappt stehen nur die vier <!-- Wie im Personen-Bereich: zugeklappt stehen nur die vier
neuesten Zeilen da, alles Weitere auf Knopfdruck. --> neuesten Zeilen da, alles Weitere auf Knopfdruck. -->
<div class="block__kopf klapp-kopf"> <div class="block__kopf klapp-kopf">
<h2 class="block__titel">Zuletzt automatisch passiert</h2> <h2 class="block__titel">Zuletzt automatisch passiert</h2>
<button type="button" class="knopf-still" id="verlauf-schalter" <button type="button" class="knopf-still" id="verlauf-schalter"
aria-expanded="false" aria-controls="verlauf" hidden> aria-expanded="false" aria-controls="verlauf" hidden>
<span id="verlauf-schalter-text">Alle zeigen</span> <span id="verlauf-schalter-text">Alle zeigen</span>
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 9.5 6 6 6-6" /> <path d="m6 9.5 6 6 6-6" />
</svg> </svg>
</button> </button>
</div> </div>
<p class="block__frage">Aus dem Protokoll – damit nachvollziehbar bleibt, was ohne Zutun geschah.</p> <p class="block__frage">Aus dem Protokoll – damit nachvollziehbar bleibt, was ohne Zutun geschah.</p>
<div id="verlauf"><p class="leise">Wird geladen …</p></div> <div id="verlauf"><p class="leise">Wird geladen …</p></div>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/automation.js?v=202609191915" defer></script> <script src="assets/js/automation.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+140 -140
View File
@@ -1,140 +1,140 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Wie geht's dir? · Spicy &amp; Dogi</title> <title>Wie geht's dir? · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Wie geht's dir?</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Wie geht's dir?</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt"> <main class="inhalt">
<!-- ================================================================== <!-- ==================================================================
DIESE SEITE GEHÖRT DEM MENSCHEN, DER SIE ÖFFNET. DIESE SEITE GEHÖRT DEM MENSCHEN, DER SIE ÖFFNET.
Hier steht kein anderer Name, keine Beobachtung über jemanden und Hier steht kein anderer Name, keine Beobachtung über jemanden und
keine Zahl, die jemand anders sieht. Genau das war der Grund für keine Zahl, die jemand anders sieht. Genau das war der Grund für
die eigene Seite: Die Kachel verspricht „die Antworten sieht nur die eigene Seite: Die Kachel verspricht „die Antworten sieht nur
du" – und führte vorher auf eine Seite voller anderer Leute. du" – und führte vorher auf eine Seite voller anderer Leute.
Was DogFather sieht, ist eine einzige Zahl ohne Namen: wie viele Was DogFather sieht, ist eine einzige Zahl ohne Namen: wie viele
im Team es gerade schwer haben. Nicht wer, nicht womit. im Team es gerade schwer haben. Nicht wer, nicht womit.
============================================================== --> ============================================================== -->
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Für dich</p> <p class="marke">Für dich</p>
<h1 class="titel">Wie geht's dir?</h1> <h1 class="titel">Wie geht's dir?</h1>
<!-- ================================================================ <!-- ================================================================
DIE EINE AUSNAHME GEHÖRT DAZU (ergänzt 19.09.2026). DIE EINE AUSNAHME GEHÖRT DAZU (ergänzt 19.09.2026).
Hier stand: „Niemand aus dem Team sieht deine Antworten – auch Hier stand: „Niemand aus dem Team sieht deine Antworten – auch
DogFather nicht." Punkt. Das ist fast wahr und deshalb DogFather nicht." Punkt. Das ist fast wahr und deshalb
gefährlich: Aus denselben Antworten entsteht eine Ampel für die gefährlich: Aus denselben Antworten entsteht eine Ampel für die
Leitung (workspace-entwicklung.js). Sie ist sauber gebaut – sie Leitung (workspace-entwicklung.js). Sie ist sauber gebaut – sie
nennt keine Namen, keinen Punkt, kein Datum, und unter drei nennt keine Namen, keinen Punkt, kein Datum, und unter drei
Personen schweigt sie ganz. Aber sie existiert. Personen schweigt sie ganz. Aber sie existiert.
Der ehrliche Satz war längst geschrieben und wurde vom Server Der ehrliche Satz war längst geschrieben und wurde vom Server
sogar mitgeliefert (`block.text`) – nur hat ihn nie jemand sogar mitgeliefert (`block.text`) – nur hat ihn nie jemand
angezeigt. Er steht jetzt hier im HTML und nicht im Skript: angezeigt. Er steht jetzt hier im HTML und nicht im Skript:
Wer diese Seite öffnet, soll ihn lesen, BEVOR er tippt, nicht Wer diese Seite öffnet, soll ihn lesen, BEVOR er tippt, nicht
nachdem ein Abruf zurückgekommen ist. nachdem ein Abruf zurückgekommen ist.
Wenn jemand später davon erfährt und die Seite hatte „niemand" Wenn jemand später davon erfährt und die Seite hatte „niemand"
gesagt, ist das Vertrauen weg – und mit ihm die ganze Funktion. gesagt, ist das Vertrauen weg – und mit ihm die ganze Funktion.
============================================================= --> ============================================================= -->
<p class="unterzeile"> <p class="unterzeile">
Ein paar Fragen über dich. Deine Antworten liest niemand – auch Ein paar Fragen über dich. Deine Antworten liest niemand – auch
DogFather nicht. DogFather nicht.
</p> </p>
<p class="unterzeile unterzeile--zusatz"> <p class="unterzeile unterzeile--zusatz">
Das Einzige, was nach außen dringt: ob es im Team gerade Das Einzige, was nach außen dringt: ob es im Team gerade
<em>jemandem</em> zu viel ist. Ohne Namen, ohne Frage, ohne Datum – <em>jemandem</em> zu viel ist. Ohne Namen, ohne Frage, ohne Datum –
und erst ab drei Personen im Team, weil es darunter dasselbe wäre und erst ab drei Personen im Team, weil es darunter dasselbe wäre
wie ein Name. wie ein Name.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- Der Rhythmus. Steht VOR den Fragen: Wer hereinkommt, soll zuerst <!-- Der Rhythmus. Steht VOR den Fragen: Wer hereinkommt, soll zuerst
wissen, ob gerade etwas von ihm erwartet wird. --> wissen, ob gerade etwas von ihm erwartet wird. -->
<section class="b-takt" id="takt" hidden> <section class="b-takt" id="takt" hidden>
<p class="b-takt__satz" id="takt-satz">…</p> <p class="b-takt__satz" id="takt-satz">…</p>
<button type="button" class="knopf knopf--klein" id="takt-knopf" hidden>Runde abschließen</button> <button type="button" class="knopf knopf--klein" id="takt-knopf" hidden>Runde abschließen</button>
</section> </section>
<section id="fragen-block"> <section id="fragen-block">
<div id="fragen" aria-busy="true"><p class="leise">wird geladen …</p></div> <div id="fragen" aria-busy="true"><p class="leise">wird geladen …</p></div>
</section> </section>
<!-- Der Verlauf. Nur für die Person selbst – er wird nirgends sonst <!-- Der Verlauf. Nur für die Person selbst – er wird nirgends sonst
im Haus gelesen. Er steht unter den Fragen, weil er sie erklärt im Haus gelesen. Er steht unter den Fragen, weil er sie erklärt
und nicht ersetzt. --> und nicht ersetzt. -->
<section class="b-verlauf" id="verlauf-block" hidden> <section class="b-verlauf" id="verlauf-block" hidden>
<h2 class="e-abschnitt">Wie es sich entwickelt</h2> <h2 class="e-abschnitt">Wie es sich entwickelt</h2>
<p class="b-verlauf__satz" id="verlauf-satz">…</p> <p class="b-verlauf__satz" id="verlauf-satz">…</p>
<div id="verlauf" class="b-verlauf__gitter"></div> <div id="verlauf" class="b-verlauf__gitter"></div>
</section> </section>
<!-- ================================================================== <!-- ==================================================================
WAS DEIN VERLAUF SAGT (15.09.2026) WAS DEIN VERLAUF SAGT (15.09.2026)
Filipe: „mach mir auch eine analyse […] eine professionelle auch Filipe: „mach mir auch eine analyse […] eine professionelle auch
mit infos und so aus aller welt was tiktok angeht." mit infos und so aus aller welt was tiktok angeht."
Sie steht UNTER dem Verlauf: erst die Antworten, dann das Muster Sie steht UNTER dem Verlauf: erst die Antworten, dann das Muster
darin. Andersherum läse man die Deutung, bevor man weiß, worauf darin. Andersherum läse man die Deutung, bevor man weiß, worauf
sie sich bezieht. sie sich bezieht.
Sie wird gerechnet, nicht gespeichert – und sie bewertet nicht. Sie wird gerechnet, nicht gespeichert – und sie bewertet nicht.
Keine Punktzahl über das eigene Befinden: Eine Zahl lädt dazu Keine Punktzahl über das eigene Befinden: Eine Zahl lädt dazu
ein, sie zu verbessern statt ehrlich zu antworten. ein, sie zu verbessern statt ehrlich zu antworten.
============================================================== --> ============================================================== -->
<section class="b-analyse" id="analyse-block" hidden> <section class="b-analyse" id="analyse-block" hidden>
<h2 class="e-abschnitt">Was dein Verlauf sagt</h2> <h2 class="e-abschnitt">Was dein Verlauf sagt</h2>
<p class="b-analyse__satz" id="analyse-satz">…</p> <p class="b-analyse__satz" id="analyse-satz">…</p>
<div id="analyse" class="b-analyse__liste"></div> <div id="analyse" class="b-analyse__liste"></div>
<p class="b-analyse__quelle" id="analyse-quelle"></p> <p class="b-analyse__quelle" id="analyse-quelle"></p>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/befinden.js?v=202609191915" defer></script> <script src="assets/js/befinden.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+20 -19
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -251,16 +251,17 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/checkliste.js?v=202609191915" defer></script> <script src="assets/js/checkliste.js?v=202609191956" defer></script>
<script src="assets/js/ampel.js?v=202609191915" defer></script> <script src="assets/js/ampel.js?v=202609191956" defer></script>
<script src="assets/js/schulung.js?v=202609191915" defer></script> <script src="assets/js/schulung.js?v=202609191956" defer></script>
<script src="assets/js/vorlagen.js?v=202609191915" defer></script> <script src="assets/js/vorlagen.js?v=202609191956" defer></script>
<script src="assets/js/bereich.js?v=202609191915" defer></script> <script src="assets/js/bereich.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+118 -118
View File
@@ -1,118 +1,118 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Anfrage · Der Treff</title> <title>Anfrage · Der Treff</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · <span id="marke-was">Anfrage</span></span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · <span id="marke-was">Anfrage</span></span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt"> <main class="inhalt">
<!-- ================================================================== <!-- ==================================================================
DIE ANFRAGE AUS DER COMMUNITY (17.09.2026) DIE ANFRAGE AUS DER COMMUNITY (17.09.2026)
Filipe: „ich will dass die leute sich da anonym bei mir melden Filipe: „ich will dass die leute sich da anonym bei mir melden
können und eine anfrage machen können. ich will dass es können und eine anfrage machen können. ich will dass es
aber profissionel gemacht ist bitte wie ein fragebogen." aber profissionel gemacht ist bitte wie ein fragebogen."
VERTRAULICH, NICHT NAMENLOS - seine Entscheidung. Es gibt keine VERTRAULICH, NICHT NAMENLOS - seine Entscheidung. Es gibt keine
Selbstanmeldung im Treff; jeder Zugang kommt von DogFather selbst. Selbstanmeldung im Treff; jeder Zugang kommt von DogFather selbst.
Eine wirklich namenlose Anfrage wäre also nicht anonymer, sondern Eine wirklich namenlose Anfrage wäre also nicht anonymer, sondern
nur schlechter: Man könnte niemandem antworten, und aus einer nur schlechter: Man könnte niemandem antworten, und aus einer
Anfrage würde nie ein Gespräch. Anfrage würde nie ein Gespräch.
„Anonym" heißt hier deshalb: NIEMAND AUS DER COMMUNITY SIEHT SIE. „Anonym" heißt hier deshalb: NIEMAND AUS DER COMMUNITY SIEHT SIE.
Nicht die anderen Mitglieder, nicht die Modis - nur DogFather und Nicht die anderen Mitglieder, nicht die Modis - nur DogFather und
die rechte Hand. Und das steht auf dieser Seite, bevor jemand die rechte Hand. Und das steht auf dieser Seite, bevor jemand
anfängt zu tippen, statt im Kleingedruckten darunter. anfängt zu tippen, statt im Kleingedruckten darunter.
============================================================== --> ============================================================== -->
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Mitmachen</p> <p class="marke">Mitmachen</p>
<!-- DER NAME DER ROLLE STEHT NICHT IN DIESER DATEI. <!-- DER NAME DER ROLLE STEHT NICHT IN DIESER DATEI.
Sie ist ohne Anmeldung aus dem offenen Netz lesbar (gemessen Sie ist ohne Anmeldung aus dem offenen Netz lesbar (gemessen
am 17.09.2026: jede Datei unter /workspace/ antwortet mit am 17.09.2026: jede Datei unter /workspace/ antwortet mit
200). Der Server schickt das Wort in seiner Antwort mit -- 200). Der Server schickt das Wort in seiner Antwort mit --
dieselbe Regel wie bei den Treff-Regeln und im Chat. dieselbe Regel wie bei den Treff-Regeln und im Chat.
Was hier steht, ist die ehrliche Ueberschrift, falls die Was hier steht, ist die ehrliche Ueberschrift, falls die
Antwort ausbleibt: eine Anfrage ist es so oder so. --> Antwort ausbleibt: eine Anfrage ist es so oder so. -->
<h1 class="titel" id="titel">Anfrage stellen</h1> <h1 class="titel" id="titel">Anfrage stellen</h1>
<p class="unterzeile"> <p class="unterzeile">
Ein paar Fragen - ehrlich beantwortet ist mehr wert als Ein paar Fragen - ehrlich beantwortet ist mehr wert als
vollständig. Du kannst zwischendurch aufhören und später vollständig. Du kannst zwischendurch aufhören und später
weitermachen: Deine Antworten bleiben so lange in diesem weitermachen: Deine Antworten bleiben so lange in diesem
Browser. Zu uns kommen sie erst, wenn du abschickst. Browser. Zu uns kommen sie erst, wenn du abschickst.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<p class="leise" id="ladezeile">einen Moment …</p> <p class="leise" id="ladezeile">einen Moment …</p>
<!-- Der Stand, wenn schon eine Anfrage vorliegt (oder eine Sperrfrist <!-- Der Stand, wenn schon eine Anfrage vorliegt (oder eine Sperrfrist
läuft). Steht ganz oben: Wer hier landet und schon geschickt hat, läuft). Steht ganz oben: Wer hier landet und schon geschickt hat,
will als Erstes wissen, was daraus wurde - nicht das Formular will als Erstes wissen, was daraus wurde - nicht das Formular
noch einmal sehen. --> noch einmal sehen. -->
<section class="bw-stand" id="stand" hidden></section> <section class="bw-stand" id="stand" hidden></section>
<form class="bw-bogen" id="bogen" hidden novalidate> <form class="bw-bogen" id="bogen" hidden novalidate>
<div id="gruppen"></div> <div id="gruppen"></div>
<!-- WER DAS LIEST, steht direkt über dem Absenden-Knopf und nicht <!-- WER DAS LIEST, steht direkt über dem Absenden-Knopf und nicht
nur oben auf der Seite. Wer hier unten ankommt, hat oben zehn nur oben auf der Seite. Wer hier unten ankommt, hat oben zehn
Minuten hinter sich. --> Minuten hinter sich. -->
<p class="bw-wer-liest" id="wer-liest"></p> <p class="bw-wer-liest" id="wer-liest"></p>
<div class="bw-abschluss"> <div class="bw-abschluss">
<button type="submit" class="knopf" id="abschicken">Anfrage abschicken</button> <button type="submit" class="knopf" id="abschicken">Anfrage abschicken</button>
<a class="schritt" href="bereich.html?b=mitmachen">Doch nicht</a> <a class="schritt" href="bereich.html?b=mitmachen">Doch nicht</a>
</div> </div>
</form> </form>
</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=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/auskunft.js?v=202609191915" defer></script> <script src="assets/js/auskunft.js?v=202609191956" defer></script>
<script src="assets/js/bewerben.js?v=202609191915" defer></script> <script src="assets/js/bewerben.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+91 -91
View File
@@ -1,91 +1,91 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Anfragen · Nachwuchs</title> <title>Anfragen · Nachwuchs</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="talente.html">Talente</a> · Anfragen</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="talente.html">Talente</a> · Anfragen</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<!-- ================================================================== <!-- ==================================================================
DER EINGANG FÜR DIE ANFRAGEN AUS DER COMMUNITY (17.09.2026) DER EINGANG FÜR DIE ANFRAGEN AUS DER COMMUNITY (17.09.2026)
Filipe: „und dan soll ich annehmen ablehnen, in warteschlange Filipe: „und dan soll ich annehmen ablehnen, in warteschlange
stellen oder sofort kommunizieren können. und wenn ich annehme dan stellen oder sofort kommunizieren können. und wenn ich annehme dan
soll diese person automatisch zu talente kategorie weiter geleitet soll diese person automatisch zu talente kategorie weiter geleitet
werden." werden."
HIER STEHEN SÄTZE, DIE JEMAND ÜBER SICH SELBST GESCHRIEBEN HAT, HIER STEHEN SÄTZE, DIE JEMAND ÜBER SICH SELBST GESCHRIEBEN HAT,
im Vertrauen darauf, dass nur zwei Menschen sie lesen. Diese Seite im Vertrauen darauf, dass nur zwei Menschen sie lesen. Diese Seite
gehört DogFather und der rechten Hand -- durchgesetzt in der gehört DogFather und der rechten Hand -- durchgesetzt in der
Rechtetafel UND in workspace-bewerbung.js. Rechtetafel UND in workspace-bewerbung.js.
Deshalb steht im Protokoll auch kein Inhalt, sondern nur die Deshalb steht im Protokoll auch kein Inhalt, sondern nur die
Nummer: Das Protokoll lesen mehr Leute als die Anfrage. Nummer: Das Protokoll lesen mehr Leute als die Anfrage.
============================================================== --> ============================================================== -->
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Entwicklung &amp; Nachwuchs</p> <p class="marke">Entwicklung &amp; Nachwuchs</p>
<h1 class="titel">Anfragen</h1> <h1 class="titel">Anfragen</h1>
<p class="unterzeile"> <p class="unterzeile">
Wer sich selbst gemeldet hat. Nimmst du an, entsteht daraus ein Wer sich selbst gemeldet hat. Nimmst du an, entsteht daraus ein
Eintrag bei den Talenten – auf der Stufe „Angesprochen“, denn wer Eintrag bei den Talenten – auf der Stufe „Angesprochen“, denn wer
sich meldet, hat die erste Frage schon beantwortet. sich meldet, hat die erste Frage schon beantwortet.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- Die Zahlen. Nicht Schmuck, sondern die Arbeitsanweisung dieser <!-- Die Zahlen. Nicht Schmuck, sondern die Arbeitsanweisung dieser
Seite: Was neu ist, steht links und wird zuerst gelesen. --> Seite: Was neu ist, steht links und wird zuerst gelesen. -->
<section class="bw-zahlen" id="zahlen" hidden></section> <section class="bw-zahlen" id="zahlen" hidden></section>
<p class="leise" id="ladezeile">einen Moment …</p> <p class="leise" id="ladezeile">einen Moment …</p>
<div id="liste"></div> <div id="liste"></div>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/auskunft.js?v=202609191915" defer></script> <script src="assets/js/auskunft.js?v=202609191956" defer></script>
<script src="assets/js/bewerbungen.js?v=202609191915" defer></script> <script src="assets/js/bewerbungen.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+16 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/calls.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -89,13 +89,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/ki.js?v=202609191915" defer></script> <script src="assets/js/ki.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/calls.js?v=202609191915" defer></script> <script src="assets/js/calls.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+16 -15
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/chat.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -367,16 +367,17 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/bereiche.js?v=202609191915"></script> <script src="assets/js/bereiche.js?v=202609191956"></script>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915"></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915"></script> <script src="assets/js/kopf.js?v=202609191956"></script>
<script src="assets/js/glocke.js?v=202609191956"></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=202609191915"></script> <script src="assets/js/anruf.js?v=202609191956"></script>
<script src="assets/js/chat.js?v=202609191915"></script> <script src="assets/js/chat.js?v=202609191956"></script>
</body> </body>
</html> </html>
+17 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/content.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/content.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -179,14 +179,15 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/checkliste.js?v=202609191915" defer></script> <script src="assets/js/checkliste.js?v=202609191956" defer></script>
<script src="assets/js/vorlagen.js?v=202609191915" defer></script> <script src="assets/js/vorlagen.js?v=202609191956" defer></script>
<script src="assets/js/content.js?v=202609191915" defer></script> <script src="assets/js/content.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+355 -355
View File
@@ -1,355 +1,355 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Anmeldung · DogFather Universe</title> <title>Anmeldung · DogFather Universe</title>
<!-- WEDER "Arbeitsbereich" NOCH "die Modis" (11.09.2026). <!-- WEDER "Arbeitsbereich" NOCH "die Modis" (11.09.2026).
Seit die Community durch diese Wand kommt, liest sie auch diesen Seit die Community durch diese Wand kommt, liest sie auch diesen
Satz. "Privater Arbeitsbereich fuer DogFather und die Modis" waere Satz. "Privater Arbeitsbereich fuer DogFather und die Modis" waere
fuer sie schlicht falsch -- und das Erste, was sie ueber das Haus fuer sie schlicht falsch -- und das Erste, was sie ueber das Haus
erfaehrt. --> erfaehrt. -->
<meta name="description" content="Privater Bereich rund um DogFather. Zugang nur mit persönlichem Code." /> <meta name="description" content="Privater Bereich rund um DogFather. Zugang nur mit persönlichem Code." />
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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" />
<!-- Die Bühne ist der erste Eindruck. Ohne diesen Hinweis lädt der Browser sie erst, <!-- Die Bühne ist der erste Eindruck. Ohne diesen Hinweis lädt der Browser sie erst,
nachdem er das CSS gelesen hat - das kostet spürbar Zeit. Quer- und Hochformat nachdem er das CSS gelesen hat - das kostet spürbar Zeit. Quer- und Hochformat
sind getrennt, damit das Handy nicht die große Fassung zieht. sind getrennt, damit das Handy nicht die große Fassung zieht.
Hier steht bewusst WebP und nicht AVIF, obwohl die AVIF-Fassungen erzeugt Hier steht bewusst WebP und nicht AVIF, obwohl die AVIF-Fassungen erzeugt
werden und rund ein Drittel kleiner wären: Der ausliefernde Server läuft auf werden und rund ein Drittel kleiner wären: Der ausliefernde Server läuft auf
Express 4, dessen `send` eine alte MIME-Tabelle ohne AVIF mitbringt. Die Express 4, dessen `send` eine alte MIME-Tabelle ohne AVIF mitbringt. Die
Dateien kämen als application/octet-stream an und würden wegen des Dateien kämen als application/octet-stream an und würden wegen des
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
werden (die Dateien liegen bereit). --> werden (die Dateien liegen bereit). -->
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-1920.webp" <link rel="preload" as="image" href="assets/img/buehne/crew-gate-1920.webp"
type="image/webp" media="(min-width: 900px)" /> type="image/webp" media="(min-width: 900px)" />
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191956" />
</head> </head>
<body class="gate gate--crew"> <body class="gate gate--crew">
<!-- ==================================================================== <!-- ====================================================================
DIE DREI ZEICHEN DIESER WAND (10.09.2026) DIE DREI ZEICHEN DIESER WAND (10.09.2026)
Filipe: "3 rollen. dogfather. rechte hand und modis." Filipe: "3 rollen. dogfather. rechte hand und modis."
Von den fuenf Zeichen der anderen Wand bleibt nur der Husky -- die Von den fuenf Zeichen der anderen Wand bleibt nur der Husky -- die
uebrigen gehoeren zu Rollen, die es hier nicht gibt, und ihre uebrigen gehoeren zu Rollen, die es hier nicht gibt, und ihre
Namen haetten im Quelltext nichts verloren. Namen haetten im Quelltext nichts verloren.
DER HUSKY BEI DOGFATHER UND BEI DER RECHTEN HAND, die Pfote bei DER HUSKY BEI DOGFATHER UND BEI DER RECHTEN HAND, die Pfote bei
den Modis (Filipe, 10.09.2026, mit Bildschirmfoto: "bei rechte den Modis (Filipe, 10.09.2026, mit Bildschirmfoto: "bei rechte
hand soll der husky sein und bei modis soll die pfote sein"). hand soll der husky sein und bei modis soll die pfote sein").
DAS DREHT EINE FRUEHERE VORGABE UM, und der Grund gehoert dazu: Am DAS DREHT EINE FRUEHERE VORGABE UM, und der Grund gehoert dazu: Am
09.09. hiess es "das modi symbol soll das gleiche sein wie bei 09.09. hiess es "das modi symbol soll das gleiche sein wie bei
dogfather" -- damals gab es hier zwei Rollen, und der Satz dogfather" -- damals gab es hier zwei Rollen, und der Satz
bedeutete "die Modis gehoeren zu Dogi, nicht zur Agentur". Mit bedeutete "die Modis gehoeren zu Dogi, nicht zur Agentur". Mit
drei Rollen sagt dieselbe Absicht etwas anderes: Der Husky steht drei Rollen sagt dieselbe Absicht etwas anderes: Der Husky steht
bei den beiden, die den Ueberblick haben, die Pfote bei denen, die bei den beiden, die den Ueberblick haben, die Pfote bei denen, die
taeglich unterwegs sind. Zwei gleiche Zeichen und ein anderes -- taeglich unterwegs sind. Zwei gleiche Zeichen und ein anderes --
das liest sich als Gruppe, nicht als Reihe. das liest sich als Gruppe, nicht als Reihe.
Die Pfote traegt bei 22 px, weil es fuenf klar getrennte Flaechen Die Pfote traegt bei 22 px, weil es fuenf klar getrennte Flaechen
sind und keine Innenzeichnung -- dasselbe Argument, mit dem auf der sind und keine Innenzeichnung -- dasselbe Argument, mit dem auf der
anderen Wand eine Silhouette einem geschliffenen Koerper gewichen anderen Wand eine Silhouette einem geschliffenen Koerper gewichen
ist. ist.
================================================================= --> ================================================================= -->
<svg width="0" height="0" style="position:absolute;overflow:hidden" aria-hidden="true"><defs> <svg width="0" height="0" style="position:absolute;overflow:hidden" aria-hidden="true"><defs>
<!-- Der Husky ist ein FOTO, kein Pfad. Der Filter zieht ihn auf zwei <!-- Der Husky ist ein FOTO, kein Pfad. Der Filter zieht ihn auf zwei
Toene zusammen (dunkles Blaugrau -> Silber), damit er neben Toene zusammen (dunkles Blaugrau -> Silber), damit er neben
gezeichneten Zeichen nicht wie ein Fremdkoerper wirkt. --> gezeichneten Zeichen nicht wie ein Fremdkoerper wirkt. -->
<filter id="rs-husky-duo" color-interpolation-filters="sRGB"> <filter id="rs-husky-duo" color-interpolation-filters="sRGB">
<feComponentTransfer> <feComponentTransfer>
<feFuncR type="table" tableValues="0.165 0.910"/> <feFuncR type="table" tableValues="0.165 0.910"/>
<feFuncG type="table" tableValues="0.212 0.933"/> <feFuncG type="table" tableValues="0.212 0.933"/>
<feFuncB type="table" tableValues="0.267 0.965"/> <feFuncB type="table" tableValues="0.267 0.965"/>
</feComponentTransfer> </feComponentTransfer>
</filter> </filter>
<g id="r-husky"> <g id="r-husky">
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24" <image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/> preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
<circle fill="#7ec8f2" cx="7.73" cy="12.1" r="1.05"/> <circle fill="#7ec8f2" cx="7.73" cy="12.1" r="1.05"/>
<circle fill="#16232f" cx="7.73" cy="12.1" r="0.52"/> <circle fill="#16232f" cx="7.73" cy="12.1" r="0.52"/>
<circle fill="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/> <circle fill="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
</g> </g>
<!-- Der Ton der Pfote ist der Modi-Ton (#5f8a9f) nach oben <!-- Der Ton der Pfote ist der Modi-Ton (#5f8a9f) nach oben
aufgehellt: dasselbe Blau wie das App-Symbol, nur heller, damit aufgehellt: dasselbe Blau wie das App-Symbol, nur heller, damit
es bei 22 px gegen den dunklen Grund steht. --> es bei 22 px gegen den dunklen Grund steht. -->
<linearGradient id="rs-pfote" x1="0" y1="0" x2=".35" y2="1"> <linearGradient id="rs-pfote" x1="0" y1="0" x2=".35" y2="1">
<stop offset="0" stop-color="#cfe4ef"/> <stop offset="0" stop-color="#cfe4ef"/>
<stop offset=".55" stop-color="#8fb6c8"/> <stop offset=".55" stop-color="#8fb6c8"/>
<stop offset="1" stop-color="#5f8a9f"/> <stop offset="1" stop-color="#5f8a9f"/>
</linearGradient> </linearGradient>
<g id="r-pfote"> <g id="r-pfote">
<ellipse fill="url(#rs-pfote)" cx="12" cy="15.9" rx="5.3" ry="4.4"/> <ellipse fill="url(#rs-pfote)" cx="12" cy="15.9" rx="5.3" ry="4.4"/>
<ellipse fill="url(#rs-pfote)" cx="6.5" cy="10.1" rx="2" ry="2.6" <ellipse fill="url(#rs-pfote)" cx="6.5" cy="10.1" rx="2" ry="2.6"
transform="rotate(-20 6.5 10.1)"/> transform="rotate(-20 6.5 10.1)"/>
<ellipse fill="url(#rs-pfote)" cx="10.1" cy="7.4" rx="2.05" ry="2.7"/> <ellipse fill="url(#rs-pfote)" cx="10.1" cy="7.4" rx="2.05" ry="2.7"/>
<ellipse fill="url(#rs-pfote)" cx="13.9" cy="7.4" rx="2.05" ry="2.7"/> <ellipse fill="url(#rs-pfote)" cx="13.9" cy="7.4" rx="2.05" ry="2.7"/>
<ellipse fill="url(#rs-pfote)" cx="17.5" cy="10.1" rx="2" ry="2.6" <ellipse fill="url(#rs-pfote)" cx="17.5" cy="10.1" rx="2" ry="2.6"
transform="rotate(20 17.5 10.1)"/> transform="rotate(20 17.5 10.1)"/>
<!-- Ein Lichtstreifen oben links auf dem Ballen -- ohne ihn ist er <!-- Ein Lichtstreifen oben links auf dem Ballen -- ohne ihn ist er
eine flache Flaeche. --> eine flache Flaeche. -->
<path fill="rgba(255,255,255,.32)" <path fill="rgba(255,255,255,.32)"
d="M8.4 13.6c1-1.3 2.6-2 4.2-1.9-1.7.5-3 1.6-3.6 2.9z"/> d="M8.4 13.6c1-1.3 2.6-2 4.2-1.9-1.7.5-3 1.6-3.6 2.9z"/>
</g> </g>
<!-- DIE COMMUNITY (11.09.2026). <!-- DIE COMMUNITY (11.09.2026).
Zwei Figuren, keine einzelne. Das Zeichen EINER Person ist im Zwei Figuren, keine einzelne. Das Zeichen EINER Person ist im
Haus schon vergeben; zwei Rollen mit demselben Zeichen heisst, Haus schon vergeben; zwei Rollen mit demselben Zeichen heisst,
dass das Zeichen nichts mehr sagt. dass das Zeichen nichts mehr sagt.
(Und ja: Hier stand zuerst der Name jener anderen Rolle. Diese (Und ja: Hier stand zuerst der Name jener anderen Rolle. Diese
Datei wird an jedes Mitglied der Community ausgeliefert, samt Datei wird an jedes Mitglied der Community ausgeliefert, samt
Kommentaren -- eine Rolle der Agentur hat darin nichts verloren. Kommentaren -- eine Rolle der Agentur hat darin nichts verloren.
Gefunden hat das nicht das Auge, sondern pruef-crew-adresse, die Gefunden hat das nicht das Auge, sondern pruef-crew-adresse, die
seit dem 10.09. genau danach sucht. Zum zweiten Mal an einem Tag, seit dem 10.09. genau danach sucht. Zum zweiten Mal an einem Tag,
und zum zweiten Mal in einem Kommentar, der erklaert, warum man und zum zweiten Mal in einem Kommentar, der erklaert, warum man
so etwas nicht schreibt.) so etwas nicht schreibt.)
Die hintere Figur ist leiser gesetzt und teilweise verdeckt -- das Die hintere Figur ist leiser gesetzt und teilweise verdeckt -- das
ist keine Zierde: Bei 22 px verschmelzen zwei gleich helle Formen ist keine Zierde: Bei 22 px verschmelzen zwei gleich helle Formen
zu einem Klecks. Erst der Helligkeitsunterschied macht daraus zwei zu einem Klecks. Erst der Helligkeitsunterschied macht daraus zwei
Menschen. Menschen.
DERSELBE VERLAUF WIE DIE PFOTE, nicht der Husky-Filter: Die Pfote DERSELBE VERLAUF WIE DIE PFOTE, nicht der Husky-Filter: Die Pfote
steht bei denen, die taeglich unterwegs sind, der Husky bei denen steht bei denen, die taeglich unterwegs sind, der Husky bei denen
mit dem Ueberblick. Die Community ist weder das eine noch das mit dem Ueberblick. Die Community ist weder das eine noch das
andere -- sie bekommt die Farbe der Pfote und eine eigene Form. andere -- sie bekommt die Farbe der Pfote und eine eigene Form.
Ein drittes Farbsystem auf einer Wand mit vier Kacheln waere Ein drittes Farbsystem auf einer Wand mit vier Kacheln waere
Unruhe ohne Aussage. --> Unruhe ohne Aussage. -->
<g id="r-leute"> <g id="r-leute">
<circle fill="url(#rs-pfote)" opacity=".55" cx="15.9" cy="8.1" r="2.9"/> <circle fill="url(#rs-pfote)" opacity=".55" cx="15.9" cy="8.1" r="2.9"/>
<path fill="url(#rs-pfote)" opacity=".55" <path fill="url(#rs-pfote)" opacity=".55"
d="M10.6 20.4v-2.2c0-2.6 2.4-4.3 5.3-4.3s5.3 1.7 5.3 4.3v2.2z"/> d="M10.6 20.4v-2.2c0-2.6 2.4-4.3 5.3-4.3s5.3 1.7 5.3 4.3v2.2z"/>
<circle fill="url(#rs-pfote)" cx="9.2" cy="7.4" r="3.4"/> <circle fill="url(#rs-pfote)" cx="9.2" cy="7.4" r="3.4"/>
<path fill="url(#rs-pfote)" <path fill="url(#rs-pfote)"
d="M2.8 20.4v-2.5c0-3 2.9-5 6.4-5s6.4 2 6.4 5v2.5z"/> d="M2.8 20.4v-2.5c0-3 2.9-5 6.4-5s6.4 2 6.4 5v2.5z"/>
<path fill="rgba(255,255,255,.3)" <path fill="rgba(255,255,255,.3)"
d="M6.6 5.6a3.4 3.4 0 0 1 3.6-1.4c-1.4.3-2.5 1.2-3 2.4z"/> d="M6.6 5.6a3.4 3.4 0 0 1 3.6-1.4c-1.4.3-2.5 1.2-3 2.4z"/>
</g> </g>
</defs></svg> </defs></svg>
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- --> <!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
<div class="buehne" aria-hidden="true"> <div class="buehne" aria-hidden="true">
<picture> <picture>
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 -- <!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
auf einem 2550 px breiten Schirm rechnete der Browser das Bild auf einem 2550 px breiten Schirm rechnete der Browser das Bild
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
das sah man als "nicht hochwertig", ohne es benennen zu koennen. das sah man als "nicht hochwertig", ohne es benennen zu koennen.
Eine hoehere Bildguete haette daran nichts geaendert: Man kann Eine hoehere Bildguete haette daran nichts geaendert: Man kann
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden. keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
Ueber srcset laedt trotzdem jeder nur die Stufe, die er Ueber srcset laedt trotzdem jeder nur die Stufe, die er
braucht -- ein Handy weiterhin 32 KB. --> braucht -- ein Handy weiterhin 32 KB. -->
<source media="(min-width: 900px)" type="image/webp" <source media="(min-width: 900px)" type="image/webp"
srcset="assets/img/buehne/crew-gate-960.webp 960w, srcset="assets/img/buehne/crew-gate-960.webp 960w,
assets/img/buehne/crew-gate-1280.webp 1280w, assets/img/buehne/crew-gate-1280.webp 1280w,
assets/img/buehne/crew-gate-1600.webp 1600w, assets/img/buehne/crew-gate-1600.webp 1600w,
assets/img/buehne/crew-gate-1920.webp 1920w, assets/img/buehne/crew-gate-1920.webp 1920w,
assets/img/buehne/crew-gate-2560.webp 2560w" sizes="100vw" /> assets/img/buehne/crew-gate-2560.webp 2560w" sizes="100vw" />
<source type="image/webp" <source type="image/webp"
srcset="assets/img/buehne/crew-gate-hoch-440.webp 440w, srcset="assets/img/buehne/crew-gate-hoch-440.webp 440w,
assets/img/buehne/crew-gate-hoch-580.webp 580w, assets/img/buehne/crew-gate-hoch-580.webp 580w,
assets/img/buehne/crew-gate-hoch-900.webp 900w" sizes="100vw" /> assets/img/buehne/crew-gate-hoch-900.webp 900w" sizes="100vw" />
<img class="buehne__bild" src="assets/img/buehne/crew-gate-1280.webp" alt="" <img class="buehne__bild" src="assets/img/buehne/crew-gate-1280.webp" alt=""
width="1647" height="955" fetchpriority="high" decoding="async" /> width="1647" height="955" fetchpriority="high" decoding="async" />
</picture> </picture>
<div class="buehne__schleier"></div> <div class="buehne__schleier"></div>
</div> </div>
<!-- ---------- Tafel ---------------------------------------------------- <!-- ---------- Tafel ----------------------------------------------------
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
hinein, nicht ungefaehr. hinein, nicht ungefaehr.
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter; Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
je nach Fensterform schneidet der Browser oben/unten oder je nach Fensterform schneidet der Browser oben/unten oder
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
deckungsgleich mit dem Bild, und die Karte kann in Prozent des deckungsgleich mit dem Bild, und die Karte kann in Prozent des
BILDES sitzen statt in Prozent des Fensters. BILDES sitzen statt in Prozent des Fensters.
Er faengt keine Klicks ab (pointer-events: none); nur die Karte Er faengt keine Klicks ab (pointer-events: none); nur die Karte
darin ist bedienbar. --> darin ist bedienbar. -->
<div class="tafel-anker"> <div class="tafel-anker">
<main class="tafel" id="tafel"> <main class="tafel" id="tafel">
<div class="tafel__kante" aria-hidden="true"></div> <div class="tafel__kante" aria-hidden="true"></div>
<!-- 10.09.2026, Wunsch Filipe: hier soll alles auf DogFather und sein <!-- 10.09.2026, Wunsch Filipe: hier soll alles auf DogFather und sein
Team zugeschnitten sein. Team zugeschnitten sein.
Zwei Namen und ein Zeichen dazwischen -- nebeneinander, nicht Zwei Namen und ein Zeichen dazwischen -- nebeneinander, nicht
uebereinander. Dogi steht hier nicht ueber den Modis, sie machen uebereinander. Dogi steht hier nicht ueber den Modis, sie machen
das zusammen. das zusammen.
Das "x" steht als eigenes Element, damit es kleiner und in der Das "x" steht als eigenes Element, damit es kleiner und in der
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
aria-hidden nicht: Vorgelesen wird "DogFather x Team Dogi", und aria-hidden nicht: Vorgelesen wird "DogFather x Team Dogi", und
genau so spricht man es auch aus. --> genau so spricht man es auch aus. -->
<header class="kopf"> <header class="kopf">
<p class="marke marke--paar"> <p class="marke marke--paar">
<span class="marke__dogi">DogFather</span> <span class="marke__dogi">DogFather</span>
<span class="marke__x">×</span> <span class="marke__x">×</span>
<span class="marke__crew">Team&nbsp;Dogi</span> <span class="marke__crew">Team&nbsp;Dogi</span>
</p> </p>
<h1 class="titel">Team&nbsp;Dogi</h1> <h1 class="titel">Team&nbsp;Dogi</h1>
<p class="unterzeile">Team Dogi und der Treff. Zugang nur mit persönlichem Code.</p> <p class="unterzeile">Team Dogi und der Treff. Zugang nur mit persönlichem Code.</p>
</header> </header>
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild"> <div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
<p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p> <p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p>
<button type="button" class="rolle" data-rolle="admin" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="admin" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">DogFather</span> <span class="rolle__name">DogFather</span>
<span class="rolle__zusatz">Überblick &amp; Entscheidungen</span> <span class="rolle__zusatz">Überblick &amp; Entscheidungen</span>
</span> </span>
</button> </button>
<!-- Der Untertitel beschreibt eine AUFGABE, kein Recht -- dieselbe <!-- Der Untertitel beschreibt eine AUFGABE, kein Recht -- dieselbe
Ueberlegung wie auf der anderen Wand: Wer vor der Auswahl Ueberlegung wie auf der anderen Wand: Wer vor der Auswahl
steht, fragt sich nicht, was er duerfte, sondern was er hier steht, fragt sich nicht, was er duerfte, sondern was er hier
tut. Und er stellt niemanden ueber jemanden: "vertritt und tut. Und er stellt niemanden ueber jemanden: "vertritt und
koordiniert" ist eine Taetigkeit, kein Rang. --> koordiniert" ist eine Taetigkeit, kein Rang. -->
<button type="button" class="rolle" data-rolle="hand" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="hand" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Rechte Hand</span> <span class="rolle__name">Rechte Hand</span>
<span class="rolle__zusatz">Vertritt und koordiniert</span> <span class="rolle__zusatz">Vertritt und koordiniert</span>
</span> </span>
</button> </button>
<button type="button" class="rolle" data-rolle="modi" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="modi" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-pfote"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-pfote"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Modi</span> <span class="rolle__name">Modi</span>
<span class="rolle__zusatz">Chat, Live und eigene Aufgaben</span> <span class="rolle__zusatz">Chat, Live und eigene Aufgaben</span>
</span> </span>
</button> </button>
<!-- DIE VIERTE KACHEL (Entscheidung Filipe, 11.09.2026). <!-- DIE VIERTE KACHEL (Entscheidung Filipe, 11.09.2026).
Der Treff ist kein eigenes Haus mehr, sondern ein Raum in Der Treff ist kein eigenes Haus mehr, sondern ein Raum in
diesem. Damit kommt die Community durch DIESE Wand, und sie diesem. Damit kommt die Community durch DIESE Wand, und sie
braucht etwas zum Drauftippen. braucht etwas zum Drauftippen.
SIE STEHT GANZ UNTEN, und das ist nicht Rangfolge, sondern SIE STEHT GANZ UNTEN, und das ist nicht Rangfolge, sondern
Haeufigkeit: Die drei darueber melden sich taeglich an, die Haeufigkeit: Die drei darueber melden sich taeglich an, die
Community-Kachel wird von jedem Einzelnen genau einmal Community-Kachel wird von jedem Einzelnen genau einmal
gedrueckt und danach merkt sich der Browser die Wahl gedrueckt und danach merkt sich der Browser die Wahl
(localStorage, siehe gate.js). Wer taeglich kommt, soll oben (localStorage, siehe gate.js). Wer taeglich kommt, soll oben
finden, was er taeglich braucht. finden, was er taeglich braucht.
DER UNTERTITEL BESCHREIBT EINEN ORT, KEINE RECHTE -- dieselbe DER UNTERTITEL BESCHREIBT EINEN ORT, KEINE RECHTE -- dieselbe
Ueberlegung wie bei den drei anderen: Wer vor der Auswahl Ueberlegung wie bei den drei anderen: Wer vor der Auswahl
steht, fragt sich nicht, was er duerfte, sondern wo er steht, fragt sich nicht, was er duerfte, sondern wo er
hinwill. --> hinwill. -->
<button type="button" class="rolle" data-rolle="gast" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="gast" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-leute"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-leute"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Community</span> <span class="rolle__name">Community</span>
<span class="rolle__zusatz">Der Treff</span> <span class="rolle__zusatz">Der Treff</span>
</span> </span>
</button> </button>
</div> </div>
<!-- ==== DAS ALTER (15.09.2026) ================================ <!-- ==== DAS ALTER (15.09.2026) ================================
Auf der Regelseite steht seit dem 11.09. „ab 18". Bis heute war Auf der Regelseite steht seit dem 11.09. „ab 18". Bis heute war
das ein Satz; jetzt ist es eine Bedingung. das ein Satz; jetzt ist es eine Bedingung.
Es erscheint nur bei der Community-Kachel: Wer zum Team gehört, Es erscheint nur bei der Community-Kachel: Wer zum Team gehört,
hat seinen Zugang von DogFather persönlich bekommen – da ist die hat seinen Zugang von DogFather persönlich bekommen – da ist die
Frage vorher geklärt, und ein Häkchen an der Tür wäre nur im Weg. Frage vorher geklärt, und ein Häkchen an der Tür wäre nur im Weg.
Das Häkchen ist NICHT die Sicherung, es ist die Frage. Geprüft Das Häkchen ist NICHT die Sicherung, es ist die Frage. Geprüft
und festgehalten wird sie am Server; hier steht sie nur so, dass und festgehalten wird sie am Server; hier steht sie nur so, dass
man sie liest, bevor man sie setzt. --> man sie liest, bevor man sie setzt. -->
<div class="alterfrage" id="alterfrage" hidden> <div class="alterfrage" id="alterfrage" hidden>
<label class="alterfrage__zeile"> <label class="alterfrage__zeile">
<input type="checkbox" id="alter-ok" /> <input type="checkbox" id="alter-ok" />
<span class="alterfrage__text"> <span class="alterfrage__text">
Ich bin mindestens <strong id="alter-zahl">18</strong> Jahre alt. Ich bin mindestens <strong id="alter-zahl">18</strong> Jahre alt.
</span> </span>
</label> </label>
</div> </div>
<form class="formular" id="formular" novalidate> <form class="formular" id="formular" novalidate>
<label class="feldschild" for="code"> <label class="feldschild" for="code">
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span> Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
</label> </label>
<div class="feld"> <div class="feld">
<input type="password" id="code" name="code" inputmode="text" <input type="password" id="code" name="code" inputmode="text"
autocomplete="current-password" spellcheck="false" autocomplete="current-password" spellcheck="false"
placeholder="Code eingeben" aria-describedby="hinweis fehler" /> placeholder="Code eingeben" aria-describedby="hinweis fehler" />
<button type="button" class="feld__auge" id="auge" <button type="button" class="feld__auge" id="auge"
aria-label="Code anzeigen" aria-pressed="false"> aria-label="Code anzeigen" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"> <svg viewBox="0 0 24 24" aria-hidden="true">
<path class="strich" d="M2.5 12S6 5.8 12 5.8 21.5 12 21.5 12 18 18.2 12 18.2 2.5 12 2.5 12Z"/> <path class="strich" d="M2.5 12S6 5.8 12 5.8 21.5 12 21.5 12 18 18.2 12 18.2 2.5 12 2.5 12Z"/>
<circle class="strich" cx="12" cy="12" r="2.9"/> <circle class="strich" cx="12" cy="12" r="2.9"/>
<path class="strich durch" d="m4 20 16-16"/> <path class="strich durch" d="m4 20 16-16"/>
</svg> </svg>
</button> </button>
</div> </div>
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p> <p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<button type="submit" class="knopf" id="knopf"> <button type="submit" class="knopf" id="knopf">
<span class="knopf__text">Anmelden</span> <span class="knopf__text">Anmelden</span>
<span class="knopf__laden" aria-hidden="true"></span> <span class="knopf__laden" aria-hidden="true"></span>
</button> </button>
</form> </form>
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026). <!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
sagt, was jetzt zu tun ist. Für die Community ist das besonders sagt, was jetzt zu tun ist. Für die Community ist das besonders
teuer: Sie ist die einzige Rolle, die von außen kommt und teuer: Sie ist die einzige Rolle, die von außen kommt und
niemanden im Haus kennt. --> niemanden im Haus kennt. -->
<p class="fuss fuss--woher">Noch keinen Code? Frag im Live nach – Team&nbsp;Dogi gibt ihn dir persönlich.</p> <p class="fuss fuss--woher">Noch keinen Code? Frag im Live nach – Team&nbsp;Dogi gibt ihn dir persönlich.</p>
<p class="fuss"> <p class="fuss">
Verschlüsselte Verbindung · Zugriffe werden protokolliert Verschlüsselte Verbindung · Zugriffe werden protokolliert
</p> </p>
</main> </main>
</div> </div>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/gate.js?v=202609191915" defer></script> <script src="assets/js/gate.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+4 -4
View File
@@ -22,25 +22,25 @@
}, },
"icons": [ "icons": [
{ {
"src": "/assets/img/app-symbole/crew-192.png?v=202609191915", "src": "/assets/img/app-symbole/crew-192.png?v=202609191956",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512.png?v=202609191915", "src": "/assets/img/app-symbole/crew-512.png?v=202609191956",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191915", "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609191956",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
}, },
{ {
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191915", "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609191956",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+15 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/dateien.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -108,12 +108,13 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/dateien.js?v=202609191915" defer></script> <script src="assets/js/dateien.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+116 -116
View File
@@ -1,116 +1,116 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Eure Aufgaben · Spicy &amp; Dogi</title> <title>Eure Aufgaben · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Eure Aufgaben</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Eure Aufgaben</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke" id="ober">Entwicklung &amp; Nachwuchs</p> <p class="marke" id="ober">Entwicklung &amp; Nachwuchs</p>
<!-- UMBENANNT AM 19.09.2026 (siehe workspace.js). Diese Seite ist <!-- UMBENANNT AM 19.09.2026 (siehe workspace.js). Diese Seite ist
der Aufgabenkatalog: was ein Modi koennen soll und wo er der Aufgabenkatalog: was ein Modi koennen soll und wo er
gerade steht. Der Name "Entwicklung" bleibt dem vorbehalten, gerade steht. Der Name "Entwicklung" bleibt dem vorbehalten,
was Filipe darunter versteht -- einer Auswertung je Person. --> was Filipe darunter versteht -- einer Auswertung je Person. -->
<h1 class="titel" id="titel">Eure Aufgaben</h1> <h1 class="titel" id="titel">Eure Aufgaben</h1>
<p class="unterzeile" id="unterzeile"> <p class="unterzeile" id="unterzeile">
Anklicken statt tippen. Keine Noten, keine Punktzahl – ein Gesprächsanlass. Anklicken statt tippen. Keine Noten, keine Punktzahl – ein Gesprächsanlass.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- ================================================================== <!-- ==================================================================
DIE REIHENFOLGE AUF DIESER SEITE IST DAS EIGENTLICHE DESIGN DIE REIHENFOLGE AUF DIESER SEITE IST DAS EIGENTLICHE DESIGN
1. Die Ampel — sie betrifft Menschen, nicht Prozesse. 1. Die Ampel — sie betrifft Menschen, nicht Prozesse.
2. Die Personen — wen gehe ich heute durch. 2. Die Personen — wen gehe ich heute durch.
3. Die Karte — und darin die ABWEICHUNGEN zuerst. 3. Die Karte — und darin die ABWEICHUNGEN zuerst.
4. Ganz unten der Weg zu den eigenen sechs Fragen — sie haben 4. Ganz unten der Weg zu den eigenen sechs Fragen — sie haben
seit dem 15.09.2026 eine eigene Seite. seit dem 15.09.2026 eine eigene Seite.
Wer die Seite öffnet, soll die wichtigste Sache zuerst sehen, und Wer die Seite öffnet, soll die wichtigste Sache zuerst sehen, und
das ist nicht die Liste. Eine Ampel unter 34 Beobachtungen hätte das ist nicht die Liste. Eine Ampel unter 34 Beobachtungen hätte
niemand je gelesen. niemand je gelesen.
============================================================== --> ============================================================== -->
<section id="ampel" class="e-ampel" hidden></section> <section id="ampel" class="e-ampel" hidden></section>
<section id="personen-block" hidden> <section id="personen-block" hidden>
<h2 class="e-abschnitt">Wen gehst du durch?</h2> <h2 class="e-abschnitt">Wen gehst du durch?</h2>
<div id="personen" class="e-personen" role="group" aria-label="Person wählen" aria-busy="true"></div> <div id="personen" class="e-personen" role="group" aria-label="Person wählen" aria-busy="true"></div>
</section> </section>
<section id="karte" class="e-karte" hidden></section> <section id="karte" class="e-karte" hidden></section>
<!-- DEINE EIGENE KARTE. <!-- DEINE EIGENE KARTE.
Sie steht ÜBER den sechs Fragen und UNTER der Liste der anderen: Sie steht ÜBER den sechs Fragen und UNTER der Liste der anderen:
Wer diese Seite als DogFather öffnet, kommt zuerst zu seiner Wer diese Seite als DogFather öffnet, kommt zuerst zu seiner
Arbeit; wer beurteilt wird, sieht die Liste gar nicht und Arbeit; wer beurteilt wird, sieht die Liste gar nicht und
landet direkt hier. landet direkt hier.
Sie erscheint erst, wenn alle gesetzt haben — eine halbe Karte Sie erscheint erst, wenn alle gesetzt haben — eine halbe Karte
ist schlimmer als keine. --> ist schlimmer als keine. -->
<section id="karte-block" class="e-meine" hidden> <section id="karte-block" class="e-meine" hidden>
<h2 class="e-abschnitt">Deine Karte</h2> <h2 class="e-abschnitt">Deine Karte</h2>
<p class="e-meine__satz" id="karte-satz">…</p> <p class="e-meine__satz" id="karte-satz">…</p>
<div id="meine-karte" aria-busy="true"></div> <div id="meine-karte" aria-busy="true"></div>
</section> </section>
<!-- ==== DIE SECHS FRAGEN STEHEN WOANDERS (15.09.2026) ========== <!-- ==== DIE SECHS FRAGEN STEHEN WOANDERS (15.09.2026) ==========
Sie hatten hier ihren Platz, solange es keine eigene Seite gab. Sie hatten hier ihren Platz, solange es keine eigene Seite gab.
Jetzt gibt es eine – und zwei Stellen für dieselben sechs Fragen Jetzt gibt es eine – und zwei Stellen für dieselben sechs Fragen
wären zwei Stände, die auseinanderlaufen. Hier bleibt der Weg wären zwei Stände, die auseinanderlaufen. Hier bleibt der Weg
dorthin, nicht eine Kopie. --> dorthin, nicht eine Kopie. -->
<section class="e-meins e-meins--verweis" id="meins-block" hidden> <section class="e-meins e-meins--verweis" id="meins-block" hidden>
<h2 class="e-abschnitt">Und wie geht es dir?</h2> <h2 class="e-abschnitt">Und wie geht es dir?</h2>
<p class="e-meins__satz"> <p class="e-meins__satz">
Ein paar Fragen über dich – die Antworten sieht niemand außer dir. Ein paar Fragen über dich – die Antworten sieht niemand außer dir.
</p> </p>
<a class="knopf knopf--klein" href="befinden.html">Zu deinen Fragen</a> <a class="knopf knopf--klein" href="befinden.html">Zu deinen Fragen</a>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>␍
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/entwicklung.js?v=202609191915" defer></script> <script src="assets/js/entwicklung.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+13 -12
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/hilfe.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -141,11 +141,12 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/hilfe.js?v=202609191915" defer></script> <script src="assets/js/hilfe.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+417 -417
View File
@@ -1,417 +1,417 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Anmeldung · Spicy & Dogi</title> <title>Anmeldung · Spicy & Dogi</title>
<meta name="description" content="Privater Arbeitsbereich für Creator, Scouts und DogFather." /> <meta name="description" content="Privater Arbeitsbereich für Creator, Scouts und DogFather." />
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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" />
<!-- Die Bühne ist der erste Eindruck. Ohne diesen Hinweis lädt der Browser sie erst, <!-- Die Bühne ist der erste Eindruck. Ohne diesen Hinweis lädt der Browser sie erst,
nachdem er das CSS gelesen hat - das kostet spürbar Zeit. Quer- und Hochformat nachdem er das CSS gelesen hat - das kostet spürbar Zeit. Quer- und Hochformat
sind getrennt, damit das Handy nicht die große Fassung zieht. sind getrennt, damit das Handy nicht die große Fassung zieht.
Hier steht bewusst WebP und nicht AVIF, obwohl die AVIF-Fassungen erzeugt Hier steht bewusst WebP und nicht AVIF, obwohl die AVIF-Fassungen erzeugt
werden und rund ein Drittel kleiner wären: Der ausliefernde Server läuft auf werden und rund ein Drittel kleiner wären: Der ausliefernde Server läuft auf
Express 4, dessen `send` eine alte MIME-Tabelle ohne AVIF mitbringt. Die Express 4, dessen `send` eine alte MIME-Tabelle ohne AVIF mitbringt. Die
Dateien kämen als application/octet-stream an und würden wegen des Dateien kämen als application/octet-stream an und würden wegen des
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
werden (die Dateien liegen bereit). --> werden (die Dateien liegen bereit). -->
<link rel="preload" as="image" href="assets/img/buehne/gate-1920.webp" <link rel="preload" as="image" href="assets/img/buehne/gate-1920.webp"
type="image/webp" media="(min-width: 900px)" /> type="image/webp" media="(min-width: 900px)" />
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
</head> </head>
<body class="gate"> <body class="gate">
<!-- ==================================================================== <!-- ====================================================================
DIE FÜNF ROLLENZEICHEN, plastisch (08.09.2026) DIE FÜNF ROLLENZEICHEN, plastisch (08.09.2026)
Filipe: "die symbole sollen auch noch viel viel viel realistischer Filipe: "die symbole sollen auch noch viel viel viel realistischer
und geiler sein", mit genauen Vorgaben je Rolle: und geiler sein", mit genauen Vorgaben je Rolle:
peperoni rot und grün peperoni rot und grün
husky silber und blaue Augen husky silber und blaue Augen
manager gelber Stern, der glitzert manager gelber Stern, der glitzert
scout grünes Schild mit einer roten Peperoni darin scout grünes Schild mit einer roten Peperoni darin
creator lila und silber, "was richtig geiles" creator lila und silber, "was richtig geiles"
WAS SICH GRUNDSÄTZLICH ÄNDERT: Vorher trug jedes Zeichen genau EINE WAS SICH GRUNDSÄTZLICH ÄNDERT: Vorher trug jedes Zeichen genau EINE
Farbe (`currentColor` über `.fuell`/`.linie`). Damit lässt sich Farbe (`currentColor` über `.fuell`/`.linie`). Damit lässt sich
"rot UND grün" nicht darstellen. Jedes Zeichen bekommt deshalb "rot UND grün" nicht darstellen. Jedes Zeichen bekommt deshalb
eigene Verläufe — dieselbe Technik, mit der auch die Kacheln eigene Verläufe — dieselbe Technik, mit der auch die Kacheln
plastisch wirken: ein heller Rand oben, die Sättigung in der Mitte, plastisch wirken: ein heller Rand oben, die Sättigung in der Mitte,
Abdunklung unten. Das ergibt Volumen statt einer flachen Fläche. Abdunklung unten. Das ergibt Volumen statt einer flachen Fläche.
WARUM VERLÄUFE UND KEIN DETAIL: Diese Zeichen stehen bei 22 px. WARUM VERLÄUFE UND KEIN DETAIL: Diese Zeichen stehen bei 22 px.
Mehr Linien werden dort zu Matsch — das stand schon beim Husky hier, Mehr Linien werden dort zu Matsch — das stand schon beim Husky hier,
und es gilt weiter. "Realistischer" heißt bei dieser Größe also und es gilt weiter. "Realistischer" heißt bei dieser Größe also
nicht "mehr Striche", sondern LICHT: eine Form, auf die Licht fällt, nicht "mehr Striche", sondern LICHT: eine Form, auf die Licht fällt,
wirkt körperlich; dieselbe Form flach gefüllt wirkt wie ein wirkt körperlich; dieselbe Form flach gefüllt wirkt wie ein
Aufkleber. Alle Verläufe laufen deshalb von oben nach unten, als Aufkleber. Alle Verläufe laufen deshalb von oben nach unten, als
stünde das Licht über der Seite — so wie bei allem anderen hier auch. stünde das Licht über der Seite — so wie bei allem anderen hier auch.
Die Verlaufs-IDs sind mit `rs-` vorangestellt (RollenSymbol), damit Die Verlaufs-IDs sind mit `rs-` vorangestellt (RollenSymbol), damit
sie mit nichts kollidieren, was später dazukommt. sie mit nichts kollidieren, was später dazukommt.
==================================================================== --> ==================================================================== -->
<!-- NICHT `display:none` VERSTECKEN -- das war ein echter Fehler, und man <!-- NICHT `display:none` VERSTECKEN -- das war ein echter Fehler, und man
sieht ihn erst im Bild (08.09.2026). sieht ihn erst im Bild (08.09.2026).
Solange die Zeichen einfarbig waren (`currentColor` ueber CSS), war Solange die Zeichen einfarbig waren (`currentColor` ueber CSS), war
`display:none` harmlos. Sobald sie ihre Farbe aus einem <linearGradient> `display:none` harmlos. Sobald sie ihre Farbe aus einem <linearGradient>
im selben <defs> holen, ist es das nicht mehr: Ein Verlauf in einem im selben <defs> holen, ist es das nicht mehr: Ein Verlauf in einem
Teilbaum, der `display:none` traegt, wird nicht ausgewertet, und ein Teilbaum, der `display:none` traegt, wird nicht ausgewertet, und ein
`<use>` darauf bekommt schlicht KEINE Fuellung. Im Bildschirmfoto `<use>` darauf bekommt schlicht KEINE Fuellung. Im Bildschirmfoto
standen daraufhin fuenf Bruchstuecke -- nur die Strichlinien, keine standen daraufhin fuenf Bruchstuecke -- nur die Strichlinien, keine
Flaechen. Die Zahlen sagten dazu nichts, das Sprite war ja da. Flaechen. Die Zahlen sagten dazu nichts, das Sprite war ja da.
Richtig ist ein Kasten ohne Groesse: Er wird gerendert (Verlaeufe Richtig ist ein Kasten ohne Groesse: Er wird gerendert (Verlaeufe
werden also aufgeloest), nimmt aber keinen Platz ein. --> werden also aufgeloest), nimmt aber keinen Platz ein. -->
<svg width="0" height="0" style="position:absolute;overflow:hidden" aria-hidden="true"><defs> <svg width="0" height="0" style="position:absolute;overflow:hidden" aria-hidden="true"><defs>
<linearGradient id="rs-chili-rot" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="rs-chili-rot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#ff8a6b"/> <stop offset="0" stop-color="#ff8a6b"/>
<stop offset=".55" stop-color="#ef4136"/> <stop offset=".55" stop-color="#ef4136"/>
<stop offset="1" stop-color="#a8221c"/> <stop offset="1" stop-color="#a8221c"/>
</linearGradient> </linearGradient>
<linearGradient id="rs-chili-gruen" x1="0" y1="0" x2="1" y2="1"> <linearGradient id="rs-chili-gruen" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#8fd66a"/> <stop offset="0" stop-color="#8fd66a"/>
<stop offset="1" stop-color="#3f7d33"/> <stop offset="1" stop-color="#3f7d33"/>
</linearGradient> </linearGradient>
<!-- `rs-silber` ist am 09.09.2026 entfallen. Er faerbte den alten, <!-- `rs-silber` ist am 09.09.2026 entfallen. Er faerbte den alten,
selbstgebauten Husky; seit dort das echte Logo steht (mit einem selbstgebauten Husky; seit dort das echte Logo steht (mit einem
eigenen Duotonie-Filter), benutzte ihn niemand mehr. Ein eigenen Duotonie-Filter), benutzte ihn niemand mehr. Ein
Verlauf, den man im Quelltext findet und der nichts faerbt, Verlauf, den man im Quelltext findet und der nichts faerbt,
kostet den naechsten Leser eine Suche. --> kostet den naechsten Leser eine Suche. -->
<!-- DER STERN WIRD LILA (08.09.2026, zweite Ansage von Filipe). <!-- DER STERN WIRD LILA (08.09.2026, zweite Ansage von Filipe).
Zuerst hiess es "manager: gelber stern der glitzert", dann nach Zuerst hiess es "manager: gelber stern der glitzert", dann nach
dem Bildschirmfoto: "die hauptfarbe von denen ist lila, der stern dem Bildschirmfoto: "die hauptfarbe von denen ist lila, der stern
soll so bleiben aber was gelb ist soll lila werden." soll so bleiben aber was gelb ist soll lila werden."
Die FORM bleibt also, nur die Farbe wechselt -- und das ist auch Die FORM bleibt also, nur die Farbe wechselt -- und das ist auch
stimmiger: Der Manager traegt Lila als Rollenfarbe, ein goldener stimmiger: Der Manager traegt Lila als Rollenfarbe, ein goldener
Stern daneben waere die einzige Stelle gewesen, an der Zeichen und Stern daneben waere die einzige Stelle gewesen, an der Zeichen und
Rolle auseinandergehen. Die Wechsel hell/dunkel bleiben, sie sind Rolle auseinandergehen. Die Wechsel hell/dunkel bleiben, sie sind
es, die aus einer Flaeche einen Koerper machen. es, die aus einer Flaeche einen Koerper machen.
Der Name der Kennung bleibt `rs-gold`: Sie wird an mehreren Der Name der Kennung bleibt `rs-gold`: Sie wird an mehreren
Stellen benutzt, und ein Umbenennen waere eine zweite Gelegenheit, Stellen benutzt, und ein Umbenennen waere eine zweite Gelegenheit,
eine davon zu vergessen. --> eine davon zu vergessen. -->
<linearGradient id="rs-gold" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="rs-gold" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#e6d6ff"/> <stop offset="0" stop-color="#e6d6ff"/>
<stop offset=".45" stop-color="#a78bfa"/> <stop offset=".45" stop-color="#a78bfa"/>
<stop offset="1" stop-color="#5b3fa8"/> <stop offset="1" stop-color="#5b3fa8"/>
</linearGradient> </linearGradient>
<linearGradient id="rs-schild" x1="0" y1="0" x2="0" y2="1"> <linearGradient id="rs-schild" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#7fe0ae"/> <stop offset="0" stop-color="#7fe0ae"/>
<stop offset=".5" stop-color="#3faa78"/> <stop offset=".5" stop-color="#3faa78"/>
<stop offset="1" stop-color="#1c5e42"/> <stop offset="1" stop-color="#1c5e42"/>
</linearGradient> </linearGradient>
<linearGradient id="rs-lila" x1="0" y1="0" x2="1" y2="1"> <linearGradient id="rs-lila" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#d9c9ff"/> <stop offset="0" stop-color="#d9c9ff"/>
<stop offset=".38" stop-color="#a78bfa"/> <stop offset=".38" stop-color="#a78bfa"/>
<stop offset="1" stop-color="#5b3fa8"/> <stop offset="1" stop-color="#5b3fa8"/>
</linearGradient> </linearGradient>
<linearGradient id="rs-lila-silber" x1="0" y1="1" x2="1" y2="0"> <linearGradient id="rs-lila-silber" x1="0" y1="1" x2="1" y2="0">
<stop offset="0" stop-color="#6d4fc4"/> <stop offset="0" stop-color="#6d4fc4"/>
<stop offset=".5" stop-color="#cbd5e1"/> <stop offset=".5" stop-color="#cbd5e1"/>
<stop offset="1" stop-color="#a78bfa"/> <stop offset="1" stop-color="#a78bfa"/>
</linearGradient> </linearGradient>
<radialGradient id="rs-auge" cx=".38" cy=".32" r=".85"> <radialGradient id="rs-auge" cx=".38" cy=".32" r=".85">
<stop offset="0" stop-color="#bfe9ff"/> <stop offset="0" stop-color="#bfe9ff"/>
<stop offset=".45" stop-color="#3fa9f5"/> <stop offset=".45" stop-color="#3fa9f5"/>
<stop offset="1" stop-color="#0f4c75"/> <stop offset="1" stop-color="#0f4c75"/>
</radialGradient> </radialGradient>
<!-- SPICY MEDIA — die Peperoni, rot mit grünem Stiel. <!-- SPICY MEDIA — die Peperoni, rot mit grünem Stiel.
Der Stiel liegt ÜBER der Frucht und ist eine eigene Form: Als Der Stiel liegt ÜBER der Frucht und ist eine eigene Form: Als
Teil desselben Pfades hätte er die Farbe der Frucht erben müssen, Teil desselben Pfades hätte er die Farbe der Frucht erben müssen,
und genau das wollte Filipe nicht. --> und genau das wollte Filipe nicht. -->
<g id="r-chili"> <g id="r-chili">
<path fill="url(#rs-chili-rot)" d="M13.4 4.6c-.6 1.4-.3 2.6.6 3.4 3 .3 5 2.6 5 5.4 0 3.4-3 6-6.8 6-4.6 0-8.2-2.9-9.7-6.7 3.7.9 6.6-.4 8-3.1.6-1.2.4-2.4-.4-3.1"/> <path fill="url(#rs-chili-rot)" d="M13.4 4.6c-.6 1.4-.3 2.6.6 3.4 3 .3 5 2.6 5 5.4 0 3.4-3 6-6.8 6-4.6 0-8.2-2.9-9.7-6.7 3.7.9 6.6-.4 8-3.1.6-1.2.4-2.4-.4-3.1"/>
<path fill="none" stroke="rgba(255,255,255,.5)" stroke-width=".9" stroke-linecap="round" d="M6.2 13.9c2.4 1.9 5 2.6 7.4 2"/> <path fill="none" stroke="rgba(255,255,255,.5)" stroke-width=".9" stroke-linecap="round" d="M6.2 13.9c2.4 1.9 5 2.6 7.4 2"/>
<path fill="none" stroke="url(#rs-chili-gruen)" stroke-width="1.9" stroke-linecap="round" d="M13.4 4.6c1.5-.6 2.8.1 3 1.4"/> <path fill="none" stroke="url(#rs-chili-gruen)" stroke-width="1.9" stroke-linecap="round" d="M13.4 4.6c1.5-.6 2.8.1 3 1.4"/>
<path fill="none" stroke="url(#rs-chili-gruen)" stroke-width="1.7" stroke-linecap="round" d="M13.4 4.6c-.5 1.2-.3 2.3.5 3.2"/> <path fill="none" stroke="url(#rs-chili-gruen)" stroke-width="1.7" stroke-linecap="round" d="M13.4 4.6c-.5 1.2-.3 2.3.5 3.2"/>
</g> </g>
<!-- DER HUSKY IST JETZT DAS ECHTE LOGO (09.09.2026, screen3). <!-- DER HUSKY IST JETZT DAS ECHTE LOGO (09.09.2026, screen3).
Filipe: "dieses husky symbol soll ersetzt werden durch den husky Filipe: "dieses husky symbol soll ersetzt werden durch den husky
oben in der leiste ... die farbe von der rolle und die barre soll oben in der leiste ... die farbe von der rolle und die barre soll
so richtig geil silber sein ... und der husky soll eine geile so richtig geil silber sein ... und der husky soll eine geile
babyblau sein haben." babyblau sein haben."
Hier stand eine geometrische Eigenkonstruktion: ein Fuenfeck mit Hier stand eine geometrische Eigenkonstruktion: ein Fuenfeck mit
zwei dreieckigen Ohren und zwei Punkten. Sie war ordentlich zwei dreieckigen Ohren und zwei Punkten. Sie war ordentlich
gebaut, aber sie war nicht DER Husky -- oben in der Leiste steht gebaut, aber sie war nicht DER Husky -- oben in der Leiste steht
die richtige Marke, und zwei verschiedene Huskys auf einer Seite die richtige Marke, und zwei verschiedene Huskys auf einer Seite
sind einer zu viel. sind einer zu viel.
DAS BILD KOMMT ALS <image>, DIE FARBE AUS EINEM FILTER. Die DAS BILD KOMMT ALS <image>, DIE FARBE AUS EINEM FILTER. Die
Datei ist schwarz-weiss und freigestellt. `feComponentTransfer` Datei ist schwarz-weiss und freigestellt. `feComponentTransfer`
mit einer zweistufigen Tabelle bildet sie auf zwei Farben ab: mit einer zweistufigen Tabelle bildet sie auf zwei Farben ab:
Schwarz wird zu dunklem Stahl (#2a3644), Weiss zu Silber Schwarz wird zu dunklem Stahl (#2a3644), Weiss zu Silber
(#e8eef6). Das ist eine echte Duotonie -- ein `feColorMatrix` (#e8eef6). Das ist eine echte Duotonie -- ein `feColorMatrix`
koennte das nicht, der kann nur linear mischen und wuerde die koennte das nicht, der kann nur linear mischen und wuerde die
Mitteltoene flach ziehen. Mitteltoene flach ziehen.
DAS AUGE IST GEMESSEN, NICHT GESETZT: Ein Durchlauf ueber die DAS AUGE IST GEMESSEN, NICHT GESETZT: Ein Durchlauf ueber die
Bildpunkte hat die Pupille als einzige dunkle Insel gefunden, Bildpunkte hat die Pupille als einzige dunkle Insel gefunden,
die ringsum von Hellem umgeben ist -- bei 165/258 von 512, also die ringsum von Hellem umgeben ist -- bei 165/258 von 512, also
32,2 % und 50,4 %. Im 24er Raster sind das 7,73 und 12,1. 32,2 % und 50,4 %. Im 24er Raster sind das 7,73 und 12,1.
Darauf liegen Iris (babyblau), Pupille und ein Glanzpunkt. Darauf liegen Iris (babyblau), Pupille und ein Glanzpunkt.
Warum ueberhaupt eine Iris: Das Logo hat ein schwarzes Auge. Warum ueberhaupt eine Iris: Das Logo hat ein schwarzes Auge.
Babyblau war seit dem ersten Auftrag gewuenscht ("husky: silber Babyblau war seit dem ersten Auftrag gewuenscht ("husky: silber
und blaue augen") und ist es jetzt wieder -- es ist der einzige und blaue augen") und ist es jetzt wieder -- es ist der einzige
Farbfleck an einem sonst silbernen Zeichen und traegt damit Farbfleck an einem sonst silbernen Zeichen und traegt damit
genau so viel Farbe wie die anderen Rollen auch. --> genau so viel Farbe wie die anderen Rollen auch. -->
<filter id="rs-husky-duo" color-interpolation-filters="sRGB"> <filter id="rs-husky-duo" color-interpolation-filters="sRGB">
<feComponentTransfer> <feComponentTransfer>
<feFuncR type="table" tableValues="0.165 0.910"/> <feFuncR type="table" tableValues="0.165 0.910"/>
<feFuncG type="table" tableValues="0.212 0.933"/> <feFuncG type="table" tableValues="0.212 0.933"/>
<feFuncB type="table" tableValues="0.267 0.965"/> <feFuncB type="table" tableValues="0.267 0.965"/>
</feComponentTransfer> </feComponentTransfer>
</filter> </filter>
<g id="r-husky"> <g id="r-husky">
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24" <image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/> preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
<circle fill="#7ec8f2" cx="7.73" cy="12.1" r="1.05"/> <circle fill="#7ec8f2" cx="7.73" cy="12.1" r="1.05"/>
<circle fill="#16232f" cx="7.73" cy="12.1" r="0.52"/> <circle fill="#16232f" cx="7.73" cy="12.1" r="0.52"/>
<circle fill="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/> <circle fill="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
</g> </g>
<!-- MANAGER — der goldene Stern, der glitzert. <!-- MANAGER — der goldene Stern, der glitzert.
Das Funkeln ist ein schmaler heller Streifen, der einmal quer Das Funkeln ist ein schmaler heller Streifen, der einmal quer
über den Stern wandert. Es ist BEWUSST langsam (4,5 s) und über den Stern wandert. Es ist BEWUSST langsam (4,5 s) und
schwach: Ein schnelles Blinken wäre genau die aggressive Optik, schwach: Ein schnelles Blinken wäre genau die aggressive Optik,
die hier nicht sein soll. Bei "weniger Bewegung" steht es still die hier nicht sein soll. Bei "weniger Bewegung" steht es still
(siehe personen.css) -- dann bleibt ein ruhiger goldener Stern. --> (siehe personen.css) -- dann bleibt ein ruhiger goldener Stern. -->
<g id="r-stern"> <g id="r-stern">
<path fill="url(#rs-gold)" d="m12 3.4 2.6 5.6 6 .8-4.4 4.2 1.1 6-5.3-2.9-5.3 2.9 1.1-6L3.4 9.8l6-.8z"/> <path fill="url(#rs-gold)" d="m12 3.4 2.6 5.6 6 .8-4.4 4.2 1.1 6-5.3-2.9-5.3 2.9 1.1-6L3.4 9.8l6-.8z"/>
<path fill="rgba(255,255,255,.45)" d="m12 3.4 2.6 5.6-2.6.7z"/> <path fill="rgba(255,255,255,.45)" d="m12 3.4 2.6 5.6-2.6.7z"/>
<path class="rs-funkel" fill="rgba(255,255,255,.75)" d="m12 3.4 2.6 5.6 6 .8-4.4 4.2 1.1 6-5.3-2.9-5.3 2.9 1.1-6L3.4 9.8l6-.8z"/> <path class="rs-funkel" fill="rgba(255,255,255,.75)" d="m12 3.4 2.6 5.6 6 .8-4.4 4.2 1.1 6-5.3-2.9-5.3 2.9 1.1-6L3.4 9.8l6-.8z"/>
</g> </g>
<!-- SCOUT — grünes Schild mit einer roten Peperoni darin. <!-- SCOUT — grünes Schild mit einer roten Peperoni darin.
Der Haken von früher ist weg: Filipe hat die Peperoni ausdrücklich Der Haken von früher ist weg: Filipe hat die Peperoni ausdrücklich
verlangt, und beides nebeneinander wäre bei 22 px Matsch. Die verlangt, und beides nebeneinander wäre bei 22 px Matsch. Die
Chili ist stark vereinfacht — bei dieser Größe zählt nur, dass Chili ist stark vereinfacht — bei dieser Größe zählt nur, dass
eine rote, gebogene Form mit grünem Stiel im Schild steht. --> eine rote, gebogene Form mit grünem Stiel im Schild steht. -->
<g id="r-schutz"> <g id="r-schutz">
<path fill="url(#rs-schild)" d="M12 3.4 5.8 5.9v5c0 3.5 2.5 6.7 6.2 8 3.7-1.3 6.2-4.5 6.2-8v-5z"/> <path fill="url(#rs-schild)" d="M12 3.4 5.8 5.9v5c0 3.5 2.5 6.7 6.2 8 3.7-1.3 6.2-4.5 6.2-8v-5z"/>
<path fill="rgba(255,255,255,.28)" d="M12 3.4 5.8 5.9v5c0 1.4.4 2.7 1.1 3.9L12 3.4z"/> <path fill="rgba(255,255,255,.28)" d="M12 3.4 5.8 5.9v5c0 1.4.4 2.7 1.1 3.9L12 3.4z"/>
<path fill="url(#rs-chili-rot)" d="M13.6 8.1c-.4.9-.2 1.7.4 2.2 1.9.2 3.2 1.7 3.2 3.4 0 2.1-1.9 3.8-4.3 3.8-2.9 0-5.2-1.8-6.1-4.2 2.3.6 4.2-.3 5-2 .4-.8.3-1.5-.2-2z" transform="translate(-.6 -.9) scale(.92) translate(1 1)"/> <path fill="url(#rs-chili-rot)" d="M13.6 8.1c-.4.9-.2 1.7.4 2.2 1.9.2 3.2 1.7 3.2 3.4 0 2.1-1.9 3.8-4.3 3.8-2.9 0-5.2-1.8-6.1-4.2 2.3.6 4.2-.3 5-2 .4-.8.3-1.5-.2-2z" transform="translate(-.6 -.9) scale(.92) translate(1 1)"/>
<path fill="none" stroke="#8fd66a" stroke-width="1.3" stroke-linecap="round" d="M12.9 7.6c.9-.4 1.7 0 1.8.8"/> <path fill="none" stroke="#8fd66a" stroke-width="1.3" stroke-linecap="round" d="M12.9 7.6c.9-.4 1.7 0 1.8.8"/>
</g> </g>
<!-- CREATOR — Lila und Silber. <!-- CREATOR — Lila und Silber.
Statt der alten Person-Silhouette (die aussah wie ein leeres Statt der alten Person-Silhouette (die aussah wie ein leeres
Benutzerbild und damit wie "niemand") jetzt ein geschliffener Benutzerbild und damit wie "niemand") jetzt ein geschliffener
Kristall: lila Kern, silberne Facetten. Er hat als einziges der Kristall: lila Kern, silberne Facetten. Er hat als einziges der
fünf Zeichen eine Innenzeichnung, und die trägt auch klein -- fünf Zeichen eine Innenzeichnung, und die trägt auch klein --
weil es gerade Kanten sind, keine Rundungen. --> weil es gerade Kanten sind, keine Rundungen. -->
<g id="r-person"> <g id="r-person">
<path fill="url(#rs-lila)" d="M12 2.6 20 9l-3 11.4H7L4 9z"/> <path fill="url(#rs-lila)" d="M12 2.6 20 9l-3 11.4H7L4 9z"/>
<path fill="url(#rs-lila-silber)" opacity=".85" d="M12 2.6 20 9h-5.6zM12 2.6 4 9h5.6z"/> <path fill="url(#rs-lila-silber)" opacity=".85" d="M12 2.6 20 9h-5.6zM12 2.6 4 9h5.6z"/>
<path fill="rgba(255,255,255,.4)" d="M12 2.6 14.4 9H9.6z"/> <path fill="rgba(255,255,255,.4)" d="M12 2.6 14.4 9H9.6z"/>
<path fill="none" stroke="rgba(216,222,233,.75)" stroke-width=".8" stroke-linejoin="round" d="M12 2.6 20 9l-3 11.4H7L4 9zM4 9h16M9.6 9 12 20.4 14.4 9"/> <path fill="none" stroke="rgba(216,222,233,.75)" stroke-width=".8" stroke-linejoin="round" d="M12 2.6 20 9l-3 11.4H7L4 9zM4 9h16M9.6 9 12 20.4 14.4 9"/>
</g> </g>
</defs></svg> </defs></svg>
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- --> <!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
<div class="buehne" aria-hidden="true"> <div class="buehne" aria-hidden="true">
<picture> <picture>
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 -- <!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
auf einem 2550 px breiten Schirm rechnete der Browser das Bild auf einem 2550 px breiten Schirm rechnete der Browser das Bild
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
das sah man als "nicht hochwertig", ohne es benennen zu koennen. das sah man als "nicht hochwertig", ohne es benennen zu koennen.
Eine hoehere Bildguete haette daran nichts geaendert: Man kann Eine hoehere Bildguete haette daran nichts geaendert: Man kann
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden. keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
Ueber srcset laedt trotzdem jeder nur die Stufe, die er Ueber srcset laedt trotzdem jeder nur die Stufe, die er
braucht -- ein Handy weiterhin 32 KB. --> braucht -- ein Handy weiterhin 32 KB. -->
<source media="(min-width: 900px)" type="image/webp" <source media="(min-width: 900px)" type="image/webp"
srcset="assets/img/buehne/gate-960.webp 960w, srcset="assets/img/buehne/gate-960.webp 960w,
assets/img/buehne/gate-1280.webp 1280w, assets/img/buehne/gate-1280.webp 1280w,
assets/img/buehne/gate-1600.webp 1600w, assets/img/buehne/gate-1600.webp 1600w,
assets/img/buehne/gate-1920.webp 1920w, assets/img/buehne/gate-1920.webp 1920w,
assets/img/buehne/gate-2560.webp 2560w" sizes="100vw" /> assets/img/buehne/gate-2560.webp 2560w" sizes="100vw" />
<source type="image/webp" <source type="image/webp"
srcset="assets/img/buehne/gate-hoch-440.webp 440w, srcset="assets/img/buehne/gate-hoch-440.webp 440w,
assets/img/buehne/gate-hoch-580.webp 580w, assets/img/buehne/gate-hoch-580.webp 580w,
assets/img/buehne/gate-hoch-900.webp 900w" sizes="100vw" /> assets/img/buehne/gate-hoch-900.webp 900w" sizes="100vw" />
<img class="buehne__bild" src="assets/img/buehne/gate-1280.webp" alt="" <img class="buehne__bild" src="assets/img/buehne/gate-1280.webp" alt=""
width="1647" height="955" fetchpriority="high" decoding="async" /> width="1647" height="955" fetchpriority="high" decoding="async" />
</picture> </picture>
<div class="buehne__schleier"></div> <div class="buehne__schleier"></div>
</div> </div>
<!-- ---------- Tafel ---------------------------------------------------- <!-- ---------- Tafel ----------------------------------------------------
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
hinein, nicht ungefaehr. hinein, nicht ungefaehr.
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter; Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
je nach Fensterform schneidet der Browser oben/unten oder je nach Fensterform schneidet der Browser oben/unten oder
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
deckungsgleich mit dem Bild, und die Karte kann in Prozent des deckungsgleich mit dem Bild, und die Karte kann in Prozent des
BILDES sitzen statt in Prozent des Fensters. BILDES sitzen statt in Prozent des Fensters.
Er faengt keine Klicks ab (pointer-events: none); nur die Karte Er faengt keine Klicks ab (pointer-events: none); nur die Karte
darin ist bedienbar. --> darin ist bedienbar. -->
<div class="tafel-anker"> <div class="tafel-anker">
<main class="tafel" id="tafel"> <main class="tafel" id="tafel">
<div class="tafel__kante" aria-hidden="true"></div> <div class="tafel__kante" aria-hidden="true"></div>
<!-- 07.09.2026, Wunsch Filipe: "dogfather universe auch ersetzen durch <!-- 07.09.2026, Wunsch Filipe: "dogfather universe auch ersetzen durch
SpicyMedia x DogFather" und der Satz darunter soll "nur um manager SpicyMedia x DogFather" und der Satz darunter soll "nur um manager
scouts und creator von spicy media" gehen, ohne DogFather. scouts und creator von spicy media" gehen, ohne DogFather.
Das "x" steht als eigenes Element, damit es kleiner und in der Das "x" steht als eigenes Element, damit es kleiner und in der
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
aria-hidden nicht: Vorgelesen wird "SpicyMedia x DogFather", und aria-hidden nicht: Vorgelesen wird "SpicyMedia x DogFather", und
genau so spricht man es auch aus. --> genau so spricht man es auch aus. -->
<header class="kopf"> <header class="kopf">
<p class="marke marke--paar"> <p class="marke marke--paar">
<span class="marke__spicy">SpicyMedia</span> <span class="marke__spicy">SpicyMedia</span>
<span class="marke__x">×</span> <span class="marke__x">×</span>
<span class="marke__dogi">DogFather</span> <span class="marke__dogi">DogFather</span>
</p> </p>
<h1 class="titel">Creator&nbsp;Workspace</h1> <h1 class="titel">Creator&nbsp;Workspace</h1>
<p class="unterzeile">Privater Bereich für die Manager, Scouts und Creator von Spicy&nbsp;Media.</p> <p class="unterzeile">Privater Bereich für die Manager, Scouts und Creator von Spicy&nbsp;Media.</p>
</header> </header>
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild"> <div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
<p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p> <p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p>
<!-- SPICY MEDIA steht ganz oben (07.09.2026, Wunsch Filipe: "ueber <!-- SPICY MEDIA steht ganz oben (07.09.2026, Wunsch Filipe: "ueber
dogfather auch eine kategorie, eine neue rolle"). Der Chili ist dogfather auch eine kategorie, eine neue rolle"). Der Chili ist
das Zeichen der Marke -- dieselbe Form wie im Logo, nur als das Zeichen der Marke -- dieselbe Form wie im Logo, nur als
Umriss, damit sie neben Krone, Stern und Schild dieselbe Umriss, damit sie neben Krone, Stern und Schild dieselbe
Strichstaerke hat. --> Strichstaerke hat. -->
<button type="button" class="rolle" data-rolle="spicy" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="spicy" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-chili"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-chili"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Spicy Media</span> <span class="rolle__name">Spicy Media</span>
<span class="rolle__zusatz">Überblick über alle</span> <span class="rolle__zusatz">Überblick über alle</span>
</span> </span>
</button> </button>
<!-- DER HUSKY FÜR DOGFATHER (07.09.2026). Filipe: "bei dogfather ist <!-- DER HUSKY FÜR DOGFATHER (07.09.2026). Filipe: "bei dogfather ist
immer noch die krone und da soll ja ein husky sein" -- auf der immer noch die krone und da soll ja ein husky sein" -- auf der
Personenseite war er schon getauscht, hier nicht. Personenseite war er schon getauscht, hier nicht.
Bei 21 Pixeln entscheidet die SILHOUETTE, nicht das Detail: die Bei 21 Pixeln entscheidet die SILHOUETTE, nicht das Detail: die
spitzen aufrechten Ohren, der breite Kopf, der nach unten schmal spitzen aufrechten Ohren, der breite Kopf, der nach unten schmal
zuläuft, die Gesichtsmaske. Mehr passt nicht hinein, und mehr zuläuft, die Gesichtsmaske. Mehr passt nicht hinein, und mehr
braucht es nicht -- ein Husky ist an genau diesen drei Dingen braucht es nicht -- ein Husky ist an genau diesen drei Dingen
zu erkennen. zu erkennen.
Das Schild ist zum Scout gewandert: Ein Scout schirmt die Das Schild ist zum Scout gewandert: Ein Scout schirmt die
Pipeline ab und prüft, bevor etwas weitergereicht wird. --> Pipeline ab und prüft, bevor etwas weitergereicht wird. -->
<button type="button" class="rolle" data-rolle="admin" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="admin" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">DogFather</span> <span class="rolle__name">DogFather</span>
<!-- "Manager & Technik" statt "Gesamtübersicht & Freigaben" <!-- "Manager & Technik" statt "Gesamtübersicht & Freigaben"
(08.09.2026, screen27). Die alte Zeile beschrieb ein RECHT (08.09.2026, screen27). Die alte Zeile beschrieb ein RECHT
("darf alles sehen und freigeben"), die neue eine AUFGABE -- ("darf alles sehen und freigeben"), die neue eine AUFGABE --
und danach sucht jemand, der vor der Rollenwahl steht: Er und danach sucht jemand, der vor der Rollenwahl steht: Er
fragt sich nicht, was er dürfte, sondern was er hier tut. --> fragt sich nicht, was er dürfte, sondern was er hier tut. -->
<span class="rolle__zusatz">Manager &amp; Technik</span> <span class="rolle__zusatz">Manager &amp; Technik</span>
</span> </span>
</button> </button>
<!-- Manager: dieselben Rechte wie DogFather, nur die Personen- <!-- Manager: dieselben Rechte wie DogFather, nur die Personen-
verwaltung bleibt DogFather vorbehalten. Der Stern steht fuer verwaltung bleibt DogFather vorbehalten. Der Stern steht fuer
den Rang darunter, ohne "unter" zu sagen. --> den Rang darunter, ohne "unter" zu sagen. -->
<button type="button" class="rolle" data-rolle="manager" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="manager" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-stern"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-stern"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Manager</span> <span class="rolle__name">Manager</span>
<span class="rolle__zusatz">Betreuung &amp; Freigaben</span> <span class="rolle__zusatz">Betreuung &amp; Freigaben</span>
</span> </span>
</button> </button>
<button type="button" class="rolle" data-rolle="scout" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="scout" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-schutz"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-schutz"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Scout</span> <span class="rolle__name">Scout</span>
<span class="rolle__zusatz">Eigene Pipeline &amp; Kontakte</span> <span class="rolle__zusatz">Eigene Pipeline &amp; Kontakte</span>
</span> </span>
</button> </button>
<button type="button" class="rolle" data-rolle="creator" role="radio" aria-checked="false"> <button type="button" class="rolle" data-rolle="creator" role="radio" aria-checked="false">
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-person"/></svg> <svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-person"/></svg>
<span class="rolle__text"> <span class="rolle__text">
<span class="rolle__name">Creator</span> <span class="rolle__name">Creator</span>
<span class="rolle__zusatz">Eigener Bereich &amp; Fortschritt</span> <span class="rolle__zusatz">Eigener Bereich &amp; Fortschritt</span>
</span> </span>
</button> </button>
</div> </div>
<form class="formular" id="formular" novalidate> <form class="formular" id="formular" novalidate>
<label class="feldschild" for="code"> <label class="feldschild" for="code">
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span> Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
</label> </label>
<div class="feld"> <div class="feld">
<input type="password" id="code" name="code" inputmode="text" <input type="password" id="code" name="code" inputmode="text"
autocomplete="current-password" spellcheck="false" autocomplete="current-password" spellcheck="false"
placeholder="Code eingeben" aria-describedby="hinweis fehler" /> placeholder="Code eingeben" aria-describedby="hinweis fehler" />
<button type="button" class="feld__auge" id="auge" <button type="button" class="feld__auge" id="auge"
aria-label="Code anzeigen" aria-pressed="false"> aria-label="Code anzeigen" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"> <svg viewBox="0 0 24 24" aria-hidden="true">
<path class="strich" d="M2.5 12S6 5.8 12 5.8 21.5 12 21.5 12 18 18.2 12 18.2 2.5 12 2.5 12Z"/> <path class="strich" d="M2.5 12S6 5.8 12 5.8 21.5 12 21.5 12 18 18.2 12 18.2 2.5 12 2.5 12Z"/>
<circle class="strich" cx="12" cy="12" r="2.9"/> <circle class="strich" cx="12" cy="12" r="2.9"/>
<path class="strich durch" d="m4 20 16-16"/> <path class="strich durch" d="m4 20 16-16"/>
</svg> </svg>
</button> </button>
</div> </div>
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p> <p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<button type="submit" class="knopf" id="knopf"> <button type="submit" class="knopf" id="knopf">
<span class="knopf__text">Anmelden</span> <span class="knopf__text">Anmelden</span>
<span class="knopf__laden" aria-hidden="true"></span> <span class="knopf__laden" aria-hidden="true"></span>
</button> </button>
</form> </form>
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026). <!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
sagt, was jetzt zu tun ist. Für die Community ist das besonders sagt, was jetzt zu tun ist. Für die Community ist das besonders
teuer: Sie ist die einzige Rolle, die von außen kommt und teuer: Sie ist die einzige Rolle, die von außen kommt und
niemanden im Haus kennt. --> niemanden im Haus kennt. -->
<p class="fuss fuss--woher">Noch keinen Code? Den bekommst du von deinem Manager oder von DogFather.</p> <p class="fuss fuss--woher">Noch keinen Code? Den bekommst du von deinem Manager oder von DogFather.</p>
<p class="fuss"> <p class="fuss">
Verschlüsselte Verbindung · Zugriffe werden protokolliert Verschlüsselte Verbindung · Zugriffe werden protokolliert
</p> </p>
</main> </main>
</div> </div>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/gate.js?v=202609191915" defer></script> <script src="assets/js/gate.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+16 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/kalender.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -377,13 +377,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/kalender.js?v=202609191915" defer></script> <script src="assets/js/kalender.js?v=202609191956" defer></script>
<script src="assets/js/kalender-abo.js?v=202609191915" defer></script> <script src="assets/js/kalender-abo.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+15 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/leistung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -444,11 +444,12 @@
</form> </form>
</dialog> </dialog>
<script src="assets/js/meldung.js?v=202609191915"></script> <script src="assets/js/meldung.js?v=202609191956"></script>
<script src="assets/js/wahl.js?v=202609191915"></script> <script src="assets/js/nachfrage.js?v=202609191956"></script>
<script src="assets/js/bereiche.js?v=202609191915"></script> <script src="assets/js/wahl.js?v=202609191956"></script>
<script src="assets/js/kopf.js?v=202609191915"></script> <script src="assets/js/bereiche.js?v=202609191956"></script>
<script src="assets/js/glocke.js?v=202609191915"></script> <script src="assets/js/kopf.js?v=202609191956"></script>
<script src="assets/js/leistung.js?v=202609191915"></script> <script src="assets/js/glocke.js?v=202609191956"></script>
<script src="assets/js/leistung.js?v=202609191956"></script>
</body> </body>
</html> </html>
+15 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/personen.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -449,12 +449,13 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/personen.js?v=202609191915" defer></script> <script src="assets/js/personen.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+16 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -214,13 +214,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/steckbrief.js?v=202609191915" defer></script> <script src="assets/js/steckbrief.js?v=202609191956" defer></script>
<script src="assets/js/profil.js?v=202609191915" defer></script> <script src="assets/js/profil.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+14 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -134,10 +134,11 @@
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=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/rechte.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/rechte.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+118 -118
View File
@@ -1,118 +1,118 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Reports &amp; Review · Spicy & Dogi</title> <title>Reports &amp; Review · Spicy & Dogi</title>
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/report.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/report.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren <!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
Ecken, siehe start.css). Ein eigenes Element statt eines dritten Ecken, siehe start.css). Ein eigenes Element statt eines dritten
Pseudo-Elements -- body hat nur ::before und ::after. --> Pseudo-Elements -- body hat nur ::before und ::after. -->
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Review</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Review</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Reports</p> <p class="marke">Reports</p>
<h1 class="titel">Review &amp; nächste Schritte</h1> <h1 class="titel">Review &amp; nächste Schritte</h1>
<p class="unterzeile" id="unterzeile">Fortschritt wird nicht gefühlt, sondern nachvollziehbar gemacht.</p> <p class="unterzeile" id="unterzeile">Fortschritt wird nicht gefühlt, sondern nachvollziehbar gemacht.</p>
</div> </div>
<div class="steuerung"> <div class="steuerung">
<div id="creator-block" hidden> <div id="creator-block" hidden>
<label class="feld-schild" for="f-creator">Creator</label> <label class="feld-schild" for="f-creator">Creator</label>
<select id="f-creator"></select> <select id="f-creator"></select>
</div> </div>
<div> <div>
<label class="feld-schild" for="f-tage">Zeitraum</label> <label class="feld-schild" for="f-tage">Zeitraum</label>
<select id="f-tage"> <select id="f-tage">
<option value="7">7 Tage</option> <option value="7">7 Tage</option>
<option value="30" selected>30 Tage</option> <option value="30" selected>30 Tage</option>
<option value="90">90 Tage</option> <option value="90">90 Tage</option>
</select> </select>
</div> </div>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<div id="bericht" aria-busy="true"><p class="leise">Report wird erstellt …</p></div> <div id="bericht" aria-busy="true"><p class="leise">Report wird erstellt …</p></div>
<!-- Der Kern aus dem Konzept: Ein Review endet mit einer Entscheidung. --> <!-- Der Kern aus dem Konzept: Ein Review endet mit einer Entscheidung. -->
<section class="entscheidung" id="entscheidung-block" hidden> <section class="entscheidung" id="entscheidung-block" hidden>
<p class="marke">Abschluss</p> <p class="marke">Abschluss</p>
<h2 class="entscheidung__titel">Was ist die Entscheidung?</h2> <h2 class="entscheidung__titel">Was ist die Entscheidung?</h2>
<p class="entscheidung__text"> <p class="entscheidung__text">
Ein Review endet nicht mit einer Zusammenfassung, sondern mit einem nächsten Schritt. Ein Review endet nicht mit einer Zusammenfassung, sondern mit einem nächsten Schritt.
Was hier steht, wird sofort als Aufgabe mit hoher Priorität angelegt. Was hier steht, wird sofort als Aufgabe mit hoher Priorität angelegt.
</p> </p>
<form id="entscheidung"> <form id="entscheidung">
<div class="entscheidung__raster"> <div class="entscheidung__raster">
<div> <div>
<label class="feld-schild" for="e-titel">Nächster Schritt</label> <label class="feld-schild" for="e-titel">Nächster Schritt</label>
<input id="e-titel" maxlength="160" placeholder="z. B. Mikro-Problem bis Freitag lösen" required /> <input id="e-titel" maxlength="160" placeholder="z. B. Mikro-Problem bis Freitag lösen" required />
</div> </div>
<div> <div>
<label class="feld-schild" for="e-frist">Bis wann <span class="leise">(optional)</span></label> <label class="feld-schild" for="e-frist">Bis wann <span class="leise">(optional)</span></label>
<input id="e-frist" type="date" /> <input id="e-frist" type="date" />
</div> </div>
</div> </div>
<p class="fehler" id="e-fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="e-fehler" role="alert" aria-live="polite"></p>
<div class="neu__knoepfe"> <div class="neu__knoepfe">
<button type="submit" class="knopf knopf--klein" id="e-speichern">Als Aufgabe festhalten</button> <button type="submit" class="knopf knopf--klein" id="e-speichern">Als Aufgabe festhalten</button>
<span class="leise" id="e-stand"></span> <span class="leise" id="e-stand"></span>
</div> </div>
</form> </form>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/ki.js?v=202609191915" defer></script> <script src="assets/js/ki.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/report.js?v=202609191915" defer></script> <script src="assets/js/report.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+15 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/scouting.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -173,12 +173,13 @@
</div> </div>
</div> </div>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/scouting.js?v=202609191915" defer></script> <script src="assets/js/scouting.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+689 -689
View File
File diff suppressed because it is too large Load Diff
+97 -97
View File
@@ -1,97 +1,97 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Start-Check · Spicy & Dogi</title> <title>Start-Check · Spicy & Dogi</title>
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/startcheck.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren <!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
Ecken, siehe start.css). Ein eigenes Element statt eines dritten Ecken, siehe start.css). Ein eigenes Element statt eines dritten
Pseudo-Elements -- body hat nur ::before und ::after. --> Pseudo-Elements -- body hat nur ::before und ::after. -->
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Start-Check</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Start-Check</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Onboarding · Erstanalyse</p> <p class="marke">Onboarding · Erstanalyse</p>
<h1 class="titel">Start-Check</h1> <h1 class="titel">Start-Check</h1>
<p class="unterzeile" id="unterzeile"> <p class="unterzeile" id="unterzeile">
Ausgangslage verstehen – und daraus konkrete Arbeitspakete bauen. Ausgangslage verstehen – und daraus konkrete Arbeitspakete bauen.
</p> </p>
</div> </div>
<div class="steuerung"> <div class="steuerung">
<div id="creator-block" hidden> <div id="creator-block" hidden>
<label class="feld-schild" for="f-creator">Creator</label> <label class="feld-schild" for="f-creator">Creator</label>
<select id="f-creator"></select> <select id="f-creator"></select>
</div> </div>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<section class="fortschritt" id="fortschritt" hidden> <section class="fortschritt" id="fortschritt" hidden>
<div class="fortschritt__kopf"> <div class="fortschritt__kopf">
<span class="fortschritt__zahl" id="f-zahl">0 von 16</span> <span class="fortschritt__zahl" id="f-zahl">0 von 16</span>
<span class="fortschritt__text" id="f-text">Punkten geprüft</span> <span class="fortschritt__text" id="f-text">Punkten geprüft</span>
</div> </div>
<div class="fortschritt__balken" role="progressbar" aria-valuemin="0" aria-valuemax="16" <div class="fortschritt__balken" role="progressbar" aria-valuemin="0" aria-valuemax="16"
aria-valuenow="0" id="f-balken-aussen"> aria-valuenow="0" id="f-balken-aussen">
<div class="fortschritt__fuellung" id="f-balken"></div> <div class="fortschritt__fuellung" id="f-balken"></div>
</div> </div>
<p class="fortschritt__hinweis" id="f-hinweis"></p> <p class="fortschritt__hinweis" id="f-hinweis"></p>
</section> </section>
<div id="felder" aria-busy="true"><p class="leise">Start-Check wird geladen …</p></div> <div id="felder" aria-busy="true"><p class="leise">Start-Check wird geladen …</p></div>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/ki.js?v=202609191915" defer></script> <script src="assets/js/ki.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/startcheck.js?v=202609191915" defer></script> <script src="assets/js/startcheck.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+16 -15
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -150,13 +150,14 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/auskunft.js?v=202609191915" defer></script> <script src="assets/js/auskunft.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/steckbrief.js?v=202609191915" defer></script> <script src="assets/js/steckbrief.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+15 -14
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -111,11 +111,12 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/talente.js?v=202609191915" defer></script> <script src="assets/js/talente.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+121 -121
View File
@@ -1,121 +1,121 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Team · Spicy &amp; Dogi</title> <title>Team · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Team</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Team</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<!-- ==== DER KOPF ================================================ <!-- ==== DER KOPF ================================================
Er sagt in einem Satz, was diese Seite ist UND was sie nicht Er sagt in einem Satz, was diese Seite ist UND was sie nicht
ist. Der zweite Teil ist der wichtigere: Eine Seite mit Zahlen ist. Der zweite Teil ist der wichtigere: Eine Seite mit Zahlen
über Kollegen wird sonst als Überwachung gelesen -- und dann über Kollegen wird sonst als Überwachung gelesen -- und dann
arbeitet niemand mehr offen damit. arbeitet niemand mehr offen damit.
Aus der Recherche (Fachliteratur zu Arbeitslast-Dashboards): Aus der Recherche (Fachliteratur zu Arbeitslast-Dashboards):
Der Zweck ist, Stellen zu finden, an denen Unterstützung fehlt. Der Zweck ist, Stellen zu finden, an denen Unterstützung fehlt.
Wer das nicht dazuschreibt, baut ein Kontrollwerkzeug, auch wenn Wer das nicht dazuschreibt, baut ein Kontrollwerkzeug, auch wenn
er es nicht wollte. --> er es nicht wollte. -->
<!-- ==== EINE ECHTE KACHEL, IM TON DER KATEGORIE (09.09.2026) ==== <!-- ==== EINE ECHTE KACHEL, IM TON DER KATEGORIE (09.09.2026) ====
Filipe: "perfektionnir das in einer kachel in der farbe von der Filipe: "perfektionnir das in einer kachel in der farbe von der
kategorie bitte." kategorie bitte."
`t-kachel` steht in der Modulliste von module.css und bekommt `t-kachel` steht in der Modulliste von module.css und bekommt
damit dieselbe Form wie jede Kachel im Haus: gefraeste Fase oben damit dieselbe Form wie jede Kachel im Haus: gefraeste Fase oben
links, Kantenlicht, Eckwinkel, Raster. Die FARBE kommt aus links, Kantenlicht, Eckwinkel, Raster. Die FARBE kommt aus
`--ton` -- derselben Variablen, aus der die Kachel auf der `--ton` -- derselben Variablen, aus der die Kachel auf der
Startseite ihren Ton zieht, und dort ist es Ton 22 (#ffd166). Startseite ihren Ton zieht, und dort ist es Ton 22 (#ffd166).
Beide lesen dieselbe Zahl; die Kachel auf der Startseite und die Beide lesen dieselbe Zahl; die Kachel auf der Startseite und die
Ueberschrift hier koennen also nicht auseinanderlaufen. --> Ueberschrift hier koennen also nicht auseinanderlaufen. -->
<section class="t-kachel" data-ton="22"> <section class="t-kachel" data-ton="22">
<div class="t-kopf"> <div class="t-kopf">
<div class="t-kopf__text"> <div class="t-kopf__text">
<p class="feldschild">Rund um das Team</p> <p class="feldschild">Rund um das Team</p>
<h1 class="t-kopf__titel">Manager &amp; Scouts</h1> <h1 class="t-kopf__titel">Manager &amp; Scouts</h1>
<p class="t-kopf__unter" id="kopf-unter"> <p class="t-kopf__unter" id="kopf-unter">
Wer betreut wen, wo staut sich etwas, wo fehlt jemand. Wer betreut wen, wo staut sich etwas, wo fehlt jemand.
</p> </p>
</div> </div>
<p class="t-kopf__grenze"> <p class="t-kopf__grenze">
Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte
noch Zahlen. Das ist eine <strong>Arbeitslage</strong>, keine Überwachung. noch Zahlen. Das ist eine <strong>Arbeitslage</strong>, keine Überwachung.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- ==== DIE LÜCKEN ZUERST ====================================== <!-- ==== DIE LÜCKEN ZUERST ======================================
Eine Kennzahl sagt, wie es läuft. Eine Lücke sagt, wo etwas Eine Kennzahl sagt, wie es läuft. Eine Lücke sagt, wo etwas
fehlt -- und nur das Zweite kann man heute abstellen. Deshalb fehlt -- und nur das Zweite kann man heute abstellen. Deshalb
steht sie oben und nicht unter den Tabellen. --> steht sie oben und nicht unter den Tabellen. -->
<section class="t-luecken" id="luecken" hidden></section> <section class="t-luecken" id="luecken" hidden></section>
<!-- ==== DIE LAGE IN ZAHLEN ===================================== --> <!-- ==== DIE LAGE IN ZAHLEN ===================================== -->
<section class="t-lage" id="lage" hidden></section> <section class="t-lage" id="lage" hidden></section>
<!-- ==== DIE LEUTE ============================================== <!-- ==== DIE LEUTE ==============================================
Jede Person einzeln, nicht als Durchschnitt: Zwei Scouts mit je Jede Person einzeln, nicht als Durchschnitt: Zwei Scouts mit je
sechs Creators und einer mit achtzehn ergeben einen Schnitt von sechs Creators und einer mit achtzehn ergeben einen Schnitt von
zehn -- und der sagt nichts über den, bei dem es klemmt. --> zehn -- und der sagt nichts über den, bei dem es klemmt. -->
<section class="t-gruppe" id="manager-block" hidden> <section class="t-gruppe" id="manager-block" hidden>
<h2 class="feldschild">Manager</h2> <h2 class="feldschild">Manager</h2>
<div class="t-liste" id="manager-liste"></div> <div class="t-liste" id="manager-liste"></div>
</section> </section>
<section class="t-gruppe" id="scout-block" hidden> <section class="t-gruppe" id="scout-block" hidden>
<h2 class="feldschild">Scouts</h2> <h2 class="feldschild">Scouts</h2>
<div class="t-liste" id="scout-liste"></div> <div class="t-liste" id="scout-liste"></div>
</section> </section>
<p class="leise" id="laedt">Die Arbeitslage wird geladen …</p> <p class="leise" id="laedt">Die Arbeitslage wird geladen …</p>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/team.js?v=202609191915" defer></script> <script src="assets/js/team.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+93 -93
View File
@@ -1,93 +1,93 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Dein Team · Spicy &amp; Dogi</title> <title>Dein Team · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</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
dieser Seite kommt vom Server, `zuSeite()` in bereiche.js findet dieser Seite kommt vom Server, `zuSeite()` in bereiche.js findet
sie deshalb nicht -- und ohne Fund griff der Rueckfall, also die sie deshalb nicht -- und ohne Fund griff der Rueckfall, also die
Szene der anderen Marke. Eine Seite mit genau einer Buehne Szene der anderen Marke. Eine Seite mit genau einer Buehne
braucht dafuer kein Skript. --> braucht dafuer kein Skript. -->
<body class="start" data-buehne="eingang"> <body class="start" data-buehne="eingang">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Dein Team</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Dein Team</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<!-- ==== DER KOPF ================================================ <!-- ==== DER KOPF ================================================
Er sagt, was diese Seite ist UND was sie nicht ist. Der zweite Er sagt, was diese Seite ist UND was sie nicht ist. Der zweite
Teil ist der wichtigere -- dieselbe Ueberlegung steht schon Teil ist der wichtigere -- dieselbe Ueberlegung steht schon
ueber team.html: Eine Seite mit Zahlen ueber Kollegen wird sonst ueber team.html: Eine Seite mit Zahlen ueber Kollegen wird sonst
als Kontrolle gelesen, und dann arbeitet niemand mehr offen als Kontrolle gelesen, und dann arbeitet niemand mehr offen
damit. damit.
"Offen" heisst hier deshalb ausdruecklich: darueber habt ihr "Offen" heisst hier deshalb ausdruecklich: darueber habt ihr
noch nicht geredet. Es ist eine Liste fuer euch beide, keine noch nicht geredet. Es ist eine Liste fuer euch beide, keine
Note fuer den anderen. --> Note fuer den anderen. -->
<section class="t-kachel"> <section class="t-kachel">
<div class="t-kopf"> <div class="t-kopf">
<div class="t-kopf__text"> <div class="t-kopf__text">
<p class="feldschild">Zusammen</p> <p class="feldschild">Zusammen</p>
<h1 class="t-kopf__titel">Was auf dich wartet</h1> <h1 class="t-kopf__titel">Was auf dich wartet</h1>
<p class="t-kopf__unter" id="kopf-unter">…</p> <p class="t-kopf__unter" id="kopf-unter">…</p>
<p class="t-kopf__grenze"> <p class="t-kopf__grenze">
Was hier steht, ist eine Merkliste für euch beide – keine Bewertung Was hier steht, ist eine Merkliste für euch beide – keine Bewertung
von Menschen. „Offen“ heißt: darüber habt ihr noch nicht gesprochen. von Menschen. „Offen“ heißt: darüber habt ihr noch nicht gesprochen.
Eingeschätzt wird dort, wo die Punkte stehen; jede Zahl führt dorthin. Eingeschätzt wird dort, wo die Punkte stehen; jede Zahl führt dorthin.
</p> </p>
</div> </div>
</div> </div>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
</section> </section>
<section class="t-lage" id="lage" aria-busy="true"></section> <section class="t-lage" id="lage" aria-busy="true"></section>
</main> </main>
<!-- wahl.js VOR kopf.js (nachgetragen 10.09.2026). <!-- wahl.js VOR kopf.js (nachgetragen 10.09.2026).
kopf.js baut den Sicht-Umschalter; ohne wahl.js sieht er aus wie kopf.js baut den Sicht-Umschalter; ohne wahl.js sieht er aus wie
ein blankes Browser-Auswahlfeld statt wie der Rest des Hauses. ein blankes Browser-Auswahlfeld statt wie der Rest des Hauses.
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=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/teamlage.js?v=202609191915" defer></script> <script src="assets/js/teamlage.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+122 -122
View File
@@ -1,122 +1,122 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Video übernehmen · Spicy &amp; Dogi</title> <title>Video übernehmen · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Video übernehmen</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Video übernehmen</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt"> <main class="inhalt">
<!-- ================================================================== <!-- ==================================================================
AUS „TEILEN" WIRD EIN TIPP (17.09.2026) AUS „TEILEN" WIRD EIN TIPP (17.09.2026)
Schritt 4 aus dem Video-Plan. Schritt 4 aus dem Video-Plan.
Filipe postet ein Video auf dem Handy. Bisher hätte er den Link Filipe postet ein Video auf dem Handy. Bisher hätte er den Link
kopieren, die App öffnen, den richtigen Bereich suchen und das kopieren, die App öffnen, den richtigen Bereich suchen und das
Feld finden müssen – fünf Schritte, von denen jeder einzelne der Feld finden müssen – fünf Schritte, von denen jeder einzelne der
Grund sein kann, es später zu machen. Und später heißt nie. Grund sein kann, es später zu machen. Und später heißt nie.
Jetzt: in TikTok auf „Teilen", „DogFather" wählen, fertig. Diese Jetzt: in TikTok auf „Teilen", „DogFather" wählen, fertig. Diese
Seite ist das Ziel dieses Tipps. Seite ist das Ziel dieses Tipps.
WARUM SIE NICHT SOFORT EINTRÄGT: Weil sie nicht wissen kann, ob WARUM SIE NICHT SOFORT EINTRÄGT: Weil sie nicht wissen kann, ob
der Griff in die Tasche gemeint war. Ein Video, das ungefragt in der Griff in die Tasche gemeint war. Ein Video, das ungefragt in
den Highlights landet, muss jemand wieder löschen – und das ist den Highlights landet, muss jemand wieder löschen – und das ist
mehr Arbeit als ein Tipp auf „Übernehmen". Sie zeigt also, was mehr Arbeit als ein Tipp auf „Übernehmen". Sie zeigt also, was
sie verstanden hat, und wartet auf eine Bestätigung. sie verstanden hat, und wartet auf eine Bestätigung.
WOHIN, IST EINE FRAGE UND KEINE ANNAHME: Highlights sind WOHIN, IST EINE FRAGE UND KEINE ANNAHME: Highlights sind
vorausgewählt, weil dort die Videos hingehören. Aber ein Clip vorausgewählt, weil dort die Videos hingehören. Aber ein Clip
kann auch eine Antwort auf einen Wunsch sein. kann auch eine Antwort auf einen Wunsch sein.
============================================================== --> ============================================================== -->
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Geteilt</p> <p class="marke">Geteilt</p>
<h1 class="titel">Video übernehmen</h1> <h1 class="titel">Video übernehmen</h1>
<p class="unterzeile"> <p class="unterzeile">
Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen. Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<section class="tl-seite" id="teilen" aria-busy="true"> <section class="tl-seite" id="teilen" aria-busy="true">
<p class="leise" id="ladezeile">einen Moment …</p> <p class="leise" id="ladezeile">einen Moment …</p>
<!-- Was angekommen ist. Steht ganz oben, weil es die erste Frage <!-- Was angekommen ist. Steht ganz oben, weil es die erste Frage
beantwortet: „hat er den richtigen Link erwischt?" --> beantwortet: „hat er den richtigen Link erwischt?" -->
<div class="tl-fund" id="fund" hidden> <div class="tl-fund" id="fund" hidden>
<p class="tl-label">Dieser Link ist angekommen:</p> <p class="tl-label">Dieser Link ist angekommen:</p>
<p class="tl-url" id="url-text"></p> <p class="tl-url" id="url-text"></p>
</div> </div>
<!-- Wohin. --> <!-- Wohin. -->
<div class="tl-wahl" id="wahl" hidden> <div class="tl-wahl" id="wahl" hidden>
<p class="tl-label" id="wohin-label">Wohin soll es?</p> <p class="tl-label" id="wohin-label">Wohin soll es?</p>
<div class="tl-bretter" role="group" aria-labelledby="wohin-label" id="bretter"></div> <div class="tl-bretter" role="group" aria-labelledby="wohin-label" id="bretter"></div>
</div> </div>
<div class="tl-knoepfe" id="knoepfe" hidden> <div class="tl-knoepfe" id="knoepfe" hidden>
<button type="button" class="knopf" id="uebernehmen">Übernehmen</button> <button type="button" class="knopf" id="uebernehmen">Übernehmen</button>
<a class="schritt" href="start.html" id="abbrechen">Doch nicht</a> <a class="schritt" href="start.html" id="abbrechen">Doch nicht</a>
</div> </div>
<!-- Wenn gar kein Link dabei war. Kein Formular als Strafe, sondern <!-- Wenn gar kein Link dabei war. Kein Formular als Strafe, sondern
ein Feld zum Einfügen – man ist ja schon hier. --> ein Feld zum Einfügen – man ist ja schon hier. -->
<div class="tl-haendisch" id="haendisch" hidden> <div class="tl-haendisch" id="haendisch" hidden>
<label class="tl-label" for="eingabe">Link zum Video</label> <label class="tl-label" for="eingabe">Link zum Video</label>
<input type="url" id="eingabe" inputmode="url" autocomplete="off" <input type="url" id="eingabe" inputmode="url" autocomplete="off"
placeholder="https://www.tiktok.com/@dogfather0804/video/…" /> placeholder="https://www.tiktok.com/@dogfather0804/video/…" />
</div> </div>
<!-- Das Ergebnis. --> <!-- Das Ergebnis. -->
<div class="tl-fertig" id="fertig" hidden> <div class="tl-fertig" id="fertig" hidden>
<p class="tl-fertig-satz" id="fertig-satz"></p> <p class="tl-fertig-satz" id="fertig-satz"></p>
<div class="tl-knoepfe"> <div class="tl-knoepfe">
<a class="knopf" id="hin" href="start.html">Ansehen</a> <a class="knopf" id="hin" href="start.html">Ansehen</a>
<a class="schritt" href="start.html">Fertig</a> <a class="schritt" href="start.html">Fertig</a>
</div> </div>
</div> </div>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/teilen.js?v=202609191915" defer></script> <script src="assets/js/teilen.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+14 -13
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" /> <link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -126,11 +126,12 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/treff-moderation.js?v=202609191915" defer></script> <script src="assets/js/treff-moderation.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+231 -231
View File
@@ -1,231 +1,231 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Die Regeln · Der Treff</title> <title>Die Regeln · Der Treff</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des <!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css Treffs 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · Regeln</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · Regeln</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt"> <main class="inhalt">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Der Treff</p> <p class="marke">Der Treff</p>
<!-- HIESS BIS ZUM 18.09.2026 „Regeln & Hilfe" -- genau wie das <!-- HIESS BIS ZUM 18.09.2026 „Regeln & Hilfe" -- genau wie das
BRETT, auf das der Absatz weiter unten verweist. Auf dem BRETT, auf das der Absatz weiter unten verweist. Auf dem
Brett stand damit ein Link „Regeln & Hilfe", der auf eine Brett stand damit ein Link „Regeln & Hilfe", der auf eine
Seite namens „Regeln & Hilfe" fuehrte; wer ihn drueckte, Seite namens „Regeln & Hilfe" fuehrte; wer ihn drueckte,
glaubte, im Kreis gelaufen zu sein. glaubte, im Kreis gelaufen zu sein.
Die beiden sind verschiedene Dinge: Hier stehen die fuenf Die beiden sind verschiedene Dinge: Hier stehen die fuenf
Regeln, kurz und fest. Das Brett sammelt daneben haeufige Regeln, kurz und fest. Das Brett sammelt daneben haeufige
Fragen, Hilfe und was im Einzelfall passiert. Zwei Namen Fragen, Hilfe und was im Einzelfall passiert. Zwei Namen
fuer zwei Sachen. --> fuer zwei Sachen. -->
<h1 class="titel">Die Regeln</h1> <h1 class="titel">Die Regeln</h1>
<p class="unterzeile"> <p class="unterzeile">
Kurz, in normaler Sprache, und alles, was hier steht, gilt auch. Kurz, in normaler Sprache, und alles, was hier steht, gilt auch.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- ================================================================== <!-- ==================================================================
WARUM DER TEXT HIER STEHT UND DIE ZAHLEN NICHT WARUM DER TEXT HIER STEHT UND DIE ZAHLEN NICHT
Die Saetze sind Text und gehoeren in eine Datei. Die ZAHLEN Die Saetze sind Text und gehoeren in eine Datei. Die ZAHLEN
darin (sieben Tage, dreissig Tage, drei Beitraege, drei darin (sieben Tage, dreissig Tage, drei Beitraege, drei
Anschlaege, 18 Jahre) kommen vom Server -- sie stehen im Code, Anschlaege, 18 Jahre) kommen vom Server -- sie stehen im Code,
und ein Regeltext, der eine andere Zahl nennt als die Regel, ist und ein Regeltext, der eine andere Zahl nennt als die Regel, ist
schlimmer als gar keiner: Niemand merkt es, und wer es merkt, schlimmer als gar keiner: Niemand merkt es, und wer es merkt,
glaubt dem Text. glaubt dem Text.
Die Platzhalter tragen deshalb "…" als Vorgabe. Kommt die Die Platzhalter tragen deshalb "…" als Vorgabe. Kommt die
Antwort nicht, steht dort sichtbar nichts -- und nicht Antwort nicht, steht dort sichtbar nichts -- und nicht
versehentlich eine Zahl von gestern. versehentlich eine Zahl von gestern.
============================================================== --> ============================================================== -->
<section class="treff-abschnitt" id="willkommen"> <section class="treff-abschnitt" id="willkommen">
<h2 class="treff-abschnitt__titel">Schön, dass du da bist</h2> <h2 class="treff-abschnitt__titel">Schön, dass du da bist</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<p> <p>
Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt, Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt,
was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich – was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich –
du bist hier, weil dir jemand einen Code gegeben hat. du bist hier, weil dir jemand einen Code gegeben hat.
</p> </p>
<p class="leise"> <p class="leise">
Gib diesen Code nicht weiter. Er gehört zu dir, und was damit Gib diesen Code nicht weiter. Er gehört zu dir, und was damit
geschrieben wird, steht unter deinem Namen. geschrieben wird, steht unter deinem Namen.
</p> </p>
</div> </div>
</section> </section>
<section class="treff-abschnitt"> <section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Die fünf Regeln</h2> <h2 class="treff-abschnitt__titel">Die fünf Regeln</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<ol class="regel-liste"> <ol class="regel-liste">
<li><strong>Sei anständig.</strong> Keine Beleidigungen, keine Angriffe <li><strong>Sei anständig.</strong> Keine Beleidigungen, keine Angriffe
auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung – auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung –
über einen Menschen nicht.</li> über einen Menschen nicht.</li>
<li><strong>Keine privaten Daten.</strong> Keine Adressen, keine <li><strong>Keine privaten Daten.</strong> Keine Adressen, keine
Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir
selbst, es liest mehr mit, als du denkst.</li> selbst, es liest mehr mit, als du denkst.</li>
<li><strong>Nichts Fremdes hochladen.</strong> Was du einstellst, muss <li><strong>Nichts Fremdes hochladen.</strong> Was du einstellst, muss
von dir sein oder dir gehören.</li> von dir sein oder dir gehören.</li>
<li><strong>Keine Werbung, kein Verkauf.</strong> Auch nicht für <li><strong>Keine Werbung, kein Verkauf.</strong> Auch nicht für
andere Streams.</li> andere Streams.</li>
<li><strong>Was hier passiert, bleibt hier.</strong> Keine <li><strong>Was hier passiert, bleibt hier.</strong> Keine
Bildschirmfotos nach draußen.</li> Bildschirmfotos nach draußen.</li>
</ol> </ol>
</div> </div>
</section> </section>
<section class="treff-abschnitt"> <section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Wie du weiterkommst</h2> <h2 class="treff-abschnitt__titel">Wie du weiterkommst</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<p> <p>
In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen. In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen.
Das ist kein Misstrauen gegen dich – es ist eines gegen Das ist kein Misstrauen gegen dich – es ist eines gegen
Wegwerf-Zugänge. Wegwerf-Zugänge.
</p> </p>
<ul class="regel-liste" id="stufen"> <ul class="regel-liste" id="stufen">
<li class="leise">wird geladen …</li> <li class="leise">wird geladen …</li>
</ul> </ul>
</div> </div>
</section> </section>
<section class="treff-abschnitt"> <section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Wenn etwas nicht stimmt</h2> <h2 class="treff-abschnitt__titel">Wenn etwas nicht stimmt</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<p> <p>
An jedem Beitrag, der nicht von dir ist, steht <strong>melden</strong>. An jedem Beitrag, der nicht von dir ist, steht <strong>melden</strong>.
Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das
können wir es nicht prüfen. können wir es nicht prüfen.
</p> </p>
<p> <p>
Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir
fest, <strong>warum</strong> – und die Person, die ihn geschrieben hat, fest, <strong>warum</strong> – und die Person, die ihn geschrieben hat,
erfährt den Grund. Das ist keine Höflichkeit, sondern erfährt den Grund. Das ist keine Höflichkeit, sondern
<span class="leise">Artikel 17 des Digital Services Act</span>. <span class="leise">Artikel 17 des Digital Services Act</span>.
</p> </p>
<p class="leise" id="kontakt"> <p class="leise" id="kontakt">
Du erreichst uns außerdem direkt: Schreib es auf das Brett Du erreichst uns außerdem direkt: Schreib es auf das Brett
<a href="bereich.html?b=treff">Der Treff</a> oder sag es <span <a href="bereich.html?b=treff">Der Treff</a> oder sag es <span
id="kontakt-wem">jemandem aus dem Team</span>. id="kontakt-wem">jemandem aus dem Team</span>.
</p> </p>
<p class="leise"> <p class="leise">
Häufige Fragen und Antworten stehen auf dem Brett Häufige Fragen und Antworten stehen auf dem Brett
<a href="bereich.html?b=regeln">Regeln &amp; Hilfe</a>. <a href="bereich.html?b=regeln">Regeln &amp; Hilfe</a>.
</p> </p>
</div> </div>
</section> </section>
<section class="treff-abschnitt"> <section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Was passiert, wenn jemand sich nicht daran hält</h2> <h2 class="treff-abschnitt__titel">Was passiert, wenn jemand sich nicht daran hält</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<p>Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:</p> <p>Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:</p>
<ol class="regel-liste"> <ol class="regel-liste">
<li><strong>Hinweis.</strong> Jemand sagt dir, was nicht ging.</li> <li><strong>Hinweis.</strong> Jemand sagt dir, was nicht ging.</li>
<li><strong>Pause.</strong> Ein paar Tage nichts schreiben. Lesen <li><strong>Pause.</strong> Ein paar Tage nichts schreiben. Lesen
geht weiter.</li> geht weiter.</li>
<li><strong>Ende.</strong> Der Zugang wird geschlossen.</li> <li><strong>Ende.</strong> Der Zugang wird geschlossen.</li>
</ol> </ol>
<p class="leise" id="ausschluss">…</p> <p class="leise" id="ausschluss">…</p>
</div> </div>
</section> </section>
<section class="treff-abschnitt"> <section class="treff-abschnitt">
<h2 class="treff-abschnitt__titel">Das Kleingedruckte – kurz</h2> <h2 class="treff-abschnitt__titel">Das Kleingedruckte – kurz</h2>
<div class="treff-abschnitt__inhalt"> <div class="treff-abschnitt__inhalt">
<p id="alter">…</p> <p id="alter">…</p>
<p> <p>
<strong>Was gespeichert wird:</strong> dein Name, dein Zugangscode <strong>Was gespeichert wird:</strong> dein Name, dein Zugangscode
(verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann (verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann
du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs, du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs,
keine Weitergabe an Dritte. keine Weitergabe an Dritte.
</p> </p>
<p> <p>
<strong>Du willst weg?</strong> Sag Bescheid. Dein Zugang wird <strong>Du willst weg?</strong> Sag Bescheid. Dein Zugang wird
geschlossen und deine Beiträge werden entfernt. geschlossen und deine Beiträge werden entfernt.
</p> </p>
<p class="leise"> <p class="leise">
Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine
Direktnachrichten zwischen Mitgliedern – absichtlich: Ein Direktnachrichten zwischen Mitgliedern – absichtlich: Ein
öffentlicher Raum lässt sich moderieren, ein privater nicht. öffentlicher Raum lässt sich moderieren, ein privater nicht.
</p> </p>
</div> </div>
</section> </section>
<!-- ==== WAS IST ÜBER MICH GESPEICHERT? (15.09.2026) ============== <!-- ==== WAS IST ÜBER MICH GESPEICHERT? (15.09.2026) ==============
Art. 15 DSGVO. Kein Antrag, kein Formular, kein Warten – ein Art. 15 DSGVO. Kein Antrag, kein Formular, kein Warten – ein
Knopf. Er steht auf den beiden Seiten, die einem Menschen selbst Knopf. Er steht auf den beiden Seiten, die einem Menschen selbst
gehören: dem Steckbrief und den Treff-Regeln. Die Community hat gehören: dem Steckbrief und den Treff-Regeln. Die Community hat
keinen Steckbrief; ohne die zweite Stelle hätte ausgerechnet die keinen Steckbrief; ohne die zweite Stelle hätte ausgerechnet die
Gruppe mit den wenigsten Rechten auch diesen nicht. --> Gruppe mit den wenigsten Rechten auch diesen nicht. -->
<section class="meine-daten"> <section class="meine-daten">
<div class="meine-daten__kopf"> <div class="meine-daten__kopf">
<h2 class="meine-daten__titel">Was ist über mich gespeichert?</h2> <h2 class="meine-daten__titel">Was ist über mich gespeichert?</h2>
<button type="button" class="knopf-still" id="auskunft-knopf">Datei herunterladen</button> <button type="button" class="knopf-still" id="auskunft-knopf">Datei herunterladen</button>
</div> </div>
<p class="meine-daten__satz"> <p class="meine-daten__satz">
Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen. Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen.
Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen, Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen,
stehen sie nicht mit Namen darin – ihre Daten gehören ihnen. stehen sie nicht mit Namen darin – ihre Daten gehören ihnen.
</p> </p>
<p class="leise" id="auskunft-stand" hidden></p> <p class="leise" id="auskunft-stand" hidden></p>
</section> </section>
</main> </main>
<!-- WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN (Regel seit 07.09.2026). <!-- WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN (Regel seit 07.09.2026).
Der Umschalter "Meine Sicht" in der Kopfleiste ist ein selbst Der Umschalter "Meine Sicht" in der Kopfleiste ist ein selbst
gebautes Bedienelement; dahinter liegt ein unsichtbares Systemfeld gebautes Bedienelement; dahinter liegt ein unsichtbares Systemfeld
fuer Vorleseprogramme. Ohne wahl.js faellt kopf.js auf dieses Feld fuer Vorleseprogramme. Ohne wahl.js faellt kopf.js auf dieses Feld
zurueck -- ein grauer Kasten von 92 x 19 Pixeln mit weisser zurueck -- ein grauer Kasten von 92 x 19 Pixeln mit weisser
Schrift, mitten in einer dunklen Leiste. Schrift, mitten in einer dunklen Leiste.
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=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/auskunft.js?v=202609191915" defer></script> <script src="assets/js/auskunft.js?v=202609191956" defer></script>
<script src="assets/js/treff-regeln.js?v=202609191915" defer></script> <script src="assets/js/treff-regeln.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+161 -161
View File
@@ -1,161 +1,161 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Dashboard · Spicy & Dogi</title> <title>Dashboard · Spicy & Dogi</title>
<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" />
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft. <!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren <!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
Ecken, siehe start.css). Ein eigenes Element statt eines dritten Ecken, siehe start.css). Ein eigenes Element statt eines dritten
Pseudo-Elements -- body hat nur ::before und ::after. --> Pseudo-Elements -- body hat nur ::before und ::after. -->
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Dashboard</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> · Dashboard</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Alles zentral</p> <p class="marke">Alles zentral</p>
<h1 class="titel" id="titel">Dashboard</h1> <h1 class="titel" id="titel">Dashboard</h1>
<p class="unterzeile" id="unterzeile"> <p class="unterzeile" id="unterzeile">
Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft. Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft.
</p> </p>
</div> </div>
<!-- Der Knopf steht HIER und nicht in der Personenverwaltung <!-- Der Knopf steht HIER und nicht in der Personenverwaltung
(07.09.2026). Ein Manager kommt dort gar nicht hinein, und er (07.09.2026). Ein Manager kommt dort gar nicht hinein, und er
soll es auch nicht -- dahinter liegen Rollen, Codes, Sperren und soll es auch nicht -- dahinter liegen Rollen, Codes, Sperren und
das Protokoll. Hier dagegen sieht er ohnehin seine Creator; der das Protokoll. Hier dagegen sieht er ohnehin seine Creator; der
neue erscheint eine Zeile weiter unten. Das Skript blendet den neue erscheint eine Zeile weiter unten. Das Skript blendet den
Knopf für Scouts und Creator aus, der Server lässt sie ohnehin Knopf für Scouts und Creator aus, der Server lässt sie ohnehin
nicht durch. --> nicht durch. -->
<button type="button" class="knopf knopf--klein" id="creator-neu" hidden>Creator anlegen</button> <button type="button" class="knopf knopf--klein" id="creator-neu" hidden>Creator anlegen</button>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- Creator anlegen. Derselbe Dialog-Aufbau wie überall sonst. --> <!-- Creator anlegen. Derselbe Dialog-Aufbau wie überall sonst. -->
<dialog class="dialog" id="creator-dialog"> <dialog class="dialog" id="creator-dialog">
<form method="dialog" class="neu neu--blank" id="creator-form"> <form method="dialog" class="neu neu--blank" id="creator-form">
<h2 class="dialog__titel">Creator anlegen</h2> <h2 class="dialog__titel">Creator anlegen</h2>
<p class="dialog__unter"> <p class="dialog__unter">
Der Zugangscode erscheint genau einmal – danach ist er weg und Der Zugangscode erscheint genau einmal – danach ist er weg und
kann nur neu gesetzt werden. kann nur neu gesetzt werden.
</p> </p>
<div class="neu__zeile"> <div class="neu__zeile">
<label class="feld-schild" for="cn-name">Name</label> <label class="feld-schild" for="cn-name">Name</label>
<input id="cn-name" maxlength="60" required autocomplete="off" /> <input id="cn-name" maxlength="60" required autocomplete="off" />
</div> </div>
<div class="neu__zeile" id="cn-scout-zeile" hidden> <div class="neu__zeile" id="cn-scout-zeile" hidden>
<label class="feld-schild" for="cn-scout">Betreuung</label> <label class="feld-schild" for="cn-scout">Betreuung</label>
<select id="cn-scout"></select> <select id="cn-scout"></select>
<p class="feld-hinweis"> <p class="feld-hinweis">
Ohne Auswahl betreust du ihn selbst. Zur Auswahl stehen nur Ohne Auswahl betreust du ihn selbst. Zur Auswahl stehen nur
deine eigenen Scouts. deine eigenen Scouts.
</p> </p>
</div> </div>
<!-- Der Code. Steht erst nach dem Anlegen da und wird nie <!-- Der Code. Steht erst nach dem Anlegen da und wird nie
nachgeladen -- die Seite ist die einzige Stelle, an der er je nachgeladen -- die Seite ist die einzige Stelle, an der er je
zu sehen ist. --> zu sehen ist. -->
<div class="neu__zeile" id="cn-code-zeile" hidden> <div class="neu__zeile" id="cn-code-zeile" hidden>
<p class="feld-schild">Zugangscode für <span id="cn-code-name"></span></p> <p class="feld-schild">Zugangscode für <span id="cn-code-name"></span></p>
<p class="code-anzeige" id="cn-code"></p> <p class="code-anzeige" id="cn-code"></p>
<p class="feld-hinweis"> <p class="feld-hinweis">
Jetzt weitergeben. Nach dem Schließen ist er nicht mehr abrufbar. Jetzt weitergeben. Nach dem Schließen ist er nicht mehr abrufbar.
</p> </p>
</div> </div>
<p class="fehler" id="cn-fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="cn-fehler" role="alert" aria-live="polite"></p>
<div class="dialog__knoepfe"> <div class="dialog__knoepfe">
<button type="submit" class="knopf knopf--klein" id="cn-speichern">Anlegen</button> <button type="submit" class="knopf knopf--klein" id="cn-speichern">Anlegen</button>
<button type="button" class="abmelden" id="cn-zu">Schließen</button> <button type="button" class="abmelden" id="cn-zu">Schließen</button>
</div> </div>
</form> </form>
</dialog> </dialog>
<!-- FRÜHWARNUNG (06.09.2026). <!-- FRÜHWARNUNG (06.09.2026).
Steht GANZ OBEN, noch vor den Summen. Die Summen beantworten "wie Steht GANZ OBEN, noch vor den Summen. Die Summen beantworten "wie
steht es insgesamt", die Karten "wie steht es bei jedem" – aber steht es insgesamt", die Karten "wie steht es bei jedem" – aber
die Frage, mit der ein Betreuer morgens ankommt, ist eine dritte: die Frage, mit der ein Betreuer morgens ankommt, ist eine dritte:
"wo muss ich HEUTE hin?" Sie stand bis jetzt nirgends. "wo muss ich HEUTE hin?" Sie stand bis jetzt nirgends.
Bewusst OHNE Punktzahl. Ein Wert wie "Abwanderungsrisiko 73" Bewusst OHNE Punktzahl. Ein Wert wie "Abwanderungsrisiko 73"
klingt nach Wissenschaft und ist eine Behauptung: Man kann ihn klingt nach Wissenschaft und ist eine Behauptung: Man kann ihn
nicht prüfen, nicht widersprechen und nicht erklären. Hier stehen nicht prüfen, nicht widersprechen und nicht erklären. Hier stehen
stattdessen die einzelnen Beobachtungen im Klartext, jede mit stattdessen die einzelnen Beobachtungen im Klartext, jede mit
ihrem Beleg – dann entscheidet ein Mensch. ihrem Beleg – dann entscheidet ein Mensch.
Ein Creator sieht diesen Block nie (der Server liefert ihm gar Ein Creator sieht diesen Block nie (der Server liefert ihm gar
keine Daten). Zu lesen, dass ein System einen für gefährdet hält, keine Daten). Zu lesen, dass ein System einen für gefährdet hält,
ist keine Mitteilung an die betroffene Person. --> ist keine Mitteilung an die betroffene Person. -->
<section class="warnblock" id="fruehwarnung" hidden aria-labelledby="warn-titel"> <section class="warnblock" id="fruehwarnung" hidden aria-labelledby="warn-titel">
<div class="klapp-kopf"> <div class="klapp-kopf">
<h2 class="feldschild" id="warn-titel">Wo ich diese Woche nachfassen würde</h2> <h2 class="feldschild" id="warn-titel">Wo ich diese Woche nachfassen würde</h2>
</div> </div>
<div class="warnliste" id="warnliste"></div> <div class="warnliste" id="warnliste"></div>
</section> </section>
<!-- Summen über alle sichtbaren Creator. Steht oben, weil die Frage <!-- Summen über alle sichtbaren Creator. Steht oben, weil die Frage
"wie steht es insgesamt" vor der Frage "bei wem" kommt. --> "wie steht es insgesamt" vor der Frage "bei wem" kommt. -->
<section class="summen" id="summen" hidden></section> <section class="summen" id="summen" hidden></section>
<div id="liste" aria-busy="true"><p class="leise">Übersicht wird geladen …</p></div> <div id="liste" aria-busy="true"><p class="leise">Übersicht wird geladen …</p></div>
<p class="stand" id="stand" hidden></p> <p class="stand" id="stand" hidden></p>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/uebersicht.js?v=202609191915" defer></script> <script src="assets/js/uebersicht.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+227 -227
View File
@@ -1,227 +1,227 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Unsere Seiten · Der Treff</title> <title>Unsere Seiten · Der Treff</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · Unsere Seiten</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der&nbsp;Treff</a> · Unsere Seiten</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt inhalt--breit"> <main class="inhalt inhalt--breit">
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Der Treff · Unsere Seiten</p> <p class="marke">Der Treff · Unsere Seiten</p>
<h1 class="titel">Unsere Seiten</h1> <h1 class="titel">Unsere Seiten</h1>
<p class="unterzeile"> <p class="unterzeile">
Was es außerhalb vom Treff noch gibt — und wo dein Rabatt wartet. Was es außerhalb vom Treff noch gibt — und wo dein Rabatt wartet.
</p> </p>
</div> </div>
</section> </section>
<!-- ================================================================== <!-- ==================================================================
WARUM DIESE SEITE EXISTIERT (19.09.2026) WARUM DIESE SEITE EXISTIERT (19.09.2026)
Filipe: "ich brauch im community bereich noch eine kachel, die Filipe: "ich brauch im community bereich noch eine kachel, die
wenn man drauf drückt dan kacheln hat die auf die website von wenn man drauf drückt dan kacheln hat die auf die website von
dogfather universe geht ... und die shop site von vanvan." dogfather universe geht ... und die shop site von vanvan."
ZWEI GRUENDE, WARUM DAS EINE EIGENE SEITE IST und nicht zwei ZWEI GRUENDE, WARUM DAS EINE EIGENE SEITE IST und nicht zwei
Kacheln direkt in der Uebersicht: Kacheln direkt in der Uebersicht:
1. Die sieben Kacheln im Treff fuehren alle NACH INNEN -- auf 1. Die sieben Kacheln im Treff fuehren alle NACH INNEN -- auf
ein Brett, auf dem man liest und schreibt. Zwei Kacheln ein Brett, auf dem man liest und schreibt. Zwei Kacheln
dazwischen, die den Browser verlassen, waeren ein Bruch: Man dazwischen, die den Browser verlassen, waeren ein Bruch: Man
tippt auf etwas, das aussieht wie ein Brett, und ist tippt auf etwas, das aussieht wie ein Brett, und ist
ploetzlich woanders. Eine eigene Seite sagt vorher, was ploetzlich woanders. Eine eigene Seite sagt vorher, was
passiert. passiert.
2. Ein Rabattcode braucht Platz. Er muss gross, kopierbar und 2. Ein Rabattcode braucht Platz. Er muss gross, kopierbar und
mit seinen Bedingungen dastehen -- sonst wird er falsch mit seinen Bedingungen dastehen -- sonst wird er falsch
erinnert und jemand steht enttaeuscht an der Kasse. erinnert und jemand steht enttaeuscht an der Kasse.
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben: DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10 Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
an Community, Zuschauer, Freunde etc." -- und mit an Community, Zuschauer, Freunde etc." -- und mit
"giltAufSale": false. Genau deshalb steht der Satz zu den "giltAufSale": false. Genau deshalb steht der Satz zu den
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
er Umsatz bringt. er Umsatz bringt.
Der zweite Code in derselben Datei ist als "Nur fuer Filipe Der zweite Code in derselben Datei ist als "Nur fuer Filipe
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
Seite. Seite.
============================================================== --> ============================================================== -->
<div class="seiten-gitter"> <div class="seiten-gitter">
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ --> <!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/"> <article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
<div class="aussen__schein" aria-hidden="true"></div> <div class="aussen__schein" aria-hidden="true"></div>
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026). <!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
Filipe: "die sollen paar mal sein in der kacheln und so wie Filipe: "die sollen paar mal sein in der kacheln und so wie
schweben, sich ganz leicht bewegen." schweben, sich ganz leicht bewegen."
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
gleich waere ein Muster, und ein Muster sieht nach Tapete gleich waere ein Muster, und ein Muster sieht nach Tapete
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
etwas ablenkt. etwas ablenkt.
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
Logo in jede Kachel, egal welchen Ton sie hat. Logo in jede Kachel, egal welchen Ton sie hat.
`aria-hidden`, weil sie nichts sagen -- wer die Seite `aria-hidden`, weil sie nichts sagen -- wer die Seite
vorlesen laesst, soll nicht viermal "Logo" hoeren. --> vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
<div class="logo-feld" aria-hidden="true"> <div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span> <span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span> <span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span> <span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span> <span class="logo-feld__stueck" data-n="4"></span>
</div> </div>
<div class="aussen__kopf"> <div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true"> <span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24"> <svg viewBox="0 0 24 24">
<circle cx="12" cy="12" r="8.4" /> <circle cx="12" cy="12" r="8.4" />
<path d="M3.6 12h16.8M12 3.6c2.4 2.5 2.4 13.9 0 16.8M12 3.6c-2.4 2.5-2.4 13.9 0 16.8" /> <path d="M3.6 12h16.8M12 3.6c2.4 2.5 2.4 13.9 0 16.8M12 3.6c-2.4 2.5-2.4 13.9 0 16.8" />
</svg> </svg>
</span> </span>
<div> <div>
<p class="aussen__marke">Die Website</p> <p class="aussen__marke">Die Website</p>
<h2 class="aussen__titel">DogFather&nbsp;Universe</h2> <h2 class="aussen__titel">DogFather&nbsp;Universe</h2>
</div> </div>
</div> </div>
<p class="aussen__satz"> <p class="aussen__satz">
Die Heimat von DogFather als Streamer, der HasiDog-Community Die Heimat von DogFather als Streamer, der HasiDog-Community
und seiner Arbeit als Manager bei Spicy Media. und seiner Arbeit als Manager bei Spicy Media.
</p> </p>
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT. <!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
Die Punkte stammen aus der Navigation von Die Punkte stammen aus der Navigation von
dogfather-universe.com (streamplan.html, hasidog.html, dogfather-universe.com (streamplan.html, hasidog.html,
zeitreise.html, stimmen.html). Eine erfundene Aufzählung zeitreise.html, stimmen.html). Eine erfundene Aufzählung
wäre beim ersten Klick als Lüge aufgeflogen. wäre beim ersten Klick als Lüge aufgeflogen.
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
Startseite; einzelne Links darin würden diesen Klick Startseite; einzelne Links darin würden diesen Klick
zerschneiden und wären auf dem Handy außerdem zu kleine zerschneiden und wären auf dem Handy außerdem zu kleine
Ziele. --> Ziele. -->
<ul class="aussen__liste"> <ul class="aussen__liste">
<li>Der Streamplan – wann was läuft</li> <li>Der Streamplan – wann was läuft</li>
<li>HasiDog: die Community rund um Dogi</li> <li>HasiDog: die Community rund um Dogi</li>
<li>Die Zeitreise durch alles Bisherige</li> <li>Die Zeitreise durch alles Bisherige</li>
<li>Stimmen von Leuten, die dabei waren</li> <li>Stimmen von Leuten, die dabei waren</li>
</ul> </ul>
<p class="aussen__weg"> <p class="aussen__weg">
<span class="aussen__adresse">dogfather-universe.com</span> <span class="aussen__adresse">dogfather-universe.com</span>
<a class="aussen__knopf" href="https://dogfather-universe.com/" <a class="aussen__knopf" href="https://dogfather-universe.com/"
target="_blank" rel="noopener noreferrer">Seite öffnen&nbsp;→</a> target="_blank" rel="noopener noreferrer">Seite öffnen&nbsp;→</a>
</p> </p>
</article> </article>
<!-- ---- VANVANS SHOP ------------------------------------------ --> <!-- ---- VANVANS SHOP ------------------------------------------ -->
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/"> <article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
<div class="aussen__schein" aria-hidden="true"></div> <div class="aussen__schein" aria-hidden="true"></div>
<div class="logo-feld" aria-hidden="true"> <div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span> <span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span> <span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span> <span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span> <span class="logo-feld__stueck" data-n="4"></span>
</div> </div>
<div class="aussen__kopf"> <div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true"> <span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24"> <svg viewBox="0 0 24 24">
<path d="M5 8h14l-1.1 11.2a1.4 1.4 0 0 1-1.4 1.3H7.5a1.4 1.4 0 0 1-1.4-1.3z" /> <path d="M5 8h14l-1.1 11.2a1.4 1.4 0 0 1-1.4 1.3H7.5a1.4 1.4 0 0 1-1.4-1.3z" />
<path d="M9 8V6.4a3 3 0 0 1 6 0V8" /> <path d="M9 8V6.4a3 3 0 0 1 6 0V8" />
</svg> </svg>
</span> </span>
<div> <div>
<p class="aussen__marke">Der Shop</p> <p class="aussen__marke">Der Shop</p>
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST <!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
(og:site_name und meta description). Meine erste Fassung (og:site_name und meta description). Meine erste Fassung
hieß „Van's DIY Bastelbedarf" und nannte „Perlen, hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
Anhänger, Werkzeug" — beides ausgedacht und beides Anhänger, Werkzeug" — beides ausgedacht und beides
falsch. Der Laden heißt mit „&", und er verkauft vor falsch. Der Laden heißt mit „&", und er verkauft vor
allem Handgemachtes. --> allem Handgemachtes. -->
<h2 class="aussen__titel">Van's&nbsp;DIY &amp; Bastelbedarf</h2> <h2 class="aussen__titel">Van's&nbsp;DIY &amp; Bastelbedarf</h2>
</div> </div>
</div> </div>
<p class="aussen__satz"> <p class="aussen__satz">
VanVans eigener Laden: handgemachte Häkelwerke, Plushies, VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
Schmuck und Bastelzubehör. Schmuck und Bastelzubehör.
</p> </p>
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf <!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
dieser Karte ist -- und kopierbar, weil niemand einen Code dieser Karte ist -- und kopierbar, weil niemand einen Code
abtippen soll, den er sich vorher merken muss. --> abtippen soll, den er sich vorher merken muss. -->
<div class="gutschein"> <div class="gutschein">
<p class="gutschein__zeile"> <p class="gutschein__zeile">
<span class="gutschein__prozent">10&nbsp;%</span> <span class="gutschein__prozent">10&nbsp;%</span>
<span class="gutschein__wofuer">für alle aus der Community</span> <span class="gutschein__wofuer">für alle aus der Community</span>
</p> </p>
<button type="button" class="gutschein__code" id="code-knopf" <button type="button" class="gutschein__code" id="code-knopf"
data-code="DOGI10" data-code="DOGI10"
aria-label="Rabattcode DOGI10 kopieren"> aria-label="Rabattcode DOGI10 kopieren">
<span class="gutschein__wort">DOGI10</span> <span class="gutschein__wort">DOGI10</span>
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span> <span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
</button> </button>
<p class="gutschein__klein"> <p class="gutschein__klein">
Beim Bestellen im Feld für den Gutscheincode eintragen. Beim Bestellen im Feld für den Gutscheincode eintragen.
Gilt nicht auf bereits reduzierte Artikel. Gilt nicht auf bereits reduzierte Artikel.
</p> </p>
</div> </div>
<p class="aussen__weg"> <p class="aussen__weg">
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span> <span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/" <a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
target="_blank" rel="noopener noreferrer">Shop öffnen&nbsp;→</a> target="_blank" rel="noopener noreferrer">Shop öffnen&nbsp;→</a>
</p> </p>
</article> </article>
</div> </div>
<p class="seiten-fuss"> <p class="seiten-fuss">
Beide Seiten öffnen sich in einem neuen Fenster — der Treff bleibt Beide Seiten öffnen sich in einem neuen Fenster — der Treff bleibt
also offen. also offen.
</p> </p>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609191915" defer></script> <script src="assets/js/unsere-seiten.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+154 -154
View File
@@ -1,154 +1,154 @@
<!doctype html> <!doctype html>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Entwicklung · Spicy &amp; Dogi</title> <title>Entwicklung · Spicy &amp; Dogi</title>
<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=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/werdegang.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
<div class="schleier" aria-hidden="true"></div> <div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste"> <header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden> <button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true"> <svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" /> <path d="M14.5 5.5 8 12l6.5 6.5" />
</svg> </svg>
<span class="zurueck-knopf__text">Zurück</span> <span class="zurueck-knopf__text">Zurück</span>
</button> </button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Entwicklung</span></p> <p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Entwicklung</span></p>
<div class="kopfleiste__rechts"> <div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span> <span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button> <button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div> </div>
</header> </header>
<main class="inhalt"> <main class="inhalt">
<!-- ================================================================== <!-- ==================================================================
ENTWICKLUNG — die Auswertung je Person (19.09.2026) ENTWICKLUNG — die Auswertung je Person (19.09.2026)
Filipe: „dan perfektionierst du eine neue wo diagramme texte und Filipe: „dan perfektionierst du eine neue wo diagramme texte und
so zu jedem modi gemacht wird und diese kategorie kannst du so zu jedem modi gemacht wird und diese kategorie kannst du
entwicklung nenen." entwicklung nenen."
DIESE SEITE HAT ZWEI GESICHTER, und welches man sieht, entscheidet DIESE SEITE HAT ZWEI GESICHTER, und welches man sieht, entscheidet
der Server: der Server:
Leitung -> die Karten aller, die eine haben Leitung -> die Karten aller, die eine haben
Ein Modi -> ausschliesslich die Bewegung in der EIGENEN Karte, Ein Modi -> ausschliesslich die Bewegung in der EIGENEN Karte,
ohne Namen, ohne Anlass, ohne wer-hat-was ohne Namen, ohne Anlass, ohne wer-hat-was
WAS HIER NICHT STEHT UND NIE STEHEN WIRD: eine Punktzahl, ein WAS HIER NICHT STEHT UND NIE STEHEN WIRD: eine Punktzahl, ein
Prozentwert, ein Durchschnitt, eine Rangliste, ein Vergleich Prozentwert, ein Durchschnitt, eine Rangliste, ein Vergleich
zwischen zwei Menschen. Eine Zahl ueber einen Menschen wird zwischen zwei Menschen. Eine Zahl ueber einen Menschen wird
gelesen, verglichen und weitererzaehlt — gebraucht wird ein gelesen, verglichen und weitererzaehlt — gebraucht wird ein
Gespraechsanlass. Gespraechsanlass.
============================================================== --> ============================================================== -->
<section class="kopf-zeile"> <section class="kopf-zeile">
<div> <div>
<p class="marke">Entwicklung &amp; Nachwuchs</p> <p class="marke">Entwicklung &amp; Nachwuchs</p>
<h1 class="titel" id="titel">Entwicklung</h1> <h1 class="titel" id="titel">Entwicklung</h1>
<p class="unterzeile" id="unterzeile"> <p class="unterzeile" id="unterzeile">
Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich – Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich –
jede Karte nur mit sich selbst. jede Karte nur mit sich selbst.
</p> </p>
</div> </div>
</section> </section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p> <p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- ---- Die Liste (nur Leitung) ---------------------------------- --> <!-- ---- Die Liste (nur Leitung) ---------------------------------- -->
<section id="liste-block" hidden> <section id="liste-block" hidden>
<p class="w-hinweis" id="liste-hinweis"></p> <p class="w-hinweis" id="liste-hinweis"></p>
<div id="liste" class="w-liste" aria-busy="true"> <div id="liste" class="w-liste" aria-busy="true">
<p class="leise">wird geladen …</p> <p class="leise">wird geladen …</p>
</div> </div>
</section> </section>
<!-- ---- Eine Karte (nur Leitung) --------------------------------- --> <!-- ---- Eine Karte (nur Leitung) --------------------------------- -->
<section id="karte-block" hidden> <section id="karte-block" hidden>
<button type="button" class="knopf knopf--still knopf--klein" id="zur-liste"> <button type="button" class="knopf knopf--still knopf--klein" id="zur-liste">
← Alle Karten ← Alle Karten
</button> </button>
<h2 class="w-name" id="karte-name">…</h2> <h2 class="w-name" id="karte-name">…</h2>
<p class="w-satz" id="karte-satz">…</p> <p class="w-satz" id="karte-satz">…</p>
<!-- Diagramm 1: Bewegung. Zwei Richtungen um eine Nulllinie — <!-- Diagramm 1: Bewegung. Zwei Richtungen um eine Nulllinie —
vorwaerts und rueckwaerts sind dieselbe Groesse mit vorwaerts und rueckwaerts sind dieselbe Groesse mit
verschiedenem Vorzeichen, nicht zwei Themen. --> verschiedenem Vorzeichen, nicht zwei Themen. -->
<section class="w-teil" id="bewegung-block"> <section class="w-teil" id="bewegung-block">
<h3 class="e-abschnitt">Was sich bewegt hat</h3> <h3 class="e-abschnitt">Was sich bewegt hat</h3>
<p class="w-teil__satz" id="bewegung-satz"></p> <p class="w-teil__satz" id="bewegung-satz"></p>
<div id="bewegung"></div> <div id="bewegung"></div>
</section> </section>
<!-- Diagramm 2: der Streifen. Eine Zeile je Punkt, eine Spalte je <!-- Diagramm 2: der Streifen. Eine Zeile je Punkt, eine Spalte je
Monat. Das Zeichen sagt die Stufe, die Farbe verstaerkt nur. --> Monat. Das Zeichen sagt die Stufe, die Farbe verstaerkt nur. -->
<section class="w-teil" id="streifen-block"> <section class="w-teil" id="streifen-block">
<h3 class="e-abschnitt">Punkt für Punkt, Monat für Monat</h3> <h3 class="e-abschnitt">Punkt für Punkt, Monat für Monat</h3>
<p class="w-teil__satz" id="streifen-satz"></p> <p class="w-teil__satz" id="streifen-satz"></p>
<div id="streifen" class="w-streifen"></div> <div id="streifen" class="w-streifen"></div>
</section> </section>
<!-- Die Texte. Reihenfolge ist Absicht: erst was sich bewegt hat, <!-- Die Texte. Reihenfolge ist Absicht: erst was sich bewegt hat,
dann was traegt, erst danach was liegt. --> dann was traegt, erst danach was liegt. -->
<section class="w-teil" id="texte-block"> <section class="w-teil" id="texte-block">
<h3 class="e-abschnitt">Was dazu zu sagen ist</h3> <h3 class="e-abschnitt">Was dazu zu sagen ist</h3>
<div id="texte"></div> <div id="texte"></div>
</section> </section>
<p class="w-fuss"> <p class="w-fuss">
Auf dieser Seite gibt es keine Punktzahl und keinen Vergleich zwischen Auf dieser Seite gibt es keine Punktzahl und keinen Vergleich zwischen
Personen. Was hier steht, ist ein Gesprächsanlass – kein Zeugnis. Personen. Was hier steht, ist ein Gesprächsanlass – kein Zeugnis.
Einschätzungen setzt und ändert man im Katalog: Einschätzungen setzt und ändert man im Katalog:
<a href="entwicklung.html">Eure Aufgaben</a>. <a href="entwicklung.html">Eure Aufgaben</a>.
</p> </p>
</section> </section>
<!-- ---- Die eigene Sicht (Modi) ---------------------------------- --> <!-- ---- Die eigene Sicht (Modi) ---------------------------------- -->
<!-- ================================================================== <!-- ==================================================================
WAS DER MENSCH SELBST SIEHT. WAS DER MENSCH SELBST SIEHT.
Hier steht kein fremder Name, keine Beobachtung über jemand Hier steht kein fremder Name, keine Beobachtung über jemand
anderen und kein Anlasstext. Nur: ob sich etwas bewegt hat. anderen und kein Anlasstext. Nur: ob sich etwas bewegt hat.
Die Lesehilfe und die zwei Wege am Ende sind am 19.09.2026 Die Lesehilfe und die zwei Wege am Ende sind am 19.09.2026
dazugekommen. Vorher standen hier Balken ohne Erklärung und ein dazugekommen. Vorher standen hier Balken ohne Erklärung und ein
„Frag danach" ohne Adressaten – eine Sackgasse mit freundlichem „Frag danach" ohne Adressaten – eine Sackgasse mit freundlichem
Ton. Ton.
============================================================== --> ============================================================== -->
<section id="mich-block" hidden> <section id="mich-block" hidden>
<h2 class="e-abschnitt">Deine Entwicklung</h2> <h2 class="e-abschnitt">Deine Entwicklung</h2>
<p class="w-satz" id="mich-satz">…</p> <p class="w-satz" id="mich-satz">…</p>
<p class="w-lesehilfe" id="mich-lesehilfe" hidden></p> <p class="w-lesehilfe" id="mich-lesehilfe" hidden></p>
<div id="mich-bewegung"></div> <div id="mich-bewegung"></div>
<p class="w-fuss" id="mich-hinweis"></p> <p class="w-fuss" id="mich-hinweis"></p>
<div class="w-wege" id="mich-wege" hidden></div> <div class="w-wege" id="mich-wege" hidden></div>
</section> </section>
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/werdegang.js?v=202609191915" defer></script> <script src="assets/js/werdegang.js?v=202609191956" defer></script>
</body> </body>
</html> </html>
+15 -14
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. --> eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" /> <meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" /> <link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" /> <link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/wissen.css?v=202609191956" />
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" /> <link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
<!-- 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=202609191915" /> <link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
</head> </head>
<body class="start"> <body class="start">
@@ -190,12 +190,13 @@
</main> </main>
<script src="assets/js/meldung.js?v=202609191915" defer></script> <script src="assets/js/meldung.js?v=202609191956" defer></script>
<script src="assets/js/nachfrage.js?v=202609191956" defer></script>
<script src="assets/js/wahl.js?v=202609191915" defer></script> <script src="assets/js/wahl.js?v=202609191956" defer></script>
<script src="assets/js/bereiche.js?v=202609191915" defer></script> <script src="assets/js/bereiche.js?v=202609191956" defer></script>
<script src="assets/js/kopf.js?v=202609191915" defer></script> <script src="assets/js/kopf.js?v=202609191956" defer></script>
<script src="assets/js/glocke.js?v=202609191915" defer></script> <script src="assets/js/glocke.js?v=202609191956" defer></script>
<script src="assets/js/wissen.js?v=202609191915" defer></script> <script src="assets/js/wissen.js?v=202609191956" defer></script>
</body> </body>
</html> </html>