Files
www_indaba/src/components/button.tsx
2025-06-05 18:15:52 +02:00

47 lines
1.7 KiB
TypeScript

import * as Headless from '@headlessui/react'
import { clsx } from 'clsx'
import { Link } from './link'
const variants = {
primary: clsx(
'inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]',
'rounded-full border border-transparent bg-indigo-500 shadow-md',
'text-base font-medium whitespace-nowrap text-white',
'data-disabled:bg-indigo-500 data-disabled:opacity-40 data-hover:bg-indigo-400',
),
secondary: clsx(
'relative inline-flex items-center justify-center px-4 py-[calc(--spacing(2)-1px)]',
'rounded-full border border-transparent bg-indigo-200/70 shadow-md ring-1 ring-[#D15052]/15',
'after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_0_2px_1px_#ffffff4d]',
'text-base font-medium whitespace-nowrap text-indigo-900',
'data-disabled:bg-indigo-200/70 data-disabled:opacity-40 data-hover:bg-indigo-100/70',
),
outline: clsx(
'inline-flex items-center justify-center px-2 py-[calc(--spacing(1.5)-1px)]',
'rounded-lg border border-transparent shadow-sm ring-1 ring-black/10',
'text-sm font-medium whitespace-nowrap text-gray-950',
'data-disabled:bg-transparent data-disabled:opacity-40 data-hover:bg-gray-50',
),
}
type ButtonProps = {
variant?: keyof typeof variants
} & (
| React.ComponentPropsWithoutRef<typeof Link>
| (Headless.ButtonProps & { href?: undefined })
)
export function Button({
variant = 'primary',
className,
...props
}: ButtonProps) {
className = clsx(className, variants[variant])
if (typeof props.href === 'undefined') {
return <Headless.Button {...props} className={className} />
}
return <Link {...props} className={className} />
}