ShelfReader uses SwiftUI for navigation and editorial layout, with SceneKit for the physical shelf and book geometry.
- A reader imports a supported local document.
LibraryStorecopies it into the app container and derives bounded local metadata.- A
LibraryBookstores bibliographic identity, physical profile, theme, provenance, and reading progress. - The shelf and catalogue render different presentations of the same model.
- The detail view opens the local reading path and writes progress back through
LibraryStore.
BookMetadataRecognitionService handles one book per request. LibraryStore serializes requests so imports do not trigger concurrent OCR and network spikes. User-edited fields have higher provenance and must not be overwritten by automatic enrichment.
The optional provider does not own app state, render covers, or receive an entire library. Local validation and persistence remain separate steps.
BookshelfView owns SceneKit nodes, materials, lighting, gestures, inertia, selection, and haptics. SwiftUI views own navigation, accessibility, textual layout, settings, and sheets. This separation keeps high-frequency rendering state away from library persistence.