diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt index c5ea12a..d4f5d08 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatScreen.kt @@ -427,37 +427,51 @@ fun ChatScreen( } // 2. Floating Top Menu Button - Row( + val scrimColor = MaterialTheme.colorScheme.background + Box( modifier = Modifier .align(Alignment.TopStart) - .statusBarsPadding() - .padding(start = 16.dp, top = 10.dp, end = 16.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - GlassSurface( - shape = KaizenShapes.circle, - tintAlpha = GlassTiers.pill(isSystemInDarkTheme()), - shadowStack = KaizenShadows.level2, - cornerRadius = 22.dp, - modifier = Modifier - .size(44.dp) - .clickable { haptics.tick(); scope.launch { drawerState.open() } }, - ) { - Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Icon( - imageVector = Icons.Rounded.Menu, - contentDescription = context.getString(R.string.chat_open_menu), - tint = MaterialTheme.colorScheme.onBackground, - modifier = Modifier.size(20.dp) + .fillMaxWidth() + .background( + Brush.verticalGradient( + colorStops = arrayOf( + 0f to scrimColor, + 0.7f to scrimColor.copy(alpha = 0.55f), + 1f to Color.Transparent, + ), ) + ) + .statusBarsPadding() + ) { + Row( + modifier = Modifier.padding(start = 16.dp, top = 10.dp, end = 16.dp, bottom = 20.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + GlassSurface( + shape = KaizenShapes.circle, + tintAlpha = GlassTiers.pill(isSystemInDarkTheme()), + shadowStack = KaizenShadows.level2, + cornerRadius = 22.dp, + modifier = Modifier + .size(44.dp) + .clickable { haptics.tick(); scope.launch { drawerState.open() } }, + ) { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Icon( + imageVector = Icons.Rounded.Menu, + contentDescription = context.getString(R.string.chat_open_menu), + tint = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.size(20.dp) + ) + } } + Spacer(Modifier.width(8.dp)) + ModelPill( + label = modelDisplayName(session.config?.model ?: "", models), + onClick = { haptics.tick(); showModelSheet = true }, + modifier = Modifier.weight(1f, fill = false), + ) } - Spacer(Modifier.width(8.dp)) - ModelPill( - label = modelDisplayName(session.config?.model ?: "", models), - onClick = { haptics.tick(); showModelSheet = true }, - modifier = Modifier.weight(1f, fill = false), - ) } // Error banner when initial data load fails @@ -485,9 +499,20 @@ fun ChatScreen( Column( modifier = Modifier .align(Alignment.BottomCenter) + .background( + Brush.verticalGradient( + colorStops = arrayOf( + 0f to Color.Transparent, + 0.35f to scrimColor.copy(alpha = 0.6f), + 0.7f to scrimColor.copy(alpha = 0.92f), + 1f to scrimColor, + ), + ) + ) .navigationBarsPadding() .then(if (isTablet) Modifier.widthIn(max = 720.dp) else Modifier) ) { + Spacer(Modifier.height(24.dp)) ModePillsRow(selected = selectedMode, onSelect = { selectedMode = it; haptics.tick() }) Spacer(Modifier.height(10.dp)) ChatInput( @@ -499,7 +524,7 @@ fun ChatScreen( onAddClick = { filePicker.launch("*/*") }, onRemoveFile = { id -> pendingFiles.removeAll { it.id == id } }, ) - Spacer(Modifier.height(16.dp)) // Completely clears keyboard edges on all screens + Spacer(Modifier.height(16.dp)) } // Model picker (bottom sheet), opened by the top pill diff --git a/app/src/main/java/dev/kaizen/app/chat/ModelSheet.kt b/app/src/main/java/dev/kaizen/app/chat/ModelSheet.kt index ba69255..9217ff1 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ModelSheet.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ModelSheet.kt @@ -35,7 +35,7 @@ fun ModelPill(label: String, onClick: () -> Unit, modifier: Modifier = Modifier) Row( modifier = modifier .clip(KaizenShapes.xl) - .background(cs.surface.copy(alpha = 0.7f)) + .background(cs.surface.copy(alpha = 0.92f)) .border(1.dp, cs.onSurface.copy(alpha = 0.08f), KaizenShapes.xl) .clickable { onClick() } .padding(start = 14.dp, end = 8.dp, top = 9.dp, bottom = 9.dp),