+
+
+
+
+
+
+
{formatDuration(player.position)}
@@ -95,56 +147,39 @@
{formatDuration(player.duration)}
-
-
-
-
-
+
+ class="flex h-9 w-9 items-center justify-center rounded-full transition-colors {player.shuffle
+ ? 'bg-accent-tint text-accent'
+ : 'text-text-secondary hover:bg-surface-hover hover:text-text-primary'}"
+ >
+
+
-
diff --git a/web/src/lib/components/TrackMenu.svelte b/web/src/lib/components/TrackMenu.svelte
index a57629bf..258c0c62 100644
--- a/web/src/lib/components/TrackMenu.svelte
+++ b/web/src/lib/components/TrackMenu.svelte
@@ -3,7 +3,15 @@
import FlagPopover from './FlagPopover.svelte';
import type { TrackRef } from '$lib/api/types';
- let { track }: { track: TrackRef } = $props();
+ let {
+ track,
+ direction = 'down'
+ }: {
+ track: TrackRef;
+ /** Whether the dropdown opens above the trigger ('up') or below ('down').
+ Pass 'up' when used near the bottom of the viewport (e.g. PlayerBar). */
+ direction?: 'up' | 'down';
+ } = $props();
let menuOpen = $state(false);
let popoverOpen = $state(false);
@@ -44,7 +52,7 @@
{#if menuOpen}
e.stopPropagation()}
>