Show all queue entries (played and upcoming) in one list instead of
splitting into a "Now playing" card + "Next up" tail, so previously
played tracks don't disappear and reappear when navigating back/forward.
The current track is outlined and shows a reusable "hopping bars"
PlayingIndicator (modern-sk style equalizer animation) for future reuse
across track lists.
Add a right-side track info drawer that sits to the right of the queue
panel when both are open. Shows a large cover, title/artist/album links,
a Play/Queue/Edit actions row, and Status/General/File/Identifiers
sections (empty rows omitted). Opens from the track context menu, the
player now-playing tile, and the queue now-playing card.
- ui slice: trackInfoId + open/closeTrackInfo
- TrackInfoDrawer rendered after QueuePanel in AppShell; overlays content
on narrow viewports
- map source/createdAt/enrichedAt from the wire (were unmapped)
- formatDateTime helper, info icon, i18n (en/ru)
- drop orphaned toggleNowPlaying/isNowPlayingOpen from player slice
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The app painted white until <ThemeProvider> mounted and set data-theme,
then snapped to the dark theme. Two fixes:
- Inline head script (rsbuild html.tags) sets data-theme before first
paint, mirroring modern-sk's exact logic (localStorage 'modern-sk-theme'
|| 'dark') so there's no second flip when the provider mounts. Inline =
zero round-trips.
- body now paints var(--color-bg) so the themed background shows before
React mounts #root and layers the felt grain on top.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Build out the full web route map from music-selfhost-routes.md as
scaffolding (no functionality on new screens):
- Full route tree: /login, /albums/:id, /artists/:id, /playlists(+detail),
/discover, /upload, metadata editor (single + batch), /storage/maintenance,
/queue, nested /settings and /admin, and a 404.
- Sidebar rebuilt to the A1 spec with permission-gated Discover/Upload.
- ProtectedRoute gains requirePermission; Permission exported.
- AppShell wraps Outlet in a Suspense boundary for lazy routes.
- Reusable Placeholder + SubNav; Settings/Admin become nested layouts.
- Settings/Profile: wired language + theme selectors.
- Remove orphaned Home feature (web has no Home; / -> /library) and the
now-unused house icon + nav.home keys.
- i18n keys (en + ru) and CSS for page-title/sub-nav.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>