CytoSight / src /components /MedicalButton.tsx
Kaifulimaan's picture
Deployment without binary files
894fa47
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;