50 lines
2.9 KiB
Markdown
50 lines
2.9 KiB
Markdown
# BookStax – Development Changelog
|
||
|
||
## Session 1
|
||
|
||
### Architecture & Foundation
|
||
- Full app architecture planned and implemented from scratch
|
||
- Target: iOS 26.2, Xcode 26, Swift 6, `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor`
|
||
- Models: `BookStackError`, all API DTOs (`ShelfDTO`, `BookDTO`, `ChapterDTO`, `PageDTO`, etc.), SwiftData cache models
|
||
- Services: `KeychainService` (actor), `ConnectivityMonitor` (@Observable), `BookStackAPI` (actor), `SyncService`
|
||
- ViewModels: `OnboardingViewModel`, `LibraryViewModel`, `SearchViewModel`, `PageEditorViewModel`
|
||
- Views: Full onboarding flow, library hierarchy, page reader (WebPage/WebView iOS 26), editor, search, settings, main tab view
|
||
- Localisation: English, German, Spanish (`Localizable.strings`)
|
||
- SwiftData model container, onboarding gate, Keychain credential loading wired in `bookstaxApp.swift`
|
||
|
||
---
|
||
|
||
## Session 2
|
||
|
||
### Bug Fixes
|
||
- **BookStackAPI filter syntax**: Fixed `book_id=X` → `filter[book_id]=X` for chapters and pages endpoints (BookStack API requirement)
|
||
- **Color picker in Settings not responding**: Added `.buttonStyle(.plain)` to swatch buttons inside `Form` (SwiftUI list button style conflict)
|
||
|
||
### Localisation
|
||
- **Search section fully translated**: Replaced all hardcoded English strings in `SearchView.swift` with `L()` keys
|
||
- **`ContentType.displayName`**: Changed from hardcoded English to `NSLocalizedString` (required because `nonisolated` structs can't call `@MainActor`-isolated `L()`)
|
||
- New localisation keys added to en/de/es: `search.loading`, `search.empty.title`, `search.empty.message`, `search.filter.all`, `search.type.page/book/chapter/shelf`
|
||
|
||
### Breadcrumb Navigation (Library)
|
||
- Added `BookInShelf` wrapper struct (Hashable) to carry shelf context through `NavigationStack`
|
||
- Added `Crumb` struct and `BreadcrumbBar` view (scrollable, tappable ancestor crumbs)
|
||
- Breadcrumbs embedded as first `Section` in `List` (prevents large title collapse that occurred with `.safeAreaInset`)
|
||
- `BooksInShelfView`: shows Library → Shelf crumbs, dismiss action on Library crumb
|
||
- `BookDetailView`: shows Library → Shelf → Book crumbs, new `shelfName: String?` parameter
|
||
- New `navigationDestination(for: BookInShelf.self)` in `LibraryView`
|
||
|
||
---
|
||
|
||
## Session 3
|
||
|
||
### App Icon
|
||
- Created three 1024×1024 app icon variants (light, dark, tinted) using provided artwork
|
||
- **Light** (`AppIcon.png`): isometric purple BookStax books on white background
|
||
- **Dark** (`AppIcon-dark.png`): same books on dark navy background (user-provided AI-generated image)
|
||
- **Tinted** (`AppIcon-tinted.png`): greyscale version of dark icon for iOS tinted icon mode
|
||
- `Contents.json` references all three variants with correct `luminosity` appearance entries
|
||
- Icon files also saved as standalone copies in `bookstax/bookstax/`
|
||
|
||
### Build Fix
|
||
- Fixed stray `t` character at top of `PageEditorView.swift` causing compile errors (`timport SwiftUI` → `import SwiftUI`)
|