package com.craigvg.lichun_android.ui.components.effects import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import kotlinx.coroutines.delay import kotlin.random.Random private data class Particle( var x: Float, var y: Float, val radius: Float, val color: Color, val speed: Float, val drift: Float ) @Composable fun SeasonalParticles( season: String, modifier: Modifier = Modifier, particleCount: Int = 30 ) { val colors = when (season.lowercase()) { "spring" -> listOf(Color(0xFFFFB6C8), Color(0xFFF4A5B5), Color(0xFFFFD6E0)) "summer" -> listOf(Color(0xFFFFE07A), Color(0xFFFFD89B), Color(0xFFFFF3C4)) "autumn", "fall" -> listOf(Color(0xFFE8A862), Color(0xFFCC7A3A), Color(0xFFD4956B)) "winter" -> listOf(Color(0xFFFFFFFF), Color(0xFFE3F2FD), Color(0xFFDAEAF5)) else -> listOf(Color(0xFFF4A5B5)) } val tick = remember { mutableStateOf(0L) } val particles = remember(season) { List(particleCount) { Particle( x = Random.nextFloat(), y = Random.nextFloat(), radius = Random.nextFloat() * 3f + 2f, color = colors.random(), speed = Random.nextFloat() * 0.003f + 0.001f, drift = (Random.nextFloat() - 0.5f) * 0.002f ) } } LaunchedEffect(season) { while (true) { delay(32L) particles.forEach { p -> p.y += p.speed p.x += p.drift if (p.y > 1.1f) { p.y = -0.05f p.x = Random.nextFloat() } if (p.x < -0.05f) p.x = 1.05f if (p.x > 1.05f) p.x = -0.05f } tick.value++ } } Canvas(modifier = modifier.fillMaxSize()) { val w = size.width val h = size.height // Read tick to trigger recomposition tick.value particles.forEach { p -> drawCircle( color = p.color, radius = p.radius * density, center = Offset(p.x * w, p.y * h), alpha = 0.7f ) } } }