`-Fragment aus. Im Browser gemessen:
```
stylesheets: 0 hasTurboFrame: true
styleTags: 1 firstChild: TURBO-FRAME
lang: "" title: ""
```
Ergebnis ist unformatiertes HTML — Systemschrift, native Buttons, alle Zustände gleichzeitig sichtbar
(z. B. „Senden Wird gesendet… zum Abbrechen klicken" als ein Textblock). Über den Button „Schreiben"
im Frame-Kontext ist die Ansicht dagegen korrekt.
**Trifft echte Nutzer bei:** Bookmark auf die URL, Öffnen in neuem Tab, Rücksprung nach Session-Ablauf,
Turbo-Fallback ohne JS.
**Fix:** Non-Frame-Requests auf `/compose/new` in das Basis-Layout rendern (bzw. auf `/mail/inbox` mit
geöffnetem Compose-Dock umleiten).
### 2. 404-Seite ist englisch und ignoriert die Theme-Einstellung
**Route:** beliebige unbekannte URL, z. B. `/gibtesnicht-404-test`
```
lang: "en" data-theme: "paper"
title: "Page not found — Mail"
```
Drei Abweichungen auf einer Seite:
- **Sprache:** „Nothing at this address", „The page you asked for is not here…", „Back to your mail" —
die restliche Oberfläche ist durchgängig deutsch.
- **Theme:** beige/braun (Theme „Papier") statt des eingestellten Themes „Hell" und der Marken-Akzentfarbe.
- **Logo:** generisches Umschlag-Icon + „Mail" statt des „PL"-Logos aus dem Header.
**Fix:** Fehler-Templates ins normale Layout hängen, Locale und Theme aus der Session ziehen.
### 3. Einstellungen → Integrationen bleibt ~16 Sekunden auf „Wird geladen…"
**Route:** `/settings?section=integrations`
Der Lazy-Frame `settings-integrations-frame` (`src=/settings/integrations/list`) startet seinen Request
erst weit nach dem Seitenaufbau. Performance-API der Seite:
```
Navigation: TTFB 155 ms · DOMContentLoaded 1311 ms · load 1317 ms
/settings/integrations/list: start 16426 ms · Dauer 92 ms
(zweiter Aufruf) start 29684 ms · Dauer 94 ms
```
Der Request selbst ist mit 92 ms schnell — er wird nur ~16 s zu spät ausgelöst. Der Frame liegt oberhalb
des Falzes, `loading="lazy"` ist hier also falsch bzw. der Intersection-Trigger greift nicht.
Inhalt danach: „Noch keine Dienste verbunden" + 6 gesperrte Dienste — nichts, was 16 s rechtfertigt.
Derselbe Effekt ist unter `/admin` („System"-Panel) zu sehen.
**Fix:** `loading="eager"` für sichtbare Frames, oder den Trigger reparieren.
### 4. Papierkorb listet jede Nachricht dreifach
**Route:** `/mail/trash` — 195 Einträge
Jede Test-Mail erscheint exakt dreimal, mit identischem Absender, identischem Betreff-Hash und identischem
Zeitstempel:
```
brandhub@fuchs.com ced5f3faa7e983962553a6e3503db393 6. Aug. ×3
noreply@markenportal-uk-koeln.de 41c4722fc2b407f44cf13f297769d838 3. Aug. ×3
Medios AG Hub a13495206df754b65ca929bbde528638 1. Aug. ×3
noreply@brandportal.brita.net 420291e93f77267c55c052f1a370d4fd 1. Aug. ×3
brandhub@avm.de 9fd6d83d6f48243b7988ded8459011d0 1. Aug. ×3
… (durchgängig über alle 50 Einträge der ersten Seite)
```
Drei Kopien = drei Konten (sven@ / uptime@ / pmd@). Im **Posteingang** wird derselbe Fall korrekt zu einer
Zeile gruppiert — im Papierkorb greift die Thread-Gruppierung nicht. Dadurch sind die 195 Einträge
faktisch ~65 Nachrichten.
**Fix:** dieselbe Thread-/Message-ID-Gruppierung wie in `/mail/inbox` auch für Trash (und vermutlich Spam) anwenden.
### 5. Listen-Vorschau zeigt „Email is only available as html"
**Route:** `/mail/inbox` — betrifft aktuell die Mehrzahl der Zeilen
Zwei Probleme in einem String:
1. **Englisch** in einer deutschen Oberfläche.
2. **Sachlich falsch.** Öffnet man dieselbe Nachricht (z. B. Thread 217, `brandhub@fuchs.com`), zeigt die
Detailansicht sauber lesbaren Text („Testmail for "https://brand.fuchs.com", sent at …" plus
Fußzeile). Der Text ist also da — nur der Snippet-Generator kommt an ihn nicht heran.
**Fix:** Vorschau aus dem HTML-Part erzeugen (Tags strippen, Entities dekodieren); den Fallback-String
übersetzen und neutraler formulieren („Keine Vorschau verfügbar").
---
## Mittel
### 6. Roher HTML-Code in der Vorschau
**Route:** `/mail/spam`
```
Follow-up: wsc-haibach.de in eine App verwandeln?
Hallo, ich möchte mich kurz noch einmal melden und würde mich freuen
```
Das Style-Attribut wird als sichtbarer Text ausgegeben. Gegenstück zu Befund 5: mal wird HTML gar nicht
verarbeitet, mal ungefiltert durchgereicht.
### 7. „Gesendet" zeigt den Absender statt des Empfängers
**Route:** `/mail/sent`
```
S Sven Another one Beispiel 10:17
S Sven Test Foobat 10:16
```
In einem Gesendet-Ordner ist „Sven" (= man selbst) die einzige Information, die niemand braucht.
Üblich und erwartbar ist der Empfänger, meist mit Präfix „An: …".
### 8. Sie und Du gemischt
Die Oberfläche duzt durchgängig — „**Dein** Profil", „Wie sich das Verfassen-Fenster für **dich** verhält",
„Schreibe **deine** Nachricht…", „Was plMail aus **deinen** Mails herausliest".
**Ausnahme: Einstellungen → Aliase.** Dort wird gesiezt:
- „Was jede **Ihrer** Adressen beim Senden und Empfangen standardmäßig tut."
- „Wenn ein Absender benachrichtigt werden möchte, sobald **Sie** seine Nachricht gelesen haben."
### 10. Buttons und Zeilen brechen aus den Karten aus
Drei Stellen, gleiches Muster — ein Element ignoriert das Padding seiner Karte:
| Route | Element | Beobachtung |
|---|---|---|
| `?section=signature` | Button „Signatur speichern" | steht **auf** dem rechten Kartenrand, überlappt die Rahmenlinie |
| `?section=general` | Zeile „Zitierter Text beim Weiterleiten" | Text beginnt links **außerhalb** des Karten-Paddings, der Toggle ragt rechts über die Karte hinaus |
| Compose-Dock | Papierkorb-Icon | fällt in eine eigene zweite Zeile links unten statt neben „Senden" zu stehen |
### 11. Barrierefreiheit: Dokumentstruktur
Im DOM des Posteingangs gemessen:
```
Überschriften: ["H2: \"\""] ← einzige Überschrift, und die ist leer
: nicht vorhanden