feat: redesign user info sheet

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2023-12-01 15:07:55 +01:00
parent 4654a29506
commit 9e3543be37
19 changed files with 3415 additions and 81 deletions

View File

@ -7,14 +7,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Brush.Companion.linearGradient
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
// color is spelled american because Color from compose is spelled american
fun Brush.Companion.solidColor(colour: Color) = linearGradient(
colorStops = arrayOf(
0f to colour,
1f to colour
)
)
fun Brush.Companion.solidColor(colour: Color) = SolidColor(colour)
// Some colours that are not present in Android's built-in list.
// not exhaustive, but covers most of the ones I've seen in the wild

View File

@ -65,6 +65,25 @@ data class User(
}
}
enum class UserBadges(val value: Long) {
Developer(1L shl 0),
Translator(1L shl 1),
Supporter(1L shl 2),
ResponsibleDisclosure(1L shl 3),
Founder(1L shl 4),
PlatformModeration(1L shl 5),
ActiveSupporter(1L shl 6),
Paw(1L shl 7),
EarlyAdopter(1L shl 8),
ReservedRelevantJokeBadge1(1L shl 9),
ReservedRelevantJokeBadge2(1L shl 10),
}
infix fun Long?.has(flag: UserBadges): Boolean {
if (this == null) return false
return this and flag.value == flag.value
}
@Serializable
data class Bot(
val owner: String? = null

View File

@ -0,0 +1,39 @@
package chat.revolt.components.chat
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
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.Brush
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@Composable
fun RoleListEntry(label: String, brush: Brush, modifier: Modifier = Modifier) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier
) {
Text(
text = label,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Spacer(Modifier.weight(1f))
Box(
modifier = Modifier
.clip(CircleShape)
.size(14.dp)
.background(brush = brush)
)
}
}

View File

@ -0,0 +1,184 @@
package chat.revolt.components.chat
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import chat.revolt.R
import chat.revolt.api.schemas.UserBadges
import chat.revolt.api.schemas.has
@Composable
fun BadgeListEntryTemplate(
label: String,
icon: Painter
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Image(
painter = icon,
contentDescription = null,
modifier = Modifier
.size(24.dp)
)
Spacer(Modifier.width(8.dp))
Text(
text = label
)
}
}
@Composable
fun BadgeListEntry(badge: UserBadges) {
when (badge.value) {
UserBadges.Developer.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_developer),
icon = painterResource(R.drawable.user_badge_developer)
)
}
UserBadges.Translator.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_translator),
icon = painterResource(R.drawable.user_badge_translator)
)
}
UserBadges.Supporter.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_supporter),
icon = painterResource(R.drawable.user_badge_supporter)
)
}
UserBadges.ResponsibleDisclosure.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_responsible_disclosure),
icon = painterResource(R.drawable.user_badge_disclosure)
)
}
UserBadges.Founder.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_founder),
icon = painterResource(R.drawable.user_badge_founder)
)
}
UserBadges.PlatformModeration.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_platform_moderation),
icon = painterResource(R.drawable.user_badge_moderation)
)
}
UserBadges.ActiveSupporter.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_active_supporter),
icon = painterResource(R.drawable.ic_human_greeting_variant_24dp)
)
}
UserBadges.Paw.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_paw),
icon = painterResource(R.drawable.user_badge_paw)
)
}
UserBadges.EarlyAdopter.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_early_adopter),
icon = painterResource(R.drawable.user_badge_early_adopter)
)
}
UserBadges.ReservedRelevantJokeBadge1.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_reserved_relevant_joke_badge_1),
icon = painterResource(R.drawable.user_badge_reserved_relevant_one)
)
}
UserBadges.ReservedRelevantJokeBadge2.value -> {
BadgeListEntryTemplate(
label = stringResource(R.string.user_badge_reserved_relevant_joke_badge_2),
icon = painterResource(R.drawable.user_badge_reserved_relevant_two)
)
}
}
}
@Composable
fun UserBadgeList(badges: Long) {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
UserBadges.entries
.filter { badges has it }
.forEach { badge ->
BadgeListEntry(badge)
}
}
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun UserBadgeRow(badges: Long) {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
UserBadges.entries
.filter { badges has it }
.forEach { badge ->
Image(
painter = when (badge) {
UserBadges.Developer -> painterResource(R.drawable.user_badge_developer)
UserBadges.Translator -> painterResource(R.drawable.user_badge_translator)
UserBadges.Supporter -> painterResource(R.drawable.user_badge_supporter)
UserBadges.ResponsibleDisclosure -> painterResource(R.drawable.user_badge_disclosure)
UserBadges.Founder -> painterResource(R.drawable.user_badge_founder)
UserBadges.PlatformModeration -> painterResource(R.drawable.user_badge_moderation)
UserBadges.ActiveSupporter -> painterResource(R.drawable.ic_human_greeting_variant_24dp)
UserBadges.Paw -> painterResource(R.drawable.user_badge_paw)
UserBadges.EarlyAdopter -> painterResource(R.drawable.user_badge_early_adopter)
UserBadges.ReservedRelevantJokeBadge1 -> painterResource(R.drawable.user_badge_reserved_relevant_one)
UserBadges.ReservedRelevantJokeBadge2 -> painterResource(R.drawable.user_badge_reserved_relevant_two)
},
contentDescription = when (badge) {
UserBadges.Developer -> stringResource(R.string.user_badge_developer)
UserBadges.Translator -> stringResource(R.string.user_badge_translator)
UserBadges.Supporter -> stringResource(R.string.user_badge_supporter)
UserBadges.ResponsibleDisclosure -> stringResource(R.string.user_badge_responsible_disclosure)
UserBadges.Founder -> stringResource(R.string.user_badge_founder)
UserBadges.PlatformModeration -> stringResource(R.string.user_badge_platform_moderation)
UserBadges.ActiveSupporter -> stringResource(R.string.user_badge_active_supporter)
UserBadges.Paw -> stringResource(R.string.user_badge_paw)
UserBadges.EarlyAdopter -> stringResource(R.string.user_badge_early_adopter)
UserBadges.ReservedRelevantJokeBadge1 -> stringResource(R.string.user_badge_reserved_relevant_joke_badge_1)
UserBadges.ReservedRelevantJokeBadge2 -> stringResource(R.string.user_badge_reserved_relevant_joke_badge_2)
},
modifier = Modifier
.size(32.dp)
)
}
}
}

