ui: what's new in v7.1-beta.8 (#7953)

* ui: what's new in v7.1

* ui: v7.1 what's new wording, moderator icon and badge item style

* ui: better calls in v7.1 what's new

* ui: phone icon for better calls in v7.1 what's new

* ui: v7.1 what's new preview screenshots

* ui: even gap below the supporter badge in v7.1 what's new

* ui: supporter badge picture rises above its text in v7.1 what's new

* ui: v7.1 what's new preview screenshots with the badge layout

* ui: v7.1 what's new desktop screenshot after the master merge

* ui: v7.1-beta.8 what's new wording

* ui: v7.1-beta.8 what's new: promote contributors to moderators

* ci: desktop references of v7.1-beta.8 what's new

* ui: v7.1-beta.8 what's new: larger supporter phone aligned by its head

* ci: desktop references of the supporter phone placement

* ci: iOS references of v7.1-beta.8 what's new

---------

Co-authored-by: spacedandy-agents-simplex <342056592+spacedandy-agents-simplex@users.noreply.github.com>
This commit is contained in:
Evgeny @ SimpleX Chatandspacedandy-agents-simplex authored and GitHub committed 2026-10-30 20:58:35 +00:00
1 parent 05ac3612b7
commit cedd13f57b
7 files changed
+76 -33

No files matched your search

