6.8 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | must_haves | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| quick | 260329-ten | execute | 1 |
|
true |
|
Purpose: Currently runDiscoverPhase() skips space entirely (if (key === " ") continue). During practice, space appears as the ␣ symbol (U+2423), but the child has never seen this symbol explained. This is confusing for a 7-year-old.
Output: Modified discover phase that includes a special step for the space bar.
<execution_context> @.planning/quick/260329-ten-leertaste-symbol-in-entdecken-phase-erkl/260329-ten-PLAN.md </execution_context>
@src/ui/screens.ts (main file to modify — discover phase at ~line 356-422) @src/companion/fallbacks.ts (has existing space fallback text at line 98-101) @src/companion/companion.ts (getLetterIntro function — generates intro text via AI or fallback) @src/game/keyboard.ts (space key rendering — line 93, 101) Task 1: Add space bar discover step in runDiscoverPhase src/ui/screens.ts In `runDiscoverPhase()` (around line 361-417), replace the space-skipping logic with a dedicated space discover step.Current code (line 363):
if (key === " ") continue; // Skip space in discover
Replace with a special branch for space that:
-
Instead of
continue, checkif (key === " ")and handle it specially (do NOT skip it). -
For the companion text: call
getLetterIntro(characterType, "LEERTASTE", fingerDescriptions[" "]!, db)— but note the AI prompt uses the letter parameter as the key name. Since the existing fallback and AI both work with letter=" ", pass " " as the letter. However, the fallback text (line 98-101 in fallbacks.ts) already has a good explanation: "Die grosse Leertaste ganz unten drueckst du mit dem Daumen. Einfach druecken!"Actually, to keep it simple and avoid the AI generating something that doesn't mention the ␣ symbol, use a hardcoded intro text instead of calling getLetterIntro. Set:
companionText.textContent = "Siehst du die grosse Taste ganz unten? Das ist die Leertaste! Wenn du dieses Zeichen siehst: ␣ — dann drueckst du mit dem Daumen die Leertaste. Probier es aus!"; -
For the letter display area, show the ␣ symbol large (same as other letters use the
falling-letterclass), and add a small label underneath:letterArea.innerHTML = ""; const letterEl = document.createElement("div"); letterEl.className = "falling-letter"; letterEl.textContent = "\u2423"; // ␣ symbol letterArea.appendChild(letterEl); const labelEl = document.createElement("div"); labelEl.style.cssText = "text-align: center; font-size: 1.2rem; color: var(--text-secondary, #666); margin-top: 0.5rem; font-family: 'Quicksand', sans-serif;"; labelEl.textContent = "Leertaste"; letterArea.appendChild(labelEl); -
Highlight and pulse the space key on the keyboard (same as other keys):
highlightKey(" "); const keyEl = document.querySelector('[data-key=" "]') as HTMLElement | null; if (keyEl) { keyEl.classList.add("keyboard__key--discover-pulse"); } -
Wait for the child to press the space bar (same pattern as other keys):
await new Promise<void>((resolve) => { function onKeyDown(e: KeyboardEvent): void { if (e.key !== " ") return; e.preventDefault(); pressKey(e.key); document.removeEventListener("keydown", onKeyDown); activeKeyDown = null; if (keyEl) { keyEl.classList.remove("keyboard__key--discover-pulse"); } resolve(); } if (activeKeyDown) { document.removeEventListener("keydown", activeKeyDown); } activeKeyDown = onKeyDown; document.addEventListener("keydown", onKeyDown); }); -
After the await, do NOT clear letterArea/companionText here — let the normal loop cleanup at end of function handle it (or the next iteration). Actually, the normal flow after the for-loop clears these on lines 420-421, so this is fine.
Important: Keep the space handling INSIDE the for-loop, as a special branch. The structure should be:
for (const key of levelDef.newKeys) {
if (cancelled) return;
if (key === " ") {
// Special space bar discover step (code from above)
// ... show companion text, show ␣ symbol, highlight key, wait for press
continue;
}
// Existing letter discover code stays unchanged
const fingerDesc = fingerDescriptions[key] || "ein Finger";
// ... rest of existing code
}
This way the space is processed BEFORE the continue, shown to the child, and then the loop continues to clean up naturally. cd /home/dev/workspace/zauberwald && npx vitest run --reporter=verbose 2>&1 | tail -20 - Level 1 discover phase no longer skips space - Space bar step shows the ␣ symbol with "Leertaste" label underneath - Companion explains what the symbol means in child-friendly German - Space key pulses on keyboard during the discover step - Child must press space bar to continue - All existing tests still pass
1. Run existing tests: `npx vitest run` — all pass 2. Manual: Start level 1 lesson. In the discover phase, after F and J are introduced, the space bar step should appear showing ␣ with explanation text. Pressing space advances past it. 3. In the following practice phase, when ␣ appears as a target, the child already knows what it means.<success_criteria>
- The ␣ symbol and "Leertaste" concept are introduced in the discover phase before they appear in practice
- The discover step follows the same UX pattern as letter discover steps (companion text + visual + keyboard highlight + press to confirm)
- No regressions in existing tests </success_criteria>