"use client" import * as React from "react" import { CheckIcon, MinusIcon } from "lucide-react" import { cn } from "@/lib/utils" export type CheckboxCheckedState = boolean | "indeterminate" export type CheckboxProps = Omit< React.ComponentPropsWithoutRef<"button">, "checked" | "defaultChecked" | "name" | "onChange" | "required" | "value" > & { checked?: CheckboxCheckedState defaultChecked?: CheckboxCheckedState name?: string value?: string required?: boolean onCheckedChange?: (checked: boolean) => void onCheckedStateChange?: (checked: CheckboxCheckedState) => void size?: "sm" | "md" | "lg" invalid?: boolean allowIndeterminate?: boolean } function getNextCheckedState(checked: CheckboxCheckedState, allowIndeterminate: boolean) { if (!allowIndeterminate) { return checked === true ? false : true } if (checked === false) return "indeterminate" if (checked === "indeterminate") return true return false } const Checkbox = React.forwardRef( ( { className, checked, defaultChecked = false, onCheckedChange, onCheckedStateChange, size = "md", invalid = false, allowIndeterminate = false, disabled, name, value = "on", required, onClick, children, ...props }, ref ) => { const isControlled = checked !== undefined const [internalChecked, setInternalChecked] = React.useState(defaultChecked) const currentChecked = isControlled ? checked : internalChecked const dataState = currentChecked === "indeterminate" ? "indeterminate" : currentChecked ? "checked" : "unchecked" const handleClick: React.MouseEventHandler = (event) => { event.preventDefault() event.stopPropagation() const nextChecked = getNextCheckedState(currentChecked, allowIndeterminate) if (!isControlled) { setInternalChecked(nextChecked) } onCheckedStateChange?.(nextChecked) onCheckedChange?.(nextChecked === true) onClick?.(event) } return ( <> {name ? ( ) : null} ) } ) Checkbox.displayName = "Checkbox" export { Checkbox }