@@ -698,20 +698,36 @@ private let versionDescriptions: [VersionDescription] = [
))
]
),
// TODO [badges] restore when badges ship, with final copy and the Read more link.
/*
VersionDescription(
version: "v7.1",
version: "v7.1-beta.8",
post: nil,
features: [
.view(FeatureView(
icon: nil,
title: "Supporter badge",
title: "Supporter badges",
view: { SupporterBadgeWhatsNew() }
))
)),
.feature(Description(
icon: nil,
title: "Safer channels",
description: nil,
subfeatures: [
("flag", "Promote contributors to moderators."),
("checkmark.seal", "Opt in to sign all channel messages."),
]
)),
.feature(Description(
icon: "terminal",
title: "Flat (\"terminal\") chat layout",
description: "And full markdown support."
)),
.feature(Description(
icon: "phone",
title: "Better calls",
description: "Reconnect after dropped connection."
)),
]
),
*/
]
private let lastVersion = versionDescriptions.last!.version
@@ -731,19 +747,17 @@ fileprivate struct SupporterBadgeWhatsNew: View {
@EnvironmentObject var theme: AppTheme
var body: some View {
HStack(alignment: .top, spacing: 12) {
VStack(alignment: .leading, spacing: 6) {
Text("Supporter badge ❤️")
.font(.title3)
.bold()
Text("Help keep the network running — send files up to 2 GB.")
.multilineTextAlignment(.leading)
.lineLimit(10)
}
.frame(maxWidth: .infinity, alignment: .leading)
heroThumbnail()
VStack(alignment: .leading, spacing: 6) {
Text("Supporter badges 🚀")
.font(.title3)
.bold()
Text("Send larger files\navailable for longer.")
.multilineTextAlignment(.leading)
.lineLimit(10)
}
.padding(.trailing, 96)
.frame(maxWidth: .infinity, alignment: .leading)
.overlay(alignment: .topTrailing) { heroThumbnail() }
}
@ViewBuilder
@@ -752,7 +766,8 @@ fileprivate struct SupporterBadgeWhatsNew: View {
Image(colorScheme == .light ? "phone-supporter" : "phone-supporter-light")
.resizable()
.scaledToFit()
.frame(width: 110, height: 110)
.frame(width: 115, height: 144)
.offset(x: 23, y: -24)
#else
Image("badge-supporter")
.resizable()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 52 KiB

@@ -25,6 +25,7 @@ import androidx.compose.ui.input.pointer.PointerIcon
import androidx.compose.ui.input.pointer.pointerHoverIcon
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.layout
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalUriHandler
import dev.icerock.moko.resources.compose.painterResource
@@ -969,34 +970,50 @@ private val versionDescriptions: List<VersionDescription> = listOf(
),
)
),
// TODO [badges] restore when badges ship, with final copy and the Read more link.
/*
VersionDescription(
version = "v7.1",
version = "v7.1-beta.8",
post = null,
features = listOf(
VersionFeature.FeatureView(
icon = null,
titleId = MR.strings.v7_1_supporter_badge_title,
view = { SupporterBadgeWhatsNew() }
)
),
VersionFeature.FeatureDescription(
icon = null,
titleId = MR.strings.v7_1_channels,
descrId = null,
subfeatures = listOf(
MR.images.ic_flag to MR.strings.v7_1_channels_moderators,
MR.images.ic_verified to MR.strings.v7_1_channels_signed_messages,
)
),
VersionFeature.FeatureDescription(
icon = MR.images.ic_outline_terminal,
titleId = MR.strings.v7_1_terminal_layout,
descrId = MR.strings.v7_1_terminal_layout_descr
),
VersionFeature.FeatureDescription(
icon = MR.images.ic_call,
titleId = MR.strings.v6_1_better_calls,
descrId = MR.strings.v7_1_better_calls_descr
),
)
),
*/
)
@Composable
private fun SupporterBadgeWhatsNew() {
Row(horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.Top) {
Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(6.dp)) {
Box(Modifier.padding(bottom = 12.dp).fillMaxWidth()) {
Column(Modifier.padding(end = 96.dp), verticalArrangement = Arrangement.spacedBy(6.dp)) {
Text(
stringResource(MR.strings.v7_1_supporter_badge_title),
style = MaterialTheme.typography.h3,
fontWeight = FontWeight.Bold
style = MaterialTheme.typography.h4,
fontWeight = FontWeight.Medium
)
Text(
stringResource(MR.strings.v7_1_supporter_badge_body),
style = MaterialTheme.typography.body1,
fontSize = 15.sp,
maxLines = 10
)
}
@@ -1006,19 +1023,24 @@ private fun SupporterBadgeWhatsNew() {
painterResource(if (isDark) MR.images.phone_supporter_light else MR.images.phone_supporter),
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier.size(110.dp)
modifier = Modifier.align(Alignment.TopEnd).spill(x = 23.dp, y = (-24).dp).size(width = 115.dp, height = 144.dp)
)
} else {
Image(
painterResource(MR.images.badge_supporter),
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier.size(72.dp)
modifier = Modifier.align(Alignment.TopEnd).size(72.dp)
)
}
}
}
private fun Modifier.spill(x: Dp, y: Dp): Modifier = layout { measurable, constraints ->
val placeable = measurable.measure(constraints)
layout(0, 0) { placeable.place(x.roundToPx() - placeable.width, y.roundToPx()) }
}
private val lastVersion = versionDescriptions.last().version
fun setLastVersionDefault(m: ChatModel) {
@@ -3348,6 +3348,12 @@
<string name="badges_renews_on_for">Renews on %1$s for %2$s.</string>
<string name="badges_renews_on">Renews on %1$s.</string>
<string name="supporter_perks">Supporter perks</string>
<string name="v7_1_supporter_badge_title">Supporter badge ❤️</string>
<string name="v7_1_supporter_badge_body">Help keep the network running — send files up to 2 GB.</string>
<string name="v7_1_supporter_badge_title">Supporter badges 🚀</string>
<string name="v7_1_supporter_badge_body">Send larger files\navailable for longer.</string>
<string name="v7_1_channels">Safer channels</string>
<string name="v7_1_channels_moderators">Promote contributors to moderators.</string>
<string name="v7_1_channels_signed_messages">Opt in to sign all channel messages.</string>
<string name="v7_1_terminal_layout">Flat ("terminal") chat layout</string>
<string name="v7_1_terminal_layout_descr">And full markdown support.</string>
<string name="v7_1_better_calls_descr">Reconnect after dropped connection.</string>
</resources>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 50 KiB