import 'package:flutter/material.dart'; import '../models/delivery_route.dart'; import '../theme/animation_system.dart'; import '../theme/color_system.dart'; class PremiumRouteCard extends StatefulWidget { final DeliveryRoute route; final VoidCallback onTap; final EdgeInsets padding; const PremiumRouteCard({ super.key, required this.route, required this.onTap, this.padding = const EdgeInsets.all(16.0), }); @override State createState() => _PremiumRouteCardState(); } class _PremiumRouteCardState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _scaleAnimation; late Animation _shadowAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: AppAnimations.durationFast, vsync: this, ); _scaleAnimation = Tween(begin: 1.0, end: 1.02).animate( CurvedAnimation(parent: _controller, curve: Curves.easeOut), ); _shadowAnimation = Tween(begin: 2.0, end: 8.0).animate( CurvedAnimation(parent: _controller, curve: Curves.easeOut), ); } @override void dispose() { _controller.dispose(); super.dispose(); } void _onHoverEnter() { _controller.forward(); } void _onHoverExit() { _controller.reverse(); } @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final progressPercentage = (widget.route.progress * 100).toStringAsFixed(0); final isCompleted = widget.route.progress >= 1.0; final accentColor = isCompleted ? SvrntyColors.statusCompleted : SvrntyColors.crimsonRed; return MouseRegion( onEnter: (_) => _onHoverEnter(), onExit: (_) => _onHoverExit(), child: GestureDetector( onTap: widget.onTap, child: ScaleTransition( scale: _scaleAnimation, child: AnimatedBuilder( animation: _shadowAnimation, builder: (context, child) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: isDark ? 0.3 : 0.1), blurRadius: _shadowAnimation.value, offset: Offset(0, _shadowAnimation.value * 0.5), ), ], ), child: child, ); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: Theme.of(context).colorScheme.surface, border: Border( left: BorderSide(color: accentColor, width: 4), ), ), padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ // Header Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.route.name, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.w600, letterSpacing: -0.3, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 8), RichText( text: TextSpan( children: [ TextSpan( text: '${widget.route.deliveredCount}/${widget.route.deliveriesCount}', style: Theme.of(context).textTheme.bodySmall?.copyWith( fontWeight: FontWeight.w600, color: accentColor, ), ), TextSpan( text: ' completed', style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).textTheme.bodySmall?.color, ), ), ], ), ), ], ), ), const SizedBox(width: 12), Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: SvrntyColors.crimsonRed, borderRadius: BorderRadius.circular(6), ), child: Text( widget.route.deliveriesCount.toString(), style: Theme.of(context).textTheme.labelSmall?.copyWith( color: Colors.white, fontWeight: FontWeight.w600, ), ), ), ], ), // Progress Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '$progressPercentage% progress', style: Theme.of(context).textTheme.labelSmall?.copyWith( fontSize: 11, letterSpacing: 0.3, ), ), const SizedBox(height: 8), ClipRRect( borderRadius: BorderRadius.circular(4), child: SizedBox( height: 6, child: LinearProgressIndicator( value: widget.route.progress, backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest, valueColor: AlwaysStoppedAnimation(accentColor), ), ), ), ], ), ], ), ), ), ), ), ); } }