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