@primer/react
Version:
An implementation of GitHub's Primer Design System using React
88 lines (82 loc) • 2.88 kB
JavaScript
;
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;