Updated on 2026-08-14
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = { },
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ fun SelectorRowItem(
|
|||
val textStyle = if (isSelected && showSelectedAppearance) {
|
||||
TangemTheme.typography.subtitle2
|
||||
} else {
|
||||
TangemTheme.typography.body2
|
||||
TangemTheme.typography.body1
|
||||
}
|
||||
Box(
|
||||
modifier = modifier
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ private fun Preview_TooltipText() {
|
|||
) {
|
||||
TooltipText(
|
||||
text = stringReference("Text"),
|
||||
onInfoClick = { /* [REDACTED_TODO_COMMENT]*/ },
|
||||
onInfoClick = { },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = {},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
536
core/ui/src/main/java/com/tangem/core/ui/res/TangemColors2.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
package com.tangem.core.ui.test
|
||||
|
||||
object FooterTestTags {
|
||||
const val FOOTER_TEXT = "FOOTER_TEXT"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 48 KiB |
15
core/ui/src/main/res/drawable/ic_attention_72.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
9
core/ui/src/main/res/drawable/ic_credit_card_add_24.xml
Normal 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>
|
||||
12
core/ui/src/main/res/drawable/ic_explore_20.xml
Normal 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>
|
||||
12
core/ui/src/main/res/drawable/ic_plasma_22.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
12
core/ui/src/main/res/drawable/ic_snow_24.xml
Normal 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>
|
||||
12
core/ui/src/main/res/drawable/ic_stars_20.xml
Normal 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>
|
||||
12
core/ui/src/main/res/drawable/ic_start_circle_12.xml
Normal 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>
|
||||
19
core/ui/src/main/res/drawable/img_plasma_22.xml
Normal 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>
|
||||
BIN
core/ui/src/main/res/drawable/img_tangem_pay_visa.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
core/ui/src/main/res/drawable/img_tangem_pay_visa_frozen.webp
Normal file
|
After Width: | Height: | Size: 30 KiB |