at main 2.9 kB view raw
1import 'package:flutter/material.dart'; 2 3import '../constants/app_colors.dart'; 4 5enum ButtonVariant { solid, outline, tertiary } 6 7class PrimaryButton extends StatelessWidget { 8 const PrimaryButton({ 9 super.key, 10 required this.title, 11 required this.onPressed, 12 this.variant = ButtonVariant.solid, 13 this.disabled = false, 14 }); 15 final String title; 16 final VoidCallback onPressed; 17 final ButtonVariant variant; 18 final bool disabled; 19 20 @override 21 Widget build(BuildContext context) { 22 return SizedBox( 23 width: MediaQuery.of(context).size.width * 0.75, 24 height: 48, 25 child: ElevatedButton( 26 onPressed: disabled ? null : onPressed, 27 style: ElevatedButton.styleFrom( 28 backgroundColor: _getBackgroundColor(), 29 foregroundColor: _getTextColor(), 30 disabledBackgroundColor: _getBackgroundColor().withValues(alpha: 0.5), 31 disabledForegroundColor: _getTextColor().withValues(alpha: 0.5), 32 overlayColor: _getOverlayColor(), 33 splashFactory: NoSplash.splashFactory, 34 shape: RoundedRectangleBorder( 35 borderRadius: BorderRadius.circular(9999), 36 side: _getBorderSide(), 37 ), 38 elevation: variant == ButtonVariant.solid ? 8 : 0, 39 shadowColor: 40 variant == ButtonVariant.solid 41 ? AppColors.primary.withValues(alpha: 0.4) 42 : Colors.transparent, 43 padding: const EdgeInsets.symmetric(vertical: 12), 44 ), 45 child: Text( 46 title, 47 style: TextStyle( 48 fontSize: variant == ButtonVariant.tertiary ? 14 : 16, 49 fontWeight: 50 variant == ButtonVariant.tertiary 51 ? FontWeight.w500 52 : FontWeight.w600, 53 ), 54 ), 55 ), 56 ); 57 } 58 59 Color _getBackgroundColor() { 60 switch (variant) { 61 case ButtonVariant.solid: 62 return AppColors.primary; 63 case ButtonVariant.outline: 64 return const Color(0xFF5A6B7F).withValues(alpha: 0.1); 65 case ButtonVariant.tertiary: 66 return const Color(0xFF1A1F27); 67 } 68 } 69 70 Color _getTextColor() { 71 switch (variant) { 72 case ButtonVariant.solid: 73 return const Color(0xFF0B0F14); 74 case ButtonVariant.outline: 75 return const Color(0xFFB6C2D2); 76 case ButtonVariant.tertiary: 77 return const Color(0xFF8A96A6); 78 } 79 } 80 81 BorderSide _getBorderSide() { 82 if (variant == ButtonVariant.outline) { 83 return const BorderSide(color: Color(0xFF5A6B7F), width: 2); 84 } 85 return BorderSide.none; 86 } 87 88 Color _getOverlayColor() { 89 switch (variant) { 90 case ButtonVariant.solid: 91 return AppColors.primary.withValues(alpha: 0.2); 92 case ButtonVariant.outline: 93 return const Color(0xFF5A6B7F).withValues(alpha: 0.15); 94 case ButtonVariant.tertiary: 95 return const Color(0xFF2A3441).withValues(alpha: 0.3); 96 } 97 } 98}