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:
@@ -97,6 +97,7 @@
|
||||
Dauer: rund drei Minuten (4 Rollen × 2 Breiten × ~20 Seiten).
|
||||
===================================================================== */
|
||||
|
||||
import { tagLokal } from "./helfer-zeit.mjs";
|
||||
import { mkdtempSync, rmSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join, dirname } from "node:path";
|
||||
@@ -182,7 +183,11 @@ for (const [titel, wer] of [
|
||||
+ " erstellt, frist) VALUES (?,?,?,?,?,?,?)",
|
||||
titel, "Beschreibung mit genug Text, dass die Karte wirklich Höhe bekommt "
|
||||
+ "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 [
|
||||
|
||||
@@ -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);
|
||||
@@ -322,9 +322,28 @@ async function schlussBenachrichtigen(fall) {
|
||||
|
||||
/** Löscht geschlossene Fälle, die älter sind als die Aufbewahrung.
|
||||
*
|
||||
* Wird beim Start aufgerufen (siehe index.js). 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. */
|
||||
* ACHTUNG, NACHGEMESSEN AM 19.09.2026: Diese Funktion wird im Betrieb
|
||||
* NICHT aufgerufen. Hier stand vorher "Wird beim Start aufgerufen
|
||||
* (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) {
|
||||
try {
|
||||
const grenze = new Date(Date.now() - tage * 86400000).toISOString();
|
||||
|
||||
+131
-131
@@ -1,131 +1,131 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" data-haus="crew">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anruf-Probe · Team Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<!-- 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
|
||||
jedem Aufruf ins Leere und stand damit OHNE die Hausfarben da; die
|
||||
Angaben darunter (var(--text-leise) usw.) liefen ins Nichts.
|
||||
|
||||
Ausgerechnet auf dieser Seite faellt das nicht auf: Sie hat ihre
|
||||
eigene Stilangabe im Kopf, damit sie auch dann noch etwas anzeigt,
|
||||
wenn die Stilvorlagen klemmen -- und genau die hat den Mangel
|
||||
verdeckt. Gefunden hat es pruef-struktur.
|
||||
|
||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
||||
<link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<style>
|
||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||
was sie untersucht -- eine Stilvorlage, die aus dem
|
||||
Zwischenspeicher kommt. */
|
||||
/* DIE KOPFLEISTE WAR NIE GESTALTET (nachgetragen 19.09.2026).
|
||||
|
||||
Gefunden von pruef-css-klassen: `.kopfleiste`, `.kopfleiste__zurueck`,
|
||||
`.kopfleiste__mitte` und `.kopfleiste__titel` stehen in KEINER
|
||||
Stilvorlage des Hauses -- sie leben in start.css bzw. crew-haus.css,
|
||||
und genau die lädt diese Seite absichtlich nicht.
|
||||
|
||||
Ergebnis war eine Leiste aus nacktem Text: der Zurück-Weg ein
|
||||
blasser Link irgendwo links oben, der Titel daneben in Fließtext.
|
||||
Ausgerechnet auf der Seite, die man aufruft, WEIL schon etwas nicht
|
||||
funktioniert -- da sieht unfertig aus wie kaputt.
|
||||
|
||||
Sie stehen hier und nicht in einer Datei, aus demselben Grund wie
|
||||
alles andere auf dieser Seite: Sie soll auch dann noch etwas
|
||||
anzeigen, wenn genau das schiefgeht, was sie untersucht. */
|
||||
.kopfleiste {
|
||||
display: flex; align-items: center; gap: .6rem;
|
||||
padding: .55rem .9rem;
|
||||
border-bottom: 1px solid var(--rand);
|
||||
background: color-mix(in srgb, var(--tinte) 92%, #ffffff 8%);
|
||||
}
|
||||
.kopfleiste__zurueck {
|
||||
/* 44 px hoch: Das ist die Größe, die ein Daumen sicher trifft.
|
||||
Auf einem Handy ist dieser Knopf der einzige Weg zurück. */
|
||||
display: inline-flex; align-items: center;
|
||||
min-height: 44px; padding: 0 .7rem 0 .2rem;
|
||||
color: var(--text-leise); text-decoration: none;
|
||||
font-size: .92rem; border-radius: .5rem;
|
||||
}
|
||||
.kopfleiste__zurueck:hover,
|
||||
.kopfleiste__zurueck:focus-visible { color: var(--text); }
|
||||
.kopfleiste__mitte { flex: 1; min-width: 0; text-align: center; }
|
||||
.kopfleiste__titel {
|
||||
font-size: .92rem; font-weight: 600; color: var(--text);
|
||||
letter-spacing: .01em;
|
||||
}
|
||||
/* Gleich breit wie der Zurück-Weg, damit der Titel wirklich mittig
|
||||
steht statt nur ungefähr. */
|
||||
.kopfleiste__rechts { flex: 0 0 4.5rem; }
|
||||
@media (max-width: 420px) {
|
||||
.kopfleiste__rechts { flex-basis: 0; }
|
||||
.kopfleiste__mitte { text-align: right; }
|
||||
}
|
||||
|
||||
.probe { max-width: 46rem; margin: 0 auto; padding: 1.4rem 1rem 3rem; }
|
||||
.probe h1 { margin: .2rem 0 .3rem; }
|
||||
.probe__unter { color: var(--text-leise); margin: 0 0 1.4rem; }
|
||||
.punkt {
|
||||
display: flex; gap: .8rem; align-items: flex-start;
|
||||
padding: .85rem 1rem; margin-bottom: .6rem;
|
||||
border: 1px solid var(--rand); border-radius: .7rem;
|
||||
background: rgba(255,255,255,.02);
|
||||
}
|
||||
.punkt__zeichen { font-size: 1.1rem; line-height: 1.4; flex: 0 0 1.4rem; }
|
||||
.punkt__text { flex: 1; min-width: 0; }
|
||||
.punkt__titel { font-weight: 600; margin: 0 0 .15rem; }
|
||||
.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="warn"] { border-color: rgba(220, 180, 110, .45); }
|
||||
.punkt[data-stand="schlecht"] { border-color: rgba(230, 140, 140, .5); }
|
||||
/* 44 px auf Geraeten, die mit dem Finger bedient werden
|
||||
(19.09.2026). Diese Seite laedt module.css bewusst nicht --
|
||||
sie soll auch dann noch stehen, wenn Stilvorlagen klemmen.
|
||||
Also gilt die Regel hier eigens. */
|
||||
.probe__knopf { margin: 1.2rem 0 .4rem; }
|
||||
@media (pointer: coarse) { .probe__knopf { min-height: 44px; } }
|
||||
.probe__ende {
|
||||
margin-top: 1.6rem; padding: 1rem;
|
||||
border-radius: .7rem; border: 1px dashed var(--rand-hell);
|
||||
color: var(--text-leise); font-size: .92rem;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="haus">
|
||||
<header class="kopfleiste">
|
||||
<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__rechts"></div>
|
||||
</header>
|
||||
|
||||
<main class="probe">
|
||||
<h1>Warum klingelt es nicht?</h1>
|
||||
<p class="probe__unter">
|
||||
Diese Seite geht der Reihe nach durch, was ein Anruf braucht – und sagt,
|
||||
an welcher Stelle es hakt. Sie ruft niemanden an.
|
||||
</p>
|
||||
|
||||
<div id="ergebnis"></div>
|
||||
|
||||
<button type="button" class="knopf probe__knopf" id="ton-probe">Klingelton anhören</button>
|
||||
|
||||
<p class="probe__ende" id="rat"></p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/anruf-probe.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" data-haus="crew">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anruf-Probe · Team Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<!-- 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
|
||||
jedem Aufruf ins Leere und stand damit OHNE die Hausfarben da; die
|
||||
Angaben darunter (var(--text-leise) usw.) liefen ins Nichts.
|
||||
|
||||
Ausgerechnet auf dieser Seite faellt das nicht auf: Sie hat ihre
|
||||
eigene Stilangabe im Kopf, damit sie auch dann noch etwas anzeigt,
|
||||
wenn die Stilvorlagen klemmen -- und genau die hat den Mangel
|
||||
verdeckt. Gefunden hat es pruef-struktur.
|
||||
|
||||
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
|
||||
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
|
||||
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
|
||||
WARUM das Telefon nicht klingelt, ist das besonders unpassend. -->
|
||||
<link rel="manifest" href="/workspace/crew.webmanifest?v=202609191018" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<style>
|
||||
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
|
||||
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
|
||||
was sie untersucht -- eine Stilvorlage, die aus dem
|
||||
Zwischenspeicher kommt. */
|
||||
/* DIE KOPFLEISTE WAR NIE GESTALTET (nachgetragen 19.09.2026).
|
||||
|
||||
Gefunden von pruef-css-klassen: `.kopfleiste`, `.kopfleiste__zurueck`,
|
||||
`.kopfleiste__mitte` und `.kopfleiste__titel` stehen in KEINER
|
||||
Stilvorlage des Hauses -- sie leben in start.css bzw. crew-haus.css,
|
||||
und genau die lädt diese Seite absichtlich nicht.
|
||||
|
||||
Ergebnis war eine Leiste aus nacktem Text: der Zurück-Weg ein
|
||||
blasser Link irgendwo links oben, der Titel daneben in Fließtext.
|
||||
Ausgerechnet auf der Seite, die man aufruft, WEIL schon etwas nicht
|
||||
funktioniert -- da sieht unfertig aus wie kaputt.
|
||||
|
||||
Sie stehen hier und nicht in einer Datei, aus demselben Grund wie
|
||||
alles andere auf dieser Seite: Sie soll auch dann noch etwas
|
||||
anzeigen, wenn genau das schiefgeht, was sie untersucht. */
|
||||
.kopfleiste {
|
||||
display: flex; align-items: center; gap: .6rem;
|
||||
padding: .55rem .9rem;
|
||||
border-bottom: 1px solid var(--rand);
|
||||
background: color-mix(in srgb, var(--tinte) 92%, #ffffff 8%);
|
||||
}
|
||||
.kopfleiste__zurueck {
|
||||
/* 44 px hoch: Das ist die Größe, die ein Daumen sicher trifft.
|
||||
Auf einem Handy ist dieser Knopf der einzige Weg zurück. */
|
||||
display: inline-flex; align-items: center;
|
||||
min-height: 44px; padding: 0 .7rem 0 .2rem;
|
||||
color: var(--text-leise); text-decoration: none;
|
||||
font-size: .92rem; border-radius: .5rem;
|
||||
}
|
||||
.kopfleiste__zurueck:hover,
|
||||
.kopfleiste__zurueck:focus-visible { color: var(--text); }
|
||||
.kopfleiste__mitte { flex: 1; min-width: 0; text-align: center; }
|
||||
.kopfleiste__titel {
|
||||
font-size: .92rem; font-weight: 600; color: var(--text);
|
||||
letter-spacing: .01em;
|
||||
}
|
||||
/* Gleich breit wie der Zurück-Weg, damit der Titel wirklich mittig
|
||||
steht statt nur ungefähr. */
|
||||
.kopfleiste__rechts { flex: 0 0 4.5rem; }
|
||||
@media (max-width: 420px) {
|
||||
.kopfleiste__rechts { flex-basis: 0; }
|
||||
.kopfleiste__mitte { text-align: right; }
|
||||
}
|
||||
|
||||
.probe { max-width: 46rem; margin: 0 auto; padding: 1.4rem 1rem 3rem; }
|
||||
.probe h1 { margin: .2rem 0 .3rem; }
|
||||
.probe__unter { color: var(--text-leise); margin: 0 0 1.4rem; }
|
||||
.punkt {
|
||||
display: flex; gap: .8rem; align-items: flex-start;
|
||||
padding: .85rem 1rem; margin-bottom: .6rem;
|
||||
border: 1px solid var(--rand); border-radius: .7rem;
|
||||
background: rgba(255,255,255,.02);
|
||||
}
|
||||
.punkt__zeichen { font-size: 1.1rem; line-height: 1.4; flex: 0 0 1.4rem; }
|
||||
.punkt__text { flex: 1; min-width: 0; }
|
||||
.punkt__titel { font-weight: 600; margin: 0 0 .15rem; }
|
||||
.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="warn"] { border-color: rgba(220, 180, 110, .45); }
|
||||
.punkt[data-stand="schlecht"] { border-color: rgba(230, 140, 140, .5); }
|
||||
/* 44 px auf Geraeten, die mit dem Finger bedient werden
|
||||
(19.09.2026). Diese Seite laedt module.css bewusst nicht --
|
||||
sie soll auch dann noch stehen, wenn Stilvorlagen klemmen.
|
||||
Also gilt die Regel hier eigens. */
|
||||
.probe__knopf { margin: 1.2rem 0 .4rem; }
|
||||
@media (pointer: coarse) { .probe__knopf { min-height: 44px; } }
|
||||
.probe__ende {
|
||||
margin-top: 1.6rem; padding: 1rem;
|
||||
border-radius: .7rem; border: 1px dashed var(--rand-hell);
|
||||
color: var(--text-leise); font-size: .92rem;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="haus">
|
||||
<header class="kopfleiste">
|
||||
<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__rechts"></div>
|
||||
</header>
|
||||
|
||||
<main class="probe">
|
||||
<h1>Warum klingelt es nicht?</h1>
|
||||
<p class="probe__unter">
|
||||
Diese Seite geht der Reihe nach durch, was ein Anruf braucht – und sagt,
|
||||
an welcher Stelle es hakt. Sie ruft niemanden an.
|
||||
</p>
|
||||
|
||||
<div id="ergebnis"></div>
|
||||
|
||||
<button type="button" class="knopf probe__knopf" id="ton-probe">Klingelton anhören</button>
|
||||
|
||||
<p class="probe__ende" id="rat"></p>
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>␍
|
||||
|
||||
<script src="assets/js/anruf-probe.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-192.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/workspace-512.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
@@ -269,132 +269,10 @@
|
||||
|
||||
/* ---------- 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; }
|
||||
|
||||
/* 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; }
|
||||
|
||||
.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; }
|
||||
|
||||
/* ---------- Der Dialog --------------------------------------------------- */
|
||||
|
||||
.dialog__unter {
|
||||
margin: -4px 0 14px;
|
||||
font-size: .85rem; color: var(--text-still);
|
||||
max-width: 60ch; line-height: 1.5;
|
||||
}
|
||||
|
||||
#abbruch-grund {
|
||||
width: 100%;
|
||||
|
||||
@@ -225,9 +225,6 @@
|
||||
color: var(--text); border-color: var(--rand-hell);
|
||||
}
|
||||
|
||||
/* ---------- Der Import --------------------------------------------------- */
|
||||
|
||||
.dialog--breit { max-width: 720px; }
|
||||
|
||||
.import-vorschau {
|
||||
margin: 4px 0 14px; padding: 16px;
|
||||
@@ -355,7 +352,6 @@
|
||||
.anleitung li::marker { color: var(--akzent); font-weight: 700; }
|
||||
.anleitung strong { color: var(--text-leise); }
|
||||
|
||||
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
|
||||
|
||||
/* ---- EINGEKLAPPTE HILFE (11.09.2026) ------------------------------
|
||||
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; }
|
||||
|
||||
/* 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)
|
||||
|
||||
@@ -559,3 +559,259 @@
|
||||
der Rundgang sechsmal gemeldet hat. */
|
||||
.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; }
|
||||
|
||||
@@ -110,9 +110,17 @@
|
||||
es sonst ab, und das ist richtig so. Hier wird deshalb
|
||||
gleich danach gefragt statt eine Fehlermeldung zu zeigen. */
|
||||
if (wert === 'verbessern') {
|
||||
grund = prompt('Was genau soll verbessert werden?\n\n'
|
||||
+ 'Ohne diesen Satz kann der Creator nichts damit anfangen.', grund) || '';
|
||||
if (grund.trim().length < 5) return;
|
||||
const ag = await frageNach({
|
||||
titel: 'Noch verbessern',
|
||||
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;
|
||||
try {
|
||||
@@ -204,7 +212,12 @@
|
||||
weg.type = 'button';
|
||||
weg.title = 'Eigene Nachricht zurücknehmen';
|
||||
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 {
|
||||
const a = await hole(`/workspace/api/eintrag/${eintragId}/nachricht/${n.id}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -129,7 +129,12 @@
|
||||
weg.title = 'Rückmeldung entfernen';
|
||||
weg.setAttribute('aria-label', 'Rückmeldung entfernen');
|
||||
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' });
|
||||
if (!r.ok) { melde('Entfernen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
@@ -997,11 +1002,15 @@
|
||||
});
|
||||
|
||||
$('b-loeschen').addEventListener('click', async () => {
|
||||
if (!confirm(`Aufgabe wirklich loeschen?
|
||||
|
||||
"${bearbeitet.titel}"
|
||||
|
||||
Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerweise stehen bleiben.`)) return;
|
||||
/* Loeschen ist hier fast nie das Richtige -- deshalb nennt der
|
||||
Dialog den sanfteren Weg beim Namen, statt nur zu warnen. */
|
||||
if (!await frageNach({
|
||||
titel: `„${bearbeitet.titel}" löschen?`,
|
||||
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 {
|
||||
const a = await hole(`/workspace/api/aufgaben/${bearbeitet.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { $('b-fehler').textContent = 'Loeschen ging nicht.'; return; }
|
||||
|
||||
@@ -518,8 +518,13 @@
|
||||
b.type = 'button';
|
||||
b.title = 'Schickt Art, Titel und Text als Nachricht in den Chat.';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm(`„${e.titel}“ als Nachricht schicken?\n\n`
|
||||
+ 'Die Person bekommt Art, Titel und Text im Chat – einmalig.')) return;
|
||||
if (!await frageNach({
|
||||
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;
|
||||
const a = await hole(`/workspace/api/bereich/entwicklung/${e.id}/senden`,
|
||||
{ method: 'POST', headers: { 'Content-Type': 'application/json' } });
|
||||
@@ -897,9 +902,17 @@
|
||||
const vomTeam = !!e.erstellt_rolle && e.erstellt_rolle !== 'gast';
|
||||
if (!lage.team && e.erstellt_von !== ich.id && !vomTeam) {
|
||||
zeile.append(tuKnopf('melden', async () => {
|
||||
const grund = prompt('Was ist daran nicht in Ordnung?\n\n'
|
||||
+ 'Bitte schreib es in einem Satz – sonst können wir es nicht prüfen.');
|
||||
if (grund === null) return;
|
||||
const a0 = await frageNach({
|
||||
titel: 'Diesen Beitrag melden?',
|
||||
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', {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ grund }),
|
||||
@@ -956,7 +969,13 @@
|
||||
dass er einer wird, entscheidet ein Mensch. */
|
||||
if (bereich === 'mitmachen' && e.erstellt_rolle === 'gast') {
|
||||
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',
|
||||
{ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' });
|
||||
const j = await a.json().catch(() => ({}));
|
||||
@@ -971,9 +990,17 @@
|
||||
fuer den eigenen Beitrag, und der braucht keine Begruendung. */
|
||||
if (e.erstellt_von !== ich.id) {
|
||||
zeile.append(tuKnopf('entfernen', async () => {
|
||||
const grund = prompt('Warum wird „' + e.titel + '“ entfernt?\n\n'
|
||||
+ 'Der Grund wird festgehalten – die Person hat ein Recht darauf.');
|
||||
if (grund === null) return;
|
||||
const a1 = await frageNach({
|
||||
titel: '„' + e.titel + '" entfernen?',
|
||||
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
|
||||
demselben gemessenen Grund wie oben. Er ist kein
|
||||
Geheimnis: Er wird der Person, die den Beitrag
|
||||
@@ -1208,7 +1235,12 @@
|
||||
|
||||
if (LEITUNG.has(ich.rolle) || e.erstellt_von === ich.id) {
|
||||
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' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -368,11 +368,13 @@
|
||||
if (ich?.rolle === 'admin') {
|
||||
const weg = el('div', 'kk__knoepfe');
|
||||
weg.append(tuKnopf('Protokoll löschen', async () => {
|
||||
if (!confirm('Protokoll zu „' + c.titel + '" löschen?\n\n'
|
||||
+ 'Der Text ist danach weg und lässt sich nicht wiederholen.\n\n'
|
||||
+ 'Das Gespräch selbst bleibt im Kalender und steht danach '
|
||||
+ 'wieder unter „Protokoll fehlt".\n\n'
|
||||
+ 'Bereits daraus entstandene Aufgaben bleiben ebenfalls stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Protokoll zu „' + c.titel + '" löschen?',
|
||||
was: 'Der Text ist danach weg und lässt sich nicht wiederholen.',
|
||||
bleibt: 'Das Gespräch bleibt im Kalender und steht danach wieder '
|
||||
+ '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' });
|
||||
if (!a.ok) {
|
||||
melde(sagWas((await a.json().catch(() => ({}))).fehler, 'Löschen ging nicht.'));
|
||||
|
||||
+21
-14
@@ -1418,8 +1418,12 @@
|
||||
}
|
||||
|
||||
async function zuruecknehmen(id) {
|
||||
if (!window.confirm('Diese Nachricht zurücknehmen? Der Text ist dann weg, '
|
||||
+ 'im Verlauf bleibt ein Hinweis stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Nachricht zurücknehmen?',
|
||||
was: 'Der Text ist danach weg – auch bei allen anderen.',
|
||||
bleibt: 'Im Verlauf bleibt ein Hinweis stehen, dass hier etwas stand.',
|
||||
endgueltig: true, ja: 'Zurücknehmen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/nachrichten/${id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
@@ -2220,11 +2224,13 @@
|
||||
$('gespraech-weg').addEventListener('click', async () => {
|
||||
if (!offen) return;
|
||||
const wer = offen.name;
|
||||
if (!window.confirm(
|
||||
`Gespräch mit ${wer} wegräumen?\n\n`
|
||||
+ 'Es verschwindet nur bei dir. Der Verlauf beim Gegenüber bleibt '
|
||||
+ 'vollständig.\n\nSchreibt euch jemand wieder, kommt das Gespräch '
|
||||
+ 'mit dem Neuen zurück – das Alte bleibt weg.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `Gespräch mit ${wer} wegräumen?`,
|
||||
was: 'Es verschwindet nur bei dir aus der Liste.',
|
||||
bleibt: `Der Verlauf bei ${wer} bleibt vollständig. Schreibt ihr euch `
|
||||
+ 'wieder, kommt das Gespräch mit dem Neuen zurück – das Alte bleibt weg.',
|
||||
ja: 'Wegräumen',
|
||||
})) return;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/chat/raeume/${offen.id}`, { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
@@ -2252,13 +2258,14 @@
|
||||
if (!offen || !offen.darf_aufloesen) return;
|
||||
const wasIstEs = offen.art === 'kanal' ? 'Kanal' : 'Gruppe';
|
||||
const andere = Math.max(0, (offen.teilnehmer?.length || 1) - 1);
|
||||
if (!window.confirm(
|
||||
`${wasIstEs} „${offen.name}" für alle auflösen?\n\n`
|
||||
+ `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1
|
||||
? 'der anderen Person' : `den ${andere} anderen`}, samt aller `
|
||||
+ 'Anhänge. Das lässt sich nicht rückgängig machen.\n\n'
|
||||
+ 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf '
|
||||
+ 'daneben – dann behalten die anderen alles.')) return;
|
||||
if (!await frageNach({
|
||||
titel: `${wasIstEs} „${offen.name}" für alle auflösen?`,
|
||||
was: `Der ganze Verlauf wird gelöscht – auch bei ${andere === 1
|
||||
? 'der anderen Person' : `den ${andere} anderen`}, samt aller Anhänge.`,
|
||||
bleibt: 'Wenn du sie nur bei dir loswerden willst, nimm den Knopf '
|
||||
+ 'daneben – dann behalten die anderen alles.',
|
||||
endgueltig: true, ja: 'Für alle auflösen',
|
||||
})) return;
|
||||
const knopf = $('raum-aufloesen');
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
|
||||
@@ -440,9 +440,17 @@
|
||||
const neu = stufe === wert ? 'offen' : wert;
|
||||
let grund = stand?.begruendung || '';
|
||||
if (neu === 'verbessern') {
|
||||
grund = prompt(`„${p.titel}“\n\nWas genau soll verbessert werden?\n\n`
|
||||
+ 'Ohne diesen Satz kann er nichts damit anfangen.', grund) || '';
|
||||
if (grund.trim().length < 5) return;
|
||||
const ag = await frageNach({
|
||||
titel: `„${p.titel}" – noch verbessern`,
|
||||
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;
|
||||
try {
|
||||
@@ -549,7 +557,12 @@
|
||||
weg.type = 'button';
|
||||
weg.title = 'Eigene Nachricht zurücknehmen';
|
||||
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 {
|
||||
const a = await hole(`/workspace/api/checkliste/nachricht/${n.id}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -213,7 +213,12 @@
|
||||
knoepfe.append(tuKnopf('→ LIVE', 'Als LIVE-Thema vormerken', () => uebernehmen(e, 'live')));
|
||||
}
|
||||
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' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
@@ -383,7 +388,13 @@
|
||||
Ausgeblendet ist nicht dasselbe wie nicht vorhanden. */
|
||||
if (!darfEintragen()) { ziel.append(z); continue; }
|
||||
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' });
|
||||
if (!a.ok) { melde('Ging nicht.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -220,7 +220,12 @@
|
||||
}
|
||||
if (LEITUNG.has(ich.rolle) || (d.hochgeladen_von === ich.id && d.status !== 'freigegeben')) {
|
||||
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' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -287,8 +287,25 @@
|
||||
}
|
||||
|
||||
async function fallSchliessen(id) {
|
||||
const wort = prompt('Ein Schlusswort? (Kann auch leer bleiben)');
|
||||
if (wort === null) return;
|
||||
/* DER EINZIGE WEG IST VORWAERTS. Gemessen am 19.09.2026: Es gibt
|
||||
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 {
|
||||
const a = await hole('/workspace/api/hilfe/' + id + '/schliessen', {
|
||||
method: 'POST',
|
||||
|
||||
@@ -64,10 +64,13 @@
|
||||
}
|
||||
|
||||
async function erzeugen(erneuern) {
|
||||
if (erneuern && !window.confirm(
|
||||
'Neuen Link erzeugen?\n\nDer alte hört im selben Moment auf zu funktionieren. '
|
||||
+ 'Ein Kalender, der ihn abonniert hat, bekommt danach keine Termine mehr, '
|
||||
+ 'bis du ihm den neuen gibst.')) return;
|
||||
if (erneuern && !await frageNach({
|
||||
titel: 'Neuen Link erzeugen?',
|
||||
was: 'Der alte hört im selben Moment auf zu funktionieren.',
|
||||
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('');
|
||||
try {
|
||||
const a = await hole('/workspace/api/ics', {
|
||||
@@ -83,9 +86,13 @@
|
||||
}
|
||||
|
||||
async function abschalten() {
|
||||
if (!window.confirm(
|
||||
'Abschalten?\n\nDeine Termine verschwinden dann aus jedem Kalender, '
|
||||
+ 'der sie abonniert hat.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Kalender-Link abschalten?',
|
||||
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('');
|
||||
try {
|
||||
const a = await hole('/workspace/api/ics', { method: 'DELETE' });
|
||||
|
||||
@@ -949,11 +949,14 @@
|
||||
if (s.darf_aendern) {
|
||||
const knoepfe = el('div', 'k-serie__knoepfe');
|
||||
knoepfe.append(tuKnopf(s.aktiv ? 'abstellen' : 'wieder starten', async () => {
|
||||
if (s.aktiv && !confirm(
|
||||
'Wiederholung „' + s.titel + '" abstellen?\n\n'
|
||||
+ 'Kommende Termine, die noch niemand angefasst hat, werden aus dem '
|
||||
+ 'Kalender genommen. Vergangene und bearbeitete Termine bleiben stehen.\n\n'
|
||||
+ 'Du kannst sie jederzeit wieder starten.')) return;
|
||||
if (s.aktiv && !await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" abstellen?',
|
||||
was: 'Kommende Termine, die noch niemand angefasst hat, werden aus '
|
||||
+ 'dem Kalender genommen.',
|
||||
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, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -963,10 +966,14 @@
|
||||
await laden();
|
||||
}));
|
||||
knoepfe.append(tuKnopf('löschen', async () => {
|
||||
if (!confirm('Wiederholung „' + s.titel + '" ganz löschen?\n\n'
|
||||
+ 'Die Regel ist damit weg. Kommende, unangetastete Termine werden '
|
||||
+ 'entfernt; vergangene und bearbeitete bleiben als normale Termine '
|
||||
+ 'stehen.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Wiederholung „' + s.titel + '" ganz löschen?',
|
||||
was: 'Die Regel ist damit weg. Kommende, noch unangetastete Termine '
|
||||
+ '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' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
@@ -1221,12 +1228,20 @@
|
||||
dass NUR dieser eine Tag entfällt. Sonst löscht jemand ihn
|
||||
in der Annahme, die Wiederholung sei damit abgestellt --
|
||||
und wundert sich nächste Woche. */
|
||||
const frage = e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?\n\n'
|
||||
+ 'Die Wiederholung „' + e.titel + '" läuft weiter. Zum Abstellen '
|
||||
+ 'den Schalter unter „Läuft von allein" benutzen.'
|
||||
: 'Termin „' + e.titel + '" löschen?';
|
||||
if (!confirm(frage)) return;
|
||||
|
||||
if (!await frageNach({
|
||||
titel: e.serie_id
|
||||
? 'Nur diesen einen Termin am ' + tagLang(e.tag) + ' streichen?'
|
||||
: 'Termin „' + e.titel + '" löschen?',
|
||||
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' });
|
||||
if (!a.ok) { melde('Löschen ging nicht.'); return; }
|
||||
await laden();
|
||||
|
||||
@@ -404,7 +404,13 @@
|
||||
|
||||
async function tagLoeschen() {
|
||||
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 {
|
||||
const a = await hole(`/workspace/api/leistung/${offenerCreator}/${d.dataset.tag}`,
|
||||
{ method: 'DELETE' });
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
})();
|
||||
@@ -311,8 +311,14 @@
|
||||
allein sagt nicht, WAS sich ändert -- und es ist der Handgriff,
|
||||
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;
|
||||
if (!confirm(`${rolleFuer.name} wird von "${ROLLENNAME[rolleFuer.rolle] || rolleFuer.rolle}" zu "${name}".\n\n`
|
||||
+ 'Der Zugangscode bleibt derselbe. Offene Sitzungen werden beendet.')) return;
|
||||
if (!await frageNach({
|
||||
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`, {
|
||||
method: 'PUT',
|
||||
@@ -577,18 +583,17 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
knoepfe.append(tuKnopf('Neuer Code', async () => {
|
||||
const eigen = p.id === ich.id;
|
||||
const frage = eigen
|
||||
/* Der Satz stimmte bis zum 02.09.2026 -- und beschrieb genau die
|
||||
Falle: Man bestätigte, der Code erschien, und im selben Moment
|
||||
war die Sitzung weg. Jetzt bleibt sie bestehen, und der Text
|
||||
sagt, was wirklich passiert. */
|
||||
? 'Neuer Code für dich selbst?\n\n'
|
||||
+ 'Der alte Code gilt danach nicht mehr, und alle ANDEREN Geräte '
|
||||
+ 'werden abgemeldet.\n\n'
|
||||
+ 'Hier bleibst du angemeldet – der neue Code steht danach auf dem '
|
||||
+ 'Bildschirm, bis du ihn selbst wegklickst.'
|
||||
: `Neuer Code für ${p.name}?\n\nDer alte Code gilt dann nicht mehr, offene Sitzungen werden beendet.`;
|
||||
if (!confirm(frage)) return;
|
||||
if (!await frageNach({
|
||||
titel: eigen ? 'Neuer Code für dich selbst?' : `Neuer Code für ${p.name}?`,
|
||||
was: 'Der alte Code gilt danach nicht mehr.',
|
||||
bleibt: eigen
|
||||
? 'Alle ANDEREN Geräte werden abgemeldet – hier bleibst du '
|
||||
+ 'angemeldet. Der neue Code steht danach auf dem Bildschirm, '
|
||||
+ 'bis du ihn selbst wegklickst.'
|
||||
: `Offene Sitzungen von ${p.name} werden beendet. Alles andere `
|
||||
+ 'bleibt unverändert – nur der Code ist neu.',
|
||||
endgueltig: true, ja: 'Neuen Code erzeugen',
|
||||
})) return;
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${p.id}/code`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -601,7 +606,13 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
if (p.id !== ich.id) {
|
||||
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}`, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -704,43 +715,42 @@ Der Code gilt einmal fuer die `
|
||||
|
||||
if (v.hindernis) { melde(v.hindernis); return; }
|
||||
|
||||
const zeilen = [];
|
||||
const mit = Object.entries(v.mit).filter(([, n]) => n > 0);
|
||||
const bleibt = Object.entries(v.bleibt).filter(([, n]) => n > 0);
|
||||
|
||||
zeilen.push(`„${v.person.name}" wirklich löschen?`, '');
|
||||
if (mit.length) {
|
||||
zeilen.push('Wird MITGELÖSCHT:');
|
||||
for (const [was, n] of mit) zeilen.push(` · ${was}: ${n}`);
|
||||
zeilen.push('');
|
||||
}
|
||||
if (bleibt.length) {
|
||||
zeilen.push('BLEIBT erhalten, verliert nur die Zuordnung:');
|
||||
for (const [was, n] of bleibt) zeilen.push(` · ${was}: ${n}`);
|
||||
zeilen.push('');
|
||||
}
|
||||
if (v.verliertBetreuung.length) {
|
||||
zeilen.push(`ACHTUNG: ${v.verliertBetreuung.join(', ')} `
|
||||
+ `${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.', '');
|
||||
}
|
||||
zeilen.push('Vorher wird automatisch eine Sicherung geschrieben.', '',
|
||||
`Zum Bestätigen den Namen genau eingeben: ${v.person.name}`);
|
||||
/* Was mitgeht und was bleibt, sind ZWEI Aussagen -- deshalb stehen
|
||||
sie im Dialog auch in zwei Zeilen und nicht in einer Liste, die
|
||||
man von oben nach unten durchliest und in der Mitte aufgibt. */
|
||||
const wasWeg = mit.length
|
||||
? 'Mitgelöscht wird: ' + mit.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
|
||||
: 'An dieser Person hängt nichts, was mitgelöscht würde.';
|
||||
const wasBleibt = [
|
||||
bleibt.length
|
||||
? 'Erhalten bleibt, verliert aber die Zuordnung: '
|
||||
+ bleibt.map(([w, n]) => `${w} (${n})`).join(', ') + '.'
|
||||
: '',
|
||||
v.verliertBetreuung.length
|
||||
? `${v.verliertBetreuung.join(', ')} `
|
||||
+ `${v.verliertBetreuung.length === 1 ? 'steht' : 'stehen'} danach `
|
||||
+ 'ohne zuständige Person da.'
|
||||
: '',
|
||||
'Vorher wird automatisch eine Sicherung geschrieben.',
|
||||
].filter(Boolean).join(' ');
|
||||
|
||||
const eingabe = prompt(zeilen.join('\n'), '');
|
||||
if (eingabe === null) return;
|
||||
if (eingabe.trim() !== v.person.name) {
|
||||
melde('Der Name stimmt nicht – es wurde nichts gelöscht.');
|
||||
return;
|
||||
}
|
||||
if (!await frageNach({
|
||||
titel: `„${v.person.name}" löschen?`,
|
||||
was: wasWeg,
|
||||
bleibt: wasBleibt,
|
||||
endgueltig: true,
|
||||
ja: 'Endgültig löschen',
|
||||
tippen: v.person.name,
|
||||
})) return;
|
||||
|
||||
try {
|
||||
const a = await hole(`/workspace/api/verwaltung/personen/${person.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ name: eingabe.trim() }),
|
||||
body: JSON.stringify({ name: v.person.name }),
|
||||
});
|
||||
const d = await a.json().catch(() => ({}));
|
||||
if (!a.ok) { melde(sagWas(d.fehler, 'Löschen hat nicht geklappt.')); return; }
|
||||
|
||||
@@ -109,9 +109,13 @@
|
||||
sieht sofort jemand. Etwas aufzumachen merkt unter Umständen
|
||||
lange niemand — und genau das ist der Klick, bei dem eine
|
||||
Sekunde Nachdenken etwas wert ist. */
|
||||
if (erlaubt && !confirm(
|
||||
`„${rolle.name}" darf danach ${seite.datei} öffnen.\n\n`
|
||||
+ 'Das gilt sofort, für alle mit dieser Rolle. Sicher?')) return;
|
||||
if (erlaubt && !await frageNach({
|
||||
titel: `„${rolle.name}" darf danach ${seite.datei} öffnen`,
|
||||
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;
|
||||
try {
|
||||
@@ -167,8 +171,13 @@
|
||||
const b = el('button', 'schritt', 'Alles zurück auf Grundstand');
|
||||
b.type = 'button';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm(`${daten.abweichungen} Änderungen zurücknehmen?\n\n`
|
||||
+ 'Danach gilt wieder genau das, was im Code steht.')) return;
|
||||
if (!await frageNach({
|
||||
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;
|
||||
const a = await hole('/workspace/api/rechte/abweichungen', { method: 'DELETE' });
|
||||
b.disabled = false;
|
||||
|
||||
@@ -166,9 +166,14 @@
|
||||
const b = el('button', 'knopf knopf--klein', 'Durchgegangen und bestätigt');
|
||||
b.type = 'button';
|
||||
b.addEventListener('click', async () => {
|
||||
if (!confirm('Bestätigen, dass ihr das Dokument gemeinsam durchgegangen seid?\n\n'
|
||||
+ 'Sobald BEIDE bestätigt haben, ist der Nachweis endgültig und lässt sich '
|
||||
+ 'nicht mehr ändern.')) return;
|
||||
if (!await frageNach({
|
||||
titel: 'Gemeinsam durchgegangen?',
|
||||
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.textContent = 'wird gespeichert …';
|
||||
try {
|
||||
|
||||
@@ -329,7 +329,12 @@
|
||||
const wg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
|
||||
wg.type = 'button';
|
||||
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(); }
|
||||
});
|
||||
unten.append(wg);
|
||||
@@ -344,7 +349,13 @@
|
||||
}
|
||||
|
||||
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;
|
||||
const r = await schicke('/workspace/api/leads/' + l.id + '/onboarding', 'POST', { name: l.name });
|
||||
knopf.disabled = false;
|
||||
|
||||
@@ -160,7 +160,14 @@
|
||||
});
|
||||
|
||||
$('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 {
|
||||
const a = await hole('/workspace/api/steckbrief/bild', { method: 'DELETE' });
|
||||
if (!a.ok) { melde('Entfernen ging nicht.'); return; }
|
||||
|
||||
@@ -650,12 +650,18 @@
|
||||
if (!darfAnlegen()) { melde('Zugänge legt DogFather an.'); return null; }
|
||||
|
||||
const vorschlag = String(k.titel || '').split(/[\s,(–-]+/)[0] || '';
|
||||
const name = prompt(
|
||||
'Wie soll die Person im Workspace heißen?\n\n'
|
||||
+ 'Das ist der Name, den euer Team sieht. Gleich danach bekommst du '
|
||||
+ 'einmalig ihren Zugangscode – danach nie wieder.',
|
||||
vorschlag);
|
||||
if (name === null) return null; // abgebrochen
|
||||
const an = await frageNach({
|
||||
titel: 'Zugang anlegen',
|
||||
was: 'Die Person bekommt ein eigenes Konto im Workspace.',
|
||||
bleibt: 'Gleich danach siehst du einmalig ihren Zugangscode – danach '
|
||||
+ 'nie wieder. Schreib ihn dir vorher auf oder hab den Chat offen.',
|
||||
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; }
|
||||
|
||||
let a;
|
||||
|
||||
@@ -181,10 +181,24 @@
|
||||
}
|
||||
|
||||
async function entscheiden(id, status) {
|
||||
const entscheid = prompt(status === 'erledigt'
|
||||
? 'Was hast du getan?\n\nEin Satz genügt – er wird zur Meldung festgehalten.'
|
||||
: 'Warum ist daran nichts dran?\n\nEin Satz genügt – er wird festgehalten.');
|
||||
if (entscheid === null) return;
|
||||
const ae = await frageNach({
|
||||
titel: status === 'erledigt' ? 'Meldung als erledigt schließen'
|
||||
: 'Meldung als unbegründet schließen',
|
||||
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, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
@@ -270,24 +284,36 @@
|
||||
wird, hat die Strafe schon festgelegt, bevor er sie begründet hat.
|
||||
So steht am Anfang die Frage, was eigentlich passiert ist. */
|
||||
async function massnahme(m, art, darf) {
|
||||
const grund = prompt(art === 'hinweis'
|
||||
? `Hinweis an ${m.name} – worum geht es?`
|
||||
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name} – warum?\n\n`
|
||||
+ 'Der Grund wird festgehalten, und die Person hat ein Recht darauf.');
|
||||
if (grund === null) return;
|
||||
|
||||
let tage;
|
||||
if (art !== 'hinweis') {
|
||||
const hinweis = darf?.frist_tage
|
||||
? `Du kannst bis zu ${darf.frist_tage} Tage geben.`
|
||||
: 'Leer lassen = dauerhaft (nur bei Ausschluss).';
|
||||
const ein = prompt(`Für wie viele Tage?\n\n${hinweis}`,
|
||||
darf?.frist_tage ? String(darf.frist_tage) : '7');
|
||||
if (ein === null) return;
|
||||
tage = ein.trim() === '' ? null : Number(ein);
|
||||
if (tage !== null && !(tage > 0)) { melde('Das ist keine Anzahl Tage.'); return; }
|
||||
if (tage === null && art === 'pause') { melde('Eine Pause braucht eine Dauer.'); return; }
|
||||
}
|
||||
const istHinweis = art === 'hinweis';
|
||||
const wieLang = istHinweis ? null : (darf?.frist_tage || 0);
|
||||
const a0 = await frageNach({
|
||||
titel: istHinweis
|
||||
? `Hinweis an ${m.name}`
|
||||
: `${art === 'pause' ? 'Pause' : 'Ausschluss'} für ${m.name}`,
|
||||
was: istHinweis
|
||||
? 'Die Person bekommt deinen Text zu lesen. Sie darf weiter mitmachen.'
|
||||
: (art === 'pause'
|
||||
? 'Die Person kann für die eingetragene Zeit nichts schreiben.'
|
||||
: 'Die Person kann nichts mehr schreiben.'),
|
||||
bleibt: 'Der Grund wird festgehalten und der Person mitgeteilt – sie hat '
|
||||
+ 'ein Recht darauf. Aufheben geht jederzeit.',
|
||||
ja: istHinweis ? 'Hinweis schicken' : 'Eintragen',
|
||||
grund: istHinweis ? 'Worum geht es?' : 'Warum?', grundPflicht: true,
|
||||
platzhalter: istHinweis
|
||||
? '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', {
|
||||
method: 'POST',
|
||||
@@ -324,7 +350,13 @@
|
||||
+ ' am ' + datum(m.zeitpunkt)],
|
||||
], laeuft && m.art !== 'hinweis' ? [
|
||||
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' });
|
||||
if (!r.ok) {
|
||||
melde(sagWas((await r.json().catch(() => ({}))).fehler, 'Ging nicht.'));
|
||||
|
||||
@@ -146,8 +146,13 @@
|
||||
: `Alle ${liste.length} Punkte übernehmen`);
|
||||
allesNehmen.type = 'button';
|
||||
allesNehmen.addEventListener('click', async () => {
|
||||
if (!confirm(`Wirklich alle ${liste.length} übernehmen? `
|
||||
+ 'Sie landen als eigene Einträge in der Liste und lassen sich einzeln löschen.')) return;
|
||||
if (!await frageNach({
|
||||
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.textContent = 'wird übernommen …';
|
||||
try {
|
||||
|
||||
@@ -251,7 +251,13 @@
|
||||
const weg = el('button', 'knopf-still knopf-still--warn', 'Löschen');
|
||||
weg.type = 'button';
|
||||
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' });
|
||||
if (!a.ok) { melde('Löschen hat nicht geklappt.'); return; }
|
||||
await laden_();
|
||||
|
||||
+14
-13
@@ -12,19 +12,19 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -291,12 +291,13 @@
|
||||
</form>
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/aufgaben.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+179
-179
@@ -1,179 +1,179 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Automationen · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Automationen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Was von allein passiert</p>
|
||||
<h1 class="titel">Automationen</h1>
|
||||
<p class="unterzeile">
|
||||
Alles hier läuft ohne Zutun. Diese Seite zeigt, was gerade greift –
|
||||
und wo du es abschalten kannst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Die KI ist die einzige Automation mit Schalter: Sie kostet
|
||||
Rechenzeit, die der Website gehört. -->
|
||||
<section class="ki-kasten" id="ki-kasten">
|
||||
<div class="ki-kasten__kopf">
|
||||
<div>
|
||||
<p class="marke">Lokale KI</p>
|
||||
<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>
|
||||
</div>
|
||||
<label class="schalter" id="ki-schalter-block" hidden>
|
||||
<input type="checkbox" id="ki-schalter" />
|
||||
<span class="schalter__gleis"><span class="schalter__punkt"></span></span>
|
||||
<span class="schalter__text"><strong id="ki-schalter-text">Angeschaltet</strong></span>
|
||||
</label>
|
||||
</div>
|
||||
<ul class="ki-kasten__daten" id="ki-daten"></ul>
|
||||
</section>
|
||||
|
||||
<!-- Was gerade tatsächlich anliegt: dieselbe Quelle wie auf dem
|
||||
Dashboard, hier aber vollständig statt gekürzt. -->
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<h2 class="block__titel">Was gerade anliegt</h2>
|
||||
<span class="block__zahl" id="hinweis-zahl">–</span>
|
||||
</div>
|
||||
<p class="block__frage">
|
||||
Dieselben Hinweise wie auf der Übersicht, hier vollständig. Sie führen keine
|
||||
eigene Liste – jeder verschwindet, sobald die Sache erledigt ist.
|
||||
</p>
|
||||
<div id="hinweise"><p class="leise">Wird geprüft …</p></div>
|
||||
</section>
|
||||
|
||||
<!-- Sicherung und Zustand. Steht bewusst weit oben: Es ist die einzige
|
||||
Automation, deren Ausfall alles auf einmal kosten würde. -->
|
||||
<section class="zustand" id="zustand-kasten">
|
||||
<div class="zustand__kopf">
|
||||
<div>
|
||||
<p class="marke">Sicherung & Zustand</p>
|
||||
<h2 class="zustand__titel" id="zustand-titel">Wird geprüft …</h2>
|
||||
<p class="zustand__text" id="zustand-text"></p>
|
||||
</div>
|
||||
<button type="button" class="knopf knopf--klein" id="jetzt-sichern">Jetzt sichern</button>
|
||||
</div>
|
||||
<ul class="zustand__daten" id="zustand-daten"></ul>
|
||||
<div class="klapp-kopf zustand__listenkopf">
|
||||
<p class="feldschild">Vorhandene Sicherungen</p>
|
||||
<button type="button" class="knopf-still" id="sicherungen-schalter"
|
||||
aria-expanded="false" aria-controls="sicherungen" hidden>
|
||||
<span id="sicherungen-schalter-text">Alle zeigen</span>
|
||||
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="m6 9.5 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="sicherungen" data-klapp="zu"></div>
|
||||
</section>
|
||||
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<h2 class="block__titel">Läuft dauerhaft im Hintergrund</h2>
|
||||
</div>
|
||||
<div class="regeln" id="regeln"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==== DAS LÖSCHKONZEPT (15.09.2026) =========================
|
||||
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:
|
||||
eine Automatik, die täglich Daten entfernt.
|
||||
|
||||
Sichtbar zu sein ist die halbe Sache. Ein Löschkonzept, von dem
|
||||
niemand weiß, ob es greift, ist ein Dokument; eines mit Zahlen
|
||||
daneben ist eine Zusicherung. Deshalb steht bei jeder Zeile,
|
||||
wie viele Datensätze sie gerade betrifft. -->
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<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>
|
||||
</div>
|
||||
<p class="block__frage">
|
||||
Personenbezogene Daten werden nicht aufgehoben, weil Platz da ist, sondern
|
||||
solange es einen Grund gibt. Läuft täglich von selbst.
|
||||
</p>
|
||||
<div id="aufbewahrung"><p class="leise">Wird geladen …</p></div>
|
||||
</section>
|
||||
|
||||
<section class="block">
|
||||
<!-- Wie im Personen-Bereich: zugeklappt stehen nur die vier
|
||||
neuesten Zeilen da, alles Weitere auf Knopfdruck. -->
|
||||
<div class="block__kopf klapp-kopf">
|
||||
<h2 class="block__titel">Zuletzt automatisch passiert</h2>
|
||||
<button type="button" class="knopf-still" id="verlauf-schalter"
|
||||
aria-expanded="false" aria-controls="verlauf" hidden>
|
||||
<span id="verlauf-schalter-text">Alle zeigen</span>
|
||||
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="m6 9.5 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<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>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Automationen · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/automation.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Automationen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Was von allein passiert</p>
|
||||
<h1 class="titel">Automationen</h1>
|
||||
<p class="unterzeile">
|
||||
Alles hier läuft ohne Zutun. Diese Seite zeigt, was gerade greift –
|
||||
und wo du es abschalten kannst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Die KI ist die einzige Automation mit Schalter: Sie kostet
|
||||
Rechenzeit, die der Website gehört. -->
|
||||
<section class="ki-kasten" id="ki-kasten">
|
||||
<div class="ki-kasten__kopf">
|
||||
<div>
|
||||
<p class="marke">Lokale KI</p>
|
||||
<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>
|
||||
</div>
|
||||
<label class="schalter" id="ki-schalter-block" hidden>
|
||||
<input type="checkbox" id="ki-schalter" />
|
||||
<span class="schalter__gleis"><span class="schalter__punkt"></span></span>
|
||||
<span class="schalter__text"><strong id="ki-schalter-text">Angeschaltet</strong></span>
|
||||
</label>
|
||||
</div>
|
||||
<ul class="ki-kasten__daten" id="ki-daten"></ul>
|
||||
</section>
|
||||
|
||||
<!-- Was gerade tatsächlich anliegt: dieselbe Quelle wie auf dem
|
||||
Dashboard, hier aber vollständig statt gekürzt. -->
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<h2 class="block__titel">Was gerade anliegt</h2>
|
||||
<span class="block__zahl" id="hinweis-zahl">–</span>
|
||||
</div>
|
||||
<p class="block__frage">
|
||||
Dieselben Hinweise wie auf der Übersicht, hier vollständig. Sie führen keine
|
||||
eigene Liste – jeder verschwindet, sobald die Sache erledigt ist.
|
||||
</p>
|
||||
<div id="hinweise"><p class="leise">Wird geprüft …</p></div>
|
||||
</section>
|
||||
|
||||
<!-- Sicherung und Zustand. Steht bewusst weit oben: Es ist die einzige
|
||||
Automation, deren Ausfall alles auf einmal kosten würde. -->
|
||||
<section class="zustand" id="zustand-kasten">
|
||||
<div class="zustand__kopf">
|
||||
<div>
|
||||
<p class="marke">Sicherung & Zustand</p>
|
||||
<h2 class="zustand__titel" id="zustand-titel">Wird geprüft …</h2>
|
||||
<p class="zustand__text" id="zustand-text"></p>
|
||||
</div>
|
||||
<button type="button" class="knopf knopf--klein" id="jetzt-sichern">Jetzt sichern</button>
|
||||
</div>
|
||||
<ul class="zustand__daten" id="zustand-daten"></ul>
|
||||
<div class="klapp-kopf zustand__listenkopf">
|
||||
<p class="feldschild">Vorhandene Sicherungen</p>
|
||||
<button type="button" class="knopf-still" id="sicherungen-schalter"
|
||||
aria-expanded="false" aria-controls="sicherungen" hidden>
|
||||
<span id="sicherungen-schalter-text">Alle zeigen</span>
|
||||
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="m6 9.5 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="sicherungen" data-klapp="zu"></div>
|
||||
</section>
|
||||
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<h2 class="block__titel">Läuft dauerhaft im Hintergrund</h2>
|
||||
</div>
|
||||
<div class="regeln" id="regeln"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==== DAS LÖSCHKONZEPT (15.09.2026) =========================
|
||||
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:
|
||||
eine Automatik, die täglich Daten entfernt.
|
||||
|
||||
Sichtbar zu sein ist die halbe Sache. Ein Löschkonzept, von dem
|
||||
niemand weiß, ob es greift, ist ein Dokument; eines mit Zahlen
|
||||
daneben ist eine Zusicherung. Deshalb steht bei jeder Zeile,
|
||||
wie viele Datensätze sie gerade betrifft. -->
|
||||
<section class="block">
|
||||
<div class="block__kopf">
|
||||
<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>
|
||||
</div>
|
||||
<p class="block__frage">
|
||||
Personenbezogene Daten werden nicht aufgehoben, weil Platz da ist, sondern
|
||||
solange es einen Grund gibt. Läuft täglich von selbst.
|
||||
</p>
|
||||
<div id="aufbewahrung"><p class="leise">Wird geladen …</p></div>
|
||||
</section>
|
||||
|
||||
<section class="block">
|
||||
<!-- Wie im Personen-Bereich: zugeklappt stehen nur die vier
|
||||
neuesten Zeilen da, alles Weitere auf Knopfdruck. -->
|
||||
<div class="block__kopf klapp-kopf">
|
||||
<h2 class="block__titel">Zuletzt automatisch passiert</h2>
|
||||
<button type="button" class="knopf-still" id="verlauf-schalter"
|
||||
aria-expanded="false" aria-controls="verlauf" hidden>
|
||||
<span id="verlauf-schalter-text">Alle zeigen</span>
|
||||
<svg class="klapp-pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="m6 9.5 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<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>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>␍
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/automation.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+140
-140
@@ -1,140 +1,140 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Wie geht's dir? · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Wie geht's dir?</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
DIESE SEITE GEHÖRT DEM MENSCHEN, DER SIE ÖFFNET.
|
||||
|
||||
Hier steht kein anderer Name, keine Beobachtung über jemanden und
|
||||
keine Zahl, die jemand anders sieht. Genau das war der Grund für
|
||||
die eigene Seite: Die Kachel verspricht „die Antworten sieht nur
|
||||
du" – und führte vorher auf eine Seite voller anderer Leute.
|
||||
|
||||
Was DogFather sieht, ist eine einzige Zahl ohne Namen: wie viele
|
||||
im Team es gerade schwer haben. Nicht wer, nicht womit.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Für dich</p>
|
||||
<h1 class="titel">Wie geht's dir?</h1>
|
||||
<!-- ================================================================
|
||||
DIE EINE AUSNAHME GEHÖRT DAZU (ergänzt 19.09.2026).
|
||||
|
||||
Hier stand: „Niemand aus dem Team sieht deine Antworten – auch
|
||||
DogFather nicht." Punkt. Das ist fast wahr und deshalb
|
||||
gefährlich: Aus denselben Antworten entsteht eine Ampel für die
|
||||
Leitung (workspace-entwicklung.js). Sie ist sauber gebaut – sie
|
||||
nennt keine Namen, keinen Punkt, kein Datum, und unter drei
|
||||
Personen schweigt sie ganz. Aber sie existiert.
|
||||
|
||||
Der ehrliche Satz war längst geschrieben und wurde vom Server
|
||||
sogar mitgeliefert (`block.text`) – nur hat ihn nie jemand
|
||||
angezeigt. Er steht jetzt hier im HTML und nicht im Skript:
|
||||
Wer diese Seite öffnet, soll ihn lesen, BEVOR er tippt, nicht
|
||||
nachdem ein Abruf zurückgekommen ist.
|
||||
|
||||
Wenn jemand später davon erfährt und die Seite hatte „niemand"
|
||||
gesagt, ist das Vertrauen weg – und mit ihm die ganze Funktion.
|
||||
============================================================= -->
|
||||
<p class="unterzeile">
|
||||
Ein paar Fragen über dich. Deine Antworten liest niemand – auch
|
||||
DogFather nicht.
|
||||
</p>
|
||||
<p class="unterzeile unterzeile--zusatz">
|
||||
Das Einzige, was nach außen dringt: ob es im Team gerade
|
||||
<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
|
||||
wie ein Name.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Der Rhythmus. Steht VOR den Fragen: Wer hereinkommt, soll zuerst
|
||||
wissen, ob gerade etwas von ihm erwartet wird. -->
|
||||
<section class="b-takt" id="takt" hidden>
|
||||
<p class="b-takt__satz" id="takt-satz">…</p>
|
||||
<button type="button" class="knopf knopf--klein" id="takt-knopf" hidden>Runde abschließen</button>
|
||||
</section>
|
||||
|
||||
<section id="fragen-block">
|
||||
<div id="fragen" aria-busy="true"><p class="leise">wird geladen …</p></div>
|
||||
</section>
|
||||
|
||||
<!-- 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
|
||||
und nicht ersetzt. -->
|
||||
<section class="b-verlauf" id="verlauf-block" hidden>
|
||||
<h2 class="e-abschnitt">Wie es sich entwickelt</h2>
|
||||
<p class="b-verlauf__satz" id="verlauf-satz">…</p>
|
||||
<div id="verlauf" class="b-verlauf__gitter"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==================================================================
|
||||
WAS DEIN VERLAUF SAGT (15.09.2026)
|
||||
|
||||
Filipe: „mach mir auch eine analyse […] eine professionelle auch
|
||||
mit infos und so aus aller welt was tiktok angeht."
|
||||
|
||||
Sie steht UNTER dem Verlauf: erst die Antworten, dann das Muster
|
||||
darin. Andersherum läse man die Deutung, bevor man weiß, worauf
|
||||
sie sich bezieht.
|
||||
|
||||
Sie wird gerechnet, nicht gespeichert – und sie bewertet nicht.
|
||||
Keine Punktzahl über das eigene Befinden: Eine Zahl lädt dazu
|
||||
ein, sie zu verbessern statt ehrlich zu antworten.
|
||||
============================================================== -->
|
||||
<section class="b-analyse" id="analyse-block" hidden>
|
||||
<h2 class="e-abschnitt">Was dein Verlauf sagt</h2>
|
||||
<p class="b-analyse__satz" id="analyse-satz">…</p>
|
||||
<div id="analyse" class="b-analyse__liste"></div>
|
||||
<p class="b-analyse__quelle" id="analyse-quelle"></p>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Wie geht's dir? · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Wie geht's dir?</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
DIESE SEITE GEHÖRT DEM MENSCHEN, DER SIE ÖFFNET.
|
||||
|
||||
Hier steht kein anderer Name, keine Beobachtung über jemanden und
|
||||
keine Zahl, die jemand anders sieht. Genau das war der Grund für
|
||||
die eigene Seite: Die Kachel verspricht „die Antworten sieht nur
|
||||
du" – und führte vorher auf eine Seite voller anderer Leute.
|
||||
|
||||
Was DogFather sieht, ist eine einzige Zahl ohne Namen: wie viele
|
||||
im Team es gerade schwer haben. Nicht wer, nicht womit.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Für dich</p>
|
||||
<h1 class="titel">Wie geht's dir?</h1>
|
||||
<!-- ================================================================
|
||||
DIE EINE AUSNAHME GEHÖRT DAZU (ergänzt 19.09.2026).
|
||||
|
||||
Hier stand: „Niemand aus dem Team sieht deine Antworten – auch
|
||||
DogFather nicht." Punkt. Das ist fast wahr und deshalb
|
||||
gefährlich: Aus denselben Antworten entsteht eine Ampel für die
|
||||
Leitung (workspace-entwicklung.js). Sie ist sauber gebaut – sie
|
||||
nennt keine Namen, keinen Punkt, kein Datum, und unter drei
|
||||
Personen schweigt sie ganz. Aber sie existiert.
|
||||
|
||||
Der ehrliche Satz war längst geschrieben und wurde vom Server
|
||||
sogar mitgeliefert (`block.text`) – nur hat ihn nie jemand
|
||||
angezeigt. Er steht jetzt hier im HTML und nicht im Skript:
|
||||
Wer diese Seite öffnet, soll ihn lesen, BEVOR er tippt, nicht
|
||||
nachdem ein Abruf zurückgekommen ist.
|
||||
|
||||
Wenn jemand später davon erfährt und die Seite hatte „niemand"
|
||||
gesagt, ist das Vertrauen weg – und mit ihm die ganze Funktion.
|
||||
============================================================= -->
|
||||
<p class="unterzeile">
|
||||
Ein paar Fragen über dich. Deine Antworten liest niemand – auch
|
||||
DogFather nicht.
|
||||
</p>
|
||||
<p class="unterzeile unterzeile--zusatz">
|
||||
Das Einzige, was nach außen dringt: ob es im Team gerade
|
||||
<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
|
||||
wie ein Name.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Der Rhythmus. Steht VOR den Fragen: Wer hereinkommt, soll zuerst
|
||||
wissen, ob gerade etwas von ihm erwartet wird. -->
|
||||
<section class="b-takt" id="takt" hidden>
|
||||
<p class="b-takt__satz" id="takt-satz">…</p>
|
||||
<button type="button" class="knopf knopf--klein" id="takt-knopf" hidden>Runde abschließen</button>
|
||||
</section>
|
||||
|
||||
<section id="fragen-block">
|
||||
<div id="fragen" aria-busy="true"><p class="leise">wird geladen …</p></div>
|
||||
</section>
|
||||
|
||||
<!-- 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
|
||||
und nicht ersetzt. -->
|
||||
<section class="b-verlauf" id="verlauf-block" hidden>
|
||||
<h2 class="e-abschnitt">Wie es sich entwickelt</h2>
|
||||
<p class="b-verlauf__satz" id="verlauf-satz">…</p>
|
||||
<div id="verlauf" class="b-verlauf__gitter"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==================================================================
|
||||
WAS DEIN VERLAUF SAGT (15.09.2026)
|
||||
|
||||
Filipe: „mach mir auch eine analyse […] eine professionelle auch
|
||||
mit infos und so aus aller welt was tiktok angeht."
|
||||
|
||||
Sie steht UNTER dem Verlauf: erst die Antworten, dann das Muster
|
||||
darin. Andersherum läse man die Deutung, bevor man weiß, worauf
|
||||
sie sich bezieht.
|
||||
|
||||
Sie wird gerechnet, nicht gespeichert – und sie bewertet nicht.
|
||||
Keine Punktzahl über das eigene Befinden: Eine Zahl lädt dazu
|
||||
ein, sie zu verbessern statt ehrlich zu antworten.
|
||||
============================================================== -->
|
||||
<section class="b-analyse" id="analyse-block" hidden>
|
||||
<h2 class="e-abschnitt">Was dein Verlauf sagt</h2>
|
||||
<p class="b-analyse__satz" id="analyse-satz">…</p>
|
||||
<div id="analyse" class="b-analyse__liste"></div>
|
||||
<p class="b-analyse__quelle" id="analyse-quelle"></p>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/befinden.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+20
-19
@@ -12,24 +12,24 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
|
||||
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
|
||||
Stelle, an der dieselbe Sache anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -251,16 +251,17 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/ampel.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/schulung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereich.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+118
-118
@@ -1,118 +1,118 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anfrage · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · <span id="marke-was">Anfrage</span></span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
DIE ANFRAGE AUS DER COMMUNITY (17.09.2026)
|
||||
|
||||
Filipe: „ich will dass die leute sich da anonym bei mir melden
|
||||
können und eine anfrage machen können. ich will dass es
|
||||
aber profissionel gemacht ist bitte wie ein fragebogen."
|
||||
|
||||
VERTRAULICH, NICHT NAMENLOS - seine Entscheidung. Es gibt keine
|
||||
Selbstanmeldung im Treff; jeder Zugang kommt von DogFather selbst.
|
||||
Eine wirklich namenlose Anfrage wäre also nicht anonymer, sondern
|
||||
nur schlechter: Man könnte niemandem antworten, und aus einer
|
||||
Anfrage würde nie ein Gespräch.
|
||||
|
||||
„Anonym" heißt hier deshalb: NIEMAND AUS DER COMMUNITY SIEHT SIE.
|
||||
Nicht die anderen Mitglieder, nicht die Modis - nur DogFather und
|
||||
die rechte Hand. Und das steht auf dieser Seite, bevor jemand
|
||||
anfängt zu tippen, statt im Kleingedruckten darunter.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Mitmachen</p>
|
||||
<!-- DER NAME DER ROLLE STEHT NICHT IN DIESER DATEI.
|
||||
|
||||
Sie ist ohne Anmeldung aus dem offenen Netz lesbar (gemessen
|
||||
am 17.09.2026: jede Datei unter /workspace/ antwortet mit
|
||||
200). Der Server schickt das Wort in seiner Antwort mit --
|
||||
dieselbe Regel wie bei den Treff-Regeln und im Chat.
|
||||
|
||||
Was hier steht, ist die ehrliche Ueberschrift, falls die
|
||||
Antwort ausbleibt: eine Anfrage ist es so oder so. -->
|
||||
<h1 class="titel" id="titel">Anfrage stellen</h1>
|
||||
<p class="unterzeile">
|
||||
Ein paar Fragen - ehrlich beantwortet ist mehr wert als
|
||||
vollständig. Du kannst zwischendurch aufhören und später
|
||||
weitermachen: Deine Antworten bleiben so lange in diesem
|
||||
Browser. Zu uns kommen sie erst, wenn du abschickst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<!-- Der Stand, wenn schon eine Anfrage vorliegt (oder eine Sperrfrist
|
||||
läuft). Steht ganz oben: Wer hier landet und schon geschickt hat,
|
||||
will als Erstes wissen, was daraus wurde - nicht das Formular
|
||||
noch einmal sehen. -->
|
||||
<section class="bw-stand" id="stand" hidden></section>
|
||||
|
||||
<form class="bw-bogen" id="bogen" hidden novalidate>
|
||||
<div id="gruppen"></div>
|
||||
|
||||
<!-- WER DAS LIEST, steht direkt über dem Absenden-Knopf und nicht
|
||||
nur oben auf der Seite. Wer hier unten ankommt, hat oben zehn
|
||||
Minuten hinter sich. -->
|
||||
<p class="bw-wer-liest" id="wer-liest"></p>
|
||||
|
||||
<div class="bw-abschluss">
|
||||
<button type="submit" class="knopf" id="abschicken">Anfrage abschicken</button>
|
||||
<a class="schritt" href="bereich.html?b=mitmachen">Doch nicht</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- 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/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anfrage · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · <span id="marke-was">Anfrage</span></span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
DIE ANFRAGE AUS DER COMMUNITY (17.09.2026)
|
||||
|
||||
Filipe: „ich will dass die leute sich da anonym bei mir melden
|
||||
können und eine anfrage machen können. ich will dass es
|
||||
aber profissionel gemacht ist bitte wie ein fragebogen."
|
||||
|
||||
VERTRAULICH, NICHT NAMENLOS - seine Entscheidung. Es gibt keine
|
||||
Selbstanmeldung im Treff; jeder Zugang kommt von DogFather selbst.
|
||||
Eine wirklich namenlose Anfrage wäre also nicht anonymer, sondern
|
||||
nur schlechter: Man könnte niemandem antworten, und aus einer
|
||||
Anfrage würde nie ein Gespräch.
|
||||
|
||||
„Anonym" heißt hier deshalb: NIEMAND AUS DER COMMUNITY SIEHT SIE.
|
||||
Nicht die anderen Mitglieder, nicht die Modis - nur DogFather und
|
||||
die rechte Hand. Und das steht auf dieser Seite, bevor jemand
|
||||
anfängt zu tippen, statt im Kleingedruckten darunter.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Mitmachen</p>
|
||||
<!-- DER NAME DER ROLLE STEHT NICHT IN DIESER DATEI.
|
||||
|
||||
Sie ist ohne Anmeldung aus dem offenen Netz lesbar (gemessen
|
||||
am 17.09.2026: jede Datei unter /workspace/ antwortet mit
|
||||
200). Der Server schickt das Wort in seiner Antwort mit --
|
||||
dieselbe Regel wie bei den Treff-Regeln und im Chat.
|
||||
|
||||
Was hier steht, ist die ehrliche Ueberschrift, falls die
|
||||
Antwort ausbleibt: eine Anfrage ist es so oder so. -->
|
||||
<h1 class="titel" id="titel">Anfrage stellen</h1>
|
||||
<p class="unterzeile">
|
||||
Ein paar Fragen - ehrlich beantwortet ist mehr wert als
|
||||
vollständig. Du kannst zwischendurch aufhören und später
|
||||
weitermachen: Deine Antworten bleiben so lange in diesem
|
||||
Browser. Zu uns kommen sie erst, wenn du abschickst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<!-- Der Stand, wenn schon eine Anfrage vorliegt (oder eine Sperrfrist
|
||||
läuft). Steht ganz oben: Wer hier landet und schon geschickt hat,
|
||||
will als Erstes wissen, was daraus wurde - nicht das Formular
|
||||
noch einmal sehen. -->
|
||||
<section class="bw-stand" id="stand" hidden></section>
|
||||
|
||||
<form class="bw-bogen" id="bogen" hidden novalidate>
|
||||
<div id="gruppen"></div>
|
||||
|
||||
<!-- WER DAS LIEST, steht direkt über dem Absenden-Knopf und nicht
|
||||
nur oben auf der Seite. Wer hier unten ankommt, hat oben zehn
|
||||
Minuten hinter sich. -->
|
||||
<p class="bw-wer-liest" id="wer-liest"></p>
|
||||
|
||||
<div class="bw-abschluss">
|
||||
<button type="submit" class="knopf" id="abschicken">Anfrage abschicken</button>
|
||||
<a class="schritt" href="bereich.html?b=mitmachen">Doch nicht</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bewerben.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+91
-91
@@ -1,91 +1,91 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anfragen · Nachwuchs</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="talente.html">Talente</a> · Anfragen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==================================================================
|
||||
DER EINGANG FÜR DIE ANFRAGEN AUS DER COMMUNITY (17.09.2026)
|
||||
|
||||
Filipe: „und dan soll ich annehmen ablehnen, in warteschlange
|
||||
stellen oder sofort kommunizieren können. und wenn ich annehme dan
|
||||
soll diese person automatisch zu talente kategorie weiter geleitet
|
||||
werden."
|
||||
|
||||
HIER STEHEN SÄTZE, DIE JEMAND ÜBER SICH SELBST GESCHRIEBEN HAT,
|
||||
im Vertrauen darauf, dass nur zwei Menschen sie lesen. Diese Seite
|
||||
gehört DogFather und der rechten Hand -- durchgesetzt in der
|
||||
Rechtetafel UND in workspace-bewerbung.js.
|
||||
|
||||
Deshalb steht im Protokoll auch kein Inhalt, sondern nur die
|
||||
Nummer: Das Protokoll lesen mehr Leute als die Anfrage.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Entwicklung & Nachwuchs</p>
|
||||
<h1 class="titel">Anfragen</h1>
|
||||
<p class="unterzeile">
|
||||
Wer sich selbst gemeldet hat. Nimmst du an, entsteht daraus ein
|
||||
Eintrag bei den Talenten – auf der Stufe „Angesprochen“, denn wer
|
||||
sich meldet, hat die erste Frage schon beantwortet.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Die Zahlen. Nicht Schmuck, sondern die Arbeitsanweisung dieser
|
||||
Seite: Was neu ist, steht links und wird zuerst gelesen. -->
|
||||
<section class="bw-zahlen" id="zahlen" hidden></section>
|
||||
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<div id="liste"></div>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anfragen · Nachwuchs</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="talente.html">Talente</a> · Anfragen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==================================================================
|
||||
DER EINGANG FÜR DIE ANFRAGEN AUS DER COMMUNITY (17.09.2026)
|
||||
|
||||
Filipe: „und dan soll ich annehmen ablehnen, in warteschlange
|
||||
stellen oder sofort kommunizieren können. und wenn ich annehme dan
|
||||
soll diese person automatisch zu talente kategorie weiter geleitet
|
||||
werden."
|
||||
|
||||
HIER STEHEN SÄTZE, DIE JEMAND ÜBER SICH SELBST GESCHRIEBEN HAT,
|
||||
im Vertrauen darauf, dass nur zwei Menschen sie lesen. Diese Seite
|
||||
gehört DogFather und der rechten Hand -- durchgesetzt in der
|
||||
Rechtetafel UND in workspace-bewerbung.js.
|
||||
|
||||
Deshalb steht im Protokoll auch kein Inhalt, sondern nur die
|
||||
Nummer: Das Protokoll lesen mehr Leute als die Anfrage.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Entwicklung & Nachwuchs</p>
|
||||
<h1 class="titel">Anfragen</h1>
|
||||
<p class="unterzeile">
|
||||
Wer sich selbst gemeldet hat. Nimmst du an, entsteht daraus ein
|
||||
Eintrag bei den Talenten – auf der Stufe „Angesprochen“, denn wer
|
||||
sich meldet, hat die erste Frage schon beantwortet.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Die Zahlen. Nicht Schmuck, sondern die Arbeitsanweisung dieser
|
||||
Seite: Was neu ist, steht links und wird zuerst gelesen. -->
|
||||
<section class="bw-zahlen" id="zahlen" hidden></section>
|
||||
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<div id="liste"></div>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bewerbungen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/calls.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -89,13 +89,14 @@
|
||||
|
||||
</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/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/calls.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,26 +12,26 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
|
||||
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
|
||||
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
|
||||
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
|
||||
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
|
||||
Dialog zu sehen bekam. -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/chat.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -367,16 +367,17 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609191915"></script>
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956"></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=202609191956" defer></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`
|
||||
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
|
||||
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
|
||||
die Knoepfe fehlten, und niemand wuesste warum. -->
|
||||
<script src="assets/js/anruf.js?v=202609191915"></script>
|
||||
<script src="assets/js/chat.js?v=202609191915"></script>
|
||||
<script src="assets/js/anruf.js?v=202609191956"></script>
|
||||
<script src="assets/js/chat.js?v=202609191956"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+17
-16
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/content.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -179,14 +179,15 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/content.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/checkliste.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/vorlagen.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/content.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+355
-355
@@ -1,355 +1,355 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anmeldung · DogFather Universe</title>
|
||||
<!-- WEDER "Arbeitsbereich" NOCH "die Modis" (11.09.2026).
|
||||
|
||||
Seit die Community durch diese Wand kommt, liest sie auch diesen
|
||||
Satz. "Privater Arbeitsbereich fuer DogFather und die Modis" waere
|
||||
fuer sie schlicht falsch -- und das Erste, was sie ueber das Haus
|
||||
erfaehrt. -->
|
||||
<meta name="description" content="Privater Bereich rund um DogFather. Zugang nur mit persönlichem Code." />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
|
||||
<!-- 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
|
||||
sind getrennt, damit das Handy nicht die große Fassung zieht.
|
||||
|
||||
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
|
||||
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
|
||||
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
|
||||
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
|
||||
werden (die Dateien liegen bereit). -->
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-1920.webp"
|
||||
type="image/webp" media="(min-width: 900px)" />
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
|
||||
<!-- ====================================================================
|
||||
DIE DREI ZEICHEN DIESER WAND (10.09.2026)
|
||||
|
||||
Filipe: "3 rollen. dogfather. rechte hand und modis."
|
||||
|
||||
Von den fuenf Zeichen der anderen Wand bleibt nur der Husky -- die
|
||||
uebrigen gehoeren zu Rollen, die es hier nicht gibt, und ihre
|
||||
Namen haetten im Quelltext nichts verloren.
|
||||
|
||||
DER HUSKY BEI DOGFATHER UND BEI DER RECHTEN HAND, die Pfote bei
|
||||
den Modis (Filipe, 10.09.2026, mit Bildschirmfoto: "bei rechte
|
||||
hand soll der husky sein und bei modis soll die pfote sein").
|
||||
|
||||
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
|
||||
dogfather" -- damals gab es hier zwei Rollen, und der Satz
|
||||
bedeutete "die Modis gehoeren zu Dogi, nicht zur Agentur". Mit
|
||||
drei Rollen sagt dieselbe Absicht etwas anderes: Der Husky steht
|
||||
bei den beiden, die den Ueberblick haben, die Pfote bei denen, die
|
||||
taeglich unterwegs sind. Zwei gleiche Zeichen und ein anderes --
|
||||
das liest sich als Gruppe, nicht als Reihe.
|
||||
|
||||
Die Pfote traegt bei 22 px, weil es fuenf klar getrennte Flaechen
|
||||
sind und keine Innenzeichnung -- dasselbe Argument, mit dem auf der
|
||||
anderen Wand eine Silhouette einem geschliffenen Koerper gewichen
|
||||
ist.
|
||||
================================================================= -->
|
||||
<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
|
||||
Toene zusammen (dunkles Blaugrau -> Silber), damit er neben
|
||||
gezeichneten Zeichen nicht wie ein Fremdkoerper wirkt. -->
|
||||
<filter id="rs-husky-duo" color-interpolation-filters="sRGB">
|
||||
<feComponentTransfer>
|
||||
<feFuncR type="table" tableValues="0.165 0.910"/>
|
||||
<feFuncG type="table" tableValues="0.212 0.933"/>
|
||||
<feFuncB type="table" tableValues="0.267 0.965"/>
|
||||
</feComponentTransfer>
|
||||
</filter>
|
||||
<g id="r-husky">
|
||||
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
|
||||
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
|
||||
<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="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
|
||||
</g>
|
||||
|
||||
<!-- Der Ton der Pfote ist der Modi-Ton (#5f8a9f) nach oben
|
||||
aufgehellt: dasselbe Blau wie das App-Symbol, nur heller, damit
|
||||
es bei 22 px gegen den dunklen Grund steht. -->
|
||||
<linearGradient id="rs-pfote" x1="0" y1="0" x2=".35" y2="1">
|
||||
<stop offset="0" stop-color="#cfe4ef"/>
|
||||
<stop offset=".55" stop-color="#8fb6c8"/>
|
||||
<stop offset="1" stop-color="#5f8a9f"/>
|
||||
</linearGradient>
|
||||
<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="6.5" cy="10.1" rx="2" ry="2.6"
|
||||
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="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"
|
||||
transform="rotate(20 17.5 10.1)"/>
|
||||
<!-- Ein Lichtstreifen oben links auf dem Ballen -- ohne ihn ist er
|
||||
eine flache Flaeche. -->
|
||||
<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"/>
|
||||
</g>
|
||||
|
||||
<!-- DIE COMMUNITY (11.09.2026).
|
||||
|
||||
Zwei Figuren, keine einzelne. Das Zeichen EINER Person ist im
|
||||
Haus schon vergeben; zwei Rollen mit demselben Zeichen heisst,
|
||||
dass das Zeichen nichts mehr sagt.
|
||||
|
||||
(Und ja: Hier stand zuerst der Name jener anderen Rolle. Diese
|
||||
Datei wird an jedes Mitglied der Community ausgeliefert, samt
|
||||
Kommentaren -- eine Rolle der Agentur hat darin nichts verloren.
|
||||
Gefunden hat das nicht das Auge, sondern pruef-crew-adresse, die
|
||||
seit dem 10.09. genau danach sucht. Zum zweiten Mal an einem Tag,
|
||||
und zum zweiten Mal in einem Kommentar, der erklaert, warum man
|
||||
so etwas nicht schreibt.)
|
||||
|
||||
Die hintere Figur ist leiser gesetzt und teilweise verdeckt -- das
|
||||
ist keine Zierde: Bei 22 px verschmelzen zwei gleich helle Formen
|
||||
zu einem Klecks. Erst der Helligkeitsunterschied macht daraus zwei
|
||||
Menschen.
|
||||
|
||||
DERSELBE VERLAUF WIE DIE PFOTE, nicht der Husky-Filter: Die Pfote
|
||||
steht bei denen, die taeglich unterwegs sind, der Husky bei denen
|
||||
mit dem Ueberblick. Die Community ist weder das eine noch das
|
||||
andere -- sie bekommt die Farbe der Pfote und eine eigene Form.
|
||||
Ein drittes Farbsystem auf einer Wand mit vier Kacheln waere
|
||||
Unruhe ohne Aussage. -->
|
||||
<g id="r-leute">
|
||||
<circle fill="url(#rs-pfote)" opacity=".55" cx="15.9" cy="8.1" r="2.9"/>
|
||||
<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"/>
|
||||
<circle fill="url(#rs-pfote)" cx="9.2" cy="7.4" r="3.4"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
</g>
|
||||
</defs></svg>
|
||||
|
||||
|
||||
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
|
||||
<div class="buehne" aria-hidden="true">
|
||||
<picture>
|
||||
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
|
||||
auf einem 2550 px breiten Schirm rechnete der Browser das Bild
|
||||
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
|
||||
das sah man als "nicht hochwertig", ohne es benennen zu koennen.
|
||||
Eine hoehere Bildguete haette daran nichts geaendert: Man kann
|
||||
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
|
||||
Ueber srcset laedt trotzdem jeder nur die Stufe, die er
|
||||
braucht -- ein Handy weiterhin 32 KB. -->
|
||||
<source media="(min-width: 900px)" type="image/webp"
|
||||
srcset="assets/img/buehne/crew-gate-960.webp 960w,
|
||||
assets/img/buehne/crew-gate-1280.webp 1280w,
|
||||
assets/img/buehne/crew-gate-1600.webp 1600w,
|
||||
assets/img/buehne/crew-gate-1920.webp 1920w,
|
||||
assets/img/buehne/crew-gate-2560.webp 2560w" sizes="100vw" />
|
||||
<source type="image/webp"
|
||||
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-900.webp 900w" sizes="100vw" />
|
||||
<img class="buehne__bild" src="assets/img/buehne/crew-gate-1280.webp" alt=""
|
||||
width="1647" height="955" fetchpriority="high" decoding="async" />
|
||||
</picture>
|
||||
<div class="buehne__schleier"></div>
|
||||
</div>
|
||||
|
||||
<!-- ---------- Tafel ----------------------------------------------------
|
||||
|
||||
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
|
||||
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
|
||||
hinein, nicht ungefaehr.
|
||||
|
||||
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
|
||||
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
|
||||
je nach Fensterform schneidet der Browser oben/unten oder
|
||||
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
|
||||
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
|
||||
deckungsgleich mit dem Bild, und die Karte kann in Prozent des
|
||||
BILDES sitzen statt in Prozent des Fensters.
|
||||
|
||||
Er faengt keine Klicks ab (pointer-events: none); nur die Karte
|
||||
darin ist bedienbar. -->
|
||||
<div class="tafel-anker">
|
||||
<main class="tafel" id="tafel">
|
||||
<div class="tafel__kante" aria-hidden="true"></div>
|
||||
|
||||
<!-- 10.09.2026, Wunsch Filipe: hier soll alles auf DogFather und sein
|
||||
Team zugeschnitten sein.
|
||||
|
||||
Zwei Namen und ein Zeichen dazwischen -- nebeneinander, nicht
|
||||
uebereinander. Dogi steht hier nicht ueber den Modis, sie machen
|
||||
das zusammen.
|
||||
|
||||
Das "x" steht als eigenes Element, damit es kleiner und in der
|
||||
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
|
||||
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
|
||||
aria-hidden nicht: Vorgelesen wird "DogFather x Team Dogi", und
|
||||
genau so spricht man es auch aus. -->
|
||||
<header class="kopf">
|
||||
<p class="marke marke--paar">
|
||||
<span class="marke__dogi">DogFather</span>
|
||||
<span class="marke__x">×</span>
|
||||
<span class="marke__crew">Team Dogi</span>
|
||||
</p>
|
||||
<h1 class="titel">Team Dogi</h1>
|
||||
<p class="unterzeile">Team Dogi und der Treff. Zugang nur mit persönlichem Code.</p>
|
||||
</header>
|
||||
|
||||
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
|
||||
<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">
|
||||
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">DogFather</span>
|
||||
<span class="rolle__zusatz">Überblick & Entscheidungen</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- Der Untertitel beschreibt eine AUFGABE, kein Recht -- dieselbe
|
||||
Ueberlegung wie auf der anderen Wand: Wer vor der Auswahl
|
||||
steht, fragt sich nicht, was er duerfte, sondern was er hier
|
||||
tut. Und er stellt niemanden ueber jemanden: "vertritt und
|
||||
koordiniert" ist eine Taetigkeit, kein Rang. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Rechte Hand</span>
|
||||
<span class="rolle__zusatz">Vertritt und koordiniert</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Modi</span>
|
||||
<span class="rolle__zusatz">Chat, Live und eigene Aufgaben</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- DIE VIERTE KACHEL (Entscheidung Filipe, 11.09.2026).
|
||||
|
||||
Der Treff ist kein eigenes Haus mehr, sondern ein Raum in
|
||||
diesem. Damit kommt die Community durch DIESE Wand, und sie
|
||||
braucht etwas zum Drauftippen.
|
||||
|
||||
SIE STEHT GANZ UNTEN, und das ist nicht Rangfolge, sondern
|
||||
Haeufigkeit: Die drei darueber melden sich taeglich an, die
|
||||
Community-Kachel wird von jedem Einzelnen genau einmal
|
||||
gedrueckt und danach merkt sich der Browser die Wahl
|
||||
(localStorage, siehe gate.js). Wer taeglich kommt, soll oben
|
||||
finden, was er taeglich braucht.
|
||||
|
||||
DER UNTERTITEL BESCHREIBT EINEN ORT, KEINE RECHTE -- dieselbe
|
||||
Ueberlegung wie bei den drei anderen: Wer vor der Auswahl
|
||||
steht, fragt sich nicht, was er duerfte, sondern wo er
|
||||
hinwill. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Community</span>
|
||||
<span class="rolle__zusatz">Der Treff</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- ==== DAS ALTER (15.09.2026) ================================
|
||||
Auf der Regelseite steht seit dem 11.09. „ab 18". Bis heute war
|
||||
das ein Satz; jetzt ist es eine Bedingung.
|
||||
|
||||
Es erscheint nur bei der Community-Kachel: Wer zum Team gehört,
|
||||
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.
|
||||
|
||||
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
|
||||
man sie liest, bevor man sie setzt. -->
|
||||
<div class="alterfrage" id="alterfrage" hidden>
|
||||
<label class="alterfrage__zeile">
|
||||
<input type="checkbox" id="alter-ok" />
|
||||
<span class="alterfrage__text">
|
||||
Ich bin mindestens <strong id="alter-zahl">18</strong> Jahre alt.
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<form class="formular" id="formular" novalidate>
|
||||
<label class="feldschild" for="code">
|
||||
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
|
||||
</label>
|
||||
|
||||
<div class="feld">
|
||||
<input type="password" id="code" name="code" inputmode="text"
|
||||
autocomplete="current-password" spellcheck="false"
|
||||
placeholder="Code eingeben" aria-describedby="hinweis fehler" />
|
||||
<button type="button" class="feld__auge" id="auge"
|
||||
aria-label="Code anzeigen" aria-pressed="false">
|
||||
<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"/>
|
||||
<circle class="strich" cx="12" cy="12" r="2.9"/>
|
||||
<path class="strich durch" d="m4 20 16-16"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<button type="submit" class="knopf" id="knopf">
|
||||
<span class="knopf__text">Anmelden</span>
|
||||
<span class="knopf__laden" aria-hidden="true"></span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
|
||||
|
||||
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
|
||||
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
|
||||
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
|
||||
niemanden im Haus kennt. -->
|
||||
<p class="fuss fuss--woher">Noch keinen Code? Frag im Live nach – Team Dogi gibt ihn dir persönlich.</p>
|
||||
|
||||
<p class="fuss">
|
||||
Verschlüsselte Verbindung · Zugriffe werden protokolliert
|
||||
</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anmeldung · DogFather Universe</title>
|
||||
<!-- WEDER "Arbeitsbereich" NOCH "die Modis" (11.09.2026).
|
||||
|
||||
Seit die Community durch diese Wand kommt, liest sie auch diesen
|
||||
Satz. "Privater Arbeitsbereich fuer DogFather und die Modis" waere
|
||||
fuer sie schlicht falsch -- und das Erste, was sie ueber das Haus
|
||||
erfaehrt. -->
|
||||
<meta name="description" content="Privater Bereich rund um DogFather. Zugang nur mit persönlichem Code." />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
|
||||
<!-- 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
|
||||
sind getrennt, damit das Handy nicht die große Fassung zieht.
|
||||
|
||||
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
|
||||
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
|
||||
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
|
||||
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
|
||||
werden (die Dateien liegen bereit). -->
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-1920.webp"
|
||||
type="image/webp" media="(min-width: 900px)" />
|
||||
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
|
||||
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
|
||||
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
|
||||
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
|
||||
die eine Seite, auf der man das Umfaerben sieht. -->
|
||||
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="gate gate--crew">
|
||||
|
||||
<!-- ====================================================================
|
||||
DIE DREI ZEICHEN DIESER WAND (10.09.2026)
|
||||
|
||||
Filipe: "3 rollen. dogfather. rechte hand und modis."
|
||||
|
||||
Von den fuenf Zeichen der anderen Wand bleibt nur der Husky -- die
|
||||
uebrigen gehoeren zu Rollen, die es hier nicht gibt, und ihre
|
||||
Namen haetten im Quelltext nichts verloren.
|
||||
|
||||
DER HUSKY BEI DOGFATHER UND BEI DER RECHTEN HAND, die Pfote bei
|
||||
den Modis (Filipe, 10.09.2026, mit Bildschirmfoto: "bei rechte
|
||||
hand soll der husky sein und bei modis soll die pfote sein").
|
||||
|
||||
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
|
||||
dogfather" -- damals gab es hier zwei Rollen, und der Satz
|
||||
bedeutete "die Modis gehoeren zu Dogi, nicht zur Agentur". Mit
|
||||
drei Rollen sagt dieselbe Absicht etwas anderes: Der Husky steht
|
||||
bei den beiden, die den Ueberblick haben, die Pfote bei denen, die
|
||||
taeglich unterwegs sind. Zwei gleiche Zeichen und ein anderes --
|
||||
das liest sich als Gruppe, nicht als Reihe.
|
||||
|
||||
Die Pfote traegt bei 22 px, weil es fuenf klar getrennte Flaechen
|
||||
sind und keine Innenzeichnung -- dasselbe Argument, mit dem auf der
|
||||
anderen Wand eine Silhouette einem geschliffenen Koerper gewichen
|
||||
ist.
|
||||
================================================================= -->
|
||||
<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
|
||||
Toene zusammen (dunkles Blaugrau -> Silber), damit er neben
|
||||
gezeichneten Zeichen nicht wie ein Fremdkoerper wirkt. -->
|
||||
<filter id="rs-husky-duo" color-interpolation-filters="sRGB">
|
||||
<feComponentTransfer>
|
||||
<feFuncR type="table" tableValues="0.165 0.910"/>
|
||||
<feFuncG type="table" tableValues="0.212 0.933"/>
|
||||
<feFuncB type="table" tableValues="0.267 0.965"/>
|
||||
</feComponentTransfer>
|
||||
</filter>
|
||||
<g id="r-husky">
|
||||
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
|
||||
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
|
||||
<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="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
|
||||
</g>
|
||||
|
||||
<!-- Der Ton der Pfote ist der Modi-Ton (#5f8a9f) nach oben
|
||||
aufgehellt: dasselbe Blau wie das App-Symbol, nur heller, damit
|
||||
es bei 22 px gegen den dunklen Grund steht. -->
|
||||
<linearGradient id="rs-pfote" x1="0" y1="0" x2=".35" y2="1">
|
||||
<stop offset="0" stop-color="#cfe4ef"/>
|
||||
<stop offset=".55" stop-color="#8fb6c8"/>
|
||||
<stop offset="1" stop-color="#5f8a9f"/>
|
||||
</linearGradient>
|
||||
<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="6.5" cy="10.1" rx="2" ry="2.6"
|
||||
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="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"
|
||||
transform="rotate(20 17.5 10.1)"/>
|
||||
<!-- Ein Lichtstreifen oben links auf dem Ballen -- ohne ihn ist er
|
||||
eine flache Flaeche. -->
|
||||
<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"/>
|
||||
</g>
|
||||
|
||||
<!-- DIE COMMUNITY (11.09.2026).
|
||||
|
||||
Zwei Figuren, keine einzelne. Das Zeichen EINER Person ist im
|
||||
Haus schon vergeben; zwei Rollen mit demselben Zeichen heisst,
|
||||
dass das Zeichen nichts mehr sagt.
|
||||
|
||||
(Und ja: Hier stand zuerst der Name jener anderen Rolle. Diese
|
||||
Datei wird an jedes Mitglied der Community ausgeliefert, samt
|
||||
Kommentaren -- eine Rolle der Agentur hat darin nichts verloren.
|
||||
Gefunden hat das nicht das Auge, sondern pruef-crew-adresse, die
|
||||
seit dem 10.09. genau danach sucht. Zum zweiten Mal an einem Tag,
|
||||
und zum zweiten Mal in einem Kommentar, der erklaert, warum man
|
||||
so etwas nicht schreibt.)
|
||||
|
||||
Die hintere Figur ist leiser gesetzt und teilweise verdeckt -- das
|
||||
ist keine Zierde: Bei 22 px verschmelzen zwei gleich helle Formen
|
||||
zu einem Klecks. Erst der Helligkeitsunterschied macht daraus zwei
|
||||
Menschen.
|
||||
|
||||
DERSELBE VERLAUF WIE DIE PFOTE, nicht der Husky-Filter: Die Pfote
|
||||
steht bei denen, die taeglich unterwegs sind, der Husky bei denen
|
||||
mit dem Ueberblick. Die Community ist weder das eine noch das
|
||||
andere -- sie bekommt die Farbe der Pfote und eine eigene Form.
|
||||
Ein drittes Farbsystem auf einer Wand mit vier Kacheln waere
|
||||
Unruhe ohne Aussage. -->
|
||||
<g id="r-leute">
|
||||
<circle fill="url(#rs-pfote)" opacity=".55" cx="15.9" cy="8.1" r="2.9"/>
|
||||
<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"/>
|
||||
<circle fill="url(#rs-pfote)" cx="9.2" cy="7.4" r="3.4"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
</g>
|
||||
</defs></svg>
|
||||
|
||||
|
||||
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
|
||||
<div class="buehne" aria-hidden="true">
|
||||
<picture>
|
||||
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
|
||||
auf einem 2550 px breiten Schirm rechnete der Browser das Bild
|
||||
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
|
||||
das sah man als "nicht hochwertig", ohne es benennen zu koennen.
|
||||
Eine hoehere Bildguete haette daran nichts geaendert: Man kann
|
||||
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
|
||||
Ueber srcset laedt trotzdem jeder nur die Stufe, die er
|
||||
braucht -- ein Handy weiterhin 32 KB. -->
|
||||
<source media="(min-width: 900px)" type="image/webp"
|
||||
srcset="assets/img/buehne/crew-gate-960.webp 960w,
|
||||
assets/img/buehne/crew-gate-1280.webp 1280w,
|
||||
assets/img/buehne/crew-gate-1600.webp 1600w,
|
||||
assets/img/buehne/crew-gate-1920.webp 1920w,
|
||||
assets/img/buehne/crew-gate-2560.webp 2560w" sizes="100vw" />
|
||||
<source type="image/webp"
|
||||
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-900.webp 900w" sizes="100vw" />
|
||||
<img class="buehne__bild" src="assets/img/buehne/crew-gate-1280.webp" alt=""
|
||||
width="1647" height="955" fetchpriority="high" decoding="async" />
|
||||
</picture>
|
||||
<div class="buehne__schleier"></div>
|
||||
</div>
|
||||
|
||||
<!-- ---------- Tafel ----------------------------------------------------
|
||||
|
||||
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
|
||||
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
|
||||
hinein, nicht ungefaehr.
|
||||
|
||||
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
|
||||
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
|
||||
je nach Fensterform schneidet der Browser oben/unten oder
|
||||
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
|
||||
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
|
||||
deckungsgleich mit dem Bild, und die Karte kann in Prozent des
|
||||
BILDES sitzen statt in Prozent des Fensters.
|
||||
|
||||
Er faengt keine Klicks ab (pointer-events: none); nur die Karte
|
||||
darin ist bedienbar. -->
|
||||
<div class="tafel-anker">
|
||||
<main class="tafel" id="tafel">
|
||||
<div class="tafel__kante" aria-hidden="true"></div>
|
||||
|
||||
<!-- 10.09.2026, Wunsch Filipe: hier soll alles auf DogFather und sein
|
||||
Team zugeschnitten sein.
|
||||
|
||||
Zwei Namen und ein Zeichen dazwischen -- nebeneinander, nicht
|
||||
uebereinander. Dogi steht hier nicht ueber den Modis, sie machen
|
||||
das zusammen.
|
||||
|
||||
Das "x" steht als eigenes Element, damit es kleiner und in der
|
||||
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
|
||||
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
|
||||
aria-hidden nicht: Vorgelesen wird "DogFather x Team Dogi", und
|
||||
genau so spricht man es auch aus. -->
|
||||
<header class="kopf">
|
||||
<p class="marke marke--paar">
|
||||
<span class="marke__dogi">DogFather</span>
|
||||
<span class="marke__x">×</span>
|
||||
<span class="marke__crew">Team Dogi</span>
|
||||
</p>
|
||||
<h1 class="titel">Team Dogi</h1>
|
||||
<p class="unterzeile">Team Dogi und der Treff. Zugang nur mit persönlichem Code.</p>
|
||||
</header>
|
||||
|
||||
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
|
||||
<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">
|
||||
<svg class="rolle__zeichen" viewBox="0 0 24 24" aria-hidden="true"><use href="#r-husky"/></svg>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">DogFather</span>
|
||||
<span class="rolle__zusatz">Überblick & Entscheidungen</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- Der Untertitel beschreibt eine AUFGABE, kein Recht -- dieselbe
|
||||
Ueberlegung wie auf der anderen Wand: Wer vor der Auswahl
|
||||
steht, fragt sich nicht, was er duerfte, sondern was er hier
|
||||
tut. Und er stellt niemanden ueber jemanden: "vertritt und
|
||||
koordiniert" ist eine Taetigkeit, kein Rang. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Rechte Hand</span>
|
||||
<span class="rolle__zusatz">Vertritt und koordiniert</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Modi</span>
|
||||
<span class="rolle__zusatz">Chat, Live und eigene Aufgaben</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- DIE VIERTE KACHEL (Entscheidung Filipe, 11.09.2026).
|
||||
|
||||
Der Treff ist kein eigenes Haus mehr, sondern ein Raum in
|
||||
diesem. Damit kommt die Community durch DIESE Wand, und sie
|
||||
braucht etwas zum Drauftippen.
|
||||
|
||||
SIE STEHT GANZ UNTEN, und das ist nicht Rangfolge, sondern
|
||||
Haeufigkeit: Die drei darueber melden sich taeglich an, die
|
||||
Community-Kachel wird von jedem Einzelnen genau einmal
|
||||
gedrueckt und danach merkt sich der Browser die Wahl
|
||||
(localStorage, siehe gate.js). Wer taeglich kommt, soll oben
|
||||
finden, was er taeglich braucht.
|
||||
|
||||
DER UNTERTITEL BESCHREIBT EINEN ORT, KEINE RECHTE -- dieselbe
|
||||
Ueberlegung wie bei den drei anderen: Wer vor der Auswahl
|
||||
steht, fragt sich nicht, was er duerfte, sondern wo er
|
||||
hinwill. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Community</span>
|
||||
<span class="rolle__zusatz">Der Treff</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- ==== DAS ALTER (15.09.2026) ================================
|
||||
Auf der Regelseite steht seit dem 11.09. „ab 18". Bis heute war
|
||||
das ein Satz; jetzt ist es eine Bedingung.
|
||||
|
||||
Es erscheint nur bei der Community-Kachel: Wer zum Team gehört,
|
||||
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.
|
||||
|
||||
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
|
||||
man sie liest, bevor man sie setzt. -->
|
||||
<div class="alterfrage" id="alterfrage" hidden>
|
||||
<label class="alterfrage__zeile">
|
||||
<input type="checkbox" id="alter-ok" />
|
||||
<span class="alterfrage__text">
|
||||
Ich bin mindestens <strong id="alter-zahl">18</strong> Jahre alt.
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<form class="formular" id="formular" novalidate>
|
||||
<label class="feldschild" for="code">
|
||||
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
|
||||
</label>
|
||||
|
||||
<div class="feld">
|
||||
<input type="password" id="code" name="code" inputmode="text"
|
||||
autocomplete="current-password" spellcheck="false"
|
||||
placeholder="Code eingeben" aria-describedby="hinweis fehler" />
|
||||
<button type="button" class="feld__auge" id="auge"
|
||||
aria-label="Code anzeigen" aria-pressed="false">
|
||||
<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"/>
|
||||
<circle class="strich" cx="12" cy="12" r="2.9"/>
|
||||
<path class="strich durch" d="m4 20 16-16"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<button type="submit" class="knopf" id="knopf">
|
||||
<span class="knopf__text">Anmelden</span>
|
||||
<span class="knopf__laden" aria-hidden="true"></span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
|
||||
|
||||
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
|
||||
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
|
||||
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
|
||||
niemanden im Haus kennt. -->
|
||||
<p class="fuss fuss--woher">Noch keinen Code? Frag im Live nach – Team Dogi gibt ihn dir persönlich.</p>
|
||||
|
||||
<p class="fuss">
|
||||
Verschlüsselte Verbindung · Zugriffe werden protokolliert
|
||||
</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -22,25 +22,25 @@
|
||||
},
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-192.png?v=202609191956",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609191915",
|
||||
"src": "/assets/img/app-symbole/crew-512.png?v=202609191956",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"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",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/dateien.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -108,12 +108,13 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/dateien.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+116
-116
@@ -1,116 +1,116 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Eure Aufgaben · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Eure Aufgaben</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke" id="ober">Entwicklung & Nachwuchs</p>
|
||||
<!-- UMBENANNT AM 19.09.2026 (siehe workspace.js). Diese Seite ist
|
||||
der Aufgabenkatalog: was ein Modi koennen soll und wo er
|
||||
gerade steht. Der Name "Entwicklung" bleibt dem vorbehalten,
|
||||
was Filipe darunter versteht -- einer Auswertung je Person. -->
|
||||
<h1 class="titel" id="titel">Eure Aufgaben</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Anklicken statt tippen. Keine Noten, keine Punktzahl – ein Gesprächsanlass.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==================================================================
|
||||
DIE REIHENFOLGE AUF DIESER SEITE IST DAS EIGENTLICHE DESIGN
|
||||
|
||||
1. Die Ampel — sie betrifft Menschen, nicht Prozesse.
|
||||
2. Die Personen — wen gehe ich heute durch.
|
||||
3. Die Karte — und darin die ABWEICHUNGEN zuerst.
|
||||
4. Ganz unten der Weg zu den eigenen sechs Fragen — sie haben
|
||||
seit dem 15.09.2026 eine eigene Seite.
|
||||
|
||||
Wer die Seite öffnet, soll die wichtigste Sache zuerst sehen, und
|
||||
das ist nicht die Liste. Eine Ampel unter 34 Beobachtungen hätte
|
||||
niemand je gelesen.
|
||||
============================================================== -->
|
||||
|
||||
<section id="ampel" class="e-ampel" hidden></section>
|
||||
|
||||
<section id="personen-block" hidden>
|
||||
<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>
|
||||
</section>
|
||||
|
||||
<section id="karte" class="e-karte" hidden></section>
|
||||
|
||||
<!-- DEINE EIGENE KARTE.
|
||||
|
||||
Sie steht ÜBER den sechs Fragen und UNTER der Liste der anderen:
|
||||
Wer diese Seite als DogFather öffnet, kommt zuerst zu seiner
|
||||
Arbeit; wer beurteilt wird, sieht die Liste gar nicht und
|
||||
landet direkt hier.
|
||||
|
||||
Sie erscheint erst, wenn alle gesetzt haben — eine halbe Karte
|
||||
ist schlimmer als keine. -->
|
||||
<section id="karte-block" class="e-meine" hidden>
|
||||
<h2 class="e-abschnitt">Deine Karte</h2>
|
||||
<p class="e-meine__satz" id="karte-satz">…</p>
|
||||
<div id="meine-karte" aria-busy="true"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==== DIE SECHS FRAGEN STEHEN WOANDERS (15.09.2026) ==========
|
||||
Sie hatten hier ihren Platz, solange es keine eigene Seite gab.
|
||||
Jetzt gibt es eine – und zwei Stellen für dieselben sechs Fragen
|
||||
wären zwei Stände, die auseinanderlaufen. Hier bleibt der Weg
|
||||
dorthin, nicht eine Kopie. -->
|
||||
<section class="e-meins e-meins--verweis" id="meins-block" hidden>
|
||||
<h2 class="e-abschnitt">Und wie geht es dir?</h2>
|
||||
<p class="e-meins__satz">
|
||||
Ein paar Fragen über dich – die Antworten sieht niemand außer dir.
|
||||
</p>
|
||||
<a class="knopf knopf--klein" href="befinden.html">Zu deinen Fragen</a>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Eure Aufgaben · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Eure Aufgaben</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke" id="ober">Entwicklung & Nachwuchs</p>
|
||||
<!-- UMBENANNT AM 19.09.2026 (siehe workspace.js). Diese Seite ist
|
||||
der Aufgabenkatalog: was ein Modi koennen soll und wo er
|
||||
gerade steht. Der Name "Entwicklung" bleibt dem vorbehalten,
|
||||
was Filipe darunter versteht -- einer Auswertung je Person. -->
|
||||
<h1 class="titel" id="titel">Eure Aufgaben</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Anklicken statt tippen. Keine Noten, keine Punktzahl – ein Gesprächsanlass.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==================================================================
|
||||
DIE REIHENFOLGE AUF DIESER SEITE IST DAS EIGENTLICHE DESIGN
|
||||
|
||||
1. Die Ampel — sie betrifft Menschen, nicht Prozesse.
|
||||
2. Die Personen — wen gehe ich heute durch.
|
||||
3. Die Karte — und darin die ABWEICHUNGEN zuerst.
|
||||
4. Ganz unten der Weg zu den eigenen sechs Fragen — sie haben
|
||||
seit dem 15.09.2026 eine eigene Seite.
|
||||
|
||||
Wer die Seite öffnet, soll die wichtigste Sache zuerst sehen, und
|
||||
das ist nicht die Liste. Eine Ampel unter 34 Beobachtungen hätte
|
||||
niemand je gelesen.
|
||||
============================================================== -->
|
||||
|
||||
<section id="ampel" class="e-ampel" hidden></section>
|
||||
|
||||
<section id="personen-block" hidden>
|
||||
<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>
|
||||
</section>
|
||||
|
||||
<section id="karte" class="e-karte" hidden></section>
|
||||
|
||||
<!-- DEINE EIGENE KARTE.
|
||||
|
||||
Sie steht ÜBER den sechs Fragen und UNTER der Liste der anderen:
|
||||
Wer diese Seite als DogFather öffnet, kommt zuerst zu seiner
|
||||
Arbeit; wer beurteilt wird, sieht die Liste gar nicht und
|
||||
landet direkt hier.
|
||||
|
||||
Sie erscheint erst, wenn alle gesetzt haben — eine halbe Karte
|
||||
ist schlimmer als keine. -->
|
||||
<section id="karte-block" class="e-meine" hidden>
|
||||
<h2 class="e-abschnitt">Deine Karte</h2>
|
||||
<p class="e-meine__satz" id="karte-satz">…</p>
|
||||
<div id="meine-karte" aria-busy="true"></div>
|
||||
</section>
|
||||
|
||||
<!-- ==== DIE SECHS FRAGEN STEHEN WOANDERS (15.09.2026) ==========
|
||||
Sie hatten hier ihren Platz, solange es keine eigene Seite gab.
|
||||
Jetzt gibt es eine – und zwei Stellen für dieselben sechs Fragen
|
||||
wären zwei Stände, die auseinanderlaufen. Hier bleibt der Weg
|
||||
dorthin, nicht eine Kopie. -->
|
||||
<section class="e-meins e-meins--verweis" id="meins-block" hidden>
|
||||
<h2 class="e-abschnitt">Und wie geht es dir?</h2>
|
||||
<p class="e-meins__satz">
|
||||
Ein paar Fragen über dich – die Antworten sieht niemand außer dir.
|
||||
</p>
|
||||
<a class="knopf knopf--klein" href="befinden.html">Zu deinen Fragen</a>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/entwicklung.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+13
-12
@@ -7,13 +7,13 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -141,11 +141,12 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/hilfe.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+417
-417
@@ -1,417 +1,417 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anmeldung · Spicy & Dogi</title>
|
||||
<meta name="description" content="Privater Arbeitsbereich für Creator, Scouts und DogFather." />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
|
||||
<!-- 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
|
||||
sind getrennt, damit das Handy nicht die große Fassung zieht.
|
||||
|
||||
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
|
||||
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
|
||||
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
|
||||
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
|
||||
werden (die Dateien liegen bereit). -->
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-1920.webp"
|
||||
type="image/webp" media="(min-width: 900px)" />
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
|
||||
<!-- ====================================================================
|
||||
DIE FÜNF ROLLENZEICHEN, plastisch (08.09.2026)
|
||||
|
||||
Filipe: "die symbole sollen auch noch viel viel viel realistischer
|
||||
und geiler sein", mit genauen Vorgaben je Rolle:
|
||||
peperoni rot und grün
|
||||
husky silber und blaue Augen
|
||||
manager gelber Stern, der glitzert
|
||||
scout grünes Schild mit einer roten Peperoni darin
|
||||
creator lila und silber, "was richtig geiles"
|
||||
|
||||
WAS SICH GRUNDSÄTZLICH ÄNDERT: Vorher trug jedes Zeichen genau EINE
|
||||
Farbe (`currentColor` über `.fuell`/`.linie`). Damit lässt sich
|
||||
"rot UND grün" nicht darstellen. Jedes Zeichen bekommt deshalb
|
||||
eigene Verläufe — dieselbe Technik, mit der auch die Kacheln
|
||||
plastisch wirken: ein heller Rand oben, die Sättigung in der Mitte,
|
||||
Abdunklung unten. Das ergibt Volumen statt einer flachen Fläche.
|
||||
|
||||
WARUM VERLÄUFE UND KEIN DETAIL: Diese Zeichen stehen bei 22 px.
|
||||
Mehr Linien werden dort zu Matsch — das stand schon beim Husky hier,
|
||||
und es gilt weiter. "Realistischer" heißt bei dieser Größe also
|
||||
nicht "mehr Striche", sondern LICHT: eine Form, auf die Licht fällt,
|
||||
wirkt körperlich; dieselbe Form flach gefüllt wirkt wie ein
|
||||
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.
|
||||
|
||||
Die Verlaufs-IDs sind mit `rs-` vorangestellt (RollenSymbol), damit
|
||||
sie mit nichts kollidieren, was später dazukommt.
|
||||
==================================================================== -->
|
||||
<!-- NICHT `display:none` VERSTECKEN -- das war ein echter Fehler, und man
|
||||
sieht ihn erst im Bild (08.09.2026).
|
||||
|
||||
Solange die Zeichen einfarbig waren (`currentColor` ueber CSS), war
|
||||
`display:none` harmlos. Sobald sie ihre Farbe aus einem <linearGradient>
|
||||
im selben <defs> holen, ist es das nicht mehr: Ein Verlauf in einem
|
||||
Teilbaum, der `display:none` traegt, wird nicht ausgewertet, und ein
|
||||
`<use>` darauf bekommt schlicht KEINE Fuellung. Im Bildschirmfoto
|
||||
standen daraufhin fuenf Bruchstuecke -- nur die Strichlinien, keine
|
||||
Flaechen. Die Zahlen sagten dazu nichts, das Sprite war ja da.
|
||||
|
||||
Richtig ist ein Kasten ohne Groesse: Er wird gerendert (Verlaeufe
|
||||
werden also aufgeloest), nimmt aber keinen Platz ein. -->
|
||||
<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">
|
||||
<stop offset="0" stop-color="#ff8a6b"/>
|
||||
<stop offset=".55" stop-color="#ef4136"/>
|
||||
<stop offset="1" stop-color="#a8221c"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-chili-gruen" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#8fd66a"/>
|
||||
<stop offset="1" stop-color="#3f7d33"/>
|
||||
</linearGradient>
|
||||
<!-- `rs-silber` ist am 09.09.2026 entfallen. Er faerbte den alten,
|
||||
selbstgebauten Husky; seit dort das echte Logo steht (mit einem
|
||||
eigenen Duotonie-Filter), benutzte ihn niemand mehr. Ein
|
||||
Verlauf, den man im Quelltext findet und der nichts faerbt,
|
||||
kostet den naechsten Leser eine Suche. -->
|
||||
<!-- DER STERN WIRD LILA (08.09.2026, zweite Ansage von Filipe).
|
||||
Zuerst hiess es "manager: gelber stern der glitzert", dann nach
|
||||
dem Bildschirmfoto: "die hauptfarbe von denen ist lila, der stern
|
||||
soll so bleiben aber was gelb ist soll lila werden."
|
||||
|
||||
Die FORM bleibt also, nur die Farbe wechselt -- und das ist auch
|
||||
stimmiger: Der Manager traegt Lila als Rollenfarbe, ein goldener
|
||||
Stern daneben waere die einzige Stelle gewesen, an der Zeichen und
|
||||
Rolle auseinandergehen. Die Wechsel hell/dunkel bleiben, sie sind
|
||||
es, die aus einer Flaeche einen Koerper machen.
|
||||
|
||||
Der Name der Kennung bleibt `rs-gold`: Sie wird an mehreren
|
||||
Stellen benutzt, und ein Umbenennen waere eine zweite Gelegenheit,
|
||||
eine davon zu vergessen. -->
|
||||
<linearGradient id="rs-gold" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#e6d6ff"/>
|
||||
<stop offset=".45" stop-color="#a78bfa"/>
|
||||
<stop offset="1" stop-color="#5b3fa8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-schild" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#7fe0ae"/>
|
||||
<stop offset=".5" stop-color="#3faa78"/>
|
||||
<stop offset="1" stop-color="#1c5e42"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-lila" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#d9c9ff"/>
|
||||
<stop offset=".38" stop-color="#a78bfa"/>
|
||||
<stop offset="1" stop-color="#5b3fa8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-lila-silber" x1="0" y1="1" x2="1" y2="0">
|
||||
<stop offset="0" stop-color="#6d4fc4"/>
|
||||
<stop offset=".5" stop-color="#cbd5e1"/>
|
||||
<stop offset="1" stop-color="#a78bfa"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="rs-auge" cx=".38" cy=".32" r=".85">
|
||||
<stop offset="0" stop-color="#bfe9ff"/>
|
||||
<stop offset=".45" stop-color="#3fa9f5"/>
|
||||
<stop offset="1" stop-color="#0f4c75"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- SPICY MEDIA — die Peperoni, rot mit grünem Stiel.
|
||||
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,
|
||||
und genau das wollte Filipe nicht. -->
|
||||
<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="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.7" stroke-linecap="round" d="M13.4 4.6c-.5 1.2-.3 2.3.5 3.2"/>
|
||||
</g>
|
||||
|
||||
<!-- DER HUSKY IST JETZT DAS ECHTE LOGO (09.09.2026, screen3).
|
||||
|
||||
Filipe: "dieses husky symbol soll ersetzt werden durch den husky
|
||||
oben in der leiste ... die farbe von der rolle und die barre soll
|
||||
so richtig geil silber sein ... und der husky soll eine geile
|
||||
babyblau sein haben."
|
||||
|
||||
Hier stand eine geometrische Eigenkonstruktion: ein Fuenfeck mit
|
||||
zwei dreieckigen Ohren und zwei Punkten. Sie war ordentlich
|
||||
gebaut, aber sie war nicht DER Husky -- oben in der Leiste steht
|
||||
die richtige Marke, und zwei verschiedene Huskys auf einer Seite
|
||||
sind einer zu viel.
|
||||
|
||||
DAS BILD KOMMT ALS <image>, DIE FARBE AUS EINEM FILTER. Die
|
||||
Datei ist schwarz-weiss und freigestellt. `feComponentTransfer`
|
||||
mit einer zweistufigen Tabelle bildet sie auf zwei Farben ab:
|
||||
Schwarz wird zu dunklem Stahl (#2a3644), Weiss zu Silber
|
||||
(#e8eef6). Das ist eine echte Duotonie -- ein `feColorMatrix`
|
||||
koennte das nicht, der kann nur linear mischen und wuerde die
|
||||
Mitteltoene flach ziehen.
|
||||
|
||||
DAS AUGE IST GEMESSEN, NICHT GESETZT: Ein Durchlauf ueber die
|
||||
Bildpunkte hat die Pupille als einzige dunkle Insel gefunden,
|
||||
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.
|
||||
Darauf liegen Iris (babyblau), Pupille und ein Glanzpunkt.
|
||||
|
||||
Warum ueberhaupt eine Iris: Das Logo hat ein schwarzes Auge.
|
||||
Babyblau war seit dem ersten Auftrag gewuenscht ("husky: silber
|
||||
und blaue augen") und ist es jetzt wieder -- es ist der einzige
|
||||
Farbfleck an einem sonst silbernen Zeichen und traegt damit
|
||||
genau so viel Farbe wie die anderen Rollen auch. -->
|
||||
<filter id="rs-husky-duo" color-interpolation-filters="sRGB">
|
||||
<feComponentTransfer>
|
||||
<feFuncR type="table" tableValues="0.165 0.910"/>
|
||||
<feFuncG type="table" tableValues="0.212 0.933"/>
|
||||
<feFuncB type="table" tableValues="0.267 0.965"/>
|
||||
</feComponentTransfer>
|
||||
</filter>
|
||||
<g id="r-husky">
|
||||
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
|
||||
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
|
||||
<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="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
|
||||
</g>
|
||||
|
||||
<!-- MANAGER — der goldene Stern, der glitzert.
|
||||
Das Funkeln ist ein schmaler heller Streifen, der einmal quer
|
||||
über den Stern wandert. Es ist BEWUSST langsam (4,5 s) und
|
||||
schwach: Ein schnelles Blinken wäre genau die aggressive Optik,
|
||||
die hier nicht sein soll. Bei "weniger Bewegung" steht es still
|
||||
(siehe personen.css) -- dann bleibt ein ruhiger goldener 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="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"/>
|
||||
</g>
|
||||
|
||||
<!-- SCOUT — grünes Schild mit einer roten Peperoni darin.
|
||||
Der Haken von früher ist weg: Filipe hat die Peperoni ausdrücklich
|
||||
verlangt, und beides nebeneinander wäre bei 22 px Matsch. Die
|
||||
Chili ist stark vereinfacht — bei dieser Größe zählt nur, dass
|
||||
eine rote, gebogene Form mit grünem Stiel im Schild steht. -->
|
||||
<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="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="none" stroke="#8fd66a" stroke-width="1.3" stroke-linecap="round" d="M12.9 7.6c.9-.4 1.7 0 1.8.8"/>
|
||||
</g>
|
||||
|
||||
<!-- CREATOR — Lila und Silber.
|
||||
Statt der alten Person-Silhouette (die aussah wie ein leeres
|
||||
Benutzerbild und damit wie "niemand") jetzt ein geschliffener
|
||||
Kristall: lila Kern, silberne Facetten. Er hat als einziges der
|
||||
fünf Zeichen eine Innenzeichnung, und die trägt auch klein --
|
||||
weil es gerade Kanten sind, keine Rundungen. -->
|
||||
<g id="r-person">
|
||||
<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="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"/>
|
||||
</g>
|
||||
</defs></svg>
|
||||
|
||||
|
||||
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
|
||||
<div class="buehne" aria-hidden="true">
|
||||
<picture>
|
||||
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
|
||||
auf einem 2550 px breiten Schirm rechnete der Browser das Bild
|
||||
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
|
||||
das sah man als "nicht hochwertig", ohne es benennen zu koennen.
|
||||
Eine hoehere Bildguete haette daran nichts geaendert: Man kann
|
||||
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
|
||||
Ueber srcset laedt trotzdem jeder nur die Stufe, die er
|
||||
braucht -- ein Handy weiterhin 32 KB. -->
|
||||
<source media="(min-width: 900px)" type="image/webp"
|
||||
srcset="assets/img/buehne/gate-960.webp 960w,
|
||||
assets/img/buehne/gate-1280.webp 1280w,
|
||||
assets/img/buehne/gate-1600.webp 1600w,
|
||||
assets/img/buehne/gate-1920.webp 1920w,
|
||||
assets/img/buehne/gate-2560.webp 2560w" sizes="100vw" />
|
||||
<source type="image/webp"
|
||||
srcset="assets/img/buehne/gate-hoch-440.webp 440w,
|
||||
assets/img/buehne/gate-hoch-580.webp 580w,
|
||||
assets/img/buehne/gate-hoch-900.webp 900w" sizes="100vw" />
|
||||
<img class="buehne__bild" src="assets/img/buehne/gate-1280.webp" alt=""
|
||||
width="1647" height="955" fetchpriority="high" decoding="async" />
|
||||
</picture>
|
||||
<div class="buehne__schleier"></div>
|
||||
</div>
|
||||
|
||||
<!-- ---------- Tafel ----------------------------------------------------
|
||||
|
||||
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
|
||||
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
|
||||
hinein, nicht ungefaehr.
|
||||
|
||||
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
|
||||
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
|
||||
je nach Fensterform schneidet der Browser oben/unten oder
|
||||
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
|
||||
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
|
||||
deckungsgleich mit dem Bild, und die Karte kann in Prozent des
|
||||
BILDES sitzen statt in Prozent des Fensters.
|
||||
|
||||
Er faengt keine Klicks ab (pointer-events: none); nur die Karte
|
||||
darin ist bedienbar. -->
|
||||
<div class="tafel-anker">
|
||||
<main class="tafel" id="tafel">
|
||||
<div class="tafel__kante" aria-hidden="true"></div>
|
||||
|
||||
<!-- 07.09.2026, Wunsch Filipe: "dogfather universe auch ersetzen durch
|
||||
SpicyMedia x DogFather" und der Satz darunter soll "nur um manager
|
||||
scouts und creator von spicy media" gehen, ohne DogFather.
|
||||
|
||||
Das "x" steht als eigenes Element, damit es kleiner und in der
|
||||
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
|
||||
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
|
||||
aria-hidden nicht: Vorgelesen wird "SpicyMedia x DogFather", und
|
||||
genau so spricht man es auch aus. -->
|
||||
<header class="kopf">
|
||||
<p class="marke marke--paar">
|
||||
<span class="marke__spicy">SpicyMedia</span>
|
||||
<span class="marke__x">×</span>
|
||||
<span class="marke__dogi">DogFather</span>
|
||||
</p>
|
||||
<h1 class="titel">Creator Workspace</h1>
|
||||
<p class="unterzeile">Privater Bereich für die Manager, Scouts und Creator von Spicy Media.</p>
|
||||
</header>
|
||||
|
||||
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
|
||||
<p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p>
|
||||
|
||||
<!-- SPICY MEDIA steht ganz oben (07.09.2026, Wunsch Filipe: "ueber
|
||||
dogfather auch eine kategorie, eine neue rolle"). Der Chili ist
|
||||
das Zeichen der Marke -- dieselbe Form wie im Logo, nur als
|
||||
Umriss, damit sie neben Krone, Stern und Schild dieselbe
|
||||
Strichstaerke hat. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Spicy Media</span>
|
||||
<span class="rolle__zusatz">Überblick über alle</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- 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
|
||||
Personenseite war er schon getauscht, hier nicht.
|
||||
|
||||
Bei 21 Pixeln entscheidet die SILHOUETTE, nicht das Detail: die
|
||||
spitzen aufrechten Ohren, der breite Kopf, der nach unten schmal
|
||||
zuläuft, die Gesichtsmaske. Mehr passt nicht hinein, und mehr
|
||||
braucht es nicht -- ein Husky ist an genau diesen drei Dingen
|
||||
zu erkennen.
|
||||
|
||||
Das Schild ist zum Scout gewandert: Ein Scout schirmt die
|
||||
Pipeline ab und prüft, bevor etwas weitergereicht wird. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">DogFather</span>
|
||||
<!-- "Manager & Technik" statt "Gesamtübersicht & Freigaben"
|
||||
(08.09.2026, screen27). Die alte Zeile beschrieb ein RECHT
|
||||
("darf alles sehen und freigeben"), die neue eine AUFGABE --
|
||||
und danach sucht jemand, der vor der Rollenwahl steht: Er
|
||||
fragt sich nicht, was er dürfte, sondern was er hier tut. -->
|
||||
<span class="rolle__zusatz">Manager & Technik</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- Manager: dieselben Rechte wie DogFather, nur die Personen-
|
||||
verwaltung bleibt DogFather vorbehalten. Der Stern steht fuer
|
||||
den Rang darunter, ohne "unter" zu sagen. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Manager</span>
|
||||
<span class="rolle__zusatz">Betreuung & Freigaben</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Scout</span>
|
||||
<span class="rolle__zusatz">Eigene Pipeline & Kontakte</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Creator</span>
|
||||
<span class="rolle__zusatz">Eigener Bereich & Fortschritt</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<form class="formular" id="formular" novalidate>
|
||||
<label class="feldschild" for="code">
|
||||
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
|
||||
</label>
|
||||
|
||||
<div class="feld">
|
||||
<input type="password" id="code" name="code" inputmode="text"
|
||||
autocomplete="current-password" spellcheck="false"
|
||||
placeholder="Code eingeben" aria-describedby="hinweis fehler" />
|
||||
<button type="button" class="feld__auge" id="auge"
|
||||
aria-label="Code anzeigen" aria-pressed="false">
|
||||
<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"/>
|
||||
<circle class="strich" cx="12" cy="12" r="2.9"/>
|
||||
<path class="strich durch" d="m4 20 16-16"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<button type="submit" class="knopf" id="knopf">
|
||||
<span class="knopf__text">Anmelden</span>
|
||||
<span class="knopf__laden" aria-hidden="true"></span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
|
||||
|
||||
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
|
||||
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
|
||||
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
|
||||
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">
|
||||
Verschlüsselte Verbindung · Zugriffe werden protokolliert
|
||||
</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Anmeldung · Spicy & Dogi</title>
|
||||
<meta name="description" content="Privater Arbeitsbereich für Creator, Scouts und DogFather." />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
|
||||
<!-- 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
|
||||
sind getrennt, damit das Handy nicht die große Fassung zieht.
|
||||
|
||||
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
|
||||
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
|
||||
nosniff-Headers vom Browser verweigert - die Bühne bliebe leer. Sobald der
|
||||
Workspace einen eigenen Server bekommt, kann AVIF wieder eingeschaltet
|
||||
werden (die Dateien liegen bereit). -->
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-1920.webp"
|
||||
type="image/webp" media="(min-width: 900px)" />
|
||||
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
|
||||
type="image/webp" media="(max-width: 899px)" />
|
||||
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="gate">
|
||||
|
||||
<!-- ====================================================================
|
||||
DIE FÜNF ROLLENZEICHEN, plastisch (08.09.2026)
|
||||
|
||||
Filipe: "die symbole sollen auch noch viel viel viel realistischer
|
||||
und geiler sein", mit genauen Vorgaben je Rolle:
|
||||
peperoni rot und grün
|
||||
husky silber und blaue Augen
|
||||
manager gelber Stern, der glitzert
|
||||
scout grünes Schild mit einer roten Peperoni darin
|
||||
creator lila und silber, "was richtig geiles"
|
||||
|
||||
WAS SICH GRUNDSÄTZLICH ÄNDERT: Vorher trug jedes Zeichen genau EINE
|
||||
Farbe (`currentColor` über `.fuell`/`.linie`). Damit lässt sich
|
||||
"rot UND grün" nicht darstellen. Jedes Zeichen bekommt deshalb
|
||||
eigene Verläufe — dieselbe Technik, mit der auch die Kacheln
|
||||
plastisch wirken: ein heller Rand oben, die Sättigung in der Mitte,
|
||||
Abdunklung unten. Das ergibt Volumen statt einer flachen Fläche.
|
||||
|
||||
WARUM VERLÄUFE UND KEIN DETAIL: Diese Zeichen stehen bei 22 px.
|
||||
Mehr Linien werden dort zu Matsch — das stand schon beim Husky hier,
|
||||
und es gilt weiter. "Realistischer" heißt bei dieser Größe also
|
||||
nicht "mehr Striche", sondern LICHT: eine Form, auf die Licht fällt,
|
||||
wirkt körperlich; dieselbe Form flach gefüllt wirkt wie ein
|
||||
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.
|
||||
|
||||
Die Verlaufs-IDs sind mit `rs-` vorangestellt (RollenSymbol), damit
|
||||
sie mit nichts kollidieren, was später dazukommt.
|
||||
==================================================================== -->
|
||||
<!-- NICHT `display:none` VERSTECKEN -- das war ein echter Fehler, und man
|
||||
sieht ihn erst im Bild (08.09.2026).
|
||||
|
||||
Solange die Zeichen einfarbig waren (`currentColor` ueber CSS), war
|
||||
`display:none` harmlos. Sobald sie ihre Farbe aus einem <linearGradient>
|
||||
im selben <defs> holen, ist es das nicht mehr: Ein Verlauf in einem
|
||||
Teilbaum, der `display:none` traegt, wird nicht ausgewertet, und ein
|
||||
`<use>` darauf bekommt schlicht KEINE Fuellung. Im Bildschirmfoto
|
||||
standen daraufhin fuenf Bruchstuecke -- nur die Strichlinien, keine
|
||||
Flaechen. Die Zahlen sagten dazu nichts, das Sprite war ja da.
|
||||
|
||||
Richtig ist ein Kasten ohne Groesse: Er wird gerendert (Verlaeufe
|
||||
werden also aufgeloest), nimmt aber keinen Platz ein. -->
|
||||
<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">
|
||||
<stop offset="0" stop-color="#ff8a6b"/>
|
||||
<stop offset=".55" stop-color="#ef4136"/>
|
||||
<stop offset="1" stop-color="#a8221c"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-chili-gruen" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#8fd66a"/>
|
||||
<stop offset="1" stop-color="#3f7d33"/>
|
||||
</linearGradient>
|
||||
<!-- `rs-silber` ist am 09.09.2026 entfallen. Er faerbte den alten,
|
||||
selbstgebauten Husky; seit dort das echte Logo steht (mit einem
|
||||
eigenen Duotonie-Filter), benutzte ihn niemand mehr. Ein
|
||||
Verlauf, den man im Quelltext findet und der nichts faerbt,
|
||||
kostet den naechsten Leser eine Suche. -->
|
||||
<!-- DER STERN WIRD LILA (08.09.2026, zweite Ansage von Filipe).
|
||||
Zuerst hiess es "manager: gelber stern der glitzert", dann nach
|
||||
dem Bildschirmfoto: "die hauptfarbe von denen ist lila, der stern
|
||||
soll so bleiben aber was gelb ist soll lila werden."
|
||||
|
||||
Die FORM bleibt also, nur die Farbe wechselt -- und das ist auch
|
||||
stimmiger: Der Manager traegt Lila als Rollenfarbe, ein goldener
|
||||
Stern daneben waere die einzige Stelle gewesen, an der Zeichen und
|
||||
Rolle auseinandergehen. Die Wechsel hell/dunkel bleiben, sie sind
|
||||
es, die aus einer Flaeche einen Koerper machen.
|
||||
|
||||
Der Name der Kennung bleibt `rs-gold`: Sie wird an mehreren
|
||||
Stellen benutzt, und ein Umbenennen waere eine zweite Gelegenheit,
|
||||
eine davon zu vergessen. -->
|
||||
<linearGradient id="rs-gold" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#e6d6ff"/>
|
||||
<stop offset=".45" stop-color="#a78bfa"/>
|
||||
<stop offset="1" stop-color="#5b3fa8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-schild" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" stop-color="#7fe0ae"/>
|
||||
<stop offset=".5" stop-color="#3faa78"/>
|
||||
<stop offset="1" stop-color="#1c5e42"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-lila" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#d9c9ff"/>
|
||||
<stop offset=".38" stop-color="#a78bfa"/>
|
||||
<stop offset="1" stop-color="#5b3fa8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="rs-lila-silber" x1="0" y1="1" x2="1" y2="0">
|
||||
<stop offset="0" stop-color="#6d4fc4"/>
|
||||
<stop offset=".5" stop-color="#cbd5e1"/>
|
||||
<stop offset="1" stop-color="#a78bfa"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="rs-auge" cx=".38" cy=".32" r=".85">
|
||||
<stop offset="0" stop-color="#bfe9ff"/>
|
||||
<stop offset=".45" stop-color="#3fa9f5"/>
|
||||
<stop offset="1" stop-color="#0f4c75"/>
|
||||
</radialGradient>
|
||||
|
||||
<!-- SPICY MEDIA — die Peperoni, rot mit grünem Stiel.
|
||||
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,
|
||||
und genau das wollte Filipe nicht. -->
|
||||
<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="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.7" stroke-linecap="round" d="M13.4 4.6c-.5 1.2-.3 2.3.5 3.2"/>
|
||||
</g>
|
||||
|
||||
<!-- DER HUSKY IST JETZT DAS ECHTE LOGO (09.09.2026, screen3).
|
||||
|
||||
Filipe: "dieses husky symbol soll ersetzt werden durch den husky
|
||||
oben in der leiste ... die farbe von der rolle und die barre soll
|
||||
so richtig geil silber sein ... und der husky soll eine geile
|
||||
babyblau sein haben."
|
||||
|
||||
Hier stand eine geometrische Eigenkonstruktion: ein Fuenfeck mit
|
||||
zwei dreieckigen Ohren und zwei Punkten. Sie war ordentlich
|
||||
gebaut, aber sie war nicht DER Husky -- oben in der Leiste steht
|
||||
die richtige Marke, und zwei verschiedene Huskys auf einer Seite
|
||||
sind einer zu viel.
|
||||
|
||||
DAS BILD KOMMT ALS <image>, DIE FARBE AUS EINEM FILTER. Die
|
||||
Datei ist schwarz-weiss und freigestellt. `feComponentTransfer`
|
||||
mit einer zweistufigen Tabelle bildet sie auf zwei Farben ab:
|
||||
Schwarz wird zu dunklem Stahl (#2a3644), Weiss zu Silber
|
||||
(#e8eef6). Das ist eine echte Duotonie -- ein `feColorMatrix`
|
||||
koennte das nicht, der kann nur linear mischen und wuerde die
|
||||
Mitteltoene flach ziehen.
|
||||
|
||||
DAS AUGE IST GEMESSEN, NICHT GESETZT: Ein Durchlauf ueber die
|
||||
Bildpunkte hat die Pupille als einzige dunkle Insel gefunden,
|
||||
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.
|
||||
Darauf liegen Iris (babyblau), Pupille und ein Glanzpunkt.
|
||||
|
||||
Warum ueberhaupt eine Iris: Das Logo hat ein schwarzes Auge.
|
||||
Babyblau war seit dem ersten Auftrag gewuenscht ("husky: silber
|
||||
und blaue augen") und ist es jetzt wieder -- es ist der einzige
|
||||
Farbfleck an einem sonst silbernen Zeichen und traegt damit
|
||||
genau so viel Farbe wie die anderen Rollen auch. -->
|
||||
<filter id="rs-husky-duo" color-interpolation-filters="sRGB">
|
||||
<feComponentTransfer>
|
||||
<feFuncR type="table" tableValues="0.165 0.910"/>
|
||||
<feFuncG type="table" tableValues="0.212 0.933"/>
|
||||
<feFuncB type="table" tableValues="0.267 0.965"/>
|
||||
</feComponentTransfer>
|
||||
</filter>
|
||||
<g id="r-husky">
|
||||
<image href="assets/img/marke-husky.webp" x="0" y="0" width="24" height="24"
|
||||
preserveAspectRatio="xMidYMid meet" filter="url(#rs-husky-duo)"/>
|
||||
<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="#ffffff" opacity=".85" cx="7.5" cy="11.85" r="0.2"/>
|
||||
</g>
|
||||
|
||||
<!-- MANAGER — der goldene Stern, der glitzert.
|
||||
Das Funkeln ist ein schmaler heller Streifen, der einmal quer
|
||||
über den Stern wandert. Es ist BEWUSST langsam (4,5 s) und
|
||||
schwach: Ein schnelles Blinken wäre genau die aggressive Optik,
|
||||
die hier nicht sein soll. Bei "weniger Bewegung" steht es still
|
||||
(siehe personen.css) -- dann bleibt ein ruhiger goldener 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="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"/>
|
||||
</g>
|
||||
|
||||
<!-- SCOUT — grünes Schild mit einer roten Peperoni darin.
|
||||
Der Haken von früher ist weg: Filipe hat die Peperoni ausdrücklich
|
||||
verlangt, und beides nebeneinander wäre bei 22 px Matsch. Die
|
||||
Chili ist stark vereinfacht — bei dieser Größe zählt nur, dass
|
||||
eine rote, gebogene Form mit grünem Stiel im Schild steht. -->
|
||||
<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="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="none" stroke="#8fd66a" stroke-width="1.3" stroke-linecap="round" d="M12.9 7.6c.9-.4 1.7 0 1.8.8"/>
|
||||
</g>
|
||||
|
||||
<!-- CREATOR — Lila und Silber.
|
||||
Statt der alten Person-Silhouette (die aussah wie ein leeres
|
||||
Benutzerbild und damit wie "niemand") jetzt ein geschliffener
|
||||
Kristall: lila Kern, silberne Facetten. Er hat als einziges der
|
||||
fünf Zeichen eine Innenzeichnung, und die trägt auch klein --
|
||||
weil es gerade Kanten sind, keine Rundungen. -->
|
||||
<g id="r-person">
|
||||
<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="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"/>
|
||||
</g>
|
||||
</defs></svg>
|
||||
|
||||
|
||||
<!-- ---------- Bühne: Bild + Schleier ---------------------------------- -->
|
||||
<div class="buehne" aria-hidden="true">
|
||||
<picture>
|
||||
<!-- BIS 2560 PIXEL (07.09.2026). Vorher endete die Reihe bei 1600 --
|
||||
auf einem 2550 px breiten Schirm rechnete der Browser das Bild
|
||||
also um das 1,6-fache hoch, und jede Kante wurde weich. Genau
|
||||
das sah man als "nicht hochwertig", ohne es benennen zu koennen.
|
||||
Eine hoehere Bildguete haette daran nichts geaendert: Man kann
|
||||
keine Bildpunkte zurueckholen, die nie ausgeliefert wurden.
|
||||
Ueber srcset laedt trotzdem jeder nur die Stufe, die er
|
||||
braucht -- ein Handy weiterhin 32 KB. -->
|
||||
<source media="(min-width: 900px)" type="image/webp"
|
||||
srcset="assets/img/buehne/gate-960.webp 960w,
|
||||
assets/img/buehne/gate-1280.webp 1280w,
|
||||
assets/img/buehne/gate-1600.webp 1600w,
|
||||
assets/img/buehne/gate-1920.webp 1920w,
|
||||
assets/img/buehne/gate-2560.webp 2560w" sizes="100vw" />
|
||||
<source type="image/webp"
|
||||
srcset="assets/img/buehne/gate-hoch-440.webp 440w,
|
||||
assets/img/buehne/gate-hoch-580.webp 580w,
|
||||
assets/img/buehne/gate-hoch-900.webp 900w" sizes="100vw" />
|
||||
<img class="buehne__bild" src="assets/img/buehne/gate-1280.webp" alt=""
|
||||
width="1647" height="955" fetchpriority="high" decoding="async" />
|
||||
</picture>
|
||||
<div class="buehne__schleier"></div>
|
||||
</div>
|
||||
|
||||
<!-- ---------- Tafel ----------------------------------------------------
|
||||
|
||||
DER ANKER (06.09.2026). Im Motiv steht rechts eine LEERE TAFEL mit
|
||||
Neonrahmen -- dort gehoert die Anmeldekarte hinein, und zwar genau
|
||||
hinein, nicht ungefaehr.
|
||||
|
||||
Das geht nur, wenn man weiss, wo die gemalte Tafel auf dem
|
||||
Bildschirm landet. Das Bild liegt mit `object-fit: cover` darunter;
|
||||
je nach Fensterform schneidet der Browser oben/unten oder
|
||||
links/rechts etwas ab. Dieser Anker rechnet genau dieselbe
|
||||
Cover-Geometrie noch einmal nach (siehe gate.css) -- er ist damit
|
||||
deckungsgleich mit dem Bild, und die Karte kann in Prozent des
|
||||
BILDES sitzen statt in Prozent des Fensters.
|
||||
|
||||
Er faengt keine Klicks ab (pointer-events: none); nur die Karte
|
||||
darin ist bedienbar. -->
|
||||
<div class="tafel-anker">
|
||||
<main class="tafel" id="tafel">
|
||||
<div class="tafel__kante" aria-hidden="true"></div>
|
||||
|
||||
<!-- 07.09.2026, Wunsch Filipe: "dogfather universe auch ersetzen durch
|
||||
SpicyMedia x DogFather" und der Satz darunter soll "nur um manager
|
||||
scouts und creator von spicy media" gehen, ohne DogFather.
|
||||
|
||||
Das "x" steht als eigenes Element, damit es kleiner und in der
|
||||
Zwischenfarbe gesetzt werden kann -- so liest man zwei Namen und
|
||||
ein Zeichen dazwischen, nicht drei gleich laute Wörter. Es trägt
|
||||
aria-hidden nicht: Vorgelesen wird "SpicyMedia x DogFather", und
|
||||
genau so spricht man es auch aus. -->
|
||||
<header class="kopf">
|
||||
<p class="marke marke--paar">
|
||||
<span class="marke__spicy">SpicyMedia</span>
|
||||
<span class="marke__x">×</span>
|
||||
<span class="marke__dogi">DogFather</span>
|
||||
</p>
|
||||
<h1 class="titel">Creator Workspace</h1>
|
||||
<p class="unterzeile">Privater Bereich für die Manager, Scouts und Creator von Spicy Media.</p>
|
||||
</header>
|
||||
|
||||
<div class="rollen" role="radiogroup" aria-labelledby="rollen-schild">
|
||||
<p class="feldschild" id="rollen-schild">Womit meldest du dich an?</p>
|
||||
|
||||
<!-- SPICY MEDIA steht ganz oben (07.09.2026, Wunsch Filipe: "ueber
|
||||
dogfather auch eine kategorie, eine neue rolle"). Der Chili ist
|
||||
das Zeichen der Marke -- dieselbe Form wie im Logo, nur als
|
||||
Umriss, damit sie neben Krone, Stern und Schild dieselbe
|
||||
Strichstaerke hat. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Spicy Media</span>
|
||||
<span class="rolle__zusatz">Überblick über alle</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- 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
|
||||
Personenseite war er schon getauscht, hier nicht.
|
||||
|
||||
Bei 21 Pixeln entscheidet die SILHOUETTE, nicht das Detail: die
|
||||
spitzen aufrechten Ohren, der breite Kopf, der nach unten schmal
|
||||
zuläuft, die Gesichtsmaske. Mehr passt nicht hinein, und mehr
|
||||
braucht es nicht -- ein Husky ist an genau diesen drei Dingen
|
||||
zu erkennen.
|
||||
|
||||
Das Schild ist zum Scout gewandert: Ein Scout schirmt die
|
||||
Pipeline ab und prüft, bevor etwas weitergereicht wird. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">DogFather</span>
|
||||
<!-- "Manager & Technik" statt "Gesamtübersicht & Freigaben"
|
||||
(08.09.2026, screen27). Die alte Zeile beschrieb ein RECHT
|
||||
("darf alles sehen und freigeben"), die neue eine AUFGABE --
|
||||
und danach sucht jemand, der vor der Rollenwahl steht: Er
|
||||
fragt sich nicht, was er dürfte, sondern was er hier tut. -->
|
||||
<span class="rolle__zusatz">Manager & Technik</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<!-- Manager: dieselben Rechte wie DogFather, nur die Personen-
|
||||
verwaltung bleibt DogFather vorbehalten. Der Stern steht fuer
|
||||
den Rang darunter, ohne "unter" zu sagen. -->
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Manager</span>
|
||||
<span class="rolle__zusatz">Betreuung & Freigaben</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Scout</span>
|
||||
<span class="rolle__zusatz">Eigene Pipeline & Kontakte</span>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<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>
|
||||
<span class="rolle__text">
|
||||
<span class="rolle__name">Creator</span>
|
||||
<span class="rolle__zusatz">Eigener Bereich & Fortschritt</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<form class="formular" id="formular" novalidate>
|
||||
<label class="feldschild" for="code">
|
||||
Persönlicher Zugangscode <span class="fuer" id="fuer" hidden></span>
|
||||
</label>
|
||||
|
||||
<div class="feld">
|
||||
<input type="password" id="code" name="code" inputmode="text"
|
||||
autocomplete="current-password" spellcheck="false"
|
||||
placeholder="Code eingeben" aria-describedby="hinweis fehler" />
|
||||
<button type="button" class="feld__auge" id="auge"
|
||||
aria-label="Code anzeigen" aria-pressed="false">
|
||||
<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"/>
|
||||
<circle class="strich" cx="12" cy="12" r="2.9"/>
|
||||
<path class="strich durch" d="m4 20 16-16"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="hinweis" id="hinweis" hidden>Feststelltaste ist aktiv.</p>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<button type="submit" class="knopf" id="knopf">
|
||||
<span class="knopf__text">Anmelden</span>
|
||||
<span class="knopf__laden" aria-hidden="true"></span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- EINE TÜR BRAUCHT EINE KLINGEL (ergänzt 19.09.2026).
|
||||
|
||||
Hier standen vier Kacheln, ein Feld „Code eingeben" und ein
|
||||
Knopf. Wer keinen Code hat, fand keinen einzigen Satz, der ihm
|
||||
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
|
||||
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">
|
||||
Verschlüsselte Verbindung · Zugriffe werden protokolliert
|
||||
</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/gate.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/kalender.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -377,13 +377,14 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kalender.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kalender-abo.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/leistung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -444,11 +444,12 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915"></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915"></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915"></script>
|
||||
<script src="assets/js/leistung.js?v=202609191915"></script>
|
||||
<script src="assets/js/meldung.js?v=202609191956"></script>
|
||||
<script src="assets/js/nachfrage.js?v=202609191956"></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956"></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956"></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956"></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956"></script>
|
||||
<script src="assets/js/leistung.js?v=202609191956"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/personen.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -449,12 +449,13 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/personen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -214,13 +214,14 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/profil.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+14
-13
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -134,10 +134,11 @@
|
||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||
die seit dem 07.09. jede Seite danach absucht. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/rechte.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=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/rechte.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+118
-118
@@ -1,118 +1,118 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Reports & Review · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Review</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Reports</p>
|
||||
<h1 class="titel">Review & nächste Schritte</h1>
|
||||
<p class="unterzeile" id="unterzeile">Fortschritt wird nicht gefühlt, sondern nachvollziehbar gemacht.</p>
|
||||
</div>
|
||||
<div class="steuerung">
|
||||
<div id="creator-block" hidden>
|
||||
<label class="feld-schild" for="f-creator">Creator</label>
|
||||
<select id="f-creator"></select>
|
||||
</div>
|
||||
<div>
|
||||
<label class="feld-schild" for="f-tage">Zeitraum</label>
|
||||
<select id="f-tage">
|
||||
<option value="7">7 Tage</option>
|
||||
<option value="30" selected>30 Tage</option>
|
||||
<option value="90">90 Tage</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<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>
|
||||
|
||||
<!-- Der Kern aus dem Konzept: Ein Review endet mit einer Entscheidung. -->
|
||||
<section class="entscheidung" id="entscheidung-block" hidden>
|
||||
<p class="marke">Abschluss</p>
|
||||
<h2 class="entscheidung__titel">Was ist die Entscheidung?</h2>
|
||||
<p class="entscheidung__text">
|
||||
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.
|
||||
</p>
|
||||
<form id="entscheidung">
|
||||
<div class="entscheidung__raster">
|
||||
<div>
|
||||
<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 />
|
||||
</div>
|
||||
<div>
|
||||
<label class="feld-schild" for="e-frist">Bis wann <span class="leise">(optional)</span></label>
|
||||
<input id="e-frist" type="date" />
|
||||
</div>
|
||||
</div>
|
||||
<p class="fehler" id="e-fehler" role="alert" aria-live="polite"></p>
|
||||
<div class="neu__knoepfe">
|
||||
<button type="submit" class="knopf knopf--klein" id="e-speichern">Als Aufgabe festhalten</button>
|
||||
<span class="leise" id="e-stand"></span>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/report.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Reports & Review · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/report.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Review</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Reports</p>
|
||||
<h1 class="titel">Review & nächste Schritte</h1>
|
||||
<p class="unterzeile" id="unterzeile">Fortschritt wird nicht gefühlt, sondern nachvollziehbar gemacht.</p>
|
||||
</div>
|
||||
<div class="steuerung">
|
||||
<div id="creator-block" hidden>
|
||||
<label class="feld-schild" for="f-creator">Creator</label>
|
||||
<select id="f-creator"></select>
|
||||
</div>
|
||||
<div>
|
||||
<label class="feld-schild" for="f-tage">Zeitraum</label>
|
||||
<select id="f-tage">
|
||||
<option value="7">7 Tage</option>
|
||||
<option value="30" selected>30 Tage</option>
|
||||
<option value="90">90 Tage</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<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>
|
||||
|
||||
<!-- Der Kern aus dem Konzept: Ein Review endet mit einer Entscheidung. -->
|
||||
<section class="entscheidung" id="entscheidung-block" hidden>
|
||||
<p class="marke">Abschluss</p>
|
||||
<h2 class="entscheidung__titel">Was ist die Entscheidung?</h2>
|
||||
<p class="entscheidung__text">
|
||||
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.
|
||||
</p>
|
||||
<form id="entscheidung">
|
||||
<div class="entscheidung__raster">
|
||||
<div>
|
||||
<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 />
|
||||
</div>
|
||||
<div>
|
||||
<label class="feld-schild" for="e-frist">Bis wann <span class="leise">(optional)</span></label>
|
||||
<input id="e-frist" type="date" />
|
||||
</div>
|
||||
</div>
|
||||
<p class="fehler" id="e-fehler" role="alert" aria-live="polite"></p>
|
||||
<div class="neu__knoepfe">
|
||||
<button type="submit" class="knopf knopf--klein" id="e-speichern">Als Aufgabe festhalten</button>
|
||||
<span class="leise" id="e-stand"></span>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/report.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/scouting.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -173,12 +173,13 @@
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/scouting.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+689
-689
File diff suppressed because it is too large
Load Diff
+97
-97
@@ -1,97 +1,97 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Start-Check · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Start-Check</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Onboarding · Erstanalyse</p>
|
||||
<h1 class="titel">Start-Check</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Ausgangslage verstehen – und daraus konkrete Arbeitspakete bauen.
|
||||
</p>
|
||||
</div>
|
||||
<div class="steuerung">
|
||||
<div id="creator-block" hidden>
|
||||
<label class="feld-schild" for="f-creator">Creator</label>
|
||||
<select id="f-creator"></select>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<section class="fortschritt" id="fortschritt" hidden>
|
||||
<div class="fortschritt__kopf">
|
||||
<span class="fortschritt__zahl" id="f-zahl">0 von 16</span>
|
||||
<span class="fortschritt__text" id="f-text">Punkten geprüft</span>
|
||||
</div>
|
||||
<div class="fortschritt__balken" role="progressbar" aria-valuemin="0" aria-valuemax="16"
|
||||
aria-valuenow="0" id="f-balken-aussen">
|
||||
<div class="fortschritt__fuellung" id="f-balken"></div>
|
||||
</div>
|
||||
<p class="fortschritt__hinweis" id="f-hinweis"></p>
|
||||
</section>
|
||||
|
||||
<div id="felder" aria-busy="true"><p class="leise">Start-Check wird geladen …</p></div>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Start-Check · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Start-Check</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Onboarding · Erstanalyse</p>
|
||||
<h1 class="titel">Start-Check</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Ausgangslage verstehen – und daraus konkrete Arbeitspakete bauen.
|
||||
</p>
|
||||
</div>
|
||||
<div class="steuerung">
|
||||
<div id="creator-block" hidden>
|
||||
<label class="feld-schild" for="f-creator">Creator</label>
|
||||
<select id="f-creator"></select>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<section class="fortschritt" id="fortschritt" hidden>
|
||||
<div class="fortschritt__kopf">
|
||||
<span class="fortschritt__zahl" id="f-zahl">0 von 16</span>
|
||||
<span class="fortschritt__text" id="f-text">Punkten geprüft</span>
|
||||
</div>
|
||||
<div class="fortschritt__balken" role="progressbar" aria-valuemin="0" aria-valuemax="16"
|
||||
aria-valuenow="0" id="f-balken-aussen">
|
||||
<div class="fortschritt__fuellung" id="f-balken"></div>
|
||||
</div>
|
||||
<p class="fortschritt__hinweis" id="f-hinweis"></p>
|
||||
</section>
|
||||
|
||||
<div id="felder" aria-busy="true"><p class="leise">Start-Check wird geladen …</p></div>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/ki.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/startcheck.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+16
-15
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/profil.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -150,13 +150,14 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/steckbrief.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -7,18 +7,18 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
|
||||
der Regel hier waere die zweite Stelle, an der dieselbe Sache
|
||||
anders aussieht. -->
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -111,11 +111,12 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/talente.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+121
-121
@@ -1,121 +1,121 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Team · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Team</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==== DER KOPF ================================================
|
||||
Er sagt in einem Satz, was diese Seite ist UND was sie nicht
|
||||
ist. Der zweite Teil ist der wichtigere: Eine Seite mit Zahlen
|
||||
über Kollegen wird sonst als Überwachung gelesen -- und dann
|
||||
arbeitet niemand mehr offen damit.
|
||||
|
||||
Aus der Recherche (Fachliteratur zu Arbeitslast-Dashboards):
|
||||
Der Zweck ist, Stellen zu finden, an denen Unterstützung fehlt.
|
||||
Wer das nicht dazuschreibt, baut ein Kontrollwerkzeug, auch wenn
|
||||
er es nicht wollte. -->
|
||||
<!-- ==== EINE ECHTE KACHEL, IM TON DER KATEGORIE (09.09.2026) ====
|
||||
|
||||
Filipe: "perfektionnir das in einer kachel in der farbe von der
|
||||
kategorie bitte."
|
||||
|
||||
`t-kachel` steht in der Modulliste von module.css und bekommt
|
||||
damit dieselbe Form wie jede Kachel im Haus: gefraeste Fase oben
|
||||
links, Kantenlicht, Eckwinkel, Raster. Die FARBE kommt aus
|
||||
`--ton` -- derselben Variablen, aus der die Kachel auf der
|
||||
Startseite ihren Ton zieht, und dort ist es Ton 22 (#ffd166).
|
||||
Beide lesen dieselbe Zahl; die Kachel auf der Startseite und die
|
||||
Ueberschrift hier koennen also nicht auseinanderlaufen. -->
|
||||
<section class="t-kachel" data-ton="22">
|
||||
<div class="t-kopf">
|
||||
<div class="t-kopf__text">
|
||||
<p class="feldschild">Rund um das Team</p>
|
||||
<h1 class="t-kopf__titel">Manager & Scouts</h1>
|
||||
<p class="t-kopf__unter" id="kopf-unter">
|
||||
Wer betreut wen, wo staut sich etwas, wo fehlt jemand.
|
||||
</p>
|
||||
</div>
|
||||
<p class="t-kopf__grenze">
|
||||
Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte
|
||||
noch Zahlen. Das ist eine <strong>Arbeitslage</strong>, keine Überwachung.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==== DIE LÜCKEN ZUERST ======================================
|
||||
Eine Kennzahl sagt, wie es läuft. Eine Lücke sagt, wo etwas
|
||||
fehlt -- und nur das Zweite kann man heute abstellen. Deshalb
|
||||
steht sie oben und nicht unter den Tabellen. -->
|
||||
<section class="t-luecken" id="luecken" hidden></section>
|
||||
|
||||
<!-- ==== DIE LAGE IN ZAHLEN ===================================== -->
|
||||
<section class="t-lage" id="lage" hidden></section>
|
||||
|
||||
<!-- ==== DIE LEUTE ==============================================
|
||||
Jede Person einzeln, nicht als Durchschnitt: Zwei Scouts mit je
|
||||
sechs Creators und einer mit achtzehn ergeben einen Schnitt von
|
||||
zehn -- und der sagt nichts über den, bei dem es klemmt. -->
|
||||
<section class="t-gruppe" id="manager-block" hidden>
|
||||
<h2 class="feldschild">Manager</h2>
|
||||
<div class="t-liste" id="manager-liste"></div>
|
||||
</section>
|
||||
|
||||
<section class="t-gruppe" id="scout-block" hidden>
|
||||
<h2 class="feldschild">Scouts</h2>
|
||||
<div class="t-liste" id="scout-liste"></div>
|
||||
</section>
|
||||
|
||||
<p class="leise" id="laedt">Die Arbeitslage wird geladen …</p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/team.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Team · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Team</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==== DER KOPF ================================================
|
||||
Er sagt in einem Satz, was diese Seite ist UND was sie nicht
|
||||
ist. Der zweite Teil ist der wichtigere: Eine Seite mit Zahlen
|
||||
über Kollegen wird sonst als Überwachung gelesen -- und dann
|
||||
arbeitet niemand mehr offen damit.
|
||||
|
||||
Aus der Recherche (Fachliteratur zu Arbeitslast-Dashboards):
|
||||
Der Zweck ist, Stellen zu finden, an denen Unterstützung fehlt.
|
||||
Wer das nicht dazuschreibt, baut ein Kontrollwerkzeug, auch wenn
|
||||
er es nicht wollte. -->
|
||||
<!-- ==== EINE ECHTE KACHEL, IM TON DER KATEGORIE (09.09.2026) ====
|
||||
|
||||
Filipe: "perfektionnir das in einer kachel in der farbe von der
|
||||
kategorie bitte."
|
||||
|
||||
`t-kachel` steht in der Modulliste von module.css und bekommt
|
||||
damit dieselbe Form wie jede Kachel im Haus: gefraeste Fase oben
|
||||
links, Kantenlicht, Eckwinkel, Raster. Die FARBE kommt aus
|
||||
`--ton` -- derselben Variablen, aus der die Kachel auf der
|
||||
Startseite ihren Ton zieht, und dort ist es Ton 22 (#ffd166).
|
||||
Beide lesen dieselbe Zahl; die Kachel auf der Startseite und die
|
||||
Ueberschrift hier koennen also nicht auseinanderlaufen. -->
|
||||
<section class="t-kachel" data-ton="22">
|
||||
<div class="t-kopf">
|
||||
<div class="t-kopf__text">
|
||||
<p class="feldschild">Rund um das Team</p>
|
||||
<h1 class="t-kopf__titel">Manager & Scouts</h1>
|
||||
<p class="t-kopf__unter" id="kopf-unter">
|
||||
Wer betreut wen, wo staut sich etwas, wo fehlt jemand.
|
||||
</p>
|
||||
</div>
|
||||
<p class="t-kopf__grenze">
|
||||
Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte
|
||||
noch Zahlen. Das ist eine <strong>Arbeitslage</strong>, keine Überwachung.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==== DIE LÜCKEN ZUERST ======================================
|
||||
Eine Kennzahl sagt, wie es läuft. Eine Lücke sagt, wo etwas
|
||||
fehlt -- und nur das Zweite kann man heute abstellen. Deshalb
|
||||
steht sie oben und nicht unter den Tabellen. -->
|
||||
<section class="t-luecken" id="luecken" hidden></section>
|
||||
|
||||
<!-- ==== DIE LAGE IN ZAHLEN ===================================== -->
|
||||
<section class="t-lage" id="lage" hidden></section>
|
||||
|
||||
<!-- ==== DIE LEUTE ==============================================
|
||||
Jede Person einzeln, nicht als Durchschnitt: Zwei Scouts mit je
|
||||
sechs Creators und einer mit achtzehn ergeben einen Schnitt von
|
||||
zehn -- und der sagt nichts über den, bei dem es klemmt. -->
|
||||
<section class="t-gruppe" id="manager-block" hidden>
|
||||
<h2 class="feldschild">Manager</h2>
|
||||
<div class="t-liste" id="manager-liste"></div>
|
||||
</section>
|
||||
|
||||
<section class="t-gruppe" id="scout-block" hidden>
|
||||
<h2 class="feldschild">Scouts</h2>
|
||||
<div class="t-liste" id="scout-liste"></div>
|
||||
</section>
|
||||
|
||||
<p class="leise" id="laedt">Die Arbeitslage wird geladen …</p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/team.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+93
-93
@@ -1,93 +1,93 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Dein Team · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||
dieser Seite kommt vom Server, `zuSeite()` in bereiche.js findet
|
||||
sie deshalb nicht -- und ohne Fund griff der Rueckfall, also die
|
||||
Szene der anderen Marke. Eine Seite mit genau einer Buehne
|
||||
braucht dafuer kein Skript. -->
|
||||
<body class="start" data-buehne="eingang">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Dein Team</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==== DER KOPF ================================================
|
||||
Er sagt, was diese Seite ist UND was sie nicht ist. Der zweite
|
||||
Teil ist der wichtigere -- dieselbe Ueberlegung steht schon
|
||||
ueber team.html: Eine Seite mit Zahlen ueber Kollegen wird sonst
|
||||
als Kontrolle gelesen, und dann arbeitet niemand mehr offen
|
||||
damit.
|
||||
|
||||
"Offen" heisst hier deshalb ausdruecklich: darueber habt ihr
|
||||
noch nicht geredet. Es ist eine Liste fuer euch beide, keine
|
||||
Note fuer den anderen. -->
|
||||
<section class="t-kachel">
|
||||
<div class="t-kopf">
|
||||
<div class="t-kopf__text">
|
||||
<p class="feldschild">Zusammen</p>
|
||||
<h1 class="t-kopf__titel">Was auf dich wartet</h1>
|
||||
<p class="t-kopf__unter" id="kopf-unter">…</p>
|
||||
<p class="t-kopf__grenze">
|
||||
Was hier steht, ist eine Merkliste für euch beide – keine Bewertung
|
||||
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.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
</section>
|
||||
|
||||
<section class="t-lage" id="lage" aria-busy="true"></section>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- wahl.js VOR kopf.js (nachgetragen 10.09.2026).
|
||||
kopf.js baut den Sicht-Umschalter; ohne wahl.js sieht er aus wie
|
||||
ein blankes Browser-Auswahlfeld statt wie der Rest des Hauses.
|
||||
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Dein Team · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/team.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
|
||||
dieser Seite kommt vom Server, `zuSeite()` in bereiche.js findet
|
||||
sie deshalb nicht -- und ohne Fund griff der Rueckfall, also die
|
||||
Szene der anderen Marke. Eine Seite mit genau einer Buehne
|
||||
braucht dafuer kein Skript. -->
|
||||
<body class="start" data-buehne="eingang">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Dein Team</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<!-- ==== DER KOPF ================================================
|
||||
Er sagt, was diese Seite ist UND was sie nicht ist. Der zweite
|
||||
Teil ist der wichtigere -- dieselbe Ueberlegung steht schon
|
||||
ueber team.html: Eine Seite mit Zahlen ueber Kollegen wird sonst
|
||||
als Kontrolle gelesen, und dann arbeitet niemand mehr offen
|
||||
damit.
|
||||
|
||||
"Offen" heisst hier deshalb ausdruecklich: darueber habt ihr
|
||||
noch nicht geredet. Es ist eine Liste fuer euch beide, keine
|
||||
Note fuer den anderen. -->
|
||||
<section class="t-kachel">
|
||||
<div class="t-kopf">
|
||||
<div class="t-kopf__text">
|
||||
<p class="feldschild">Zusammen</p>
|
||||
<h1 class="t-kopf__titel">Was auf dich wartet</h1>
|
||||
<p class="t-kopf__unter" id="kopf-unter">…</p>
|
||||
<p class="t-kopf__grenze">
|
||||
Was hier steht, ist eine Merkliste für euch beide – keine Bewertung
|
||||
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.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
</section>
|
||||
|
||||
<section class="t-lage" id="lage" aria-busy="true"></section>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- wahl.js VOR kopf.js (nachgetragen 10.09.2026).
|
||||
kopf.js baut den Sicht-Umschalter; ohne wahl.js sieht er aus wie
|
||||
ein blankes Browser-Auswahlfeld statt wie der Rest des Hauses.
|
||||
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
|
||||
es niemandem auf, und deshalb prueft pruef-css-klassen die
|
||||
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/teamlage.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+122
-122
@@ -1,122 +1,122 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Video übernehmen · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Video übernehmen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
AUS „TEILEN" WIRD EIN TIPP (17.09.2026)
|
||||
Schritt 4 aus dem Video-Plan.
|
||||
|
||||
Filipe postet ein Video auf dem Handy. Bisher hätte er den Link
|
||||
kopieren, die App öffnen, den richtigen Bereich suchen und das
|
||||
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.
|
||||
|
||||
Jetzt: in TikTok auf „Teilen", „DogFather" wählen, fertig. Diese
|
||||
Seite ist das Ziel dieses Tipps.
|
||||
|
||||
WARUM SIE NICHT SOFORT EINTRÄGT: Weil sie nicht wissen kann, ob
|
||||
der Griff in die Tasche gemeint war. Ein Video, das ungefragt in
|
||||
den Highlights landet, muss jemand wieder löschen – und das ist
|
||||
mehr Arbeit als ein Tipp auf „Übernehmen". Sie zeigt also, was
|
||||
sie verstanden hat, und wartet auf eine Bestätigung.
|
||||
|
||||
WOHIN, IST EINE FRAGE UND KEINE ANNAHME: Highlights sind
|
||||
vorausgewählt, weil dort die Videos hingehören. Aber ein Clip
|
||||
kann auch eine Antwort auf einen Wunsch sein.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Geteilt</p>
|
||||
<h1 class="titel">Video übernehmen</h1>
|
||||
<p class="unterzeile">
|
||||
Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<section class="tl-seite" id="teilen" aria-busy="true">
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<!-- Was angekommen ist. Steht ganz oben, weil es die erste Frage
|
||||
beantwortet: „hat er den richtigen Link erwischt?" -->
|
||||
<div class="tl-fund" id="fund" hidden>
|
||||
<p class="tl-label">Dieser Link ist angekommen:</p>
|
||||
<p class="tl-url" id="url-text"></p>
|
||||
</div>
|
||||
|
||||
<!-- Wohin. -->
|
||||
<div class="tl-wahl" id="wahl" hidden>
|
||||
<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>
|
||||
|
||||
<div class="tl-knoepfe" id="knoepfe" hidden>
|
||||
<button type="button" class="knopf" id="uebernehmen">Übernehmen</button>
|
||||
<a class="schritt" href="start.html" id="abbrechen">Doch nicht</a>
|
||||
</div>
|
||||
|
||||
<!-- Wenn gar kein Link dabei war. Kein Formular als Strafe, sondern
|
||||
ein Feld zum Einfügen – man ist ja schon hier. -->
|
||||
<div class="tl-haendisch" id="haendisch" hidden>
|
||||
<label class="tl-label" for="eingabe">Link zum Video</label>
|
||||
<input type="url" id="eingabe" inputmode="url" autocomplete="off"
|
||||
placeholder="https://www.tiktok.com/@dogfather0804/video/…" />
|
||||
</div>
|
||||
|
||||
<!-- Das Ergebnis. -->
|
||||
<div class="tl-fertig" id="fertig" hidden>
|
||||
<p class="tl-fertig-satz" id="fertig-satz"></p>
|
||||
<div class="tl-knoepfe">
|
||||
<a class="knopf" id="hin" href="start.html">Ansehen</a>
|
||||
<a class="schritt" href="start.html">Fertig</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Video übernehmen · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/bereich.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Video übernehmen</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
AUS „TEILEN" WIRD EIN TIPP (17.09.2026)
|
||||
Schritt 4 aus dem Video-Plan.
|
||||
|
||||
Filipe postet ein Video auf dem Handy. Bisher hätte er den Link
|
||||
kopieren, die App öffnen, den richtigen Bereich suchen und das
|
||||
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.
|
||||
|
||||
Jetzt: in TikTok auf „Teilen", „DogFather" wählen, fertig. Diese
|
||||
Seite ist das Ziel dieses Tipps.
|
||||
|
||||
WARUM SIE NICHT SOFORT EINTRÄGT: Weil sie nicht wissen kann, ob
|
||||
der Griff in die Tasche gemeint war. Ein Video, das ungefragt in
|
||||
den Highlights landet, muss jemand wieder löschen – und das ist
|
||||
mehr Arbeit als ein Tipp auf „Übernehmen". Sie zeigt also, was
|
||||
sie verstanden hat, und wartet auf eine Bestätigung.
|
||||
|
||||
WOHIN, IST EINE FRAGE UND KEINE ANNAHME: Highlights sind
|
||||
vorausgewählt, weil dort die Videos hingehören. Aber ein Clip
|
||||
kann auch eine Antwort auf einen Wunsch sein.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Geteilt</p>
|
||||
<h1 class="titel">Video übernehmen</h1>
|
||||
<p class="unterzeile">
|
||||
Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<section class="tl-seite" id="teilen" aria-busy="true">
|
||||
<p class="leise" id="ladezeile">einen Moment …</p>
|
||||
|
||||
<!-- Was angekommen ist. Steht ganz oben, weil es die erste Frage
|
||||
beantwortet: „hat er den richtigen Link erwischt?" -->
|
||||
<div class="tl-fund" id="fund" hidden>
|
||||
<p class="tl-label">Dieser Link ist angekommen:</p>
|
||||
<p class="tl-url" id="url-text"></p>
|
||||
</div>
|
||||
|
||||
<!-- Wohin. -->
|
||||
<div class="tl-wahl" id="wahl" hidden>
|
||||
<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>
|
||||
|
||||
<div class="tl-knoepfe" id="knoepfe" hidden>
|
||||
<button type="button" class="knopf" id="uebernehmen">Übernehmen</button>
|
||||
<a class="schritt" href="start.html" id="abbrechen">Doch nicht</a>
|
||||
</div>
|
||||
|
||||
<!-- Wenn gar kein Link dabei war. Kein Formular als Strafe, sondern
|
||||
ein Feld zum Einfügen – man ist ja schon hier. -->
|
||||
<div class="tl-haendisch" id="haendisch" hidden>
|
||||
<label class="tl-label" for="eingabe">Link zum Video</label>
|
||||
<input type="url" id="eingabe" inputmode="url" autocomplete="off"
|
||||
placeholder="https://www.tiktok.com/@dogfather0804/video/…" />
|
||||
</div>
|
||||
|
||||
<!-- Das Ergebnis. -->
|
||||
<div class="tl-fertig" id="fertig" hidden>
|
||||
<p class="tl-fertig-satz" id="fertig-satz"></p>
|
||||
<div class="tl-knoepfe">
|
||||
<a class="knopf" id="hin" href="start.html">Ansehen</a>
|
||||
<a class="schritt" href="start.html">Fertig</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/teilen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -126,11 +126,12 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/treff-moderation.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+231
-231
@@ -1,231 +1,231 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Die Regeln · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · Regeln</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Der Treff</p>
|
||||
<!-- HIESS BIS ZUM 18.09.2026 „Regeln & Hilfe" -- genau wie das
|
||||
BRETT, auf das der Absatz weiter unten verweist. Auf dem
|
||||
Brett stand damit ein Link „Regeln & Hilfe", der auf eine
|
||||
Seite namens „Regeln & Hilfe" fuehrte; wer ihn drueckte,
|
||||
glaubte, im Kreis gelaufen zu sein.
|
||||
|
||||
Die beiden sind verschiedene Dinge: Hier stehen die fuenf
|
||||
Regeln, kurz und fest. Das Brett sammelt daneben haeufige
|
||||
Fragen, Hilfe und was im Einzelfall passiert. Zwei Namen
|
||||
fuer zwei Sachen. -->
|
||||
<h1 class="titel">Die Regeln</h1>
|
||||
<p class="unterzeile">
|
||||
Kurz, in normaler Sprache, und alles, was hier steht, gilt auch.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==================================================================
|
||||
WARUM DER TEXT HIER STEHT UND DIE ZAHLEN NICHT
|
||||
|
||||
Die Saetze sind Text und gehoeren in eine Datei. Die ZAHLEN
|
||||
darin (sieben Tage, dreissig Tage, drei Beitraege, drei
|
||||
Anschlaege, 18 Jahre) kommen vom Server -- sie stehen im Code,
|
||||
und ein Regeltext, der eine andere Zahl nennt als die Regel, ist
|
||||
schlimmer als gar keiner: Niemand merkt es, und wer es merkt,
|
||||
glaubt dem Text.
|
||||
|
||||
Die Platzhalter tragen deshalb "…" als Vorgabe. Kommt die
|
||||
Antwort nicht, steht dort sichtbar nichts -- und nicht
|
||||
versehentlich eine Zahl von gestern.
|
||||
============================================================== -->
|
||||
<section class="treff-abschnitt" id="willkommen">
|
||||
<h2 class="treff-abschnitt__titel">Schön, dass du da bist</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt,
|
||||
was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich –
|
||||
du bist hier, weil dir jemand einen Code gegeben hat.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Gib diesen Code nicht weiter. Er gehört zu dir, und was damit
|
||||
geschrieben wird, steht unter deinem Namen.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Die fünf Regeln</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<ol class="regel-liste">
|
||||
<li><strong>Sei anständig.</strong> Keine Beleidigungen, keine Angriffe
|
||||
auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung –
|
||||
über einen Menschen nicht.</li>
|
||||
<li><strong>Keine privaten Daten.</strong> Keine Adressen, keine
|
||||
Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir
|
||||
selbst, es liest mehr mit, als du denkst.</li>
|
||||
<li><strong>Nichts Fremdes hochladen.</strong> Was du einstellst, muss
|
||||
von dir sein oder dir gehören.</li>
|
||||
<li><strong>Keine Werbung, kein Verkauf.</strong> Auch nicht für
|
||||
andere Streams.</li>
|
||||
<li><strong>Was hier passiert, bleibt hier.</strong> Keine
|
||||
Bildschirmfotos nach draußen.</li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Wie du weiterkommst</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen.
|
||||
Das ist kein Misstrauen gegen dich – es ist eines gegen
|
||||
Wegwerf-Zugänge.
|
||||
</p>
|
||||
<ul class="regel-liste" id="stufen">
|
||||
<li class="leise">wird geladen …</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Wenn etwas nicht stimmt</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
An jedem Beitrag, der nicht von dir ist, steht <strong>melden</strong>.
|
||||
Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das
|
||||
können wir es nicht prüfen.
|
||||
</p>
|
||||
<p>
|
||||
Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir
|
||||
fest, <strong>warum</strong> – und die Person, die ihn geschrieben hat,
|
||||
erfährt den Grund. Das ist keine Höflichkeit, sondern
|
||||
<span class="leise">Artikel 17 des Digital Services Act</span>.
|
||||
</p>
|
||||
<p class="leise" id="kontakt">
|
||||
Du erreichst uns außerdem direkt: Schreib es auf das Brett
|
||||
<a href="bereich.html?b=treff">Der Treff</a> oder sag es <span
|
||||
id="kontakt-wem">jemandem aus dem Team</span>.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Häufige Fragen und Antworten stehen auf dem Brett
|
||||
<a href="bereich.html?b=regeln">Regeln & Hilfe</a>.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Was passiert, wenn jemand sich nicht daran hält</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:</p>
|
||||
<ol class="regel-liste">
|
||||
<li><strong>Hinweis.</strong> Jemand sagt dir, was nicht ging.</li>
|
||||
<li><strong>Pause.</strong> Ein paar Tage nichts schreiben. Lesen
|
||||
geht weiter.</li>
|
||||
<li><strong>Ende.</strong> Der Zugang wird geschlossen.</li>
|
||||
</ol>
|
||||
<p class="leise" id="ausschluss">…</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Das Kleingedruckte – kurz</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p id="alter">…</p>
|
||||
<p>
|
||||
<strong>Was gespeichert wird:</strong> dein Name, dein Zugangscode
|
||||
(verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann
|
||||
du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs,
|
||||
keine Weitergabe an Dritte.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Du willst weg?</strong> Sag Bescheid. Dein Zugang wird
|
||||
geschlossen und deine Beiträge werden entfernt.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine
|
||||
Direktnachrichten zwischen Mitgliedern – absichtlich: Ein
|
||||
öffentlicher Raum lässt sich moderieren, ein privater nicht.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<!-- ==== WAS IST ÜBER MICH GESPEICHERT? (15.09.2026) ==============
|
||||
Art. 15 DSGVO. Kein Antrag, kein Formular, kein Warten – ein
|
||||
Knopf. Er steht auf den beiden Seiten, die einem Menschen selbst
|
||||
gehören: dem Steckbrief und den Treff-Regeln. Die Community hat
|
||||
keinen Steckbrief; ohne die zweite Stelle hätte ausgerechnet die
|
||||
Gruppe mit den wenigsten Rechten auch diesen nicht. -->
|
||||
<section class="meine-daten">
|
||||
<div class="meine-daten__kopf">
|
||||
<h2 class="meine-daten__titel">Was ist über mich gespeichert?</h2>
|
||||
<button type="button" class="knopf-still" id="auskunft-knopf">Datei herunterladen</button>
|
||||
</div>
|
||||
<p class="meine-daten__satz">
|
||||
Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen.
|
||||
Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen,
|
||||
stehen sie nicht mit Namen darin – ihre Daten gehören ihnen.
|
||||
</p>
|
||||
<p class="leise" id="auskunft-stand" hidden></p>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN (Regel seit 07.09.2026).
|
||||
|
||||
Der Umschalter "Meine Sicht" in der Kopfleiste ist ein selbst
|
||||
gebautes Bedienelement; dahinter liegt ein unsichtbares Systemfeld
|
||||
fuer Vorleseprogramme. Ohne wahl.js faellt kopf.js auf dieses Feld
|
||||
zurueck -- ein grauer Kasten von 92 x 19 Pixeln mit weisser
|
||||
Schrift, mitten in einer dunklen Leiste.
|
||||
|
||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||
die seit dem 07.09. jede Seite danach absucht. -->
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Die Regeln · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/treff.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
|
||||
Treffs biegt der Server genau diesen Dateinamen auf crew-haus.css
|
||||
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
|
||||
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · Regeln</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Der Treff</p>
|
||||
<!-- HIESS BIS ZUM 18.09.2026 „Regeln & Hilfe" -- genau wie das
|
||||
BRETT, auf das der Absatz weiter unten verweist. Auf dem
|
||||
Brett stand damit ein Link „Regeln & Hilfe", der auf eine
|
||||
Seite namens „Regeln & Hilfe" fuehrte; wer ihn drueckte,
|
||||
glaubte, im Kreis gelaufen zu sein.
|
||||
|
||||
Die beiden sind verschiedene Dinge: Hier stehen die fuenf
|
||||
Regeln, kurz und fest. Das Brett sammelt daneben haeufige
|
||||
Fragen, Hilfe und was im Einzelfall passiert. Zwei Namen
|
||||
fuer zwei Sachen. -->
|
||||
<h1 class="titel">Die Regeln</h1>
|
||||
<p class="unterzeile">
|
||||
Kurz, in normaler Sprache, und alles, was hier steht, gilt auch.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ==================================================================
|
||||
WARUM DER TEXT HIER STEHT UND DIE ZAHLEN NICHT
|
||||
|
||||
Die Saetze sind Text und gehoeren in eine Datei. Die ZAHLEN
|
||||
darin (sieben Tage, dreissig Tage, drei Beitraege, drei
|
||||
Anschlaege, 18 Jahre) kommen vom Server -- sie stehen im Code,
|
||||
und ein Regeltext, der eine andere Zahl nennt als die Regel, ist
|
||||
schlimmer als gar keiner: Niemand merkt es, und wer es merkt,
|
||||
glaubt dem Text.
|
||||
|
||||
Die Platzhalter tragen deshalb "…" als Vorgabe. Kommt die
|
||||
Antwort nicht, steht dort sichtbar nichts -- und nicht
|
||||
versehentlich eine Zahl von gestern.
|
||||
============================================================== -->
|
||||
<section class="treff-abschnitt" id="willkommen">
|
||||
<h2 class="treff-abschnitt__titel">Schön, dass du da bist</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt,
|
||||
was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich –
|
||||
du bist hier, weil dir jemand einen Code gegeben hat.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Gib diesen Code nicht weiter. Er gehört zu dir, und was damit
|
||||
geschrieben wird, steht unter deinem Namen.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Die fünf Regeln</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<ol class="regel-liste">
|
||||
<li><strong>Sei anständig.</strong> Keine Beleidigungen, keine Angriffe
|
||||
auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung –
|
||||
über einen Menschen nicht.</li>
|
||||
<li><strong>Keine privaten Daten.</strong> Keine Adressen, keine
|
||||
Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir
|
||||
selbst, es liest mehr mit, als du denkst.</li>
|
||||
<li><strong>Nichts Fremdes hochladen.</strong> Was du einstellst, muss
|
||||
von dir sein oder dir gehören.</li>
|
||||
<li><strong>Keine Werbung, kein Verkauf.</strong> Auch nicht für
|
||||
andere Streams.</li>
|
||||
<li><strong>Was hier passiert, bleibt hier.</strong> Keine
|
||||
Bildschirmfotos nach draußen.</li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Wie du weiterkommst</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen.
|
||||
Das ist kein Misstrauen gegen dich – es ist eines gegen
|
||||
Wegwerf-Zugänge.
|
||||
</p>
|
||||
<ul class="regel-liste" id="stufen">
|
||||
<li class="leise">wird geladen …</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Wenn etwas nicht stimmt</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>
|
||||
An jedem Beitrag, der nicht von dir ist, steht <strong>melden</strong>.
|
||||
Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das
|
||||
können wir es nicht prüfen.
|
||||
</p>
|
||||
<p>
|
||||
Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir
|
||||
fest, <strong>warum</strong> – und die Person, die ihn geschrieben hat,
|
||||
erfährt den Grund. Das ist keine Höflichkeit, sondern
|
||||
<span class="leise">Artikel 17 des Digital Services Act</span>.
|
||||
</p>
|
||||
<p class="leise" id="kontakt">
|
||||
Du erreichst uns außerdem direkt: Schreib es auf das Brett
|
||||
<a href="bereich.html?b=treff">Der Treff</a> oder sag es <span
|
||||
id="kontakt-wem">jemandem aus dem Team</span>.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Häufige Fragen und Antworten stehen auf dem Brett
|
||||
<a href="bereich.html?b=regeln">Regeln & Hilfe</a>.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Was passiert, wenn jemand sich nicht daran hält</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p>Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:</p>
|
||||
<ol class="regel-liste">
|
||||
<li><strong>Hinweis.</strong> Jemand sagt dir, was nicht ging.</li>
|
||||
<li><strong>Pause.</strong> Ein paar Tage nichts schreiben. Lesen
|
||||
geht weiter.</li>
|
||||
<li><strong>Ende.</strong> Der Zugang wird geschlossen.</li>
|
||||
</ol>
|
||||
<p class="leise" id="ausschluss">…</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="treff-abschnitt">
|
||||
<h2 class="treff-abschnitt__titel">Das Kleingedruckte – kurz</h2>
|
||||
<div class="treff-abschnitt__inhalt">
|
||||
<p id="alter">…</p>
|
||||
<p>
|
||||
<strong>Was gespeichert wird:</strong> dein Name, dein Zugangscode
|
||||
(verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann
|
||||
du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs,
|
||||
keine Weitergabe an Dritte.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Du willst weg?</strong> Sag Bescheid. Dein Zugang wird
|
||||
geschlossen und deine Beiträge werden entfernt.
|
||||
</p>
|
||||
<p class="leise">
|
||||
Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine
|
||||
Direktnachrichten zwischen Mitgliedern – absichtlich: Ein
|
||||
öffentlicher Raum lässt sich moderieren, ein privater nicht.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<!-- ==== WAS IST ÜBER MICH GESPEICHERT? (15.09.2026) ==============
|
||||
Art. 15 DSGVO. Kein Antrag, kein Formular, kein Warten – ein
|
||||
Knopf. Er steht auf den beiden Seiten, die einem Menschen selbst
|
||||
gehören: dem Steckbrief und den Treff-Regeln. Die Community hat
|
||||
keinen Steckbrief; ohne die zweite Stelle hätte ausgerechnet die
|
||||
Gruppe mit den wenigsten Rechten auch diesen nicht. -->
|
||||
<section class="meine-daten">
|
||||
<div class="meine-daten__kopf">
|
||||
<h2 class="meine-daten__titel">Was ist über mich gespeichert?</h2>
|
||||
<button type="button" class="knopf-still" id="auskunft-knopf">Datei herunterladen</button>
|
||||
</div>
|
||||
<p class="meine-daten__satz">
|
||||
Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen.
|
||||
Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen,
|
||||
stehen sie nicht mit Namen darin – ihre Daten gehören ihnen.
|
||||
</p>
|
||||
<p class="leise" id="auskunft-stand" hidden></p>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<!-- WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN (Regel seit 07.09.2026).
|
||||
|
||||
Der Umschalter "Meine Sicht" in der Kopfleiste ist ein selbst
|
||||
gebautes Bedienelement; dahinter liegt ein unsichtbares Systemfeld
|
||||
fuer Vorleseprogramme. Ohne wahl.js faellt kopf.js auf dieses Feld
|
||||
zurueck -- ein grauer Kasten von 92 x 19 Pixeln mit weisser
|
||||
Schrift, mitten in einer dunklen Leiste.
|
||||
|
||||
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
|
||||
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
|
||||
die seit dem 07.09. jede Seite danach absucht. -->
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/auskunft.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/treff-regeln.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+161
-161
@@ -1,161 +1,161 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Dashboard · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Dashboard</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Alles zentral</p>
|
||||
<h1 class="titel" id="titel">Dashboard</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft.
|
||||
</p>
|
||||
</div>
|
||||
<!-- Der Knopf steht HIER und nicht in der Personenverwaltung
|
||||
(07.09.2026). Ein Manager kommt dort gar nicht hinein, und er
|
||||
soll es auch nicht -- dahinter liegen Rollen, Codes, Sperren und
|
||||
das Protokoll. Hier dagegen sieht er ohnehin seine Creator; der
|
||||
neue erscheint eine Zeile weiter unten. Das Skript blendet den
|
||||
Knopf für Scouts und Creator aus, der Server lässt sie ohnehin
|
||||
nicht durch. -->
|
||||
<button type="button" class="knopf knopf--klein" id="creator-neu" hidden>Creator anlegen</button>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Creator anlegen. Derselbe Dialog-Aufbau wie überall sonst. -->
|
||||
<dialog class="dialog" id="creator-dialog">
|
||||
<form method="dialog" class="neu neu--blank" id="creator-form">
|
||||
<h2 class="dialog__titel">Creator anlegen</h2>
|
||||
<p class="dialog__unter">
|
||||
Der Zugangscode erscheint genau einmal – danach ist er weg und
|
||||
kann nur neu gesetzt werden.
|
||||
</p>
|
||||
|
||||
<div class="neu__zeile">
|
||||
<label class="feld-schild" for="cn-name">Name</label>
|
||||
<input id="cn-name" maxlength="60" required autocomplete="off" />
|
||||
</div>
|
||||
|
||||
<div class="neu__zeile" id="cn-scout-zeile" hidden>
|
||||
<label class="feld-schild" for="cn-scout">Betreuung</label>
|
||||
<select id="cn-scout"></select>
|
||||
<p class="feld-hinweis">
|
||||
Ohne Auswahl betreust du ihn selbst. Zur Auswahl stehen nur
|
||||
deine eigenen Scouts.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Der Code. Steht erst nach dem Anlegen da und wird nie
|
||||
nachgeladen -- die Seite ist die einzige Stelle, an der er je
|
||||
zu sehen ist. -->
|
||||
<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="code-anzeige" id="cn-code"></p>
|
||||
<p class="feld-hinweis">
|
||||
Jetzt weitergeben. Nach dem Schließen ist er nicht mehr abrufbar.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="fehler" id="cn-fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<div class="dialog__knoepfe">
|
||||
<button type="submit" class="knopf knopf--klein" id="cn-speichern">Anlegen</button>
|
||||
<button type="button" class="abmelden" id="cn-zu">Schließen</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<!-- FRÜHWARNUNG (06.09.2026).
|
||||
|
||||
Steht GANZ OBEN, noch vor den Summen. Die Summen beantworten "wie
|
||||
steht es insgesamt", die Karten "wie steht es bei jedem" – aber
|
||||
die Frage, mit der ein Betreuer morgens ankommt, ist eine dritte:
|
||||
"wo muss ich HEUTE hin?" Sie stand bis jetzt nirgends.
|
||||
|
||||
Bewusst OHNE Punktzahl. Ein Wert wie "Abwanderungsrisiko 73"
|
||||
klingt nach Wissenschaft und ist eine Behauptung: Man kann ihn
|
||||
nicht prüfen, nicht widersprechen und nicht erklären. Hier stehen
|
||||
stattdessen die einzelnen Beobachtungen im Klartext, jede mit
|
||||
ihrem Beleg – dann entscheidet ein Mensch.
|
||||
|
||||
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,
|
||||
ist keine Mitteilung an die betroffene Person. -->
|
||||
<section class="warnblock" id="fruehwarnung" hidden aria-labelledby="warn-titel">
|
||||
<div class="klapp-kopf">
|
||||
<h2 class="feldschild" id="warn-titel">Wo ich diese Woche nachfassen würde</h2>
|
||||
</div>
|
||||
<div class="warnliste" id="warnliste"></div>
|
||||
</section>
|
||||
|
||||
<!-- Summen über alle sichtbaren Creator. Steht oben, weil die Frage
|
||||
"wie steht es insgesamt" vor der Frage "bei wem" kommt. -->
|
||||
<section class="summen" id="summen" hidden></section>
|
||||
|
||||
<div id="liste" aria-busy="true"><p class="leise">Übersicht wird geladen …</p></div>
|
||||
|
||||
<p class="stand" id="stand" hidden></p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Dashboard · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
|
||||
Dialog "Creator anlegen". -->
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Dashboard</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Alles zentral</p>
|
||||
<h1 class="titel" id="titel">Dashboard</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft.
|
||||
</p>
|
||||
</div>
|
||||
<!-- Der Knopf steht HIER und nicht in der Personenverwaltung
|
||||
(07.09.2026). Ein Manager kommt dort gar nicht hinein, und er
|
||||
soll es auch nicht -- dahinter liegen Rollen, Codes, Sperren und
|
||||
das Protokoll. Hier dagegen sieht er ohnehin seine Creator; der
|
||||
neue erscheint eine Zeile weiter unten. Das Skript blendet den
|
||||
Knopf für Scouts und Creator aus, der Server lässt sie ohnehin
|
||||
nicht durch. -->
|
||||
<button type="button" class="knopf knopf--klein" id="creator-neu" hidden>Creator anlegen</button>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- Creator anlegen. Derselbe Dialog-Aufbau wie überall sonst. -->
|
||||
<dialog class="dialog" id="creator-dialog">
|
||||
<form method="dialog" class="neu neu--blank" id="creator-form">
|
||||
<h2 class="dialog__titel">Creator anlegen</h2>
|
||||
<p class="dialog__unter">
|
||||
Der Zugangscode erscheint genau einmal – danach ist er weg und
|
||||
kann nur neu gesetzt werden.
|
||||
</p>
|
||||
|
||||
<div class="neu__zeile">
|
||||
<label class="feld-schild" for="cn-name">Name</label>
|
||||
<input id="cn-name" maxlength="60" required autocomplete="off" />
|
||||
</div>
|
||||
|
||||
<div class="neu__zeile" id="cn-scout-zeile" hidden>
|
||||
<label class="feld-schild" for="cn-scout">Betreuung</label>
|
||||
<select id="cn-scout"></select>
|
||||
<p class="feld-hinweis">
|
||||
Ohne Auswahl betreust du ihn selbst. Zur Auswahl stehen nur
|
||||
deine eigenen Scouts.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Der Code. Steht erst nach dem Anlegen da und wird nie
|
||||
nachgeladen -- die Seite ist die einzige Stelle, an der er je
|
||||
zu sehen ist. -->
|
||||
<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="code-anzeige" id="cn-code"></p>
|
||||
<p class="feld-hinweis">
|
||||
Jetzt weitergeben. Nach dem Schließen ist er nicht mehr abrufbar.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="fehler" id="cn-fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<div class="dialog__knoepfe">
|
||||
<button type="submit" class="knopf knopf--klein" id="cn-speichern">Anlegen</button>
|
||||
<button type="button" class="abmelden" id="cn-zu">Schließen</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<!-- FRÜHWARNUNG (06.09.2026).
|
||||
|
||||
Steht GANZ OBEN, noch vor den Summen. Die Summen beantworten "wie
|
||||
steht es insgesamt", die Karten "wie steht es bei jedem" – aber
|
||||
die Frage, mit der ein Betreuer morgens ankommt, ist eine dritte:
|
||||
"wo muss ich HEUTE hin?" Sie stand bis jetzt nirgends.
|
||||
|
||||
Bewusst OHNE Punktzahl. Ein Wert wie "Abwanderungsrisiko 73"
|
||||
klingt nach Wissenschaft und ist eine Behauptung: Man kann ihn
|
||||
nicht prüfen, nicht widersprechen und nicht erklären. Hier stehen
|
||||
stattdessen die einzelnen Beobachtungen im Klartext, jede mit
|
||||
ihrem Beleg – dann entscheidet ein Mensch.
|
||||
|
||||
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,
|
||||
ist keine Mitteilung an die betroffene Person. -->
|
||||
<section class="warnblock" id="fruehwarnung" hidden aria-labelledby="warn-titel">
|
||||
<div class="klapp-kopf">
|
||||
<h2 class="feldschild" id="warn-titel">Wo ich diese Woche nachfassen würde</h2>
|
||||
</div>
|
||||
<div class="warnliste" id="warnliste"></div>
|
||||
</section>
|
||||
|
||||
<!-- Summen über alle sichtbaren Creator. Steht oben, weil die Frage
|
||||
"wie steht es insgesamt" vor der Frage "bei wem" kommt. -->
|
||||
<section class="summen" id="summen" hidden></section>
|
||||
|
||||
<div id="liste" aria-busy="true"><p class="leise">Übersicht wird geladen …</p></div>
|
||||
|
||||
<p class="stand" id="stand" hidden></p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/uebersicht.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+227
-227
@@ -1,227 +1,227 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Unsere Seiten · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · Unsere Seiten</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Der Treff · Unsere Seiten</p>
|
||||
<h1 class="titel">Unsere Seiten</h1>
|
||||
<p class="unterzeile">
|
||||
Was es außerhalb vom Treff noch gibt — und wo dein Rabatt wartet.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ==================================================================
|
||||
WARUM DIESE SEITE EXISTIERT (19.09.2026)
|
||||
|
||||
Filipe: "ich brauch im community bereich noch eine kachel, die
|
||||
wenn man drauf drückt dan kacheln hat die auf die website von
|
||||
dogfather universe geht ... und die shop site von vanvan."
|
||||
|
||||
ZWEI GRUENDE, WARUM DAS EINE EIGENE SEITE IST und nicht zwei
|
||||
Kacheln direkt in der Uebersicht:
|
||||
|
||||
1. Die sieben Kacheln im Treff fuehren alle NACH INNEN -- auf
|
||||
ein Brett, auf dem man liest und schreibt. Zwei Kacheln
|
||||
dazwischen, die den Browser verlassen, waeren ein Bruch: Man
|
||||
tippt auf etwas, das aussieht wie ein Brett, und ist
|
||||
ploetzlich woanders. Eine eigene Seite sagt vorher, was
|
||||
passiert.
|
||||
|
||||
2. Ein Rabattcode braucht Platz. Er muss gross, kopierbar und
|
||||
mit seinen Bedingungen dastehen -- sonst wird er falsch
|
||||
erinnert und jemand steht enttaeuscht an der Kasse.
|
||||
|
||||
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
|
||||
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
|
||||
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
|
||||
an Community, Zuschauer, Freunde etc." -- und mit
|
||||
"giltAufSale": false. Genau deshalb steht der Satz zu den
|
||||
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
|
||||
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
|
||||
er Umsatz bringt.
|
||||
|
||||
Der zweite Code in derselben Datei ist als "Nur fuer Filipe
|
||||
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
|
||||
Seite.
|
||||
============================================================== -->
|
||||
|
||||
<div class="seiten-gitter">
|
||||
|
||||
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
|
||||
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
|
||||
<div class="aussen__schein" aria-hidden="true"></div>
|
||||
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
|
||||
|
||||
Filipe: "die sollen paar mal sein in der kacheln und so wie
|
||||
schweben, sich ganz leicht bewegen."
|
||||
|
||||
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
|
||||
gleich waere ein Muster, und ein Muster sieht nach Tapete
|
||||
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
|
||||
etwas ablenkt.
|
||||
|
||||
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
|
||||
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
|
||||
Logo in jede Kachel, egal welchen Ton sie hat.
|
||||
|
||||
`aria-hidden`, weil sie nichts sagen -- wer die Seite
|
||||
vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
|
||||
<div class="logo-feld" aria-hidden="true">
|
||||
<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="3"></span>
|
||||
<span class="logo-feld__stueck" data-n="4"></span>
|
||||
</div>
|
||||
<div class="aussen__kopf">
|
||||
<span class="aussen__zeichen" aria-hidden="true">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<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" />
|
||||
</svg>
|
||||
</span>
|
||||
<div>
|
||||
<p class="aussen__marke">Die Website</p>
|
||||
<h2 class="aussen__titel">DogFather Universe</h2>
|
||||
</div>
|
||||
</div>
|
||||
<p class="aussen__satz">
|
||||
Die Heimat von DogFather als Streamer, der HasiDog-Community
|
||||
und seiner Arbeit als Manager bei Spicy Media.
|
||||
</p>
|
||||
|
||||
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
|
||||
Die Punkte stammen aus der Navigation von
|
||||
dogfather-universe.com (streamplan.html, hasidog.html,
|
||||
zeitreise.html, stimmen.html). Eine erfundene Aufzählung
|
||||
wäre beim ersten Klick als Lüge aufgeflogen.
|
||||
|
||||
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
|
||||
Startseite; einzelne Links darin würden diesen Klick
|
||||
zerschneiden und wären auf dem Handy außerdem zu kleine
|
||||
Ziele. -->
|
||||
<ul class="aussen__liste">
|
||||
<li>Der Streamplan – wann was läuft</li>
|
||||
<li>HasiDog: die Community rund um Dogi</li>
|
||||
<li>Die Zeitreise durch alles Bisherige</li>
|
||||
<li>Stimmen von Leuten, die dabei waren</li>
|
||||
</ul>
|
||||
|
||||
<p class="aussen__weg">
|
||||
<span class="aussen__adresse">dogfather-universe.com</span>
|
||||
<a class="aussen__knopf" href="https://dogfather-universe.com/"
|
||||
target="_blank" rel="noopener noreferrer">Seite öffnen →</a>
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<!-- ---- VANVANS SHOP ------------------------------------------ -->
|
||||
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
|
||||
<div class="aussen__schein" aria-hidden="true"></div>
|
||||
<div class="logo-feld" aria-hidden="true">
|
||||
<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="3"></span>
|
||||
<span class="logo-feld__stueck" data-n="4"></span>
|
||||
</div>
|
||||
<div class="aussen__kopf">
|
||||
<span class="aussen__zeichen" aria-hidden="true">
|
||||
<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="M9 8V6.4a3 3 0 0 1 6 0V8" />
|
||||
</svg>
|
||||
</span>
|
||||
<div>
|
||||
<p class="aussen__marke">Der Shop</p>
|
||||
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
|
||||
(og:site_name und meta description). Meine erste Fassung
|
||||
hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
|
||||
Anhänger, Werkzeug" — beides ausgedacht und beides
|
||||
falsch. Der Laden heißt mit „&", und er verkauft vor
|
||||
allem Handgemachtes. -->
|
||||
<h2 class="aussen__titel">Van's DIY & Bastelbedarf</h2>
|
||||
</div>
|
||||
</div>
|
||||
<p class="aussen__satz">
|
||||
VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
|
||||
Schmuck und Bastelzubehör.
|
||||
</p>
|
||||
|
||||
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
|
||||
dieser Karte ist -- und kopierbar, weil niemand einen Code
|
||||
abtippen soll, den er sich vorher merken muss. -->
|
||||
<div class="gutschein">
|
||||
<p class="gutschein__zeile">
|
||||
<span class="gutschein__prozent">10 %</span>
|
||||
<span class="gutschein__wofuer">für alle aus der Community</span>
|
||||
</p>
|
||||
<button type="button" class="gutschein__code" id="code-knopf"
|
||||
data-code="DOGI10"
|
||||
aria-label="Rabattcode DOGI10 kopieren">
|
||||
<span class="gutschein__wort">DOGI10</span>
|
||||
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
|
||||
</button>
|
||||
<p class="gutschein__klein">
|
||||
Beim Bestellen im Feld für den Gutscheincode eintragen.
|
||||
Gilt nicht auf bereits reduzierte Artikel.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="aussen__weg">
|
||||
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
|
||||
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
|
||||
target="_blank" rel="noopener noreferrer">Shop öffnen →</a>
|
||||
</p>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
||||
<p class="seiten-fuss">
|
||||
Beide Seiten öffnen sich in einem neuen Fenster — der Treff bleibt
|
||||
also offen.
|
||||
</p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Unsere Seiten · Der Treff</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Der Treff</a> · Unsere Seiten</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt inhalt--breit">
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Der Treff · Unsere Seiten</p>
|
||||
<h1 class="titel">Unsere Seiten</h1>
|
||||
<p class="unterzeile">
|
||||
Was es außerhalb vom Treff noch gibt — und wo dein Rabatt wartet.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ==================================================================
|
||||
WARUM DIESE SEITE EXISTIERT (19.09.2026)
|
||||
|
||||
Filipe: "ich brauch im community bereich noch eine kachel, die
|
||||
wenn man drauf drückt dan kacheln hat die auf die website von
|
||||
dogfather universe geht ... und die shop site von vanvan."
|
||||
|
||||
ZWEI GRUENDE, WARUM DAS EINE EIGENE SEITE IST und nicht zwei
|
||||
Kacheln direkt in der Uebersicht:
|
||||
|
||||
1. Die sieben Kacheln im Treff fuehren alle NACH INNEN -- auf
|
||||
ein Brett, auf dem man liest und schreibt. Zwei Kacheln
|
||||
dazwischen, die den Browser verlassen, waeren ein Bruch: Man
|
||||
tippt auf etwas, das aussieht wie ein Brett, und ist
|
||||
ploetzlich woanders. Eine eigene Seite sagt vorher, was
|
||||
passiert.
|
||||
|
||||
2. Ein Rabattcode braucht Platz. Er muss gross, kopierbar und
|
||||
mit seinen Bedingungen dastehen -- sonst wird er falsch
|
||||
erinnert und jemand steht enttaeuscht an der Kasse.
|
||||
|
||||
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
|
||||
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
|
||||
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
|
||||
an Community, Zuschauer, Freunde etc." -- und mit
|
||||
"giltAufSale": false. Genau deshalb steht der Satz zu den
|
||||
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
|
||||
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
|
||||
er Umsatz bringt.
|
||||
|
||||
Der zweite Code in derselben Datei ist als "Nur fuer Filipe
|
||||
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
|
||||
Seite.
|
||||
============================================================== -->
|
||||
|
||||
<div class="seiten-gitter">
|
||||
|
||||
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
|
||||
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
|
||||
<div class="aussen__schein" aria-hidden="true"></div>
|
||||
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
|
||||
|
||||
Filipe: "die sollen paar mal sein in der kacheln und so wie
|
||||
schweben, sich ganz leicht bewegen."
|
||||
|
||||
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
|
||||
gleich waere ein Muster, und ein Muster sieht nach Tapete
|
||||
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
|
||||
etwas ablenkt.
|
||||
|
||||
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
|
||||
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
|
||||
Logo in jede Kachel, egal welchen Ton sie hat.
|
||||
|
||||
`aria-hidden`, weil sie nichts sagen -- wer die Seite
|
||||
vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
|
||||
<div class="logo-feld" aria-hidden="true">
|
||||
<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="3"></span>
|
||||
<span class="logo-feld__stueck" data-n="4"></span>
|
||||
</div>
|
||||
<div class="aussen__kopf">
|
||||
<span class="aussen__zeichen" aria-hidden="true">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<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" />
|
||||
</svg>
|
||||
</span>
|
||||
<div>
|
||||
<p class="aussen__marke">Die Website</p>
|
||||
<h2 class="aussen__titel">DogFather Universe</h2>
|
||||
</div>
|
||||
</div>
|
||||
<p class="aussen__satz">
|
||||
Die Heimat von DogFather als Streamer, der HasiDog-Community
|
||||
und seiner Arbeit als Manager bei Spicy Media.
|
||||
</p>
|
||||
|
||||
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
|
||||
Die Punkte stammen aus der Navigation von
|
||||
dogfather-universe.com (streamplan.html, hasidog.html,
|
||||
zeitreise.html, stimmen.html). Eine erfundene Aufzählung
|
||||
wäre beim ersten Klick als Lüge aufgeflogen.
|
||||
|
||||
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
|
||||
Startseite; einzelne Links darin würden diesen Klick
|
||||
zerschneiden und wären auf dem Handy außerdem zu kleine
|
||||
Ziele. -->
|
||||
<ul class="aussen__liste">
|
||||
<li>Der Streamplan – wann was läuft</li>
|
||||
<li>HasiDog: die Community rund um Dogi</li>
|
||||
<li>Die Zeitreise durch alles Bisherige</li>
|
||||
<li>Stimmen von Leuten, die dabei waren</li>
|
||||
</ul>
|
||||
|
||||
<p class="aussen__weg">
|
||||
<span class="aussen__adresse">dogfather-universe.com</span>
|
||||
<a class="aussen__knopf" href="https://dogfather-universe.com/"
|
||||
target="_blank" rel="noopener noreferrer">Seite öffnen →</a>
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<!-- ---- VANVANS SHOP ------------------------------------------ -->
|
||||
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
|
||||
<div class="aussen__schein" aria-hidden="true"></div>
|
||||
<div class="logo-feld" aria-hidden="true">
|
||||
<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="3"></span>
|
||||
<span class="logo-feld__stueck" data-n="4"></span>
|
||||
</div>
|
||||
<div class="aussen__kopf">
|
||||
<span class="aussen__zeichen" aria-hidden="true">
|
||||
<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="M9 8V6.4a3 3 0 0 1 6 0V8" />
|
||||
</svg>
|
||||
</span>
|
||||
<div>
|
||||
<p class="aussen__marke">Der Shop</p>
|
||||
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
|
||||
(og:site_name und meta description). Meine erste Fassung
|
||||
hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
|
||||
Anhänger, Werkzeug" — beides ausgedacht und beides
|
||||
falsch. Der Laden heißt mit „&", und er verkauft vor
|
||||
allem Handgemachtes. -->
|
||||
<h2 class="aussen__titel">Van's DIY & Bastelbedarf</h2>
|
||||
</div>
|
||||
</div>
|
||||
<p class="aussen__satz">
|
||||
VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
|
||||
Schmuck und Bastelzubehör.
|
||||
</p>
|
||||
|
||||
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
|
||||
dieser Karte ist -- und kopierbar, weil niemand einen Code
|
||||
abtippen soll, den er sich vorher merken muss. -->
|
||||
<div class="gutschein">
|
||||
<p class="gutschein__zeile">
|
||||
<span class="gutschein__prozent">10 %</span>
|
||||
<span class="gutschein__wofuer">für alle aus der Community</span>
|
||||
</p>
|
||||
<button type="button" class="gutschein__code" id="code-knopf"
|
||||
data-code="DOGI10"
|
||||
aria-label="Rabattcode DOGI10 kopieren">
|
||||
<span class="gutschein__wort">DOGI10</span>
|
||||
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
|
||||
</button>
|
||||
<p class="gutschein__klein">
|
||||
Beim Bestellen im Feld für den Gutscheincode eintragen.
|
||||
Gilt nicht auf bereits reduzierte Artikel.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="aussen__weg">
|
||||
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
|
||||
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
|
||||
target="_blank" rel="noopener noreferrer">Shop öffnen →</a>
|
||||
</p>
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
||||
<p class="seiten-fuss">
|
||||
Beide Seiten öffnen sich in einem neuen Fenster — der Treff bleibt
|
||||
also offen.
|
||||
</p>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/unsere-seiten.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+154
-154
@@ -1,154 +1,154 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Entwicklung · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Entwicklung</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
ENTWICKLUNG — die Auswertung je Person (19.09.2026)
|
||||
|
||||
Filipe: „dan perfektionierst du eine neue wo diagramme texte und
|
||||
so zu jedem modi gemacht wird und diese kategorie kannst du
|
||||
entwicklung nenen."
|
||||
|
||||
DIESE SEITE HAT ZWEI GESICHTER, und welches man sieht, entscheidet
|
||||
der Server:
|
||||
|
||||
Leitung -> die Karten aller, die eine haben
|
||||
Ein Modi -> ausschliesslich die Bewegung in der EIGENEN Karte,
|
||||
ohne Namen, ohne Anlass, ohne wer-hat-was
|
||||
|
||||
WAS HIER NICHT STEHT UND NIE STEHEN WIRD: eine Punktzahl, ein
|
||||
Prozentwert, ein Durchschnitt, eine Rangliste, ein Vergleich
|
||||
zwischen zwei Menschen. Eine Zahl ueber einen Menschen wird
|
||||
gelesen, verglichen und weitererzaehlt — gebraucht wird ein
|
||||
Gespraechsanlass.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Entwicklung & Nachwuchs</p>
|
||||
<h1 class="titel" id="titel">Entwicklung</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich –
|
||||
jede Karte nur mit sich selbst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ---- Die Liste (nur Leitung) ---------------------------------- -->
|
||||
<section id="liste-block" hidden>
|
||||
<p class="w-hinweis" id="liste-hinweis"></p>
|
||||
<div id="liste" class="w-liste" aria-busy="true">
|
||||
<p class="leise">wird geladen …</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ---- Eine Karte (nur Leitung) --------------------------------- -->
|
||||
<section id="karte-block" hidden>
|
||||
<button type="button" class="knopf knopf--still knopf--klein" id="zur-liste">
|
||||
← Alle Karten
|
||||
</button>
|
||||
|
||||
<h2 class="w-name" id="karte-name">…</h2>
|
||||
<p class="w-satz" id="karte-satz">…</p>
|
||||
|
||||
<!-- Diagramm 1: Bewegung. Zwei Richtungen um eine Nulllinie —
|
||||
vorwaerts und rueckwaerts sind dieselbe Groesse mit
|
||||
verschiedenem Vorzeichen, nicht zwei Themen. -->
|
||||
<section class="w-teil" id="bewegung-block">
|
||||
<h3 class="e-abschnitt">Was sich bewegt hat</h3>
|
||||
<p class="w-teil__satz" id="bewegung-satz"></p>
|
||||
<div id="bewegung"></div>
|
||||
</section>
|
||||
|
||||
<!-- Diagramm 2: der Streifen. Eine Zeile je Punkt, eine Spalte je
|
||||
Monat. Das Zeichen sagt die Stufe, die Farbe verstaerkt nur. -->
|
||||
<section class="w-teil" id="streifen-block">
|
||||
<h3 class="e-abschnitt">Punkt für Punkt, Monat für Monat</h3>
|
||||
<p class="w-teil__satz" id="streifen-satz"></p>
|
||||
<div id="streifen" class="w-streifen"></div>
|
||||
</section>
|
||||
|
||||
<!-- Die Texte. Reihenfolge ist Absicht: erst was sich bewegt hat,
|
||||
dann was traegt, erst danach was liegt. -->
|
||||
<section class="w-teil" id="texte-block">
|
||||
<h3 class="e-abschnitt">Was dazu zu sagen ist</h3>
|
||||
<div id="texte"></div>
|
||||
</section>
|
||||
|
||||
<p class="w-fuss">
|
||||
Auf dieser Seite gibt es keine Punktzahl und keinen Vergleich zwischen
|
||||
Personen. Was hier steht, ist ein Gesprächsanlass – kein Zeugnis.
|
||||
Einschätzungen setzt und ändert man im Katalog:
|
||||
<a href="entwicklung.html">Eure Aufgaben</a>.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- ---- Die eigene Sicht (Modi) ---------------------------------- -->
|
||||
<!-- ==================================================================
|
||||
WAS DER MENSCH SELBST SIEHT.
|
||||
|
||||
Hier steht kein fremder Name, keine Beobachtung über jemand
|
||||
anderen und kein Anlasstext. Nur: ob sich etwas bewegt hat.
|
||||
|
||||
Die Lesehilfe und die zwei Wege am Ende sind am 19.09.2026
|
||||
dazugekommen. Vorher standen hier Balken ohne Erklärung und ein
|
||||
„Frag danach" ohne Adressaten – eine Sackgasse mit freundlichem
|
||||
Ton.
|
||||
============================================================== -->
|
||||
<section id="mich-block" hidden>
|
||||
<h2 class="e-abschnitt">Deine Entwicklung</h2>
|
||||
<p class="w-satz" id="mich-satz">…</p>
|
||||
<p class="w-lesehilfe" id="mich-lesehilfe" hidden></p>
|
||||
<div id="mich-bewegung"></div>
|
||||
<p class="w-fuss" id="mich-hinweis"></p>
|
||||
<div class="w-wege" id="mich-wege" hidden></div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191915" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609191915" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||
<title>Entwicklung · Spicy & Dogi</title>
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191956" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
|
||||
<div class="schleier" aria-hidden="true"></div>
|
||||
|
||||
<header class="kopfleiste">
|
||||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||||
</svg>
|
||||
<span class="zurueck-knopf__text">Zurück</span>
|
||||
</button>
|
||||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team Dogi</a> · Entwicklung</span></p>
|
||||
<div class="kopfleiste__rechts">
|
||||
<span class="wer" id="wer">…</span>
|
||||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="inhalt">
|
||||
|
||||
<!-- ==================================================================
|
||||
ENTWICKLUNG — die Auswertung je Person (19.09.2026)
|
||||
|
||||
Filipe: „dan perfektionierst du eine neue wo diagramme texte und
|
||||
so zu jedem modi gemacht wird und diese kategorie kannst du
|
||||
entwicklung nenen."
|
||||
|
||||
DIESE SEITE HAT ZWEI GESICHTER, und welches man sieht, entscheidet
|
||||
der Server:
|
||||
|
||||
Leitung -> die Karten aller, die eine haben
|
||||
Ein Modi -> ausschliesslich die Bewegung in der EIGENEN Karte,
|
||||
ohne Namen, ohne Anlass, ohne wer-hat-was
|
||||
|
||||
WAS HIER NICHT STEHT UND NIE STEHEN WIRD: eine Punktzahl, ein
|
||||
Prozentwert, ein Durchschnitt, eine Rangliste, ein Vergleich
|
||||
zwischen zwei Menschen. Eine Zahl ueber einen Menschen wird
|
||||
gelesen, verglichen und weitererzaehlt — gebraucht wird ein
|
||||
Gespraechsanlass.
|
||||
============================================================== -->
|
||||
|
||||
<section class="kopf-zeile">
|
||||
<div>
|
||||
<p class="marke">Entwicklung & Nachwuchs</p>
|
||||
<h1 class="titel" id="titel">Entwicklung</h1>
|
||||
<p class="unterzeile" id="unterzeile">
|
||||
Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich –
|
||||
jede Karte nur mit sich selbst.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||||
|
||||
<!-- ---- Die Liste (nur Leitung) ---------------------------------- -->
|
||||
<section id="liste-block" hidden>
|
||||
<p class="w-hinweis" id="liste-hinweis"></p>
|
||||
<div id="liste" class="w-liste" aria-busy="true">
|
||||
<p class="leise">wird geladen …</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ---- Eine Karte (nur Leitung) --------------------------------- -->
|
||||
<section id="karte-block" hidden>
|
||||
<button type="button" class="knopf knopf--still knopf--klein" id="zur-liste">
|
||||
← Alle Karten
|
||||
</button>
|
||||
|
||||
<h2 class="w-name" id="karte-name">…</h2>
|
||||
<p class="w-satz" id="karte-satz">…</p>
|
||||
|
||||
<!-- Diagramm 1: Bewegung. Zwei Richtungen um eine Nulllinie —
|
||||
vorwaerts und rueckwaerts sind dieselbe Groesse mit
|
||||
verschiedenem Vorzeichen, nicht zwei Themen. -->
|
||||
<section class="w-teil" id="bewegung-block">
|
||||
<h3 class="e-abschnitt">Was sich bewegt hat</h3>
|
||||
<p class="w-teil__satz" id="bewegung-satz"></p>
|
||||
<div id="bewegung"></div>
|
||||
</section>
|
||||
|
||||
<!-- Diagramm 2: der Streifen. Eine Zeile je Punkt, eine Spalte je
|
||||
Monat. Das Zeichen sagt die Stufe, die Farbe verstaerkt nur. -->
|
||||
<section class="w-teil" id="streifen-block">
|
||||
<h3 class="e-abschnitt">Punkt für Punkt, Monat für Monat</h3>
|
||||
<p class="w-teil__satz" id="streifen-satz"></p>
|
||||
<div id="streifen" class="w-streifen"></div>
|
||||
</section>
|
||||
|
||||
<!-- Die Texte. Reihenfolge ist Absicht: erst was sich bewegt hat,
|
||||
dann was traegt, erst danach was liegt. -->
|
||||
<section class="w-teil" id="texte-block">
|
||||
<h3 class="e-abschnitt">Was dazu zu sagen ist</h3>
|
||||
<div id="texte"></div>
|
||||
</section>
|
||||
|
||||
<p class="w-fuss">
|
||||
Auf dieser Seite gibt es keine Punktzahl und keinen Vergleich zwischen
|
||||
Personen. Was hier steht, ist ein Gesprächsanlass – kein Zeugnis.
|
||||
Einschätzungen setzt und ändert man im Katalog:
|
||||
<a href="entwicklung.html">Eure Aufgaben</a>.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- ---- Die eigene Sicht (Modi) ---------------------------------- -->
|
||||
<!-- ==================================================================
|
||||
WAS DER MENSCH SELBST SIEHT.
|
||||
|
||||
Hier steht kein fremder Name, keine Beobachtung über jemand
|
||||
anderen und kein Anlasstext. Nur: ob sich etwas bewegt hat.
|
||||
|
||||
Die Lesehilfe und die zwei Wege am Ende sind am 19.09.2026
|
||||
dazugekommen. Vorher standen hier Balken ohne Erklärung und ein
|
||||
„Frag danach" ohne Adressaten – eine Sackgasse mit freundlichem
|
||||
Ton.
|
||||
============================================================== -->
|
||||
<section id="mich-block" hidden>
|
||||
<h2 class="e-abschnitt">Deine Entwicklung</h2>
|
||||
<p class="w-satz" id="mich-satz">…</p>
|
||||
<p class="w-lesehilfe" id="mich-lesehilfe" hidden></p>
|
||||
<div id="mich-bewegung"></div>
|
||||
<p class="w-fuss" id="mich-hinweis"></p>
|
||||
<div class="w-wege" id="mich-wege" hidden></div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
<script src="assets/js/meldung.js?v=202609191956" defer></script>
|
||||
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/werdegang.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+15
-14
@@ -12,20 +12,20 @@
|
||||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||||
eine Flaeche sind statt zweier. -->
|
||||
<meta name="theme-color" content="#06090f" />
|
||||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609191915" />
|
||||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?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=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/gate.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/start.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/wissen.css?v=202609191956" />
|
||||
<link rel="stylesheet" href="assets/css/module.css?v=202609191956" />
|
||||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191915" />
|
||||
<link rel="stylesheet" href="assets/css/haus.css?v=202609191956" />
|
||||
</head>
|
||||
|
||||
<body class="start">
|
||||
@@ -190,12 +190,13 @@
|
||||
|
||||
</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/bereiche.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609191915" defer></script>
|
||||
<script src="assets/js/wahl.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/bereiche.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/kopf.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/glocke.js?v=202609191956" defer></script>
|
||||
<script src="assets/js/wissen.js?v=202609191956" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user