presseportale/dev/archive/frontend-audits/frontend-optimize-protokoll.md
Kevin Adametz 6a4c4d8837 docs: dev-Doku für den Live-Betrieb neu sortiert — Archiv + Betrieb + Roadmap
Das System ist seit 20.07.2026 live; die dev-Doku spiegelt jetzt den
Betriebszustand statt der Release-Vorbereitung:

- dev/betrieb/: Deploy-Runbook (neu: §10 Betrieb nach Go-Live mit
  SFTP-Deploy-Checkliste inkl. queue:restart-Pflicht und den
  Betriebs-Erkenntnissen der Go-Live-Woche), Legacy-API-Parität, Umami.
- dev/roadmap.md: offene Nachlauf-Punkte (Go-Live-Mails, Merge nach main,
  Stripe-Test-Artefakte, Key-Rotation, Alt-System-Abschaltung) und
  Ideen-Backlog.
- dev/archive/: abgeschlossene Phasen — Migration-2026-Planung,
  Cutover-Runbook (mit Erledigt-Vermerk), Release-Plan/QA-Checkliste,
  Optimierungsphasen, Frontend-Konzepte + Responsive-Audits vom 16.07.,
  Altsystem-Reste.
- dev/README.md als Wegweiser; gitignore-Pfad der SQL-Dumps mitgezogen
  (dev/archive/migration-2026/sql/ bleibt untracked, ebenso dev/migration/
  und dev/api/).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 07:52:38 +00:00