View File

@ -11,7 +11,7 @@ import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ElevatedButton
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@ -100,7 +100,7 @@ fun UserButtons(
}
"Friend" -> {
ElevatedButton(
FilledTonalButton(
onClick = {
scope.launch {
val dm = openDM(user.id)

View File

@ -0,0 +1,85 @@
package chat.revolt.components.sheets
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import chat.revolt.api.internals.solidColor
@Composable
fun SheetTile(
modifier: Modifier = Modifier,
header: @Composable () -> Unit,
contentPreview: @Composable () -> Unit,
clickable: Boolean = true,
backgroundBrush: Brush = Brush.solidColor(MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)),
content: @Composable () -> Unit,
) {
var isExpanded by remember { mutableStateOf(false) }
if (isExpanded) {
Dialog(onDismissRequest = {
isExpanded = false
}) {
BoxWithConstraints {
Column(
modifier = Modifier
.clip(MaterialTheme.shapes.large)
.background(MaterialTheme.colorScheme.surface)
.padding(24.dp)
.width(maxWidth * 0.85f)
.heightIn(max = maxHeight * 0.85f)
) {
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.headlineMedium) {
header()
}
Spacer(Modifier.height(16.dp))
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyMedium) {
content()
}
}
}
}
}
Column(
modifier = Modifier
.clip(MaterialTheme.shapes.large)
.then(if (clickable) Modifier.clickable { isExpanded = true } else Modifier)
.background(backgroundBrush)
.padding(16.dp)
.height(128.dp)
.then(modifier)
) {
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.headlineSmall) {
header()
}
Spacer(Modifier.height(16.dp))
CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyMedium) {
contentPreview()
}
}
}

View File

