UNPKG

@material-ui/lab

Version:

Material-UI Lab - Incubator for Material-UI React components.

307 lines (282 loc) 10.4 kB
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties"; import _extends from "@babel/runtime/helpers/esm/extends"; import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; import { alpha, useTheme, withStyles } from '@material-ui/core/styles'; import ButtonBase from '@material-ui/core/ButtonBase'; import FirstPageIcon from '../internal/svg-icons/FirstPage'; import LastPageIcon from '../internal/svg-icons/LastPage'; import NavigateBeforeIcon from '../internal/svg-icons/NavigateBefore'; import NavigateNextIcon from '../internal/svg-icons/NavigateNext'; import { capitalize } from '@material-ui/core/utils'; export var styles = function styles(theme) { return { /* Styles applied to the root element. */ root: _extends({}, theme.typography.body2, { borderRadius: 32 / 2, textAlign: 'center', boxSizing: 'border-box', minWidth: 32, height: 32, padding: '0 6px', margin: '0 3px', color: theme.palette.text.primary }), /* Styles applied to the root element if `type="page"`. */ page: { transition: theme.transitions.create(['color', 'background-color'], { duration: theme.transitions.duration.short }), '&:hover': { backgroundColor: theme.palette.action.hover, // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' } }, '&$focusVisible': { backgroundColor: theme.palette.action.focus }, '&$selected': { backgroundColor: theme.palette.action.selected, '&:hover, &$focusVisible': { backgroundColor: alpha(theme.palette.action.selected, theme.palette.action.selectedOpacity + theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: theme.palette.action.selected } }, '&$disabled': { opacity: 1, color: theme.palette.action.disabled, backgroundColor: theme.palette.action.selected } }, '&$disabled': { opacity: theme.palette.action.disabledOpacity } }, /* Styles applied applied to the root element if `size="small"`. */ sizeSmall: { minWidth: 26, height: 26, borderRadius: 26 / 2, margin: '0 1px', padding: '0 4px', '& $icon': { fontSize: theme.typography.pxToRem(18) } }, /* Styles applied applied to the root element if `size="large"`. */ sizeLarge: { minWidth: 40, height: 40, borderRadius: 40 / 2, padding: '0 10px', fontSize: theme.typography.pxToRem(15), '& $icon': { fontSize: theme.typography.pxToRem(22) } }, /* Styles applied to the root element if `variant="text"` and `color="primary"`. */ textPrimary: { '&$selected': { color: theme.palette.primary.contrastText, backgroundColor: theme.palette.primary.main, '&:hover, &$focusVisible': { backgroundColor: theme.palette.primary.dark, // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: theme.palette.primary.main } }, '&$disabled': { color: theme.palette.action.disabled } } }, /* Styles applied to the root element if `variant="text"` and `color="secondary"`. */ textSecondary: { '&$selected': { color: theme.palette.secondary.contrastText, backgroundColor: theme.palette.secondary.main, '&:hover, &$focusVisible': { backgroundColor: theme.palette.secondary.dark, // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: theme.palette.secondary.main } }, '&$disabled': { color: theme.palette.action.disabled } } }, /* Styles applied to the root element if `outlined="true"`. */ outlined: { border: "1px solid ".concat(theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'), '&$selected': { '&$disabled': { border: "1px solid ".concat(theme.palette.action.disabledBackground) } } }, /* Styles applied to the root element if `variant="outlined"` and `color="primary"`. */ outlinedPrimary: { '&$selected': { color: theme.palette.primary.main, border: "1px solid ".concat(alpha(theme.palette.primary.main, 0.5)), backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.activatedOpacity), '&:hover, &$focusVisible': { backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.activatedOpacity + theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' } }, '&$disabled': { color: theme.palette.action.disabled } } }, /* Styles applied to the root element if `variant="outlined"` and `color="secondary"`. */ outlinedSecondary: { '&$selected': { color: theme.palette.secondary.main, border: "1px solid ".concat(alpha(theme.palette.secondary.main, 0.5)), backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.activatedOpacity), '&:hover, &$focusVisible': { backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.activatedOpacity + theme.palette.action.hoverOpacity), // Reset on touch devices, it doesn't add specificity '@media (hover: none)': { backgroundColor: 'transparent' } }, '&$disabled': { color: theme.palette.action.disabled } } }, /* Styles applied to the root element if `rounded="true"`. */ rounded: { borderRadius: theme.shape.borderRadius }, /* Styles applied to the root element if `type="start-ellipsis"` or `type="end-ellipsis"`. */ ellipsis: { height: 'auto', '&$disabled': { opacity: theme.palette.action.disabledOpacity } }, /* Pseudo-class applied to the root element if keyboard focused. */ focusVisible: {}, /* Pseudo-class applied to the root element if `disabled={true}`. */ disabled: {}, /* Pseudo-class applied to the root element if `selected={true}`. */ selected: {}, /* Styles applied to the icon element. */ icon: { fontSize: theme.typography.pxToRem(20), margin: '0 -8px' } }; }; var PaginationItem = /*#__PURE__*/React.forwardRef(function PaginationItem(props, ref) { var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? 'standard' : _props$color, component = props.component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, page = props.page, _props$selected = props.selected, selected = _props$selected === void 0 ? false : _props$selected, _props$shape = props.shape, shape = _props$shape === void 0 ? 'round' : _props$shape, _props$size = props.size, size = _props$size === void 0 ? 'medium' : _props$size, _props$type = props.type, type = _props$type === void 0 ? 'page' : _props$type, _props$variant = props.variant, variant = _props$variant === void 0 ? 'text' : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "disabled", "page", "selected", "shape", "size", "type", "variant"]); var theme = useTheme(); var normalizedIcons = theme.direction === 'rtl' ? { previous: NavigateNextIcon, next: NavigateBeforeIcon, last: FirstPageIcon, first: LastPageIcon } : { previous: NavigateBeforeIcon, next: NavigateNextIcon, first: FirstPageIcon, last: LastPageIcon }; var Icon = normalizedIcons[type]; return type === 'start-ellipsis' || type === 'end-ellipsis' ? /*#__PURE__*/React.createElement("div", { ref: ref, className: clsx(classes.root, classes.ellipsis, disabled && classes.disabled, size !== 'medium' && classes["size".concat(capitalize(size))]) }, "\u2026") : /*#__PURE__*/React.createElement(ButtonBase, _extends({ ref: ref, component: component, disabled: disabled, focusVisibleClassName: classes.focusVisible, className: clsx(classes.root, classes.page, classes[variant], classes[shape], className, color !== 'standard' && classes["".concat(variant).concat(capitalize(color))], disabled && classes.disabled, selected && classes.selected, size !== 'medium' && classes["size".concat(capitalize(size))]) }, other), type === 'page' && page, Icon ? /*#__PURE__*/React.createElement(Icon, { className: classes.icon }) : null); }); process.env.NODE_ENV !== "production" ? PaginationItem.propTypes = { /** * @ignore */ classes: PropTypes.object.isRequired, /** * @ignore */ className: PropTypes.string, /** * The active color. */ color: PropTypes.oneOf(['standard', 'primary', 'secondary']), /** * The component used for the root node. * Either a string to use a HTML element or a component. */ component: PropTypes /* @typescript-to-proptypes-ignore */ .elementType, /** * If `true`, the item will be disabled. */ disabled: PropTypes.bool, /** * The current page number. */ page: PropTypes.number, /** * If `true` the pagination item is selected. */ selected: PropTypes.bool, /** * The shape of the pagination item. */ shape: PropTypes.oneOf(['round', 'rounded']), /** * The size of the pagination item. */ size: PropTypes.oneOf(['small', 'medium', 'large']), /** * The type of pagination item. */ type: PropTypes.oneOf(['page', 'first', 'last', 'next', 'previous', 'start-ellipsis', 'end-ellipsis']), /** * The pagination item variant. */ variant: PropTypes.oneOf(['text', 'outlined']) } : void 0; export default withStyles(styles, { name: 'MuiPaginationItem' })(PaginationItem);