All checks were successful
CI / Scraper / Lint (push) Successful in 10s
CI / Scraper / Test (push) Successful in 14s
Release / Scraper / Test (push) Successful in 18s
CI / Scraper / Lint (pull_request) Successful in 18s
Release / UI / Build (push) Successful in 23s
CI / Scraper / Test (pull_request) Successful in 15s
CI / UI / Build (pull_request) Successful in 32s
Release / Scraper / Docker (push) Successful in 55s
CI / Scraper / Docker Push (pull_request) Has been skipped
CI / UI / Docker Push (pull_request) Has been skipped
CI / Scraper / Docker Push (push) Successful in 1m5s
Release / UI / Docker (push) Successful in 1m12s
iOS CI / Build (push) Successful in 4m18s
iOS CI / Build (pull_request) Successful in 4m25s
iOS CI / Test (push) Successful in 8m11s
iOS CI / Test (pull_request) Successful in 8m21s
2.7 KiB
2.7 KiB
LibNovel v2 iOS — Feature Tracker
Design reference: ui/src/routes/ (SvelteKit web UI)
All new code lives in ios/LibNovelV2/.
Status legend
- ✅ Done
- 🔨 In progress
- ⏳ Not started
Features
| # | Feature | Files | Status |
|---|---|---|---|
| 1 | Directory scaffold | ios/LibNovelV2/ tree |
✅ |
| 2 | Models | Models/Models.swift |
✅ |
| 3 | Networking | Networking/APIClient.swift |
✅ |
| 4 | Services | AuthStore, AudioPlayerService, AudioDownloadService, NetworkMonitor, BookVoicePreferences |
✅ |
| 4b | App entry + RootTabView + stub views | App/LibNovelV2App.swift, App/ContentView.swift, App/RootTabView.swift, Extensions/NavDestination.swift |
✅ |
| 5 | Auth / Login | Views/Auth/AuthView.swift |
✅ |
| 6 | Home screen | Views/Home/HomeView.swift, ViewModels/HomeViewModel.swift, Views/Common/CommonViews.swift |
✅ |
| 7 | Library screen | Views/Library/LibraryView.swift, ViewModels/LibraryViewModel.swift |
✅ |
| 8 | Browse / Discover | Views/Browse/BrowseView.swift, Views/Browse/BrowseCategoryView.swift, ViewModels/BrowseViewModel.swift |
✅ |
| 9 | Search | Views/Search/SearchView.swift, ViewModels/SearchViewModel.swift |
✅ |
| 10 | Book Detail | Views/BookDetail/BookDetailView.swift, ViewModels/BookDetailViewModel.swift |
✅ |
| 11 | Chapter Reader | Views/ChapterReader/ChapterReaderView.swift, ViewModels/ChapterReaderViewModel.swift |
✅ |
| 12 | Audio mini-player + full player | Views/Player/PlayerViews.swift |
✅ |
| 13 | Downloads screen | Views/Downloads/DownloadsView.swift |
✅ |
| 14 | Profile / Account | Views/Profile/ProfileView.swift, Views/Profile/VoiceSelectionView.swift |
✅ |
Design system recap
| Token | Value |
|---|---|
| Main bg | zinc-900 #18181b |
| Card bg | zinc-800 #27272a |
| Border | zinc-700 #3f3f46 |
| Primary text | zinc-100 #f4f4f5 |
| Secondary text | zinc-400 #a1a1aa |
| Accent / CTA | amber-400 #f59e0b |
Key patterns (quick ref)
- Cover images: always proxy via
/api/cover/{domain}/{slug} - Download keys:
slug::chapterN::voice(::separator — slugs contain-) - Voice fallback: book override → global default →
"af_bella" - Offline:
NetworkMonitorenv object +OfflineBannerat top of every networked view - Observable: new types use
@Observable; existing services useObservableObject - Navigation:
NavigationStack+NavDestinationenum +.appNavigationDestination() - Haptics:
.lightfor selection,.mediumfor primary actions - Animations:
.spring(response:dampingFraction:)for all interactive transitions