Skip to content

Commit a7f2297

Browse files
authored
Align shared header divider and height across screens (#6412)
* Replace header/composer dropshadow with borderCoreSubtle divider ChannelHeader (used by message view + thread view) and MessageComposer (non-floating mode) now draw a 1.dp border/core/subtle divider at the boundary with the adjacent surface, matching the Figma "Mobile / Message List" tokens. ListHeader (used by Channel List + Thread List) is updated from borderCoreDefault to borderCoreSubtle for a single divider treatment across all four screens, fulfilling the ticket's "consistent across the app" goal. Snapshot baselines refreshed for ChannelHeaderTest, MessageComposerTest, ChannelListHeaderTest, and ThreadListHeaderTest. * Standardise message-view header min-height with list screens The default top-bar wired by ChannelScreen constrained ChannelHeader to a hardcoded 56.dp, while ListHeader (used by Channel List and Thread List) renders intrinsically taller (avatar 48.dp + 12.dp top + 12.dp bottom = 72.dp). The mismatch caused the layout to jump when navigating between list screens and the message/thread view. Replace the rigid Modifier.height(56.dp) with Modifier.defaultMinSize(minHeight = 72.dp) so the message-view header matches the list-header height while still letting custom leading content (e.g. a back arrow that's larger than 48.dp) drive a taller header if needed. * Extract HeaderScaffold from ListHeader; compose ChannelHeader on top Renames the internal ListHeader composable to HeaderScaffold and lifts the shared header chrome (Surface + inset row + bottom divider) into a single building block. ChannelHeader, ChannelListHeader, and ThreadListHeader all delegate the chrome to HeaderScaffold and only own their domain slots. Drops the unused color/shape/elevation parameters from the previous ListHeader signature; both list-header callers used the defaults. Bakes the design-system padding (spacingSm) and inter-slot gap (spacingXs) into HeaderScaffold so the four screen-level headers can no longer drift apart on those values. ChannelHeader's Row gains 4.dp horizontal padding and an 8.dp inter-slot gap, matching what the list headers already used. Snapshot baselines for ChannelHeaderTest re-recorded.
1 parent d5e970e commit a7f2297

26 files changed

Lines changed: 33 additions & 56 deletions

File tree

