7da98d786c
Add SRS-driven noun and adjective flashcards modeled on the existing verb flashcard flow: - SharedModels/Lexeme — catalog of non-verb vocab, frequency-ranked, with gender for nouns and optional example sentences. Seeded from a bundled vocab_lexemes.json built by Scripts/vocab/build_lexemes.py, which joins frequency.csv + es-en.data from a pinned doozan/spanish_data commit (CC-BY-SA: hermitdave/FrequencyWords + Wiktionary). 1,449 nouns and 600 adjectives, each with Wiktionary-sourced gender and (where available) an example sentence with English translation. - LexemeReviewCard + LexemeReviewStore — cloud-synced SM-2 SRS, keyed by partOfSpeech + lexemeId + drillMode so future drill modes can coexist. - LexemeSessionQueue + LexemePool — parallel to VocabSessionQueue; fresh cards sort by frequency rank. - LexemeStudyGroup — cloud-synced resumable session per (partOfSpeech, drillMode). - NounFlashcardPracticeView + AdjectiveFlashcardPracticeView — same flow as VocabFlashcardPracticeView: English prompt → tap to reveal Spanish → Again/Hard/Good/Easy. Nouns reveal with their article (la taza, el problema) so gender is taught alongside meaning, not as a separate quiz. Example sentence shown when present. CEFR-style level toggles: - LexemeLevel enum (A1/A2/B1/B2/C1+) derived from frequencyRank with standard Spanish-frequency-dictionary cutoffs (250/500/1000/2000). - UserProgress.selectedLexemeLevels — cloud-synced multi-select, defaults to A1+A2 on first launch. - SettingsView gains a "Vocabulary Levels" section with five toggles; the existing "Levels" section is renamed "Verb Levels" for clarity. - Due SRS cards always surface regardless of toggles. Disabling a level only stops new cards from that band entering the pool. PracticeView gets "Nouns" and "Adjectives" rows under "Books". DataLoader: new lexemeDataVersion gate that re-seeds the Lexeme table from vocab_lexemes.json independent of book seeding. project.yml lists the new JSON resource and the existing book_olly-vol2.json (which the previous build was silently excluding because xcodegen rewrote the project from project.yml). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
120 lines
3.2 KiB
YAML
120 lines
3.2 KiB
YAML
name: Conjuga
|
|
options:
|
|
bundleIdPrefix: com.conjuga
|
|
deploymentTarget:
|
|
iOS: "26.0"
|
|
xcodeVersion: "26.0"
|
|
schemePathPrefix: ""
|
|
generateEmptyDirectories: true
|
|
|
|
schemes:
|
|
Conjuga:
|
|
build:
|
|
targets:
|
|
Conjuga: all
|
|
ConjugaWidgetExtension: all
|
|
run:
|
|
config: Debug
|
|
executable: Conjuga
|
|
test:
|
|
config: Debug
|
|
profile:
|
|
config: Release
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|
|
|
|
packages:
|
|
SharedModels:
|
|
path: SharedModels
|
|
YouTubeKit:
|
|
url: https://github.com/alexeichhorn/YouTubeKit.git
|
|
from: 0.3.0
|
|
|
|
settings:
|
|
base:
|
|
SWIFT_VERSION: "6.0"
|
|
CURRENT_PROJECT_VERSION: 1
|
|
MARKETING_VERSION: 1.0.0
|
|
|
|
targets:
|
|
Conjuga:
|
|
type: application
|
|
platform: iOS
|
|
sources:
|
|
- path: Conjuga
|
|
excludes:
|
|
- "*.json"
|
|
- path: Conjuga/conjuga_data.json
|
|
buildPhase: resources
|
|
- path: Conjuga/course_data.json
|
|
buildPhase: resources
|
|
- path: Conjuga/reflexive_verbs.json
|
|
buildPhase: resources
|
|
- path: Conjuga/youtube_videos.json
|
|
buildPhase: resources
|
|
- path: Conjuga/textbook_data.json
|
|
buildPhase: resources
|
|
- path: Conjuga/textbook_vocab.json
|
|
buildPhase: resources
|
|
- path: Conjuga/book_olly-vol2.json
|
|
buildPhase: resources
|
|
- path: Conjuga/vocab_lexemes.json
|
|
buildPhase: resources
|
|
info:
|
|
path: Conjuga/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: Conjuga
|
|
LSApplicationCategoryType: public.app-category.education
|
|
UILaunchScreen: {}
|
|
UIBackgroundModes:
|
|
- fetch
|
|
- remote-notification
|
|
BGTaskSchedulerPermittedIdentifiers:
|
|
- com.conjuga.app.refresh
|
|
UISupportedInterfaceOrientations:
|
|
- UIInterfaceOrientationPortrait
|
|
UISupportedInterfaceOrientations~ipad:
|
|
- UIInterfaceOrientationPortrait
|
|
- UIInterfaceOrientationPortraitUpsideDown
|
|
- UIInterfaceOrientationLandscapeLeft
|
|
- UIInterfaceOrientationLandscapeRight
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app
|
|
CODE_SIGN_ENTITLEMENTS: Conjuga/Conjuga.entitlements
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
ENABLE_DEBUG_DYLIB: NO
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
TARGETED_DEVICE_FAMILY: "1,2"
|
|
DEVELOPMENT_TEAM: V3PF3M6B6U
|
|
CODE_SIGN_STYLE: Automatic
|
|
dependencies:
|
|
- target: ConjugaWidgetExtension
|
|
- package: SharedModels
|
|
- package: YouTubeKit
|
|
|
|
ConjugaWidgetExtension:
|
|
type: app-extension
|
|
platform: iOS
|
|
sources:
|
|
- path: ConjugaWidget
|
|
info:
|
|
path: ConjugaWidget/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: Conjuga Widget
|
|
NSExtension:
|
|
NSExtensionPointIdentifier: com.apple.widgetkit-extension
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app.widget
|
|
CODE_SIGN_ENTITLEMENTS: ConjugaWidget/ConjugaWidget.entitlements
|
|
DEVELOPMENT_TEAM: V3PF3M6B6U
|
|
CODE_SIGN_STYLE: Automatic
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
TARGETED_DEVICE_FAMILY: "1,2"
|
|
ENABLE_DEBUG_DYLIB: NO
|
|
dependencies:
|
|
- package: SharedModels
|