feat(catalog): GameCover-Widget mit einheitlichem Platzhalter (KAT-05, 2a Flutter) #52

Merged
cschlaefke merged 4 commits from feature/2a-game-cover into main 2026-11-03 19:32:30 +00:00
Owner

Zusammenfassung

Refs #2 (KAT-05, PR 2a, Flutter-Anteil; bewusst kein Closes). Das Backend von 2a (Datenmodell, Rechte, Startbestand-Werkzeug) kommt in einem eigenen PR, damit beide Teile einzeln reviewbar sind. Das ist eine Abweichung vom Spec-Schnitt „2a = ein PR" (docs/specs/2-katalog-daten.md § 8); der Cover-Teil ist vom Backend unabhängig.

Änderungen

  • app/lib/core/widgets/game_cover.dart: GameCover mit den Eingaben imageUrl (nullable), title, size (small 56 dp / large 160 dp, Seitenverhältnis 3:4) und titleVisibleNearby.
  • Ein einheitlicher neutraler Platzhalter (Spec-F9) ohne Bilddatei von Dritten, aus Theme-Farben, bei fehlender oder leerer URL, beim Laden (dezente Ladelinie) und bei Ladefehler, ohne Fehlerzustand.
  • Semantics: Label hängt am sichtbaren Zustand (gameCoverPlaceholderLabel für Platzhalter/Laden/Fehler, gameCoverLabel für ein geladenes Bild); mit sichtbarem Titel daneben ausgeblendet.
  • l10n DE/EN (gameCoverPlaceholderLabel, gameCoverLabel), cacheWidth nach Gerätepixeln.
  • Widget-Tests mit Kriterium-Referenzen (KAT-05 Krit. 10, QUE-05 Krit. 2, QUE-06 Krit. 1/2), inkl. Erfolgspfad mit Fake-HttpClient.
  • Spec § 5/§ 10: Zusatz zu gameCoverLabel und titleVisibleNearby.

Abweichungen von der Spec (bitte bestätigen)

  • Zusätzlicher ARB-Schlüssel gameCoverLabel und Parametername titleVisibleNearby (Spec nennt beide nicht; als Zusatz in § 5 dokumentiert).
  • Der Hinweis „nicht mehr im Katalog" (Spec-F2) ist laut § 9.5 Sache von KAT-02 (#4), nicht des Widgets.

Review

code-reviewer: CHANGES REQUESTED, keine Blocker (falsches Semantics-Label beim Laden, Testnamen ohne Kriterium-Referenz, fehlender Erfolgspfad-Test, cacheWidth, Doc-Hinweise); alles in f99c82b eingearbeitet. Der Nacharbeits-Commit wurde nicht erneut durch einen Reviewer gelesen.

Lokal ausgeführt (laut Entwickler)

dart format --set-exit-if-changed . ohne Änderung, flutter analyze ohne Befund, flutter test 533 Tests grün.

Nicht getestet

  • Android, iOS, flutter build web; echte Screenreader (VoiceOver/TalkBack); echter Netzwerkabruf gegen Supabase Storage (signierte URLs, CORS) — gehört zu #3/#4.
  • Optik (Icon-Größe, Ladelinie): kein Golden-Test, nicht in der laufenden App gesehen.
  • MediaQuery.disableAnimations wird nicht beachtet (nur als Hinweis dokumentiert); die Ladeanzeige läuft endlos, pumpAndSettle in Tests von #3/#4 läuft darum in einen Timeout, solange eine URL lädt.

🤖 Generated with Claude Code

