updateRipples method
Prunes completed ripples.
Optionally accepts now to reuse a single timestamp across multiple calls.
Implementation
void updateRipples([int? now]) {
final current = now ?? DateTime.now().millisecondsSinceEpoch;
_ripples.removeWhere((r) => current - r.startTime > r.durationMs);
}