diff --git a/CLAUDE.md b/CLAUDE.md index 746dcc2..8461ee7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,6 +10,7 @@ die `.user.js`-Datei ist das Produkt. | `dev/rin-mobile.dev.user.js` | zusaetzlich `localhost:*` | Loader, bindet per `@require file:///` das echte Script ein | | `dev/viewtopic.php` | — | Fixture: gespeicherter Thread, 1114 Seiten | | `dev/viewforum.php` | — | Fixture: Main Forum, 610 Seiten, mit Unterforen, Ankuendigungen und Stickies | +| `dev/ucp.php` | — | Fixture: Login-Formular (`mode=login`), nur ausgeloggter Zustand | Die Fixtures sind ueber `.gitignore` (`dev/*.php`) ausgeschlossen. Nach einem frischen Klon sind sie nicht da und muessen nach der Anleitung in der README neu @@ -20,17 +21,18 @@ gespeichert werden — die Seite verlangt einen Login. Ein IIFE, streng der Reihe nach: 1. `DEBUG`-Flag und `log`-Array -2. Weiche: `view` ist `'thread'`, `'liste'` oder `''` — abgeleitet aus - `location.pathname + location.search` +2. Weiche: `view` ist `'thread'`, `'liste'`, `'login'` oder `''` — abgeleitet + aus `location.pathname + location.search` 3. Nur bei gesetztem `view`: Viewport-Meta (idempotent ueber `[data-rm]`) und der komplette Style-Block als Template-Literal 4. `replaceBody(root)` blendet alle bisherigen `body`-Kinder aus und haengt die neue Ansicht an -5. `pageState()`, `pageSheet()` und `pageNav()` — die Paginierung, von beiden - Ansichten benutzt -6. `buildList()` beziehungsweise `buildThread()` lesen das Original-DOM und - bauen ein `div.rm-root`; beide haengen zum Schluss ueber `addCrumbs()` die - fixierte Brotkrumenleiste an +5. `pageState()`, `pageSheet()` und `pageNav()` — die Paginierung, von Liste + und Thread benutzt, nicht vom Login +6. `buildList()`, `buildThread()` beziehungsweise `buildLogin()` lesen das + Original-DOM und bauen ein `div.rm-root`; alle drei haengen zum Schluss + ueber `addCrumbs()` die fixierte Brotkrumenleiste an, die zugleich ueber + `loginState()` die Login/Logout-Pille traegt 7. `run()` waehlt die Ansicht und haengt bei `DEBUG` das gruene Overlay an 8. Start ueber `DOMContentLoaded`, falls `readyState === 'loading'` @@ -113,6 +115,37 @@ klammert das `overflow` dagegen nicht, weil der Root keinen Containing Block aufspannt. Die Freihaltung oben haengt an `body.rm-crumbed`, damit ohne Brotkrumen im Markup kein leerer Streifen bleibt. +**Die Login-Erkennung ist ungetestet gegen eine echte Sitzung.** `loginState()` +unterscheidet `a[href*="mode=login"]` von `a[href*="mode=logout"]` im +Menuebalken und liest den Namen aus dem vermuteten Muster `Logout [ Name ]` im +Linktext. Dem Repository liegt keine eingeloggte Fixture vor — passt das +Namensmuster nicht, bleibt die Pille bei „Logout" ohne Namen stehen, statt eine +Ausnahme zu werfen. Vor einer Aenderung an `loginState()` erst mit einer echten +Sitzung pruefen, wie die Zeile tatsaechlich aussieht. + +**Ist eine Seite nicht laenger als der Viewport, kann Safari nicht wegscrollen, +um seine eigene Werkzeugleiste unten freizugeben.** Bei Liste und Thread faellt +das nicht auf, weil Karten beziehungsweise Beitraege fast immer laenger sind +als der Bildschirm. Der Login hat kein `.rm-nav`, das sonst Platz reserviert, +und war als kurze Formularseite der erste Fall, bei dem die Seite genau so +hoch wie der Viewport enden konnte — die teilweise eingefahrene Leiste blieb +dann stehen und verdeckte den Submit-Button, ohne dass noch etwas zu scrollen +war, um sie wegzuschieben. `env(safe-area-inset-bottom)` allein loest das +nicht, das federt nur den Home-Indicator ab. Der Bodensatz unter dem Formular +in `.rm-login form` ist deshalb absichtlich groesser als noetig: er erzwingt +Scrollhoehe ueber den Viewport hinaus. + +**`buildLogin()` baut das Formular nicht nach, sondern verschiebt es.** Wie der +Beitragstext im Thread (`bodyWrap.appendChild(pb)`) wandert das +Original-`