Community: Starthilfe beim Schreiben -- und vier Funde aus den Bildern

Filipe: "perfektioniere jede einzelne kategorie der community ... ich
will auch dass du fertige und beispiele machst fuer die community
damit die auch start hilfe haben ueberall."

STARTHILFE: Wer zum ersten Mal schreibt, steht vor einem leeren Feld
-- der haeufigste Grund, warum ein Brett still bleibt, obwohl viele
mitlesen. Im Formular stehen jetzt Beispiele: ein Klick fuellt Art,
Ueberschrift und Text. Auf treff, wunsch, highlight und mitmachen --
nicht auf anschlag, ansteht, regeln, denn dort schreibt die Community
nicht, und ein Angebot fuer eine verschlossene Tuer ist keins.

JEDE VORLAGE HAT LUECKEN. Eine, die man absenden KANN, wird
abgesendet; dann steht dort zehnmal derselbe Satz, und der elfte
Mensch merkt, dass hier niemand wirklich schreibt. Die Pruefung misst
das: keine Vorlage ohne "…".

NICHT ZU VERWECHSELN MIT DEM STARTKATALOG. Der ist fuers Team (fertige
Beitraege zum Uebernehmen), das hier fuer die Mitglieder.

--- Vier Funde, drei davon nur aus dem Bild -------------------------

1. ZWEI KNOPFREIHEN MIT DENSELBEN WOERTERN. Auf "Regeln & Hilfe"
   standen "Regel · Haeufige Frage · Hilfe · Was passiert, wenn"
   zweimal untereinander -- die eine filterte, die andere sprang zur
   Ueberschrift, und beide sahen gleich aus. Wo nach Art gegliedert
   wird, entfaellt jetzt der Filter; die Sprungmarken sind Links
   geworden, mit "Springe zu" davor und der Anzahl dahinter.

2. "MELDEN" UNTER JEDER REGEL. Siebzehn Melden-Knoepfe unter Texten
   des Teams -- man meldet keine Regel. Steht jetzt nur noch an
   Beitraegen von Mitgliedern. Die Gegenprobe im Messwerkzeug legt
   dafuer eigens einen Beitrag eines zweiten Mitglieds an: Ohne ihn
   saehe ein abgeschaffter Meldeweg genauso aus wie ein
   funktionierender.

3. DER HINWEIS LAG AUF DER NAECHSTEN BESCHRIFTUNG. Auf 412 px stand
   "Gehoert allen hier - wer Der Treff sieht ..." quer ueber
   "UEBERSCHRIFT". Der Hinweis haengt absolut unter dem Feld, und
   darunter sind 30 px Luft -- genug fuer EINE Zeile. Unter 560 px
   steht ohnehin nur ein Feld je Zeile; dort gibt es nichts
   auszurichten, und er darf einfach im Fluss stehen.

4. UND MEIN EIGENER FEHLER, der alles unsichtbar machte: `vorlagen`
   gab es hier schon -- als Checkliste fuer Creator, mit demselben
   Behaelter `#vorlagen`. Die spaetere Funktionsdeklaration gewinnt,
   zwei Elemente trugen dieselbe Kennung, und die Starthilfe erschien
   NIE. Keine Fehlermeldung, keine rote Pruefung, nichts in der
   Konsole. Gefunden nur durch einen Blick auf das Bild.
   Deshalb prueft pruef-vorlagen jetzt im Browser mit, dass keine
   Kennung doppelt vorkommt -- derselbe Fehler wie am 17.09. mit
   `.teilen`, und beim naechsten Mal soll ihn nicht der Zufall finden.

Nebenbei messbar: "Regeln & Hilfe" ist von 4569 auf 3623 px
geschrumpft, die Karten sind 54 px niedriger.

