import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { cva, type VariantProps } from "class-variance-authority" import { cn } from "../../design-lib/utils" import { Icons } from "../organisms/icons" const buttonVariants = cva( "inline-flex h-9 items-center justify-center rounded-sm text-sm font-medium ring-offset-[1px] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-disabled", { variants: { variant: { default: "bg-primary text-primary-foreground shadow-small transition-opacity hover:opacity-80", error: "bg-error text-white shadow-small transition-colors hover:bg-error-hover", outline: `border border-gray-5 bg-background shadow-small transition-colors hover:border-gray-7 hover:bg-secondary focus-visible:ring-transparent`, secondary: "bg-secondary shadow-small hover:bg-gray-5", "outline-error": "border border-input bg-background text-error-foreground shadow-small transition-colors hover:bg-gray-1", ghost: "transition-colors hover:bg-secondary", link: "text-primary underline-offset-4 hover:underline", }, size: { default: "h-9 px-4 py-2", sm: "h-8 px-3 text-xs", lg: "h-10 px-8", icon: "h-9 w-9", }, }, defaultVariants: { variant: "default", size: "default", }, } ) export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean loading?: boolean icon?: React.ReactElement suffix?: React.ReactElement } const Button = React.forwardRef( ( { className, variant, loading, size, icon, suffix, asChild = false, ...props }, ref ) => { const Comp = asChild ? Slot : "button" return ( <> {loading ? ( ) : icon ? (
{icon}
) : null} {props.children} {suffix &&
{suffix}
}
) } ) Button.displayName = "Button" export { Button, buttonVariants }