One-tap grids everywhere, hideable translation/hints, cleaner top and bottom bars

- 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.
This commit is contained in:
2026-07-21 07:27:32 +00:00
parent 1444814062
commit f39db3cb86
3 changed files with 128 additions and 67 deletions
+17
View File
@@ -269,6 +269,23 @@ describe('pronoun questions', () => {
});
});
describe('one-tap choices on every question type', () => {
it.each([11, 12, 13, 14, 15, 16, 17, 19])('level %s: 4 unique choices containing the answer', (id) => {
for (const q of runSession(id, 200)) {
expect(q.choices.length).toBe(4);
expect(new Set(q.choices).size).toBe(4);
expect(q.choices).toContain(q.ans);
}
});
it('possessive choices all share the question stem', () => {
for (const q of runSession(13, 200)) {
const root = q.stem === 'euer' ? 'eu' : q.stem;
for (const c of q.choices) expect(c.startsWith(root), `${c} should be a form of ${q.stem}`).toBe(true);
}
});
});
// ── Nominative is never tested ──────────────────────────────
describe('no nominative anywhere', () => {