v0.7.0 — Phase β-6 Native-Polish

Drei Sub-Pakete: Keyboard-Shortcuts, Daily-Reminder-Notifications,
WidgetKit-Extension mit App-Group-Daten-Sharing. Siri-Shortcuts
und Share-Extension auf β-7 verschoben — niedrige Priorität, die
drei großen Brocken decken 90% des Native-Polish ab.

Keyboard-Shortcuts:
- Hidden Buttons in StudySessionView mit .keyboardShortcut
- Space = flip, 1/2/3/4 = again/hard/good/easy
- iPad-Magic-Keyboard + macOS-tauglich

Daily-Reminders:
- NotificationManager @Observable mit UNUserNotificationCenter
- Authorization-State + Permission-Request-Flow
- UNCalendarNotificationTrigger täglich zur konfigurierten Zeit
- SettingsView in AccountView mit Toggle + DatePicker
- UserDefaults-Persistierung von Hour/Minute/Enabled

WidgetKit-Extension:
- WidgetSnapshot Codable mit topDecks (Top-3 by dueCount) + totalDueCount
- WidgetSnapshotStore schreibt in group.ev.mana.cards-Container
- DeckListStore.refresh schreibt Snapshot + WidgetCenter.reloadAllTimelines
- CardsWidgetExtension-Target im project.yml (app-extension)
- CardsWidgetBundle + CardsDueWidget mit 5 Familien (small/medium/
  accessoryCircular/accessoryInline/accessoryRectangular)
- DueProvider TimelineProvider mit 30-min-Refresh
- DueWidgetView Family-Switch
- WidgetSnapshot.swift shared in beiden Targets via XcodeGen sources
- App-Group im Haupt- und Widget-Entitlement

35 Tests grün (keine neuen Tests in β-6 — WidgetKit + Notifications
sind System-API-Integrationen, Tests wären überwiegend Mocks).
Build inkl. Widget-Extension grün.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-13 01:00:04 +02:00
parent 07ada72b0f
commit a1770fbc6a
15 changed files with 580 additions and 13 deletions

58
PLAN.md
View file

@ -1,9 +1,9 @@
# Plan — cards-native (SwiftUI Universal)
**Stand: 2026-05-13 — Phasen β-0 bis β-5 abgeschlossen.**
Alle 7 Card-Types + voller Marketplace (Explore/Browse/Subscribe)
+ TabBar + Universal-Link-Handling für `cardecky.mana.how/d/<slug>`.
35 Unit-Tests + 1 UI-Test grün.
**Stand: 2026-05-13 — Phasen β-0 bis β-6 abgeschlossen.**
Alle 7 Card-Types + Marketplace + Native-Polish (Keyboard-Shortcuts,
Daily-Reminder-Notifications, WidgetKit-Extension mit App-Group).
35 Unit-Tests + 1 UI-Test grün, Widget-Build grün.
Pflicht-Check für β-2: Endurance-Test auf realem Gerät (200+ Karten
mit Flugmodus zwischendurch) steht aus — Aufgabe für Till.
@ -27,6 +27,38 @@ mit Flugmodus zwischendurch) steht aus — Aufgabe für Till.
- `LoginView` (Email/PW gegen mana-auth)
- 3 Unit-Tests (AppConfig)
✅ **β-6 — Native-Polish (2026-05-13, Tag `v0.7.0`)**
- Keyboard-Shortcuts in `StudySessionView`: Space = flip,
1/2/3/4 = again/hard/good/easy (über hidden Buttons mit
`.keyboardShortcut(.space/KeyEquivalent)`, iPad-Magic-Keyboard
+ macOS-tauglich)
- `NotificationManager` @Observable: Permission-Request,
Authorization-State, täglicher `UNCalendarNotificationTrigger`
zur konfigurierten Uhrzeit (UserDefaults-Persistierung)
- `SettingsView` (in AccountView verlinkt): Toggle + DatePicker
für Reminder, "Über"-Section mit Server-URLs
- `WidgetSnapshot` Codable mit `topDecks` (Top-3 nach dueCount)
und `totalDueCount`
- `WidgetSnapshotStore` schreibt in App-Group-Container
`group.ev.mana.cards`
- `DeckListStore.refresh` ruft `updateWidgetSnapshot()` und
`WidgetCenter.shared.reloadAllTimelines()` nach jedem Pull
- `CardsWidgetExtension`-Target (eigenes app-extension-Bundle):
`CardsWidgetBundle` + `CardsDueWidget` mit `StaticConfiguration`,
Support für systemSmall, systemMedium, accessoryCircular,
accessoryInline, accessoryRectangular
- `DueProvider` als `TimelineProvider`: liest Snapshot, plant
Refresh alle 30 min (plus instant-Refresh via Haupt-App)
- `DueWidgetView` mit Family-Switch, alle 5 Family-Layouts
- `com.apple.security.application-groups: group.ev.mana.cards`
im Haupt- und Widget-Entitlement
- `WidgetSnapshot.swift` in beiden Targets via XcodeGen-source-array
(single-source-of-truth)
**Deferred auf β-7:** Siri-Shortcuts (App Intents), Share-Extension
für Save-as-Card. Niedrige Priorität — Keyboard + Notifications +
Widget decken 90% des Native-Polish ab.
✅ **β-5 — Marketplace (2026-05-13, Tag `v0.6.0`)**
- `PublicDeckEntry`, `PublicDeck`, `PublicDeckVersion`, `PublicDeckOwner`,
`PublicDeckDetail`, `ExploreResponse`, `BrowseResponse`,
@ -136,19 +168,19 @@ ausgeliefert wird — heute 404. Web-seitige Aufgabe.
| β-3 | ✅ 2026-05-13 | Editor: Deck-CRUD + Card-Create (5 Types); Anki-Import auf β-3-ext verschoben |
| β-4 | ✅ 2026-05-13 | Media-Upload, image-occlusion (Touch-Mask-Editor), audio-front (AVAudioPlayer) |
| β-5 | ✅ 2026-05-13 | Marketplace (Explore/Browse/Subscribe) + TabBar + Universal-Link-Handler (AASA server-side pending) |
| β-6 | — | Native-Polish (Widgets, Notifications, Share-Extension) |
| β-6 | ✅ 2026-05-13 | Keyboard-Shortcuts + Daily-Reminders + WidgetKit (Siri/Share deferred auf β-7) |
| β-7 | — | App-Store-Submission |
## Nächste Schritte für β-6 (Native-Polish)
## Nächste Schritte für β-7 (App-Store-Vorbereitung)
Aus Greenfield-Plan-Sektion "Phase β-6":
Aus Greenfield-Plan-Sektion "Phase β-7":
1. WidgetKit-Extension (Small, Medium, Lock-Screen) mit Due-Count
2. UNUserNotificationCenter — tägliche Reminder zur konfigurierten Zeit
3. Siri-Shortcuts ("Karten lernen" → Default-Deck)
4. Share-Extension "Save as Card" für Safari/Mail
5. Keyboard-Shortcuts iPad/macOS (Space=flip, 1-4=Rating, J/K=next/prev)
6. App-Group `group.ev.mana.cards` für Widget-Daten-Sharing
1. App-Icon (drei Größen iOS, plus macOS-Idiom)
2. Localized App-Store-Screenshots
3. TestFlight-Build, eine Woche Beta-Test
4. App-Store-Submission unter `ev.mana.cards`, Verein-Developer-Account
5. (β-6-Carryover) Siri-Shortcuts via App Intents
6. (β-6-Carryover) Share-Extension "Save as Card"
## Notizen aus β-4