From bb211b5dc0517b9f57a03f2b3bbfd078b05fc74c Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 04:20:35 -0400 Subject: [PATCH 1/8] add progress indicator --- .../main/graphql/queries/UserQuery.graphql | 1 + .../api/anilist/sanitize/media/Media.kt | 3 + .../api/anilist/sanitize/profile/Viewer.kt | 1 + .../animite/profile/ui/MediaTrackingList.kt | 57 ++++++++++++++----- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/api/anilist/src/main/graphql/queries/UserQuery.graphql b/api/anilist/src/main/graphql/queries/UserQuery.graphql index 22735575..bd9e3e1b 100644 --- a/api/anilist/src/main/graphql/queries/UserQuery.graphql +++ b/api/anilist/src/main/graphql/queries/UserQuery.graphql @@ -27,6 +27,7 @@ query UserMediaListQuery($userId: Int, $type: MediaType) { lists { name entries { + progress score(format: POINT_10_DECIMAL) media { ...MediaTracking diff --git a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt index 858ce0e5..ca7e4b60 100644 --- a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt +++ b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt @@ -726,10 +726,12 @@ data class Media( val seasonYear: Int?, val format: Format?, val episodes: Int?, + val progress: Int?, val score: Score?, ) { internal constructor( query: MediaTracking, + progress: Int?, score: Float?, language: Language ) : this( @@ -745,6 +747,7 @@ data class Media( seasonYear = query.seasonYear, format = query.format?.sanitize(), episodes = query.episodes, + progress = progress, score = score?.let { Score(it) } ) } diff --git a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/profile/Viewer.kt b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/profile/Viewer.kt index 6d4a3b1d..7a8b193a 100644 --- a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/profile/Viewer.kt +++ b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/profile/Viewer.kt @@ -101,6 +101,7 @@ data class User( list = query.entries.orEmpty().mapNotNull { Media.Tracking( query = it?.media?.mediaTracking ?: return@mapNotNull null, + progress = it.progress, score = it.score?.toFloat(), language = language ) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index d33f5d78..a690a38d 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -24,6 +25,8 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Check import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.material3.MaterialShapes import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -141,6 +144,7 @@ fun MediaTrackingLists( .background(MaterialTheme.colorScheme.background) ) MediaTrackingItem( + listName = namedList.name.sanitize(), item = namedList.list[it], onClick = { id, title -> onNavigateToMediaItem( @@ -352,6 +356,7 @@ private fun HeaderPill( @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable private fun MediaTrackingItem( + listName: User.ListNames, item: Media.Tracking, onClick: (Int, String?) -> Unit, modifier: Modifier = Modifier @@ -367,10 +372,13 @@ private fun MediaTrackingItem( ) Column( - Modifier.padding( - horizontal = LocalPaddings.current.large / 2, - vertical = LocalPaddings.current.small - ) + verticalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxHeight() + .padding( + horizontal = LocalPaddings.current.large / 2, + vertical = LocalPaddings.current.small + ) ) { Text( text = item.title.orEmpty(), @@ -379,8 +387,8 @@ private fun MediaTrackingItem( maxLines = 1 ) - Spacer(Modifier.size(LocalPaddings.current.medium)) - + val episodes = item.episodes + val progress = item.progress Row(verticalAlignment = Alignment.CenterVertically) { item.format?.let { Text( @@ -406,17 +414,22 @@ private fun MediaTrackingItem( ) } - if (item.episodes != null && item.season != null) { + if (episodes != null && item.season != null) { Divider(shape = MaterialShapes.Triangle.toShape()) } - item.episodes?.let { + episodes?.let { Text( - text = pluralStringResource( - id = R.plurals.ep_count, - count = it, - formatArgs = arrayOf(it) - ), + text = progress + ?.takeUnless { listName == User.ListNames.COMPLETED } + ?.let { completed -> "$completed/" } + .orEmpty() + .plus( + pluralStringResource( + id = R.plurals.ep_count, + count = it, + formatArgs = arrayOf(it)) + ), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.labelSmall, maxLines = 1, @@ -424,6 +437,24 @@ private fun MediaTrackingItem( ) } } + + if (episodes != null && progress != null) { + when(listName) { + User.ListNames.WATCHING, + User.ListNames.REWATCHING, + User.ListNames.READING, + User.ListNames.REREADING -> { + LinearWavyProgressIndicator( + progress = { progress.toFloat() / episodes }, + amplitude = { progress -> + if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f + } + ) + } + else -> LinearProgressIndicator(progress = { progress.toFloat() / episodes }) + } + + } } } From db7057fe0c1520fc85c18a656026d4fd00c680b2 Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 13:05:19 -0400 Subject: [PATCH 2/8] adjust width and alpha --- .../imashnake/animite/profile/ui/MediaTrackingList.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index a690a38d..970a867e 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -42,6 +42,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion.ToggleOff @@ -448,10 +449,14 @@ private fun MediaTrackingItem( progress = { progress.toFloat() / episodes }, amplitude = { progress -> if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f - } + }, + modifier = Modifier.fillMaxWidth().graphicsLayer { alpha = 0.5f } ) } - else -> LinearProgressIndicator(progress = { progress.toFloat() / episodes }) + else -> LinearProgressIndicator( + progress = { progress.toFloat() / episodes }, + modifier = Modifier.fillMaxWidth().graphicsLayer { alpha = 0.5f } + ) } } From 480f7362db33f112143351ba78e2bc80a915b856 Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 13:49:17 -0400 Subject: [PATCH 3/8] update ui --- .../animite/profile/ui/MediaTrackingList.kt | 131 +++++++++--------- 1 file changed, 68 insertions(+), 63 deletions(-) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index 970a867e..cf6dd470 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -377,88 +377,93 @@ private fun MediaTrackingItem( modifier = Modifier .fillMaxHeight() .padding( - horizontal = LocalPaddings.current.large / 2, - vertical = LocalPaddings.current.small + start = LocalPaddings.current.large / 2, + end = LocalPaddings.current.large / 2, + top = LocalPaddings.current.small ) ) { - Text( - text = item.title.orEmpty(), - color = MaterialTheme.colorScheme.onBackground, - style = MaterialTheme.typography.bodyMedium, - maxLines = 1 - ) + Column(verticalArrangement = Arrangement.spacedBy(LocalPaddings.current.tiny)) { + Text( + text = item.title.orEmpty(), + color = MaterialTheme.colorScheme.onBackground, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1 + ) - val episodes = item.episodes - val progress = item.progress - Row(verticalAlignment = Alignment.CenterVertically) { - item.format?.let { - Text( - text = stringResource(it.res), - color = MaterialTheme.colorScheme.onSurfaceVariant, - style = MaterialTheme.typography.labelSmall, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } + Row(verticalAlignment = Alignment.CenterVertically) { + item.format?.let { + Text( + text = stringResource(it.res), + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.labelSmall, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } - if (item.season != null && item.format != null) { - Divider(shape = MaterialShapes.Triangle.toShape()) - } + if (item.season != null && item.format != null) { + Divider(shape = MaterialShapes.Triangle.toShape()) + } - item.season?.let { - Text( - text = stringResource(it.res) + - " ${item.seasonYear?.toString().orEmpty()}", - color = MaterialTheme.colorScheme.onSurfaceVariant, - style = MaterialTheme.typography.labelSmall, - maxLines = 1 - ) + item.season?.let { + Text( + text = stringResource(it.res) + + " ${item.seasonYear?.toString().orEmpty()}", + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.labelSmall, + maxLines = 1 + ) + } } + } - if (episodes != null && item.season != null) { - Divider(shape = MaterialShapes.Triangle.toShape()) - } + val episodes = item.episodes + val progress = item.progress + + if (episodes != null && progress != null) { + val formattedProgress = progress + .takeUnless { listName == User.ListNames.COMPLETED } + ?.let { "$it/" } + .orEmpty() - episodes?.let { + Row( + horizontalArrangement = Arrangement.spacedBy(LocalPaddings.current.small), + verticalAlignment = Alignment.CenterVertically + ) { Text( - text = progress - ?.takeUnless { listName == User.ListNames.COMPLETED } - ?.let { completed -> "$completed/" } - .orEmpty() - .plus( - pluralStringResource( - id = R.plurals.ep_count, - count = it, - formatArgs = arrayOf(it)) - ), - color = MaterialTheme.colorScheme.onSurfaceVariant, + text = formattedProgress + pluralStringResource( + id = R.plurals.ep_count, + count = episodes, + formatArgs = arrayOf(episodes) + ), + color = MaterialTheme.colorScheme.primary.copy(alpha = 0.7f), style = MaterialTheme.typography.labelSmall, maxLines = 1, overflow = TextOverflow.Ellipsis ) - } - } - if (episodes != null && progress != null) { - when(listName) { - User.ListNames.WATCHING, - User.ListNames.REWATCHING, - User.ListNames.READING, - User.ListNames.REREADING -> { - LinearWavyProgressIndicator( + when (listName) { + User.ListNames.WATCHING, + User.ListNames.REWATCHING, + User.ListNames.READING, + User.ListNames.REREADING -> { + LinearWavyProgressIndicator( + progress = { progress.toFloat() / episodes }, + amplitude = { progress -> + if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f + }, + modifier = Modifier + .fillMaxWidth() + .graphicsLayer { alpha = 0.5f } + ) + } + + else -> LinearProgressIndicator( progress = { progress.toFloat() / episodes }, - amplitude = { progress -> - if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f - }, modifier = Modifier.fillMaxWidth().graphicsLayer { alpha = 0.5f } ) } - else -> LinearProgressIndicator( - progress = { progress.toFloat() / episodes }, - modifier = Modifier.fillMaxWidth().graphicsLayer { alpha = 0.5f } - ) } - } } } From 70c139835f349d49b7406215a4f9d1946238498a Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 13:57:31 -0400 Subject: [PATCH 4/8] slow down wave --- .../kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index cf6dd470..c7e3ebbb 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -452,6 +452,7 @@ private fun MediaTrackingItem( amplitude = { progress -> if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f }, + waveSpeed = 15.dp, modifier = Modifier .fillMaxWidth() .graphicsLayer { alpha = 0.5f } From 92c745dab19c163622d1731f25adbd90def4a392 Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 14:07:32 -0400 Subject: [PATCH 5/8] fallback to next airing episode --- api/anilist/src/main/graphql/fragments/MediaTracking.graphql | 3 +++ .../com/imashnake/animite/api/anilist/sanitize/media/Media.kt | 2 +- .../com/imashnake/animite/profile/ui/MediaTrackingList.kt | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/anilist/src/main/graphql/fragments/MediaTracking.graphql b/api/anilist/src/main/graphql/fragments/MediaTracking.graphql index 681ae742..0c55191b 100644 --- a/api/anilist/src/main/graphql/fragments/MediaTracking.graphql +++ b/api/anilist/src/main/graphql/fragments/MediaTracking.graphql @@ -13,4 +13,7 @@ fragment MediaTracking on Media { seasonYear format episodes + nextAiringEpisode { + episode + } } diff --git a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt index ca7e4b60..9f405fb1 100644 --- a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt +++ b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt @@ -746,7 +746,7 @@ data class Media( season = query.season?.sanitize(), seasonYear = query.seasonYear, format = query.format?.sanitize(), - episodes = query.episodes, + episodes = query.episodes ?: query.nextAiringEpisode?.episode, progress = progress, score = score?.let { Score(it) } ) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index c7e3ebbb..f703af3b 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -450,7 +450,7 @@ private fun MediaTrackingItem( LinearWavyProgressIndicator( progress = { progress.toFloat() / episodes }, amplitude = { progress -> - if (progress <= 0.1f || progress >= 0.95f) 0f else 0.6f + if (progress <= 0.1f || progress >= 0.95f) 0f else 0.5f }, waveSpeed = 15.dp, modifier = Modifier From 2ede8cef28145a0d13ec29d6732653077771a0fb Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 14:13:35 -0400 Subject: [PATCH 6/8] support manga --- api/anilist/src/main/graphql/fragments/MediaTracking.graphql | 1 + .../com/imashnake/animite/api/anilist/sanitize/media/Media.kt | 4 ++-- .../com/imashnake/animite/profile/ui/MediaTrackingList.kt | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/api/anilist/src/main/graphql/fragments/MediaTracking.graphql b/api/anilist/src/main/graphql/fragments/MediaTracking.graphql index 0c55191b..f56e7332 100644 --- a/api/anilist/src/main/graphql/fragments/MediaTracking.graphql +++ b/api/anilist/src/main/graphql/fragments/MediaTracking.graphql @@ -13,6 +13,7 @@ fragment MediaTracking on Media { seasonYear format episodes + chapters nextAiringEpisode { episode } diff --git a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt index 9f405fb1..874cf93a 100644 --- a/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt +++ b/api/anilist/src/main/kotlin/com/imashnake/animite/api/anilist/sanitize/media/Media.kt @@ -725,7 +725,7 @@ data class Media( val season: Season?, val seasonYear: Int?, val format: Format?, - val episodes: Int?, + val segments: Int?, val progress: Int?, val score: Score?, ) { @@ -746,7 +746,7 @@ data class Media( season = query.season?.sanitize(), seasonYear = query.seasonYear, format = query.format?.sanitize(), - episodes = query.episodes ?: query.nextAiringEpisode?.episode, + segments = query.episodes ?: query.nextAiringEpisode?.episode ?: query.chapters, progress = progress, score = score?.let { Score(it) } ) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index f703af3b..e6cba97d 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -417,7 +417,7 @@ private fun MediaTrackingItem( } } - val episodes = item.episodes + val episodes = item.segments val progress = item.progress if (episodes != null && progress != null) { From 47273a08cee526929eed65d2815c4ae1a737f266 Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 14:19:34 -0400 Subject: [PATCH 7/8] remove ep/s for media --- .../imashnake/animite/profile/ui/MediaTrackingList.kt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index e6cba97d..b87236a6 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -49,7 +49,6 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion.ToggleOff import androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion.ToggleOn import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.dimensionResource -import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontWeight @@ -423,19 +422,15 @@ private fun MediaTrackingItem( if (episodes != null && progress != null) { val formattedProgress = progress .takeUnless { listName == User.ListNames.COMPLETED } - ?.let { "$it/" } - .orEmpty() + ?.let { "$it/$episodes" } + ?: "$episodes" Row( horizontalArrangement = Arrangement.spacedBy(LocalPaddings.current.small), verticalAlignment = Alignment.CenterVertically ) { Text( - text = formattedProgress + pluralStringResource( - id = R.plurals.ep_count, - count = episodes, - formatArgs = arrayOf(episodes) - ), + text = formattedProgress, color = MaterialTheme.colorScheme.primary.copy(alpha = 0.7f), style = MaterialTheme.typography.labelSmall, maxLines = 1, From b41114123d7f1ef2877ceb9e5d0f12d1794b0d7e Mon Sep 17 00:00:00 2001 From: imashnake0 Date: Wed, 29 Jul 2026 14:42:53 -0400 Subject: [PATCH 8/8] use segments fallback for manga --- .../animite/profile/ui/MediaTrackingList.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt index b87236a6..bee5b480 100644 --- a/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt +++ b/profile/src/main/kotlin/com/imashnake/animite/profile/ui/MediaTrackingList.kt @@ -416,14 +416,14 @@ private fun MediaTrackingItem( } } - val episodes = item.segments val progress = item.progress + val segments = item.segments ?: if (progress == 0) 1 else progress - if (episodes != null && progress != null) { + if (segments != null && progress != null) { val formattedProgress = progress .takeUnless { listName == User.ListNames.COMPLETED } - ?.let { "$it/$episodes" } - ?: "$episodes" + ?.let { "$it/$segments" } + ?: "$segments" Row( horizontalArrangement = Arrangement.spacedBy(LocalPaddings.current.small), @@ -443,7 +443,7 @@ private fun MediaTrackingItem( User.ListNames.READING, User.ListNames.REREADING -> { LinearWavyProgressIndicator( - progress = { progress.toFloat() / episodes }, + progress = { progress.toFloat() / segments }, amplitude = { progress -> if (progress <= 0.1f || progress >= 0.95f) 0f else 0.5f }, @@ -455,7 +455,7 @@ private fun MediaTrackingItem( } else -> LinearProgressIndicator( - progress = { progress.toFloat() / episodes }, + progress = { progress.toFloat() / segments }, modifier = Modifier.fillMaxWidth().graphicsLayer { alpha = 0.5f } ) }