@ -1,16 +1,15 @@
package chat.revolt.sheets
import android.text.format.DateUtils
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
@ -21,25 +20,30 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.revolt.R
import chat.revolt.api.RevoltAPI
import chat.revolt.api.internals.ULID
import chat.revolt.api.internals.WebCompat
import chat.revolt.api.internals.solidColor
import chat.revolt.api.routes.user.fetchUserProfile
import chat.revolt.api.schemas.Profile
import chat.revolt.components.chat.RoleChip
import chat.revolt.components.chat.RoleListEntry
import chat.revolt.components.chat.UserBadgeList
import chat.revolt.components.chat.UserBadgeRow
import chat.revolt.components.generic.NonIdealState
import chat.revolt.components.generic.WebMarkdown
import chat.revolt.components.screens.settings.RawUserOverview
import chat.revolt.components.screens.settings.UserButtons
import chat.revolt.components.sheets.SheetTile
import kotlinx.datetime.Instant
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun UserInfoSheet(
userId: String,
@ -90,72 +94,174 @@ fun UserInfoSheet(
return
}
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Fixed(2),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalItemSpacing = 16.dp,
modifier = Modifier.padding(16.dp)
) {
RawUserOverview(user, profile)
item(key = "overview", span = StaggeredGridItemSpan.FullLine) {
RawUserOverview(user, profile, internalPadding = false)
}
Column(
modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp, top = 8.dp)
) {
UserButtons(
user,
dismissSheet
)
member?.roles?.let {
Text(
text = stringResource(id = R.string.user_info_sheet_category_roles),
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(vertical = 10.dp)
)
FlowRow(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
it
.map { roleId -> server?.roles?.get(roleId) }
.sortedBy { it?.rank ?: 0.0 }
.forEach { role ->
role?.let {
RoleChip(
label = role.name ?: "null",
brush = role.colour?.let { WebCompat.parseColour(it) }
?: Brush.solidColor(LocalContentColor.current)
)
}
member?.roles?.let {
item(key = "roles") {
SheetTile(
header = {
Text(stringResource(R.string.user_info_sheet_category_roles))
},
contentPreview = {
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
it
.map { roleId -> server?.roles?.get(roleId) }
.sortedBy { it?.rank ?: 0.0 }
.take(3)
.forEach { role ->
role?.let {
RoleListEntry(
label = role.name ?: "null",
brush = role.colour?.let { WebCompat.parseColour(it) }
?: Brush.solidColor(LocalContentColor.current)
)
}
}
}
}
}
Text(
text = stringResource(id = R.string.user_info_sheet_category_bio),
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(vertical = 10.dp)
)
if (profile?.content.isNullOrBlank().not()) {
WebMarkdown(
text = profile!!.content!!,
maskLoading = true
)
} else if (profile != null) {
Text(
text = stringResource(id = R.string.user_info_sheet_bio_empty),
color = LocalContentColor.current.copy(alpha = 0.6f)
)
} else if (profileNotFound) {
Text(
text = stringResource(id = R.string.user_info_sheet_bio_not_found),
color = LocalContentColor.current.copy(alpha = 0.6f)
)
} else {
Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxWidth()) {
CircularProgressIndicator()
}
) {
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
it
.map { roleId -> server?.roles?.get(roleId) }
.sortedBy { it?.rank ?: 0.0 }
.forEach { role ->
role?.let {
RoleListEntry(
label = role.name ?: "null",
brush = role.colour?.let { WebCompat.parseColour(it) }
?: Brush.solidColor(LocalContentColor.current)
)
}
}
}
}
}
}
val accountAt = user.id?.let {
DateUtils.getRelativeTimeSpanString(
ULID.asTimestamp(user.id),
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS
).toString()
}
val joinedAt = member?.joinedAt?.let {
DateUtils.getRelativeTimeSpanString(
Instant.parse(member.joinedAt).toEpochMilliseconds(),
System.currentTimeMillis(),
DateUtils.MINUTE_IN_MILLIS
).toString()
}
item(key = "joined") {
SheetTile(
header = {
Text(stringResource(R.string.user_info_sheet_category_joined))
},
contentPreview = {
if (joinedAt != null && server?.name != null) {
Text(
text = joinedAt,
fontSize = 14.sp
)
Text(
text = server.name,
style = MaterialTheme.typography.labelMedium,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Spacer(Modifier.height(8.dp))
}
accountAt?.let { _ ->
Text(
text = accountAt,
fontSize = 14.sp
)
Text(
text = stringResource(id = R.string.user_info_sheet_category_joined_revolt),
style = MaterialTheme.typography.labelMedium
)
}
}
) {
if (joinedAt != null && server?.name != null) {
Text(
text = joinedAt,
style = MaterialTheme.typography.displaySmall
)
Text(
text = server.name,
style = MaterialTheme.typography.labelMedium
)
Spacer(Modifier.height(8.dp))
}
accountAt?.let { _ ->
Text(
text = accountAt,
style = MaterialTheme.typography.displaySmall
)
Text(
text = stringResource(id = R.string.user_info_sheet_category_joined_revolt),
style = MaterialTheme.typography.labelMedium
)
}
}
}
if ((user.badges ?: 0) > 0) {
item(key = "info") {
SheetTile(
header = {
Text(stringResource(R.string.user_info_sheet_category_badges))
},
contentPreview = {
user.badges?.let { UserBadgeRow(badges = it) }
}
) {
user.badges?.let { UserBadgeList(badges = it) }
}
}
}
if (profile?.content.isNullOrBlank().not()) {
item(key = "bio", span = StaggeredGridItemSpan.FullLine) {
SheetTile(
header = {
Text(stringResource(R.string.user_info_sheet_category_bio))
},
contentPreview = {
Text(
text = profile?.content!!,
maxLines = 4,
overflow = TextOverflow.Ellipsis
)
}
) {
WebMarkdown(
text = profile?.content!!,
maskLoading = true
)
}
}
}
item(key = "actions", span = StaggeredGridItemSpan.FullLine) {
UserButtons(user, dismissSheet)
}
}
}
}

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="343dp"
android:height="343dp"
android:viewportWidth="343"
android:viewportHeight="343">
<path
android:pathData="M305.65,87.19 L247.51,145.32 194.67,92.47 252.8,34.34C217.61,19.87 175.69,26.9 147.13,55.49 118.56,84.05 111.52,125.99 125.99,161.18l-93.81,93.79c-5.84,5.84 -5.84,15.29 0,21.13l31.72,31.72c5.84,5.84 15.29,5.84 21.13,0l93.79,-93.81c35.18,14.47 77.13,7.43 105.69,-21.13 28.56,-28.58 35.59,-70.52 21.13,-105.69z"
android:strokeWidth="1.36402"
android:fillColor="#99aab5"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="250dp"
android:height="306dp"
android:viewportWidth="250"
android:viewportHeight="306">
<path
android:pathData="M124.88,0L0,55.5V138.75C0,215.76 53.28,287.77 124.88,305.25C196.47,287.77 249.75,215.76 249.75,138.75V55.5L124.88,0Z"
android:fillColor="#D93C3C"/>
<path
android:pathData="M125,0.06L124.88,0L0,55.5V138.75C0,215.76 53.28,287.77 124.88,305.25C124.92,305.24 124.96,305.23 125,305.22V0.06Z"
android:fillColor="#F55252"/>
<path
android:pathData="M168.38,126.36H161.06V107.43C161.06,87.32 144.68,71 124.5,71C104.32,71 87.94,87.32 87.94,107.43V126.36H80.63C72.58,126.36 66,132.91 66,140.93V197.86C66,205.87 72.58,212.43 80.63,212.43H168.38C176.42,212.43 183,205.87 183,197.86V140.93C183,132.91 176.42,126.36 168.38,126.36ZM147.17,126.36H101.83V107.43C101.83,94.97 112,84.84 124.5,84.84C137,84.84 147.17,94.97 147.17,107.43V126.36Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M125,212.43H168.38C176.42,212.43 183,205.87 183,197.86V140.93C183,132.91 176.42,126.36 168.38,126.36H161.06V107.43C161.06,87.49 144.95,71.27 125,71V84.85C137.27,85.11 147.17,95.14 147.17,107.43V126.36H125V212.43Z"
android:fillColor="#F1F1F1"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="343dp"
android:height="343dp"
android:viewportWidth="343"
android:viewportHeight="343">
<path
android:pathData="M252.57,30L333.43,171.5L252.57,313H90.86L10,171.5L90.86,30H252.57Z"
android:fillColor="#509AF0"/>
<path
android:pathData="M164.49,82.3C182.31,82.3 196.42,86.59 206.82,95.17C217.3,103.76 222.54,115.72 222.54,131.07C222.54,139.32 220.48,146.79 216.35,153.48C212.22,160.16 206.41,165.52 198.9,169.57C209.05,173.03 216.8,178.56 222.17,186.15C227.61,193.74 230.34,202.95 230.34,213.76C230.34,230.67 225.43,243.88 215.61,253.37C205.79,262.77 192.29,267.48 175.13,267.48C162.09,267.48 150.5,264.34 140.35,258.07V313H104.58V137.01C104.58,126.7 107.18,117.37 112.38,109.04C117.57,100.62 124.79,94.06 134.04,89.36C143.28,84.65 153.43,82.3 164.49,82.3ZM186.77,133.79C186.77,127.03 184.7,121.58 180.58,117.46C176.53,113.33 171.17,111.27 164.49,111.27C157.47,111.27 151.7,113.62 147.16,118.32C142.62,122.94 140.35,129.34 140.35,137.51V231.46C147.12,236.24 156.03,238.63 167.09,238.63C175.5,238.63 182.19,236.28 187.14,231.58C192.09,226.79 194.56,220.69 194.56,213.26C194.56,204.35 192.29,197.42 187.76,192.46C183.3,187.43 176.7,184.91 167.95,184.91H155.95V158.8H165.6C179.71,158.3 186.77,149.97 186.77,133.79Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="343dp"
android:height="343dp"
android:viewportWidth="343"
android:viewportHeight="343">
<path
android:pathData="m233.2,120.3c0,23.33 -12.69,37.33 -39.78,37.33h-44.85V83.82h44.86c27.08,0 39.78,14.42 39.78,36.49zM32.78,23.58 L76.21,83.96V321.36H148.57V208.96h17.35l61.8,112.42h81.68L240.84,203.44c19.14,-4.67 36.12,-15.75 48.12,-31.41 12,-15.66 18.31,-34.96 17.88,-54.7 0,-51.76 -36.39,-93.75 -109.19,-93.75H76.21Z"
android:strokeWidth="0.97733"
android:fillColor="#efab44"
android:strokeColor="#efab44"/>
</vector>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<group>
<clip-path
android:pathData="M0,0h32v32h-32z"/>
<path
android:fillColor="#FF000000"
android:pathData="M19.25,3.52c0.755,-2.176 3.064,-3.455 5.341,-2.886c2.41,0.603 3.877,3.048 3.275,5.457l-1.866,7.463l0,1.77c0.832,0.315 1.575,0.85 2.142,1.563c0.948,1.193 1.301,2.753 0.959,4.237c-0.116,0.502 -0.238,1.032 -0.363,1.574c-1.257,5.445 -6.105,9.302 -11.693,9.302l-0.045,-0.018l0,0.014c0,0 -0.412,0 -1.035,0c-5.571,0 -10.426,-3.79 -11.778,-9.194c-0.609,-2.431 -1.178,-4.706 -1.178,-4.706c-0.603,-2.409 0.864,-4.855 3.273,-5.457c0.165,-0.042 0.331,-0.073 0.495,-0.096c0.188,-1.832 1.498,-3.436 3.387,-3.909c0.358,-0.089 0.718,-0.133 1.072,-0.135l-0.602,-2.408c-0.602,-2.409 0.865,-4.854 3.275,-5.457c2.277,-0.569 4.586,0.71 5.341,2.886Z"/>
<path
android:pathData="M7,15c2.268,-2.268 2.496,-1.997 5,-4c0.736,-0.589 1.057,-2 2,-2c0.943,0 1.333,1.333 2,2l8,4l0,9l-8,-2l-9,0l0,-1.606c-0.517,-0.015 -1.015,-0.156 -1.455,-0.402l-0.558,-2.229l2.013,-2.763Z"
android:fillColor="#5E3583"/>
<path
android:pathData="M24.229,17c0.914,0 1.778,0.417 2.348,1.132c0.569,0.716 0.781,1.652 0.575,2.543c-0.116,0.502 -0.238,1.032 -0.363,1.574c-1.047,4.537 -5.088,7.751 -9.744,7.751l-0.045,0c0.001,-0.001 0.001,-0.003 0.002,-0.004l-0.002,0l-1.035,0c-4.653,0 -8.709,-3.166 -9.838,-7.679l-0.582,-2.325c0.681,0.381 1.503,0.511 2.316,0.308c0.01,-0.002 0.021,-0.005 0.031,-0.008c0.933,-0.233 1.709,-0.877 2.111,-1.75c0.138,-0.299 0.226,-0.614 0.266,-0.933c0.694,0.426 1.549,0.577 2.385,0.368c0.001,0 0.002,-0.001 0.002,-0.001c0.201,-0.05 0.393,-0.119 0.574,-0.205c-0.02,0.019 0.978,0.078 0.909,-0.655c0.538,-0.562 0.861,-1.321 0.861,-2.141c0,-0.161 0,-0.313 0,-0.447c0,-0.405 -0.068,-0.807 -0.2,-1.19l-1.059,-3.064l-1.166,-4.668c-0.335,-1.338 0.48,-2.697 1.819,-3.031c1.338,-0.335 2.697,0.48 3.031,1.819l1.825,7.298l1.825,-7.298c0.088,-0.344 0.243,-0.666 0.463,-0.944c0.2,-0.252 0.448,-0.465 0.728,-0.624c0.271,-0.154 0.57,-0.257 0.879,-0.301c0.277,-0.04 0.561,-0.032 0.836,0.022c0.269,0.052 0.529,0.149 0.766,0.286c0.22,0.126 0.42,0.286 0.591,0.473c0.347,0.377 0.574,0.86 0.641,1.369c0.041,0.312 0.02,0.627 -0.054,0.931l-1.925,7.702l0,1.692l-8,0l0,1.663l-1,1.337c0,3.314 3.686,6 7,6l1,-1l0,-2l-1,0c-2.209,0 -4,-1.791 -4,-4l6.229,0ZM4.987,17.763l-0.038,-0.152c-0.335,-1.339 0.48,-2.697 1.818,-3.032c0.521,-0.131 1.045,-0.087 1.511,0.094l0.786,1.573c0.295,0.589 0.306,1.28 0.031,1.878c-0.275,0.598 -0.807,1.039 -1.446,1.198c-0.01,0.003 -0.02,0.005 -0.031,0.008c-1.119,0.28 -2.262,-0.365 -2.6,-1.468l-0.031,-0.099ZM8.803,13.488c-0.26,-1.299 0.546,-2.589 1.846,-2.913c0.876,-0.219 1.761,0.054 2.361,0.645l0.845,2.444c0.096,0.278 0.145,0.57 0.145,0.864c0,0.134 0,0.286 0,0.447c0,0.961 -0.654,1.798 -1.586,2.031c-0.001,0 -0.002,0.001 -0.003,0.001c-0.96,0.24 -1.958,-0.219 -2.401,-1.105l-1.207,-2.414Z"
android:fillColor="#C596FD"/>
<path
android:pathData="M23,23l0,1.158c0,0.923 -0.426,1.796 -1.154,2.364c-0.728,0.569 -1.677,0.77 -2.574,0.546c-0.917,-0.229 -1.782,-0.445 -2.294,-0.574c-0.318,-0.079 -0.643,-0.119 -0.97,-0.119l-0.016,0c-0.327,0 -0.652,0.04 -0.97,0.119c-0.512,0.129 -1.377,0.345 -2.294,0.574c-0.897,0.224 -1.846,0.023 -2.574,-0.546c-0.728,-0.568 -1.154,-1.441 -1.154,-2.364c0,-0.172 0,-0.34 0,-0.501c0,-1.061 0.421,-2.078 1.172,-2.829c0.819,-0.819 1.951,-1.951 3,-3c0.019,-0.019 0.038,-0.038 0.058,-0.057c0.345,-0.163 0.652,-0.386 0.909,-0.655c0.569,-0.299 1.207,-0.459 1.861,-0.459l0,0.343c0,3.314 2.686,6 6,6l1,0Z"
android:fillColor="#8149BC"/>
<path
android:pathData="M23.704,4.041c1.047,0.261 1.589,1.707 1.21,3.226c-0.378,1.52 -1.536,2.542 -2.583,2.281c-1.047,-0.261 -1.589,-1.707 -1.21,-3.227c0.379,-1.519 1.536,-2.541 2.583,-2.28ZM14.761,4.042c-1.047,0.261 -1.596,1.677 -1.227,3.16c0.37,1.483 1.52,2.475 2.567,2.214c1.047,-0.261 1.597,-1.677 1.227,-3.16c-0.37,-1.483 -1.52,-2.475 -2.567,-2.214Z"
android:fillColor="#8149BC"/>
</group>
</vector>

