From b2d1a9ea100c0f0dc913dd48dde6f0f5993bdc83 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 10 May 2026 23:52:42 -0400 Subject: [PATCH 01/28] =?UTF-8?q?fix(web):=20compact=20PlayerBar=20?= =?UTF-8?q?=E2=80=94=203-column=20top=20row,=20full-width=20seek=20bottom?= =?UTF-8?q?=20(#358)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the kebab-with-popover PlayerOverflowMenu approach with all player controls visible inline. Operator's stated intent was "two-row layout with all controls visible," not "kebab hides shuffle/repeat/ queue/volume" — restructured to match. ### Compact view (below md) ┌─────────┬───────────┬───────────────────┐ │ art │ ♥ ⋮ │ 🔀 🔁 ☰ │ ← short sub-row │ title │ │ │ │ artist │ ⏮ ⏯ ⏭ │ volume slider │ ← play row at full size ├─────────┴───────────┴───────────────────┤ │ 0:42 ━━━━━●━━━━━━━━━━━━━━━━━━━━━━ 3:21 │ └─────────────────────────────────────────┘ - Column 1: cover + title/artist - Column 2: like+kebab on top sub-row, play controls (40/48/40) below - Column 3: shuffle/repeat/queue on top, volume slider below - Bottom: full-width seek slider with time labels ### Desktop view (md+) Existing 3-column layout preserved; only change is the redundant PlayerOverflowMenu kebab (which had been mounting at all widths) is no longer there. Volume + shuffle + repeat + queue stay inline in the right cluster as before. ### Cleanup - Deleted PlayerOverflowMenu.svelte + its test (no callers remain) - The TrackMenu kebab (per-track actions) stays — it's a varying list of actions that doesn't fit inline Co-Authored-By: Claude Opus 4.7 (1M context) --- web/src/lib/components/PlayerBar.svelte | 200 ++++++++++++++++-- .../lib/components/PlayerOverflowMenu.svelte | 97 --------- .../lib/components/PlayerOverflowMenu.test.ts | 31 --- 3 files changed, 182 insertions(+), 146 deletions(-) delete mode 100644 web/src/lib/components/PlayerOverflowMenu.svelte delete mode 100644 web/src/lib/components/PlayerOverflowMenu.test.ts diff --git a/web/src/lib/components/PlayerBar.svelte b/web/src/lib/components/PlayerBar.svelte index a3c90121..748b755d 100644 --- a/web/src/lib/components/PlayerBar.svelte +++ b/web/src/lib/components/PlayerBar.svelte @@ -15,7 +15,6 @@ import { FALLBACK_COVER, coverUrl } from '$lib/media/covers'; import LikeButton from './LikeButton.svelte'; import TrackMenu from './TrackMenu.svelte'; - import PlayerOverflowMenu from './PlayerOverflowMenu.svelte'; const current = $derived(player.current); @@ -29,7 +28,6 @@ player.repeat === 'all' ? 'Repeat all' : 'Repeat one' ); - // Volume icon tracks level so the right-edge anchor reads at a glance. const VolumeIcon = $derived( player.volume === 0 ? VolumeX : player.volume < 0.5 ? Volume1 : Volume2 @@ -49,9 +47,181 @@ {#if current} -
+ +
+ {#if player.state === 'error'} + + {:else} + +
+ + + +
+
{current.title}
+
{current.artist_name}
+
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + + +
+ +
+
+ + +
+ + {formatDuration(player.position)} + + + + {formatDuration(player.duration)} + +
+ {/if} +
+ + + {:else}
- +
- + {formatDuration(player.position)} - + {formatDuration(player.duration)}
{/if} - -