From 047454f23f5bc7968b02392b4ec31fcb74a86ad0 Mon Sep 17 00:00:00 2001 From: George Turkington Date: Thu, 17 Sep 2026 06:55:26 +0000 Subject: [PATCH] Wechsel im Kontext: blank the article, make the verb decide, add the rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The level showed the article already in the sentence ("unter dem Stuhl"), so it was answerable by recognising "dem" — it never tested wohin/wo at all. And the frame pool was tiny: one cat, one lamp, eight nouns. - The article is now blanked. The only evidence is the verb and whether it has a direct object, which is the actual skill. The solved sentence is revealed on answer, contracted where German really contracts (ins Regal, am Bahnhof), with a note naming the fusion. - Frames rebuilt around what decides the case: 27 new nouns, 18 new verbs, and every frame one-way so no verb+noun pairing licenses both readings. - Motion verbs now appear on the DATIVE side on purpose — schwimmen im See, tanzen in der Kueche, spielen auf der Strasse — because "is it moving?" is the wrong test and that is the main thing learners get wrong. - The put/be pairs are drilled properly: legen/liegen, stellen/stehen, setzen/sitzen, plus haengen and stecken, which keep the same present tense either way so only the direct object tells you. - ankommen added as the lexical exception: Dativ despite obvious arrival. - New "Wohin oder wo?" info panel: the rule, the before-and-after test, the movement trap, the verb-pair table and the exception. Reachable from the practice screen, from the answer feedback, and from Charts. - Feedback now explains the specific sentence rather than restating theory. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_017Uza6mhTpAvSwMQuFc4Cz8 --- src/App.jsx | 204 +++++++++++++++++++++++++++++++++++-------- src/engine.js | 210 ++++++++++++++++++++++++++++++++++++++------- src/engine.test.js | 71 ++++++++++++++- 3 files changed, 418 insertions(+), 67 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index a2526c7..588178f 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -183,6 +183,7 @@ export default function App() { const [ok, setOk] = useState(false); const [res, setRes] = useState([]); const [chart, setChart] = useState(false); + const [rule, setRule] = useState(false); const [learnStep, setLearnStep] = useState(0); const [st, setSt] = useState({sc:{},tc:0,ta:0,streak:0,ld:null}); const [access, setAccess] = useState(null); @@ -283,6 +284,7 @@ export default function App() { useEffect(() => { const h = e => { + if (rule) { if (e.key === 'Escape') setRule(false); return; } if (chart) { if (e.key === 'Escape') setChart(false); return; } if (scr === 'summary' && e.key === 'Enter') { e.preventDefault(); summaryRef.current?.(); return; } if (scr !== 'practice') return; @@ -640,30 +642,36 @@ export default function App() { {/* PRACTICE: wechsel in context */} {scr === 'practice' && q?.type === 'wechselContext' && ( -
-
{q.sentence}
- {(!hintHidden('translation') || rev) ? ( - <> -
- {q.translation} - {!rev && } -
-
- {q.prepKey} - ({PREPS[q.prepKey].en}) -
- - ) : ( - <> -
- -
-
- {q.prepKey} -
- - )} -
Wechselpräposition · motion or location?
+
+
+ {q.sentence.split('_____').map((part,i,a)=>( + + {part} + {i < a.length-1 && ( + + {rev ? q.article : ' '} + + )} + + ))} +
+ + + + + +
+ Wechselpräposition · wohin or wo? + +
{!rev ? (
@@ -678,7 +686,7 @@ export default function App() { ) : quickTick ? ( ) : ( - + setRule(true)}/> )}
)} @@ -772,7 +780,8 @@ export default function App() { {scr !== 'practice' && }
- {chart && setChart(false)}/>} + {chart && setChart(false)} onRule={()=>{ setChart(false); setRule(true); }}/>} + {rule && setRule(false)}/>}