Add two useful ways to order the current subject's books: by author and by the OpenLibrary rating. ## Tasks - [ ] Extend `src/api/openLibrary.ts` so the existing subject search requests `ratings_average` and `ratings_count` together with the current book fields; do not add a second request or change the number of fetched books - [ ] Extend `Book` and `OpenLibrarySearchDoc` in `src/types.ts` with optional rating data, mapping missing values safely to `null` - [ ] Show each book's average rating and rating count in `src/components/BookCard.tsx` whenever OpenLibrary provides rating data, rounding the average to one decimal - [ ] Do not render an empty or misleading rating row when a book has no rating data; show rating data regardless of the selected sort option - [ ] Add `Author A-Z` and `Highest rated` to the existing `SortOption` values and `SORT_OPTIONS` in `src/utils/sortBooks.ts` - [ ] Sort author names alphabetically using the first listed author; books without an author go after books with an author - [ ] Sort highest-rated books by `ratings_average` descending; for equal ratings, use `ratings_count` descending before keeping the original order - [ ] Keep books with missing rating data at the end of the highest-rated result, without hiding them - [ ] Keep sorting entirely client-side so changing a sort option does not make another OpenLibrary request - [ ] Update the MSW fixture data in `src/test/handlers.ts` and the affected sort/select tests with representative rating values, ties, and missing values - [ ] Preserve the selected sort through the existing `t19.preferences` sessionStorage behavior ## Acceptance criteria - [ ] The sort control offers `Author A-Z` and `Highest rated` in addition to the existing title and publication-year options - [ ] Selecting either new option reorders the already-loaded books without an additional network request - [ ] `Author A-Z` orders by first author name and handles a book without author data predictably - [ ] `Highest rated` orders highest average rating first; an equal score with more ratings comes first - [ ] A book with no rating remains visible and is placed after rated books - [ ] Every rated book clearly shows `Rating: X.X / 5 (N ratings)` regardless of the selected sort option - [ ] A book without rating data does not show a misleading rating placeholder - [ ] The selected new sort option is restored after a page reload in the same browser session - [ ] MSW-backed tests cover both new sort modes and never call the real OpenLibrary API - [ ] `npm run format:check` / `npm run lint` / `npm test` / `npm run build` pass Branch `feat/<n>-author-rating-sorting` from main. Part of M4.