- Possessives, pronouns, and Kontraktionen switch from typed input to the
same 4-choice tap grid as articles. Possessive choices all share the
question's stem; pronoun choices lead with the pronoun's own case forms.
- The translation line is hideable everywhere (shows by default, hidden
state persists like the other hints, revealed again on a wrong answer).
The possessive and pronoun hint lines get hide toggles too.
- Header: Charts moves out; One-tap becomes a pill — plain grey when off,
green outlined when on. More margin below the header across the board.
- Bottom bar: progress dots centered with 'n/10 · level name' underneath,
outlined Charts button (capital C) pinned bottom-right.
- Touch devices hide the 1-4/enter/esc keyboard chips; answer buttons keep
their full size via min-heights so tap targets stay big.
The ein-Wörter level reused sentence frames written for definite articles
and blindly swapped in the ein/eine table, producing non-German like
'trotz eines Wetters' and 'während einer Woche' while the English still
said 'the'.
- Nouns gain a noIndef flag (mass nouns: Wetter, Regen, Musik, Arbeit;
definite-idiom temporal/kinship nouns: Nacht, Woche, Vater, Mutter,
Bruder, Schwester, Tochter). They are never paired with an ein-word.
- Frames with a custom English determiner (nach → 'after school',
seit → 'since that week') are definite idioms and are skipped for
ein-word questions.
- genArticleQ redraws prepositions whose frames are entirely ruled out
(trotz has only mass nouns), instead of generating a bad sentence.
- Indefinite translations now use a/an to match the German article;
definite levels keep 'the'.
- Tests pin all of this down (75 passing).
- One-tap mode no longer shows the answer when you're right: a green tick
flashes and it skips straight to the next question. Wrong answers still
show the full correction and now wait for an explicit Next tap.
- Every tab (Prepositions, Articles, Possessives, Pronouns) gets its own
pinned Daily Practice card. Sessions mix questions from every lesson in
the tab via a shuffle-bag over lesson ids.
- Daily Practice is locked until every lesson in its section has been
passed (one full round at 70%); the locked card shows x/y progress.
- Finishing a daily session offers 'Continue: <section> Daily Practice'
cycling to the next tab with an unlocked daily, with play again and
back to menu as secondary options.
Every answer card now renders the complete 4×4 declension grid instead
of a single case row. The correct cell is highlighted green; on a wrong
answer, the cell matching what you typed is highlighted red, so you see
both your pick and the right one in context.
- FillFeedback (articles + possessives): full table, correct + wrong
highlighting within the noun's gender column.
- ChunkFeedback + ContractionFeedback: contraction questions now show
the definite-article table too, not just the fused answer.
- PronounFeedback: correct cell green, your wrong pick red.
- Daily Practice (all 31 prepositions) is pinned to the top of the
Prepositions tab once the "Alle Präpositionen" lesson is passed
(>=70% over a full round).
- One-tap mode: after answering, the app flashes right/wrong and
auto-advances. Always on in Daily Practice; a persisted "One-tap"
toggle in the practice header enables it for any other level.
New pseudo-level (id 10.5) that drills all 31 prepositions. App.jsx
pins it to the top of the Prepositions tab once the "Alle
Präpositionen" lesson is completed, and defaults it to one-tap mode.
- Remove the Nominativ level and drop nominative-case testing from mixed/
possessive/pronoun levels (nominative kept only in reference charts)
- Add persistent hide/show toggles on the two giveaway hint lines in
practice (noun gender, case/preposition info); state persists in localStorage
- De-spoil "Wechsel im Kontext": remove motion/location hint from answer
buttons; put sentence translation + preposition meaning behind a toggle
- Add a 7-day practice-history dot strip beside the streak counter
- Extend engine + tests (61 vitest tests)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Multi-stage build (node -> nginx) serving the Vite static output on
port 80, matching the dockerfile build pack used for other apps.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Vite + React app for daily German declension practice with
localStorage-backed progress. Includes Coolify deploy instructions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>