Data hook + the one place everything gets wired together. ## Tasks - [x] `src/hooks/useBooks.ts`: `useQuery` keyed `['books', subject]` calling `searchBooksBySubject` (from #4); expose `{ books, isLoading, isError }` - [x] App integration: temporary hardcoded subject (e.g. 'fantasy', marked with a TODO for M3), current-index state in `App`, loading/error/empty states in plain accessible HTML - [x] Wire `BookCard` (#11), `NavigationControls` (#13), `BookJumpList` (#14) — the wiring lands after those merge to avoid App.tsx conflicts; the hook itself is parallel-safe - [x] Tests with msw: renders first book, navigation changes displayed book, jump selection works, and **fetch count stays 1** while navigating (no unnecessary API calls — graded criterion) ## Acceptance criteria - [x] `npm run lint` / `npm test` / `npm run build` pass - [x] No manual `useEffect` fetching — TanStack Query only Part of M2 — Core app (due Tue 8/9). Branch `feat/<n>-use-books` from main after PR #3 merges.