From 6fd1513b2d521f712bc8a3d4e19d451800ab73fd Mon Sep 17 00:00:00 2001 From: AdityasahuX07 Date: Sat, 25 Apr 2026 15:48:58 +0530 Subject: [PATCH] Add files via upload --- .../com/nuvio/app/core/ui/NuvioBottomSheet.kt | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt new file mode 100644 index 00000000..af5f9c26 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/ui/NuvioBottomSheet.kt @@ -0,0 +1,125 @@ +package com.nuvio.app.core.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.SheetState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun NuvioModalBottomSheet( + onDismissRequest: () -> Unit, + sheetState: SheetState, + modifier: Modifier = Modifier, + containerColor: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = MaterialTheme.colorScheme.onSurface, + shape: Shape = RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp), + showDragHandle: Boolean = true, + content: @Composable ColumnScope.() -> Unit, +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + sheetState = sheetState, + modifier = modifier, + containerColor = containerColor, + contentColor = contentColor, + shape = shape, + dragHandle = if (showDragHandle) { + { NuvioBottomSheetDragHandle() } + } else { + null + }, + content = content, + ) +} + +@Composable +fun NuvioBottomSheetDivider( + modifier: Modifier = Modifier, +) { + HorizontalDivider( + modifier = modifier, + color = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.6f), + ) +} + +@Composable +fun NuvioBottomSheetActionRow( + title: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, + icon: ImageVector? = null, + trailingContent: (@Composable RowScope.() -> Unit)? = null, +) { + Row( + modifier = modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = 16.dp, vertical = 16.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (icon != null) { + Icon( + imageVector = icon, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(22.dp), + ) + } + Text( + text = title, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + trailingContent?.invoke(this) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +suspend fun dismissNuvioBottomSheet( + sheetState: SheetState, + onDismiss: () -> Unit, +) { + if (sheetState.isVisible) { + sheetState.hide() + } + onDismiss() +} + +@Composable +private fun NuvioBottomSheetDragHandle() { + Box( + modifier = Modifier + .padding(top = 10.dp, bottom = 6.dp) + .size(width = 54.dp, height = 5.dp) + .clip(RoundedCornerShape(999.dp)) + .background(MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.65f)), + ) +} \ No newline at end of file