View File

@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<group>
<clip-path
android:pathData="M0,0h32v32h-32z"/>
<path
android:pathData="M21.369,8.952c0.087,-0.295 0.247,-0.568 0.471,-0.792c0.001,-0.001 0.001,-0.001 0.002,-0.002c0.105,-0.105 0.226,-0.192 0.358,-0.258c0.792,-0.396 3.729,-1.865 5.094,-2.547c0.187,-0.094 0.404,-0.109 0.603,-0.043c0.198,0.066 0.362,0.209 0.456,0.396c0,0 0,0 0,0.001c0.407,0.814 0.407,1.772 0,2.586c-0.575,1.151 -1.401,2.803 -1.906,3.813c-0.009,0.017 -0.018,0.034 -0.027,0.051c0.715,0.946 1.222,2.054 1.462,3.255c0.536,2.68 1.118,5.588 1.118,5.588l-2,0l0,2l-2,-1c0,0 -3.283,2.189 -4.992,3.328c-0.657,0.438 -1.429,0.672 -2.219,0.672c-1.042,0 -2.536,0 -3.578,0c-0.79,0 -1.562,-0.234 -2.219,-0.672c-1.709,-1.139 -4.992,-3.328 -4.992,-3.328l-2,1l0,-2l-2,0l1.118,-5.588c0.24,-1.201 0.747,-2.309 1.462,-3.255c-0.009,-0.017 -0.018,-0.034 -0.027,-0.051c-0.505,-1.01 -1.331,-2.662 -1.906,-3.813c-0.407,-0.814 -0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c0.094,-0.187 0.258,-0.33 0.456,-0.396c0.199,-0.066 0.416,-0.051 0.603,0.043c1.365,0.682 4.302,2.151 5.094,2.547c0.132,0.066 0.253,0.153 0.358,0.258c0.001,0.001 0.001,0.001 0.002,0.002c0.224,0.224 0.384,0.497 0.471,0.792l1.268,-0.461c2.649,-0.963 5.553,-0.963 8.202,0l1.268,0.461Z"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000"/>
<path
android:pathData="M3.993,16.036l0.125,-0.624c0.548,-2.74 2.485,-4.995 5.11,-5.95c0.877,-0.318 1.799,-0.654 2.671,-0.971c2.649,-0.963 5.553,-0.963 8.202,0c0.872,0.317 1.794,0.653 2.671,0.971c2.625,0.955 4.562,3.21 5.11,5.95l0.125,0.624c-2.191,-1.95 -5.028,-3.036 -7.978,-3.036c-0.009,0 -0.019,0 -0.029,0c-1.657,0 -3,1.343 -3,3c0,1.105 0.895,2 2,2c0,0 0,0 0,0l1,1l-4,4l-4,-4l1,-1l0,0c1.105,0 2,-0.895 2,-2c0,-1.657 -1.343,-3 -3,-3c-0.01,0 -0.02,0 -0.029,0c-2.95,0 -5.787,1.086 -7.978,3.036Z"
android:fillColor="#878787"/>
<path
android:pathData="M19.333,19.667c0.01,0.004 3.479,0.333 3.479,0.333c0,0 -0.353,2.537 0,3.459l-2.804,1.869c-0.657,0.438 -1.429,0.672 -2.219,0.672c-1.042,0 -2.536,0 -3.578,0c-0.79,0 -1.562,-0.234 -2.219,-0.672l-2.804,-1.869c0.342,-0.893 0,-3.097 0,-3.097c0,0 3.469,-0.691 3.479,-0.695l3.333,3.333l3.333,-3.333ZM18.014,17.74c-0.606,-0.343 -1.014,-0.994 -1.014,-1.74c0,-1.657 1.343,-3 3,-3c0.01,0 0.02,0 0.029,0c2.95,0 5.787,1.086 7.978,3.036l0.993,4.964l-1.667,0c0,0 -9.328,-3.346 -9.319,-3.26ZM4.667,21l-1.667,0l0.993,-4.964c2.191,-1.95 5.028,-3.036 7.978,-3.036c0.009,0 0.019,0 0.029,0c1.657,0 3,1.343 3,3c0,0.746 -0.408,1.397 -1.014,1.74c0.009,-0.086 -9.319,3.26 -9.319,3.26Z"
android:fillColor="#e1e1e1"/>
<path
android:pathData="M4.667,21l1.626,-2.927c1.054,-1.897 3.053,-3.073 5.222,-3.073c0.003,0 0.006,0 0.009,0c1.367,0 2.476,1.109 2.476,2.476c0,0.001 0,0.002 0,0.002c0,0.933 -0.527,1.785 -1.361,2.202c-0.015,0.008 -0.03,0.016 -0.046,0.023c-1.567,0.784 -2.781,2.126 -3.405,3.756l-2.188,-1.459l-2,1l0,-2l-0.333,0ZM22.812,23.459c-0.624,-1.63 -1.838,-2.972 -3.405,-3.756c-0.016,-0.007 -0.031,-0.015 -0.046,-0.023c-0.834,-0.417 -1.361,-1.269 -1.361,-2.202c0,0 0,-0.001 0,-0.002c0,-1.367 1.109,-2.476 2.476,-2.476c0.003,0 0.006,0 0.009,0c2.169,0 4.168,1.176 5.222,3.073l1.626,2.927l-0.333,0l0,2l-2,-1l-2.188,1.459Z"
android:fillColor="#484848"/>
<path
android:fillColor="#FF000000"
android:pathData="M11.5,17.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path
android:fillColor="#FF000000"
android:pathData="M20.5,17.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path
android:fillColor="#FF000000"
android:pathData="M15.236,21c-0.155,0 -0.308,0.036 -0.447,0.106c-0.047,0.023 -0.1,0.049 -0.158,0.078c-0.901,0.451 -1.266,1.546 -0.815,2.447c0,0.001 0,0.001 0,0.001c0.113,0.226 0.343,0.368 0.595,0.368c0.768,0 2.41,0 3.178,0c0.252,0 0.482,-0.142 0.595,-0.368c0,0 0,0 0,-0.001c0.451,-0.901 0.086,-1.996 -0.815,-2.447c-0.058,-0.029 -0.111,-0.055 -0.158,-0.078c-0.139,-0.07 -0.292,-0.106 -0.447,-0.106c-0.385,0 -1.143,0 -1.528,0Z"/>
<path
android:pathData="M6.894,12.553c-0.494,0.247 -1.094,0.047 -1.341,-0.447c-0.505,-1.01 -1.331,-2.662 -1.906,-3.813c-0.407,-0.814 -0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c0.094,-0.187 0.258,-0.33 0.456,-0.396c0.199,-0.066 0.416,-0.051 0.603,0.043c1.365,0.682 4.302,2.151 5.094,2.547c0.132,0.066 0.253,0.153 0.358,0.258c0.001,0.001 0.001,0.001 0.002,0.002c0.426,0.426 0.621,1.031 0.525,1.627c-0.097,0.595 -0.474,1.107 -1.013,1.377c-0.973,0.486 -2.044,1.022 -2.778,1.389ZM25.106,12.553c0.494,0.247 1.094,0.047 1.341,-0.447c0.505,-1.01 1.331,-2.662 1.906,-3.813c0.407,-0.814 0.407,-1.772 0,-2.586c0,-0.001 0,-0.001 0,-0.001c-0.094,-0.187 -0.258,-0.33 -0.456,-0.396c-0.199,-0.066 -0.416,-0.051 -0.603,0.043c-1.365,0.682 -4.302,2.151 -5.094,2.547c-0.132,0.066 -0.253,0.153 -0.358,0.258c-0.001,0.001 -0.001,0.001 -0.002,0.002c-0.426,0.426 -0.621,1.031 -0.525,1.627c0.097,0.595 0.474,1.107 1.013,1.377c0.973,0.486 2.044,1.022 2.778,1.389Z"
android:fillColor="#484848"/>
</group>
</vector>

