UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

88 lines (82 loc) 2.88 kB
'use strict'; var clsx = require('clsx'); var React = require('react'); var useProvidedRefOrCreate = require('../hooks/useProvidedRefOrCreate.js'); require('@primer/behaviors/utils'); require('@primer/behaviors'); var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js'); var CheckboxGroupContext = require('../CheckboxGroup/CheckboxGroupContext.js'); var Checkbox_module = require('./Checkbox.module.css.js'); var shared_module = require('./shared.module.css.js'); var Box = require('../Box/Box.js'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefault(React); 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__default.default.forwardRef(({ checked, className, defaultChecked, indeterminate, disabled, onChange, sx: sxProp, required, validationStatus, value, ...rest }, ref) => { const checkboxRef = useProvidedRefOrCreate.useProvidedRefOrCreate(ref); const checkboxGroupContext = React.useContext(CheckboxGroupContext.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]); React.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__default.default.createElement(Box, _extends({ as: "input" }, inputProps, { className: clsx.clsx(className, shared_module.Input, Checkbox_module.Checkbox), sx: sxProp })); } return /*#__PURE__*/React__default.default.createElement("input", _extends({}, inputProps, { className: clsx.clsx(className, shared_module.Input, Checkbox_module.Checkbox) })); }); Checkbox.displayName = 'Checkbox'; module.exports = Checkbox;