import Link from "next/link";
import { ReactNode } from "react";
interface ButtonProps {
href?: string;
onClick?: () => void;
children: ReactNode;
variant?: "primary" | "secondary" | "ghost" | "outline";
size?: "sm" | "md" | "lg";
className?: string;
external?: boolean;
type?: "button" | "submit";
disabled?: boolean;
}
export default function Button({
href,
onClick,
children,
variant = "primary",
size = "md",
className = "",
external = false,
type = "button",
disabled = false,
}: ButtonProps) {
const baseStyles =
"relative inline-flex items-center justify-center font-medium rounded-lg transition-all duration-300 overflow-hidden group";
const sizeStyles = {
sm: "px-4 py-2 text-sm",
md: "px-6 py-3 text-base",
lg: "px-8 py-4 text-lg",
};
const variantStyles = {
primary:
"bg-gradient-to-r from-red-600 to-red-500 text-white hover:from-red-700 hover:to-red-600 hover:shadow-lg hover:shadow-red-500/25 hover:-translate-y-0.5 active:translate-y-0",
secondary:
"bg-white text-zinc-900 border border-zinc-200 hover:border-zinc-300 hover:bg-zinc-50 hover:shadow-lg hover:-translate-y-0.5 active:translate-y-0",
ghost:
"text-red-600 hover:bg-red-50 hover:text-red-700",
outline:
"border-2 border-red-600 text-red-600 hover:bg-red-600 hover:text-white hover:shadow-lg hover:shadow-red-500/25 hover:-translate-y-0.5 active:translate-y-0",
};
const disabledStyles = "opacity-50 cursor-not-allowed hover:transform-none hover:shadow-none";
const combinedClassName = `${baseStyles} ${sizeStyles[size]} ${variantStyles[variant]} ${disabled ? disabledStyles : ""} ${className}`;
// Shimmer effect overlay
const shimmer = variant === "primary" && (
);
if (href) {
if (external) {
return (
{shimmer}
{children}
);
}
return (
{shimmer}
{children}
);
}
return (
);
}