UNPKG

@material-ui/core

Version:

React components that implement Google's Material Design.

146 lines (133 loc) 4.06 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; // @inheritedComponent ButtonBase import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import withStyles from '../styles/withStyles'; import { fade } from '../styles/colorManipulator'; import ButtonBase from '../ButtonBase'; import { capitalize } from '../utils/helpers'; export const styles = theme => ({ /* Styles applied to the root element. */ root: { textAlign: 'center', flex: '0 0 auto', fontSize: theme.typography.pxToRem(24), padding: 12, borderRadius: '50%', overflow: 'visible', // Explicitly set the default value to solve a bug on IE11. color: theme.palette.action.active, transition: theme.transitions.create('background-color', { duration: theme.transitions.duration.shortest }), '&:hover': { backgroundColor: fade(theme.palette.action.active, theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' }, '&$disabled': { backgroundColor: 'transparent' } }, '&$disabled': { color: theme.palette.action.disabled } }, /* Styles applied to the root element if `color="inherit"`. */ colorInherit: { color: 'inherit' }, /* Styles applied to the root element if `color="primary"`. */ colorPrimary: { color: theme.palette.primary.main, '&:hover': { backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' } } }, /* Styles applied to the root element if `color="secondary"`. */ colorSecondary: { color: theme.palette.secondary.main, '&:hover': { backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' } } }, /* Styles applied to the root element if `disabled={true}`. */ disabled: {}, /* Styles applied to the children container element. */ label: { width: '100%', display: 'flex', alignItems: 'inherit', justifyContent: 'inherit' } }); /** * Refer to the [Icons](/style/icons/) section of the documentation * regarding the available icon options. */ function IconButton(props) { const { children, classes, className, color, disabled } = props, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "disabled"]); return React.createElement(ButtonBase, _extends({ className: classNames(classes.root, { [classes[`color${capitalize(color)}`]]: color !== 'default', [classes.disabled]: disabled }, className), centerRipple: true, focusRipple: true, disabled: disabled }, other), React.createElement("span", { className: classes.label }, children)); } IconButton.propTypes = process.env.NODE_ENV !== "production" ? { /** * The icon element. */ children: PropTypes.node, /** * Override or extend the styles applied to the component. * See [CSS API](#css-api) below for more details. */ classes: PropTypes.object.isRequired, /** * @ignore */ className: PropTypes.string, /** * The color of the component. It supports those theme colors that make sense for this component. */ color: PropTypes.oneOf(['default', 'inherit', 'primary', 'secondary']), /** * If `true`, the button will be disabled. */ disabled: PropTypes.bool, /** * If `true`, the ripple will be disabled. */ disableRipple: PropTypes.bool } : {}; IconButton.defaultProps = { color: 'default', disabled: false }; export default withStyles(styles, { name: 'MuiIconButton' })(IconButton);