From 4fdf08d00349b537628f7a28dd3db85ec5afb1ab Mon Sep 17 00:00:00 2001 From: Dogfather Date: Sat, 19 Sep 2026 00:14:01 +0200 Subject: [PATCH] Anruf-Probe: eine Seite, die sagt, WARUM es nicht klingelt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filipe: „funktioniert nichts davon was machst du?" Zu Recht. Ich habe an einem Abend fuenf Dinge repariert, jedes einzeln nachgewiesen -- und bei ihm klingelte trotzdem nichts. Der Grund ist jedes Mal derselbe gewesen: Ich kann von hier aus messen, was der SERVER tut, aber nicht, was in SEINEM Browser ankommt. Und genau dort lag es. Gemessen habe ich gerade wieder: Der Server liefert die richtige Datei aus (32616 Bytes, Klingelton enthalten), sobald sie mit Stempel angefordert wird. Ohne Stempel kommt eine sieben Stunden alte Fassung aus dem Zwischenspeicher. WELCHE von beiden sein Browser anfordert, sehe ich nicht -- und das ist die Frage, an der alles haengt. /workspace/anruf-probe.html dreht das um. Sie laeuft in SEINEM Browser und beantwortet der Reihe nach: 1. Ist die neue Fassung ueberhaupt geladen? Sie holt anruf.js und sieht nach, ob Klingelton und Nachklingeln darin stehen. Fehlen sie, kommt die Seite aus dem Zwischenspeicher -- und JEDE Reparatur ist unsichtbar, egal wie oft man neu laedt. 2. Darf der Browser Ton abspielen? (Er erlaubt ihn erst nach der ersten Beruehrung -- wer ueber eine Benachrichtigung hereinkommt, hoert sonst nichts und haelt das Telefon fuer kaputt.) 3. Sind Benachrichtigungen erlaubt UND ist ein Geraet beim Server angemeldet? Das sind zwei verschiedene Dinge, und die Luecke dazwischen sieht man sonst nirgends. 4. Steht die Verbindung, ueber die das Klingeln kommt? Dazu ein Knopf, der genau den Klingelton abspielt, den ein Anruf macht. Wer ihn hoert, weiss, dass es an der Seite nicht liegt. Am Ende steht EIN Satz: das Wichtigste zuerst, mit dem, was zu tun ist. Keine Liste zum Selbstdeuten. Sie ruft niemanden an und zeigt nichts ueber andere. Co-Authored-By: Claude Opus 5 --- server/rechte.js | 6 + workspace/anruf-probe.html | 63 ++++++++ workspace/app.webmanifest | 8 +- workspace/assets/js/anruf-probe.js | 240 +++++++++++++++++++++++++++++ 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 ++-- 36 files changed, 711 insertions(+), 402 deletions(-) create mode 100644 workspace/anruf-probe.html create mode 100644 workspace/assets/js/anruf-probe.js diff --git a/server/rechte.js b/server/rechte.js index 8d8a2bd4..d7230d2b 100644 --- a/server/rechte.js +++ b/server/rechte.js @@ -280,6 +280,12 @@ export const SEITEN = { haben mit dem Treff nichts zu tun, und die Seite nennt Fristen, Stufen und die Bedingungen des Ausschlusses. */ "/workspace/treff-regeln.html": ["gast", "modi", "hand", "admin"], + /* DIE ANRUF-PROBE (19.09.2026). Sie sagt einem Menschen in seinem + eigenen Browser, warum es nicht klingelt -- die Frage, die sich + von aussen nicht beantworten laesst. Sie ruft niemanden an und + zeigt nichts ueber andere; deshalb steht sie allen offen, die + ueberhaupt telefonieren koennen. */ + "/workspace/anruf-probe.html": ["admin", "hand", "modi"], /* DIE ANFRAGE FUER MODI (17.09.2026). diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html new file mode 100644 index 00000000..9bcfb3aa --- /dev/null +++ b/workspace/anruf-probe.html @@ -0,0 +1,63 @@ + + + + + +Anruf-Probe · Team Dogi + + + + + + + +
+ ‹ Zum Chat +
Anruf-Probe
+
+
+ +
+

Warum klingelt es nicht?

+

+ Diese Seite geht der Reihe nach durch, was ein Anruf braucht – und sagt, + an welcher Stelle es hakt. Sie ruft niemanden an. +

+ +
+ + + +

