Added
- System Tray (requested by @jackbot and @thecyanide): Functional tray icon with context menu — Play / Pause, Previous Track, Next Track, Show / Hide, and Exit Psysonic. Left-clicking the tray icon toggles window visibility. The tray icon is built via
TrayIconBuilderin Rust so menu events are properly wired. - Minimize to Tray (requested by @jackbot and @thecyanide): New toggle in Settings → Behavior. When enabled, closing the window hides it to the tray instead of exiting. The close button behaviour is intercepted in Rust (
prevent_close+window:close-requestedevent) and the JS side decides hide vs. exit based on the user setting. - Sidebar Customization (requested by @lighthous3d): New section in Settings → Appearance. All library and system nav items can be shown/hidden via a toggle switch and reordered by dragging the grip handle. Order and visibility are persisted across sessions (
psysonic_sidebarin localStorage). Fixed items (Now Playing, Settings) are listed as non-configurable below the list. - Playlist cover art: Playlist cards on the Playlists overview page now display the server-generated cover image (Navidrome's
coverArtfield on the playlist object) via the IndexedDB image cache. Falls back to the ListMusic icon when no cover is available.
Fixed
- Cover image flickering:
buildCoverArtUrl()generates a new random auth salt on every call, causinguseCachedUrlto re-trigger on every render and produce a rapid re-fetch loop. Fixed by wrapping allbuildCoverArtUrl/coverArtCacheKeycalls inuseMemowith the cover ID as dependency inArtistCardLocal,QueuePanel,FullscreenPlayer,Hero, andPlaylistDetail. - DnD text selection: Dragging a grip handle in the Sidebar Customizer (and any future
useDragSourceconsumer) would select all text on the page during the threshold detection phase. Fixed by callinge.preventDefault()inuseDragSource'sonMouseDownhandler before the drag threshold is reached. - Sidebar Customization DnD on Linux: The initial implementation used the HTML5 Drag & Drop API, which always shows a forbidden cursor on WebKitGTK and does not fire drop events reliably. Rewritten to use the existing psy-drag mouse-event system (
useDragSource/psy-dropcustom event), consistent with the Queue panel.