index.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { RiCheckLine } from '@remixicon/react'
  2. import s from './index.module.css'
  3. import cn from '@/utils/classnames'
  4. type CheckboxProps = {
  5. checked?: boolean
  6. onCheck?: () => void
  7. className?: string
  8. disabled?: boolean
  9. mixed?: boolean
  10. }
  11. const Checkbox = ({ checked, onCheck, className, disabled, mixed }: CheckboxProps) => {
  12. if (!checked) {
  13. return (
  14. <div
  15. className={cn(
  16. 'w-4 h-4 rounded-[4px] bg-components-checkbox-bg-unchecked border border-components-checkbox-border hover:bg-components-checkbox-bg-unchecked-hover hover:border-components-checkbox-border-hover shadow-xs cursor-pointer',
  17. disabled && 'border-components-checkbox-border-disabled bg-components-checkbox-bg-disabled hover:border-components-checkbox-border-disabled hover:bg-components-checkbox-bg-disabled cursor-not-allowed',
  18. mixed && s.mixed,
  19. className,
  20. )}
  21. onClick={() => {
  22. if (disabled)
  23. return
  24. onCheck?.()
  25. }}
  26. ></div>
  27. )
  28. }
  29. return (
  30. <div
  31. className={cn(
  32. 'w-4 h-4 flex items-center justify-center rounded-[4px] bg-components-checkbox-bg hover:bg-components-checkbox-bg-hover text-components-checkbox-icon shadow-xs cursor-pointer',
  33. disabled && 'bg-components-checkbox-bg-disabled-checked hover:bg-components-checkbox-bg-disabled-checked text-components-checkbox-icon-disabled cursor-not-allowed',
  34. className,
  35. )}
  36. onClick={() => {
  37. if (disabled)
  38. return
  39. onCheck?.()
  40. }}
  41. >
  42. <RiCheckLine className={cn('w-3 h-3')} />
  43. </div>
  44. )
  45. }
  46. export default Checkbox