Updated on 2026-08-14

This commit is contained in:
Tangem 2026-06-22 12:53:35 +03:00
parent 21ae76847b
commit e39926a1b2
5 changed files with 67 additions and 62 deletions

View file

@ -74,8 +74,9 @@ fun TangemContextMenu(
}
}
private const val IN_TRANSITION_DURATION = 120
private const val OUT_TRANSITION_DURATION = 75
private const val ENTER_SPRING_DAMPING = 0.82f
private const val ENTER_SPRING_STIFFNESS = 1100f
@Suppress("ReusedModifierInstance", "MagicNumber")
@Composable
@ -91,10 +92,10 @@ private fun DropdownMenuContent(
val scale by transition.animateFloat(
transitionSpec = {
if (false isTransitioningTo true) {
// Dismissed to expanded
tween(
durationMillis = IN_TRANSITION_DURATION,
easing = LinearOutSlowInEasing,
// Dismissed to expanded — springy iOS-like pop scaling up from the anchor.
spring(
dampingRatio = ENTER_SPRING_DAMPING,
stiffness = ENTER_SPRING_STIFFNESS,
)
} else {
// Expanded to dismissed.

View file

@ -3,6 +3,7 @@ package com.tangem.core.ui.ds.contextmenu
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.ds.checkbox.TangemCheckbox
@ -18,12 +19,13 @@ import com.tangem.core.ui.res.TangemTheme
fun TangemContextMenuCheckboxItem(title: TextReference, isChecked: Boolean, onClick: () -> Unit) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.width(238.dp)
.clickableSingle(onClick = onClick)
.padding(
vertical = TangemTheme.dimens2.x5,
vertical = TangemTheme.dimens2.x2_5,
horizontal = TangemTheme.dimens2.x4,
),
) {

View file

@ -10,7 +10,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
@ -40,6 +39,7 @@ internal fun SortByMenu(
Column {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.widthIn(238.dp)
@ -50,7 +50,7 @@ internal fun SortByMenu(
},
)
.padding(
vertical = TangemTheme.dimens2.x5,
vertical = TangemTheme.dimens2.x2_5,
horizontal = TangemTheme.dimens2.x4,
),
) {
@ -60,27 +60,30 @@ internal fun SortByMenu(
color = TangemTheme.colors2.text.neutral.primary,
maxLines = 1,
)
if (sortMenuUM.selectedOption == sortType) {
Box(
modifier = Modifier
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x5)
.background(
color = TangemTheme.colors2.graphic.neutral.primary,
shape = CircleShape,
),
) {
Icon(
painter = rememberVectorPainter(
ImageVector.vectorResource(R.drawable.ic_check_default_24),
),
contentDescription = null,
tint = TangemTheme.colors2.graphic.neutral.primaryInverted,
Box(
modifier = Modifier.size(TangemTheme.dimens2.x6),
contentAlignment = Alignment.Center,
) {
if (sortMenuUM.selectedOption == sortType) {
Box(
modifier = Modifier
.align(Alignment.Center)
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x4),
)
.size(TangemTheme.dimens2.x5)
.background(
color = TangemTheme.colors2.graphic.neutral.primary,
shape = CircleShape,
),
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_check_default_24),
contentDescription = null,
tint = TangemTheme.colors2.graphic.neutral.primaryInverted,
modifier = Modifier
.align(Alignment.Center)
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x4),
)
}
}
}
}

View file

@ -10,7 +10,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
@ -80,7 +79,7 @@ private fun SortByBalanceMenuSection(organizeMenuUM: OrganizeTokensUM.OrganizeMe
},
enabled = !organizeMenuUM.isSortedByBalance,
)
.padding(vertical = TangemTheme.dimens2.x5, horizontal = TangemTheme.dimens2.x4),
.padding(vertical = TangemTheme.dimens2.x2_5, horizontal = TangemTheme.dimens2.x4),
)
HorizontalDivider(
@ -93,6 +92,7 @@ private fun SortByBalanceMenuSection(organizeMenuUM: OrganizeTokensUM.OrganizeMe
private fun GroupTokensMenuSection(organizeMenuUM: OrganizeTokensUM.OrganizeMenuUM, onDropdownDismiss: () -> Unit) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.widthIn(238.dp)
@ -102,7 +102,7 @@ private fun GroupTokensMenuSection(organizeMenuUM: OrganizeTokensUM.OrganizeMenu
onDropdownDismiss()
},
)
.padding(vertical = TangemTheme.dimens2.x5, horizontal = TangemTheme.dimens2.x4),
.padding(vertical = TangemTheme.dimens2.x2_5, horizontal = TangemTheme.dimens2.x4),
) {
Text(
text = stringResourceSafe(R.string.organize_tokens_group),
@ -110,27 +110,30 @@ private fun GroupTokensMenuSection(organizeMenuUM: OrganizeTokensUM.OrganizeMenu
color = TangemTheme.colors2.text.neutral.primary,
maxLines = 1,
)
if (organizeMenuUM.isGrouped) {
Box(
modifier = Modifier
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x5)
.background(
color = TangemTheme.colors2.graphic.neutral.primary,
shape = CircleShape,
),
) {
Icon(
painter = rememberVectorPainter(
ImageVector.vectorResource(R.drawable.ic_check_default_24),
),
contentDescription = null,
tint = TangemTheme.colors2.graphic.neutral.primaryInverted,
Box(
modifier = Modifier.size(TangemTheme.dimens2.x6),
contentAlignment = Alignment.Center,
) {
if (organizeMenuUM.isGrouped) {
Box(
modifier = Modifier
.align(Alignment.Center)
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x4),
)
.size(TangemTheme.dimens2.x5)
.background(
color = TangemTheme.colors2.graphic.neutral.primary,
shape = CircleShape,
),
) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_check_default_24),
contentDescription = null,
tint = TangemTheme.colors2.graphic.neutral.primaryInverted,
modifier = Modifier
.align(Alignment.Center)
.padding(TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x4),
)
}
}
}
}

