You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## Summary
Add a `none` page transition option for EPUB paged reading and thread
the transition flag through the native paged readers. Keep the footer
native, but drive it from `totalProgression` so it shows only a progress
bar instead of fabricated global page numbers.
Also expose the new reader overlay preferences in settings and update
contributor guidance so SwiftUI, UIKit, and AppKit can be chosen based
on platform fit rather than a hard SwiftUI bias.
## Scope
- EPUB paged transition options, including a no-animation mode
- Reader overlay preferences for status bar visibility and footer
progress
- Native EPUB footer progress bar on iOS and macOS
- Localization updates and AGENTS guidance cleanup
-**Persistence**: SwiftData for profiles/libraries/fonts/series/books/collections/read lists/dashboard caches, UserDefaults via `AppConfig`
169
169
-**Networking**: Centralized `APIClient` with feature-specific services
@@ -339,15 +339,15 @@ KMReader/
339
339
340
340
1.**Comments**: Minimal, in English only
341
341
2.**Commit messages**: Concise, clear, semantic format, in English
342
-
3.**SwiftUI over UIKit/AppKit**: Prefer SwiftUI exclusively
342
+
3.**UI framework choice**: SwiftUI, UIKit, and AppKit may all be used. Pick the approach that best fits the feature, platform APIs, and maintainability.
5.**No confirmationDialog**: Do not use confirmationDialog
345
345
6.**One type per file**: Every struct or class in a separate file
346
346
7.**@Observable over ObservableObject**: Use @Observable pattern for view models
347
347
8.**@AppStorage over UserDefaults**: In views use @AppStorage; elsewhere use AppConfig, UserDefaults is forbidden in files except AppConfig.swift
348
348
9.**Computed properties in view bodies**: Avoid stored variables in view bodies
349
349
10.**Platform differences**: Use `PlatformHelper` and `#if os(...)` blocks
350
-
11.**Direction rule (UI bridging)**: Allow `SwiftUI -> UIKit/AppKit`, but do not use `UIKit/AppKit -> SwiftUI` (`UIHostingController`/`NSHostingController`) for feature screens/components, because `UIHostingController`/`NSHostingController` does not inherit required SwiftUI environment values in this project.
350
+
11.**UI bridging discipline**: Interop between SwiftUI and UIKit/AppKit is allowed in either direction. Be explicit about dependency injection and verify environment/data propagation across hosting boundaries instead of assuming it will behave correctly.
351
351
12.**Object environment safety**: Do not use non-optional object-style environment dependencies (`@Environment(SomeType.self)`, `@EnvironmentObject`) in app code. Treat them as banned patterns. Pass object dependencies explicitly via initializers, context structs, or action closures. If environment lookup is still required, use a non-object custom `EnvironmentKey` or an optional lookup with controlled fallback/logging instead of crashing.
352
352
13.**No unchecked/unsafe APIs**: Do not use `@unchecked Sendable`, `nonisolated(unsafe)`, `unsafeBitCast`, or other `unsafe*` escape hatches in app code. Prefer safe ownership, actor boundaries, copying, or explicit wrappers. If a low-level API appears to require them, stop and redesign instead of introducing them.
353
353
14.**Strongly avoid patch-style fixes for structural problems**: When the current abstraction or ownership boundary is wrong, do not preserve it by stacking flags, delays, version counters, bridge layers, or special cases just to keep the diff small. Prefer the larger refactor that moves the code toward the final stable architecture.
0 commit comments