import { forwardRef, useId, useRef, useEffect, type InputHTMLAttributes } from 'react' import { cn } from '@/lib/utils' export interface CheckboxProps extends Omit, 'type' | 'size'> { label?: string description?: string error?: string indeterminate?: boolean } export const Checkbox = forwardRef( ( { label, description, error, indeterminate = false, disabled, className, id: idProp, ...props }, forwardedRef, ) => { const autoId = useId() const id = idProp ?? autoId const descriptionId = `${id}-description` const errorId = `${id}-error` const internalRef = useRef(null) const hasError = !!error useEffect(() => { const el = internalRef.current if (el) el.indeterminate = indeterminate }, [indeterminate]) const describedBy = [description ? descriptionId : undefined, hasError ? errorId : undefined] .filter(Boolean) .join(' ') || undefined return (
{ (internalRef as React.MutableRefObject).current = node if (typeof forwardedRef === 'function') forwardedRef(node) else if (forwardedRef) forwardedRef.current = node }} type="checkbox" id={id} disabled={disabled} aria-invalid={hasError || undefined} aria-describedby={describedBy} className={cn( 'peer size-5 cursor-pointer appearance-none rounded-[3px] border-2 border-control-border bg-control-bg transition-colors', 'hover:border-control-border-hover', 'checked:border-control-checked checked:bg-control-checked', 'checked:hover:border-control-checked-hover checked:hover:bg-control-checked-hover', 'indeterminate:border-control-checked indeterminate:bg-control-checked', 'indeterminate:hover:border-control-checked-hover indeterminate:hover:bg-control-checked-hover', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-control-focus-ring focus-visible:ring-offset-1', 'active:scale-95', 'disabled:pointer-events-none disabled:opacity-50', hasError && 'border-control-error checked:border-control-error checked:bg-control-error', )} {...props} />
{(label || description || hasError) && (
{label && ( )} {description && (

{description}

)} {hasError && (

{error}

)}
)}
) }, ) Checkbox.displayName = 'Checkbox'