import 'package:flutter/material.dart'; import '../../../theme/app_colors.dart'; /// 주요 액션에 사용되는 Primary 버튼 /// 저장, 추가, 확인 등의 주요 액션에 사용됩니다. class PrimaryButton extends StatefulWidget { final String text; final VoidCallback? onPressed; final bool isLoading; final IconData? icon; final double? width; final double height; final Color? backgroundColor; final Color? foregroundColor; final double fontSize; final EdgeInsetsGeometry? padding; final double borderRadius; final bool enableHoverEffect; const PrimaryButton({ super.key, required this.text, this.onPressed, this.isLoading = false, this.icon, this.width, this.height = 60, this.backgroundColor, this.foregroundColor, this.fontSize = 18, this.padding, this.borderRadius = 16, this.enableHoverEffect = true, }); @override State createState() => _PrimaryButtonState(); } class _PrimaryButtonState extends State { bool _isHovered = false; @override Widget build(BuildContext context) { final theme = Theme.of(context); final effectiveBackgroundColor = widget.backgroundColor ?? theme.primaryColor; final effectiveForegroundColor = widget.foregroundColor ?? AppColors.pureWhite; Widget button = AnimatedContainer( duration: const Duration(milliseconds: 200), width: widget.width ?? double.infinity, height: widget.height, transform: widget.enableHoverEffect && _isHovered ? (Matrix4.identity()..scale(1.02)) : Matrix4.identity(), child: ElevatedButton( onPressed: widget.isLoading ? null : widget.onPressed, style: ElevatedButton.styleFrom( backgroundColor: effectiveBackgroundColor, foregroundColor: effectiveForegroundColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(widget.borderRadius), ), padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 16), elevation: widget.enableHoverEffect && _isHovered ? 2 : 0, shadowColor: Colors.black.withValues(alpha: 0.08), disabledBackgroundColor: effectiveBackgroundColor.withValues(alpha: 0.6), ), child: widget.isLoading ? SizedBox( width: 24, height: 24, child: CircularProgressIndicator( strokeWidth: 2.5, color: effectiveForegroundColor, ), ) : Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ if (widget.icon != null) ...[ Icon( widget.icon, color: effectiveForegroundColor, size: _isHovered ? 24 : 20, ), const SizedBox(width: 8), ], Text( widget.text, style: TextStyle( fontSize: widget.fontSize, fontWeight: FontWeight.w600, color: effectiveForegroundColor, ), ), ], ), ), ); if (widget.enableHoverEffect) { return MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), child: button, ); } return button; } }