Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-26 14:12:43 +03:00
commit c306b16a7b
1308 changed files with 41564 additions and 8590 deletions

View file

@ -6,18 +6,21 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.R
import com.tangem.core.ui.components.buttons.common.TangemButtonIconPosition
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.conditional
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
@ -34,6 +37,7 @@ data class SmallButtonConfig(
val onClick: () -> Unit,
val icon: TangemButtonIconPosition = TangemButtonIconPosition.None,
val isEnabled: Boolean = true,
val isLoading: Boolean = false,
)
/**
@ -68,7 +72,7 @@ private fun SmallButton(config: SmallButtonConfig, isPrimary: Boolean, modifier:
label = "Update background color",
)
Row(
Box(
modifier = modifier
.defaultMinSize(
minWidth = TangemTheme.dimens.size46,
@ -79,7 +83,7 @@ private fun SmallButton(config: SmallButtonConfig, isPrimary: Boolean, modifier:
color = backgroundColor,
shape = shape,
)
.clickable(enabled = config.isEnabled, onClick = config.onClick)
.clickable(enabled = !config.isLoading && config.isEnabled, onClick = config.onClick)
.padding(
paddingValues = when (config.icon) {
is TangemButtonIconPosition.None -> PaddingValues(
@ -95,42 +99,54 @@ private fun SmallButton(config: SmallButtonConfig, isPrimary: Boolean, modifier:
)
},
),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
contentAlignment = Alignment.Center,
) {
ContentContainer(
iconPosition = config.icon,
text = {
val textColor by animateColorAsState(
targetValue = when {
!config.isEnabled -> TangemTheme.colors.text.disabled
isPrimary -> TangemTheme.colors.text.primary2
else -> TangemTheme.colors.text.primary1
},
label = "Update text color",
)
if (config.isLoading) {
CircularProgressIndicator(
strokeWidth = TangemTheme.dimens.size2,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier.size(TangemTheme.dimens.size16),
)
}
Row(
modifier = Modifier.conditional(config.isLoading) { alpha(0f) },
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
ContentContainer(
iconPosition = config.icon,
text = {
val textColor by animateColorAsState(
targetValue = when {
!config.isEnabled -> TangemTheme.colors.text.disabled
isPrimary -> TangemTheme.colors.text.primary2
else -> TangemTheme.colors.text.primary1
},
label = "Update text color",
)
Text(
modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing4),
text = config.text.resolveReference(),
color = textColor,
maxLines = 1,
style = TangemTheme.typography.button,
)
},
icon = { iconResId ->
Icon(
modifier = Modifier.size(TangemTheme.dimens.size16),
painter = painterResource(id = iconResId),
tint = if (config.isEnabled) {
TangemTheme.colors.icon.secondary
} else {
TangemTheme.colors.icon.inactive
},
contentDescription = null,
)
},
)
Text(
modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing4),
text = config.text.resolveReference(),
color = textColor,
maxLines = 1,
style = TangemTheme.typography.button,
)
},
icon = { iconResId ->
Icon(
modifier = Modifier.size(TangemTheme.dimens.size16),
painter = painterResource(id = iconResId),
tint = if (config.isEnabled) {
TangemTheme.colors.icon.secondary
} else {
TangemTheme.colors.icon.inactive
},
contentDescription = null,
)
},
)
}
}
}
@ -172,6 +188,7 @@ private fun ButtonsSample() {
)
PrimarySmallButton(config = config)
SecondarySmallButton(config = config.copy(text = TextReference.Str(value = "Add")))
SecondarySmallButton(config = config.copy(text = TextReference.Str(value = "Add"), isLoading = true))
SecondarySmallButton(
config = config.copy(
text = TextReference.Str(value = "Rating"),
@ -191,5 +208,12 @@ private fun ButtonsSample() {
isEnabled = false,
),
)
SecondarySmallButton(
config = config.copy(
text = TextReference.Str(value = "Add token"),
icon = TangemButtonIconPosition.Start(iconResId = R.drawable.ic_plus_24),
isLoading = true,
),
)
}
}

View file

@ -22,6 +22,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
@ -133,6 +135,13 @@ fun ActionBaseButton(
}
}
.clip(shape)
.semantics {
contentDescription = if (config.shouldDimContent) {
"Action button is dimmed"
} else {
"Action button is not dimmed"
}
}
.combinedClickable(
enabled = config.isEnabled,
onClick = config.onClick,

View file

@ -8,10 +8,12 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveAnnotatedReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.test.FooterTestTags
/**
* Container for footer info below the text field
@ -37,7 +39,8 @@ fun FooterContainer(
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier
.padding(paddingValues),
.padding(paddingValues)
.testTag(FooterTestTags.FOOTER_TEXT),
)
}
}

View file

@ -12,6 +12,7 @@ import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.themedColor
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.test.PopUpMenuTestTags
@ -28,7 +29,7 @@ fun TangemDropdownItem(item: TangemDropdownMenuItem, dismissParent: () -> Unit,
.padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16)
.testTag(PopUpMenuTestTags.BUTTON),
text = item.title.resolveReference(),
style = TangemTheme.typography.button.copy(color = item.textColorProvider()),
style = TangemTheme.typography.button.copy(color = item.textColor.resolveReference()),
)
}
@ -42,7 +43,7 @@ private fun Preview_TokenDetailsAppBarDropdownItem() {
dismissParent = {},
item = TangemDropdownMenuItem(
title = TextReference.Res(id = R.string.token_details_hide_token),
textColorProvider = { TangemTheme.colors.text.warning },
textColor = themedColor { TangemTheme.colors.text.warning },
onClick = { },
),
)

View file

@ -1,11 +1,10 @@
package com.tangem.core.ui.components.dropdownmenu
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import com.tangem.core.ui.extensions.ColorReference
import com.tangem.core.ui.extensions.TextReference
data class TangemDropdownMenuItem(
val title: TextReference,
val textColorProvider: @Composable () -> Color,
val textColor: ColorReference,
val onClick: () -> Unit,
)

View file

@ -0,0 +1,79 @@
package com.tangem.core.ui.components.feature
import android.content.res.Configuration
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
@Composable
fun FeatureBlock(title: String, description: String, iconRes: Int, modifier: Modifier = Modifier) {
Row(
modifier = modifier,
) {
Icon(
modifier = Modifier
.padding(horizontal = 12.dp),
painter = painterResource(iconRes),
contentDescription = null,
tint = TangemTheme.colors.icon.primary1,
)
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp),
) {
Text(
text = title,
style = TangemTheme.typography.subtitle1,
color = TangemTheme.colors.text.primary1,
)
Text(
modifier = Modifier
.padding(top = 4.dp),
text = description,
style = TangemTheme.typography.body2,
color = TangemTheme.colors.text.secondary,
)
}
}
}
@Preview(showBackground = true, widthDp = 360)
@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun PreviewFeatureBlock() {
TangemThemePreview {
Column(
modifier = Modifier
.background(TangemTheme.colors.background.primary)
.padding(16.dp),
) {
FeatureBlock(
title = stringResourceSafe(R.string.backup_info_save_title),
description = stringResourceSafe(R.string.backup_info_save_description, "12"),
iconRes = R.drawable.ic_lock_24,
)
Spacer(modifier = Modifier.height(24.dp))
FeatureBlock(
title = stringResourceSafe(R.string.backup_info_keep_title),
description = stringResourceSafe(R.string.backup_info_keep_description),
iconRes = R.drawable.ic_settings_24,
)
}
}
}

View file

@ -134,13 +134,16 @@ fun InputRowRecipient(
QrButton(
visible = value.isBlank(),
onQrCodeClick = onQrCodeClick,
modifier = Modifier.testTag(SendAddressScreenTestTags.QR_BUTTON),
)
PasteButton(
isPasteButtonVisible = value.isBlank(),
onClick = onPasteClick,
backgroundColorEnabled = TangemTheme.colors.button.secondary,
textColor = TangemTheme.colors.text.primary1,
modifier = Modifier.padding(start = TangemTheme.dimens.spacing8),
modifier = Modifier
.padding(start = TangemTheme.dimens.spacing8)
.testTag(SendAddressScreenTestTags.ADDRESS_PASTE_BUTTON),
)
}
}
@ -224,6 +227,7 @@ private fun ResolvedAddressRow(isLoading: Boolean, resolvedAddress: String?) {
text = state.address,
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
modifier = Modifier.testTag(SendAddressScreenTestTags.RESOLVED_ADDRESS),
)
}
}

View file

@ -21,7 +21,7 @@ import com.tangem.core.ui.utils.getGreyScaleColorFilter
* @param onImageError composable to show if image loading failed
*/
@Composable
internal fun InputRowAsyncImage(
fun InputRowAsyncImage(
imageUrl: String,
modifier: Modifier = Modifier,
isGrayscale: Boolean = false,

View file

@ -71,7 +71,6 @@ fun NetworkTitle(
Spacer(modifier = Modifier.size(TangemTheme.dimens.spacing8))
Box(
modifier = Modifier
.weight(weight = 1f)
.heightIn(min = TangemTheme.dimens.size24),
contentAlignment = Alignment.CenterEnd,
content = action,

View file

@ -53,7 +53,7 @@ fun SelectorRowItem(
val textStyle = if (isSelected && showSelectedAppearance) {
TangemTheme.typography.subtitle2
} else {
TangemTheme.typography.body2
TangemTheme.typography.body1
}
Box(
modifier = modifier

View file

@ -82,7 +82,7 @@ private fun Preview_TooltipText() {
) {
TooltipText(
text = stringReference("Text"),
onInfoClick = { /* [REDACTED_TODO_COMMENT]*/ },
onInfoClick = { },
)
}
}

View file

@ -27,6 +27,7 @@ import com.tangem.core.ui.components.marketprice.PriceChangeType
import com.tangem.core.ui.components.token.internal.*
import com.tangem.core.ui.components.token.state.TokenItemState
import com.tangem.core.ui.components.token.state.TokenItemState.FiatAmountState
import com.tangem.core.ui.components.token.state.TokenItemState.Subtitle2State
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.rememberHapticFeedback
import com.tangem.core.ui.extensions.stringReference
@ -691,7 +692,10 @@ object AccountItemPreviewData {
value = stringReference("24 tokens"),
isAvailable = false,
),
subtitle2State = null,
subtitle2State = Subtitle2State.PriceChangeContent(
priceChangePercent = "0,43 %",
type = PriceChangeType.UP,
),
onItemClick = {},
onItemLongClick = {},
)

View file

@ -11,7 +11,6 @@ import com.tangem.core.ui.R
import com.tangem.core.ui.components.RectangleShimmer
import com.tangem.core.ui.components.audits.AuditLabel
import com.tangem.core.ui.components.text.applyBladeBrush
import com.tangem.core.ui.components.token.state.TokenItemState
import com.tangem.core.ui.extensions.orMaskWithStars
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
@ -31,7 +30,7 @@ internal fun TokenCryptoAmount(
isFlickering = state.isFlickering,
)
}
is TokenItemState.Subtitle2State.LabelContent -> {
is TokenCryptoAmountState.LabelContent -> {
AuditLabel(state = state.auditLabelUM, modifier = modifier)
}
is TokenCryptoAmountState.Unreachable -> {
@ -46,6 +45,15 @@ internal fun TokenCryptoAmount(
is TokenCryptoAmountState.Locked -> {
LockedRectangle(modifier = modifier.placeholderSize())
}
is TokenCryptoAmountState.PriceChangeContent -> {
PriceBlock(
modifier = modifier,
price = null,
type = state.type,
priceChangePercent = state.priceChangePercent,
isFlickering = state.isFlickering,
)
}
null -> Unit
}
}

View file

@ -64,8 +64,8 @@ internal fun TokenPrice(state: TokenPriceState?, modifier: Modifier = Modifier)
}
@Composable
private fun PriceBlock(
price: String,
internal fun PriceBlock(
price: String?,
isFlickering: Boolean,
modifier: Modifier = Modifier,
type: PriceChangeType? = null,
@ -75,13 +75,15 @@ private fun PriceBlock(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
) {
PriceText(
modifier = Modifier.weight(weight = 1f, fill = false),
text = price,
isFlickering = isFlickering,
)
if (price != null) {
PriceText(
modifier = Modifier.weight(weight = 1f, fill = false),
text = price,
isFlickering = isFlickering,
)
SpacerW6()
SpacerW6()
}
if (type != null) {
PriceChangeIcon(

View file

@ -240,6 +240,12 @@ sealed class TokenItemState {
val isFlickering: Boolean = false,
) : Subtitle2State()
data class PriceChangeContent(
val priceChangePercent: String,
val type: PriceChangeType,
val isFlickering: Boolean = false,
) : Subtitle2State()
data class LabelContent(val auditLabelUM: AuditLabelUM) : Subtitle2State()
data object Unreachable : Subtitle2State()

View file

@ -83,7 +83,7 @@ fun PortfolioTokensListItem(state: PortfolioTokensListItemUM, isBalanceHidden: B
}
@Composable
private fun ExpandedPortfolioHeader(state: TokenItemState, isCollapsable: Boolean, modifier: Modifier = Modifier) {
fun ExpandedPortfolioHeader(state: TokenItemState, isCollapsable: Boolean, modifier: Modifier = Modifier) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier

View file

@ -98,6 +98,7 @@ fun getActiveIconRes(blockchainId: String): Int {
"quai", "quai/test" -> R.drawable.img_quai_22
"linea", "linea/test" -> R.drawable.img_linea_22
"arbitrum-nova" -> R.drawable.img_arbitrum_nova_22
"plasma", "plasma/test" -> R.drawable.img_plasma_22
else -> R.drawable.ic_alert_24
}
}
@ -194,6 +195,7 @@ fun getActiveIconResByCoinId(coinId: String): Int {
"quai", "quai/test" -> R.drawable.img_quai_22
"linea", "linea/test" -> R.drawable.img_linea_22
"arbitrum-nova" -> R.drawable.img_arbitrum_nova_22
"plasma", "plasma/test" -> R.drawable.img_plasma_22
else -> R.drawable.ic_alert_24
}
}
@ -293,6 +295,7 @@ fun getGreyedOutIconRes(blockchainId: String): Int {
"quai", "quai/test" -> R.drawable.ic_quai_22
"linea", "linea/test" -> R.drawable.ic_linea_22
"arbitrum-nova" -> R.drawable.ic_arbitrum_nova_22
"plasma", "plasma/test" -> R.drawable.ic_plasma_22
else -> R.drawable.ic_alert_24
}
}

View file

@ -0,0 +1,33 @@
package com.tangem.core.ui.extensions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.Color
/**
* Utility class for keeping themed color reference from app theme.
*
* It necessary to use [Immutable] annotation for runtime stability.
*
* @property value color provider from theme
*/
@Immutable
data class ColorReference(val value: @Composable () -> Color)
/**
* Creates a [ColorReference] using a themed color from the app theme with a lambda.
*
* @param value The color provider from theme.
* @return A [ColorReference] representing the themed color.
*/
fun themedColor(value: @Composable () -> Color): ColorReference {
return ColorReference(value)
}
/**
* Resolves [ColorReference] to [Color]
*/
@Composable
fun ColorReference.resolveReference(): Color {
return value()
}

View file

@ -20,6 +20,7 @@ object TangemColorPalette {
// region Light
val Light1 = Color(0xFFF5F5F5)
val Light1V2 = Color(0xFFF4F4F4)
val Light2 = Color(0xFFEBEBEB)
val Light3 = Color(0xFFD3D3D3)
val Light4 = Color(0xFFC9C9C9)
@ -27,6 +28,7 @@ object TangemColorPalette {
// endregion Light
// region Green
val Green = Color(0xFF0C9F3D)
val Meadow = Color(0xFF1ACE80)
val MagicMint = Color(0xFFA3EBCC)
val DarkGreen = Color(0xFF06311F)
@ -45,4 +47,9 @@ object TangemColorPalette {
val Tangerine = Color(0xFFFFB71B)
val Mustard = Color(0xFFFDDE55)
// endregion Yellow
// region Overlay
val Overlay1 = Color(0x66000000)
val Overlay2 = Color(0xB2000000)
// endregion Overlay
}

View file

@ -0,0 +1,536 @@
@file:Suppress("LongParameterList")
package com.tangem.core.ui.res
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.Color
@Stable
class TangemColors2 internal constructor(
val text: Text,
val graphic: Graphic,
val button: Button,
val surface: Surface,
val controls: Controls,
val field: Field,
val overlay: Overlay,
val border: Border,
val fill: Fill,
val skeleton: Skeleton,
val markers: Markers,
) {
@Stable
class Text internal constructor(
val neutral: Neutral,
val status: Status,
) {
@Stable
class Neutral internal constructor(
primary: Color,
primaryInverted: Color,
secondary: Color,
tertiary: Color,
primaryInvertedConstant: Color,
) {
var primary by mutableStateOf(primary)
private set
var primaryInverted by mutableStateOf(primaryInverted)
private set
var secondary by mutableStateOf(secondary)
private set
var tertiary by mutableStateOf(tertiary)
private set
var primaryInvertedConstant by mutableStateOf(primaryInvertedConstant)
private set
fun update(other: Neutral) {
primary = other.primary
primaryInverted = other.primaryInverted
secondary = other.secondary
tertiary = other.tertiary
primaryInvertedConstant = other.primaryInvertedConstant
}
}
@Stable
class Status internal constructor(
disabled: Color,
accent: Color,
warning: Color,
attention: Color,
positive: Color,
) {
var disabled by mutableStateOf(disabled)
private set
var accent by mutableStateOf(accent)
private set
var warning by mutableStateOf(warning)
private set
var attention by mutableStateOf(attention)
private set
var positive by mutableStateOf(positive)
private set
fun update(other: Status) {
disabled = other.disabled
accent = other.accent
warning = other.warning
attention = other.attention
positive = other.positive
}
}
fun update(other: Text) {
neutral.update(other.neutral)
status.update(other.status)
}
}
@Stable
class Graphic internal constructor(
val neutral: Neutral,
val status: Status,
) {
@Stable
class Neutral internal constructor(
primary: Color,
primaryInverted: Color,
secondary: Color,
tertiary: Color,
quaternary: Color,
primaryInvertedConstant: Color,
tertiaryConstant: Color,
) {
var primary by mutableStateOf(primary)
private set
var primaryInverted by mutableStateOf(primaryInverted)
private set
var secondary by mutableStateOf(secondary)
private set
var tertiary by mutableStateOf(tertiary)
private set
var quaternary by mutableStateOf(quaternary)
private set
var primaryInvertedConstant by mutableStateOf(primaryInvertedConstant)
private set
var tertiaryConstant by mutableStateOf(tertiaryConstant)
private set
fun update(other: Neutral) {
primary = other.primary
primaryInverted = other.primaryInverted
secondary = other.secondary
tertiary = other.tertiary
quaternary = other.quaternary
primaryInvertedConstant = other.primaryInvertedConstant
tertiaryConstant = other.tertiaryConstant
}
}
@Stable
class Status internal constructor(
accent: Color,
warning: Color,
attention: Color,
) {
var accent by mutableStateOf(accent)
private set
var warning by mutableStateOf(warning)
private set
var attention by mutableStateOf(attention)
private set
fun update(other: Status) {
accent = other.accent
warning = other.warning
attention = other.attention
}
}
fun update(other: Graphic) {
neutral.update(other.neutral)
status.update(other.status)
}
}
@Stable
class Button internal constructor(
backgroundPrimary: Color,
backgroundSecondary: Color,
backgroundDisabled: Color,
backgroundPositive: Color,
textPrimary: Color,
textSecondary: Color,
textDisabled: Color,
iconPrimary: Color,
iconSecondary: Color,
iconDisabled: Color,
borderPrimary: Color,
) {
var backgroundPrimary by mutableStateOf(backgroundPrimary)
private set
var backgroundSecondary by mutableStateOf(backgroundSecondary)
private set
var backgroundDisabled by mutableStateOf(backgroundDisabled)
private set
var backgroundPositive by mutableStateOf(backgroundPositive)
private set
var textPrimary by mutableStateOf(textPrimary)
private set
var textSecondary by mutableStateOf(textSecondary)
private set
var textDisabled by mutableStateOf(textDisabled)
private set
var iconPrimary by mutableStateOf(iconPrimary)
private set
var iconSecondary by mutableStateOf(iconSecondary)
private set
var iconDisabled by mutableStateOf(iconDisabled)
private set
var borderPrimary by mutableStateOf(borderPrimary)
private set
fun update(other: Button) {
backgroundPrimary = other.backgroundPrimary
backgroundSecondary = other.backgroundSecondary
backgroundDisabled = other.backgroundDisabled
backgroundPositive = other.backgroundPositive
textPrimary = other.textPrimary
textSecondary = other.textSecondary
textDisabled = other.textDisabled
iconPrimary = other.iconPrimary
iconSecondary = other.iconSecondary
iconDisabled = other.iconDisabled
borderPrimary = other.borderPrimary
}
}
@Stable
class Surface internal constructor(
level1: Color,
level2: Color,
level3: Color,
level4: Color,
) {
var level1 by mutableStateOf(level1)
private set
var level2 by mutableStateOf(level2)
private set
var level3 by mutableStateOf(level3)
private set
var level4 by mutableStateOf(level4)
private set
fun update(other: Surface) {
level1 = other.level1
level2 = other.level2
level3 = other.level3
level4 = other.level4
}
}
@Stable
class Controls internal constructor(
backgroundDefault: Color,
backgroundChecked: Color,
iconDefault: Color,
iconDisabled: Color,
) {
var backgroundDefault by mutableStateOf(backgroundDefault)
private set
var backgroundChecked by mutableStateOf(backgroundChecked)
private set
var iconDefault by mutableStateOf(iconDefault)
private set
var iconDisabled by mutableStateOf(iconDisabled)
private set
fun update(other: Controls) {
backgroundDefault = other.backgroundDefault
backgroundChecked = other.backgroundChecked
iconDefault = other.iconDefault
iconDisabled = other.iconDisabled
}
}
@Stable
class Field internal constructor(
backgroundDefault: Color,
backgroundFocused: Color,
textPlaceholder: Color,
textDefault: Color,
textDisabled: Color,
iconDefault: Color,
iconDisabled: Color,
textInvalid: Color,
borderInvalid: Color,
) {
var backgroundDefault by mutableStateOf(backgroundDefault)
private set
var backgroundFocused by mutableStateOf(backgroundFocused)
private set
var textPlaceholder by mutableStateOf(textPlaceholder)
private set
var textDefault by mutableStateOf(textDefault)
private set
var textDisabled by mutableStateOf(textDisabled)
private set
var iconDefault by mutableStateOf(iconDefault)
private set
var iconDisabled by mutableStateOf(iconDisabled)
private set
var textInvalid by mutableStateOf(textInvalid)
private set
var borderInvalid by mutableStateOf(borderInvalid)
private set
fun update(other: Field) {
backgroundDefault = other.backgroundDefault
backgroundFocused = other.backgroundFocused
textPlaceholder = other.textPlaceholder
textDefault = other.textDefault
textDisabled = other.textDisabled
iconDefault = other.iconDefault
iconDisabled = other.iconDisabled
textInvalid = other.textInvalid
borderInvalid = other.borderInvalid
}
}
@Stable
class Overlay internal constructor(
overlayPrimary: Color,
overlaySecondary: Color,
) {
var overlayPrimary by mutableStateOf(overlayPrimary)
private set
var overlaySecondary by mutableStateOf(overlaySecondary)
private set
fun update(other: Overlay) {
overlayPrimary = other.overlayPrimary
overlaySecondary = other.overlaySecondary
}
}
@Stable
class Border internal constructor(
val neutral: Neutral,
val status: Status,
) {
@Stable
class Neutral internal constructor(
primary: Color,
secondary: Color,
) {
var primary by mutableStateOf(primary)
private set
var secondary by mutableStateOf(secondary)
private set
fun update(other: Neutral) {
primary = other.primary
secondary = other.secondary
}
}
@Stable
class Status internal constructor(
accent: Color,
warning: Color,
attention: Color,
) {
var accent by mutableStateOf(accent)
private set
var warning by mutableStateOf(warning)
private set
var attention by mutableStateOf(attention)
private set
fun update(other: Status) {
accent = other.accent
warning = other.warning
attention = other.attention
}
}
fun update(other: Border) {
neutral.update(other.neutral)
status.update(other.status)
}
}
@Stable
class Fill internal constructor(
val neutral: Neutral,
val status: Status,
) {
@Stable
class Neutral internal constructor(
primary: Color,
primaryInverted: Color,
primaryInvertedConstant: Color,
secondary: Color,
tertiaryConstant: Color,
quaternary: Color,
) {
var primary by mutableStateOf(primary)
private set
var primaryInverted by mutableStateOf(primaryInverted)
private set
var primaryInvertedConstant by mutableStateOf(primaryInvertedConstant)
private set
var secondary by mutableStateOf(secondary)
private set
var tertiaryConstant by mutableStateOf(tertiaryConstant)
private set
var quaternary by mutableStateOf(quaternary)
private set
fun update(other: Neutral) {
primary = other.primary
primaryInverted = other.primaryInverted
primaryInvertedConstant = other.primaryInvertedConstant
secondary = other.secondary
tertiaryConstant = other.tertiaryConstant
quaternary = other.quaternary
}
}
@Stable
class Status internal constructor(
accent: Color,
warning: Color,
attention: Color,
) {
var accent by mutableStateOf(accent)
private set
var warning by mutableStateOf(warning)
private set
var attention by mutableStateOf(attention)
private set
fun update(other: Status) {
accent = other.accent
warning = other.warning
attention = other.attention
}
}
fun update(other: Fill) {
neutral.update(other.neutral)
status.update(other.status)
}
}
@Stable
class Skeleton internal constructor(
backgroundPrimary: Color,
) {
var backgroundPrimary by mutableStateOf(backgroundPrimary)
private set
fun update(other: Skeleton) {
backgroundPrimary = other.backgroundPrimary
}
}
@Stable
class Markers internal constructor(
backgroundSolidGray: Color,
backgroundDisabled: Color,
backgroundSolidBlue: Color,
textGray: Color,
textDisabled: Color,
iconGray: Color,
iconDisabled: Color,
borderGray: Color,
backgroundTintedBlue: Color,
textBlue: Color,
backgroundSolidRed: Color,
backgroundTintedRed: Color,
iconBlue: Color,
iconRed: Color,
textRed: Color,
backgroundTintedGray: Color,
borderTintedBlue: Color,
borderTintedRed: Color,
) {
var backgroundSolidGray by mutableStateOf(backgroundSolidGray)
private set
var backgroundDisabled by mutableStateOf(backgroundDisabled)
private set
var backgroundSolidBlue by mutableStateOf(backgroundSolidBlue)
private set
var textGray by mutableStateOf(textGray)
private set
var textDisabled by mutableStateOf(textDisabled)
private set
var iconGray by mutableStateOf(iconGray)
private set
var iconDisabled by mutableStateOf(iconDisabled)
private set
var borderGray by mutableStateOf(borderGray)
private set
var backgroundTintedBlue by mutableStateOf(backgroundTintedBlue)
private set
var textBlue by mutableStateOf(textBlue)
private set
var backgroundSolidRed by mutableStateOf(backgroundSolidRed)
private set
var backgroundTintedRed by mutableStateOf(backgroundTintedRed)
private set
var iconBlue by mutableStateOf(iconBlue)
private set
var iconRed by mutableStateOf(iconRed)
private set
var textRed by mutableStateOf(textRed)
private set
var backgroundTintedGray by mutableStateOf(backgroundTintedGray)
private set
var borderTintedBlue by mutableStateOf(borderTintedBlue)
private set
var borderTintedRed by mutableStateOf(borderTintedRed)
private set
fun update(other: Markers) {
backgroundSolidGray = other.backgroundSolidGray
backgroundDisabled = other.backgroundDisabled
backgroundSolidBlue = other.backgroundSolidBlue
textGray = other.textGray
textDisabled = other.textDisabled
iconGray = other.iconGray
iconDisabled = other.iconDisabled
borderGray = other.borderGray
backgroundTintedBlue = other.backgroundTintedBlue
textBlue = other.textBlue
backgroundSolidRed = other.backgroundSolidRed
backgroundTintedRed = other.backgroundTintedRed
iconBlue = other.iconBlue
iconRed = other.iconRed
textRed = other.textRed
backgroundTintedGray = other.backgroundTintedGray
borderTintedBlue = other.borderTintedBlue
borderTintedRed = other.borderTintedRed
}
}
fun update(other: TangemColors2) {
text.update(other.text)
graphic.update(other.graphic)
button.update(other.button)
surface.update(other.surface)
controls.update(other.controls)
field.update(other.field)
overlay.update(other.overlay)
border.update(other.border)
fill.update(other.fill)
skeleton.update(other.skeleton)
markers.update(other.markers)
}
}

View file

@ -66,7 +66,7 @@ fun TangemTheme(
) {
val themeColors = if (isDark) darkThemeColors() else lightThemeColors()
val rememberedColors = remember { themeColors }
.also { it.update(themeColors) }
.apply { update(themeColors) }
val systemUiController = rememberSystemUiController()
val systemBarsIconsController = remember(systemUiController) { SystemBarsIconsController(systemUiController) }
@ -138,6 +138,11 @@ object TangemTheme {
@ReadOnlyComposable
get() = LocalTangemColors.current
val colors2: TangemColors2
@Composable
@ReadOnlyComposable
get() = LocalTangemColors2.current
val typography: TangemTypography
@Composable
@ReadOnlyComposable
@ -156,7 +161,7 @@ object TangemTheme {
@Stable
@Composable
private fun tangemColorScheme(colors: TangemColors): ColorScheme {
internal fun tangemColorScheme(colors: TangemColors): ColorScheme {
return ColorScheme(
primary = colors.background.primary,
onPrimary = colors.text.primary1,
@ -206,7 +211,7 @@ private fun tangemColorScheme(colors: TangemColors): ColorScheme {
@Composable
@ReadOnlyComposable
private fun lightThemeColors(): TangemColors {
internal fun lightThemeColors(redesign: Boolean = false): TangemColors {
return TangemColors(
text = TangemColors.Text(
primary1 = TangemColorPalette.Dark6,
@ -233,8 +238,8 @@ private fun lightThemeColors(): TangemColors {
),
background = TangemColors.Background(
primary = TangemColorPalette.White,
secondary = TangemColorPalette.Light1,
tertiary = TangemColorPalette.Light1,
secondary = if (redesign) TangemColorPalette.Light1V2 else TangemColorPalette.Light1,
tertiary = if (redesign) TangemColorPalette.Light1V2 else TangemColorPalette.Light1,
action = TangemColorPalette.White,
),
control = TangemColors.Control(
@ -248,7 +253,7 @@ private fun lightThemeColors(): TangemColors {
transparency = TangemColorPalette.White,
),
field = TangemColors.Field(
primary = TangemColorPalette.Light1,
primary = if (redesign) TangemColorPalette.Light1V2 else TangemColorPalette.Light1,
focused = TangemColorPalette.Light2,
),
overlay = TangemColors.Overlay(
@ -260,7 +265,7 @@ private fun lightThemeColors(): TangemColors {
@Composable
@ReadOnlyComposable
private fun darkThemeColors(): TangemColors {
internal fun darkThemeColors(): TangemColors {
return TangemColors(
text = TangemColors.Text(
primary1 = TangemColorPalette.White,
@ -320,12 +325,16 @@ private val TangemTextSelectionColors: TextSelectionColors
backgroundColor = TangemTheme.colors.text.accent.copy(alpha = 0.3f),
)
private val LocalTangemColors = staticCompositionLocalOf<TangemColors> {
internal val LocalTangemColors = staticCompositionLocalOf<TangemColors> {
error("No TangemColors provided")
}
private val LocalTangemTypography = staticCompositionLocalOf {
TangemTypography()
internal val LocalTangemColors2 = staticCompositionLocalOf<TangemColors2> {
error("No TangemColors2 provided")
}
internal val LocalTangemTypography = staticCompositionLocalOf {
TangemTypography(RobotoFamily)
}
private val LocalTangemDimens = staticCompositionLocalOf {

View file

@ -0,0 +1,309 @@
@file:Suppress("LongMethod")
package com.tangem.core.ui.res
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.*
/**
* Provides additional theming for redesigned components.
* Used together with [TangemTheme].
* @param content Composable content where the theme is applied.
*/
@Composable
fun TangemThemeRedesign(content: @Composable () -> Unit) {
val themeColors = if (LocalIsInDarkTheme.current) darkThemeColors() else lightThemeColors(redesign = true)
val rememberedColors = remember { themeColors }
.apply { update(themeColors) }
val rootBackgroundColor = rememberedColors.background.secondary
MaterialTheme(
colorScheme = tangemColorScheme(colors = themeColors),
) {
CompositionLocalProvider(
LocalTangemColors provides themeColors,
LocalTangemColors2 provides if (LocalIsInDarkTheme.current) darkThemeColors2() else lightThemeColors2(),
LocalTangemTypography provides TangemTypography(InterFamily),
LocalRootBackgroundColor provides remember(rootBackgroundColor) { mutableStateOf(rootBackgroundColor) },
) {
content()
}
}
}
@Composable
@ReadOnlyComposable
private fun lightThemeColors2(): TangemColors2 {
val text = TangemColors2.Text(
neutral = TangemColors2.Text.Neutral(
primary = TangemColorPalette.Dark6,
primaryInverted = TangemColorPalette.White,
secondary = TangemColorPalette.Dark2,
tertiary = TangemColorPalette.Dark3,
primaryInvertedConstant = TangemColorPalette.White,
),
status = TangemColors2.Text.Status(
disabled = TangemColorPalette.Light4,
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Amaranth,
attention = TangemColorPalette.Tangerine,
positive = TangemColorPalette.Green,
),
)
val graphic = TangemColors2.Graphic(
neutral = TangemColors2.Graphic.Neutral(
primary = TangemColorPalette.Dark6,
primaryInverted = TangemColorPalette.White,
secondary = TangemColorPalette.Dark2,
tertiary = TangemColorPalette.Dark3,
quaternary = TangemColorPalette.Light4,
primaryInvertedConstant = TangemColorPalette.White,
tertiaryConstant = TangemColorPalette.Dark3,
),
status = TangemColors2.Graphic.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Amaranth,
attention = TangemColorPalette.Tangerine,
),
)
val border = TangemColors2.Border(
neutral = TangemColors2.Border.Neutral(
primary = TangemColorPalette.Light3,
secondary = TangemColorPalette.Light5,
),
status = TangemColors2.Border.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Amaranth,
attention = TangemColorPalette.Tangerine,
),
)
val overlay = TangemColors2.Overlay(
overlayPrimary = TangemColorPalette.Overlay1,
overlaySecondary = TangemColorPalette.Overlay2,
)
val fill = TangemColors2.Fill(
neutral = TangemColors2.Fill.Neutral(
primary = TangemColorPalette.Dark6,
primaryInverted = TangemColorPalette.White,
primaryInvertedConstant = TangemColorPalette.White,
secondary = TangemColorPalette.Dark3,
tertiaryConstant = TangemColorPalette.Dark3,
quaternary = TangemColorPalette.Light4,
),
status = TangemColors2.Fill.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Amaranth,
attention = TangemColorPalette.Tangerine,
),
)
val button = TangemColors2.Button(
backgroundPrimary = TangemColorPalette.Dark6,
backgroundSecondary = TangemColorPalette.Dark6.copy(alpha = 0.1f),
backgroundDisabled = TangemColorPalette.Light3,
backgroundPositive = TangemColorPalette.Azure,
textSecondary = TangemColorPalette.Dark6,
textPrimary = TangemColorPalette.Light2,
textDisabled = text.neutral.tertiary,
iconPrimary = TangemColorPalette.Dark6,
iconSecondary = TangemColorPalette.Light1V2,
iconDisabled = TangemColorPalette.Light2,
borderPrimary = TangemColorPalette.Dark6,
)
val surface = TangemColors2.Surface(
level1 = TangemColorPalette.White,
level2 = TangemColorPalette.Light1V2,
level3 = TangemColorPalette.Light1V2,
level4 = TangemColorPalette.White,
)
val controls = TangemColors2.Controls(
backgroundChecked = TangemColorPalette.Dark6,
backgroundDefault = TangemColorPalette.Light2,
iconDefault = TangemColorPalette.White,
iconDisabled = TangemColorPalette.White,
)
val field = TangemColors2.Field(
backgroundDefault = TangemColorPalette.Light1V2,
backgroundFocused = TangemColorPalette.Light3,
textPlaceholder = text.neutral.secondary,
textDefault = text.neutral.primary,
textDisabled = text.neutral.tertiary,
iconDefault = graphic.neutral.tertiary,
iconDisabled = graphic.neutral.quaternary,
textInvalid = text.status.warning,
borderInvalid = border.status.warning,
)
val skeleton = TangemColors2.Skeleton(
backgroundPrimary = TangemColorPalette.Light1V2,
)
val markers = TangemColors2.Markers(
backgroundSolidGray = TangemColorPalette.Light3,
backgroundDisabled = TangemColorPalette.Light3,
backgroundSolidBlue = TangemColorPalette.Azure,
textGray = TangemColorPalette.Dark2,
textDisabled = text.neutral.tertiary,
iconGray = TangemColorPalette.Dark1,
iconDisabled = TangemColorPalette.Light2,
borderGray = TangemColorPalette.Light3,
backgroundTintedBlue = TangemColorPalette.Azure.copy(alpha = 0.1f),
textBlue = text.status.accent,
backgroundSolidRed = TangemColorPalette.Amaranth,
backgroundTintedRed = TangemColorPalette.Amaranth.copy(alpha = 0.1f),
iconBlue = TangemColorPalette.Azure,
iconRed = TangemColorPalette.Amaranth,
textRed = TangemColorPalette.Amaranth,
backgroundTintedGray = TangemColorPalette.Dark6.copy(alpha = 0.1f),
borderTintedBlue = TangemColorPalette.Azure.copy(alpha = 0.1f),
borderTintedRed = TangemColorPalette.Amaranth.copy(alpha = 0.1f),
)
return TangemColors2(
text = text,
graphic = graphic,
border = border,
overlay = overlay,
fill = fill,
button = button,
surface = surface,
controls = controls,
field = field,
skeleton = skeleton,
markers = markers,
)
}
@Composable
@ReadOnlyComposable
private fun darkThemeColors2(): TangemColors2 {
val text = TangemColors2.Text(
neutral = TangemColors2.Text.Neutral(
primary = TangemColorPalette.White,
primaryInverted = TangemColorPalette.Dark6,
secondary = TangemColorPalette.Light5,
tertiary = TangemColorPalette.Dark1,
primaryInvertedConstant = TangemColorPalette.White,
),
status = TangemColors2.Text.Status(
disabled = TangemColorPalette.Dark3,
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Flamingo,
attention = TangemColorPalette.Mustard,
positive = TangemColorPalette.Green,
),
)
val graphic = TangemColors2.Graphic(
neutral = TangemColors2.Graphic.Neutral(
primary = TangemColorPalette.White,
primaryInverted = TangemColorPalette.Dark6,
secondary = TangemColorPalette.Light5,
tertiary = TangemColorPalette.Dark3,
quaternary = TangemColorPalette.Dark3,
tertiaryConstant = TangemColorPalette.Dark3,
primaryInvertedConstant = TangemColorPalette.White,
),
status = TangemColors2.Graphic.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Flamingo,
attention = TangemColorPalette.Mustard,
),
)
val border = TangemColors2.Border(
neutral = TangemColors2.Border.Neutral(
primary = TangemColorPalette.Dark4,
secondary = TangemColorPalette.Dark4,
),
status = TangemColors2.Border.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Flamingo,
attention = TangemColorPalette.Mustard,
),
)
val overlay = TangemColors2.Overlay(
overlayPrimary = TangemColorPalette.Overlay1,
overlaySecondary = TangemColorPalette.Overlay2,
)
val fill = TangemColors2.Fill(
neutral = TangemColors2.Fill.Neutral(
primary = TangemColorPalette.White,
primaryInverted = TangemColorPalette.Dark6,
primaryInvertedConstant = TangemColorPalette.White,
secondary = TangemColorPalette.Light5,
tertiaryConstant = TangemColorPalette.Dark1,
quaternary = TangemColorPalette.Dark3,
),
status = TangemColors2.Fill.Status(
accent = TangemColorPalette.Azure,
warning = TangemColorPalette.Flamingo,
attention = TangemColorPalette.Mustard,
),
)
val button = TangemColors2.Button(
backgroundPrimary = TangemColorPalette.Light1V2,
backgroundSecondary = TangemColorPalette.White.copy(alpha = 0.1f),
backgroundDisabled = TangemColorPalette.Dark5,
backgroundPositive = TangemColorPalette.Azure,
textSecondary = TangemColorPalette.Light4,
textPrimary = TangemColorPalette.Dark4,
textDisabled = text.neutral.secondary,
iconPrimary = TangemColorPalette.Light4,
iconSecondary = TangemColorPalette.Dark4,
iconDisabled = TangemColorPalette.Dark5,
borderPrimary = TangemColorPalette.Light4,
)
val surface = TangemColors2.Surface(
level1 = TangemColorPalette.Dark6,
level2 = TangemColorPalette.Black,
level3 = TangemColorPalette.Dark6,
level4 = TangemColorPalette.Dark5,
)
val controls = TangemColors2.Controls(
backgroundChecked = TangemColorPalette.Azure,
backgroundDefault = TangemColorPalette.Dark4,
iconDefault = TangemColorPalette.White,
iconDisabled = TangemColorPalette.White,
)
val field = TangemColors2.Field(
backgroundDefault = TangemColorPalette.Dark6,
backgroundFocused = TangemColorPalette.Dark4,
textPlaceholder = text.neutral.secondary,
textDefault = text.neutral.primary,
textDisabled = text.neutral.tertiary,
iconDefault = graphic.neutral.tertiary,
iconDisabled = graphic.neutral.quaternary,
textInvalid = text.status.warning,
borderInvalid = border.status.warning,
)
val skeleton = TangemColors2.Skeleton(
backgroundPrimary = TangemColorPalette.Dark5,
)
val markers = TangemColors2.Markers(
backgroundSolidGray = TangemColorPalette.Dark5,
backgroundDisabled = TangemColorPalette.Dark5,
backgroundSolidBlue = TangemColorPalette.Azure,
textGray = TangemColorPalette.Light4,
textDisabled = text.neutral.secondary,
iconGray = TangemColorPalette.Dark2,
iconDisabled = TangemColorPalette.Dark5,
borderGray = TangemColorPalette.White.copy(alpha = 0.2f),
backgroundTintedBlue = TangemColorPalette.Azure.copy(alpha = 0.1f),
textBlue = text.status.accent,
backgroundSolidRed = TangemColorPalette.Amaranth,
backgroundTintedRed = TangemColorPalette.Amaranth.copy(alpha = 0.1f),
iconBlue = TangemColorPalette.Azure,
iconRed = TangemColorPalette.Flamingo,
textRed = TangemColorPalette.Flamingo,
backgroundTintedGray = TangemColorPalette.White.copy(alpha = 0.1f),
borderTintedBlue = TangemColorPalette.Azure.copy(alpha = 0.1f),
borderTintedRed = TangemColorPalette.Amaranth.copy(alpha = 0.1f),
)
return TangemColors2(
text = text,
graphic = graphic,
border = border,
overlay = overlay,
fill = fill,
button = button,
surface = surface,
controls = controls,
field = field,
skeleton = skeleton,
markers = markers,
)
}

View file

@ -4,6 +4,7 @@ import androidx.compose.runtime.Immutable
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.LineHeightStyle
import androidx.compose.ui.unit.TextUnit
@ -11,15 +12,22 @@ import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.sp
import com.tangem.core.ui.R
private val RobotoFamily = FontFamily(
internal val RobotoFamily = FontFamily(
Font(R.font.roboto_regular, FontWeight.Normal),
Font(R.font.roboto_medium, FontWeight.Medium),
)
internal val InterFamily = FontFamily(
Font(R.font.inter_regular),
Font(R.font.inter_italic, style = FontStyle.Italic),
)
@Immutable
data class TangemTypography internal constructor(
class TangemTypography internal constructor(
fontFamily: FontFamily,
) {
val head: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 34.sp,
fontWeight = FontWeight.SemiBold,
letterSpacing = TextUnit(value = 0f, type = TextUnitType.Sp),
@ -28,9 +36,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val h1: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 34.sp,
fontWeight = FontWeight.Normal,
letterSpacing = TextUnit(value = 0f, type = TextUnitType.Sp),
@ -39,9 +47,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val h2: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 24.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.18f, type = TextUnitType.Sp),
@ -50,9 +58,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val h3: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 20.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.15f, type = TextUnitType.Sp),
@ -61,9 +69,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val subtitle1: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 16.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.15f, type = TextUnitType.Sp),
@ -72,9 +80,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val subtitle2: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 14.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.1f, type = TextUnitType.Sp),
@ -83,9 +91,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val body1: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 16.sp,
fontWeight = FontWeight.Normal,
letterSpacing = TextUnit(value = 0.5f, type = TextUnitType.Sp),
@ -94,9 +102,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val body2: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 14.sp,
fontWeight = FontWeight.Normal,
letterSpacing = TextUnit(value = 0.25f, type = TextUnitType.Sp),
@ -105,9 +113,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val button: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 14.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.1f, type = TextUnitType.Sp),
@ -116,9 +124,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val caption1: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 12.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 0.4f, type = TextUnitType.Sp),
@ -127,9 +135,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val caption2: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 12.sp,
fontWeight = FontWeight.Normal,
letterSpacing = TextUnit(value = 0.4f, type = TextUnitType.Sp),
@ -138,9 +146,9 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
val overline: TextStyle = TextStyle(
fontFamily = RobotoFamily,
fontFamily = fontFamily,
fontSize = 10.sp,
fontWeight = FontWeight.Medium,
letterSpacing = TextUnit(value = 1.5f, type = TextUnitType.Sp),
@ -149,5 +157,5 @@ data class TangemTypography internal constructor(
alignment = LineHeightStyle.Alignment.Center,
trim = LineHeightStyle.Trim.None,
),
),
)
)
}

View file

@ -1,6 +1,6 @@
package com.tangem.core.ui.test
object BaseAmountBlockTestTags {
const val PRIMARY_AMOUNT = "STAKING_SEND_DETAILS_SCREEN_PRIMARY_AMOUNT"
const val SECONDARY_AMOUNT = "TAKING_SEND_DETAILS_SCREEN_SECONDARY_AMOUNT"
const val PRIMARY_AMOUNT = "SEND_DETAILS_SCREEN_PRIMARY_AMOUNT"
const val SECONDARY_AMOUNT = "SEND_DETAILS_SCREEN_SECONDARY_AMOUNT"
}

View file

@ -0,0 +1,10 @@
package com.tangem.core.ui.test
object FeeSelectorBlockTestTags {
const val SELECTOR_BLOCK = "FEE_SELECTOR_BLOCK"
const val ICON = "FEE_SELECTOR_ICON"
const val TITLE = "FEE_SELECTOR_TITLE"
const val FEE_AMOUNT = "FEE_SELECTOR_FEE_AMOUNT"
const val TOOLTIP_ICON = "FEE_SELECTOR_TOOLTIP_ICON"
const val SELECT_FEE_ICON = "FEE_SELECTOR_SELECT_FEE_ICON"
}

View file

@ -0,0 +1,5 @@
package com.tangem.core.ui.test
object FooterTestTags {
const val FOOTER_TEXT = "FOOTER_TEXT"
}

View file

@ -0,0 +1,6 @@
package com.tangem.core.ui.test
object QrCodeScreenTestTags {
const val FLASHLIGHT_BUTTON = "QR_CODE_SCREEN_FLASHLIGHT_BUTTON"
const val GALLERY_BUTTON = "QR_CODE_SCREEN_GALLERY_BUTTON"
}

View file

@ -1,6 +1,22 @@
package com.tangem.core.ui.test
object SendAddressScreenTestTags {
const val ADDRESS_TEXT_FIELD_TITLE = "SEND_ADDRESS_TEXT_FIELD_TITLE"
const val ADDRESS_TEXT_FIELD = "SEND_ADDRESS_TEXT_FIELD"
const val CONTAINER = "SEND_ADDRESS_SCREEN_CONTAINER"
const val ADDRESS_TEXT_FIELD_TITLE = "SEND_ADDRESS_SCREEN_TEXT_FIELD_TITLE"
const val ADDRESS_TEXT_FIELD = "SEND_ADDRESS_SCREEN_TEXT_FIELD"
const val QR_BUTTON = "SEND_ADDRESS_SCREEN_QR_BUTTON"
const val ADDRESS_PASTE_BUTTON = "SEND_ADDRESS_SCREEN_ADDRESS_PASTE_BUTTON"
const val RESOLVED_ADDRESS = "SEND_ADDRESS_SCREEN_RESOLVED_ADDRESS"
const val RECENT_ADDRESS_ITEM = "SEND_ADDRESS_SCREEN_RECENT_ADDRESS_ITEM"
const val RECENT_ADDRESS_TITLE = "SEND_ADDRESS_SCREEN_RECENT_ADDRESS_TITLE"
const val RECENT_ADDRESS_TEXT = "SEND_ADDRESS_SCREEN_RECENT_ADDRESS_TEXT"
const val RECENT_ADDRESS_ICON = "SEND_ADDRESS_SCREEN_RECENT_ADDRESS_ICON"
const val RECENT_ADDRESS_TRANSACTION_ICON = "SEND_ADDRESS_SCREEN_RECENT_ADDRESS_TRANSACTION_ICON"
const val DESTINATION_TAG_TEXT_FIELD_TITLE = "SEND_ADDRESS_SCREEN_DESTINATION_TAG_TEXT_FIELD_TITLE"
const val DESTINATION_TAG_TEXT_FIELD = "SEND_ADDRESS_SCREEN_DESTINATION_TAG_TEXT_FIELD"
const val DESTINATION_TAG_PASTE_BUTTON = "SEND_ADDRESS_SCREEN_DESTINATION_TAG_PASTE_BUTTON"
const val DESTINATION_TAG_CLEAR_TEXT_FIELD_BUTTON = "SEND_ADDRESS_SCREEN_DESTINATION_TAG_CLEAR_TEXT_FIELD_BUTTON"
}

View file

@ -2,4 +2,7 @@ package com.tangem.core.ui.test
object SendConfirmScreenTestTags {
const val SENDING_TEXT = "SEND_CONFIRM_SCREEN_SENDING_TEXT"
const val RECIPIENT_ADDRESS = "SEND_CONFIRM_SCREEN_RECIPIENT_ADDRESS"
const val BLOCKCHAIN_ADDRESS = "SEND_CONFIRM_SCREEN_BLOCKCHAIN_ADDRESS"
const val RECIPIENT_ADDRESS_ICON = "SEND_CONFIRM_SCREEN_RECIPIENT_ADDRESS_ICON"
}

View file

@ -5,6 +5,8 @@ object SendScreenTestTags {
const val AMOUNT_CONTAINER_TITLE = "SEND_SCREEN_AMOUNT_CONTAINER_TITLE"
const val INPUT_TEXT_FIELD = "SEND_SCREEN_INPUT_TEXT_FIELD"
const val EQUIVALENT_INPUT_AMOUNT = "SEND_SCREEN_EQUIVALENT_INPUT_AMOUNT"
const val EXCHANGE_ICON = "SEND_SCREEN_EXCHANGE_ICON"
const val TOKEN_NAME = "SEND_SCREEN_TOKEN_NAME"
const val PRIMARY_AMOUNT = "SEND_SCREEN_PRIMARY_AMOUNT"
const val SECONDARY_AMOUNT = "SEND_SCREEN_SECONDARY_AMOUNT"

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="72dp"
android:height="72dp"
android:viewportWidth="72"
android:viewportHeight="72">
<path
android:pathData="M69.781,45.692L69.79,45.709C71.126,48.06 72,50.879 72,53.877C72,57.927 70.612,62.075 67.529,65.265C64.394,68.508 60.145,70.096 55.73,70.096H16.27C11.855,70.096 7.606,68.508 4.471,65.265C1.388,62.075 0,57.927 0,53.877C0,51.094 0.713,48.238 2.266,45.611L21.966,11.287C25.02,5.881 30.514,3.086 36,3.086C41.553,3.086 46.97,5.934 50.018,11.26C50.02,11.263 50.022,11.266 50.023,11.269L69.781,45.692ZM41.932,15.893L61.688,50.313C62.324,51.433 62.68,52.681 62.68,53.877C62.68,57.772 60.058,60.777 55.73,60.777H16.27C11.942,60.777 9.32,57.772 9.32,53.877C9.32,52.681 9.625,51.459 10.312,50.313L30.068,15.893C31.367,13.577 33.658,12.406 36,12.406C38.342,12.406 40.608,13.577 41.932,15.893Z"
android:strokeAlpha="0.12"
android:fillColor="#FF3333"
android:fillType="evenOdd"
android:fillAlpha="0.12"/>
<path
android:pathData="M36,9.771C39.182,9.771 42.273,11.382 44.047,14.484L44.049,14.486L63.49,48.36C64.308,49.799 64.8,51.456 64.8,53.126C64.8,55.617 63.955,57.976 62.262,59.728C60.554,61.494 58.159,62.462 55.414,62.462H16.586C13.842,62.462 11.446,61.494 9.738,59.728C8.045,57.976 7.2,55.617 7.2,53.126C7.2,51.514 7.613,49.864 8.526,48.331L27.948,14.493C29.705,11.368 32.836,9.771 36,9.771ZM36,12.318C33.695,12.318 31.441,13.471 30.163,15.751L10.725,49.618C10.048,50.745 9.747,51.949 9.747,53.126C9.747,56.958 12.328,59.914 16.586,59.914H55.414C59.673,59.914 62.253,56.958 62.253,53.126C62.253,51.949 61.902,50.72 61.275,49.618L41.837,15.751C40.534,13.471 38.305,12.318 36,12.318ZM34.984,45.657C35.942,45.657 36.718,46.433 36.718,47.391C36.718,48.348 35.942,49.124 34.984,49.124C34.027,49.124 33.251,48.348 33.251,47.391C33.251,46.433 34.027,45.657 34.984,45.657ZM34.984,25.845C35.805,25.845 36.471,26.51 36.471,27.331V42.189C36.471,43.01 35.805,43.676 34.984,43.676C34.164,43.676 33.499,43.01 33.499,42.189V27.331C33.499,26.511 34.164,25.845 34.984,25.845Z"
android:fillColor="#FF3333"/>
</vector>

View file

@ -1,16 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="18dp"
android:viewportWidth="22"
android:viewportHeight="18">
<path
android:pathData="M17.375,8.875C17.927,8.875 18.375,9.323 18.375,9.875V12.375H20.875C21.427,12.375 21.875,12.823 21.875,13.375C21.875,13.927 21.427,14.375 20.875,14.375H18.375V16.875C18.375,17.427 17.927,17.875 17.375,17.875C16.823,17.875 16.375,17.427 16.375,16.875L16.375,14.375H13.875C13.323,14.375 12.875,13.927 12.875,13.375C12.875,12.823 13.323,12.375 13.875,12.375H16.375L16.375,9.875C16.375,9.323 16.823,8.875 17.375,8.875Z"
android:fillColor="#1E1E1E"
android:fillType="evenOdd"/>
<path
android:pathData="M16.844,0.254C15.706,0.125 14.262,0.125 12.423,0.125H9.327C7.488,0.125 6.044,0.125 4.906,0.254C3.743,0.385 2.801,0.659 2.018,1.277C1.783,1.462 1.566,1.667 1.368,1.889C0.702,2.636 0.404,3.542 0.263,4.653C0.246,4.781 0.238,4.845 0.253,4.901C0.276,4.991 0.345,5.069 0.431,5.103C0.485,5.125 0.552,5.125 0.687,5.125H21.063C21.198,5.125 21.265,5.125 21.319,5.103C21.405,5.069 21.474,4.991 21.497,4.901C21.512,4.845 21.504,4.781 21.487,4.653C21.346,3.542 21.048,2.636 20.382,1.889C20.184,1.667 19.967,1.462 19.732,1.277C18.949,0.659 18.007,0.385 16.844,0.254Z"
android:fillColor="#1E1E1E"/>
<path
android:pathData="M20.875,10.875C21.243,10.875 21.428,10.875 21.511,10.807C21.528,10.793 21.537,10.784 21.551,10.767C21.619,10.684 21.621,10.535 21.622,10.236C21.625,9.825 21.625,9.389 21.625,8.928V8.822C21.625,8.246 21.625,7.711 21.62,7.212C21.617,6.936 21.616,6.799 21.528,6.712C21.44,6.625 21.301,6.625 21.024,6.625H0.726C0.449,6.625 0.31,6.625 0.222,6.712C0.134,6.799 0.133,6.936 0.13,7.212C0.125,7.711 0.125,8.246 0.125,8.822V8.928C0.125,10.652 0.125,12.018 0.263,13.097C0.404,14.208 0.702,15.114 1.368,15.861C1.566,16.083 1.783,16.288 2.018,16.473C2.801,17.091 3.743,17.365 4.906,17.496C6.044,17.625 7.488,17.625 9.327,17.625H12.422C13.078,17.625 13.682,17.625 14.241,17.619C14.537,17.616 14.685,17.615 14.767,17.546C14.785,17.532 14.793,17.523 14.807,17.506C14.875,17.423 14.875,17.24 14.875,16.875V16.475C14.875,16.192 14.875,16.051 14.787,15.963C14.699,15.875 14.558,15.875 14.275,15.875H13.875C12.494,15.875 11.375,14.756 11.375,13.375C11.375,11.994 12.494,10.875 13.875,10.875H14.275C14.558,10.875 14.699,10.875 14.787,10.787C14.875,10.699 14.875,10.558 14.875,10.275V9.875C14.875,8.494 15.994,7.375 17.375,7.375C18.756,7.375 19.875,8.494 19.875,9.875V10.275C19.875,10.558 19.875,10.699 19.963,10.787C20.051,10.875 20.192,10.875 20.475,10.875H20.875Z"
android:fillColor="#1E1E1E"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="#0099FF" android:fillType="evenOdd" android:pathData="M18.375,11.875C18.927,11.875 19.375,12.323 19.375,12.875V15.375H21.875C22.427,15.375 22.875,15.823 22.875,16.375C22.875,16.927 22.427,17.375 21.875,17.375H19.375V19.875C19.375,20.427 18.927,20.875 18.375,20.875C17.823,20.875 17.375,20.427 17.375,19.875L17.375,17.375H14.875C14.323,17.375 13.875,16.927 13.875,16.375C13.875,15.823 14.323,15.375 14.875,15.375H17.375L17.375,12.875C17.375,12.323 17.823,11.875 18.375,11.875Z"/>
<path android:fillColor="#0099FF" android:pathData="M17.844,3.254C16.706,3.125 15.262,3.125 13.423,3.125H10.328C8.488,3.125 7.044,3.125 5.906,3.254C4.743,3.385 3.801,3.659 3.018,4.277C2.783,4.462 2.566,4.667 2.368,4.889C1.702,5.636 1.404,6.542 1.263,7.653C1.246,7.781 1.238,7.845 1.253,7.901C1.276,7.991 1.345,8.069 1.431,8.103C1.485,8.125 1.552,8.125 1.687,8.125H22.063C22.198,8.125 22.265,8.125 22.319,8.103C22.405,8.069 22.474,7.991 22.497,7.901C22.512,7.845 22.504,7.781 22.487,7.653C22.346,6.542 22.048,5.636 21.382,4.889C21.184,4.667 20.967,4.462 20.732,4.277C19.949,3.659 19.007,3.385 17.844,3.254Z"/>
<path android:fillColor="#0099FF" android:pathData="M21.875,13.875C22.243,13.875 22.428,13.875 22.511,13.807C22.528,13.793 22.537,13.784 22.551,13.767C22.619,13.684 22.621,13.535 22.622,13.236C22.625,12.825 22.625,12.389 22.625,11.928V11.822C22.625,11.247 22.625,10.711 22.62,10.212C22.617,9.936 22.616,9.799 22.528,9.712C22.44,9.625 22.301,9.625 22.024,9.625H1.726C1.449,9.625 1.31,9.625 1.222,9.712C1.134,9.799 1.133,9.936 1.13,10.212C1.125,10.711 1.125,11.247 1.125,11.822V11.928C1.125,13.652 1.125,15.018 1.263,16.097C1.404,17.208 1.702,18.114 2.368,18.861C2.566,19.083 2.783,19.288 3.018,19.473C3.801,20.091 4.743,20.365 5.906,20.496C7.044,20.625 8.488,20.625 10.328,20.625H13.422C14.078,20.625 14.682,20.625 15.241,20.619C15.537,20.616 15.685,20.615 15.767,20.546C15.785,20.532 15.793,20.523 15.807,20.506C15.875,20.423 15.875,20.24 15.875,19.875V19.475C15.875,19.192 15.875,19.051 15.787,18.963C15.699,18.875 15.558,18.875 15.275,18.875H14.875C13.494,18.875 12.375,17.756 12.375,16.375C12.375,14.994 13.494,13.875 14.875,13.875H15.275C15.558,13.875 15.699,13.875 15.787,13.787C15.875,13.699 15.875,13.558 15.875,13.275V12.875C15.875,11.494 16.994,10.375 18.375,10.375C19.756,10.375 20.875,11.494 20.875,12.875V13.275C20.875,13.558 20.875,13.699 20.963,13.787C21.051,13.875 21.192,13.875 21.475,13.875H21.875Z"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:autoMirrored="true"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:fillColor="#1E1E1E"
android:pathData="M10,2C14.165,2 17.587,5.183 17.965,9.25C17.988,9.497 18,9.747 18,10C18,10.253 17.988,10.503 17.965,10.75C17.587,14.817 14.165,18 10,18C5.835,18 2.413,14.817 2.035,10.75C2.012,10.503 2,10.253 2,10C2,9.747 2.012,9.497 2.035,9.25C2.413,5.183 5.835,2 10,2ZM3.543,10.75C3.838,13.319 5.631,15.431 8.026,16.193C7.196,14.975 6.622,13.01 6.518,10.75H3.543ZM13.482,10.75C13.378,13.011 12.803,14.975 11.973,16.193C14.368,15.431 16.162,13.319 16.457,10.75H13.482ZM8.02,10.75C8.101,12.335 8.433,13.701 8.885,14.669C9.463,15.908 9.962,16 10,16C10.038,16 10.537,15.908 11.115,14.669C11.567,13.701 11.899,12.335 11.981,10.75H8.02ZM8.026,3.806C5.631,4.568 3.838,6.681 3.543,9.25H6.518C6.622,6.989 7.196,5.024 8.026,3.806ZM10,4C9.962,4 9.463,4.092 8.885,5.331C8.433,6.299 8.101,7.665 8.02,9.25H11.981C11.899,7.665 11.567,6.299 11.115,5.331C10.537,4.092 10.038,4 10,4ZM11.973,3.806C12.804,5.024 13.378,6.989 13.482,9.25H16.457C16.162,6.681 14.368,4.568 11.973,3.806Z" />
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path android:pathData="M0,0h22v22h-22z" />
<path
android:pathData="M19.422,11.045C19.422,11.13 19.421,11.216 19.418,11.301H19.409H15.322V11.115H11.379C11.379,11.076 11.381,11.037 11.381,10.999C11.381,10.961 11.381,10.921 11.379,10.883H15.322V10.698H15.328H19.414C19.419,10.813 19.422,10.929 19.422,11.045ZM11.31,10.205L15.168,9.73L15.191,9.916L19.266,9.414C19.227,9.214 19.18,9.017 19.128,8.823L15.117,9.317L15.14,9.502L11.264,9.979C11.281,10.055 11.296,10.13 11.31,10.207V10.205ZM11.108,9.458L14.796,8.537L14.841,8.718L18.755,7.741C18.674,7.551 18.587,7.365 18.495,7.183L14.696,8.132L14.741,8.313L11.023,9.242C11.054,9.314 11.082,9.386 11.108,9.459V9.458ZM10.782,8.759L14.229,7.458L14.295,7.632L17.942,6.255C17.824,6.082 17.699,5.913 17.568,5.75L14.081,7.066L14.147,7.24L10.658,8.558C10.701,8.624 10.743,8.691 10.782,8.759ZM10.329,8.113L13.374,6.526L13.459,6.691L16.826,4.936C16.671,4.786 16.51,4.643 16.344,4.505L13.18,6.155L13.265,6.321L10.169,7.935C10.223,7.993 10.277,8.052 10.328,8.113H10.329ZM9.595,7.415L12.352,5.662L12.452,5.819L15.494,3.885C15.302,3.763 15.107,3.649 14.906,3.543L12.128,5.309L12.228,5.467L9.392,7.27C9.462,7.316 9.529,7.365 9.596,7.415H9.595ZM8.943,7.007L11.254,5.113L11.372,5.257L13.974,3.122C13.753,3.038 13.526,2.962 13.297,2.897L10.989,4.79L11.107,4.934L8.713,6.898C8.791,6.932 8.868,6.968 8.943,7.007ZM8.081,6.672L9.906,4.856L10.036,4.987L12.355,2.683C12.104,2.642 11.849,2.611 11.59,2.592L9.613,4.559L9.744,4.691L7.816,6.609C7.905,6.627 7.993,6.648 8.081,6.672ZM7.072,6.519L8.527,4.756L8.671,4.874L10.566,2.578C10.278,2.592 9.994,2.62 9.714,2.661L8.205,4.49L8.349,4.608L6.773,6.518C6.817,6.517 6.862,6.516 6.906,6.516C6.962,6.516 7.017,6.516 7.072,6.518V6.519ZM6.2,6.572L7.321,4.837L7.477,4.939L8.832,2.84C8.522,2.921 8.22,3.018 7.925,3.132L6.971,4.609L7.127,4.71L5.885,6.633C5.989,6.609 6.094,6.588 6.2,6.571V6.572ZM5.231,6.842L6.038,5.33L6.201,5.418L7.268,3.419C6.926,3.586 6.596,3.775 6.282,3.985L5.668,5.134L5.833,5.222L4.884,7C4.996,6.943 5.112,6.89 5.23,6.843L5.231,6.842ZM4.536,7.196L4.879,6.223L5.054,6.285L5.72,4.394C5.383,4.663 5.065,4.956 4.771,5.272L4.485,6.085L4.66,6.147L4.212,7.421C4.316,7.342 4.424,7.267 4.535,7.198L4.536,7.196ZM3.681,7.893L3.832,7.186L4.014,7.225L4.319,5.8C3.998,6.207 3.714,6.645 3.471,7.107L3.606,7.137L3.328,8.308C3.437,8.163 3.555,8.024 3.681,7.893ZM3.053,8.72V7.783C2.826,8.382 2.665,9.128 2.578,9.858C2.684,9.453 2.845,9.071 3.053,8.72ZM2.584,12.164C2.673,12.787 2.829,13.389 3.047,13.961V13.269C2.846,12.927 2.689,12.557 2.584,12.164ZM3.358,13.731L3.6,14.863L3.465,14.892C3.708,15.356 3.992,15.793 4.313,16.2L4.008,14.776L3.826,14.814L3.672,14.098C3.561,13.981 3.455,13.859 3.358,13.73V13.731ZM4.203,14.573L4.654,15.854L4.479,15.916L4.765,16.73C5.059,17.046 5.376,17.338 5.714,17.607L5.048,15.716L4.873,15.778L4.529,14.8C4.418,14.729 4.309,14.655 4.204,14.575L4.203,14.573ZM4.876,14.996L5.828,16.78L5.663,16.868L6.277,18.017C6.591,18.226 6.921,18.416 7.264,18.583L6.196,16.583L6.032,16.671L5.223,15.156C5.104,15.108 4.989,15.055 4.875,14.998L4.876,14.996ZM5.878,15.365L7.121,17.289L6.965,17.391L7.919,18.868C8.214,18.982 8.516,19.079 8.826,19.16L7.471,17.062L7.315,17.163L6.193,15.426C6.086,15.408 5.98,15.388 5.877,15.363L5.878,15.365ZM6.766,15.482L8.342,17.392L8.198,17.51L9.707,19.339C9.986,19.38 10.271,19.409 10.558,19.422L8.664,17.125L8.52,17.243L7.065,15.479C7.012,15.482 6.959,15.482 6.905,15.482C6.859,15.482 6.811,15.482 6.765,15.479L6.766,15.482ZM7.811,15.392L9.737,17.308L9.607,17.44L11.584,19.407C11.843,19.388 12.098,19.357 12.349,19.316L10.031,17.01L9.9,17.143L8.076,15.328C7.989,15.351 7.9,15.373 7.811,15.392ZM8.709,15.105L11.101,17.068L10.983,17.212L13.291,19.105C13.52,19.039 13.747,18.963 13.968,18.879L11.365,16.744L11.246,16.888L8.938,14.995C8.863,15.034 8.786,15.071 8.708,15.105H8.709ZM9.387,14.732L12.22,16.533L12.12,16.691L14.897,18.457C15.099,18.351 15.295,18.236 15.485,18.115L12.443,16.181L12.343,16.338L9.59,14.588C9.523,14.638 9.456,14.686 9.386,14.733L9.387,14.732ZM10.168,14.068L13.26,15.679L13.175,15.845L16.339,17.494C16.505,17.357 16.666,17.214 16.821,17.064L13.454,15.309L13.369,15.474L10.328,13.89C10.277,13.951 10.224,14.011 10.169,14.068H10.168ZM10.657,13.443L14.141,14.76L14.075,14.934L17.562,16.25C17.692,16.087 17.816,15.918 17.936,15.745L14.289,14.368L14.223,14.542L10.781,13.242C10.741,13.31 10.7,13.377 10.657,13.443ZM11.022,12.76L14.734,13.687L14.689,13.868L18.487,14.817C18.581,14.635 18.668,14.448 18.749,14.259L14.835,13.282L14.79,13.463L11.107,12.543C11.08,12.616 11.051,12.688 11.022,12.76ZM11.264,12.024L15.134,12.499L15.111,12.685L19.122,13.179C19.174,12.983 19.221,12.786 19.26,12.587L15.185,12.086L15.162,12.271L11.31,11.797C11.296,11.873 11.281,11.949 11.264,12.025V12.024Z"
android:fillColor="#000000"/>
</group>
</vector>

View file

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:pathData="M10.998,0.25C12.679,0.25 14.047,0.818 15.239,1.436C15.6,1.622 15.935,1.807 16.255,1.983C17.038,2.415 17.732,2.797 18.494,3.04C18.941,3.183 19.337,3.31 19.618,3.42C19.883,3.523 20.197,3.665 20.42,3.913C20.62,4.136 20.723,4.385 20.791,4.624C20.853,4.841 20.906,5.135 20.957,5.417C22.195,12.282 19.491,18.787 12.881,21.318C12.231,21.567 11.752,21.75 11.001,21.75C10.25,21.75 9.772,21.567 9.122,21.318C2.512,18.788 -0.195,12.283 1.043,5.417C1.094,5.135 1.146,4.841 1.208,4.624C1.276,4.385 1.38,4.136 1.58,3.913C1.803,3.666 2.117,3.523 2.381,3.42C2.662,3.31 3.059,3.183 3.506,3.04C4.267,2.797 4.961,2.415 5.743,1.983L6.235,1.713C6.404,1.621 6.578,1.529 6.758,1.436C7.95,0.818 9.317,0.25 10.998,0.25ZM16.941,7.666C16.757,7.146 16.185,6.873 15.665,7.058C14.787,7.369 13.948,7.961 13.211,8.607C12.464,9.262 11.766,10.023 11.173,10.734C10.734,11.261 10.344,11.769 10.029,12.199C9.741,11.854 9.453,11.601 9.179,11.418C8.904,11.235 8.551,11 7.999,11C7.447,11 6.999,11.448 6.999,12C6.999,12.521 7.397,12.949 7.905,12.996C8.109,13.015 8.664,13.566 9.104,14.447C9.266,14.77 9.588,14.981 9.948,14.999C10.308,15.017 10.649,14.84 10.843,14.536C10.848,14.529 11.192,14.013 11.356,13.78C11.688,13.311 12.156,12.677 12.708,12.016C13.262,11.352 13.887,10.675 14.529,10.111C15.182,9.539 15.799,9.132 16.333,8.943C16.854,8.759 17.126,8.187 16.941,7.666Z"
android:fillColor="#1E1E1E"/>
</vector>

View file

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:pathData="M12.24,1.567C15.292,1.567 17.795,3.916 18.041,6.905H19.244C19.721,6.905 20.157,6.905 20.505,6.956C20.888,7.012 21.296,7.146 21.6,7.517C21.9,7.884 21.957,8.309 21.946,8.696C21.935,9.053 21.862,9.491 21.781,9.977L20.597,17.038C20.41,18.153 20.258,19.055 20.05,19.761C19.834,20.493 19.534,21.101 18.993,21.57C18.449,22.041 17.809,22.245 17.062,22.34C16.347,22.432 15.454,22.432 14.356,22.432H9.643C8.546,22.432 7.652,22.432 6.938,22.34C6.191,22.245 5.551,22.041 5.007,21.57C4.466,21.101 4.165,20.494 3.949,19.761C3.74,19.055 3.59,18.153 3.403,17.038L2.219,9.977C2.137,9.491 2.064,9.053 2.054,8.696C2.043,8.31 2.099,7.884 2.399,7.517C2.703,7.146 3.112,7.012 3.495,6.956C3.843,6.905 4.278,6.905 4.756,6.905H6.439C6.686,3.916 9.188,1.567 12.24,1.567ZM12.24,3.508C10.261,3.508 8.628,4.99 8.39,6.905H16.091C15.852,4.99 14.22,3.508 12.24,3.508Z"
android:fillColor="#1E1E1E"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#1E1E1E"
android:pathData="M6.876,18.737C6.365,18.704 6.11,18.305 6.176,17.805L6.31,16.284L4.634,17.261C4.167,17.528 3.679,17.417 3.413,16.962C3.157,16.517 3.302,16.007 3.768,15.752L5.433,14.786L4.056,14.131C3.59,13.942 3.379,13.521 3.601,13.076C3.801,12.677 4.245,12.521 4.689,12.766L6.854,13.976L7.841,13.398L10.705,12L7.841,10.601L6.854,10.035L4.7,11.234C4.245,11.478 3.79,11.323 3.601,10.934C3.379,10.479 3.59,10.057 4.056,9.869L5.433,9.214L3.757,8.248C3.302,7.993 3.146,7.504 3.413,7.049C3.668,6.594 4.178,6.483 4.634,6.75L6.299,7.715L6.176,6.183C6.121,5.695 6.376,5.296 6.876,5.262C7.298,5.24 7.664,5.551 7.675,6.061L7.719,8.526L8.707,9.103L11.349,10.89L11.127,7.693V6.561L9.018,5.284C8.574,5.018 8.485,4.563 8.729,4.197C9.007,3.775 9.473,3.753 9.873,4.063L11.127,4.929V2.998C11.127,2.465 11.482,2.088 11.993,2.088C12.526,2.088 12.87,2.454 12.87,2.998V4.929L14.113,4.063C14.524,3.753 14.99,3.775 15.267,4.197C15.5,4.563 15.423,5.018 14.979,5.284L12.87,6.561V7.693L12.648,10.879L15.289,9.103L16.277,8.537L16.322,6.061C16.333,5.551 16.699,5.251 17.132,5.262C17.62,5.296 17.876,5.695 17.809,6.195L17.687,7.715L19.363,6.75C19.829,6.472 20.329,6.594 20.584,7.049C20.85,7.504 20.706,7.971 20.229,8.248L18.564,9.214L19.94,9.869C20.395,10.057 20.617,10.479 20.395,10.923C20.195,11.323 19.752,11.478 19.296,11.234L17.143,10.035L16.155,10.601L13.291,12L16.155,13.398L17.143,13.976L19.308,12.777C19.752,12.521 20.184,12.688 20.395,13.076C20.617,13.521 20.395,13.942 19.94,14.131L18.553,14.786L20.229,15.752C20.684,16.007 20.828,16.517 20.573,16.962C20.318,17.417 19.829,17.528 19.363,17.261L17.687,16.284L17.82,17.805C17.876,18.305 17.62,18.704 17.121,18.737C16.688,18.76 16.333,18.46 16.322,17.938L16.277,15.474L15.289,14.897L12.648,13.132L12.87,16.295V17.439L14.979,18.715C15.423,18.982 15.511,19.437 15.267,19.803C14.99,20.225 14.524,20.247 14.113,19.936L12.87,19.07V21.002C12.87,21.546 12.526,21.912 11.993,21.912C11.482,21.912 11.127,21.535 11.127,21.002V19.07L9.873,19.936C9.473,20.236 8.996,20.225 8.729,19.803C8.485,19.437 8.574,18.982 9.018,18.715L11.127,17.439V16.295L11.349,13.121L8.707,14.897L7.719,15.474L7.675,17.938C7.664,18.449 7.309,18.76 6.876,18.737Z" />
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M5.191,7.952C5.001,7.952 4.853,7.822 4.836,7.614C4.559,5.337 4.464,5.268 2.126,4.904C1.901,4.87 1.771,4.749 1.771,4.55C1.771,4.359 1.901,4.229 2.083,4.195C4.455,3.753 4.559,3.753 4.836,1.476C4.853,1.277 5.001,1.139 5.191,1.139C5.381,1.139 5.52,1.277 5.537,1.468C5.84,3.796 5.91,3.866 8.29,4.195C8.463,4.221 8.602,4.359 8.602,4.55C8.602,4.74 8.472,4.87 8.29,4.904C5.901,5.346 5.84,5.355 5.537,7.64C5.52,7.822 5.373,7.952 5.191,7.952ZM11.268,17.57C10.974,17.57 10.74,17.353 10.688,17.05C10.004,12.401 9.398,11.804 4.845,11.189C4.524,11.146 4.308,10.913 4.308,10.609C4.308,10.307 4.533,10.064 4.845,10.03C9.407,9.519 10.065,8.826 10.688,4.177C10.74,3.866 10.965,3.649 11.268,3.649C11.563,3.649 11.788,3.866 11.84,4.177C12.506,8.826 13.13,9.484 17.683,10.03C18.003,10.073 18.229,10.307 18.229,10.609C18.229,10.913 18.003,11.155 17.683,11.189C13.121,11.7 12.463,12.401 11.84,17.05C11.788,17.353 11.563,17.57 11.268,17.57Z"
android:fillColor="#1E1E1E"/>
<path
android:pathData="M5.191,7.952C5.001,7.952 4.853,7.822 4.836,7.614C4.559,5.337 4.464,5.268 2.126,4.904C1.901,4.87 1.771,4.749 1.771,4.55C1.771,4.359 1.901,4.229 2.083,4.195C4.455,3.753 4.559,3.753 4.836,1.476C4.853,1.277 5.001,1.139 5.191,1.139C5.381,1.139 5.52,1.277 5.537,1.468C5.84,3.796 5.91,3.866 8.29,4.195C8.463,4.221 8.602,4.359 8.602,4.55C8.602,4.74 8.472,4.87 8.29,4.904C5.901,5.346 5.84,5.355 5.537,7.64C5.52,7.822 5.373,7.952 5.191,7.952ZM11.268,17.57C10.974,17.57 10.74,17.353 10.688,17.05C10.004,12.401 9.398,11.804 4.845,11.189C4.524,11.146 4.308,10.913 4.308,10.609C4.308,10.307 4.533,10.064 4.845,10.03C9.407,9.519 10.065,8.826 10.688,4.177C10.74,3.866 10.965,3.649 11.268,3.649C11.563,3.649 11.788,3.866 11.84,4.177C12.506,8.826 13.13,9.484 17.683,10.03C18.003,10.073 18.229,10.307 18.229,10.609C18.229,10.913 18.003,11.155 17.683,11.189C13.121,11.7 12.463,12.401 11.84,17.05C11.788,17.353 11.563,17.57 11.268,17.57Z"
android:fillColor="#6B5EEC"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="12">
<path
android:pathData="M0,6C0,2.686 2.686,0 6,0C9.314,0 12,2.686 12,6C12,9.314 9.314,12 6,12C2.686,12 0,9.314 0,6Z"
android:fillColor="#FFB71B"/>
<path
android:pathData="M5.703,2.789C5.829,2.55 6.172,2.55 6.298,2.789L7.152,4.407C7.201,4.5 7.29,4.564 7.393,4.582L9.196,4.894C9.462,4.94 9.568,5.266 9.38,5.46L8.104,6.773C8.032,6.848 7.998,6.952 8.013,7.055L8.273,8.867C8.312,9.135 8.034,9.336 7.791,9.217L6.149,8.409C6.055,8.363 5.946,8.363 5.852,8.409L4.21,9.217C3.967,9.336 3.689,9.135 3.728,8.867L3.988,7.055C4.003,6.952 3.969,6.848 3.897,6.773L2.621,5.46C2.433,5.266 2.538,4.94 2.805,4.894L4.608,4.582C4.711,4.564 4.8,4.5 4.849,4.407L5.703,2.789Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,19 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z"/>
<path
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z"
android:fillColor="#ffffff"/>
<path
android:pathData="M0,0h22v22h-22z"
android:fillColor="#162F29"/>
<path
android:pathData="M19.422,11.045C19.422,11.13 19.421,11.216 19.418,11.301H19.409H15.322V11.115H11.379C11.379,11.076 11.381,11.037 11.381,10.999C11.381,10.961 11.381,10.921 11.379,10.883H15.322V10.698H15.328H19.414C19.419,10.813 19.422,10.929 19.422,11.045ZM11.31,10.205L15.168,9.73L15.191,9.916L19.266,9.414C19.227,9.214 19.18,9.017 19.128,8.823L15.117,9.317L15.14,9.502L11.264,9.979C11.281,10.055 11.296,10.13 11.31,10.207V10.205ZM11.108,9.458L14.796,8.537L14.841,8.718L18.755,7.741C18.674,7.551 18.587,7.365 18.495,7.183L14.696,8.132L14.741,8.313L11.023,9.242C11.054,9.314 11.082,9.386 11.108,9.459V9.458ZM10.782,8.759L14.229,7.458L14.295,7.632L17.942,6.255C17.824,6.082 17.699,5.913 17.568,5.75L14.081,7.066L14.147,7.24L10.658,8.558C10.701,8.624 10.743,8.691 10.782,8.759ZM10.329,8.113L13.374,6.526L13.459,6.691L16.826,4.936C16.671,4.786 16.51,4.643 16.344,4.505L13.18,6.155L13.265,6.321L10.169,7.935C10.223,7.993 10.277,8.052 10.328,8.113H10.329ZM9.595,7.415L12.352,5.662L12.452,5.819L15.494,3.885C15.302,3.763 15.107,3.649 14.906,3.543L12.128,5.309L12.228,5.467L9.392,7.27C9.462,7.316 9.529,7.365 9.596,7.415H9.595ZM8.943,7.007L11.254,5.113L11.372,5.257L13.974,3.122C13.753,3.038 13.526,2.962 13.297,2.897L10.989,4.79L11.107,4.934L8.713,6.898C8.791,6.932 8.868,6.968 8.943,7.007ZM8.081,6.672L9.906,4.856L10.036,4.987L12.355,2.683C12.104,2.642 11.849,2.611 11.59,2.592L9.613,4.559L9.744,4.691L7.816,6.609C7.905,6.627 7.993,6.648 8.081,6.672ZM7.072,6.519L8.527,4.756L8.671,4.874L10.566,2.578C10.278,2.592 9.994,2.62 9.714,2.661L8.205,4.49L8.349,4.608L6.773,6.518C6.817,6.517 6.862,6.516 6.906,6.516C6.962,6.516 7.017,6.516 7.072,6.518V6.519ZM6.2,6.572L7.321,4.837L7.477,4.939L8.832,2.84C8.522,2.921 8.22,3.018 7.925,3.132L6.971,4.609L7.127,4.71L5.885,6.633C5.989,6.609 6.094,6.588 6.2,6.571V6.572ZM5.231,6.842L6.038,5.33L6.201,5.418L7.268,3.419C6.926,3.586 6.596,3.775 6.282,3.985L5.668,5.134L5.833,5.222L4.884,7C4.996,6.943 5.112,6.89 5.23,6.843L5.231,6.842ZM4.536,7.196L4.879,6.223L5.054,6.285L5.72,4.394C5.383,4.663 5.065,4.956 4.771,5.272L4.485,6.085L4.66,6.147L4.212,7.421C4.316,7.342 4.424,7.267 4.535,7.198L4.536,7.196ZM3.681,7.893L3.832,7.186L4.014,7.225L4.319,5.8C3.998,6.207 3.714,6.645 3.471,7.107L3.606,7.137L3.328,8.308C3.437,8.163 3.555,8.024 3.681,7.893ZM3.053,8.72V7.783C2.826,8.382 2.665,9.128 2.578,9.858C2.684,9.453 2.845,9.071 3.053,8.72ZM2.584,12.164C2.673,12.787 2.829,13.389 3.047,13.961V13.269C2.846,12.927 2.689,12.557 2.584,12.164ZM3.358,13.731L3.6,14.863L3.465,14.892C3.708,15.356 3.992,15.793 4.313,16.2L4.008,14.776L3.826,14.814L3.672,14.098C3.561,13.981 3.455,13.859 3.358,13.73V13.731ZM4.203,14.573L4.654,15.854L4.479,15.916L4.765,16.73C5.059,17.046 5.376,17.338 5.714,17.607L5.048,15.716L4.873,15.778L4.529,14.8C4.418,14.729 4.309,14.655 4.204,14.575L4.203,14.573ZM4.876,14.996L5.828,16.78L5.663,16.868L6.277,18.017C6.591,18.226 6.921,18.416 7.264,18.583L6.196,16.583L6.032,16.671L5.223,15.156C5.104,15.108 4.989,15.055 4.875,14.998L4.876,14.996ZM5.878,15.365L7.121,17.289L6.965,17.391L7.919,18.868C8.214,18.982 8.516,19.079 8.826,19.16L7.471,17.062L7.315,17.163L6.193,15.426C6.086,15.408 5.98,15.388 5.877,15.363L5.878,15.365ZM6.766,15.482L8.342,17.392L8.198,17.51L9.707,19.339C9.986,19.38 10.271,19.409 10.558,19.422L8.664,17.125L8.52,17.243L7.065,15.479C7.012,15.482 6.959,15.482 6.905,15.482C6.859,15.482 6.811,15.482 6.765,15.479L6.766,15.482ZM7.811,15.392L9.737,17.308L9.607,17.44L11.584,19.407C11.843,19.388 12.098,19.357 12.349,19.316L10.031,17.01L9.9,17.143L8.076,15.328C7.989,15.351 7.9,15.373 7.811,15.392ZM8.709,15.105L11.101,17.068L10.983,17.212L13.291,19.105C13.52,19.039 13.747,18.963 13.968,18.879L11.365,16.744L11.246,16.888L8.938,14.995C8.863,15.034 8.786,15.071 8.708,15.105H8.709ZM9.387,14.732L12.22,16.533L12.12,16.691L14.897,18.457C15.099,18.351 15.295,18.236 15.485,18.115L12.443,16.181L12.343,16.338L9.59,14.588C9.523,14.638 9.456,14.686 9.386,14.733L9.387,14.732ZM10.168,14.068L13.26,15.679L13.175,15.845L16.339,17.494C16.505,17.357 16.666,17.214 16.821,17.064L13.454,15.309L13.369,15.474L10.328,13.89C10.277,13.951 10.224,14.011 10.169,14.068H10.168ZM10.657,13.443L14.141,14.76L14.075,14.934L17.562,16.25C17.692,16.087 17.816,15.918 17.936,15.745L14.289,14.368L14.223,14.542L10.781,13.242C10.741,13.31 10.7,13.377 10.657,13.443ZM11.022,12.76L14.734,13.687L14.689,13.868L18.487,14.817C18.581,14.635 18.668,14.448 18.749,14.259L14.835,13.282L14.79,13.463L11.107,12.543C11.08,12.616 11.051,12.688 11.022,12.76ZM11.264,12.024L15.134,12.499L15.111,12.685L19.122,13.179C19.174,12.983 19.221,12.786 19.26,12.587L15.185,12.086L15.162,12.271L11.31,11.797C11.296,11.873 11.281,11.949 11.264,12.025V12.024Z"
android:fillColor="#ffffff"/>
</group>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.