diff --git a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/EmptyState.kt b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/EmptyState.kt index aff0d686..26694390 100644 --- a/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/EmptyState.kt +++ b/android/app/src/main/java/com/fabledsword/minstrel/shared/widgets/EmptyState.kt @@ -1,10 +1,11 @@ package com.fabledsword.minstrel.shared.widgets -import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -25,6 +26,12 @@ import com.composables.icons.lucide.Lucide * Per the FabledSword design system: sentence case copy, understated * tone. The icon defaults to Lucide's `Inbox`; callers pass their own * when a more topical icon helps. + * + * Renders inside a single-item LazyColumn so the widget participates + * in nested-scroll dispatch when wrapped by PullToRefreshBox — + * pull-to-refresh fires on Empty / Error states without the content + * actually scrolling. The fillParentMaxSize on the inner Box keeps + * the centered visual identical to the pre-LazyColumn layout. */ @Composable fun EmptyState( @@ -33,32 +40,37 @@ fun EmptyState( modifier: Modifier = Modifier, icon: ImageVector = Lucide.Inbox, ) { - Column( - modifier = modifier - .fillMaxSize() - .padding(32.dp), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Icon( - imageVector = icon, - contentDescription = null, - modifier = Modifier.size(48.dp), - tint = MaterialTheme.colorScheme.onSurfaceVariant, - ) - Text( - text = title, - modifier = Modifier.padding(top = 16.dp), - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSurface, - textAlign = TextAlign.Center, - ) - Text( - text = body, - modifier = Modifier.padding(top = 8.dp), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center, - ) + LazyColumn(modifier = modifier.fillMaxSize()) { + item { + Box( + modifier = Modifier + .fillParentMaxSize() + .padding(32.dp), + contentAlignment = Alignment.Center, + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.size(48.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Text( + text = title, + modifier = Modifier.padding(top = 16.dp), + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + textAlign = TextAlign.Center, + ) + Text( + text = body, + modifier = Modifier.padding(top = 8.dp), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + ) + } + } + } } }