Replaces the hardcoded subject in `App` with a user choice. ## Tasks - [ ] `SubjectFilter` component: accessible `<select>` with `<label>`, options from a shared hardcoded subject list (~6 subjects, e.g. Fantasy, Science Fiction, Mystery, History, Poetry, Philosophy) - [ ] Changing the subject re-queries books via `useBooks` and resets the current book to the first - [ ] Persist the chosen subject in `sessionStorage` under `t19.preferences` (JSON, shared with sorting: `{ "subject": ..., "sort": ... }`); restore on reload; tolerate missing/corrupt data (fall back to defaults) - [ ] Tests: subject change triggers exactly **one** new fetch (msw counter), reload restores the choice, corrupt JSON falls back to default ## Acceptance criteria - [ ] `npm run lint` / `npm test` / `npm run build` pass, jsx-a11y clean - [ ] No extra API calls beyond the subject change itself Branch `feat/<n>-subject-filter` from main. Part of M3 (due Fri 11/9).