UNPKG

materialuiupgraded

Version:

Material-UI's workspace package

191 lines (178 loc) 4.56 kB
// @inheritedComponent ButtonBase import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import withStyles from '@material-ui/core/styles/withStyles'; import { fade } from '@material-ui/core/styles/colorManipulator'; import ButtonBase from '@material-ui/core/ButtonBase'; export const styles = theme => ({ /* Styles applied to the root element. */ root: { ...theme.typography.button, height: 32, minWidth: 48, margin: 0, padding: `${theme.spacing.unit - 4}px ${theme.spacing.unit * 1.5}px`, borderRadius: 2, willChange: 'opacity', color: fade(theme.palette.action.active, 0.38), '&:hover': { textDecoration: 'none', // Reset on mouse devices backgroundColor: fade(theme.palette.text.primary, 0.12), '@media (hover: none)': { backgroundColor: 'transparent', }, '&$disabled': { backgroundColor: 'transparent', }, }, '&:not(:first-child)': { borderTopLeftRadius: 0, borderBottomLeftRadius: 0, }, '&:not(:last-child)': { borderTopRightRadius: 0, borderBottomRightRadius: 0, }, }, /* Styles applied to the root element if `disabled={true}`. */ disabled: { color: fade(theme.palette.action.disabled, 0.12), }, /* Styles applied to the root element if `selected={true}`. */ selected: { color: theme.palette.action.active, '&:after': { content: '""', display: 'block', position: 'absolute', overflow: 'hidden', borderRadius: 'inherit', width: '100%', height: '100%', left: 0, top: 0, pointerEvents: 'none', zIndex: 0, backgroundColor: 'currentColor', opacity: 0.38, }, '& + &:before': { content: '""', display: 'block', position: 'absolute', overflow: 'hidden', width: 1, height: '100%', left: 0, top: 0, pointerEvents: 'none', zIndex: 0, backgroundColor: 'currentColor', opacity: 0.12, }, }, /* Styles applied to the `label` wrapper element. */ label: { width: '100%', display: 'inherit', alignItems: 'inherit', justifyContent: 'inherit', }, }); class ToggleButton extends React.Component { handleChange = event => { const { onChange, onClick, value } = this.props; if (onClick) { onClick(event, value); if (event.isDefaultPrevented()) { return; } } if (onChange) { onChange(event, value); } }; render() { const { children, className: classNameProp, classes, disableFocusRipple, disabled, selected, ...other } = this.props; const className = classNames( classes.root, { [classes.disabled]: disabled, [classes.selected]: selected, }, classNameProp, ); return ( <ButtonBase className={className} disabled={disabled} focusRipple={!disableFocusRipple} onClick={this.handleChange} {...other} > <span className={classes.label}>{children}</span> </ButtonBase> ); } } ToggleButton.propTypes = { /** * The content of the button. */ children: PropTypes.node.isRequired, /** * Useful to extend the style applied to components. */ classes: PropTypes.object.isRequired, /** * @ignore */ className: PropTypes.string, /** * If `true`, the button will be disabled. */ disabled: PropTypes.bool, /** * If `true`, the keyboard focus ripple will be disabled. * `disableRipple` must also be true. */ disableFocusRipple: PropTypes.bool, /** * If `true`, the ripple effect will be disabled. */ disableRipple: PropTypes.bool, /** * @ignore */ onChange: PropTypes.func, /** * @ignore */ onClick: PropTypes.func, /** * If `true`, the button will be rendered in an active state. */ selected: PropTypes.bool, /** * The value to associate with the button when selected in a * ToggleButtonGroup. */ value: PropTypes.any.isRequired, }; ToggleButton.defaultProps = { disabled: false, disableFocusRipple: false, disableRipple: false, }; ToggleButton.muiName = 'ToggleButton'; export default withStyles(styles, { name: 'MuiToggleButton' })(ToggleButton);