feat(android): use Material Outlined LibraryMusic for top-nav Library
android / Build + lint + test (push) Failing after 2m34s

Lucide has no music-library glyph — Library / LibraryBig /
SquareLibrary all read as a generic books-on-shelf icon without
a label. Operator picked Material's LibraryMusic (the canonical
"books + music note" symbol used by every major music app) as
the recognizable alternative.

Use the Outlined variant: filled icons would clash with the
neighbouring stroked Lucide icons (House, Search, EllipsisVertical),
but Outlined's stroke style matches Lucide closely enough that
the mix is subtle.

Adds the compose-material-icons-extended dependency (version
pinned by compose-bom). R8 strips unused icons in release builds
so the APK cost is just the ones we actually reference.
This commit is contained in:
2026-06-02 09:40:49 -04:00
parent 22dc343b39
commit faf2cac0c9
3 changed files with 16 additions and 2 deletions
@@ -11,12 +11,13 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.LibraryMusic
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavHostController
import com.composables.icons.lucide.House
import com.composables.icons.lucide.Lucide
import com.composables.icons.lucide.SquareLibrary
import com.composables.icons.lucide.EllipsisVertical
import com.composables.icons.lucide.Search as SearchIcon
import com.fabledsword.minstrel.nav.Admin
@@ -58,7 +59,14 @@ fun MainAppBarActions(
}
if (currentRouteName != Library::class.qualifiedName) {
IconButton(onClick = { navController.navigate(Library) }) {
Icon(Lucide.SquareLibrary, contentDescription = "Library")
// Intentional cross-family icon — Lucide has no
// equivalent "library + music" glyph and the literal
// library icons (Library / LibraryBig / SquareLibrary)
// don't read as "music collection" without a label.
// Material's Outlined LibraryMusic is the canonical
// music-library symbol; the outlined variant matches
// Lucide's stroke style closely enough to blend.
Icon(Icons.Outlined.LibraryMusic, contentDescription = "Library")
}
}
if (currentRouteName != SearchRoute::class.qualifiedName) {