- getAchievements() im API-Client
- unlocked_achievements aus saveProgress als Overlay-Typ 'achievement'
- ERFOLGE-Sektion im Profil (freigeschaltet/gesperrt), degradiert lautlos ohne Endpoint
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
WebView öffnete zoomed-in → Inhalt größer als Viewport → scrollbar.
maximum-scale/user-scalable=no im Viewport-Meta + text-size-adjust
und touch-action: manipulation sperren Pinch-/Auto-Zoom.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Profil: Begrüßung in Zielsprache, Kategorie-Punkte-Übersicht,
ruhigerer Header (kein rotierender Avatar/Online-Dot), Notch-Fix
und kompaktere Aktivitäts-Heatmap. Außerdem Capacitor-iOS-Projekt
und diverse Auth/Feed/Audio-Verbesserungen aus dem Premium-Redesign.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- nginx: Cache-Control no-cache für index.html — Browser hingen sonst auf
alten JS-Bundles (gehashte Assets bleiben immutable gecacht)
- Karten: Pipeline-Tokens ⟦PHn:wort⟧ aus der Übersetzung werden als blankes
Wort gerendert/gesprochen statt roh angezeigt (Datenfix gehört ins Backend)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- usePairAudio-Hook: preload beim Kachel-Mount, nur eine Stimme gleichzeitig
- PairSentenceCard: audio_url statt speechSynthesis (TTS nur noch Fallback)
- PairYesNoCard/PairWordCard: Frage klickbar + Speaker-Button (vorher kein Audio)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A subset of correct words with no wrong selections now triggers confetti and marks the card as solved.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Selected IDs tracked in a Set; correct only if all right words
chosen and no wrong ones. Missed correct answers shown green after
confirm; wrong picks shown red.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tapping an option now highlights it (warm gold border); a
"Bestätigen" button activates once something is selected.
Answer is only evaluated on confirmation, not on tap.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove lang/points header from all 3 card types
- PairSentenceCard: Verstanden button locked until audio played OR
translate button held for 2 seconds
- Hold button shows circular gold ring filling up over 2s while held
- TTS button highlights gold when unlocked
- .pair-btn-locked style for disabled state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The max-height broke the square aspect ratio needed for object coordinate
overlays. Layout fix in App.jsx already ensures correct heights; the
image constraint was unnecessary.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.jsx: use flex column layout so BottomNav stays at bottom and
never scrolls away; Feed gets a proper definite height for scroll-snap
- Feed.css: feed-slot uses min-height so long cards can grow, align top
- PairCards.css: cap image at 40dvh so card always fits on screen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove /languparent prefix from all API calls (routes are at /auth/* now)
- Align register/login token handling (JWT returned directly, no registration token)
- Feed rewritten to use new getFeedPairs endpoint with PairSentenceCard/YesNoCard/WordCard
- App.jsx: check language_native_id / language_target_id for profile completeness
- Profil.jsx: add logout button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
registerUser() returns { registrationToken } (10-Min JWT)
createProfile() sends it as X-Registration-Token header
userId nie mehr aus Browser-Body — kommt aus signiertem Token
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- directus.js: all calls now go to /languparent/* on api.hejyou.com
- Admin token and Directus URL no longer in the browser
- JWT issued by API server (30 days), stored in localStorage
- register: single call returns userId, profile step gets fresh JWT
- login: handles needsProfile flag (403) cleanly
- assetUrl: proxy via /languparent/assets/:fileId (no token in URL)
- .env.production: VITE_DIRECTUS_URL → VITE_API_URL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bake VITE_DIRECTUS_URL into production build via .env.production
so no Coolify build-arg configuration is needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>