diff --git a/library/src/commonMain/kotlin/me/saket/swipe/SwipeableActionsBox.kt b/library/src/commonMain/kotlin/me/saket/swipe/SwipeableActionsBox.kt index 9b2c837..71c4f71 100644 --- a/library/src/commonMain/kotlin/me/saket/swipe/SwipeableActionsBox.kt +++ b/library/src/commonMain/kotlin/me/saket/swipe/SwipeableActionsBox.kt @@ -125,11 +125,11 @@ private fun ActionIconBox( layout(width = placeable.width, height = placeable.height) { // Align icon with the left/right edge of the content being swiped. val iconOffset = if (action.isOnRightSide) constraints.maxWidth + offset else offset - placeable.width - placeable.placeRelative(x = iconOffset.roundToInt(), y = 0) + placeable.place(x = iconOffset.roundToInt(), y = 0) } } .background(color = backgroundColor), - horizontalArrangement = if (action.isOnRightSide) Arrangement.Start else Arrangement.End, + horizontalArrangement = if (action.isOnRightSide) Arrangement.Absolute.Left else Arrangement.Absolute.Right, verticalAlignment = Alignment.CenterVertically, ) { content() diff --git a/library/src/test/kotlin/me/saket/swipe/SwipeableActionsBoxTest.kt b/library/src/test/kotlin/me/saket/swipe/SwipeableActionsBoxTest.kt index 0d77716..63652f5 100644 --- a/library/src/test/kotlin/me/saket/swipe/SwipeableActionsBoxTest.kt +++ b/library/src/test/kotlin/me/saket/swipe/SwipeableActionsBoxTest.kt @@ -22,6 +22,7 @@ import androidx.compose.material.icons.twotone.Snooze import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -29,8 +30,11 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.isSpecified import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import app.cash.paparazzi.DeviceConfig import app.cash.paparazzi.Paparazzi @@ -140,6 +144,22 @@ class SwipeableActionsBoxTest { } } + @Test + fun `rtl alignment test`() { + paparazzi.snapshot { + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) { + Scaffold { + SwipeableActionsBox( + state = rememberSwipeActionsState(initialOffset = 80.dp), + startActions = listOf(replyAll), + endActions = listOf(snooze), + content = { BatmanIpsumItem() }, + ) + } + } + } + } + @Composable private fun Scaffold(content: @Composable BoxWithConstraintsScope.() -> Unit) { BoxWithConstraints( diff --git a/library/src/test/snapshots/images/me.saket.swipe_SwipeableActionsBoxTest_rtl alignment test.png b/library/src/test/snapshots/images/me.saket.swipe_SwipeableActionsBoxTest_rtl alignment test.png new file mode 100644 index 0000000..9a5d403 Binary files /dev/null and b/library/src/test/snapshots/images/me.saket.swipe_SwipeableActionsBoxTest_rtl alignment test.png differ