Files
grademaxxing/app/components/Button.tsx
2026-01-17 13:37:57 +01:00

41 lines
1.0 KiB
TypeScript

import type { ReactNode } from "react";
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: "primary" | "secondary" | "danger" | "ghost";
size?: "sm" | "md" | "lg";
children: ReactNode;
}
export function Button({
variant = "primary",
size = "md",
className = "",
children,
...props
}: ButtonProps) {
const baseStyles =
"font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed";
const variants = {
primary: "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800",
secondary: "bg-gray-200 text-gray-900 hover:bg-gray-300 active:bg-gray-400",
danger: "bg-red-600 text-white hover:bg-red-700 active:bg-red-800",
ghost: "text-gray-700 hover:bg-gray-100 active:bg-gray-200",
};
const sizes = {
sm: "px-3 py-1.5 text-sm",
md: "px-4 py-2",
lg: "px-6 py-3 text-lg",
};
return (
<button
className={`${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`}
{...props}
>
{children}
</button>
);
}