@patreon/studio
Version:
Patreon Studio Design System
32 lines • 1.33 kB
JSX
'use client';
import cx from 'classnames';
import React, { useCallback } from 'react';
import { IconCheckmark } from '~/components/Icon';
import { LoadingSpinner } from '~/components/LoadingSpinner';
import { filterForAriaProps } from '~/utilities/accessibility';
import styles from './Toggle.module.css';
export function Toggle({ disabled, id, onClick, isLoading, isOn, ...props }) {
const handleClick = useCallback((e) => {
if (!disabled) {
onClick?.(e);
}
}, [disabled, onClick]);
const handleKeyPress = useCallback((e) => {
if (['Space', 'Enter'].includes(e.key)) {
handleClick(e);
}
}, [handleClick]);
return (<button className={cx(styles.container, {
[styles.isOn]: isOn,
[styles.disabled]: disabled,
[styles.isLoading]: isLoading,
})} aria-checked={isOn} aria-live="polite" aria-readonly={disabled} disabled={disabled} id={id} onClick={handleClick} onKeyPress={handleKeyPress} role="switch" type="button" {...filterForAriaProps(props)}>
<div className={styles.handle}>
<IconCheckmark color="inherit"/>
</div>
<div className={styles.loadingSpinnerWrapper}>
<LoadingSpinner color="actionBase" size="xs"/>
</div>
</button>);
}
//# sourceMappingURL=index.jsx.map