Web UI: Most Played hover fix, narrower seek bar, Android-parity track kebab #99

Merged
bvandeusen merged 5 commits from dev into main 2026-06-14 22:26:52 -04:00
Owner

Web UI polish + kebab parity batch (all CI-green on dev):

  • Most Played cards — fix hover-control overlap on the compact rows (single inline right cluster instead of the corner-split that collided on the short row).
  • Desktop player — narrow the seek bar (capped + centred) and let the left info column grow, relieving title/artist truncation.
  • Track kebab → Android parity — surface "Start radio" (was only on TrackRow's inline button), reorder/de-duplicate to match Android's TrackActionsSheet, and mount the kebab on the full-screen /now-playing page.
  • Remove destructive kebab action — drop "Remove from library" and its orphaned path (RemoveTrackPopover + admin/tracks client); no single-click destructive action in the kebab. DELETE /api/admin/tracks/:id left intact for a future safer admin surface.

🤖 Generated with Claude Code

Web UI polish + kebab parity batch (all CI-green on dev): - **Most Played cards** — fix hover-control overlap on the compact rows (single inline right cluster instead of the corner-split that collided on the short row). - **Desktop player** — narrow the seek bar (capped + centred) and let the left info column grow, relieving title/artist truncation. - **Track kebab → Android parity** — surface "Start radio" (was only on `TrackRow`'s inline button), reorder/de-duplicate to match Android's `TrackActionsSheet`, and mount the kebab on the full-screen `/now-playing` page. - **Remove destructive kebab action** — drop "Remove from library" and its orphaned path (`RemoveTrackPopover` + `admin/tracks` client); no single-click destructive action in the kebab. `DELETE /api/admin/tracks/:id` left intact for a future safer admin surface. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 5 commits 2026-06-14 22:26:46 -04:00
CompactTrackCard is a short one-line row but reused CardActionCluster,
which corner-splits Like+Add (top) and the kebab menu (bottom). That split
is right for the tall square Album/Artist cards but makes the two groups
collide on the compact row's hover state. Give the compact card a single
inline, vertically-centred right cluster (Like + Add + menu in one group)
and widen its right padding reserve to match.

In the desktop PlayerBar, the left info column was a fixed w-72 (title kept
truncating) while the seek column was flex-1 (the scrubber hogged the slack
on wide screens). Let the left column grow up to max-w-md while holding its
288px floor at md, and cap the seek/transport column at max-w-xl centred, so
freed width flows to the title instead of stretching the bar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Radio was fully wired (playRadio → /api/radio + 80% auto-refresh) but its
only entry point was TrackRow's inline 📻 button, so it was unreachable from
the kebab — i.e. missing on the Most Played compact cards and the mini-player.
Add a "Start radio" item to TrackMenu, shown even under hideQueueActions since
reseeding a station from the current track is meaningful there.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bring the web TrackMenu to parity with Android's canonical TrackActionsSheet
so the kebab reads the same on both clients:
- Reorder to Android's groups: queue → like/add-to-playlist/start-radio →
  go-to-album/artist → hide.
- Drop the duplicate "Flag this track…" item — it opened the very same
  FlagPopover as "Hide" (Android folds flag into a single Hide).
- Align icons (ListVideo / ListMusic / ListPlus / Disc3 / User).
- Admin-only "Remove from library" stays as a web superset (Android has no
  surface for it), past its own divider.

Mount the kebab on the full-screen /now-playing route with hideQueueActions,
mirroring Android's NowPlayingScreen — Start radio / Add to playlist / Hide
were previously unreachable there (only like + volume + queue existed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The kebab gained "Start radio" and dropped the duplicate "Flag this track…"
(its action now lives solely under "Hide", which opens the same FlagPopover).
Net item count is unchanged (9 admin / 8 non-admin), but the named-item and
flag-entry assertions needed updating:
- mock playRadio in the store mock; assert Start radio dispatches playRadio.
- swap the flag-item presence check for start-radio.
- replace the "click Flag" test with "click Hide opens the popover".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
No single-click destructive action belongs in the kebab. Removing the item
orphaned its whole path (RemoveTrackPopover was its only caller, and the
admin/tracks API client was the popover's only caller), so per the repo's
no-dead-code convention the chain is fully removed: the menu item + its
admin/isAdmin plumbing in TrackMenu, RemoveTrackPopover(.svelte/.test),
src/lib/api/admin/tracks(.ts/.test), and the now-needless transitive mocks
in the CompactTrackCard / PlaylistTrackRow / playlist specs.

The kebab is now an 8-item, admin-agnostic menu. The DELETE /api/admin/tracks
server endpoint is untouched — a future safer admin surface can rebind it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit eeabdf1f2c into main 2026-06-14 22:26:52 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/minstrel#99