0b7d4a73ad
Practice tab restructured into three sections: - Conjugation: the 6 conjugation modes + the Common Tenses / Weak Verbs / Irregularity Drills focus buttons. - Vocabulary: new "Vocab Practice" entry (flashcard or multiple choice, deck-picker on entry) + the existing Vocab Review. - Reading: Stories, Books, Lyrics, Conversation, Listening, Cloze (moved here from the flat list). VocabPracticeEntryView lets the user pick any course/textbook deck (or "All decks") and a mode (Flashcard / Multiple Choice). Last-used choice is remembered via @AppStorage. VocabFlashcardPracticeView: Front shows the English meaning. Tap to reveal the Spanish word, example sentences from the card, an AI-generated illustration of the concept, and Again/Hard/Good/Easy rating buttons. SRS updates via the existing CourseReviewStore.rate() path. VocabMultipleChoicePracticeView: English prompt, 4 Spanish options. Distractors come from the same deck and prefer matching part-of-speech (via DictionaryService.lookup) — falls back to random when POS is unknown or the deck has fewer than 4 cards. After answer: reveal correct/incorrect, the Spanish word, examples, illustration, and the same rating buttons. VocabImageService wraps Apple Intelligence's ImageCreator (iOS 18.2+) for on-device illustration generation. Caches PNG results to disk under Caches/VocabImages keyed by SHA256(deck+ES+EN). In-flight dedup keeps concurrent requests for the same key sharing one task. Falls back to a placeholder UI when Apple Intelligence isn't available (older devices / disabled in Settings) — detected lazily on the first failed ImageCreator init. EN-first direction is enforced regardless of the underlying deck's isReversed flag, so the user sees the English-to-Spanish recall direction they asked for even when practising a reversed course deck. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>