cards-native/Sources/Core/Domain
Till JS 505aa9db19 feat(study): Typing-Karten + Levenshtein-Match-Logik
CardRenderer für typing ist nicht mehr Placeholder. Web-Vorbild:
TypingView.svelte + cards-domain/typing.ts.

Typing.swift (Sources/Core/Domain/):
- check(input:answer:aliases:) → TypingMatch (correct/close/wrong)
- Normalisierung: trim + lowercase + NFD-Decomp + Combining-Marks
  strippen (Diakritika: ä → a)
- Aliases-Support (Komma-getrennt aus card.fields["aliases"])
- Levenshtein-Threshold max(1, floor(len * 0.2)) → "close"

TypingCardView (Features/Study/):
- TextField mit Auto-Focus 0.15s nach onAppear, Return = Submit
- Submit-Button mit Return-Symbol + primary background
- Nach Submit: Badge (✓ Richtig / ≈ Fast / ✗ Falsch) + User-
  Eingabe in „…" Quotes + Divider + erwartete Antwort
- Haptic-Feedback: heavy bei correct, light bei close/wrong
- Reset on card.id change

TypingTests: 8 Tests für check() — exact, case+whitespace,
NFD-Umlauts, aliases, Levenshtein-close (Berln → Berlin),
empty-input, sowie Levenshtein-Helper-Sanity.

Build 8 → 9. 43 Tests grün (war 35).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:39:39 +02:00
..
Card.swift v0.3.0 — Phase β-2 Study-Loop 2026-05-13 00:16:11 +02:00
CardMutations.swift v0.4.0 — Phase β-3 Editor 2026-05-13 00:24:43 +02:00
Cloze.swift v0.3.0 — Phase β-2 Study-Loop 2026-05-13 00:16:11 +02:00
Deck.swift feat(study): Multiple-Choice-Karten gerendert 2026-05-13 17:34:07 +02:00
DeckMutations.swift v0.4.0 — Phase β-3 Editor 2026-05-13 00:24:43 +02:00
Marketplace.swift fix: PublicDeckOwner.pseudonym ist Bool, nicht String? 2026-05-13 15:46:20 +02:00
Media.swift v0.5.0 — Phase β-4 Media + Advanced Card-Types 2026-05-13 00:35:36 +02:00
Review.swift v0.3.0 — Phase β-2 Study-Loop 2026-05-13 00:16:11 +02:00
Typing.swift feat(study): Typing-Karten + Levenshtein-Match-Logik 2026-05-13 17:39:39 +02:00