02a6c45958
Ten screens duplicated the same TopAppBar + Text(title) + optional-back-arrow + MainAppBarActions sandwich. Extract into MinstrelTopAppBar(title, navController, currentRouteName, onBack, actions) at shared/widgets/. Library's tab row still composes above it inside a Column; Library's Shuffle button slots into the extra actions trailing-lambda; drill-down screens pass onBack for the back arrow; root tabs leave onBack null. Net: -48 lines across 10 screens, +50 lines for the helper. SearchScreen keeps its own TopAppBar (title is a SearchField composable, not a string). Per-screen TrackActionsViewModel snackbar wiring (Library/Search/ detail screens) was intentionally NOT consolidated here: each hiltViewModel() returns a different VM instance than the shell- scoped one already in ShellScaffold, so dedup belongs in 3c (shell-scope the VM via CompositionLocal) rather than freezing the current duplicate into a helper.