| import { cn } from "@/lib/utils"; |
| import { forwardRef } from "react"; |
| import { Loader2 } from "lucide-react"; |
|
|
| interface MedicalButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { |
| variant?: "primary" | "secondary" | "danger" | "outline" | "ghost"; |
| size?: "sm" | "md" | "lg" | "xl"; |
| isLoading?: boolean; |
| fullWidth?: boolean; |
| } |
|
|
| const MedicalButton = forwardRef<HTMLButtonElement, MedicalButtonProps>( |
| ({ |
| className, |
| variant = "primary", |
| size = "md", |
| isLoading = false, |
| fullWidth = false, |
| disabled, |
| children, |
| ...props |
| }, ref) => { |
| const sizeClasses = { |
| sm: "px-4 py-2 text-sm", |
| md: "px-6 py-3 text-base", |
| lg: "px-8 py-4 text-lg", |
| xl: "px-10 py-5 text-xl", |
| }; |
|
|
| const variantClasses = { |
| primary: "btn-primary-glow", |
| secondary: "btn-secondary-glow", |
| danger: "btn-danger-glow", |
| outline: "bg-transparent border-2 border-primary text-primary hover:bg-primary/10 transition-all duration-300", |
| ghost: "bg-transparent text-foreground hover:bg-muted transition-all duration-300", |
| }; |
|
|
| return ( |
| <button |
| ref={ref} |
| disabled={disabled || isLoading} |
| className={cn( |
| "rounded-xl font-semibold focus:outline-none focus:ring-2 focus:ring-primary/50 disabled:opacity-50 disabled:cursor-not-allowed disabled:transform-none", |
| variantClasses[variant], |
| sizeClasses[size], |
| fullWidth && "w-full", |
| className |
| )} |
| {...props} |
| > |
| {isLoading ? ( |
| <span className="flex items-center justify-center gap-2"> |
| <Loader2 className="w-5 h-5 animate-spin" /> |
| <span>Loading...</span> |
| </span> |
| ) : ( |
| children |
| )} |
| </button> |
| ); |
| } |
| ); |
|
|
| MedicalButton.displayName = "MedicalButton"; |
|
|
| export default MedicalButton; |
|
|