import clsx from 'clsx'
import Link from 'next/link'
function ArrowIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
return (
)
}
const variantStyles = {
primary:
'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-blue-400/10 dark:text-blue-400 dark:ring-1 dark:ring-inset dark:ring-blue-400/20 dark:hover:bg-blue-400/10 dark:hover:text-blue-300 dark:hover:ring-blue-300',
secondary:
'rounded-full bg-zinc-100 py-1 px-3 text-zinc-900 hover:bg-zinc-200 dark:bg-zinc-800/40 dark:text-zinc-400 dark:ring-1 dark:ring-inset dark:ring-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-300',
filled:
'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-blue-500 dark:text-white dark:hover:bg-blue-400',
outline:
'rounded-full py-1 px-3 text-zinc-700 ring-1 ring-inset ring-zinc-900/10 hover:bg-zinc-900/2.5 hover:text-zinc-900 dark:text-zinc-400 dark:ring-white/10 dark:hover:bg-white/5 dark:hover:text-white',
text: 'text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-500',
}
type ButtonProps = {
variant?: keyof typeof variantStyles
arrow?: 'left' | 'right'
} & (
| React.ComponentPropsWithoutRef
| (React.ComponentPropsWithoutRef<'button'> & { href?: undefined })
)
export function Button({
variant = 'primary',
className,
children,
arrow,
...props
}: ButtonProps) {
className = clsx(
'inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition',
variantStyles[variant],
className,
)
let arrowIcon = (
)
let inner = (
<>
{arrow === 'left' && arrowIcon}
{children}
{arrow === 'right' && arrowIcon}
>
)
if (typeof props.href === 'undefined') {
return (
)
}
return (
{inner}
)
}