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>
14 KiB
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: trueScope: Ö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
- verifiziert, welche früheren P0/P1-Befunde jetzt tatsächlich behoben sind (Code + Live),
- listet die noch offenen Punkte (v. a. aus
dev/frontend-optimize-56.md), und - 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
- Code-Review der High-Leverage-Blades unter
resources/views/web/**undresources/views/components/web/**. - Live-Check im Browser mit CDP-Emulation (
Emulation.setDeviceMetricsOverride) bei 320px und 390px; Messung vondocument.documentElement.scrollWidth, Element-Bounding-Boxes undgetComputedStyle. - Overflow-Isolation: Elemente mit
right > clientWidthgefiltert 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-0verhindert 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:inlinein 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)
- P1-04 – Sticky-Header: CSS herstellen oder auf
position: stickyam Container umstellen. - P1-05 (neu) – Header-Button-Cluster bei ≤ 320px entschärfen (Portal + Hub).
- 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)
resources/views/web/layouts/web-master.blade.php+ Web-CSS (Sticky-Header, P1-04)resources/views/components/web/site-header.blade.php(Portal-Header 320px, P1-05)resources/views/components/web/hub/site-header.blade.php(Hub-Header 320px, P1-05)resources/views/components/web/industry-index.blade.php(P2-01)- 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-stickyergä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ößetext-[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.