Files
libnovel/ios/LibNovelV2/features.md
Admin 7413313100
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
fix: update integration_test.go to match server.New signature (version, commit args)
2026-03-14 14:25:46 +05:00

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