andwati cd3a9eac70 Redesign bookshelf as a spine shelf + detail pages
Interaction/layout pattern is my own implementation, inspired by
observing (not copying source from) adammaj.com/reading: a horizontal
scrollable shelf of book "spines" above a list, click-through to a
per-book detail page where the shelf re-renders with that book's
spine expanded into a cover.

- src/lib/spine-color.ts: deterministic per-title color + width hash,
  so every book gets a distinct-looking spine without needing a
  manually-set color field.
- src/lib/cover-exists.ts: checks the referenced cover_image file
  actually exists under public/ before rendering an <img> — the ISBN/
  DOI cover lookup only runs on live Strapi create/update, so
  hand-seeded content (like our two placeholder books) has a
  cover_image path with no cached file yet. Falls back to the
  colored spine block instead of a broken image.
- src/components/BookSpines.astro: the shelf itself, reused on both
  the index and detail pages; a scroll button, hover-lift, and the
  active book's spine widens into its cover/fallback.
- Bookshelf index now renders full reviews inline (was previously
  just a bare metadata list) with cover thumbnails.
- New src/pages/bookshelf/[...slug].astro: first individual page
  route for bookshelf entries (portfolio still only has a list page).

Verified in-browser: shelf renders, hover/click navigation works,
active-book expansion on the detail page, and the cover-exists
fallback correctly avoids broken <img> tags for our two seed books.
2026-08-31 08:23:48 +03:00
2026-07-17 11:11:44 +03:00
2026-04-02 13:14:18 +03:00
2025-08-04 23:27:49 +03:00
2026-04-08 16:17:12 +03:00
2026-07-17 14:37:04 +03:00
2026-04-02 13:14:18 +03:00
2026-07-17 15:01:48 +03:00
2026-07-02 21:34:28 +03:00
S
Description
No description provided
Readme
14 MiB
Languages
TypeScript 92.4%
CSS 5.2%
Dockerfile 2.2%
JavaScript 0.2%