import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:math' as math; import 'glassmorphism_card.dart'; import 'themed_text.dart'; import '../theme/app_colors.dart'; import '../l10n/app_localizations.dart'; import '../utils/reduce_motion.dart'; /// 구독이 없을 때 표시되는 빈 화면 위젯 /// /// 애니메이션 효과와 함께 사용자에게 구독 추가를 유도합니다. class EmptyStateWidget extends StatelessWidget { final AnimationController fadeController; final AnimationController rotateController; final AnimationController slideController; final VoidCallback onAddPressed; const EmptyStateWidget({ Key? key, required this.fadeController, required this.rotateController, required this.slideController, required this.onAddPressed, }) : super(key: key); @override Widget build(BuildContext context) { final beginOffset = ReduceMotion.isEnabled(context) ? const Offset(0, 0.05) : const Offset(0, 0.2); return FadeTransition( opacity: Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation(parent: fadeController, curve: Curves.easeIn)), child: Center( child: SlideTransition( position: Tween( begin: beginOffset, end: Offset.zero, ).animate(CurvedAnimation( parent: slideController, curve: Curves.easeOutBack)), child: RepaintBoundary( child: GlassmorphismCard( width: null, margin: const EdgeInsets.all(16), padding: const EdgeInsets.all(32), child: Column( mainAxisSize: MainAxisSize.min, children: [ AnimatedBuilder( animation: rotateController, builder: (context, child) { final angleScale = ReduceMotion.isEnabled(context) ? 0.2 : 1.0; return Transform.rotate( angle: angleScale * rotateController.value * 2 * math.pi, child: Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( gradient: const LinearGradient( colors: AppColors.blueGradient, begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: AppColors.primaryColor .withValues(alpha: 0.3), spreadRadius: 0, blurRadius: 16, offset: const Offset(0, 8), ), ], ), child: const Icon( Icons.subscriptions_outlined, size: 48, color: AppColors.pureWhite, ), ), ); }, ), const SizedBox(height: 32), ThemedText( AppLocalizations.of(context).noSubscriptions, fontSize: 22, fontWeight: FontWeight.w800, letterSpacing: -0.5, ), const SizedBox(height: 8), ThemedText( AppLocalizations.of(context).addSubscriptionNow, fontSize: 16, opacity: 0.7, ), const SizedBox(height: 32), MouseRegion( onEnter: (_) => {}, onExit: (_) => {}, child: ElevatedButton( style: ElevatedButton.styleFrom( foregroundColor: Colors.white, padding: const EdgeInsets.symmetric( horizontal: 32, vertical: 16, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), elevation: 4, backgroundColor: AppColors.primaryColor, ), onPressed: () { HapticFeedback.mediumImpact(); onAddPressed(); }, child: Text( AppLocalizations.of(context).addSubscription, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, letterSpacing: 0.5, color: AppColors.pureWhite, ), ), ), ), ], ), ), ), ), ), ); } }