Skip to content

fix: Darkmode-Kontrastbug bei Strichzeichnungen (#335) + Markenfarbe Blau (#306) - #340

Merged
S540d merged 7 commits into
testingfrom
claude/issues-304-plan-vxha3g
Sep 22, 2026
Merged

S540d merged 7 commits into
testingfrom
claude/issues-304-plan-vxha3g

Conversation

@S540d

@S540d S540d commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Zusammenfassung

Scope-Update: #304, #338 und #312 wurden zwischenzeitlich bereits unabhängig in testing gefixt (PR #305 bzw. #313) — nach dem Merge von testing in diesen Branch ist der Diff auf die tatsächlich neuen Fixes geschrumpft:

#335 — Darkmode-Kontrastbug

extra-01-stick-figure.svg sowie jedes Bild in der Spielvariante „Nur Umriss merken" zeichnen unausgefüllte schwarze/dunkelgraue Konturen — im Darkmode auf den dunklen Surface-/Background-Farben praktisch unsichtbar (Merke-Phase, Vorschau-Modal im Draw-Screen, Ergebnis-Vergleich). LevelImageDisplay bekommt einen theme-Prop; unausgefüllte schwarze Konturen und die feste Outline-Farbe werden im Darkmode auf ein helles Grau (#D8D4E8) gemappt.

Nachträglich gefundener Bug in der eigenen ersten Fassung: Die Erkennung „unausgefüllt" prüfte nur fill === 'none' — <Line>-Elemente (Arme/Beine des Strichmännchens) haben aber gar kein fill-Prop und wurden dadurch nicht erfasst (nur der Kopf wäre sichtbar geworden). Per Test abgesichert (siehe unten) und korrigiert: zusätzlich node.type === Line prüfen.

#306 — Markenfarbe vereinheitlichen

app.json (Blau #60D5FA) vs. constants/Colors.ts/ThemeContext.tsx (Violett #7C5CFF) — sichtbarster Bruch war der Farbsprung zwischen nativem Splash (blau) und In-App-Splash (violett). Entscheidung des Repo-Owners: Blau.

Wichtige Abweichung von "einfach #60D5FA überall einsetzen": das reine Icon-Blau hat nur ~1.7:1 Kontrast gegen Weiß (WCAG-Minimum 3:1 für fetten Button-Text) — als Button-/Text-Farbe wäre es kaum lesbar gewesen. primary/primaryDark sind daher eine kontraststarke Blau-Variante derselben Farbfamilie (#0585AD light-theme / #7DE0FF dark-theme, ~4:1 bzw. ~10:1 Kontrast gegen ihren jeweiligen Hintergrund), primaryLight führt das literale Icon-Blau #60D5FA für dekorative Flächen ohne Text (Kreise, Splash-Hintergrund). Per Web-Build visuell verifiziert.

Zusätzlich (Nebenbefund)

.github/workflows/ci-cd.yml: Der pull_request-Trigger deckte auf diesem Branch nur main ab (nicht testing), vermutlich weil der Branch von einem veralteten main-Stand abgezweigt war — dadurch lief für diesen PR (Ziel testing) zunächst gar keine CI. Auf [main, testing] korrigiert.

Test plan

  • npm test (456 Tests grün, inkl. 3 neuer Tests für den theme-Prop von LevelImageDisplay, die den <Line>-Bug abdecken)
  • npx tsc --noEmit, npm run lint, npm run validate:svg-counts, npm run format — alle sauber
  • npx expo export --platform web + lokaler Headless-Browser-Rundgang (Onboarding, Home, Settings) in Dark und Light Theme — neue Blau-Töne konsistent und lesbar
  • Coverage bleibt über der in testing kalibrierten Schwelle (test(#312): coverageThreshold auf den Ist-Stand anheben #313)

🤖 Generated with Claude Code

https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP

S540d and others added 5 commits August 24, 2026 17:55
…n, Security-Fix

Sammel-Merge von testing nach main.

- Web-Auffindbarkeit außerhalb des Play Stores (#296)
- Micro-Animationen + klarere Nutzerführung (#294)
- Label-/Icon-Anpassungen aus APK-Testing-Feedback (#292)
- fix(security): image-size DoS über veraltetes metro 0.83.7 (Override auf 0.83.8)
- CI: Workflows nur noch bei PRs gegen main (#300)

Validiert: 452 Tests, tsc clean, svg-counts 81, npm audit exit 0.
Schwelle lag 30+ Punkte unter der tatsächlichen Abdeckung und hätte
einen deutlichen Einbruch nicht erkannt. Auf Ist-Stand minus kleinem
Puffer angehoben (branches 47, functions 52, lines 55, statements 53).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP
… machen (#335)

extra-01-stick-figure.svg und Bilder im "Nur Umriss merken"-Modus
zeichnen reine schwarze/dunkelgraue Konturen ohne Fläche. Im Darkmode
verschwinden diese auf den dunklen Surface-/Background-Farben (Merke-
Phase, Vorschau-Modal, Ergebnis-Vergleich).

LevelImageDisplay bekommt einen theme-Prop: unausgefüllte schwarze
Konturen (fill="none", stroke="#000000") werden im Darkmode auf ein
helles Grau gemappt, ebenso die feste Outline-Farbe des Umriss-Modus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP
, #338)

Alte app-icon.png/adaptive-icon.png/favicon.png waren byte-identische,
alphakanal-lose Rasterisierungen derselben app-icon.svg (grünes
Chamäleon-Icon) — daher weiße Ecken auf Launchern und ein irrelevanter
Flackerübergang zum In-App-Splash. adaptive-icon.png hatte zudem gar
keinen transparenten Vordergrund, wie von Android für Adaptive Icons
gefordert.

Neues Motiv (zwei Bildkarten + Stift, vom Repo-Owner via KI-Bildgenerator
erstellt) ersetzt das Chamäleon:
- app-icon.png / favicon.png: volle 1024x1024 Kachel, deckend auf
  Markenfarbe #60D5FA (Store-/Web-Icon)
- adaptive-icon.png: freigestellter, transparenter Vordergrund, ins
  Android-Safe-Zone-Zentrum (~65% der Canvas) skaliert
- splash-icon.png (neu) + expo-splash-screen-Plugin: der native Splash
  war bisher wirkungslos (Paket nicht installiert, app.json "splash"-Key
  wird seit SDK 52 ignoriert) — jetzt korrekt verdrahtet

scripts/generate-icon-assets.js rasterisiert nur noch die Feature-
Graphic; app-icon.svg (alter Motiv-Entwurf) ist obsolet und entfernt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP
app.json führte Blau (#60D5FA, App-Icon/Store/Splash) während
constants/Colors.ts und ThemeContext.tsx Violett (#7C5CFF) als
primary-Ton führten — sichtbarster Bruch war der Farbsprung zwischen
nativem Splash (blau) und In-App-Splash (AnimatedSplashScreen, violett
via Colors.primary).

primary/primaryDark sind jetzt eine kontraststarke Blau-Variante
(#0585AD light / #7DE0FF dark, ~4:1 bzw. ~10:1 Kontrast) statt des
literalen Icon-Blaus #60D5FA — das wäre als Button-/Text-Farbe mit
<2:1 Kontrast gegen Weiß nicht mehr lesbar gewesen. primaryLight führt
stattdessen die eigentliche Icon-Farbe #60D5FA für dekorative Flächen
ohne Text (Kreise, Chips). Betrifft alle Verbraucher, die Colors.primary/
colors.primary referenzieren (Buttons, Gradients, Shadows, In-App-
Splash) — keine hartkodierten Violett-Hex-Werte gefunden, die separat
hätten migriert werden müssen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP
@S540d S540d changed the title fix: Coverage-Threshold kalibrieren (#312) + Darkmode-Kontrastbug (#335) fix: Coverage-Threshold (#312), Darkmode-Kontrast (#335), neues App-Icon (#304, #338), Markenfarbe (#306) Sep 21, 2026
…plan-vxha3g

# Conflicts:
#	CLAUDE.md
#	app.json
#	assets/icons/adaptive-icon.png
#	assets/icons/app-icon-512.png
#	assets/icons/app-icon.png
#	assets/icons/app-icon.svg
#	assets/icons/favicon.png
#	constants/ExternalLinks.ts
#	jest.config.js
#	package-lock.json
#	scripts/generate-icon-assets.js
@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

🔀 Mergeability-Report

✅ Konfliktfrei mergebar (unstable).
✅ Ziel-Branch testing ist policy-konform.

CI-Checks: ✅ keine fehlgeschlagenen Checks

⏳ ⚙️ Workflow Linting / actionlint
⏳ 🔧 Platform Compatibility
⏳ 🔑 Keystore & Credential Scan
⏳ 🔐 Docs Privacy Check
⏳ 🔍 Code Quality & Linting
⏳ mergeability / mergeability
⏳ 🔒 Security Audit
⏳ Analyze (javascript-typescript)
⏳ Analyze (actions)

Merge-Checkliste

  • CI-Checks grün
  • Keine Merge-Konflikte
  • Ziel-Branch korrekt
  • (Optional) tiefes KI-Review via /review aus Claude Code (Pro-Abo, ohne API-Kosten)

Kostenlos generiert von reusable-mergeability.yml · keine API-Kosten · review-gate: success

Der Branch war vermutlich von einem veralteten main-Stand abgezweigt —
pull_request lief nur gegen main, wodurch CI für diesen gegen testing
gerichteten PR gar nicht auslöste. Auf testing-Stand [main, testing]
zurückgesetzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKKsCtexSeDGBEmdXrCttP
@S540d S540d changed the title fix: Coverage-Threshold (#312), Darkmode-Kontrast (#335), neues App-Icon (#304, #338), Markenfarbe (#306) fix: Darkmode-Kontrastbug bei Strichzeichnungen (#335) + Markenfarbe Blau (#306) Sep 21, 2026
@S540d
S540d merged commit 3abf7b4 into testing Sep 22, 2026
14 checks passed
@S540d
S540d deleted the claude/issues-304-plan-vxha3g branch October 11, 2026 05:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants