From 4c5fe75f0adbd22f8dfd257bd0c088021c4041e1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 28 Jul 2026 18:35:05 -0400 Subject: [PATCH 1/2] fix(buzz): drop the grey slab behind the community Channels section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each channel row was its own filled Material3 Card. They stack with no gaps, so their container colour merged into one continuous grey block behind the whole Channels (and Forums) section — reading as a box drawn around the channels that the Direct Messages rows immediately below, which are plain rows, didn't have. The two halves of the same screen looked like different surfaces. Render the row as a plain Box on the screen background instead, keeping the click on the container so the whole row still opens the channel. Matches BuzzDmInlineRow directly below it and the Concord server list. Co-Authored-By: Claude Opus 5 (1M context) --- .../amethyst/ui/screen/loggedIn/buzz/BuzzImportRow.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzImportRow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzImportRow.kt index 74a722e0d4..a0d45791da 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzImportRow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/buzz/BuzzImportRow.kt @@ -21,6 +21,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.buzz 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.Column @@ -31,7 +32,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.Card import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.IconButton @@ -174,10 +174,14 @@ fun BuzzImportRow( accountViewModel = accountViewModel, ) } + // A plain row on the screen background, not a filled Card. Each row used to be its own Card, and + // because they stack with no gaps their container colour merged into one grey slab behind the + // whole Channels section — reading as a box around the channels that the Direct Messages rows + // right below (plain rows) didn't have. Matches [BuzzDmInlineRow] and the Concord server list. if (onOpen != null) { - Card(onClick = onOpen, modifier = Modifier.fillMaxWidth()) { content() } + Box(Modifier.fillMaxWidth().clickable(onClick = onOpen)) { content() } } else { - Card(modifier = Modifier.fillMaxWidth()) { content() } + Box(Modifier.fillMaxWidth()) { content() } } } From 15a389b1558f6a1bca388a4f2cf008c340c76106 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 28 Jul 2026 18:45:13 -0400 Subject: [PATCH 2/2] fix(buzz): separate community rows with a hairline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removing the per-row Cards also removed the only thing separating adjacent rows. Restore that with the 0.25dp outlineVariant hairline the vanilla NIP-29 branch of this same screen and the Concord server list already use. Drawn before each row except the first, so a section's own header keeps providing the separation at its boundaries — no stray line under the last channel or above "Direct Messages". Applied to every row list on the screen (chat channels, forums, inline DMs, hidden DMs) rather than just the Channels section, so the screen stays one consistent surface; the vanilla branch now shares the same helper instead of inlining it. Co-Authored-By: Claude Opus 5 (1M context) --- .../relayGroup/RelayGroupChannelListScreen.kt | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt index 57cf317c83..c4d62d47f9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/relayGroup/RelayGroupChannelListScreen.kt @@ -32,7 +32,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Card @@ -411,7 +410,8 @@ fun RelayGroupChannelListScreen( ) } if (!channelsCollapsed) { - items(buzzChatChannels, key = { "chat-${it.id}" }) { groupId -> + itemsIndexed(buzzChatChannels, key = { _, it -> "chat-${it.id}" }) { index, groupId -> + RowHairline(index) BuzzImportRow( groupId = groupId, isAdded = groupId.id in buzzAdded, @@ -437,7 +437,8 @@ fun RelayGroupChannelListScreen( ) } if (!forumsCollapsed) { - items(buzzForumChannels, key = { "forum-${it.id}" }) { groupId -> + itemsIndexed(buzzForumChannels, key = { _, it -> "forum-${it.id}" }) { index, groupId -> + RowHairline(index) BuzzImportRow( groupId = groupId, isAdded = groupId.id in buzzAdded, @@ -481,7 +482,8 @@ fun RelayGroupChannelListScreen( } } else { val shown = dmRows.take(INLINE_DM_LIMIT) - items(shown, key = { "dm-${it.channelId}" }) { row -> + itemsIndexed(shown, key = { _, it -> "dm-${it.channelId}" }) { index, row -> + RowHairline(index) BuzzDmInlineRow( row = row, myPubkey = myPubkey, @@ -512,7 +514,8 @@ fun RelayGroupChannelListScreen( ) } if (showHiddenDms) { - items(hiddenDmRows, key = { "dm-hidden-${it.channelId}" }) { row -> + itemsIndexed(hiddenDmRows, key = { _, it -> "dm-hidden-${it.channelId}" }) { index, row -> + RowHairline(index) BuzzDmInlineRow( row = row, myPubkey = myPubkey, @@ -530,9 +533,7 @@ fun RelayGroupChannelListScreen( } else { // Vanilla NIP-29 relay: flat channel directory (no forums/DMs/console). itemsIndexed(channels, key = { _, channel -> channel.groupId.id }) { index, channel -> - if (index > 0) { - HorizontalDivider(thickness = 0.25.dp, color = MaterialTheme.colorScheme.outlineVariant) - } + RowHairline(index) RelayGroupChannelRow(channel, myPubkey, accountViewModel) { nav.nav(routeFor(channel)) } } } @@ -551,6 +552,17 @@ fun RelayGroupChannelListScreen( } } +/** + * The hairline separating two adjacent rows within a section. Drawn *before* row [index], and never + * before the first one, so a section's own header keeps providing the separation at its boundaries. + */ +@Composable +private fun RowHairline(index: Int) { + if (index > 0) { + HorizontalDivider(thickness = 0.25.dp, color = MaterialTheme.colorScheme.outlineVariant) + } +} + /** A first screen's worth of a community's DMs shown inline; the rest live behind the See-all row. */ private const val INLINE_DM_LIMIT = 6