240 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Protokoll & Bestandsaufnahme: Frontend Responsive / Mobile (Re-Audit)
> **Erstellt:** 16.07.2026 (dritte Session)
> **Status:** Audit + **P1-Fixes umgesetzt** (16.07.2026)
> **Viewports:** 320×568 (iPhone SE) und 390×844 (iPhone 14/15), `mobile: true`
> **Scope:** Öffentliches Web-Frontend (presseecho, businessportal24, pressekonto-Hub)
> **Nicht im Scope:** Admin/Portal (Flux), Auth, Customer-Bereich
> **Grundlage:** Code-Review (aktueller Stand) + Live-CDP-Messung im Browser
---
## Zweck dieses Dokuments
Frische Bestandsaufnahme **nach** den bereits umgesetzten Fixes aus
`dev/frontend-optimize-grok.md`. Dieses Protokoll
1. **verifiziert**, welche früheren P0/P1-Befunde jetzt tatsächlich behoben sind (Code + Live),
2. **listet die noch offenen Punkte** (v. a. aus `dev/frontend-optimize-56.md`), und
3. **dokumentiert einen neuen, bisher nicht erfassten Fehler** bei 320px.
**Es wurde bewusst noch kein Code geändert.**
---
## Kurzfazit
Die schweren strukturellen P0-Bugs aus den beiden Vor-Audits sind im aktuellen Code
**behoben und live bestätigt** (bei 390px kein Seiten-Overflow mehr, Hero-Hierarchie intakt,
Hub mit Mobile-Nav/Burger, Footer stackt, Architektur-Diagramm gestapelt).
Offen bleiben:
| Priorität | Thema | Betrifft | Quelle |
|-----------|-------|----------|--------|
| **P1** | **Sticky-Header funktional wirkungslos** – Script schaltet Klassen `header-normal`/`header-sticky` um, für die **keine CSS-Regeln existieren** | Portal-Seiten (presseecho, businessportal24) | 56.md P1-04, hier **live bestätigt** |
| **P1 (neu)** | **Header-Button-Gruppe bricht bei 320px aus** → horizontaler Seiten-Scroll auf sehr kleinen Phones | Portal-Home (+38px) & Hub (+62px) | **Neu in diesem Audit** |
| P2 | Industry-Index: `grid-cols-2` + `px-5` ab Mobile (gequetscht) | Portal-Homes | 56.md P2-01 |
| P2 | Touch-Targets in Portal-Topbar unter 44×44 (DE/EN, „Preise") | Portale | 56.md P2-03 |
| P2 | Stat-Strips `grid-cols-2` mit großen Zahlen, Labels wrappen | Kategorie/Newsroom/Veröffentlichen | 56.md P2-02 |
| P2 | FAQ-Antworten `pl-[60px]`, Credit-Pakete 2-spaltig, kleine Pagination/Modal-Close-Buttons, FAQ/API fehlen in mobiler Portal-Nav | Veröffentlichen/Preise/diverse | 56.md P2-07 |
| P3 | API-Tabellen `overflow-x-auto` (bewusst, kein Seiten-Overflow) | API-Seite | 56.md P2-05 |
---
## Methode
1. **Code-Review** der High-Leverage-Blades unter `resources/views/web/**` und
`resources/views/components/web/**`.
2. **Live-Check** im Browser mit CDP-Emulation (`Emulation.setDeviceMetricsOverride`) bei
320px und 390px; Messung von `document.documentElement.scrollWidth`,
Element-Bounding-Boxes und `getComputedStyle`.
3. **Overflow-Isolation:** Elemente mit `right > clientWidth` gefiltert und um solche
bereinigt, die einen klippenden Vorfahren (`overflow-x: hidden/clip/auto/scroll`) haben,
sowie um die lokale Laravel-Debugbar.
**Hinweis Debugbar:** Lokal sichtbar, wurde bei allen Messungen ausgeschlossen (kein Produktionsproblem).
---
## Teil A — Verifiziert behoben (aus grok.md)
| Befund | Datei(en) | Beleg (Code + Live) |
|--------|-----------|---------------------|
| **P0-01** Focus-Hero-Overlay überdeckt „Im Fokus" | `components/web/focus-hero.blade.php` | Overlay jetzt im Flow: `min-h-[320px] sm:min-h-[420px] lg:min-h-[500px] flex flex-col justify-end`, Type `text-[24px] sm:text-[32px] lg:text-[38px]`. **Live 390px:** `h1Top=407 > imFokusBottom=250` → Hierarchie intakt. |
| **P0-03** Quality-Summary erzeugt H-Scroll | `components/web/quality-summary.blade.php` | Grid jetzt `grid-cols-1 sm:grid-cols-[auto_minmax(0,1fr)_auto]`, Link `sm:whitespace-nowrap`, Padding `px-4 sm:px-6 lg:px-8`. **Live 390px Portal-Home:** `scrollWidth = 390` (kein Overflow). |
| **P0-02** Kategorie-/Newsroom-Hero gleicher Overlay-Overflow | `web/kategorie.blade.php`, `web/newsroom.blade.php` | Beide Heroes jetzt `min-h-[…] flex flex-col justify-end` statt fester Höhe / Aspect-Ratio. |
| **P0-04** Hub-Utility-Bar + Header sprengen Viewport | `components/web/hub/top-utility-bar.blade.php`, `hub/site-header.blade.php` | Utility-Bar `flex-wrap`, kurzes Datum (`sm:hidden`), Mobile-**Burger + Panel** (`x-data menuOpen`). **Live 390px Hub:** `scrollWidth = 390`. |
| **P1-01** Hub-Footer 4 Spalten auf Mobile | `components/web/hub/site-footer.blade.php` | Jetzt `grid-cols-1 sm:grid-cols-2 lg:grid-cols-[1.5fr_1fr_1fr_1fr]`. |
| **P1-02** Hub-Architektur-Diagramm überlappt | `web/pressekonto.blade.php` | Mobile-Variante gestapelt (`lg:hidden flex flex-col`), absolut positioniertes Diagramm nur noch `hidden lg:block`. |
| **P1-03** Hartes `px-8` auf Homepages | `focus-hero`, `quality-summary`, `industry-index` u. a. | Umgestellt auf `px-4 sm:px-6 lg:px-8`. |
---
## Teil B — Noch offene Befunde
### P1-04 — Sticky-Header ist funktional wirkungslos (live bestätigt)
**Schwere:** Hoch
**Wo:**
- `resources/views/web/layouts/web-master.blade.php` (Inline-Script ~76–115)
- `resources/views/components/web/site-header.blade.php` (`id="topbar"` Z. 54, `id="header" class="header-normal …"` Z. 101)
**Problem:** Beim Scrollen tauscht das Script `header-normal` ↔ `header-sticky`. Für diese
beiden Klassen existieren **keine CSS-Regeln** – bestätigt per Repo-Suche: Treffer nur in
Blade/JS sowie in `dev/_old/`-Altbuilds, **nicht** in den aktiven Web-CSS-Quellen/Builds.
**Live-Messung (390px, businessportal24, nach `scrollTo(0, 700)`):**
- `header.className = "header-normal …"` (Klasse wechselt nicht wirksam)
- `getComputedStyle(header).position = "static"`
- Header-`top = -665` → **Header komplett aus dem Viewport gescrollt, nicht sichtbar**
**Auswirkung:** Auf langen Mobilseiten verschwinden Suche, Anmelden und der
Veröffentlichungs-CTA beim Scrollen. Der gewünschte Sticky-Effekt tritt nie ein.
**Fix-Richtung (später):** Entweder CSS für `.header-sticky` (`position: sticky/fixed`,
Top-Offset, Schatten, Platzhalterhöhe) ergänzen, oder das Script entfernen und stattdessen
`position: sticky; top: 0` direkt am Header-Container setzen.
---
### P1-05 (NEU) — Header-Button-Gruppe bricht bei 320px aus → H-Scroll
**Schwere:** Hoch (nur ≤ 320px; bei 390px sauber)
**Status:** In den Vor-Audits **nicht** erfasst (dort wurde vor dem Fix 635/457px gemessen).
**Live-Messung 320px:**
| Seite | `scrollWidth` | Overflow | Verursacher (kein klippender Vorfahre) |
|-------|---------------|----------|-----------------------------------------|
| Portal-Home (businessportal24) | 358 | **+38px** | Header-rechts-Cluster `flex items-center gap-1 sm:gap-2 flex-shrink-0` (`right=358`), darin PM-Button |
| Hub (pressekonto) | 382 | **+62px** | Header-rechts-Cluster `flex items-center gap-1.5 sm:gap-2 flex-shrink-0` (`right=383`), „Registrieren"-Button + Burger |
**Ursache:**
- **Portal** (`components/web/site-header.blade.php` ~144–182): Logo + Such-Icon (40px) +
„Anmelden" + PM-Button liegen alle in einer nicht umbrechenden Zeile; `flex-shrink-0`
verhindert Schrumpfen. Bei 320px reicht die Breite nicht.
- **Hub** (`components/web/hub/site-header.blade.php` ~48–91): Logo + „Anmelden" +
„Registrieren" + 40px-Burger. Der zusätzliche „Registrieren"-Button (`sm:hidden`) neben
Burger und „Anmelden" ist bei 320px zu breit.
**Fix-Richtung (später):** Bei ≤ 320px Buttons weiter verkürzen (Icon-only bzw. „Registrieren"
in den Burger verlagern), engere Gaps, `min-w-0`/kürzere Labels; Ziel
`scrollWidth <= clientWidth` auch bei 320px.
---
### P2-01 — Industry-Index: 2 Spalten + `px-5` ab Mobile
**Schwere:** Mittel
**Wo:** `components/web/industry-index.blade.php` (`grid-cols-2 md:grid-cols-4`, Kacheln `px-5`)
Lange Branchennamen + Delta in einer Zeile wirken bei 320/390px gequetscht. Kein Seiten-Overflow.
### P2-02 — Stat-Strips / Sidebar-Grids (Dichte)
**Schwere:** Mittel
Kategorie/Newsroom Stat-Strips `grid-cols-2` mit `text-[32px]`-Zahlen → Labels wrappen unschön.
`focus-side-item` als 3-Spalten-Grid in gestapelter Sidebar funktional ok, aber dicht.
Release-Detail-Hero `aspect-ratio: 21/9` → mobil sehr flach (~153px Bildhöhe).
### P2-03 — Touch-Targets Portal-Topbar
**Schwere:** Mittel
DE/EN-Umschalter und „Preise"-Link in der Topbar bleiben unter der 44×44-Empfehlung.
Suche/Anmelden mit ~40×40 grenzwertig; die große Rubrik-Zeile (Burger) erreicht ~358×44.
### P2-04 — Brand-Kontextbanner (Hub, `?from=…`)
**Schwere:** Niedrig – **weitgehend entschärft**
`components/web/hub/brand-context-banner.blade.php` hat jetzt `flex-wrap`.
**Live 320px (`?from=businessportal24`):** „Zurück zu"-Link `right = 304` (< 320) → kein Overflow.
Der `flex-1`-Spacer ohne `min-w-0` am Text ist ein kleines Restrisiko bei extrem langen Marken – niedrig.
### P2-05 — API-Seite Tabellen (bewusst)
`overflow-x-auto` + `whitespace-nowrap` → Scrollen innerhalb der Tabelle, nicht der Seite. Kein Handlungsbedarf.
### P2-06 — Weitere Dichte-/Touch-Themen (aus 56.md P2-07)
- FAQ-Antworten „Veröffentlichen" mit `pl-[60px]` verschenken auf 320px Textbreite.
- Credit-Pakete auf „Preise" starten bereits mobil zweispaltig.
- Pagination und mehrere Modal-Close-Buttons ~32–36px (< 44×44).
- FAQ/API sind in der **mobilen Portal-Kopf-Navigation** nicht direkt erreichbar (nur `hidden lg:inline` in der Topbar bzw. über den Footer). Der Mobile-Burger listet nur Rubriken.
---
## Live-Messmatrix (dieses Audit)
| Seite | Viewport | `scrollWidth` | clientWidth | Overflow | Bewertung |
|-------|----------|---------------|-------------|----------|-----------|
| Portal-Home (businessportal24) | 390 | 390 | 390 | 0 | ok |
| Portal-Home (businessportal24) | 320 | 358 | 320 | **+38** | Header-Cluster (P1-05) |
| Hub (pressekonto, `?from=…`) | 390 | 390 | 390 | 0 | ok |
| Hub (pressekonto, `?from=…`) | 320 | 382 | 320 | **+62** | Header-Cluster (P1-05) |
| Sticky-Header (Portal, Scroll 700) | 390 | – | – | – | `position: static`, scrollt weg (P1-04) |
---
## Empfohlene Bearbeitungsreihenfolge (noch nicht umsetzen)
1. **P1-04** – Sticky-Header: CSS herstellen oder auf `position: sticky` am Container umstellen.
2. **P1-05 (neu)** – Header-Button-Cluster bei ≤ 320px entschärfen (Portal + Hub).
3. **P2** – Industry-Index-Dichte, Stat-Strips, Touch-Targets, FAQ-Padding, Credit-Pakete, mobile Nav-Erreichbarkeit von FAQ/API.
**Akzeptanzkriterium je Fix:** `document.documentElement.scrollWidth <= clientWidth` bei
320/390/430px, plus visuelle Prüfung Portal-Home + Hub + eine Kategorie + eine PM-Detailseite.
---
## Dateien mit höchster Hebelwirkung (offen)
1. `resources/views/web/layouts/web-master.blade.php` + Web-CSS (Sticky-Header, P1-04)
2. `resources/views/components/web/site-header.blade.php` (Portal-Header 320px, P1-05)
3. `resources/views/components/web/hub/site-header.blade.php` (Hub-Header 320px, P1-05)
4. `resources/views/components/web/industry-index.blade.php` (P2-01)
5. Preise-/Veröffentlichen-Views (P2-06: Credit-Pakete, FAQ-Padding)
---
## Umsetzung (16.07.2026)
Die beiden P1-Punkte sind umgesetzt und live (320/390px) verifiziert.
| Check | Vorher | Nachher |
|-------|--------|---------|
| Sticky-Header Portal (nach Scroll) | `position: static`, scrollt weg | `position: fixed; top:0; z-index:50`, sichtbar; Platzhalter verhindert Sprung; setzt oben sauber zurück |
| Portal-Home `scrollWidth` @320px | 358 (+38) | **320** (0) |
| Hub `scrollWidth` @320px | 382 (+62) | **320** (0) |
| presseecho-Home `scrollWidth` @320/390 | – | **320 / 390** (0) |
| Hub/Portal `scrollWidth` @390px | 390 | 390 (unverändert ok) |
**Geänderte Dateien:**
- `resources/css/web/shared-styles.css` — CSS-Regeln für `.header-sticky` ergänzt (P1-04).
- `resources/views/web/layouts/web-master.blade.php` — Sticky-Script mit Platzhalter (kein Layout-Sprung) (P1-04).
- `resources/views/components/web/site-header.blade.php` — Portal-Header bei ≤320px verschlankt (Padding/Gap/Logo/CTA) (P1-05).
- `resources/views/components/web/hub/site-header.blade.php` — Hub-Header verschlankt; „Anmelden" auf Mobile ins Burger-Panel verlagert (P1-05).
- `resources/views/web/pressekonto.blade.php` — Hub-Hero-H1 Basisgröße `text-[34px]` (Wortmarke „businessportal24" passte bei 320px nicht) (P1-05).
**Tests:** `PresseechoHomeTest`, `Businessportal24HomeTest`, `PressekontoHubHomeTest`, `HubStaticPageShellTest` — 32 passed. Pint sauber.
**Hinweis:** Web-Assets wurden neu gebaut (`npm run build:web`). Sail/Docker war nicht aktiv; Build lief direkt über npm.
## Umsetzung P2 (16.07.2026)
| Punkt | Änderung | Datei |
|-------|----------|-------|
| P2 Nav | FAQ, API und Preise ins Mobile-Burger-Menü aufgenommen (vorher mobil nur im Footer) | `components/web/site-header.blade.php` |
| P2-03 | Edition-Tabs (DE/EN) in der Topbar: `py-2 → py-2.5`, `px-1.5 → px-2` (größere Tap-Fläche) | `components/web/site-header.blade.php` |
| P2-01 | Industry-Index: `px-5 → px-4 sm:px-5`, `py-[18px] → py-4 sm:py-[18px]`, Branchenname `text-[13px] sm:text-[14px]` | `components/web/industry-index.blade.php` |
| P2-07 | „Veröffentlichen"-FAQ-Antwort: `pl-[60px] → pl-0 sm:pl-[60px]` (volle Textbreite auf Mobile) | `web/veroeffentlichen.blade.php` |
| P2 (neu) | Preise „Einzel-PM"-Block: `gap-6` → `flex-wrap gap-4` (behebt 11px-Overflow bei 320px) | `web/preise.blade.php` |
**Live-Verifikation @320px:** Preise `scrollWidth` 331 → **320**; Veröffentlichen ohne echten Layout-Overflow (verbleibende 6px = Debugbar); Mobile-Burger enthält jetzt Preise/FAQ/API.
**Tests:** 105 passed (u. a. Home-, Hub-, Preise-, Publish-Suites). Pint sauber. Web-Assets neu gebaut.
**Bewusst belassen:** Credit-Pakete (`grid-cols-2`) — kompakte Kacheln, bei 320px kein Overflow. Pagination-Buttons (~36px) als optionaler Feinschliff offen.
---
*Ende des Protokolls. P1 + P2 umgesetzt und verifiziert.*