anatolian2/components/shared/Button.tsx
Temmuz Aslan 591d878ac6 Initial commit: The Anatolian Edit website
Next.js 14 website with standalone output configured for Docker deployment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:34:25 +03:00

74 lines
1.8 KiB
TypeScript

"use client";
import { motion } from "framer-motion";
import Link from "next/link";
interface ButtonProps {
children: React.ReactNode;
href?: string;
onClick?: () => void;
variant?: "primary" | "secondary" | "coral" | "outline";
size?: "sm" | "md" | "lg";
className?: string;
external?: boolean;
}
const variants = {
primary: "bg-bosphorus text-white hover:bg-bosphorus/90 shadow-lg shadow-bosphorus/25",
secondary: "bg-deep-nazar text-white hover:bg-deep-nazar/90",
coral: "bg-coral-spritz text-white hover:bg-coral-spritz/90 shadow-lg shadow-coral-spritz/25",
outline: "border-2 border-deep-nazar text-deep-nazar hover:bg-deep-nazar hover:text-white",
};
const sizes = {
sm: "px-5 py-2.5 text-sm",
md: "px-7 py-3.5 text-base",
lg: "px-9 py-4 text-lg",
};
export function Button({
children,
href,
onClick,
variant = "primary",
size = "md",
className = "",
external = false,
}: ButtonProps) {
const baseClasses = `inline-flex items-center justify-center font-semibold rounded-full transition-all duration-300 ${variants[variant]} ${sizes[size]} ${className}`;
const motionProps = {
whileHover: { scale: 1.03, y: -1 },
whileTap: { scale: 0.98 },
transition: { type: "spring" as const, stiffness: 400, damping: 17 },
};
if (href) {
if (external) {
return (
<motion.a
href={href}
target="_blank"
rel="noopener noreferrer"
className={baseClasses}
{...motionProps}
>
{children}
</motion.a>
);
}
return (
<Link href={href} className="inline-block">
<motion.span className={baseClasses} {...motionProps}>
{children}
</motion.span>
</Link>
);
}
return (
<motion.button onClick={onClick} className={baseClasses} {...motionProps}>
{children}
</motion.button>
);
}