## Zusammenfassung Refs #2 (KAT-05, PR 2a, Flutter-Anteil; bewusst kein `Closes`). Das Backend von 2a (Datenmodell, Rechte, Startbestand-Werkzeug) kommt in einem eigenen PR, damit beide Teile einzeln reviewbar sind. Das ist eine Abweichung vom Spec-Schnitt „2a = ein PR" (docs/specs/2-katalog-daten.md § 8); der Cover-Teil ist vom Backend unabhängig. ## Änderungen - `app/lib/core/widgets/game_cover.dart`: `GameCover` mit den Eingaben `imageUrl` (nullable), `title`, `size` (small 56 dp / large 160 dp, Seitenverhältnis 3:4) und `titleVisibleNearby`. - Ein einheitlicher neutraler Platzhalter (Spec-F9) ohne Bilddatei von Dritten, aus Theme-Farben, bei fehlender oder leerer URL, beim Laden (dezente Ladelinie) und bei Ladefehler, ohne Fehlerzustand. - Semantics: Label hängt am sichtbaren Zustand (`gameCoverPlaceholderLabel` für Platzhalter/Laden/Fehler, `gameCoverLabel` für ein geladenes Bild); mit sichtbarem Titel daneben ausgeblendet. - l10n DE/EN (`gameCoverPlaceholderLabel`, `gameCoverLabel`), `cacheWidth` nach Gerätepixeln. - Widget-Tests mit Kriterium-Referenzen (KAT-05 Krit. 10, QUE-05 Krit. 2, QUE-06 Krit. 1/2), inkl. Erfolgspfad mit Fake-HttpClient. - Spec § 5/§ 10: Zusatz zu `gameCoverLabel` und `titleVisibleNearby`. ## Abweichungen von der Spec (bitte bestätigen) - Zusätzlicher ARB-Schlüssel `gameCoverLabel` und Parametername `titleVisibleNearby` (Spec nennt beide nicht; als Zusatz in § 5 dokumentiert). - Der Hinweis „nicht mehr im Katalog" (Spec-F2) ist laut § 9.5 Sache von KAT-02 (#4), nicht des Widgets. ## Review `code-reviewer`: CHANGES REQUESTED, keine Blocker (falsches Semantics-Label beim Laden, Testnamen ohne Kriterium-Referenz, fehlender Erfolgspfad-Test, `cacheWidth`, Doc-Hinweise); alles in f99c82b eingearbeitet. Der Nacharbeits-Commit wurde nicht erneut durch einen Reviewer gelesen. ## Lokal ausgeführt (laut Entwickler) `dart format --set-exit-if-changed .` ohne Änderung, `flutter analyze` ohne Befund, `flutter test` 533 Tests grün. ## Nicht getestet - Android, iOS, `flutter build web`; echte Screenreader (VoiceOver/TalkBack); echter Netzwerkabruf gegen Supabase Storage (signierte URLs, CORS) — gehört zu #3/#4. - Optik (Icon-Größe, Ladelinie): kein Golden-Test, nicht in der laufenden App gesehen. - `MediaQuery.disableAnimations` wird nicht beachtet (nur als Hinweis dokumentiert); die Ladeanzeige läuft endlos, `pumpAndSettle` in Tests von #3/#4 läuft darum in einen Timeout, solange eine URL lädt. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 2 commits 2026-11-03 14:27:10 +00:00
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
feat(catalog): address review of GameCover (labels, tests, spec notes)
Some checks failed
CI / flutter (pull_request) Failing after 51s
CI / web-build (pull_request) Successful in 1m1s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 31s
CI / e2e (pull_request) Successful in 2m50s
f99c82b1e0
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added 1 commit 2026-11-03 18:48:15 +00:00
fix(l10n): regenerate localizations after ARB key order
All checks were successful
CI / flutter (pull_request) Successful in 1m16s
CI / web-build (pull_request) Successful in 1m0s
CI / supabase (pull_request) Successful in 4s
CI / supabase-tests (pull_request) Successful in 32s
CI / e2e (pull_request) Successful in 2m56s
13db8ebb9c
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added the
status/ready-for-merge
label 2026-11-03 19:00:50 +00:00
Author
Owner

Review-Stand: Alle sieben Befunde des Reviews sind eingearbeitet (f99c82b), die generierten l10n-Dateien sind regeneriert (13db8eb). CI auf 13db8eb komplett grün (flutter, web-build, supabase, supabase-tests, e2e).

Nicht erneut von einem Reviewer gelesen: die Nacharbeit. Nicht getestet: Android, iOS, Web-Build mit echtem Bild, Screenreader, echter Netzwerkabruf, Optik.

Bitte bestätigen: Aufteilung von 2a in zwei PRs (#52 Widget, #53 Backend) statt eines PR sowie die Abweichungen gameCoverLabel und titleVisibleNearby. Merge durch Chris.

Review-Stand: Alle sieben Befunde des Reviews sind eingearbeitet (f99c82b), die generierten l10n-Dateien sind regeneriert (13db8eb). CI auf 13db8eb komplett grün (flutter, web-build, supabase, supabase-tests, e2e). Nicht erneut von einem Reviewer gelesen: die Nacharbeit. Nicht getestet: Android, iOS, Web-Build mit echtem Bild, Screenreader, echter Netzwerkabruf, Optik. Bitte bestätigen: Aufteilung von 2a in zwei PRs (#52 Widget, #53 Backend) statt eines PR sowie die Abweichungen `gameCoverLabel` und `titleVisibleNearby`. Merge durch Chris.
cschlaefke added 1 commit 2026-11-03 19:07:49 +00:00
chore: merge main into feature/2a-game-cover
All checks were successful
CI / flutter (pull_request) Successful in 1m20s
CI / web-build (pull_request) Successful in 55s
CI / supabase (pull_request) Successful in 9s
CI / supabase-tests (pull_request) Successful in 34s
CI / e2e (pull_request) Successful in 2m54s
a9a7990636
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke merged commit 8c003ddece into main 2026-11-03 19:32:30 +00:00
cschlaefke deleted branch feature/2a-game-cover 2026-11-03 19:32:30 +00:00
Sign in to join this conversation.
No description provided.