import * as React from 'react';
import { motion } from 'motion/react';
import {
Checkbox as CheckboxPrimitive,
CheckboxIndicator as CheckboxIndicatorPrimitive,
type CheckboxProps as CheckboxPrimitiveProps,
} from '@/components/animate-ui/primitives/headless/checkbox';
import { cn } from '@/lib/utils';
import { cva, type VariantProps } from 'class-variance-authority';
const checkboxVariants = cva(
'peer shrink-0 flex items-center justify-center outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 disabled:cursor-not-allowed disabled:opacity-50 transition-colors duration-500 focus-visible:ring-offset-2 [&[data-checked],&[data-indeterminate]]:bg-primary [&[data-checked],&[data-indeterminate]]:text-primary-foreground',
{
variants: {
variant: {
default: 'bg-background border',
accent: 'bg-input',
},
size: {
default: 'size-5 rounded-sm',
sm: 'size-4.5 rounded-[5px]',
lg: 'size-6 rounded-[7px]',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
},
);
const checkboxIndicatorVariants = cva('', {
variants: {
size: {
default: 'size-3.5',
sm: 'size-3',
lg: 'size-4',
},
},
defaultVariants: {
size: 'default',
},
});
type CheckboxProps<TTag extends React.ElementType = typeof motion.button> =
CheckboxPrimitiveProps<TTag> & VariantProps<typeof checkboxVariants>;
function Checkbox<TTag extends React.ElementType = typeof motion.button>({
className,
children,
variant,
size,
...props
}: CheckboxProps<TTag>) {
return (
<CheckboxPrimitive
className={cn(checkboxVariants({ variant, size, className }))}
{...props}
>
{(bag) => (
<>
{typeof children === 'function' ? children(bag) : children}
<CheckboxIndicatorPrimitive
className={cn(checkboxIndicatorVariants({ size }))}
/>
</>
)}
</CheckboxPrimitive>
);
}
export { Checkbox, type CheckboxProps };