diff --git a/web/src/lib/components/QueueDrawer.test.ts b/web/src/lib/components/QueueDrawer.test.ts
index ec82c755..c9b81cfa 100644
--- a/web/src/lib/components/QueueDrawer.test.ts
+++ b/web/src/lib/components/QueueDrawer.test.ts
@@ -25,10 +25,12 @@ vi.mock('$lib/player/store.svelte', () => ({
get queueDrawerOpen() { return openValue; }
},
// QueueTrackRow imports these from the store; provide stubs so its
- // module-load doesn't break when QueueDrawer renders rows.
+ // module-load doesn't break when QueueDrawer renders rows. QueueList
+ // imports clearQueue for its header action.
playFromQueueIndex: vi.fn(),
removeFromQueue: vi.fn(),
- moveQueueItem: vi.fn()
+ moveQueueItem: vi.fn(),
+ clearQueue: vi.fn()
}));
import QueueDrawer from './QueueDrawer.svelte';
diff --git a/web/src/lib/components/QueueList.svelte b/web/src/lib/components/QueueList.svelte
index 1fb2dd48..cc223183 100644
--- a/web/src/lib/components/QueueList.svelte
+++ b/web/src/lib/components/QueueList.svelte
@@ -1,7 +1,7 @@
-
+
Queue
@@ -54,20 +87,33 @@
{#if player.queue.length > 0} · {totalDurationLabel(player.queue)}{/if}
- {#if onClose}
-
- {/if}
+
+ {#if player.queue.length > 0}
+
+ {/if}
+ {#if onClose}
+
+ {/if}
+
-
+
{#if player.queue.length === 0}
No tracks queued.
{:else}
@@ -76,4 +122,17 @@
{/each}
{/if}
+
+ {#if active && player.queue.length > 0 && !currentInView}
+
+ {/if}
diff --git a/web/src/lib/player/store.svelte.ts b/web/src/lib/player/store.svelte.ts
index 1e41432b..031f8c70 100644
--- a/web/src/lib/player/store.svelte.ts
+++ b/web/src/lib/player/store.svelte.ts
@@ -505,6 +505,21 @@ export function removeFromQueue(idx: number): void {
_error = null;
}
+// Clear the whole queue and stop playback — mirrors removeFromQueue's
+// empty-queue branch. Also drops the radio/system source + self-heal closure
+// so the emptied player doesn't try to refill from a now-irrelevant source.
+export function clearQueue(): void {
+ _queue = [];
+ _index = 0;
+ _state = 'idle';
+ _position = 0;
+ _duration = 0;
+ _error = null;
+ _radioSeedId = null;
+ _queueSource = null;
+ _queueRefetch = null;
+}
+
export function playFromQueueIndex(idx: number): void {
if (idx < 0 || idx >= _queue.length) return;
_radioSeedId = null;