View file

@ -10,6 +10,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
@ -93,17 +94,17 @@ private fun TokenActionContextMenuContent(actions: ImmutableList<TokenActionButt
Column(
modifier = Modifier
.widthIn(min = 206.dp)
.padding(
vertical = TangemTheme.dimens2.x2_5,
horizontal = TangemTheme.dimens2.x4,
),
.padding(TangemTheme.dimens2.x1_5),
) {
actions.fastForEach { item ->
Column {
Row(
horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens2.x2),
horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens2.x2_5),
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.testTag(BaseBottomSheetTestTags.ACTION_BUTTON)
.fillMaxWidth()
.clip(RoundedCornerShape(TangemTheme.dimens2.x2_5))
.clickable(
enabled = item.isEnabled,
onClick = {
@ -112,10 +113,8 @@ private fun TokenActionContextMenuContent(actions: ImmutableList<TokenActionButt
},
)
.padding(
start = TangemTheme.dimens2.x1_5,
end = TangemTheme.dimens2.x2,
top = TangemTheme.dimens2.x2_5,
bottom = TangemTheme.dimens2.x2_5,
horizontal = TangemTheme.dimens2.x2_5,
vertical = TangemTheme.dimens2.x2_5,
),
) {
Icon(
@ -143,10 +142,7 @@ private fun TokenActionContextMenuContent(actions: ImmutableList<TokenActionButt
if (item.hasDivider) {
Spacer(
modifier = Modifier
.padding(
vertical = TangemTheme.dimens2.x2_5,
horizontal = TangemTheme.dimens2.x2,
)
.padding(vertical = TangemTheme.dimens2.x1)
.fillMaxWidth()
.height(1.dp)
.background(TangemTheme.colors2.border.neutral.primary),