package com.suno.android.ui.screens.orpheus.components import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.material3.Slider import androidx.compose.material3.SliderDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.suno.android.common_ui.theme.ExtendedTheme import com.suno.android.common_ui.theme.SunoTheme @Composable internal fun OrpheusClipScrubber( percentageComplete: Float, onScrubbed: (percent: Float) -> Unit, modifier: Modifier = Modifier, ) { var sliderPosition by remember { mutableFloatStateOf(percentageComplete) } var isDragging by remember { mutableStateOf(false) } LaunchedEffect(percentageComplete) { if (!isDragging) { sliderPosition = percentageComplete } } val trackBackgroundColor = ExtendedTheme.colors.textSecondary.copy(alpha = 0.3f) val progressColor = ExtendedTheme.colors.aukPink Slider( modifier = modifier.height(48.dp), thumb = {}, track = { Canvas( modifier = Modifier .fillMaxWidth() .height(12.dp), ) { drawLine( color = trackBackgroundColor, start = Offset(0f, size.height / 2), end = Offset(size.width, size.height / 2), strokeWidth = size.height, cap = StrokeCap.Round, ) drawLine( color = progressColor, start = Offset(0f, size.height / 2), end = Offset( size.width * sliderPosition, size.height / 2, ), strokeWidth = size.height, cap = StrokeCap.Round, ) } }, value = sliderPosition, onValueChange = { thePercent -> isDragging = true sliderPosition = thePercent }, onValueChangeFinished = { isDragging = false onScrubbed(sliderPosition) }, colors = SliderDefaults.colors( thumbColor = Color.Transparent, activeTrackColor = Color.Transparent, inactiveTrackColor = Color.Transparent, ), ) } @PreviewLightDark @Composable private fun OrpheusClipScrubberPreview() { SunoTheme { OrpheusClipScrubber( percentageComplete = 0.5f, onScrubbed = {}, modifier = Modifier.fillMaxWidth(), ) } }