View File

@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="292dp"
android:height="412dp"
android:viewportWidth="292"
android:viewportHeight="412">
<path
android:pathData="M123.5,267.04L128.54,258.86L138.24,252.16L154.5,249.78L183.05,252.16L197.73,256.52L203.28,269.6V287.79L197.73,312.32L188.6,316.72L165.6,319.57L154.5,333.7V350.9L169.97,356.45L197.73,361.61L217.16,364.38L243.73,356.45L269.41,342.97L273.81,319.57L276.24,287.79V249.78L273.81,197.23L269.41,151.32L264.38,118.61L258.72,97.23L246.77,76.48L234.19,56.98L212.18,47.55L185.76,43.77H161.24L137.97,47.55L123.5,56.98L111.56,84.02L97.72,126.79L86.4,180.25L71.93,262L63.13,290.3H57.47L38.6,287.79H26.02L15.96,295.33L10.3,307.28L15.96,316.72L31.06,328.67L57.47,333.7L105.89,328.67L128.54,312.32V299.11L123.5,280.24V267.04Z"
android:strokeLineJoin="round"
android:strokeWidth="10"
android:fillColor="#BD0F11"
android:strokeColor="#000000"/>
<path
android:pathData="M143.27,91.29h76.41v25.67h-76.41z"
android:fillColor="#9DC7D7"/>
<path
android:pathData="M138.79,96.11L145.64,109.56L154.76,115.76L166.85,118.17L180.08,120.17H191.34C194.54,119.37 199.78,119.17 202.77,118.17C205.75,117.17 208.05,116.43 209.99,115.76H214.6L218.01,111.95L222.62,104.53"
android:strokeLineJoin="round"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#4E626B"/>
<path
android:pathData="M148.15,123.28L135.46,111.78V99.48L140.22,91.15L148.15,86.79H160.85H175.52H189.79H202.09L212.4,91.15L221.52,99.48L223.9,109L217.95,118.12L208.04,123.28L186.23,127.24H165.6L148.15,123.28Z"
android:strokeLineJoin="round"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#000000"/>
<path
android:pathData="M176.9,99.92L174.29,98.11V96.91L176.9,95.71H181.71H186.92H191.54L196.75,96.91L200.36,98.11L204.57,99.92L202.77,101.12H196.75H191.54H186.12L181.71,99.92H176.9Z"
android:strokeLineJoin="bevel"
android:strokeWidth="4"
android:fillColor="#ffffff"
android:strokeColor="#ffffff"/>
</vector>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,52 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M29,21l-26,0l-1,1l0,3l28,0l0,-3l-1,-1Z"
android:fillColor="#60ae33"/>
<path
android:pathData="M2,7h28v15h-28z"
android:fillColor="#80c95b"/>
<path
android:pathData="M8.5,9.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
android:fillColor="#5da436"/>
<path
android:pathData="M8.5,19.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
android:fillColor="#5da436"/>
<path
android:pathData="M29,9.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
android:fillColor="#5da436"/>
<path
android:pathData="M29,19.5c0,-0.828 -0.672,-1.5 -1.5,-1.5l-2.5,0c-0.398,0 -0.779,0.158 -1.061,0.439c-0.281,0.282 -0.439,0.663 -0.439,1.061c0,0.828 0.672,1.5 1.5,1.5l2.5,0c0.828,0 1.5,-0.672 1.5,-1.5l0,0Z"
android:fillColor="#5da436"/>
<path
android:pathData="M21,14c0,-0.552 -0.448,-1 -1,-1c-0.552,0 -1,0.448 -1,1c0,0.322 0,0.678 0,1c0,0.552 0.448,1 1,1c0.552,0 1,-0.448 1,-1c0,-0.322 0,-0.678 0,-1Z"
android:fillColor="#5da436"/>
<path
android:pathData="M24,14c0,-0.552 -0.448,-1 -1,-1c-0.552,0 -1,0.448 -1,1c0,0.322 0,0.678 0,1c0,0.552 0.448,1 1,1c0.552,0 1,-0.448 1,-1c0,-0.322 0,-0.678 0,-1Z"
android:fillColor="#5da436"/>
<group>
<clip-path
android:pathData="M8,11h8v7h-8z"/>
<path
android:pathData="M16,14l-8,0l0,-1l8,0l0,1Z"
android:fillColor="#fff"/>
<path
android:pathData="M16,16l-8,0l0,-1l8,0l0,1Z"
android:fillColor="#fff"/>
<path
android:pathData="M15,10.335l0,7.665l-1,0l0,-4.5l-1.771,4.25l-0.458,0l-1.771,-4.25l0,4.5l-1,0l0,-7.665l0.706,-0.141l2.294,5.506l2.294,-5.506l0.706,0.141Z"
android:fillColor="#fff"/>
</group>
<path
android:pathData="M27,20l-22,0l0,-11l22,0l0,11ZM6,10l0,9l20,0l0,-9l-20,0Z"
android:fillColor="#5da436"/>
<path
android:pathData="M20,22l-1,-1l-6,0l-1,1l0,3l8,0l0,-3Z"
android:fillColor="#ccc"/>
<path
android:pathData="M12,7h8v15h-8z"
android:fillColor="#eee"/>
</vector>

