feat(slint): classic now-playing bar layout

Add the second of the four switchable now-playing bar layouts plus the
4-layout architecture behind it.

ShellState.npb-mode (0=New, 1=Classic) drives mode-conditional columns in
PlayerBar; the transport cluster is extracted into TransportControls.slint and
IconButton/PlayButton into primitives/BarControls (PlayButton gains a `circle`
prop) so both layouts share them without duplicating the popups. The choice
persists via UiPrefs.npb_mode ("new"/"classic") — restored on startup, written
on the "Now Playing view" menu select.

Classic = the Tauri arrangement: transport LEFT (plain play glyph, leading
track-info, inline add-to-playlist + favorite-with-state), glass song card
CENTRE, actions + volume RIGHT. SongCard.glass is a contained card capped at a
fixed 520px; the audio stamp is ABSOLUTELY pinned to the card's right edge
(cover 56 | song info that truncates with ellipsis | stamp 140) so it stays
flush right regardless of the text layout. Track info fires from both the
title click and the transport (i). Classic uses the full-size audio stamp; the
backend LED reads PIPEWIRE.

cc
This commit is contained in:
vicrodh committed 2026-06-02 11:32:01 -06:00
1 parent da7758b9d6
commit 1ad0d7c169
9 files changed
+577 -301

No files matched your search

+4
View File
@@ -1882,6 +1882,10 @@ export global ShellState {
// Section navigation placement: the sections (Discover/Library/Local
// Library/My QBZ) now live in the sidebar and open right-flyout menus.
in-out property <bool> nav-in-sidebar: true;
// Now-playing bar layout mode: 0 = New (default), 1 = Classic. Persisted
// in ui_prefs.json (`npb_mode` "new"|"classic"); set on startup from the
// store and on the player bar's "Now Playing view" menu select.
in-out property <int> npb-mode: 0;
}
// Authenticated user, for the header user element.