stream-chat-android-compose/api/stream-chat-android-compose.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6181,8 +6181,8 @@ public final class io/getstream/chat/android/compose/ui/threads/ComposableSingle
61816181
public final class io/getstream/chat/android/compose/ui/threads/ComposableSingletons$ThreadListHeaderKt {
61826182
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/threads/ComposableSingletons$ThreadListHeaderKt;
61836183
public fun <init> ()V
6184+
public final fun getLambda$-1025604936$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3;
61846185
public final fun getLambda$-798078767$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
6185-
public final fun getLambda$1850390573$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3;
61866186
public final fun getLambda$381085544$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
61876187
}
61886188

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/header/ChannelListHeader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import androidx.compose.ui.res.painterResource
2525
import androidx.compose.ui.res.stringResource
2626
import androidx.compose.ui.tooling.preview.Preview
2727
import io.getstream.chat.android.compose.R
28-
import io.getstream.chat.android.compose.ui.components.ListHeader
28+
import io.getstream.chat.android.compose.ui.components.HeaderScaffold
2929
import io.getstream.chat.android.compose.ui.components.button.StreamButton
3030
import io.getstream.chat.android.compose.ui.theme.ChannelListHeaderCenterContentParams
3131
import io.getstream.chat.android.compose.ui.theme.ChannelListHeaderLeadingContentParams
@@ -91,7 +91,7 @@ public fun ChannelListHeader(
9191
}
9292
},
9393
) {
94-
ListHeader(
94+
HeaderScaffold(
9595
modifier = modifier,
9696
leadingContent = leadingContent,
9797
centerContent = centerContent,

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/ListHeader.kt renamed to stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/HeaderScaffold.kt

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,8 @@ import androidx.compose.runtime.Composable
3434
import androidx.compose.ui.Alignment
3535
import androidx.compose.ui.Modifier
3636
import androidx.compose.ui.draw.clip
37-
import androidx.compose.ui.graphics.Color
38-
import androidx.compose.ui.graphics.RectangleShape
39-
import androidx.compose.ui.graphics.Shape
4037
import androidx.compose.ui.platform.testTag
4138
import androidx.compose.ui.res.stringResource
42-
import androidx.compose.ui.unit.Dp
4339
import androidx.compose.ui.unit.dp
4440
import io.getstream.chat.android.compose.R
4541
import io.getstream.chat.android.compose.ui.components.avatar.AvatarSize
@@ -51,36 +47,28 @@ import io.getstream.chat.android.models.ConnectionState
5147
import io.getstream.chat.android.models.User
5248

5349
/**
54-
* Common header layout.
50+
* Three-slot header layout with leading, center, and trailing slots laid out horizontally and a
51+
* bottom divider.
5552
*
5653
* @param modifier Modifier for styling.
57-
* @param color The background color of the header.
58-
* @param shape The shape of the header.
59-
* @param elevation The elevation of the header.
60-
* @param leadingContent Composable for the leading slot (e.g. user avatar).
61-
* @param centerContent Composable for the center slot (e.g. title or loading indicator).
62-
* @param trailingContent Composable for the trailing slot (e.g. action button or spacer).
54+
* @param leadingContent Slot rendered at the start of the row (e.g. avatar, back button).
55+
* @param centerContent Slot rendered in the center of the row (e.g. title, loading indicator).
56+
* @param trailingContent Slot rendered at the end of the row (e.g. action button, channel avatar).
6357
*/
6458
@Composable
65-
internal fun ListHeader(
59+
internal fun HeaderScaffold(
6660
modifier: Modifier = Modifier,
67-
color: Color = ChatTheme.colors.backgroundCoreElevation1,
68-
shape: Shape = RectangleShape,
69-
elevation: Dp = 0.dp,
7061
leadingContent: @Composable RowScope.() -> Unit,
7162
centerContent: @Composable RowScope.() -> Unit,
7263
trailingContent: @Composable RowScope.() -> Unit,
7364
) {
7465
Surface(
75-
modifier = modifier
76-
.fillMaxWidth(),
77-
shadowElevation = elevation,
78-
color = color,
79-
shape = shape,
66+
modifier = modifier.fillMaxWidth(),
67+
color = ChatTheme.colors.backgroundCoreElevation1,
8068
) {
8169
Column {
8270
Row(
83-
Modifier
71+
modifier = Modifier
8472
.fillMaxWidth()
8573
.padding(StreamTokens.spacingSm),
8674
verticalAlignment = Alignment.CenterVertically,
@@ -94,15 +82,15 @@ internal fun ListHeader(
9482
}
9583
HorizontalDivider(
9684
thickness = 1.dp,
97-
color = ChatTheme.colors.borderCoreDefault,
85+
color = ChatTheme.colors.borderCoreSubtle,
9886
)
9987
}
10088
}
10189
}
10290

10391
/**
104-
* Default leading content for a [ListHeader].
105-
* Shows the user avatar if available, otherwise a spacer to preserve alignment.
92+
* Default list-header leading content. Shows the user avatar if available, otherwise a spacer to
93+
* preserve alignment.
10694
*
10795
* @param currentUser The currently logged in user.
10896
* @param onAvatarClick Action invoked when the avatar is clicked.
@@ -135,8 +123,8 @@ internal fun DefaultListHeaderLeadingContent(
135123
}
136124

137125
/**
138-
* Default center content for a [ListHeader].
139-
* Shows a title when connected, a loading indicator when connecting, or "Disconnected" when offline.
126+
* Default list-header center content. Shows a title when connected, a loading indicator when
127+
* connecting, or "Disconnected" when offline.
140128
*
141129
* @param connectionState The state of WebSocket connection.
142130
* @param title The title to show.

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/ChannelScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ import androidx.compose.foundation.layout.BoxScope
2525
import androidx.compose.foundation.layout.Column
2626
import androidx.compose.foundation.layout.WindowInsets
2727
import androidx.compose.foundation.layout.consumeWindowInsets
28+
import androidx.compose.foundation.layout.defaultMinSize
2829
import androidx.compose.foundation.layout.fillMaxSize
2930
import androidx.compose.foundation.layout.fillMaxWidth
30-
import androidx.compose.foundation.layout.height
3131
import androidx.compose.foundation.layout.ime
3232
import androidx.compose.foundation.layout.padding
3333
import androidx.compose.foundation.layout.safeDrawingPadding
@@ -349,7 +349,7 @@ internal fun DefaultTopBarContent(
349349
onBackPressed = backAction,
350350
onHeaderTitleClick = onHeaderTitleClick,
351351
onChannelAvatarClick = onChannelAvatarClick,
352-
modifier = Modifier.height(56.dp),
352+
modifier = Modifier.defaultMinSize(minHeight = 72.dp),
353353
),
354354
)
355355
}

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/MessageComposer.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.Row
2525
import androidx.compose.foundation.layout.RowScope
2626
import androidx.compose.foundation.layout.fillMaxWidth
2727
import androidx.compose.foundation.layout.padding
28+
import androidx.compose.material3.HorizontalDivider
2829
import androidx.compose.material3.SnackbarDuration
2930
import androidx.compose.material3.SnackbarHostState
3031
import androidx.compose.material3.Surface
@@ -374,10 +375,13 @@ private fun MessageComposerSurface(
374375
} else {
375376
Surface(
376377
modifier = modifier,
377-
shadowElevation = 24.dp,
378378
color = ChatTheme.colors.backgroundCoreElevation1,
379379
) {
380380
Column(modifier = Modifier.animateContentSize(alignment = Alignment.BottomCenter)) {
381+
HorizontalDivider(
382+
thickness = 1.dp,
383+
color = ChatTheme.colors.borderCoreSubtle,
384+
)
381385
content()
382386
}
383387
}

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/header/ChannelHeader.kt

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ package io.getstream.chat.android.compose.ui.messages.header
1919
import androidx.compose.foundation.layout.Arrangement
2020
import androidx.compose.foundation.layout.Column
2121
import androidx.compose.foundation.layout.IntrinsicSize
22-
import androidx.compose.foundation.layout.Row
2322
import androidx.compose.foundation.layout.RowScope
2423
import androidx.compose.foundation.layout.fillMaxWidth
2524
import androidx.compose.foundation.layout.height
26-
import androidx.compose.foundation.layout.padding
2725
import androidx.compose.foundation.layout.size
2826
import androidx.compose.foundation.layout.wrapContentHeight
29-
import androidx.compose.material3.Surface
3027
import androidx.compose.material3.Text
3128
import androidx.compose.runtime.Composable
3229
import androidx.compose.ui.Alignment
@@ -40,13 +37,13 @@ import androidx.compose.ui.tooling.preview.Preview
4037
import androidx.compose.ui.unit.dp
4138
import io.getstream.chat.android.compose.R
4239
import io.getstream.chat.android.compose.ui.components.BackButton
40+
import io.getstream.chat.android.compose.ui.components.HeaderScaffold
4341
import io.getstream.chat.android.compose.ui.components.NetworkLoadingIndicator
4442
import io.getstream.chat.android.compose.ui.theme.ChannelAvatarParams
4543
import io.getstream.chat.android.compose.ui.theme.ChannelHeaderCenterContentParams
4644
import io.getstream.chat.android.compose.ui.theme.ChannelHeaderLeadingContentParams
4745
import io.getstream.chat.android.compose.ui.theme.ChannelHeaderTrailingContentParams
4846
import io.getstream.chat.android.compose.ui.theme.ChatTheme
49-
import io.getstream.chat.android.compose.ui.theme.StreamTokens
5047
import io.getstream.chat.android.compose.ui.util.clickable
5148
import io.getstream.chat.android.compose.ui.util.getMembersStatusText
5249
import io.getstream.chat.android.compose.ui.util.ifNotNull
@@ -123,24 +120,12 @@ public fun ChannelHeader(
123120
}
124121
},
125122
) {
126-
Surface(
127-
modifier = modifier.fillMaxWidth(),
128-
shadowElevation = StreamTokens.elevation3,
129-
color = ChatTheme.colors.backgroundCoreElevation1,
130-
) {
131-
Row(
132-
modifier = Modifier
133-
.fillMaxWidth()
134-
.padding(8.dp),
135-
verticalAlignment = Alignment.CenterVertically,
136-
) {
137-
leadingContent()
138-
139-
centerContent()
140-
141-
trailingContent()
142-
}
143-
}
123+
HeaderScaffold(
124+
modifier = modifier,
125+
leadingContent = leadingContent,
126+
centerContent = centerContent,
127+
trailingContent = trailingContent,
128+
)
144129
}
145130

146131
/**

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/threads/ThreadListHeader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview
2525
import io.getstream.chat.android.compose.R
2626
import io.getstream.chat.android.compose.ui.components.DefaultListHeaderCenterContent
2727
import io.getstream.chat.android.compose.ui.components.DefaultListHeaderLeadingContent
28-
import io.getstream.chat.android.compose.ui.components.ListHeader
28+
import io.getstream.chat.android.compose.ui.components.HeaderScaffold
2929
import io.getstream.chat.android.compose.ui.components.avatar.AvatarSize
3030
import io.getstream.chat.android.compose.ui.theme.ChatTheme
3131
import io.getstream.chat.android.models.ConnectionState
@@ -50,7 +50,7 @@ public fun ThreadListHeader(
5050
connectionState: ConnectionState = ConnectionState.Connected,
5151
onAvatarClick: (User?) -> Unit = {},
5252
) {
53-
ListHeader(
53+
HeaderScaffold(
5454
modifier = modifier,
5555
leadingContent = {
5656
DefaultListHeaderLeadingContent(
Loading
Loading
Loading

0 commit comments

Comments
 (0)