in hot-reload-devtools/src/main/kotlin/org/jetbrains/compose/devtools/widgets/DtStatusColor.kt [90:136]
fun animatedReloadStatusBrush(
okColor: Color = DtColors.statusColorOk,
errorColor: Color = DtColors.statusColorError,
idleColor: Color = Color.LightGray,
resetErrorState: Boolean = false,
): Brush {
val state = ReloadUIState.composeValue()
var isIdle by remember { mutableStateOf(true) }
LaunchedEffect(state) {
if (state is ReloadUIState.Ok || state is ReloadUIState.Failed) {
delay(1.seconds)
isIdle = true
} else {
isIdle = false
}
}
val movingColorA by animateColorAsState(
when (state) {
is ReloadUIState.Ok -> if (isIdle) idleColor else okColor
is ReloadUIState.Failed -> if (isIdle && resetErrorState) idleColor else errorColor
is ReloadUIState.Reloading -> DtColors.statusColorOrange1
}
)
val movingColorB by animateColorAsState(
when (state) {
is ReloadUIState.Ok -> if (isIdle) idleColor else okColor
is ReloadUIState.Failed -> if (isIdle && resetErrorState) idleColor else errorColor
is ReloadUIState.Reloading -> DtColors.statusColorOrange2
}
)
val movingTransition = rememberInfiniteTransition()
val movingGradientShift by movingTransition.animateFloat(
initialValue = 0f,
targetValue = 800f,
animationSpec = infiniteRepeatable(tween(1000, easing = LinearEasing))
)
return Brush.linearGradient(
colors = listOf(movingColorA, movingColorB),
start = Offset(0f, movingGradientShift),
end = Offset(0f, movingGradientShift + 400),
tileMode = TileMode.Mirror,
)
}