"use client"; import { motion } from "framer-motion"; import Link from "next/link"; import { ReactNode } from "react"; interface AnimatedButtonProps { href?: string; onClick?: () => void; children: ReactNode; variant?: "primary" | "secondary" | "accent" | "outline"; size?: "sm" | "md" | "lg"; className?: string; external?: boolean; icon?: ReactNode; iconPosition?: "left" | "right"; } export default function AnimatedButton({ href, onClick, children, variant = "primary", size = "md", className = "", external = false, icon, iconPosition = "right", }: AnimatedButtonProps) { const baseStyles = "relative inline-flex items-center justify-center gap-2 font-medium rounded-full overflow-hidden transition-all duration-300 cursor-pointer"; const variants = { primary: "bg-[hsl(0,100%,40%)] text-white hover:bg-[hsl(0,100%,35%)] shadow-lg hover:shadow-xl hover:shadow-[hsl(0,100%,40%)]/25", secondary: "bg-neutral-900 text-white hover:bg-neutral-800 dark:bg-white dark:text-neutral-900 dark:hover:bg-neutral-100", accent: "bg-gradient-to-r from-emerald-600 to-emerald-500 text-white hover:from-emerald-700 hover:to-emerald-600 shadow-lg hover:shadow-xl hover:shadow-emerald-500/25", outline: "bg-transparent border-2 border-neutral-200 text-neutral-900 hover:border-[hsl(0,100%,40%)] hover:text-[hsl(0,100%,40%)] dark:border-neutral-700 dark:text-white dark:hover:border-[hsl(0,100%,50%)] dark:hover:text-[hsl(0,100%,50%)]", }; const sizes = { sm: "px-4 py-2 text-sm", md: "px-6 py-3 text-base", lg: "px-8 py-4 text-lg", }; const buttonContent = ( <> {icon && iconPosition === "left" && ( {icon} )} {children} {icon && iconPosition === "right" && ( {icon} )} ); const motionProps = { whileHover: { scale: 1.02, y: -2 }, whileTap: { scale: 0.98 }, transition: { type: "spring" as const, stiffness: 400, damping: 17 }, }; if (href) { if (external) { return ( {buttonContent} ); } return ( {buttonContent} ); } return ( {buttonContent} ); }