From c257c00a62fde2409650ad0ba42710c057cbb2f2 Mon Sep 17 00:00:00 2001 From: Dev Jaja Date: Fri, 3 Oct 2025 09:20:49 -0400 Subject: [PATCH] feat: Create a Reusable Button Component --- frontend/components/ui/Button.tsx | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 frontend/components/ui/Button.tsx diff --git a/frontend/components/ui/Button.tsx b/frontend/components/ui/Button.tsx new file mode 100644 index 000000000..0cc01eec7 --- /dev/null +++ b/frontend/components/ui/Button.tsx @@ -0,0 +1,44 @@ +'use client' +import React from 'react'; + +interface ButtonProps extends React.ButtonHTMLAttributes { + variant?: 'primary' | 'secondary'; + size?: 'sm' | 'md' | 'lg'; + children: React.ReactNode; +} + +const Button: React.FC = ({ + variant = 'primary', + size = 'md', + disabled = false, + children, + className = '', + ...props +}) => { + const baseStyles = 'font-medium rounded-lg transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'; + + const variantStyles = { + primary: 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500 disabled:hover:bg-blue-600', + secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500 disabled:hover:bg-gray-200', + }; + + const sizeStyles = { + sm: 'px-3 py-1.5 text-sm', + md: 'px-4 py-2 text-base', + lg: 'px-6 py-3 text-lg', + }; + + const classes = `${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${className}`.trim(); + + return ( + + ); +}; + +export default Button; \ No newline at end of file