Geprueft: pruef-vorlagen (neu, 24), pruef-video unveraendert 67.
Gegenproben: unbekannte Art -> rot; Vorlage ohne Luecke -> rot.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-18 19:00:43 +02:00
co-authored by Claude Opus 5
parent d4e05e460a
commit 11c4a795e2
40 changed files with 1077 additions and 574 deletions
+124 -7
View File
@@ -106,6 +106,16 @@
im Browser kann man aendern. */
let treffBrett = false;
let lage = null;
/* WELCHE BRETTER NACH ART GEGLIEDERT WERDEN.
Stand frueher mitten in der Zeichenfunktion -- dort konnte
`filterBauen` sie nicht sehen, und deshalb baute die Filterreihe
auf genau diesen Brettern eine ZWEITE Leiste mit denselben
Woertern wie die Sprungmarken darunter. */
const NACH_ART = {
regeln: ['regel', 'folge', 'hilfe', 'frage'],
mitmachen: ['gesucht', 'lust', 'frage'],
};
let filter = '';
/* WELCHER KANAL -- eine ZWEITE Dimension neben `filter`, nicht
derselbe Wert.
@@ -672,7 +682,22 @@
den eigenen kann man loeschen, das ist der kuerzere Weg.
Der Grund ist Pflicht (DSA Art. 16); der Server prueft ihn
noch einmal, die Abfrage hier erspart nur den Fehlschlag. */
if (!lage.team && e.erstellt_von !== ich.id) {
/* NICHT AN BEITRAEGEN DES TEAMS (18.09.2026).
Unter jeder Regel stand „melden" -- auch unter „Achtzehn plus
bleibt draussen". Man meldet keine Regel: Sie ist der Text des
Teams selbst, und ein Knopf darunter legt nahe, das Team
moderiere sich gegenseitig. Auf „Regeln & Hilfe" standen so
siebzehn Melden-Knoepfe, von denen keiner einen Sinn hatte.
Wer mit dem Team reden will, findet den Weg unter „Hilfe" --
dort steht, wie man DogFather und die Moderation erreicht.
IM ZWEIFEL BLEIBT DER KNOPF: Fehlt die Rollenangabe (alte
Eintraege), gilt der Beitrag nicht als Team-Beitrag. Lieber
ein Knopf zu viel als ein fehlender Meldeweg. */
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.');
@@ -1089,9 +1114,95 @@
return stueck;
}
/* ---- STARTHILFE BEIM SCHREIBEN (18.09.2026) ---------------------
Filipe: „ich will auch dass du fertige und beispiele machst fuer
die community damit die auch start hilfe haben ueberall."
Wer zum ersten Mal schreibt, steht vor einem leeren Feld. Die
Vorlagen geben einen Anfang -- mit LUECKEN, die nur der
Schreibende fuellen kann. Eine Vorlage, die man absenden KANN,
wird abgesendet; dann steht dort zehnmal derselbe Satz.
SIE VERSCHWINDEN, SOBALD JEMAND TIPPT. Hilfe, die stehen bleibt,
wenn man sie nicht mehr braucht, ist keine Hilfe mehr, sondern
etwas, das man wegklickt -- und beim naechsten Mal gleich
ignoriert. */
/* HEISST `starthilfe` UND NICHT `vorlagen`.
`vorlagenZeigen` und `#vorlagen` gab es hier schon: die Checkliste
fuer Creator auf live/community/technik. Meine gleichnamige
Funktion wurde davon ueberschrieben -- die spaetere Deklaration
gewinnt --, und im HTML standen zwei Elemente mit derselben
Kennung. Die Starthilfe erschien deshalb NIE, ohne eine einzige
Fehlermeldung. Aufgefallen ist es nur, weil ich nachgesehen habe,
ob die Knoepfe wirklich dastehen. */
let starthilfeGeholt = '';
async function starthilfeZeigen() {
const kasten = $('starthilfe');
const reihe = $('starthilfe-reihe');
if (!kasten || !reihe) return;
if (starthilfeGeholt === bereich) return;
starthilfeGeholt = bereich;
reihe.textContent = '';
kasten.hidden = true;
let liste = [];
try {
const a = await hole(`/workspace/api/bereich/${bereich}/vorlagen`);
if (!a.ok) return;
liste = (await a.json())?.vorlagen || [];
} catch { return; }
if (!liste.length) return;
for (const v of liste) {
const b = el('button', 'starthilfe__beispiel', einstellung?.arten?.[v.art] || v.art);
b.type = 'button';
/* Der volle Text als Titel-Attribut: Wer wissen will, was ihn
erwartet, muss nicht erst klicken. */
b.title = `${v.titel}\n\n${v.text}`;
b.addEventListener('click', () => {
const art = $('f-art');
if (art && [...art.options].some((o) => o.value === v.art)) {
art.value = v.art;
art.dispatchEvent(new Event('change'));
}
$('f-titel').value = v.titel;
$('f-text').value = v.text;
kasten.hidden = true;
/* Der Fokus wandert in die Ueberschrift und markiert sie: Der
erste Handgriff ist, den Platzhalter zu ersetzen. */
$('f-titel').focus();
$('f-titel').select();
});
reihe.append(b);
}
kasten.hidden = false;
/* Sobald jemand selbst schreibt, sind die Beispiele erledigt. */
for (const id of ['f-titel', 'f-text']) {
$(id)?.addEventListener('input', () => { kasten.hidden = true; }, { once: true });
}
}
function filterBauen(eintraege = []) {
const ziel = $('filter');
ziel.textContent = '';
/* ---- EIN NACHSCHLAGEWERK BRAUCHT KEINEN FILTER (18.09.2026) ----
Auf „Regeln & Hilfe" standen zwei Knopfreihen direkt
untereinander -- „Regel · Häufige Frage · Hilfe · Was passiert,
wenn" und darunter dieselben vier Wörter noch einmal. Die eine
filterte, die andere sprang zur Überschrift. Von außen sahen sie
gleich aus, und niemand konnte erraten, was der Unterschied ist.
Dort, wo nach Art gegliedert wird, ist der Filter der
überflüssige von beiden: Die Gliederung zeigt ohnehin schon
alles, sortiert und mit Überschriften. Die Sprungmarken bleiben
-- sie sind das Inhaltsverzeichnis. */
if (NACH_ART[bereich]) { filter = ''; return; }
const knopf = (wert, text) => {
const b = el('button', 'schritt', text);
b.type = 'button';
@@ -1436,10 +1547,6 @@
"Mitmachen" ist ein WEG: erst die drei Schritte, dann die
Gebiete, dann die Fragen. Eine Liste beantwortet "was gibt
es"; die Frage lautet aber "was tue ich als Erstes". */
const NACH_ART = {
regeln: ['regel', 'folge', 'hilfe', 'frage'],
mitmachen: ['gesucht', 'lust', 'frage'],
};
if (NACH_ART[bereich] && !filter) {
const reihe = NACH_ART[bereich];
const faecher = new Map(reihe.map((a) => [a, []]));
@@ -1451,13 +1558,22 @@
einem Dokument und einer langen Seite. */
const marken = el('nav', 'brettmarken');
marken.setAttribute('aria-label', 'Zu einem Abschnitt springen');
/* „Springe zu" davor: Ohne diese zwei Wörter sieht eine Reihe
von Wörtern aus wie eine Reihe von Filtern -- genau die
Verwechslung, die hier behoben wird. Mit ihnen ist es ein
Inhaltsverzeichnis, und das ist es auch. */
marken.append(el('span', 'brettmarken__wort', 'Springe zu'));
for (const a of faecher.keys()) {
if (!faecher.get(a).length) continue;
const anzahl = faecher.get(a).length;
if (!anzahl) continue;
const m = el('a', 'brettmarken__weg', einstellung?.arten?.[a] || a);
/* Die Anzahl gehört dazu: Sie sagt, ob sich der Sprung lohnt
-- und sie verrät, dass hier nicht gefiltert wird. */
m.append(el('span', 'brettmarken__zahl', String(anzahl)));
m.href = `#abschnitt-${a}`;
marken.append(m);
}
if (marken.childNodes.length > 1) ziel.append(marken);
if (marken.childNodes.length > 2) ziel.append(marken);
for (const a of faecher.keys()) {
const fach = faecher.get(a);
@@ -1662,6 +1778,7 @@
ist. */
if (!darfEintragen()) { $('neu').hidden = true; $('neu-oeffnen').hidden = true; return; }
$('neu').hidden = !auf; $('neu-oeffnen').hidden = auf;
if (auf) starthilfeZeigen();
if (auf) $('f-titel').focus();
};
$('neu-oeffnen').addEventListener('click', () => {