View File

@ -0,0 +1,28 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="343dp"
android:height="343dp"
android:viewportWidth="343"
android:viewportHeight="343">
<group>
<clip-path
android:pathData="M0,0h343v343h-343z"/>
<path
android:pathData="M141.42,31l141.42,141.42l-141.42,141.42l-141.42,-141.42z"
android:fillColor="#01BE6E"/>
<path
android:pathData="M137.93,182.46C128.75,173.51 120.67,165.64 116.08,147.51H148.19V133.96H116.3V116.05H102.54V134.18H70.42V147.73H103.19C103.19,147.73 102.97,150.35 102.54,152.32C97.95,170.23 92.49,181.59 70.42,192.73L75.01,206.28C95.98,195.13 106.9,181.15 111.71,165.64C116.3,177.44 124.16,187.05 133.12,195.79L137.93,182.46Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M180.31,138.55H161.96L129.84,228.77H143.6L152.78,201.69H189.48L198.66,228.77H212.42L180.31,138.55ZM157.37,188.14L171.13,152.1L184.9,188.36L157.37,188.14Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M305.47,170.18L208.17,267.48C206.83,268.82 205.15,269.77 203.31,270.23L148.42,281.02L159.21,226.12C159.67,224.29 160.62,222.6 161.96,221.26L259.26,123.97L274.42,108.8L320.42,103.92V155.23L305.47,170.18Z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M208.17,267.48L305.47,170.18L259.26,123.96L161.96,221.26C160.62,222.6 159.67,224.29 159.21,226.12L148.42,281.02L203.31,270.23C205.15,269.77 206.83,268.82 208.17,267.48ZM336.88,138.77C345.06,130.59 345.06,117.34 336.88,109.16L320.28,92.55C312.1,84.38 298.85,84.38 290.67,92.55L274.06,109.16L320.28,155.38L336.88,138.77Z"
android:fillColor="#EA596E"/>
<path
android:pathData="M305.47,170.18L208.17,267.48C206.83,268.82 205.15,269.77 203.31,270.23L148.42,281.02L159.21,226.12C159.67,224.29 160.62,222.6 161.96,221.26L259.26,123.97L305.47,170.18Z"
android:fillColor="#FFCC4D"/>
</group>
</vector>

