From 72696424648b6d69c0645bdc3bd06af5a96f4b8f Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:12:34 -0600 Subject: [PATCH] fix: dropdown z-index and volume persistence - Fix Favorites Albums group dropdown appearing behind sidebar (z-index 10 -> 100) - Persist volume level to localStorage between sessions - Allow changing volume when nothing is playing (volume applies when playback starts) --- src/lib/components/views/FavoritesView.svelte | 2 +- src/lib/stores/playerStore.ts | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/lib/components/views/FavoritesView.svelte b/src/lib/components/views/FavoritesView.svelte index 35a9a87ce..67faf794e 100644 --- a/src/lib/components/views/FavoritesView.svelte +++ b/src/lib/components/views/FavoritesView.svelte @@ -1820,7 +1820,7 @@ border-radius: 8px; padding: 6px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); - z-index: 10; + z-index: 100; max-height: 260px; overflow-y: auto; scrollbar-width: thin; diff --git a/src/lib/stores/playerStore.ts b/src/lib/stores/playerStore.ts index 6cb88a562..d76449b46 100644 --- a/src/lib/stores/playerStore.ts +++ b/src/lib/stores/playerStore.ts @@ -68,11 +68,34 @@ interface PlaybackEvent { // ============ State ============ +/** + * Load persisted volume from localStorage + */ +function loadPersistedVolume(): number { + if (typeof localStorage === 'undefined') return 75; + const stored = localStorage.getItem('qbz-volume'); + if (stored) { + const parsed = parseFloat(stored); + if (!isNaN(parsed) && parsed >= 0 && parsed <= 100) { + return parsed; + } + } + return 75; +} + +/** + * Save volume to localStorage + */ +function persistVolume(vol: number): void { + if (typeof localStorage === 'undefined') return; + localStorage.setItem('qbz-volume', String(vol)); +} + let currentTrack: PlayingTrack | null = null; let isPlaying = false; let currentTime = 0; let duration = 0; -let volume = 75; +let volume = loadPersistedVolume(); let isFavorite = false; // Event listener state (replaces polling) let eventUnlisten: UnlistenFn | null = null; @@ -322,10 +345,13 @@ export async function seek(position: number): Promise { /** * Set volume (0-100) + * Always persists the volume, even when nothing is playing. + * The volume will be applied when playback starts. */ export async function setVolume(newVolume: number): Promise { const clampedVolume = Math.max(0, Math.min(100, newVolume)); volume = clampedVolume; + persistVolume(clampedVolume); notifyListeners(); try { @@ -334,9 +360,11 @@ export async function setVolume(newVolume: number): Promise { return; } + // Try to set volume on backend - will fail silently if no track is loaded await invoke('set_volume', { volume: clampedVolume / 100 }); } catch (err) { - console.error('Failed to set volume:', err); + // Ignore errors when nothing is playing - volume is saved and will apply on next play + console.debug('Volume set locally (no active playback):', clampedVolume); } }