import * as React from 'react'; import { useEffect } from 'react'; import { Checkbox, useStoreState, useCheckboxStore } from '@ariakit/react'; import { cn } from '~/utils'; const CheckboxButton = React.forwardRef< HTMLInputElement, { icon?: React.ReactNode; label: string; className?: string; checked?: boolean; defaultChecked?: boolean; isCheckedClassName?: string; setValue?: (values: { e?: React.ChangeEvent; value: boolean | string; }) => void; } >(({ icon, label, setValue, className, checked, defaultChecked, isCheckedClassName }, ref) => { const checkbox = useCheckboxStore(); const isChecked = useStoreState(checkbox, (state) => state?.value); const onChange = (e: React.ChangeEvent) => { e.stopPropagation(); if (typeof isChecked !== 'boolean') { return; } setValue?.({ e, value: !isChecked }); }; // Sync with controlled checked prop useEffect(() => { if (checked !== undefined) { checkbox.setValue(checked); } }, [checked, checkbox]); // Set initial value from defaultChecked useEffect(() => { if (defaultChecked !== undefined && checked === undefined) { checkbox.setValue(defaultChecked); } }, [defaultChecked, checked, checkbox]); return ( } > {/* Icon if provided */} {icon && {icon as React.JSX.Element}} {/* Show the label on larger screens */} {label} ); }); CheckboxButton.displayName = 'CheckboxButton'; export default CheckboxButton;