+
+ + + + diff --git a/workspace/app.webmanifest b/workspace/app.webmanifest index 19706be4..e1cedd1a 100644 --- a/workspace/app.webmanifest +++ b/workspace/app.webmanifest @@ -22,25 +22,25 @@ }, "icons": [ { - "src": "/assets/img/app-symbole/workspace-192.png?v=202609182358", + "src": "/assets/img/app-symbole/workspace-192.png?v=202609190013", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-512.png?v=202609182358", + "src": "/assets/img/app-symbole/workspace-512.png?v=202609190013", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609182358", + "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609190013", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609182358", + "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609190013", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/assets/js/anruf-probe.js b/workspace/assets/js/anruf-probe.js new file mode 100644 index 00000000..e093d320 --- /dev/null +++ b/workspace/assets/js/anruf-probe.js @@ -0,0 +1,240 @@ +/* ===================================================================== + DIE ANRUF-PROBE (19.09.2026) + + Filipe, nach einem langen Abend: „funktioniert nichts davon was + machst du?" + + Zu Recht. Ich habe an diesem Abend fünf Dinge repariert, jedes + einzeln nachgewiesen -- und trotzdem klingelte bei ihm nichts. Der + Grund ist immer derselbe: Ich kann von hier aus messen, was der + SERVER tut, aber nicht, was in seinem Browser ankommt. Und genau + dort lag es jedes Mal. + + Diese Seite dreht das um. Sie läuft in SEINEM Browser und beantwortet + der Reihe nach die Fragen, die ich ihm sonst stellen müsste: + + 1. Ist die neue Fassung überhaupt geladen? (Der häufigste Fall: + eine alte Seite aus dem Zwischenspeicher, die alte Dateien + nachlädt. Dann ist jede Reparatur unsichtbar.) + 2. Darf der Browser überhaupt Ton abspielen? + 3. Sind Benachrichtigungen erlaubt -- und ist ein Gerät angemeldet? + 4. Steht die Verbindung zum Server, über die das Klingeln kommt? + + Sie ruft niemanden an. Man kann sie so oft aufmachen, wie man will. + ===================================================================== */ +(() => { + const $ = (id) => document.getElementById(id); + const ziel = $('ergebnis'); + if (!ziel) return; + + const punkte = []; + function punkt(stand, titel, satz) { + punkte.push({ stand, titel, satz }); + const k = document.createElement('div'); + k.className = 'punkt'; + k.dataset.stand = stand; + const z = document.createElement('span'); + z.className = 'punkt__zeichen'; + z.textContent = stand === 'gut' ? '✓' : stand === 'warn' ? '!' : '✗'; + const t = document.createElement('div'); + t.className = 'punkt__text'; + const h = document.createElement('p'); + h.className = 'punkt__titel'; + h.textContent = titel; + const s = document.createElement('p'); + s.className = 'punkt__satz'; + s.textContent = satz; + t.append(h, s); + k.append(z, t); + ziel.append(k); + } + + /* ---- 1. WELCHE FASSUNG IST GELADEN? ----------------------------- + + Der wichtigste Punkt, und der am häufigsten übersehene. Die + Anruf-Datei trägt einen Stempel im Namen (anruf.js?v=…). Steht in + der geladenen Seite ein alter Stempel, kommt aus dem + Zwischenspeicher eine alte Datei -- und jede Reparatur am Server + ist unsichtbar, egal wie oft man neu lädt. */ + async function fassungPruefen() { + const skript = [...document.querySelectorAll('script[src]')] + .map((s) => s.getAttribute('src')) + .find((s) => /anruf-probe\.js/.test(s || '')); + const stempel = (skript || '').split('v=')[1] || '(keiner)'; + + try { + const a = await fetch(`assets/js/anruf.js?v=${stempel}`, { cache: 'no-store' }); + const text = await a.text(); + const hatTon = text.includes('klingelTon'); + const hatOffen = text.includes('anruf/offen'); + if (hatTon && hatOffen) { + punkt('gut', 'Die neue Fassung ist geladen', + `Klingelton und Nachklingeln sind da (Stand ${stempel}).`); + } else { + punkt('schlecht', 'Es läuft eine ALTE Fassung', + `Der Klingelton fehlt${hatOffen ? '' : ', das Nachklingeln auch'}. ` + + 'Die Seite kommt aus dem Zwischenspeicher. ' + + 'Hilft: die Seite ganz schließen (in der App aus dem Wechsler wischen) und neu öffnen.'); + } + } catch { + punkt('warn', 'Fassung nicht prüfbar', + 'Die Datei ließ sich nicht laden – bist du gerade offline?'); + } + } + + /* ---- 2. DARF DER BROWSER TON ABSPIELEN? ------------------------- + + Browser erlauben Ton erst, wenn jemand auf der Seite etwas + angeklickt hat. Wer über eine Benachrichtigung hereinkommt und + nichts berührt, hört deshalb unter Umständen nichts -- und hält + das Telefon für kaputt. */ + function tonPruefen() { + const K = window.AudioContext || window.webkitAudioContext; + if (!K) { + punkt('schlecht', 'Dieser Browser kann keinen Ton erzeugen', + 'Sehr selten. Ein anderer Browser hilft.'); + return null; + } + const raum = new K(); + if (raum.state === 'running') { + punkt('gut', 'Ton ist erlaubt', 'Der Klingelton kann abgespielt werden.'); + } else { + punkt('warn', 'Ton ist noch gesperrt', + 'Der Browser lässt Ton erst zu, nachdem man einmal etwas angetippt hat. ' + + 'Drück unten auf „Klingelton anhören" – danach ist er frei, ' + + 'solange die Seite offen bleibt.'); + } + return raum; + } + + /* ---- 3. BENACHRICHTIGUNGEN ---------------------------------------- */ + async function meldungPruefen() { + if (!('Notification' in window)) { + punkt('warn', 'Benachrichtigungen kennt dieser Browser nicht', + 'Anrufe klingeln dann nur, wenn die Seite offen ist.'); + return; + } + const erlaubt = Notification.permission; + if (erlaubt === 'granted') punkt('gut', 'Benachrichtigungen sind erlaubt', 'Gut.'); + else if (erlaubt === 'denied') { + punkt('schlecht', 'Benachrichtigungen sind blockiert', + 'Dann kommt kein Anruf an, solange die Seite zu ist. ' + + 'In den Browsereinstellungen für diese Seite wieder erlauben.'); + } else { + punkt('warn', 'Benachrichtigungen sind noch nicht erlaubt', + 'Im Chat oben auf die Glocke tippen und zustimmen.'); + } + + /* Ist auch wirklich ein Gerät beim Server angemeldet? Erlaubnis im + Browser und Anmeldung beim Server sind zwei verschiedene Dinge -- + genau diese Lücke sieht man sonst nirgends. */ + try { + const a = await fetch('/workspace/api/push/stand', { credentials: 'same-origin' }); + if (a.ok) { + const d = await a.json(); + /* `geraete` ist eine LISTE, keine Zahl -- nachgesehen in + workspace-push.js statt geraten. */ + const n = Array.isArray(d.geraete) ? d.geraete.length : 0; + if (n > 0) punkt('gut', 'Dieses Konto hat ein Gerät angemeldet', `${n} Gerät(e).`); + else { + punkt('schlecht', 'Kein Gerät beim Server angemeldet', + 'Der Browser darf zwar, aber es ist nichts hinterlegt. ' + + 'Im Chat auf die Glocke tippen und neu zustimmen.'); + } + /* UND DIE RUHEZEIT. Sie hat gestern Abend den ganzen Anruf + verschluckt; seit heute sind Anrufe ausgenommen. Wer das + hier liest, soll es sehen, statt es zu vermuten. */ + if (d.ruhe) { + const anrufArt = (d.arten || []).find((x) => x.schluessel === 'anruf'); + if (anrufArt && anrufArt.an === false) { + punkt('schlecht', 'Anrufe sind bei dir abgeschaltet', + 'In den Benachrichtigungen die Art „Jemand ruft an" wieder einschalten.'); + } else if (d.ruhe.jetzt) { + punkt('gut', `Es ist Ruhezeit (${d.ruhe.ab}–${d.ruhe.bis} Uhr)`, + 'Erinnerungen bleiben jetzt liegen – Anrufe kommen trotzdem durch.'); + } + } + } + } catch { /* die Route gibt es vielleicht nicht -- kein Grund zur Panik */ } + } + + /* ---- 4. KOMMT ETWAS VOM SERVER AN? ------------------------------- */ + async function serverPruefen() { + try { + const a = await fetch('/workspace/api/anruf/offen', { credentials: 'same-origin' }); + if (a.status === 401) { + punkt('schlecht', 'Du bist nicht angemeldet', + 'Dann kann auch nichts klingeln. Melde dich neu an.'); + return; + } + if (!a.ok) { + punkt('warn', 'Der Server antwortet ungewöhnlich', `Antwort ${a.status}.`); + return; + } + const d = await a.json(); + punkt('gut', 'Die Verbindung zum Server steht', + (d.anrufe?.length + ? `Gerade klingelt sogar etwas (${d.anrufe.length}).` + : 'Gerade klingelt nichts – das ist normal.')); + } catch { + punkt('schlecht', 'Keine Verbindung zum Server', + 'Kein Netz? Ohne sie kommt kein Anruf an.'); + } + } + + /* ---- Der Rat am Ende --------------------------------------------- */ + function ratGeben() { + const schlecht = punkte.filter((p) => p.stand === 'schlecht'); + const warn = punkte.filter((p) => p.stand === 'warn'); + const r = $('rat'); + if (!r) return; + if (schlecht.length) { + r.textContent = 'Das Wichtigste zuerst: ' + schlecht[0].titel + + '. ' + schlecht[0].satz; + } else if (warn.length) { + r.textContent = 'Fast alles steht. Offen ist: ' + warn[0].titel + + '. ' + warn[0].satz; + } else { + r.textContent = 'Alles, was von hier aus prüfbar ist, steht. ' + + 'Wenn es jetzt noch klemmt, liegt es an der Verbindung zwischen ' + + 'den beiden Geräten – dann hilft nur ein echter Anruf zu zweit.'; + } + } + + /* ---- Der Knopf: Ton wirklich hören -------------------------------- */ + let tonRaum = null; + $('ton-probe')?.addEventListener('click', () => { + try { + const K = window.AudioContext || window.webkitAudioContext; + tonRaum = tonRaum || new K(); + if (tonRaum.state === 'suspended') tonRaum.resume(); + const spiel = (hz, ab, lang) => { + const o = tonRaum.createOscillator(); + const v = tonRaum.createGain(); + o.type = 'sine'; o.frequency.value = hz; + const t = tonRaum.currentTime + ab; + v.gain.setValueAtTime(0, t); + v.gain.linearRampToValueAtTime(0.16, t + 0.03); + v.gain.linearRampToValueAtTime(0, t + lang); + o.connect(v).connect(tonRaum.destination); + o.start(t); o.stop(t + lang + 0.05); + }; + /* Genau der Klingelton aus dem Anruf -- damit man hört, was man + hören würde. */ + spiel(880, 0, 0.22); + spiel(660, 0.3, 0.26); + try { navigator.vibrate?.([250, 200, 250]); } catch { /* egal */ } + $('ton-probe').textContent = 'Nochmal anhören'; + } catch { + $('ton-probe').textContent = 'Ton ging nicht – siehe oben'; + } + }); + + (async () => { + await fassungPruefen(); + tonPruefen(); + await meldungPruefen(); + await serverPruefen(); + ratGeben(); + })(); +})(); diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 710efe72..e588a78c 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 b49d57c1..c7749f06 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 5f2ab9eb..61e00242 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 55c96ed5..f9de66d4 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. --> - - - - - - + + + + + + - - + + - + @@ -251,14 +251,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/workspace/bewerben.html b/workspace/bewerben.html index 89721cf0..40ffbebd 100644 --- a/workspace/bewerben.html +++ b/workspace/bewerben.html @@ -7,17 +7,17 @@ - - - - - - - - - + + + + + + + + + - + @@ -108,10 +108,10 @@ - - - - - + + + + + diff --git a/workspace/bewerbungen.html b/workspace/bewerbungen.html index 9da537f3..9a0f0493 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 889e6bc2..b4e75f7f 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 d70168ab..b65d4e88 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 77962c49..9282979f 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 9878b47a..14583cc1 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 5a3f6b3c..460c1558 100644 --- a/workspace/crew.webmanifest +++ b/workspace/crew.webmanifest @@ -22,25 +22,25 @@ }, "icons": [ { - "src": "/assets/img/app-symbole/crew-192.png?v=202609182358", + "src": "/assets/img/app-symbole/crew-192.png?v=202609190013", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-512.png?v=202609182358", + "src": "/assets/img/app-symbole/crew-512.png?v=202609190013", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609182358", + "src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609190013", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609182358", + "src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609190013", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/dateien.html b/workspace/dateien.html index accc68e8..41b91dee 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 713ce4e6..57dcf1ed 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 180bb126..bc7f15aa 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 4a18d0c7..85c834ec 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 eefe24b8..0a0a4425 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 e282cde9..5bf6ad6c 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 4b2229f7..fba99c81 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 95dbcc0c..708051b6 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 9d6ef9e9..8a9010e0 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 a684c9d4..0c936bed 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 a8e62324..b6c29b53 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. --> - - - - + + + + - - + + - + @@ -678,10 +678,10 @@

- - - - - + + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 3244b47c..70eb0c7f 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 ff1cd957..482b6a9c 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 d37f76a6..66696e38 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 2f3c81ee..73e4d1f5 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 f18ddd98..0bbafb58 100644 --- a/workspace/teamlage.html +++ b/workspace/teamlage.html @@ -7,20 +7,20 @@ - - - - - - - + + + + + + + - + - - - - + + + + diff --git a/workspace/teilen.html b/workspace/teilen.html index 5e25087d..9ab415e3 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 47876f91..f77249d9 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 a970d51a..71687067 100644 --- a/workspace/treff-regeln.html +++ b/workspace/treff-regeln.html @@ -7,18 +7,18 @@ - - - - - - - + + + + + + + - + @@ -221,10 +221,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 f237ae52..8e675066 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 faa249ee..4ae81dd5 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 @@ - - - - - + + + + +