UNPKG

@patreon/studio

Version:

Patreon Studio Design System

43 lines (41 loc) 2.22 kB
'use client'; import cx from 'classnames'; import React, { useEffect, useRef } from 'react'; import { BodyText } from '~/components/BodyText'; import { IconCheckmark, IconIndeterminate } from '~/components/Icon'; import styles from './Checkbox.module.css'; const sizeToSizeClass = { sm: styles.sizeSm, md: styles.sizeMd, lg: styles.sizeLg, }; export const Checkbox = React.forwardRef(function Checkbox({ autoFocus, checked, 'data-tag': dataTag, disabled, hideLabel, id, indeterminate = false, label, labelPosition = 'right', name, onBlur, onChange, onFocus, role = 'checkbox', size = 'md', type = 'checkbox', value, ellipsis, }, givenRef) { const localRef = useRef(null); const ref = givenRef ?? localRef; const isChecked = checked || false; useEffect(() => { if (ref.current) { ref.current.indeterminate = indeterminate; } }); const classList = cx(styles.root, sizeToSizeClass[size], { [styles.labelPositionLeft]: labelPosition === 'left', [styles.disabled]: disabled, }); return (<label className={classList}> <div className={styles.checkboxContainer}> <input className={styles.checkbox} aria-checked={indeterminate ? 'mixed' : isChecked} aria-label={hideLabel && typeof label === 'string' ? label : undefined} // TODO (legacied jsx-a11y/no-autofocus) // This failure is legacied in and should be updated. DO NOT COPY. // eslint-disable-next-line jsx-a11y/no-autofocus autoFocus={autoFocus} checked={isChecked} data-tag={dataTag} disabled={disabled} id={id} name={name} onBlur={onBlur} onChange={onChange} onFocus={onFocus} ref={ref} role={role} type={type} value={value}/> <div className={styles.syntheticCheckbox} data-tag="synthetic-container"> {indeterminate ? <IconIndeterminate color="inherit"/> : isChecked ? <IconCheckmark color="inherit"/> : null} </div> </div> {!hideLabel && (<BodyText ellipsis={ellipsis} as="span" size={size} color="inherit" data-tag="label" className={cx(styles.labelContainer, { [styles.elementContainer]: typeof label !== 'string' })}> {label} </BodyText>)} </label>); }); //# sourceMappingURL=index.jsx.map