package com.suno.android.common_ui.components.images import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.suno.android.common_ui.theme.SunoTheme @Composable fun BlurClippedImage( imageUrl: String, contentDescription: String?, modifier: Modifier = Modifier, height: Dp = 200.dp, blurHeight: Dp = 100.dp, // Increased default blur height backgroundColor: Color = Color.Blue, ) { val density = LocalDensity.current Box( modifier = modifier .fillMaxWidth() .height(height), ) { AsyncImage( model = imageUrl, contentDescription = contentDescription, contentScale = ContentScale.Crop, modifier = Modifier .fillMaxSize() .drawWithContent { drawContent() val blurHeightPx = with(density) { blurHeight.toPx() } // Create a more gradual transition using multiple color stops drawRect( brush = Brush.verticalGradient( colorStops = arrayOf( 0.0f to Color.Transparent, 0.2f to backgroundColor.copy(alpha = 0.0f), 0.4f to backgroundColor.copy(alpha = 0.1f), 0.6f to backgroundColor.copy(alpha = 0.3f), 0.8f to backgroundColor.copy(alpha = 0.7f), 1.0f to backgroundColor, ), startY = size.height - blurHeightPx, endY = size.height, ), ) }, ) } } @Preview(showBackground = true) @Composable private fun BlurClippedImage_Preview() { SunoTheme { Box(modifier = Modifier.fillMaxSize()) { BlurClippedImage( imageUrl = "https://picsum.photos/800/400", contentDescription = null, height = 300.dp, blurHeight = 150.dp, ) } } }