{"version":3,"sources":["../components/ui/button.tsx"],"sourcesContent":["\"use client\";\nimport * as React from 'react';\nimport { Slot } from 'radix-ui';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/ui';\nimport { Spinner } from './spinner';\n\nconst buttonVariants = cva(\n  [\n    \"[&_svg:not([class*='size-'])]:size-4\",\n    '[&_svg]:pointer-events-none',\n    '[&_svg]:shrink-0',\n    'active:translate-y-px',\n    'aria-invalid:border-destructive',\n    'aria-invalid:ring-3',\n    'aria-invalid:ring-destructive/20',\n    'bg-clip-padding',\n    'border-transparent',\n    'dark:aria-invalid:border-destructive/50',\n    'dark:aria-invalid:ring-destructive/40',\n    'disabled:opacity-50',\n    'disabled:pointer-events-none',\n    'cursor-pointer',\n    'focus-visible:border-ring',\n    'focus-visible:ring-3',\n    'focus-visible:ring-ring/50',\n    'font-medium',\n    'active:translate-y-[0.5px]',\n    'disabled:pointer-events-none',\n    'disabled:opacity-50',\n    'focus-visible:outline-none',\n    'focus-visible:ring-1',\n    'focus-visible:ring-ring',\n    'font-medium',\n    'gap-2',\n    'group/button',\n    'inline-flex',\n    'items-center',\n    'justify-center',\n    'outline-none',\n    'rounded-sm',\n    'select-none',\n    'shrink-0',\n    'text-sm',\n    'transform',\n    'transition-all',\n    'whitespace-nowrap',\n    '[&_svg]:pointer-events-none',\n    '[&_svg]:shrink-0',\n    '[&_svg]:size-4',\n  ],\n  {\n    variants: {\n      variant: {\n        primary: 'border border-primary bg-primary text-primary-foreground shadow-sm hover:bg-primary/80',\n        secondary: 'border border-secondary bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n        action: 'border border-action bg-action text-action-foreground shadow-sm hover:bg-action/80',\n        success: 'border border-success bg-success text-success-foreground shadow-sm hover:bg-success/80',\n        warning: 'border border-warning bg-warning text-warning-foreground shadow-sm hover:bg-warning/80',\n        danger: 'border border-danger bg-danger text-danger-foreground shadow-sm hover:bg-danger/80',\n        info: 'border border-info bg-info text-info-foreground shadow-sm hover:bg-info/80',\n        light: 'border border-light bg-light text-light-foreground shadow-sm hover:bg-light/80',\n        dark: 'border border-dark bg-dark text-dark-foreground shadow-sm hover:bg-dark/80',\n        accent: 'border border-accent bg-accent text-accent-foreground shadow-sm hover:bg-accent/80',\n        destructive:\n          'border border-destructive bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/80',\n        muted: 'border border-muted bg-muted text-muted-foreground shadow-sm hover:bg-muted/80',\n        link: 'text-primary underline-offset-4 hover:underline',\n        ghost: 'hover:bg-light hover:text-light-foreground',\n      },\n      size: {\n        xs: 'h-7 rounded-xs px-2 text-xs',\n        sm: 'h-8 rounded-sm px-3',\n        default: 'h-9 px-4 py-2',\n        lg: 'h-10 rounded-sm px-7 text-base',\n        icon: 'size-8',\n        'icon-xs':\n          \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n        'icon-sm': 'size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg',\n        'icon-lg': 'size-9',\n        'compact-xs': 'h-6 px-2 py-1 text-xs',\n        'compact-sm': 'h-7 px-2 py-1',\n        'compact-default': 'h-8 px-2 py-1',\n        'compact-lg': 'h-9 px-2 py-1 text-base',\n        'compact-icon': 'h-8 w-8',\n      },\n      appearance: {\n        solid: '',\n        outline: 'bg-background border',\n        'outline-filled': 'bg-background border',\n      },\n      loading: {\n        true: 'pointer-events-none',\n        false: null,\n      },\n    },\n    defaultVariants: {\n      variant: 'primary',\n      size: 'default',\n      appearance: 'solid',\n      loading: false,\n    },\n  },\n);\n\n// Type safety for variant and size\nexport type VariantType = NonNullable<VariantProps<typeof buttonVariants>['variant']>;\nexport type SizeType = NonNullable<VariantProps<typeof buttonVariants>['size']>;\nexport type VariantStyleType = NonNullable<VariantProps<typeof buttonVariants>['appearance']>;\n\nexport interface ButtonProps\n  extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n  icon?: React.ReactNode;\n  iconPosition?: 'left' | 'right';\n}\n\nfunction getOutlineClasses(variant: VariantType) {\n  const colors: Record<VariantType, string> = {\n    primary: 'border-primary text-primary shadow-sm hover:bg-primary/10',\n    secondary: 'border-border text-secondary-foreground shadow-sm hover:bg-secondary/10',\n    action: 'border-action text-action shadow-sm hover:bg-action/10',\n    success: 'border-success text-success shadow-sm hover:bg-success/10',\n    warning: 'border-warning text-warning shadow-sm hover:bg-warning/10',\n    danger: 'border-danger text-danger shadow-sm hover:bg-danger/10',\n    info: 'border-info text-info shadow-sm hover:bg-info/10',\n    light: 'border-border text-foreground shadow-sm hover:bg-muted',\n    dark: 'border-dark text-dark shadow-sm hover:bg-dark/10',\n    accent: 'border-accent text-accent shadow-sm hover:bg-accent/10',\n    destructive: 'border-destructive text-destructive shadow-sm hover:bg-destructive/10',\n    muted: 'border-muted text-muted-foreground shadow-sm hover:bg-muted/10',\n    link: 'text-primary',\n    ghost: 'text-light-foreground',\n  };\n  return colors[variant];\n}\n\nfunction getOutlineFilledClasses(variant: VariantType) {\n  const colors: Record<VariantType, string> = {\n    primary: 'hover:bg-primary hover:text-primary-foreground',\n    secondary: 'hover:bg-secondary hover:text-secondary-foreground',\n    action: 'hover:bg-action hover:text-action-foreground',\n    success: 'hover:bg-success hover:text-success-foreground',\n    warning: 'hover:bg-warning hover:text-warning-foreground',\n    danger: 'hover:bg-danger hover:text-danger-foreground',\n    info: 'hover:bg-info hover:text-info-foreground',\n    light: 'hover:bg-light hover:text-light-foreground',\n    dark: 'hover:bg-dark hover:text-dark-foreground',\n    accent: 'hover:bg-accent hover:text-accent-foreground',\n    destructive: 'hover:bg-destructive hover:text-destructive-foreground',\n    muted: 'hover:bg-muted hover:text-muted-foreground',\n    link: 'hover:underline',\n    ghost: 'hover:bg-light',\n  };\n  return colors[variant];\n}\n\nfunction getSpinnerClasses(variant: VariantType) {\n  const colors: Record<VariantType, string> = {\n    primary: 'bg-primary text-primary-foreground',\n    secondary: 'bg-secondary text-secondary-foreground',\n    action: 'bg-action text-action-foreground',\n    success: 'bg-success text-success-foreground',\n    warning: 'bg-warning text-warning-foreground',\n    danger: 'bg-danger text-danger-foreground',\n    info: 'bg-info text-info-foreground',\n    light: 'bg-light text-light-foreground',\n    dark: 'bg-dark text-dark-foreground',\n    accent: 'bg-accent text-accent-foreground',\n    destructive: 'bg-destructive text-destructive-foreground',\n    muted: 'bg-muted text-muted-foreground',\n    link: 'text-primary',\n    ghost: 'text-light-foreground',\n  };\n  return colors[variant];\n}\n\nfunction getOutlineSpinnerClasses(variant: VariantType) {\n  const colors: Record<VariantType, string> = {\n    primary: 'text-primary',\n    secondary: 'text-secondary',\n    action: 'text-action',\n    success: 'text-success',\n    warning: 'text-warning',\n    danger: 'text-danger',\n    info: 'text-info',\n    light: 'text-light',\n    dark: 'text-dark',\n    accent: 'text-accent',\n    destructive: 'text-destructive',\n    muted: 'text-muted-foreground',\n    link: 'text-primary',\n    ghost: 'text-light-foreground',\n  };\n  return colors[variant];\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  (\n    {\n      className,\n      variant = 'primary',\n      size = 'default',\n      appearance = 'solid',\n      loading,\n      icon,\n      iconPosition = 'left',\n      asChild = false,\n      children,\n      ...props\n    },\n    ref, // This ref is now valid because of forwardRef!\n  ) => {\n    const Comp = asChild ? Slot.Root : 'button';\n\n    const outlineClasses =\n      appearance === 'outline' || appearance === 'outline-filled' ? [getOutlineClasses(variant as VariantType)] : [];\n\n    if (appearance === 'outline-filled') {\n      outlineClasses.push(getOutlineFilledClasses(variant as VariantType));\n    }\n\n    const spinnerClasses =\n      appearance === 'outline' || appearance === 'outline-filled'\n        ? getOutlineSpinnerClasses(variant as VariantType)\n        : getSpinnerClasses(variant as VariantType);\n\n    return (\n      <Comp\n        type=\"button\"\n        data-variant={variant}\n        data-size={size}\n        data-appearance={appearance}\n        className={cn(buttonVariants({ variant, size, appearance, loading, className }), outlineClasses)}\n        ref={ref}\n        aria-busy={loading || undefined}\n        disabled={loading || props.disabled}\n        {...props}\n      >\n        {loading ? (\n          <div className=\"relative inline-flex items-center justify-center w-full\">\n            <span className=\"invisible\">{children}</span>\n            <span className=\"absolute inset-0 flex items-center justify-center\">\n              <Spinner size=\"medium\" className={cn(spinnerClasses, 'animate-spin')} />\n            </span>\n          </div>\n        ) : (\n          <div className=\"flex items-center gap-1\">\n            {icon && iconPosition === 'left' && <span className=\"flex-shrink-0\">{icon}</span>}\n            {children}\n            {icon && iconPosition === 'right' && <span className=\"flex-shrink-0\">{icon}</span>}\n          </div>\n        )}\n      </Comp>\n    );\n  },\n);\n\nexport { Button, buttonVariants };\n"],"mappings":"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","names":[]}