Button.jsx

 1import Link from 'next/link'
 2import clsx from 'clsx'
 3
 4function ArrowIcon(props) {
 5  return (
 6    <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" {...props}>
 7      <path
 8        stroke="currentColor"
 9        strokeLinecap="round"
10        strokeLinejoin="round"
11        d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"
12      />
13    </svg>
14  )
15}
16
17const variantStyles = {
18  primary:
19    'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-emerald-400/10 dark:text-emerald-400 dark:ring-1 dark:ring-inset dark:ring-emerald-400/20 dark:hover:bg-emerald-400/10 dark:hover:text-emerald-300 dark:hover:ring-emerald-300',
20  secondary:
21    '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',
22  filled:
23    'rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 dark:bg-emerald-500 dark:text-white dark:hover:bg-emerald-400',
24  outline:
25    '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',
26  text: 'text-emerald-500 hover:text-emerald-600 dark:text-emerald-400 dark:hover:text-emerald-500',
27}
28
29export function Button({
30  variant = 'primary',
31  className,
32  children,
33  arrow,
34  ...props
35}) {
36  let Component = props.href ? Link : 'button'
37
38  className = clsx(
39    'inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition',
40    variantStyles[variant],
41    className
42  )
43
44  let arrowIcon = (
45    <ArrowIcon
46      className={clsx(
47        'mt-0.5 h-5 w-5',
48        variant === 'text' && 'relative top-px',
49        arrow === 'left' && '-ml-1 rotate-180',
50        arrow === 'right' && '-mr-1'
51      )}
52    />
53  )
54
55  return (
56    <Component className={className} {...props}>
57      {arrow === 'left' && arrowIcon}
58      {children}
59      {arrow === 'right' && arrowIcon}
60    </Component>
61  )
62}