import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../core/theme_manager.dart'; // Import aggiornato import 'dart:math' as math; class AnimatedCyberBorder extends StatefulWidget { final Widget child; const AnimatedCyberBorder({super.key, required this.child}); @override State createState() => _AnimatedCyberBorderState(); } class _AnimatedCyberBorderState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; @override void initState() { super.initState(); _controller = AnimationController(vsync: this, duration: const Duration(seconds: 3))..repeat(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final theme = context.watch().currentColors; return AnimatedBuilder( animation: _controller, builder: (context, child) { return CustomPaint( painter: CyberBorderPainter(animationValue: _controller.value, color1: theme.playerBlue, color2: theme.playerRed), child: Container( decoration: BoxDecoration(color: theme.background.withOpacity(0.9), borderRadius: BorderRadius.circular(15), boxShadow: [BoxShadow(color: theme.playerBlue.withOpacity(0.3), blurRadius: 25, spreadRadius: 2)]), padding: const EdgeInsets.all(3), child: widget.child, ), ); }, child: widget.child, ); } } class CyberBorderPainter extends CustomPainter { final double animationValue; final Color color1; final Color color2; CyberBorderPainter({required this.animationValue, required this.color1, required this.color2}); @override void paint(Canvas canvas, Size size) { final rect = Offset.zero & size; final RRect rrect = RRect.fromRectAndRadius(rect, const Radius.circular(15)); final Paint paint = Paint() ..shader = SweepGradient(colors: [color1, color2, color1, color2, color1], stops: const [0.0, 0.25, 0.5, 0.75, 1.0], transform: GradientRotation(animationValue * 2 * math.pi)).createShader(rect) ..style = PaintingStyle.stroke ..strokeWidth = 4.0 ..maskFilter = const MaskFilter.blur(BlurStyle.solid, 4); canvas.drawRRect(rrect, paint); } @override bool shouldRepaint(covariant CyberBorderPainter oldDelegate) => oldDelegate.animationValue != animationValue; }