Document_Query / components /Button.tsx
Reubencf's picture
Deploy Next.js Query Bot as Docker Space
ff0e173
Raw
History Blame Contribute Delete
1.56 kB
import * as React from 'react';
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
size?: 'sm' | 'md' | 'lg' | 'icon';
}
export default function Button({
children,
className = '',
variant = 'primary',
size = 'md',
type = 'button',
...props
}: ButtonProps) {
// Styles for different variants
const baseStyle = 'inline-flex items-center justify-center font-medium transition-all duration-200 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-neutral-900 disabled:opacity-50 disabled:pointer-events-none active:scale-[0.98] cursor-pointer';
const variants = {
primary: 'bg-neutral-900 text-white hover:bg-neutral-800 border border-neutral-900 shadow-sm',
secondary: 'bg-neutral-100 text-neutral-800 hover:bg-neutral-200 border border-transparent',
outline: 'bg-white border border-neutral-200 text-neutral-700 hover:bg-neutral-50 hover:border-neutral-300',
ghost: 'text-neutral-600 hover:bg-neutral-100 hover:text-neutral-900 border border-transparent',
danger: 'bg-red-50 text-red-600 border border-red-200 hover:bg-red-100 active:bg-red-200',
};
const sizes = {
sm: 'px-3 py-1.5 text-xs font-semibold',
md: 'px-4 py-2.5 text-sm',
lg: 'px-6 py-3.5 text-base',
icon: 'p-2',
};
return (
<button
type={type}
className={`${baseStyle} ${variants[variant]} ${sizes[size]} ${className}`}
{...props}
>
{children}
</button>
);
}