Files
sent-shop/components/ui/Button.tsx
2026-01-19 20:21:14 +01:00

74 lines
2.0 KiB
TypeScript

import Link from 'next/link';
import React from 'react';
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'default' | 'outline' | 'primary' | 'secondary' | 'filled' | 'custom';
size?: 'sm' | 'md' | 'lg';
className?: string;
href?: string;
external?: boolean;
fullWidthMobile?: boolean;
fullWidth?: boolean;
}
export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className = '', variant = 'default', size = 'md', children, href, external, fullWidthMobile, fullWidth, ...props }, ref) => {
const variantClasses = {
default: 'bg-white text-black border border-gray-200 hover:bg-gray-100',
outline: 'bg-transparent border border-gray-300 hover:bg-gray-100',
primary: 'bg-primary text-white hover:bg-primary-dark',
secondary: 'bg-blue-600 text-white hover:bg-blue-700',
filled: 'bg-primary text-white hover:bg-primary-dark',
custom: 'bg-[#f8dbe3] text-primary hover:bg-primary hover:text-white border-0',
};
const sizeClasses = {
sm: 'px-3 py-1.5 text-sm',
md: 'px-4 py-2',
lg: 'px-[24px] py-[12px] text-lg',
};
const widthClass = fullWidth
? 'w-full'
: fullWidthMobile
? 'w-full md:w-auto'
: '';
const buttonClasses = `
${variantClasses[variant]}
${sizeClasses[size]}
${widthClass}
${className}
rounded-button font-bold transition-colors focus:outline-none inline-flex justify-center items-center
`;
if (href) {
const linkProps = external ? {
target: "_blank",
rel: "noopener noreferrer"
} : {};
return (
<Link
href={href}
{...linkProps}
className={buttonClasses}
>
{children}
</Link>
);
}
return (
<button
ref={ref}
className={buttonClasses}
{...props}
>
{children}
</button>
);
}
);
Button.displayName = 'Button';