UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

82 lines (79 loc) 2.6 kB
import { clsx } from 'clsx'; import React, { useContext, useEffect } from 'react'; import { useProvidedRefOrCreate } from '../hooks/useProvidedRefOrCreate.js'; import '@primer/behaviors/utils'; import '@primer/behaviors'; import useIsomorphicLayoutEffect from '../utils/useIsomorphicLayoutEffect.js'; import { CheckboxGroupContext } from '../CheckboxGroup/CheckboxGroupContext.js'; import classes from './Checkbox.module.css.js'; import sharedClasses from './shared.module.css.js'; import Box from '../Box/Box.js'; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /** * An accessible, native checkbox component */ const Checkbox = /*#__PURE__*/React.forwardRef(({ checked, className, defaultChecked, indeterminate, disabled, onChange, sx: sxProp, required, validationStatus, value, ...rest }, ref) => { const checkboxRef = useProvidedRefOrCreate(ref); const checkboxGroupContext = useContext(CheckboxGroupContext); const handleOnChange = e => { checkboxGroupContext.onChange && checkboxGroupContext.onChange(e); onChange && onChange(e); }; const inputProps = { type: 'checkbox', disabled, ref: checkboxRef, checked: indeterminate ? false : checked, defaultChecked, required, ['aria-required']: required ? 'true' : 'false', ['aria-invalid']: validationStatus === 'error' ? 'true' : 'false', onChange: handleOnChange, value, name: value, ...rest }; useIsomorphicLayoutEffect(() => { if (checkboxRef.current) { checkboxRef.current.indeterminate = indeterminate || false; } }, [indeterminate, checked, checkboxRef]); useEffect(() => { const { current: checkbox } = checkboxRef; if (!checkbox) { return; } if (indeterminate) { checkbox.setAttribute('aria-checked', 'mixed'); } else { checkbox.setAttribute('aria-checked', checkbox.checked ? 'true' : 'false'); } }); if (sxProp) { return /*#__PURE__*/React.createElement(Box, _extends({ as: "input" }, inputProps, { className: clsx(className, sharedClasses.Input, classes.Checkbox), sx: sxProp })); } return /*#__PURE__*/React.createElement("input", _extends({}, inputProps, { className: clsx(className, sharedClasses.Input, classes.Checkbox) })); }); Checkbox.displayName = 'Checkbox'; export { Checkbox as default };