Main coves client
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}