diff --git a/CLAUDE.md b/CLAUDE.md
index b59e97f..6de7d99 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,54 +1,59 @@
# CLAUDE.md
-Zwei eigenstaendige Userscripts, die die phpBB-Seiten von `cs.rin.ru` fuer
-Safari auf iOS in eine mobile Ansicht umbauen. Kein Build, keine
-Abhaengigkeiten, kein `package.json` — die `.user.js`-Dateien sind das Produkt.
+Ein Userscript, das die phpBB-Seiten von `cs.rin.ru` fuer Safari auf iOS in eine
+mobile Ansicht umbaut. Kein Build, keine Abhaengigkeiten, kein `package.json` —
+die `.user.js`-Datei ist das Produkt.
| Datei | Greift auf | Zweck |
|---|---|---|
-| `rin-mobile.user.js` | `*://cs.rin.ru/forum/*` | Themenlisten als Karten |
-| `rin-thread.user.js` | `*://cs.rin.ru/forum/viewtopic.php*` | Thread als Beitragsstrom + Navigationsleiste |
-| `dev/*.dev.user.js` | zusaetzlich `localhost:*` | Loader, binden per `@require file:///` die echten Scripts ein |
+| `rin-mobile.user.js` | `*://cs.rin.ru/forum/*` | Beide Ansichten, Weiche nach Seitentyp |
+| `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 |
Das Fixture ist ueber `.gitignore` (`dev/*.php`) ausgeschlossen. Nach einem
frischen Klon ist es nicht da und muss nach der Anleitung in der README neu
gespeichert werden — die Seite verlangt einen Login.
-## Gemeinsames Muster beider Scripts
+## Aufbau
-Beide sind nach demselben Schema gebaut, Aenderungen am einen sind oft auch am
-anderen faellig:
+Ein IIFE, streng der Reihe nach:
-1. IIFE mit `'use strict'`, `DEBUG`-Flag und `log`-Array ganz oben
-2. Viewport-Meta setzen (idempotent ueber `[data-rm]`)
-3. Kompletter Style-Block als Template-Literal, **bedingungslos** injiziert
-4. `build()` liest das Original-DOM, baut ein neues `div.rm-root`
-5. Alle bisherigen `body`-Kinder bekommen `.rm-hidden`, dann wird `root`
- angehaengt
-6. `run()` haengt bei `DEBUG` das gruene Overlay oben an
+1. `DEBUG`-Flag und `log`-Array
+2. Weiche: `view` ist `'thread'`, `'liste'` 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. `buildList()` beziehungsweise `buildThread()` lesen das Original-DOM und
+ bauen ein `div.rm-root`
+6. `run()` waehlt die Ansicht und haengt bei `DEBUG` das gruene Overlay an
7. Start ueber `DOMContentLoaded`, falls `readyState === 'loading'`
+Auf Seiten ausserhalb der Weiche (`posting.php`, Profile, …) passiert nichts,
+insbesondere wird kein Stylesheet injiziert.
+
## Fallen, die nicht aus dem Code hervorgehen
-**Beide Stylesheets sind auf Threadseiten gleichzeitig aktiv.**
-`rin-mobile` matcht `*://cs.rin.ru/forum/*`, also auch `viewtopic.php`. Sein
-`build()` steigt dort zwar aus, der Style-Block wird aber vorher injiziert.
-Gleich benannte Klassen kollidieren mit identischer Spezifitaet, entschieden
-wird nach Ladereihenfolge der Userscripts — und die ist nicht garantiert.
+**Beide Ansichten teilen sich einen Klassennamensraum.** Das war der Grund fuer
+die Zusammenlegung: als getrennte Scripts matchte `rin-mobile` auch
+`viewtopic.php` und injizierte dort sein Stylesheet, obwohl es nichts baute.
+Gleich benannte Regeln kollidierten mit identischer Spezifitaet, und die
+Ladereihenfolge der Userscripts entschied ueber das Layout.
-- Nur bewusst geteilt: `.rm-root`, `.rm-hidden`, `.rm-dbg`
-- **Offene Kollision:** `.rm-root` hat in `rin-mobile` `padding:0 !important`,
- in `rin-thread` `padding:0 0 64px 0 !important`. Laedt `rin-mobile` spaeter,
- faellt die Freihaltung hinter der fixierten Leiste weg. Noch nicht behoben.
-- Neue Klassen im Thread-Script gegen `rin-mobile.user.js` gegenpruefen.
- `.rm-goto` und `.rm-grid` heissen genau deshalb so — `.rm-jump` und
- `.rm-pages` waren dort schon belegt.
+- Geteilt: `.rm-root`, `.rm-hidden`, `.rm-dbg`, die globale `img`-Regel
+- Unterschiede zwischen den Ansichten ueber einen Modifier am Root loesen,
+ nicht ueber zwei Regeln mit demselben Selektor. `.rm-root.rm-thread` haelt
+ so die 64px hinter der fixierten Leiste frei.
+- Namen sind ansichtsspezifisch zu halten: `.rm-jump`/`.rm-pages` gehoeren der
+ Liste, `.rm-goto`/`.rm-grid` dem Thread-Sheet.
+- `.rm-av` braucht `!important` auf Breite und Hoehe, sonst gewinnt die globale
+ `img { height:auto !important }`-Regel gegen die Avatarmasse.
-**Was nach `body` soll, muss nach der Ausblend-Schleife angehaengt werden.**
-Die Schleife markiert *alle* vorhandenen `body`-Kinder mit `.rm-hidden`. Das
-Sheet im Thread-Script wird deshalb erst beim ersten Antippen gebaut — das
-loest das Problem nebenbei mit.
+**Was nach `body` soll, muss nach `replaceBody()` angehaengt werden.**
+Die Funktion markiert *alle* vorhandenen `body`-Kinder mit `.rm-hidden`. Das
+Sheet wird deshalb erst beim ersten Antippen gebaut — das loest das Problem
+nebenbei mit.
**`Page X of Y` steht als `Page 1 of 1114`
im Markup.** Ein Grep im Roh-HTML nach `Page 1 of` findet nichts, die Regex auf
@@ -65,9 +70,9 @@ Original-Zurueck/Weiter-Links, das Sheet verschwindet.
einer verschachtelten Tabelle, `closest('tr')` trifft die innere Zeile ohne
Autor- und Profilspalte.
-**`DEBUG` steht in beiden Dateien auf `true`** und muss vor dem Ausliefern in
-beiden auf `false`. Die Versionsnummer steht ebenfalls doppelt: im
-`@version`-Header und im Text des Debug-Overlays.
+**`DEBUG` steht auf `true`** und muss vor dem Ausliefern auf `false`. Die
+Versionsnummer steht doppelt: im `@version`-Header und im Text des
+Debug-Overlays.
## Testen
@@ -92,6 +97,11 @@ Sinnvolle Faelle: erste Seite, zweite Seite, Mitte, letzte Seite, dazu die
Degradation ohne `per_page` und ein Thread ohne Paginierung. Fixture-Eckdaten:
`f=10&t=68689`, `per_page = 15`, 1114 Seiten, letzte Seite `start=16695`.
+Fuer die Weiche und die Listenansicht genuegt eine handgeschriebene Tabelle mit
+`a.topictitle`-Zeilen. Zu pruefen ist dabei auch eine Seite ausserhalb der
+Weiche wie `posting.php`: dort darf weder eine Ansicht gebaut noch ein
+`