From d4e05e460a5a1c3f53d0b4b2a17f67d8316a92f5 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Fri, 18 Sep 2026 18:33:02 +0200 Subject: [PATCH] Community: die echte Sicht messbar machen -- und die Sternchen weg Filipe: "perfektioniere jede einzelne kategorie der community." ERST MESSEN. tools/community-blick.mjs meldet sich als GAST an und fotografiert alle sieben Bretter. Das war noetig, weil als DogFather auf jedem Brett Knoepfe und Felder stehen, die ein Mitglied nie sieht -- wer so beurteilt, beurteilt eine Seite, die es fuer die Community nicht gibt. Der Weg dorthin war laenger als gedacht, und jeder Umweg steht als Kommentar im Werkzeug: - Die Community hat eine EIGENE Anmeldeseite (crew-index.html); auf der anderen gibt es die Rolle "gast" gar nicht. - Wer sich zum ersten Mal anmeldet, muss sein Alter bestaetigen (400 "alter_offen"), sonst kommt er nicht hinein. - Ueber die echte Adresse schickt der Server HSTS, woraufhin Chromium alle Unterdateien auf https umbiegt -- der Testserver spricht nur http. Ergebnis: eine nackte Seite ohne Stil und ohne Skripte, auf der kein Knopf etwas tat. Die Kopfzeile ist richtig so und bleibt; stattdessen wird jetzt ueber die Kopfzeile angemeldet und das Sitzungsplaetzchen in den Browser gelegt. Ohne diese drei Punkte fotografiert man die Anmeldeseite und haelt "0 Karten, kein Schreibfeld" fuer einen Befund ueber die Bretter. ERSTER BEFUND, BEHOBEN: An zehn Stellen stand **Fettschrift** als Sternchen im Text. Auf "Regeln & Hilfe" hiess es woertlich "Drei Stufen: **Hinweis** ..., **Pause** ..., **Ausschluss**" -- ausgerechnet die drei Stufen, um die es geht, sahen aus wie ein Tippfehler. KEIN innerHTML: Gebaut wird aus einzelnen Knoten. Was nicht zwischen zwei Sternchenpaaren steht, wird Text und kann nichts anderes werden. Ein einzelnes Sternchen bleibt ein Sternchen -- "3 * 4" ist keine Hervorhebung. Co-Authored-By: Claude Opus 5 --- tools/community-blick.mjs | 198 ++++++++++++++++++++++++++++++++ workspace/app.webmanifest | 8 +- workspace/assets/js/bereich.js | 55 ++++++++- workspace/aufgaben.html | 24 ++-- workspace/automation.html | 26 ++--- workspace/befinden.html | 24 ++-- workspace/bereich.html | 36 +++--- workspace/bewerben.html | 30 ++--- workspace/bewerbungen.html | 28 ++--- workspace/calls.html | 28 ++--- workspace/chat.html | 28 ++--- workspace/content.html | 30 ++--- workspace/crew-index.html | 10 +- workspace/crew.webmanifest | 8 +- workspace/dateien.html | 26 ++--- workspace/entwicklung.html | 24 ++-- workspace/index.html | 8 +- workspace/kalender.html | 28 ++--- workspace/leistung.html | 26 ++--- workspace/personen.html | 26 ++--- workspace/profil.html | 28 ++--- workspace/rechte.html | 24 ++-- workspace/report.html | 28 ++--- workspace/scouting.html | 26 ++--- workspace/start.html | 24 ++-- workspace/startcheck.html | 28 ++--- workspace/steckbrief.html | 28 ++--- workspace/talente.html | 26 ++--- workspace/team.html | 26 ++--- workspace/teamlage.html | 24 ++-- workspace/teilen.html | 22 ++-- workspace/treff-moderation.html | 24 ++-- workspace/treff-regeln.html | 26 ++--- workspace/uebersicht.html | 26 ++--- workspace/wissen.html | 26 ++--- 35 files changed, 653 insertions(+), 404 deletions(-) create mode 100644 tools/community-blick.mjs diff --git a/tools/community-blick.mjs b/tools/community-blick.mjs new file mode 100644 index 00000000..bf3e36a1 --- /dev/null +++ b/tools/community-blick.mjs @@ -0,0 +1,198 @@ +/* ===================================================================== + DIE SIEBEN COMMUNITY-BRETTER MIT DEN AUGEN EINES MITGLIEDS + + Aufruf: node tools/community-blick.mjs + BREITE=412 node tools/community-blick.mjs (Handy) + + WARUM ALS GAST UND NICHT ALS ADMIN. Als DogFather sieht man auf + jedem Brett Knoepfe, Vorschlaege und Felder, die ein Mitglied nie zu + Gesicht bekommt. Wer die Bretter so beurteilt, beurteilt eine Seite, + die es fuer die Community nicht gibt -- und uebersieht genau das, + was ihr fehlt. + + Der Startkatalog wird vorher vom Team uebernommen, damit die Bretter + nicht leer sind. Leere Bretter zu fotografieren beantwortet nur die + Frage, ob sie leer sind. + ===================================================================== */ +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawn } from "node:child_process"; +import { DatabaseSync } from "node:sqlite"; +import { scryptSync, randomBytes } from "node:crypto"; +import { request as anfrage } from "node:http"; + +const HIER = join(dirname(fileURLToPath(import.meta.url)), "..", "server"); +const PORT = Number(process.env.PORT_BLICK || 4364); +const BASIS = `http://127.0.0.1:${PORT}`; +const ordner = mkdtempSync(join(tmpdir(), "ws-comm-")); +const DB = join(ordner, "workspace.db"); +const BRETTER = ["treff", "anschlag", "ansteht", "wunsch", "highlight", "regeln", "mitmachen"]; +let kind = null; + +async function start() { + kind = spawn(process.execPath, [join(HIER, "index.js")], { + env: { ...process.env, WORKSPACE_DB: DB, PORT: String(PORT), + SITE_ACCESS_SECRET: "lokaler-test", + SITE_PUBLIC_LAUNCH_AT: "2020-01-01T00:00:00+01:00" }, + stdio: ["ignore", "pipe", "pipe"] }); + let aus = ""; + kind.stdout.on("data", (d) => { aus += d; }); + kind.stderr.on("data", (d) => { aus += d; }); + for (let i = 0; i < 80; i++) { + await new Promise((r) => setTimeout(r, 250)); + if (kind.exitCode !== null) break; + try { const a = await fetch(BASIS + "/workspace/", { redirect: "manual" }); + if (a.status < 500) return; } catch { /* noch nicht oben */ } + } + throw new Error("Server startete nicht:\n" + aus.slice(-1500)); +} + +function personAnlegen(name, rolle, code) { + const d = new DatabaseSync(DB); + const salz = randomBytes(16).toString("hex"); + const hash = scryptSync(code, salz, 64, + { N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex"); + d.prepare("INSERT INTO personen (name, rolle, code_hash, code_salt, code_n, aktiv, erstellt)" + + " VALUES (?,?,?,?,?,1,?)") + .run(name, rolle, hash, salz, 32768, new Date().toISOString()); + d.close(); +} + +await start(); +kind.kill(); +await new Promise((r) => setTimeout(r, 600)); +personAnlegen("Filipe", "admin", "CODE-DOGI-0001"); +personAnlegen("Mara", "gast", "CODE-GAST-0001"); +await start(); + +/** Meldet an -- mit Host-Kopfzeile, weil die Rolle davon abhaengt. + * + * „gast" gibt es nur im Haus der Community. Der Host entscheidet + * darueber, und ein `fetch` auf 127.0.0.1 schickt eben 127.0.0.1. + * Deshalb hier ueber node:http, wo sich der Kopf setzen laesst. + * + * ALTERSBESTAETIGUNG: Wer sich zum ersten Mal in der Community + * anmeldet, muss bestaetigen, dass er 18 ist -- sonst antwortet der + * Server mit 400 „alter_offen". */ +function rohAnfrage(pfad, host, koerper) { + return new Promise((f, s2) => { + const a = anfrage({ + host: "127.0.0.1", port: PORT, path: pfad, method: "POST", + headers: { Host: host, "Content-Type": "application/json" }, + }, (an) => { + let t = ""; + an.on("data", (c) => { t += c; }); + an.on("end", () => f({ code: an.statusCode, text: t, kopf: an.headers })); + }); + a.on("error", s2); + a.write(JSON.stringify(koerper)); + a.end(); + }); +} + +async function anmelden(rolle, code, host = "127.0.0.1") { + let a = await rohAnfrage("/workspace/api/anmelden", host, { rolle, code }); + if (a.code === 400 && a.text.includes("alter_offen")) { + a = await rohAnfrage("/workspace/api/anmelden", host, + { rolle, code, alter_ok: true }); + } + if (a.code !== 200) { + throw new Error(`Anmeldung ${rolle}@${host} -> ${a.code} ${a.text.slice(0, 120)}`); + } + return [].concat(a.kopf["set-cookie"] || []).map((z) => z.split(";")[0]).join("; "); +} + +/* ---- Das Team uebernimmt die Vorschlaege, damit nichts leer ist ---- */ +const kAdmin = await anmelden("admin", "CODE-DOGI-0001"); +console.log("=== Startkatalog uebernehmen ==="); +for (const b of BRETTER) { + const a = await fetch(`${BASIS}/workspace/api/bereich/${b}/start`, { + method: "POST", + headers: { "Content-Type": "application/json", cookie: kAdmin, origin: BASIS }, + body: JSON.stringify({}), + }); + const r = await a.json().catch(() => ({})); + console.log(` ${b.padEnd(11)} ${a.status} ${r.angelegt ?? r.anzahl ?? ""}`); +} + +/* ---- Und jetzt als Mitglied hinsehen ------------------------------ */ +const pw = await import("file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs"); +/* DIE ECHTE ADRESSE, nicht 127.0.0.1. + Der Server entscheidet ueber den Host-Kopf, ob er im Haus der + Community steht („crew.dogfather-universe.com") oder in dem der + Agentur. Auf 127.0.0.1 ist er in der Agentur -- und dort gibt es die + Rolle „gast" nicht. Der erste Versuch hat deshalb sieben Mal die + ANMELDESEITE fotografiert, mit „0 Karten" und ohne Schreibfeld, und + das sah aus wie ein Befund ueber die Bretter. + Chromium loest den Namen auf Wunsch selbst auf. */ +const browser = await pw.chromium.launch(); +const BREITE = Number(process.env.BREITE || 1500); +const ctx = await browser.newContext({ + viewport: { width: BREITE, height: BREITE < 700 ? 915 : 1100 }, + deviceScaleFactor: 1, isMobile: BREITE < 700, hasTouch: BREITE < 700 }); +const seite = await ctx.newPage(); +const fehlerAufSeite = []; +seite.on("console", (m) => { if (m.type() === "error") fehlerAufSeite.push(m.text()); }); +/* Welche Dateien kommen NICHT an? Ohne diese Zeile sieht man nur eine + nackte Seite und raet, woran es liegt. */ +const nichtGeladen = []; +seite.on("requestfailed", (r) => nichtGeladen.push(`${r.url().slice(-60)} (${r.failure()?.errorText})`)); +seite.on("response", (r) => { if (r.status() >= 400) nichtGeladen.push(`${r.url().slice(-60)} -> ${r.status()}`); }); + +/* DIE SITZUNG EINES GASTES IN DEN BROWSER LEGEN. + + Direkt im Browser anzumelden ginge nur ueber die echte Adresse -- + und dort schickt der Server `Strict-Transport-Security`, woraufhin + Chromium alle Unterdateien auf https umbiegt. Der Testserver spricht + aber nur http: Ergebnis war eine nackte Seite ohne Stil und ohne + Skripte, auf der kein Knopf mehr etwas tat. Die Kopfzeile ist + richtig so und bleibt. + + Also: anmelden, wo es geht (ueber die Kopfzeile), und das + Sitzungsplaetzchen in den Browser legen. Gemessen wird danach das, + was ein Mitglied wirklich sieht. */ +const kGast = await anmelden("gast", "CODE-GAST-0001", "crew.dogfather-universe.com"); +await ctx.addCookies(kGast.split("; ").filter(Boolean).map((z) => { + const [name, ...rest] = z.split("="); + return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; +})); + +console.log(""); +console.log("=== Was ein Mitglied sieht ==="); +for (const b of BRETTER) { + await seite.goto(`${BASIS}/workspace/bereich.html?b=${b}`, { waitUntil: "networkidle" }); + await seite.waitForTimeout(1500); + const z = await seite.evaluate(() => ({ + titel: document.querySelector("h1")?.textContent?.trim() || "", + karten: document.querySelectorAll('.eintrag-karte').length, + arten: [...new Set([...document.querySelectorAll('.eintrag-art, .art')].map((e) => e.textContent.trim()))].length, + knoepfeJeKarte: document.querySelector('.eintrag-karte') + ? document.querySelector('.eintrag-karte').querySelectorAll('button, a.schritt').length : 0, + schreibfeld: !!document.querySelector('#neu-form, .neu-form, form#neu'), + hoeheJeKarte: document.querySelector('.eintrag-karte') + ? Math.round(document.querySelector('.eintrag-karte').getBoundingClientRect().height) : 0, + startkatalog: !!document.querySelector("#startkatalog")?.children?.length, + leerText: document.querySelector(".leer, .leer-hinweis, .hinweis")?.textContent?.trim().slice(0, 80) || "", + hoehe: document.body.scrollHeight, + /* Sichtbare Sternchenpaare -- gemeint war Fettschrift. */ + sternchen: (document.body.innerText.match(/\*\*/g) || []).length, + })); + console.log(`${b.padEnd(11)} „${z.titel}" · ${z.karten} Karten` + + ` · Schreibfeld: ${z.schreibfeld ? "ja" : "NEIN"}` + + ` · Arten: ${z.arten} · Karte ${z.hoeheJeKarte}px/${z.knoepfeJeKarte} Knöpfe` + + (z.sternchen ? ` · STERNCHEN: ${z.sternchen}` : "") + + (z.leerText ? ` · „${z.leerText}"` : "")); + const pfad = `C:/Users/qciga/AppData/Local/Temp/comm-${b}${BREITE < 700 ? "-handy" : ""}.png`; + await seite.screenshot({ path: pfad, fullPage: true }); +} + +console.log(""); +console.log(fehlerAufSeite.length + ? `ACHTUNG: ${fehlerAufSeite.length} Konsolenfehler: ${fehlerAufSeite.slice(0, 3).join(" | ")}` + : "Keine Konsolenfehler."); + +await browser.close(); +kind.kill(); +try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Rest */ } diff --git a/workspace/app.webmanifest b/workspace/app.webmanifest index 1300784c..60a37fb8 100644 --- a/workspace/app.webmanifest +++ b/workspace/app.webmanifest @@ -22,25 +22,25 @@ }, "icons": [ { - "src": "/assets/img/app-symbole/workspace-192.png?v=202609181708", + "src": "/assets/img/app-symbole/workspace-192.png?v=202609181833", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-512.png?v=202609181708", + "src": "/assets/img/app-symbole/workspace-512.png?v=202609181833", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609181708", + "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609181833", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609181708", + "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609181833", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/assets/js/bereich.js b/workspace/assets/js/bereich.js index 37acf590..e7b7e503 100644 --- a/workspace/assets/js/bereich.js +++ b/workspace/assets/js/bereich.js @@ -544,7 +544,11 @@ k.append(zeile); } - if (e.text) k.append(el('p', 'eintrag-text', e.text)); + if (e.text) { + const t = el('p', 'eintrag-text'); + t.append(mitFett(e.text)); + k.append(t); + } if (stand) { for (const [feld, name] of [['event_aufgaben', 'Aufgaben'], ['event_regeln', 'Regeln']]) { @@ -1045,6 +1049,46 @@ } catch { /* dann gilt die alte Regel, siehe darfEintragen */ } } + /* ---- FETTSCHRIFT IM TEXT (18.09.2026) -------------------------- + + Im Startkatalog steht an zehn Stellen `**Hinweis**`, `**Pause**`, + `**DogFather**` -- gemeint als Hervorhebung, angezeigt als + Sternchen. Auf „Regeln & Hilfe" stand damit woertlich: + + Drei Stufen: **Hinweis** (jemand aus dem Team sagt dir, was + nicht ging), **Pause** ..., **Ausschluss**. + + Das sind ausgerechnet die drei Stufen, um die es geht -- und sie + sahen aus wie ein Tippfehler. + + KEIN innerHTML, AUCH NICHT HIER. Der Text kommt aus der Datenbank, + und dort schreiben Menschen hinein. Gebaut wird deshalb aus + einzelnen Knoten: Was nicht zwischen zwei Sternchenpaaren steht, + wird Text und kann nichts anderes werden. Ein `` + bleibt ein Wort. + + Ein einzelnes Sternchen bleibt ein Sternchen: `3 * 4` ist keine + Hervorhebung, und wer das anders faende, haette eine Regel, die + beim Rechnen zuschlaegt. */ + function mitFett(text) { + const stueck = document.createDocumentFragment(); + const teile = String(text).split(/\*\*(.+?)\*\*/s); + /* split mit einer Gruppe liefert abwechselnd: normal, fett, + normal, fett … Der ungerade Platz ist immer der Inhalt der + Klammern. */ + teile.forEach((t, i) => { + if (!t) return; + if (i % 2 === 1) { + const b = document.createElement('strong'); + b.textContent = t; + stueck.append(b); + } else { + stueck.append(document.createTextNode(t)); + } + }); + return stueck; + } + function filterBauen(eintraege = []) { const ziel = $('filter'); ziel.textContent = ''; @@ -1262,7 +1306,14 @@ const k = el('div', 'startkatalog__karte'); k.append(el('span', 'marke-art', einstellung?.arten?.[v.art] || v.art)); k.append(el('h3', 'startkatalog__name', v.titel)); - if (v.text) k.append(el('p', 'startkatalog__text', v.text)); + if (v.text) { + /* Auch hier -- sonst sieht das Team im Vorschlag Sternchen und + auf dem Brett danach Fettschrift. Zwei Darstellungen + desselben Textes sind eine zu viel. */ + const vt = el('p', 'startkatalog__text'); + vt.append(mitFett(v.text)); + k.append(vt); + } const b = el('button', 'schritt', 'Übernehmen'); b.type = 'button'; b.addEventListener('click', async () => { diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index bcbd3ba6..b516b3ba 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -12,19 +12,19 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - + + + + + + - + @@ -291,10 +291,10 @@ - - - - - + + + + + diff --git a/workspace/automation.html b/workspace/automation.html index 4fa34981..62cd8b76 100644 --- a/workspace/automation.html +++ b/workspace/automation.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -168,10 +168,10 @@ - - - - - + + + + + diff --git a/workspace/befinden.html b/workspace/befinden.html index 7206c63b..72a1eb75 100644 --- a/workspace/befinden.html +++ b/workspace/befinden.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -105,9 +105,9 @@ - - - - + + + + diff --git a/workspace/bereich.html b/workspace/bereich.html index 216b8d6a..3b7e115e 100644 --- a/workspace/bereich.html +++ b/workspace/bereich.html @@ -12,24 +12,24 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - + + + + + + - - + + - + @@ -243,14 +243,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/workspace/bewerben.html b/workspace/bewerben.html index 66d3137a..b62521b2 100644 --- a/workspace/bewerben.html +++ b/workspace/bewerben.html @@ -7,17 +7,17 @@ - - - - - - - - - + + + + + + + + + - + @@ -107,10 +107,10 @@ - - - - - + + + + + diff --git a/workspace/bewerbungen.html b/workspace/bewerbungen.html index 5dbe447e..46842be5 100644 --- a/workspace/bewerbungen.html +++ b/workspace/bewerbungen.html @@ -7,16 +7,16 @@ - - - - - - - - + + + + + + + + - + @@ -80,10 +80,10 @@ - - - - - + + + + + diff --git a/workspace/calls.html b/workspace/calls.html index b773ac33..9bee89f8 100644 --- a/workspace/calls.html +++ b/workspace/calls.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -89,11 +89,11 @@ - - - - - - + + + + + + diff --git a/workspace/chat.html b/workspace/chat.html index 5a01e712..3f301a7d 100644 --- a/workspace/chat.html +++ b/workspace/chat.html @@ -12,26 +12,26 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -341,15 +341,15 @@ - - - - + + + + - - + + diff --git a/workspace/content.html b/workspace/content.html index 50fad880..1cc19d1c 100644 --- a/workspace/content.html +++ b/workspace/content.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -179,12 +179,12 @@ - - - - - - - + + + + + + + diff --git a/workspace/crew-index.html b/workspace/crew-index.html index 377f9ac4..1cb03837 100644 --- a/workspace/crew-index.html +++ b/workspace/crew-index.html @@ -36,15 +36,15 @@ - - - + + + - + @@ -339,6 +339,6 @@ - + diff --git a/workspace/crew.webmanifest b/workspace/crew.webmanifest index 71015a3d..ecf75738 100644 --- a/workspace/crew.webmanifest +++ b/workspace/crew.webmanifest @@ -22,25 +22,25 @@ }, "icons": [ { - "src": "/assets/img/app-symbole/crew-192.png?v=202609181708", + "src": "/assets/img/app-symbole/crew-192.png?v=202609181833", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-512.png?v=202609181708", + "src": "/assets/img/app-symbole/crew-512.png?v=202609181833", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609181708", + "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609181833", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609181708", + "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609181833", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/dateien.html b/workspace/dateien.html index 924383c0..2fbdb31c 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -108,10 +108,10 @@ - - - - - + + + + + diff --git a/workspace/entwicklung.html b/workspace/entwicklung.html index e6d733d0..df0ef1b7 100644 --- a/workspace/entwicklung.html +++ b/workspace/entwicklung.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -102,9 +102,9 @@ - - - - + + + + diff --git a/workspace/index.html b/workspace/index.html index 317cfa07..b215464b 100644 --- a/workspace/index.html +++ b/workspace/index.html @@ -30,9 +30,9 @@ - - - + + + @@ -401,6 +401,6 @@ - + diff --git a/workspace/kalender.html b/workspace/kalender.html index 3c71e19e..ffbfec8b 100644 --- a/workspace/kalender.html +++ b/workspace/kalender.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -377,11 +377,11 @@ - - - - - - + + + + + + diff --git a/workspace/leistung.html b/workspace/leistung.html index 51bfbd56..61c49095 100644 --- a/workspace/leistung.html +++ b/workspace/leistung.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -444,10 +444,10 @@ - - - - - + + + + + diff --git a/workspace/personen.html b/workspace/personen.html index 128b378e..7243985c 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -423,10 +423,10 @@ - - - - - + + + + + diff --git a/workspace/profil.html b/workspace/profil.html index 4cd4c123..5d5a3cf5 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -214,11 +214,11 @@ - - - - - - + + + + + + diff --git a/workspace/rechte.html b/workspace/rechte.html index f18901f4..dbd8635c 100644 --- a/workspace/rechte.html +++ b/workspace/rechte.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -134,9 +134,9 @@ 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. --> - - - - + + + + diff --git a/workspace/report.html b/workspace/report.html index 327b5eb3..35219d51 100644 --- a/workspace/report.html +++ b/workspace/report.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -106,11 +106,11 @@ - - - - - - + + + + + + diff --git a/workspace/scouting.html b/workspace/scouting.html index 0a34d82d..d0ddb492 100644 --- a/workspace/scouting.html +++ b/workspace/scouting.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -173,10 +173,10 @@ - - - - - + + + + + diff --git a/workspace/start.html b/workspace/start.html index 60b93bd8..f8c080c7 100644 --- a/workspace/start.html +++ b/workspace/start.html @@ -12,21 +12,21 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - + + - + @@ -674,10 +674,10 @@

- - - - - + + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 4d340707..9efa422f 100644 --- a/workspace/startcheck.html +++ b/workspace/startcheck.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -85,11 +85,11 @@ - - - - - - + + + + + + diff --git a/workspace/steckbrief.html b/workspace/steckbrief.html index 63b3dea0..ca078907 100644 --- a/workspace/steckbrief.html +++ b/workspace/steckbrief.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -146,11 +146,11 @@ - - - - - - + + + + + + diff --git a/workspace/talente.html b/workspace/talente.html index 273037a7..0a884216 100644 --- a/workspace/talente.html +++ b/workspace/talente.html @@ -7,18 +7,18 @@ - - - - - - + + + + + + - - - + + + @@ -111,9 +111,9 @@ - - - - + + + + diff --git a/workspace/team.html b/workspace/team.html index a0e40788..aca2cb05 100644 --- a/workspace/team.html +++ b/workspace/team.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + @@ -110,10 +110,10 @@ - - - - - + + + + + diff --git a/workspace/teamlage.html b/workspace/teamlage.html index fe7d960b..e69413f5 100644 --- a/workspace/teamlage.html +++ b/workspace/teamlage.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + - - - - + + + + diff --git a/workspace/teilen.html b/workspace/teilen.html index da86a12c..31b4c5fa 100644 --- a/workspace/teilen.html +++ b/workspace/teilen.html @@ -7,13 +7,13 @@ - - - - - - - + + + + + + + @@ -112,9 +112,9 @@ - - - - + + + + diff --git a/workspace/treff-moderation.html b/workspace/treff-moderation.html index 55c942fc..85c84be8 100644 --- a/workspace/treff-moderation.html +++ b/workspace/treff-moderation.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -126,9 +126,9 @@ - - - - + + + + diff --git a/workspace/treff-regeln.html b/workspace/treff-regeln.html index 4eeeeb9f..2ed4f990 100644 --- a/workspace/treff-regeln.html +++ b/workspace/treff-regeln.html @@ -7,18 +7,18 @@ - - - - - - - + + + + + + + - + @@ -211,10 +211,10 @@ 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. --> - - - - - + + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index 9d43c3cb..ddc25d62 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -12,22 +12,22 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - + + + + - - - + + + - + @@ -149,11 +149,11 @@ - + - - - - + + + + diff --git a/workspace/wissen.html b/workspace/wissen.html index 4a4bd2c0..669e2f8f 100644 --- a/workspace/wissen.html +++ b/workspace/wissen.html @@ -12,20 +12,20 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - - + + + + + + + - + @@ -190,10 +190,10 @@ - - - - - + + + + +