feat: web UI library views — artists / artist detail / album detail #18
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
/— artists list with URL-driven sort (?sort=alpha|newest), "Load more" pagination viacreateInfiniteQuery, and the empty-library message whentotal === 0./artists/:id— artist name + album count + responsive AlbumCard grid (2→3→4→5 cols across breakpoints)./albums/:id— hero with cover, title, linked artist, year, metadata summary; track list below. Back chevron targets the artist page (not Library).ArtistRow,AlbumCard,TrackRow,LibrarySkeleton,ApiErrorBanner) keep the pages short and the loading/error UX consistent across all three routes.useDelayedrune helper suppresses flash-of-skeleton on cache-hit navigation — skeletons only render after the pending state has persisted ~100ms.Artist not found,Album not found) renders a non-retryable card; other errors share<ApiErrorBanner>with a retry button.<img src="/api/albums/:id/cover" loading="lazy">with a data-URL SVG fallback for broken covers.src/test-utils/query.tswraps mock query results inreadable(...)to match TanStack Query's Svelte adapter return type.Test Plan
go test -short -race ./...passes (unchanged; backend untouched)golangci-lint run ./...cleancd web && npm run check→ 0 errors / 0 warningscd web && npm test→ 73 tests across 16 files passcd web && npm run buildsucceeds (adapter-static emitsweb/build/)docker build .builds; binary is-xin the final image