@@ -9,16 +9,23 @@ import androidx.compose.foundation.layout.Arrangement
99import androidx.compose.foundation.layout.Row
1010import androidx.compose.foundation.layout.fillMaxWidth
1111import androidx.compose.foundation.layout.padding
12+ import androidx.compose.foundation.layout.requiredSizeIn
1213import androidx.compose.foundation.layout.size
1314import androidx.compose.runtime.Composable
1415import androidx.compose.runtime.LaunchedEffect
16+ import androidx.compose.runtime.getValue
17+ import androidx.compose.runtime.mutableStateOf
1518import androidx.compose.runtime.remember
19+ import androidx.compose.runtime.setValue
1620import androidx.compose.ui.Alignment
1721import androidx.compose.ui.Modifier
1822import androidx.compose.ui.graphics.graphicsLayer
23+ import androidx.compose.ui.layout.onSizeChanged
24+ import androidx.compose.ui.platform.LocalDensity
1925import androidx.compose.ui.res.painterResource
2026import androidx.compose.ui.unit.Dp
2127import androidx.compose.ui.unit.dp
28+ import androidx.compose.ui.unit.min
2229import com.amsterdam.designsystem.R
2330import com.amsterdam.designsystem.components.Icon
2431import com.amsterdam.designsystem.theme.AppTheme
@@ -31,16 +38,24 @@ fun RatingBar(
3138 modifier : Modifier = Modifier ,
3239 starsCount : Int = 10,
3340 starSize : Dp = 24.dp,
34- starsSpacing : Dp = 12.dp,
35- useEqualSpacing : Boolean = true
41+ starsSpacing : Dp = 6.dp,
3642) {
43+ val density = LocalDensity .current
44+ var dialogWidth by remember { mutableStateOf(0 .dp) }
45+ val maxRowWidth = ((starSize.value + starsSpacing.value) * starsCount).dp
46+ val availableSpace = min(maxRowWidth, dialogWidth)
47+ val newStarSize = (availableSpace.value / starsCount * 5 / 6 ).dp
48+ val newStarSpacing = ((availableSpace.value - newStarSize.value * starsCount) / starsCount).dp
49+
3750 Row (
38- modifier = modifier.fillMaxWidth().padding(horizontal = 12 .dp),
39- horizontalArrangement = if (useEqualSpacing) {
40- Arrangement .Start
41- } else {
42- Arrangement .spacedBy(starsSpacing, Alignment .CenterHorizontally )
43- }
51+ modifier = modifier
52+ .fillMaxWidth()
53+ .onSizeChanged {
54+ dialogWidth = with (density) { it.width.toDp() }
55+ }
56+ .padding(horizontal = 12 .dp)
57+ .requiredSizeIn(maxWidth = dialogWidth),
58+ horizontalArrangement = Arrangement .spacedBy(newStarSpacing, Alignment .CenterHorizontally )
4459 ) {
4560 repeat(starsCount) { index ->
4661 val starIndex = index + 1
@@ -50,7 +65,7 @@ fun RatingBar(
5065
5166 LaunchedEffect (key1 = selectedStarIndex) {
5267 if (isSelected) {
53- delay(index * 50L ) // delay per star
68+ delay(index * 50L )
5469 translateY.snapTo(10f )
5570 translateY.animateTo(
5671 targetValue = 0f ,
@@ -71,8 +86,7 @@ fun RatingBar(
7186 tint = AppTheme .color.yellowAccent,
7287 modifier =
7388 Modifier
74- .size(starSize)
75- .weight(1f )
89+ .size(newStarSize)
7690 .graphicsLayer(translationY = translateY.value)
7791 .clickable(
7892 onClick = { onRatingStarChanged(starIndex) },
0 commit comments