View File

@ -277,6 +277,10 @@
<string name="user_info_sheet_bio_empty">This user hasn\'t set a bio yet.</string>
<string name="user_info_sheet_bio_not_found">This user\'s bio could not be fetched. Please verify you share a server or are friends.</string>
<string name="user_info_sheet_category_roles">Roles</string>
<string name="user_info_sheet_category_joined">Joined</string>
<string name="user_info_sheet_category_joined_revolt" translatable="false">Revolt</string>
<string name="user_info_sheet_category_badges">Badges</string>
<string name="user_info_sheet_category_bot">Bot</string>
<string name="user_info_sheet_add_friend">Add Friend</string>
<string name="user_info_sheet_send_message">Send Message</string>
<string name="user_info_sheet_remove_friend">Remove Friend</string>
@ -290,6 +294,17 @@
<string name="user_info_sheet_copy_id">Copy ID</string>
<string name="user_info_sheet_failed_to_open_dm">Could not open DM with this user.</string>
<string name="user_badge_developer">Developer</string>
<string name="user_badge_translator">Translator</string>
<string name="user_badge_supporter">Supporter</string>
<string name="user_badge_responsible_disclosure">Responsible Disclosure</string>
<string name="user_badge_founder">Founder</string>
<string name="user_badge_platform_moderation">Platform Moderation</string>
<string name="user_badge_active_supporter">Active Supporter</string>
<string name="user_badge_paw" translatable="false">🦊</string>
<string name="user_badge_early_adopter">Early Adopter</string>
<string name="user_badge_reserved_relevant_joke_badge_1" translatable="false">sus</string>
<string name="user_badge_reserved_relevant_joke_badge_2" translatable="false">It\'s Morbin Time</string>
<string name="add_server_sheet_title">Add a server</string>
<string name="add_server_sheet_join_by_invite">Join by invite code or link</string>