From d6ee5a304d7b1755894a34a477a83117a1df1aa2 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 13 Jul 2026 20:56:07 -0400 Subject: [PATCH] fix(home): un-clip CoverTile overlay so play button isn't cut off (#1495) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The play button overlaid on artist circles sat under the circular frame: CoverTile clipped the Box that held both the artwork and the overlay, so a BottomEnd button on a CircleShape avatar — which falls in the square's corner, outside the circle — got clipped away. Draw the overlay on an outer un-clipped Box; clip only the inner artwork + background to `shape`. Corner-anchored overlays (play button, variant pill) now sit on top of the frame. Bounds/alignment unchanged, so Album and Playlist tiles keep their layout (pill is padding-inset; their play buttons are simply no longer clipped at the corner radius). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../minstrel/shared/widgets/CoverTile.kt | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/CoverTile.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/CoverTile.kt index b51ef75f..1e16bdf4 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/CoverTile.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/CoverTile.kt @@ -23,8 +23,12 @@ import com.fabledsword.minstrel.theme.FabledSwordFlatTokens * ServerImage + fallback structure was identical at all three sites. * * [overlay] is a `BoxScope` slot for things drawn on top of the cover - * (e.g. the `VariantPill` system-playlist label) — callers can use - * `Modifier.align(...)` inside it. + * (e.g. the `VariantPill` system-playlist label, the play button) — + * callers can use `Modifier.align(...)` inside it. The overlay sits on + * an outer, UN-clipped box so corner-anchored widgets are not cut off by + * [shape]: a `BottomEnd` play button on a `CircleShape` avatar falls in + * the square's corner, outside the circle, and would otherwise be clipped + * away. Only the artwork + background are clipped to [shape]. */ @Composable fun CoverTile( @@ -38,18 +42,23 @@ fun CoverTile( overlay: @Composable BoxScope.() -> Unit = {}, ) { Box( - modifier = modifier - .size(size) - .clip(shape) - .background(background), + modifier = modifier.size(size), contentAlignment = Alignment.Center, ) { - ServerImage( - url = url, - contentDescription = contentDescription, - modifier = Modifier.fillMaxSize(), + Box( + modifier = Modifier + .fillMaxSize() + .clip(shape) + .background(background), + contentAlignment = Alignment.Center, ) { - fallback() + ServerImage( + url = url, + contentDescription = contentDescription, + modifier = Modifier.fillMaxSize(), + ) { + fallback() + } } overlay() }