import { ComponentProps } from "react";
import { ClassNameValue, twJoin } from "tailwind-merge";
import { Link } from "wasp/client/router";
type ButtonSize = "md" | "sm" | "xs";
type ButtonVariant = "primary" | "danger" | "ghost";
interface ButtonProps extends ComponentProps<"button"> {
size?: ButtonSize;
variant?: ButtonVariant;
}
export function Button({
children,
className,
type = "button",
size = "md",
variant = "primary",
...props
}: ButtonProps) {
return (
);
}
type ButtonLinkProps = ComponentProps & {
size?: ButtonSize;
variant?: ButtonVariant;
};
export function ButtonLink({
children,
className,
size = "md",
variant = "primary",
...props
}: ButtonLinkProps) {
return (
{children}
);
}
function getButtonClasses({
size,
variant,
className,
}: {
size: ButtonSize;
variant: ButtonVariant;
className: ClassNameValue;
}): string {
return twJoin(
"rounded-md font-semibold",
variantStyles[variant],
sizeStyles[size],
className,
);
}
const sizeStyles: Record = {
md: "px-4 py-2",
sm: "px-3 py-1.5 text-sm",
xs: "px-2 py-1 text-xs",
};
const variantStyles: Record = {
primary:
"bg-primary-500 hover:bg-primary-400 active:bg-primary-300 text-neutral-800",
danger: "bg-red-600 text-white hover:bg-red-700 active:bg-red-800",
ghost:
"bg-transparent text-neutral-800 hover:bg-neutral-100 active:bg-neutral-200",
};