feat(web): Follow button + clickable artist in album modals

AlbumModal showed the artist name as static text — no way to follow the artist
or jump to them. Adds a Follow affordance (todo #13):

- AlbumInfo gains optional `artistMbid`. When present, the modal title links the
  artist name to /discover/artist/{mbid} and shows a Follow/Following button that
  reflects live follow state.
- Follow state fetched via a new lightweight GET /api/artists?mbid= check
  (avoids pulling the full watched list + discography); Follow reuses
  POST /api/artists. Non-ok POST surfaces a toast (also chips at todo #14).
- Wired artistMbid in the three discovery contexts where following is valuable:
  Discover, Discover artist preview, and Last.fm. Library/discography callers
  pass none (already-followed artists) so the button stays hidden — graceful.

web 152 tests (the ?mbid= follow-state check asserted), tsc + build clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan
2026-07-14 11:58:01 +02:00
parent 938b8f32f9
commit 17bed331a9
7 changed files with 86 additions and 6 deletions
+3
View File
@@ -194,6 +194,9 @@ nav.contents .sep { flex: 1; }
color: var(--graphite); background: transparent; border: 0; cursor: pointer; padding: 0;
}
.sign-out:hover { color: var(--accent); }
.modal-artist { display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.modal-artist a { color: inherit; text-decoration: none; border-bottom: 1.5px solid var(--rule-2); }
.modal-artist a:hover { border-bottom-color: var(--accent); color: var(--accent); }
/* ── Phase 2: page headers, list rows, tools ──────────── */
.page-head { margin: 6px 0 26px; }