diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/button/subcomponents/container/PokitButtonContainerModifier.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/button/subcomponents/container/PokitButtonContainerModifier.kt index c90ac92d..db7c2e95 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/button/subcomponents/container/PokitButtonContainerModifier.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/button/subcomponents/container/PokitButtonContainerModifier.kt @@ -2,13 +2,10 @@ package pokitmons.pokit.core.ui.components.atom.button.subcomponents.container import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -22,6 +19,7 @@ import pokitmons.pokit.core.ui.components.atom.button.attributes.PokitButtonStat import pokitmons.pokit.core.ui.components.atom.button.attributes.PokitButtonStyle import pokitmons.pokit.core.ui.components.atom.button.attributes.PokitButtonType import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable internal fun Modifier.pokitButtonContainerModifier( @@ -44,11 +42,9 @@ internal fun Modifier.pokitButtonContainerModifier( .clip( shape = buttonShape ) - .clickable( + .scaleClickable( enabled = (state != PokitButtonState.DISABLE), - onClick = onClick, - indication = null, - interactionSource = remember { MutableInteractionSource() } + onClick = onClick ) .background( shape = buttonShape, diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/checkbox/PokitCheckbox.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/checkbox/PokitCheckbox.kt index 1462af55..6b7bc1d0 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/checkbox/PokitCheckbox.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/checkbox/PokitCheckbox.kt @@ -5,10 +5,12 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -36,10 +38,17 @@ fun PokitCheckbox( val iconTintColor = getIconTintColor(style = style, checked = checked, enabled = enabled) val strokeColor = getStrokeColor(style = style, checked = checked, enabled = enabled) + val pressedBackgroundColor = getPressedBackgroundColor(style = style) + val pressedIconTintColor = getPressedIconTintColor(style = style) + val pressedStrokeColor = getPressedStrokeColor(style = style) + + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + Image( painter = painterResource(id = R.drawable.icon_24_check), contentDescription = null, - colorFilter = ColorFilter.tint(iconTintColor), + colorFilter = ColorFilter.tint(if (isPressed) pressedIconTintColor else iconTintColor), modifier = Modifier .size(24.dp) .clip( @@ -50,7 +59,7 @@ fun PokitCheckbox( ) { clickable( indication = null, - interactionSource = remember { MutableInteractionSource() }, + interactionSource = interactionSource, enabled = enabled, onClick = { onClick?.invoke(!checked) @@ -58,11 +67,11 @@ fun PokitCheckbox( ) } .background( - color = backgroundColor + color = if (isPressed) pressedBackgroundColor else backgroundColor ) .border( width = 1.dp, - color = strokeColor, + color = if (isPressed) pressedStrokeColor else strokeColor, shape = checkboxShape ) ) @@ -156,3 +165,32 @@ private fun getBackgroundColor( } } } + +@Composable +private fun getPressedIconTintColor(style: PokitCheckboxStyle): Color { + return when (style) { + PokitCheckboxStyle.FILLED -> PokitTheme.colors.inverseWh + PokitCheckboxStyle.STROKE -> PokitTheme.colors.brandLight + PokitCheckboxStyle.ICON_ONLY -> PokitTheme.colors.brandLight + } +} + +@Composable +private fun getPressedStrokeColor(style: PokitCheckboxStyle): Color { + return when (style) { + PokitCheckboxStyle.FILLED -> Color.Unspecified + PokitCheckboxStyle.STROKE -> PokitTheme.colors.brandLight + PokitCheckboxStyle.ICON_ONLY -> Color.Unspecified + } +} + +@Composable +private fun getPressedBackgroundColor( + style: PokitCheckboxStyle, +): Color { + return when (style) { + PokitCheckboxStyle.FILLED -> PokitTheme.colors.brandLight + PokitCheckboxStyle.STROKE -> PokitTheme.colors.backgroundBase + PokitCheckboxStyle.ICON_ONLY -> Color.Unspecified + } +} diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/chip/subcomponents/container/PokitChipContainerModifier.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/chip/subcomponents/container/PokitChipContainerModifier.kt index 50788d35..c1fe1828 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/chip/subcomponents/container/PokitChipContainerModifier.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/chip/subcomponents/container/PokitChipContainerModifier.kt @@ -2,13 +2,10 @@ package pokitmons.pokit.core.ui.components.atom.chip.subcomponents.container import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -18,6 +15,7 @@ import pokitmons.pokit.core.ui.components.atom.chip.attributes.PokitChipSize import pokitmons.pokit.core.ui.components.atom.chip.attributes.PokitChipState import pokitmons.pokit.core.ui.components.atom.chip.attributes.PokitChipType import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable internal fun Modifier.pokitChipContainerModifier( @@ -35,11 +33,9 @@ internal fun Modifier.pokitChipContainerModifier( .clip( shape = RoundedCornerShape(9999.dp) ) - .clickable( + .scaleClickable( enabled = (onClick != null && state != PokitChipState.DISABLED), - onClick = onClick ?: {}, - interactionSource = remember { MutableInteractionSource() }, - indication = null + onClick = onClick ?: {} ) .background( shape = RoundedCornerShape(9999.dp), diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/input/subcomponents/icon/PokitInputIcon.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/input/subcomponents/icon/PokitInputIcon.kt index a2c6493b..d382e2da 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/input/subcomponents/icon/PokitInputIcon.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/input/subcomponents/icon/PokitInputIcon.kt @@ -2,9 +2,11 @@ package pokitmons.pokit.core.ui.components.atom.input.subcomponents.icon import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -20,20 +22,25 @@ internal fun PokitInputIcon( onClick: (() -> Unit)? = null, ) { val iconColor = getColor(state = state) + val pressedIconColor = PokitTheme.colors.iconDisable + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() Icon( painter = painterResource(id = resourceId), contentDescription = null, - tint = iconColor, - modifier = Modifier.size(24.dp).then( - other = onClick?.let { method -> - Modifier.clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() }, - onClick = method - ) - } ?: Modifier - ) + tint = if (isPressed) pressedIconColor else iconColor, + modifier = Modifier + .size(24.dp) + .then( + other = onClick?.let { method -> + Modifier.clickable( + onClick = method, + indication = null, + interactionSource = interactionSource + ) + } ?: Modifier + ) ) } diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/loginbutton/PokitLoginButton.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/loginbutton/PokitLoginButton.kt index a42618f9..bd653224 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/loginbutton/PokitLoginButton.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/atom/loginbutton/PokitLoginButton.kt @@ -1,6 +1,9 @@ package pokitmons.pokit.core.ui.components.atom.loginbutton +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.border +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -12,8 +15,11 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R @@ -29,9 +35,13 @@ fun PokitLoginButton( text: String, ) { val loginResource: PokitLoginResource = getLoginResource(loginType) + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + val scale by animateFloatAsState(targetValue = if (isPressed) 0.95f else 1f, label = "scale") Surface( modifier = Modifier + .scale(scale) .height(50.dp) .border( shape = RoundedCornerShape(8.dp), @@ -40,7 +50,8 @@ fun PokitLoginButton( ), shape = RoundedCornerShape(8.dp), color = loginResource.backgroundColor, - onClick = onClick + onClick = onClick, + interactionSource = interactionSource ) { Row( modifier = modifier.fillMaxWidth(), diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkcard/LinkCard.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkcard/LinkCard.kt index 73a02615..3ee0e2ce 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkcard/LinkCard.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkcard/LinkCard.kt @@ -36,7 +36,7 @@ import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.components.atom.checkbox.PokitCheckbox import pokitmons.pokit.core.ui.components.atom.checkbox.attributes.PokitCheckboxStyle import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable fun LinkCard( @@ -58,7 +58,9 @@ fun LinkCard( Row( modifier = Modifier .clip(RoundedCornerShape(8.dp)) - .noRippleClickable { onClickItem(item) } + .scaleClickable(pressedScale = 0.98f) { + onClickItem(item) + } ) { Box( modifier = Modifier diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt index a00dd0cc..63b65a4b 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/linkurlcard/LinkUrlCard.kt @@ -1,7 +1,11 @@ package pokitmons.pokit.core.ui.components.block.linkurlcard +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Image import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize @@ -15,15 +19,17 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme import pokitmons.pokit.core.ui.utils.conditional -import pokitmons.pokit.core.ui.utils.noRippleClickable import pokitmons.pokit.core.ui.utils.shimmerEffect @Composable @@ -36,13 +42,20 @@ fun LinkUrlCard( isLoading: Boolean = false, ) { val uriHandler = LocalUriHandler.current + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + val scale by animateFloatAsState(targetValue = if (isPressed) 0.98f else 1f, label = "scale") Row( modifier = modifier .fillMaxWidth() + .scale(scale) .clip(RoundedCornerShape(12.dp)) .height(IntrinsicSize.Min) - .noRippleClickable { + .clickable( + indication = null, + interactionSource = interactionSource + ) { if (openWebBrowserByClick && !isLoading) { uriHandler.openUri(url) } @@ -54,13 +67,20 @@ fun LinkUrlCard( ) ) { if (isLoading) { - Box(modifier = Modifier.width(124.dp).fillMaxHeight().shimmerEffect()) + Box( + modifier = Modifier + .width(124.dp) + .fillMaxHeight() + .shimmerEffect() + ) } else { Image( painter = thumbnailPainter, contentDescription = null, contentScale = ContentScale.Crop, - modifier = Modifier.width(124.dp).fillMaxHeight() + modifier = Modifier + .width(124.dp) + .fillMaxHeight() ) } @@ -70,7 +90,9 @@ fun LinkUrlCard( .weight(1f) ) { Text( - modifier = Modifier.fillMaxWidth().conditional(isLoading) { shimmerEffect() }, + modifier = Modifier + .fillMaxWidth() + .conditional(isLoading) { shimmerEffect() }, text = title, maxLines = 2, style = PokitTheme.typography.body3Medium.copy(color = PokitTheme.colors.textSecondary) @@ -79,7 +101,9 @@ fun LinkUrlCard( Spacer(modifier = Modifier.height(8.dp)) Text( - modifier = Modifier.fillMaxWidth().conditional(isLoading) { shimmerEffect() }, + modifier = Modifier + .fillMaxWidth() + .conditional(isLoading) { shimmerEffect() }, text = url, maxLines = 2, style = PokitTheme.typography.detail2.copy(color = PokitTheme.colors.textTertiary) diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitcard/PokitCard.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitcard/PokitCard.kt index 1d3a6038..b90d1b86 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitcard/PokitCard.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitcard/PokitCard.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable fun PokitCard( @@ -42,11 +42,11 @@ fun PokitCard( .clip( shape = RoundedCornerShape(8.dp) ) + .scaleClickable { onClick() } .background( color = PokitTheme.colors.backgroundPrimary, shape = RoundedCornerShape(8.dp) ) - .noRippleClickable { onClick() } .padding(top = 12.dp, start = 12.dp, bottom = 8.dp, end = 8.dp) ) { Row( diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitList.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitList.kt index 3830ee42..9d346866 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitList.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitList.kt @@ -1,7 +1,6 @@ package pokitmons.pokit.core.ui.components.block.pokitlist import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -10,7 +9,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -35,9 +33,7 @@ fun PokitList( modifier = modifier .clickable( enabled = state != PokitListState.DISABLE, - onClick = { onClickItem(item) }, - indication = null, - interactionSource = remember { MutableInteractionSource() } + onClick = { onClickItem(item) } ) .padding(horizontal = 20.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitListVer2.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitListVer2.kt index d36d4ba2..a77ef502 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitListVer2.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokitlist/PokitListVer2.kt @@ -1,7 +1,6 @@ package pokitmons.pokit.core.ui.components.block.pokitlist import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -11,7 +10,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -39,9 +37,7 @@ fun PokitListVer2( modifier = modifier .clickable( enabled = state != PokitListState.DISABLE, - onClick = { onClickItem(item) }, - indication = null, - interactionSource = remember { MutableInteractionSource() } + onClick = { onClickItem(item) } ) .padding(horizontal = 20.dp, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt index 5aa309a6..02776fae 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pokittoast/PokitToast.kt @@ -1,7 +1,6 @@ package pokitmons.pokit.core.ui.components.block.pokittoast import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding @@ -21,6 +20,7 @@ import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.components.block.pokittoast.attributes.PokitToastType import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable fun PokitToast( @@ -32,12 +32,13 @@ fun PokitToast( ) { Row( modifier = modifier - .clip(RoundedCornerShape(9999.dp)) - .background(type.color) - .clickable( + .scaleClickable( + pressedScale = 0.98f, enabled = onClick != null, onClick = onClick ?: {} ) + .clip(RoundedCornerShape(9999.dp)) + .background(type.color) .padding(start = 20.dp, end = 14.dp, top = 12.dp, bottom = 12.dp), verticalAlignment = Alignment.CenterVertically ) { diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pushcard/PushCard.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pushcard/PushCard.kt index 0621b518..12bef0d2 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pushcard/PushCard.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/pushcard/PushCard.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable fun PushCard( @@ -36,7 +36,7 @@ fun PushCard( Row( modifier = modifier - .noRippleClickable { onClick() } + .scaleClickable(pressedScale = 0.98f) { onClick() } .padding(all = 20.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/select/PokitSelect.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/select/PokitSelect.kt index 557718b8..9c94276e 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/select/PokitSelect.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/select/PokitSelect.kt @@ -1,7 +1,6 @@ package pokitmons.pokit.core.ui.components.block.select import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -57,9 +56,7 @@ fun PokitSelect( .clip(RoundedCornerShape(8.dp)) .clickable( onClick = onClick, - enabled = (state != PokitSelectState.DISABLE) && (state != PokitSelectState.READ_ONLY), - indication = null, - interactionSource = remember { MutableInteractionSource() } + enabled = (state != PokitSelectState.DISABLE) && (state != PokitSelectState.READ_ONLY) ) .padding(all = 12.dp), verticalAlignment = Alignment.CenterVertically diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/switchradio/subcomponents/RadioItem.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/switchradio/subcomponents/RadioItem.kt index 00985b93..5977af2e 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/switchradio/subcomponents/RadioItem.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/switchradio/subcomponents/RadioItem.kt @@ -4,10 +4,12 @@ import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -32,27 +34,37 @@ internal fun SwitchRadioItem( val strokeColor = getStrokeColor(style = style, selected = selected, enabled = enabled) val textColor = getTextColor(style = style, selected = selected, enabled = enabled) + val pressedBackgroundColor = getPressedBackgroundColor(style = style) + val pressedStrokeColor = getPressedStrokeColor(style = style) + val pressedTextColor = getPressedTextColor(style = style) + + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + Text( text = text, modifier = modifier .clip(shape = shape) .clickable( indication = null, - interactionSource = remember { MutableInteractionSource() }, + interactionSource = interactionSource, enabled = enabled, onClick = { onClickItem(data) } ) .background( shape = shape, - color = backgroundColor + color = if (isPressed) pressedBackgroundColor else backgroundColor ) .border( width = 1.dp, shape = shape, - color = strokeColor + color = if (isPressed) pressedStrokeColor else strokeColor ) .padding(all = 16.dp), - style = PokitTheme.typography.body2Medium.copy(color = textColor), + style = PokitTheme + .typography + .body2Medium + .copy(color = if (isPressed) pressedTextColor else textColor), textAlign = TextAlign.Center ) } @@ -131,3 +143,33 @@ private fun getTextColor( } } } + +@Composable +private fun getPressedBackgroundColor( + style: PokitSwitchRadioStyle, +): Color { + return when (style) { + PokitSwitchRadioStyle.FILLED -> PokitTheme.colors.brandLight + PokitSwitchRadioStyle.STROKE -> PokitTheme.colors.backgroundBase + } +} + +@Composable +private fun getPressedStrokeColor( + style: PokitSwitchRadioStyle, +): Color { + return when (style) { + PokitSwitchRadioStyle.FILLED -> Color.Unspecified + PokitSwitchRadioStyle.STROKE -> PokitTheme.colors.brandLight + } +} + +@Composable +private fun getPressedTextColor( + style: PokitSwitchRadioStyle, +): Color { + return when (style) { + PokitSwitchRadioStyle.FILLED -> PokitTheme.colors.inverseWh + PokitSwitchRadioStyle.STROKE -> PokitTheme.colors.brandLight + } +} diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/tap/PokitTap.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/tap/PokitTap.kt index 4109b575..f3cc1f2b 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/tap/PokitTap.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/tap/PokitTap.kt @@ -1,17 +1,21 @@ package pokitmons.pokit.core.ui.components.block.tap +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable @Composable fun PokitTap( @@ -22,10 +26,15 @@ fun PokitTap( modifier: Modifier = Modifier, ) { val textStyle = getTextStyle(selected = (data == selectedItem)) + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() Box( modifier = modifier - .noRippleClickable { + .clickable( + indication = null, + interactionSource = interactionSource + ) { onClick(data) } ) { @@ -34,13 +43,14 @@ fun PokitTap( style = textStyle, modifier = Modifier .align(Alignment.TopCenter) - .padding(bottom = 16.dp, top = 4.dp) + .padding(bottom = 16.dp, top = 4.dp), + color = if (isPressed) PokitTheme.colors.textDisable else PokitTheme.colors.textPrimary ) if (selectedItem == data) { HorizontalDivider( thickness = 2.dp, - color = PokitTheme.colors.brand, + color = if (isPressed) PokitTheme.colors.brandLight else PokitTheme.colors.brand, modifier = Modifier .align(Alignment.BottomCenter) .fillMaxWidth() diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/texticonbutton/TextIconButton.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/texticonbutton/TextIconButton.kt index 8a49e334..79cc2166 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/texticonbutton/TextIconButton.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/block/texticonbutton/TextIconButton.kt @@ -1,6 +1,9 @@ package pokitmons.pokit.core.ui.components.block.texticonbutton import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -8,6 +11,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -15,7 +20,6 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable @Composable internal fun TextIconButton( @@ -23,11 +27,18 @@ internal fun TextIconButton( title: String, painter: Painter, tintColor: Color? = PokitTheme.colors.iconPrimary, + pressedTintColor: Color? = PokitTheme.colors.iconDisable, ) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + Row( modifier = Modifier .fillMaxWidth() - .noRippleClickable { + .clickable( + indication = null, + interactionSource = interactionSource + ) { onClick() } .padding(horizontal = 24.dp, vertical = 20.dp), @@ -36,14 +47,17 @@ internal fun TextIconButton( ) { Text( text = title, - style = PokitTheme.typography.body1Medium.copy(color = PokitTheme.colors.textSecondary) + style = PokitTheme + .typography + .body1Medium + .copy(color = if (isPressed) PokitTheme.colors.textDisable else PokitTheme.colors.textSecondary) ) Image( modifier = Modifier.size(24.dp), painter = painter, contentDescription = null, - colorFilter = tintColor?.let { ColorFilter.tint(it) } + colorFilter = if (isPressed) pressedTintColor?.let { ColorFilter.tint(it) } else tintColor?.let { ColorFilter.tint(it) } ) } } diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/bottomsheet/subcomponents/PokitBottomSheetItem.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/bottomsheet/subcomponents/PokitBottomSheetItem.kt index 3e2ddca5..bc68e19a 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/bottomsheet/subcomponents/PokitBottomSheetItem.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/bottomsheet/subcomponents/PokitBottomSheetItem.kt @@ -1,6 +1,9 @@ package pokitmons.pokit.core.ui.components.template.bottomsheet.subcomponents import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -8,13 +11,14 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable @Composable fun PokitBottomSheetItem( @@ -23,9 +27,18 @@ fun PokitBottomSheetItem( data: T, onClick: (T) -> Unit, ) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + + val textColor = if (isPressed) PokitTheme.colors.textDisable else PokitTheme.colors.textSecondary + val iconTintColor = if (isPressed) PokitTheme.colors.iconDisable else PokitTheme.colors.iconPrimary + Row( modifier = Modifier - .noRippleClickable { + .clickable( + indication = null, + interactionSource = interactionSource + ) { onClick(data) } .padding(horizontal = 24.dp, vertical = 20.dp) @@ -35,14 +48,17 @@ fun PokitBottomSheetItem( ) { Text( text = text, - style = PokitTheme.typography.body1Medium.copy(color = PokitTheme.colors.textSecondary) + style = PokitTheme + .typography + .body1Medium + .copy(color = textColor) ) Image( painter = painterResource(id = resourceId), contentDescription = null, modifier = Modifier.size(24.dp), - colorFilter = ColorFilter.tint(color = PokitTheme.colors.iconPrimary) + colorFilter = ColorFilter.tint(color = iconTintColor) ) } } diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheetContent.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheetContent.kt index ef367412..c95d1c0c 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheetContent.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/linkdetailbottomsheet/LinkDetailBottomSheetContent.kt @@ -136,7 +136,8 @@ fun LinkDetailBottomSheetContent( painter = painterResource( id = if (bookmark) R.drawable.icon_24_star else R.drawable.icon_24_star_1 ), - tintColor = if (bookmark) PokitTheme.colors.brand else PokitTheme.colors.iconPrimary + tintColor = if (bookmark) PokitTheme.colors.brand else PokitTheme.colors.iconPrimary, + pressedTintColor = if (bookmark) PokitTheme.colors.brandLight else PokitTheme.colors.iconDisable ) HorizontalDivider( diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/pookiempty/EmptyPooki.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/pookiempty/EmptyPooki.kt index 9d5eb8b2..8c115a49 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/pookiempty/EmptyPooki.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/components/template/pookiempty/EmptyPooki.kt @@ -2,7 +2,6 @@ package pokitmons.pokit.core.ui.components.template.pookiempty import androidx.compose.foundation.Image import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -19,6 +18,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.core.ui.utils.scaleClickable @Composable fun EmptyPooki( @@ -54,7 +54,7 @@ fun EmptyPooki( Text( modifier = Modifier.clip(shape = RoundedCornerShape(8.dp)) - .clickable { buttonInfo.onClick() } + .scaleClickable { buttonInfo.onClick() } .border( shape = RoundedCornerShape(8.dp), width = 1.dp, diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/theme/color/ColorSystem.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/theme/color/ColorSystem.kt index ba175484..5c44c691 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/theme/color/ColorSystem.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/theme/color/ColorSystem.kt @@ -24,6 +24,7 @@ data class PokitColors( val borderSecondary: Color = Gray200, val borderTertiary: Color = Gray100, val borderDisable: Color = Gray200, + val brandLight: Color = Orange200, val brand: Color = Brand, val brandBold: Color = Orange700, val info: Color = Blue700, diff --git a/core/ui/src/main/java/pokitmons/pokit/core/ui/utils/ModifierUtils.kt b/core/ui/src/main/java/pokitmons/pokit/core/ui/utils/ModifierUtils.kt index 267f0c0d..9914d216 100644 --- a/core/ui/src/main/java/pokitmons/pokit/core/ui/utils/ModifierUtils.kt +++ b/core/ui/src/main/java/pokitmons/pokit/core/ui/utils/ModifierUtils.kt @@ -1,5 +1,6 @@ package pokitmons.pokit.core.ui.utils +import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition @@ -7,13 +8,16 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.composed +import androidx.compose.ui.draw.scale import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Brush import androidx.compose.ui.layout.onGloballyPositioned @@ -39,6 +43,37 @@ fun Modifier.noRippleClickable(onClick: () -> Unit): Modifier { ) } +@Composable +fun Modifier.scaleClickable(originalScale: Float = 1f, pressedScale: Float = 0.95f, enabled: Boolean = true, onClick: () -> Unit): Modifier { + val interactionSource = remember { MutableInteractionSource() } + val animatedScale = remember { Animatable(originalScale) } + + LaunchedEffect(interactionSource) { + interactionSource.interactions.collect { interaction -> + when (interaction) { + is PressInteraction.Press -> { + animatedScale.animateTo(pressedScale) + } + is PressInteraction.Release -> { + animatedScale.animateTo(originalScale) + } + is PressInteraction.Cancel -> { + animatedScale.animateTo(originalScale) + } + } + } + } + + return this + .scale(animatedScale.value) + .clickable( + interactionSource = interactionSource, + indication = null, + enabled = enabled, + onClick = onClick + ) +} + internal fun Modifier.shimmerEffect(): Modifier = composed { var size by remember { mutableStateOf(IntSize.Zero) diff --git a/feature/home/src/main/java/pokitmons/pokit/home/BottomNavigationBar.kt b/feature/home/src/main/java/pokitmons/pokit/home/BottomNavigationBar.kt index a22e9555..f31b8e86 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/BottomNavigationBar.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/BottomNavigationBar.kt @@ -1,5 +1,8 @@ package pokitmons.pokit.home +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -12,6 +15,8 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -21,13 +26,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable import pokitmons.pokit.home.pokit.PokitViewModel import pokitmons.pokit.home.pokit.ScreenType import pokitmons.pokit.core.ui.R.drawable as DrawableResource -// TODO : 바텀시트 아이템 컴포저블로 만들기 - @Composable fun BottomNavigationBar(viewModel: PokitViewModel = hiltViewModel()) { Surface( @@ -40,65 +42,67 @@ fun BottomNavigationBar(viewModel: PokitViewModel = hiltViewModel()) { modifier = Modifier.height(92.dp), tonalElevation = 8.dp ) { - Column( - modifier = Modifier - .weight(2f) - .noRippleClickable { viewModel.updateScreenType(ScreenType.Pokit) } - .padding(bottom = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon( - painter = painterResource(id = DrawableResource.icon_24_folder), - contentDescription = "리마인드", - tint = when (viewModel.screenType.value) { - is ScreenType.Pokit -> Color.Black - is ScreenType.Remind -> PokitTheme.colors.iconTertiary - }, - modifier = Modifier.size(24.dp) - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - color = when (viewModel.screenType.value) { - is ScreenType.Pokit -> Color.Black - is ScreenType.Remind -> PokitTheme.colors.textTertiary - }, - style = PokitTheme.typography.detail2, - text = "포킷", - textAlign = TextAlign.Center - ) - } + BottomNavigationBarButton( + modifier = Modifier.weight(2f), + contentDescription = "포킷", + text = "포킷", + iconResourceId = DrawableResource.icon_24_folder, + selected = viewModel.screenType.value == ScreenType.Pokit, + onClick = { viewModel.updateScreenType(ScreenType.Pokit) } + ) - Column( - modifier = Modifier - .weight(2f) - .noRippleClickable { viewModel.updateScreenType(ScreenType.Remind) } - .padding(bottom = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon( - painter = painterResource(id = DrawableResource.icon_24_remind), - contentDescription = "리마인드", - tint = when (viewModel.screenType.value) { - is ScreenType.Remind -> Color.Black - is ScreenType.Pokit -> PokitTheme.colors.iconTertiary - }, - modifier = Modifier.size(24.dp) - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - color = when (viewModel.screenType.value) { - is ScreenType.Remind -> Color.Black - is ScreenType.Pokit -> PokitTheme.colors.textTertiary - }, - style = PokitTheme.typography.detail2, - text = "리마인드", - textAlign = TextAlign.Center - ) - } + BottomNavigationBarButton( + modifier = Modifier.weight(2f), + contentDescription = "리마인드", + text = "리마인드", + iconResourceId = DrawableResource.icon_24_remind, + selected = viewModel.screenType.value == ScreenType.Remind, + onClick = { viewModel.updateScreenType(ScreenType.Remind) } + ) } } } +@Composable +private fun BottomNavigationBarButton( + modifier: Modifier = Modifier, + selected: Boolean, + contentDescription: String?, + text: String, + iconResourceId: Int, + onClick: () -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + val iconColor = if (selected) Color.Black else PokitTheme.colors.iconTertiary + val textColor = if (selected) Color.Black else PokitTheme.colors.textTertiary + + Column( + modifier = modifier + .clickable( + onClick = onClick, + indication = null, + interactionSource = interactionSource + ) + .padding(bottom = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + painter = painterResource(id = iconResourceId), + contentDescription = contentDescription, + tint = if (isPressed) PokitTheme.colors.iconDisable else iconColor, + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + color = if (isPressed) PokitTheme.colors.textDisable else textColor, + style = PokitTheme.typography.detail2, + text = text, + textAlign = TextAlign.Center + ) + } +} + @Preview @Composable fun BottomNavigationBarPreview() { diff --git a/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt b/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt index d58a0736..c681edfc 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/HomeHeader.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -16,7 +17,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable import pokitmons.pokit.home.pokit.PokitViewModel import pokitmons.pokit.home.pokit.ScreenType @@ -48,33 +48,39 @@ fun HomeHeader( Spacer(modifier = Modifier.weight(1f)) Row { - Icon( - painterResource(id = R.drawable.icon_24_search), - contentDescription = "검색", - modifier = Modifier - .size(36.dp) - .noRippleClickable { onNavigateToSearch() } - .padding(6.dp) - ) - Icon( - painterResource(id = R.drawable.icon_24_bell), - contentDescription = "알림", - modifier = Modifier - .size(36.dp) - .noRippleClickable { onNavigateToAlarm() } - .padding(6.dp) - ) + IconButton( + modifier = Modifier.size(36.dp), + onClick = onNavigateToSearch + ) { + Icon( + painterResource(id = R.drawable.icon_24_search), + contentDescription = "검색", + modifier = Modifier.padding(6.dp) + ) + } + IconButton( + modifier = Modifier.size(36.dp), + onClick = onNavigateToAlarm + ) { + Icon( + painterResource(id = R.drawable.icon_24_bell), + contentDescription = "알림", + modifier = Modifier.padding(6.dp) + ) + } when (viewModel.screenType.value) { is ScreenType.Pokit -> { - Icon( - painterResource(id = R.drawable.icon_24_setup), - contentDescription = "설정", - modifier = Modifier - .size(36.dp) - .noRippleClickable { onNavigateToSetting() } - .padding(6.dp) - ) + IconButton( + modifier = Modifier.size(36.dp), + onClick = onNavigateToSetting + ) { + Icon( + painterResource(id = R.drawable.icon_24_setup), + contentDescription = "설정", + modifier = Modifier.padding(6.dp) + ) + } } is ScreenType.Remind -> Unit } diff --git a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt index 955a49e7..5c1d3fc6 100644 --- a/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt +++ b/feature/home/src/main/java/pokitmons/pokit/home/HomeScreen.kt @@ -37,7 +37,7 @@ import pokitmons.pokit.core.feature.flow.collectAsEffect import pokitmons.pokit.core.ui.R import pokitmons.pokit.core.ui.components.block.pokittoast.PokitToast import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable +import pokitmons.pokit.core.ui.utils.scaleClickable import pokitmons.pokit.home.model.HomeSideEffect import pokitmons.pokit.home.pokit.PokitScreen import pokitmons.pokit.home.pokit.PokitViewModel @@ -100,18 +100,18 @@ fun HomeScreen( ) { Column( modifier = Modifier - .background( - color = PokitTheme.colors.brand, - shape = RoundedCornerShape(12.dp) - ) - .size(96.dp) - .noRippleClickable { + .scaleClickable { scope.launch { sheetState.hide() showBottomSheet = false onNavigateAddLink(null) } - }, + } + .background( + color = PokitTheme.colors.brand, + shape = RoundedCornerShape(12.dp) + ) + .size(96.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { @@ -133,18 +133,18 @@ fun HomeScreen( Column( modifier = Modifier - .background( - color = PokitTheme.colors.brand, - shape = RoundedCornerShape(12.dp) - ) - .size(96.dp) - .noRippleClickable { + .scaleClickable { scope.launch { sheetState.hide() showBottomSheet = false viewModel.checkPokitCount() } - }, + } + .background( + color = PokitTheme.colors.brand, + shape = RoundedCornerShape(12.dp) + ) + .size(96.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { @@ -237,7 +237,7 @@ fun HomeScreen( modifier = Modifier .align(Alignment.BottomCenter) .padding(bottom = 60.dp) - .noRippleClickable { + .scaleClickable { showBottomSheet = true }, painter = painterResource(id = R.drawable.image_floating), diff --git a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt index ebeccaad..e1f494f8 100644 --- a/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt +++ b/feature/pokitdetail/src/main/java/com/strayalpaca/pokitdetail/PokitDetailScreen.kt @@ -3,7 +3,6 @@ package com.strayalpaca.pokitdetail import android.content.Context import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -51,6 +50,7 @@ import pokitmons.pokit.core.ui.components.template.pookiempty.EmptyPooki import pokitmons.pokit.core.ui.components.template.pookierror.ErrorPooki import pokitmons.pokit.core.ui.components.template.removeItemBottomSheet.TwoButtonBottomSheetContent import pokitmons.pokit.core.ui.theme.PokitTheme +import pokitmons.pokit.core.ui.utils.scaleClickable import pokitmons.pokit.core.ui.R.drawable as coreDrawable import pokitmons.pokit.core.ui.R.string as coreString @@ -195,14 +195,14 @@ fun PokitDetailScreen( modifier = Modifier .align(Alignment.BottomEnd) .padding(bottom = 48.dp, end = 20.dp) - .size(60.dp) - .clip(shape = CircleShape) - .background(color = PokitTheme.colors.brand) - .clickable { + .scaleClickable { state.currentPokit?.let { currentPokit -> onClickAddLink(currentPokit.id, currentPokit.title) } } + .size(60.dp) + .clip(shape = CircleShape) + .background(color = PokitTheme.colors.brand) .padding(12.dp), painter = painterResource(id = coreDrawable.icon_24_plus), contentDescription = "add link", diff --git a/feature/search/src/main/java/pokitmons/pokit/search/components/atom/CalendarCell.kt b/feature/search/src/main/java/pokitmons/pokit/search/components/atom/CalendarCell.kt index 2cb7dc3d..b66180f3 100644 --- a/feature/search/src/main/java/pokitmons/pokit/search/components/atom/CalendarCell.kt +++ b/feature/search/src/main/java/pokitmons/pokit/search/components/atom/CalendarCell.kt @@ -1,14 +1,11 @@ package pokitmons.pokit.search.components.atom import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -16,6 +13,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme import pokitmons.pokit.core.ui.theme.color.Orange100 +import pokitmons.pokit.core.ui.utils.scaleClickable import pokitmons.pokit.search.model.Date @Composable @@ -32,9 +30,7 @@ internal fun CalendarCellView( .size(40.dp) .then( other = onClick?.let { method -> - Modifier.clickable( - indication = null, - interactionSource = remember { MutableInteractionSource() }, + Modifier.scaleClickable( onClick = { method(date) } ) } ?: Modifier diff --git a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingHeader.kt b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingHeader.kt index 53a0e259..06444e00 100644 --- a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingHeader.kt +++ b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingHeader.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -14,7 +15,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import pokitmons.pokit.core.ui.theme.PokitTheme -import pokitmons.pokit.core.ui.utils.noRippleClickable import pokitmons.pokit.core.ui.R.drawable as DrawableResource import pokitmons.pokit.settings.R.string as StringResource @@ -26,16 +26,18 @@ fun SettingHeader( modifier = Modifier .fillMaxWidth() .height(56.dp) - .padding(start = 24.dp, end = 24.dp) + .padding(horizontal = 18.dp) ) { - Icon( - painter = painterResource(id = DrawableResource.icon_24_arrow_left), - contentDescription = null, - modifier = Modifier - .align(Alignment.CenterStart) - .noRippleClickable { onBackPressed() } - .size(24.dp) - ) + IconButton( + modifier = Modifier.align(Alignment.CenterStart).size(36.dp), + onClick = onBackPressed + ) { + Icon( + painter = painterResource(id = DrawableResource.icon_24_arrow_left), + contentDescription = null, + modifier = Modifier.padding(6.dp) + ) + } Text( text = stringResource(StringResource.settings), diff --git a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingItem.kt b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingItem.kt index 151a0aba..4dee4c4c 100644 --- a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingItem.kt +++ b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingItem.kt @@ -2,6 +2,7 @@ package pokitmons.pokit.settings.setting import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -11,6 +12,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -24,6 +26,9 @@ fun SettingItem( title: String, onClick: () -> Unit, ) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + Row( modifier = Modifier .fillMaxWidth() @@ -31,7 +36,7 @@ fun SettingItem( .padding(start = 24.dp, end = 24.dp) .clickable( indication = null, - interactionSource = remember { MutableInteractionSource() } + interactionSource = interactionSource ) { onClick() }, @@ -39,7 +44,8 @@ fun SettingItem( ) { Text( text = title, - style = PokitTheme.typography.title3 + style = PokitTheme.typography.title3, + color = if (isPressed) PokitTheme.colors.textDisable else PokitTheme.colors.textPrimary ) Spacer(modifier = Modifier.weight(1f)) @@ -48,7 +54,8 @@ fun SettingItem( painter = painterResource(id = R.drawable.icon_24_arrow_right), contentDescription = null, modifier = Modifier - .size(24.dp) + .size(24.dp), + tint = if (isPressed) PokitTheme.colors.iconDisable else PokitTheme.colors.iconPrimary ) } } diff --git a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingsScreen.kt b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingsScreen.kt index b6cbdeb7..f9ebcc13 100644 --- a/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingsScreen.kt +++ b/feature/settings/src/main/java/pokitmons/pokit/settings/setting/SettingsScreen.kt @@ -47,10 +47,6 @@ fun SettingsScreen( onNavigateToEditNickname() } -// SettingItem(title = stringResource(StringResource.notification_settings)) { -// // TODO 커스텀 토스트 메세지 -// } - DividerItem() SettingItem(title = stringResource(StringResource.announcements)) { @@ -80,6 +76,8 @@ fun SettingsScreen( changeBottomSheetHideState(true) } } + + DividerItem() } }