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
2 changed files with 37 additions and 14 deletions
Showing only changes of commit 066616e196 - Show all commits
+27 -11
View File
@@ -1,9 +1,10 @@
<script lang="ts"> <script lang="ts">
import { Plus } from 'lucide-svelte';
import type { TrackRef } from '$lib/api/types'; import type { TrackRef } from '$lib/api/types';
import { playQueue, enqueueTrack } from '$lib/player/store.svelte'; import { playQueue, enqueueTrack } from '$lib/player/store.svelte';
import { FALLBACK_COVER, coverUrl } from '$lib/media/covers'; import { FALLBACK_COVER, coverUrl } from '$lib/media/covers';
import TrackMenu from './TrackMenu.svelte'; import TrackMenu from './TrackMenu.svelte';
import CardActionCluster from './CardActionCluster.svelte'; import LikeButton from './LikeButton.svelte';
// Horizontal compact track row — cover thumb on the left, title + // Horizontal compact track row — cover thumb on the left, title +
// artist on the right. Mirrors Android's CompactTrackTile so the // artist on the right. Mirrors Android's CompactTrackTile so the
@@ -42,7 +43,7 @@
type="button" type="button"
aria-label={`Play ${track.title}`} aria-label={`Play ${track.title}`}
onclick={onClick} onclick={onClick}
class="flex w-full items-center gap-2 rounded-md p-1 pr-12 text-left class="flex w-full items-center gap-2 rounded-md p-1 pr-24 text-left
hover:bg-surface-hover focus-visible:ring-2 focus-visible:ring-accent" hover:bg-surface-hover focus-visible:ring-2 focus-visible:ring-accent"
> >
<div class="h-12 w-12 flex-shrink-0 overflow-hidden rounded bg-surface-hover"> <div class="h-12 w-12 flex-shrink-0 overflow-hidden rounded bg-surface-hover">
@@ -59,14 +60,29 @@
<div class="truncate text-xs text-text-secondary">{track.artist_name}</div> <div class="truncate text-xs text-text-secondary">{track.artist_name}</div>
</div> </div>
</button> </button>
<CardActionCluster <!-- Single inline cluster, vertically centred on the right. The shared
likeEntityType="track" CardActionCluster splits Like+Add (top) and the menu (bottom) into
likeEntityId={track.id} opposite corners — correct for the tall square Album/Artist cards but
onAdd={onAddToQueue} it makes the two groups collide on this short one-line row. A compact
addLabel={`Add ${track.title} to queue`} row keeps all three controls in one horizontal group instead. -->
<!-- svelte-ignore a11y_click_events_have_key_events -->
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div
class="absolute right-2 top-1/2 z-10 flex -translate-y-1/2 items-center gap-0.5
opacity-0 transition-opacity duration-150
group-hover:opacity-100 focus-within:opacity-100"
onclick={(e) => e.stopPropagation()}
> >
{#snippet menu()} <LikeButton entityType="track" entityId={track.id} size="sm" />
<TrackMenu {track} /> <button
{/snippet} type="button"
</CardActionCluster> aria-label={`Add ${track.title} to queue`}
onclick={onAddToQueue}
class="rounded-full bg-surface p-1 text-text-secondary hover:text-text-primary
focus-visible:ring-2 focus-visible:ring-accent"
>
<Plus size={16} strokeWidth={1} />
</button>
<TrackMenu {track} />
</div>
</div> </div>
+10 -3
View File
@@ -272,8 +272,12 @@
data-testid="player-bar-desktop" data-testid="player-bar-desktop"
class="hidden md:flex md:flex-row md:min-h-[108px] md:items-center md:gap-4 border-t border-border bg-surface md:px-4 md:py-1.5" class="hidden md:flex md:flex-row md:min-h-[108px] md:items-center md:gap-4 border-t border-border bg-surface md:px-4 md:py-1.5"
> >
<!-- Left: cover + title + artist + like + menu --> <!-- Left: cover + title + artist + like + menu.
<div class="flex w-72 min-w-0 items-center gap-3"> basis-72 grow max-w-md: holds its 288px floor at the md breakpoint
(where the seek column is the flex-1 that absorbs the remainder), but
on wider screens it grows up to 448px instead of leaving the title
truncated while the seek bar hogs the slack. -->
<div class="flex basis-72 grow max-w-md min-w-0 items-center gap-3">
<a <a
href="/now-playing" href="/now-playing"
aria-label="Open now playing" aria-label="Open now playing"
@@ -318,7 +322,10 @@
</button> </button>
</div> </div>
{:else} {:else}
<div class="flex flex-1 flex-col items-stretch gap-2"> <!-- max-w-xl + mx-auto caps the seek bar (and the transport row) at
576px and centres it, so on wide screens the extra width flows to
the title column on the left rather than stretching the scrubber. -->
<div class="flex flex-1 flex-col items-stretch gap-2 mx-auto w-full max-w-xl">
<!-- Transport row --> <!-- Transport row -->
<div class="flex items-center justify-center gap-3"> <div class="flex items-center justify-center gap-3">
<button <button