Spaces:
Build error
Build error
File size: 1,926 Bytes
75fefa7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | import * as React from "react"
import { Check } from "lucide-react"
import { cn } from "@/lib/utils"
export interface CheckboxProps {
label?: string
defaultChecked?: boolean
disabled?: boolean
className?: string
onChange?: (checked: boolean) => void
}
const Checkbox = React.forwardRef<HTMLDivElement, CheckboxProps>(
({ label, defaultChecked = false, disabled = false, className, onChange }, ref) => {
const [checked, setChecked] = React.useState(defaultChecked)
const handleToggle = () => {
if (!disabled) {
const newChecked = !checked
setChecked(newChecked)
onChange?.(newChecked)
}
}
return (
<div
ref={ref}
className={cn("flex items-center gap-2", className)}
>
<button
type="button"
onClick={handleToggle}
disabled={disabled}
className={cn(
"h-4 w-4 rounded border border-zinc-300 flex items-center justify-center transition-all duration-200",
"[box-shadow:inset_0px_-1px_0px_0px_#e4e4e7,_0px_1px_3px_0px_rgba(228,_228,_231,_20%)]",
!disabled && "hover:[box-shadow:inset_0px_-1px_0px_0px_#d4d4d8,_0px_1px_3px_0px_rgba(212,_212,_216,_30%)]",
checked && "bg-orange-500 border-orange-500 [box-shadow:inset_0px_-1px_0px_0px_#c2410c,_0px_1px_3px_0px_rgba(234,_88,_12,_30%)]",
disabled && "opacity-50 cursor-not-allowed"
)}
>
{checked && <Check className="h-3 w-3 text-white" />}
</button>
{label && (
<label
onClick={handleToggle}
className={cn(
"text-sm select-none",
!disabled && "cursor-pointer",
disabled && "opacity-50 cursor-not-allowed"
)}
>
{label}
</label>
)}
</div>
)
}
)
Checkbox.displayName = "Checkbox"
export { Checkbox } |