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
58 lines
2.7 KiB
Markdown
58 lines
2.7 KiB
Markdown
# 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**: `NetworkMonitor` env object + `OfflineBanner` at top of every networked view
|
|
- **Observable**: new types use `@Observable`; existing services use `ObservableObject`
|
|
- **Navigation**: `NavigationStack` + `NavDestination` enum + `.appNavigationDestination()`
|
|
- **Haptics**: `.light` for selection, `.medium` for primary actions
|
|
- **Animations**: `.spring(response:dampingFraction:)` for all interactive transitions
|