HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //var/www/design.system/src/molecules/Inputs/Checkbox/Checkbox.tsx
import React, { forwardRef, useId } from 'react';
import styles from './Checkbox.module.scss';
import cn from 'classnames';
import Body from '../../../atoms/Typography/Body/Body.tsx';

interface ICheckboxProps extends Omit<React.HTMLAttributes<HTMLInputElement>, 'onChange'> {
  checked: boolean;
  label: string;
  description?: string;
  disabled?: boolean;
  className?: string;
  onChange: (checked: boolean) => void;
}

/**
 * Поддерживает все стандартные пропсы HTMLInputElement.
 *
 * Полную документацию смотрите сайте: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
 */

const Checkbox = forwardRef<HTMLInputElement, ICheckboxProps>(
  (
    { checked, label, description, disabled, onChange, className, ...rest }: ICheckboxProps,
    ref
  ) => {
    const id = useId();

    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
      onChange(e.target.checked);
    };

    return (
      <div
        className={cn(
          styles.root,
          {
            [styles.disabled]: disabled,
          },
          className
        )}
      >
        <input
          ref={ref}
          id={id}
          type="checkbox"
          className={styles.input}
          checked={checked}
          onChange={handleChange}
          disabled={disabled}
          {...rest}
        />
        <label htmlFor={id} className={styles.wrapper}>
          <Body className={styles.label}>{label}</Body>
        </label>
        {description && <Body className={styles.description}>{description}</Body>}
      </div>
    );
  }
);

export default Checkbox;