import { cva } from 'class-variance-authority'; import { cn } from '#/lib/utils.js'; const buttonVariants = cva( "inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-xl text-sm font-semibold whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", { variants: { variant: { default: 'bg-primary text-primary-foreground hover:bg-primary/90', destructive: 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40', outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', ghost: 'hover:bg-accent hover:text-accent-foreground', link: 'text-primary underline-offset-4 hover:underline', // A card-shaped button: the surface and hover of a tile, with layout // (direction, padding) left to the caller. tile: 'w-full rounded-2xl border border-border bg-muted text-left hover:border-input hover:bg-accent', // A full-width dashed affordance, e.g. "add a passkey". dashed: 'w-full rounded-2xl border border-border border-dashed bg-transparent text-faint hover:border-ring hover:text-key', }, size: { default: 'h-9 px-4 py-2 has-[>svg]:px-3', xs: "h-6 gap-1 px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3", sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5', lg: 'h-10 px-6 has-[>svg]:px-4', // A prominent header/action pill. pill: 'h-11 px-5 text-[13px] font-extrabold', // A full-width block CTA, the same height as an input. block: 'h-11 w-full', // A free-height surface sized by its own padding (tiles, dashed). surface: 'h-auto', icon: 'size-9', 'icon-xs': "size-6 [&_svg:not([class*='size-'])]:size-3", 'icon-sm': 'size-8', 'icon-lg': 'size-10', }, }, defaultVariants: { variant: 'default', size: 'default', }, }, ); function Button({ className, variant = 'default', size = 'default', type = 'button', ...props }) { return (