UNPKG

@mui/material

Version:

Quickly build beautiful React apps. MUI is a simple and customizable component library to build faster, beautiful, and more accessible React applications. Follow your own design system, or start with Material Design.

542 lines (461 loc) 19.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.generateColumnGap = generateColumnGap; exports.generateDirection = generateDirection; exports.generateGrid = generateGrid; exports.generateRowGap = generateRowGap; exports.resolveSpacingClasses = resolveSpacingClasses; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _clsx = _interopRequireDefault(require("clsx")); var _system = require("@mui/system"); var _base = require("@mui/base"); var _requirePropFactory = _interopRequireDefault(require("../utils/requirePropFactory")); var _styled = _interopRequireDefault(require("../styles/styled")); var _useThemeProps = _interopRequireDefault(require("../styles/useThemeProps")); var _GridContext = _interopRequireDefault(require("./GridContext")); var _gridClasses = _interopRequireWildcard(require("./gridClasses")); var _jsxRuntime = require("react/jsx-runtime"); const _excluded = ["className", "columns", "columnSpacing", "component", "container", "direction", "item", "lg", "md", "rowSpacing", "sm", "spacing", "wrap", "xl", "xs", "zeroMinWidth"]; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function getOffset(val) { const parse = parseFloat(val); return `${parse}${String(val).replace(String(parse), '') || 'px'}`; } function generateGrid({ theme, ownerState }) { let size; return theme.breakpoints.keys.reduce((globalStyles, breakpoint) => { // Use side effect over immutability for better performance. let styles = {}; if (ownerState[breakpoint]) { size = ownerState[breakpoint]; } if (!size) { return globalStyles; } if (size === true) { // For the auto layouting styles = { flexBasis: 0, flexGrow: 1, maxWidth: '100%' }; } else if (size === 'auto') { styles = { flexBasis: 'auto', flexGrow: 0, flexShrink: 0, maxWidth: 'none', width: 'auto' }; } else { const columnsBreakpointValues = (0, _system.unstable_resolveBreakpointValues)({ values: ownerState.columns, breakpoints: theme.breakpoints.values }); const columnValue = typeof columnsBreakpointValues === 'object' ? columnsBreakpointValues[breakpoint] : columnsBreakpointValues; if (columnValue === undefined || columnValue === null) { return globalStyles; } // Keep 7 significant numbers. const width = `${Math.round(size / columnValue * 10e7) / 10e5}%`; let more = {}; if (ownerState.container && ownerState.item && ownerState.columnSpacing !== 0) { const themeSpacing = theme.spacing(ownerState.columnSpacing); if (themeSpacing !== '0px') { const fullWidth = `calc(${width} + ${getOffset(themeSpacing)})`; more = { flexBasis: fullWidth, maxWidth: fullWidth }; } } // Close to the bootstrap implementation: // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41 styles = (0, _extends2.default)({ flexBasis: width, flexGrow: 0, maxWidth: width }, more); } // No need for a media query for the first size. if (theme.breakpoints.values[breakpoint] === 0) { Object.assign(globalStyles, styles); } else { globalStyles[theme.breakpoints.up(breakpoint)] = styles; } return globalStyles; }, {}); } function generateDirection({ theme, ownerState }) { const directionValues = (0, _system.unstable_resolveBreakpointValues)({ values: ownerState.direction, breakpoints: theme.breakpoints.values }); return (0, _system.handleBreakpoints)({ theme }, directionValues, propValue => { const output = { flexDirection: propValue }; if (propValue.indexOf('column') === 0) { output[`& > .${_gridClasses.default.item}`] = { maxWidth: 'none' }; } return output; }); } function generateRowGap({ theme, ownerState }) { const { container, rowSpacing } = ownerState; let styles = {}; if (container && rowSpacing !== 0) { const rowSpacingValues = (0, _system.unstable_resolveBreakpointValues)({ values: rowSpacing, breakpoints: theme.breakpoints.values }); styles = (0, _system.handleBreakpoints)({ theme }, rowSpacingValues, propValue => { const themeSpacing = theme.spacing(propValue); if (themeSpacing !== '0px') { return { marginTop: `-${getOffset(themeSpacing)}`, [`& > .${_gridClasses.default.item}`]: { paddingTop: getOffset(themeSpacing) } }; } return {}; }); } return styles; } function generateColumnGap({ theme, ownerState }) { const { container, columnSpacing } = ownerState; let styles = {}; if (container && columnSpacing !== 0) { const columnSpacingValues = (0, _system.unstable_resolveBreakpointValues)({ values: columnSpacing, breakpoints: theme.breakpoints.values }); styles = (0, _system.handleBreakpoints)({ theme }, columnSpacingValues, propValue => { const themeSpacing = theme.spacing(propValue); if (themeSpacing !== '0px') { return { width: `calc(100% + ${getOffset(themeSpacing)})`, marginLeft: `-${getOffset(themeSpacing)}`, [`& > .${_gridClasses.default.item}`]: { paddingLeft: getOffset(themeSpacing) } }; } return {}; }); } return styles; } function resolveSpacingClasses(spacing, container, styles = {}) { // in case of grid item or undefined/null or `spacing` <= 0 if (!container || !spacing || spacing <= 0) { return []; } // in case of string/number `spacing` if (typeof spacing === 'string' && !Number.isNaN(Number(spacing)) || typeof spacing === 'number') { return [styles[`spacing-xs-${String(spacing)}`] || `spacing-xs-${String(spacing)}`]; } // in case of object `spacing` const { xs, sm, md, lg, xl } = spacing; return [Number(xs) > 0 && (styles[`spacing-xs-${String(xs)}`] || `spacing-xs-${String(xs)}`), Number(sm) > 0 && (styles[`spacing-sm-${String(sm)}`] || `spacing-sm-${String(sm)}`), Number(md) > 0 && (styles[`spacing-md-${String(md)}`] || `spacing-md-${String(md)}`), Number(lg) > 0 && (styles[`spacing-lg-${String(lg)}`] || `spacing-lg-${String(lg)}`), Number(xl) > 0 && (styles[`spacing-xl-${String(xl)}`] || `spacing-xl-${String(xl)}`)]; } // Default CSS values // flex: '0 1 auto', // flexDirection: 'row', // alignItems: 'flex-start', // flexWrap: 'nowrap', // justifyContent: 'flex-start', const GridRoot = (0, _styled.default)('div', { name: 'MuiGrid', slot: 'Root', overridesResolver: (props, styles) => { const { container, direction, item, lg, md, sm, spacing, wrap, xl, xs, zeroMinWidth } = props.ownerState; return [styles.root, container && styles.container, item && styles.item, zeroMinWidth && styles.zeroMinWidth, ...resolveSpacingClasses(spacing, container, styles), direction !== 'row' && styles[`direction-xs-${String(direction)}`], wrap !== 'wrap' && styles[`wrap-xs-${String(wrap)}`], xs !== false && styles[`grid-xs-${String(xs)}`], sm !== false && styles[`grid-sm-${String(sm)}`], md !== false && styles[`grid-md-${String(md)}`], lg !== false && styles[`grid-lg-${String(lg)}`], xl !== false && styles[`grid-xl-${String(xl)}`]]; } })(({ ownerState }) => (0, _extends2.default)({ boxSizing: 'border-box' }, ownerState.container && { display: 'flex', flexWrap: 'wrap', width: '100%' }, ownerState.item && { margin: 0 // For instance, it's useful when used with a `figure` element. }, ownerState.zeroMinWidth && { minWidth: 0 }, ownerState.wrap === 'nowrap' && { flexWrap: 'nowrap' }, ownerState.wrap === 'reverse' && { flexWrap: 'wrap-reverse' }), generateDirection, generateRowGap, generateColumnGap, generateGrid); const useUtilityClasses = ownerState => { const { classes, container, direction, item, lg, md, sm, spacing, wrap, xl, xs, zeroMinWidth } = ownerState; const slots = { root: ['root', container && 'container', item && 'item', zeroMinWidth && 'zeroMinWidth', ...resolveSpacingClasses(spacing, container), direction !== 'row' && `direction-xs-${String(direction)}`, wrap !== 'wrap' && `wrap-xs-${String(wrap)}`, xs !== false && `grid-xs-${String(xs)}`, sm !== false && `grid-sm-${String(sm)}`, md !== false && `grid-md-${String(md)}`, lg !== false && `grid-lg-${String(lg)}`, xl !== false && `grid-xl-${String(xl)}`] }; return (0, _base.unstable_composeClasses)(slots, _gridClasses.getGridUtilityClass, classes); }; const Grid = /*#__PURE__*/React.forwardRef(function Grid(inProps, ref) { const themeProps = (0, _useThemeProps.default)({ props: inProps, name: 'MuiGrid' }); const props = (0, _system.unstable_extendSxProp)(themeProps); const { className, columns: columnsProp, columnSpacing: columnSpacingProp, component = 'div', container = false, direction = 'row', item = false, lg = false, md = false, rowSpacing: rowSpacingProp, sm = false, spacing = 0, wrap = 'wrap', xl = false, xs = false, zeroMinWidth = false } = props, other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded); const rowSpacing = rowSpacingProp || spacing; const columnSpacing = columnSpacingProp || spacing; const columnsContext = React.useContext(_GridContext.default); // setting prop before context to accomodate nesting // colums set with default breakpoint unit of 12 const columns = columnsProp || columnsContext || 12; const ownerState = (0, _extends2.default)({}, props, { columns, container, direction, item, lg, md, sm, rowSpacing, columnSpacing, wrap, xl, xs, zeroMinWidth }); const classes = useUtilityClasses(ownerState); const wrapChild = element => columns !== 12 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridContext.default.Provider, { value: columns, children: element }) : element; return wrapChild( /*#__PURE__*/(0, _jsxRuntime.jsx)(GridRoot, (0, _extends2.default)({ ownerState: ownerState, className: (0, _clsx.default)(classes.root, className), as: component, ref: ref }, other))); }); process.env.NODE_ENV !== "production" ? Grid.propTypes /* remove-proptypes */ = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | // | To update them edit the d.ts file and run "yarn proptypes" | // ---------------------------------------------------------------------- /** * The content of the component. */ children: _propTypes.default.node, /** * Override or extend the styles applied to the component. */ classes: _propTypes.default.object, /** * @ignore */ className: _propTypes.default.string, /** * The number of columns. * @default 12 */ columns: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.number), _propTypes.default.number, _propTypes.default.object]), /** * Defines the horizontal space between the type `item` components. * It overrides the value of the `spacing` prop. */ columnSpacing: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])), _propTypes.default.number, _propTypes.default.object, _propTypes.default.string]), /** * The component used for the root node. * Either a string to use a HTML element or a component. */ component: _propTypes.default.elementType, /** * If `true`, the component will have the flex *container* behavior. * You should be wrapping *items* with a *container*. * @default false */ container: _propTypes.default.bool, /** * Defines the `flex-direction` style property. * It is applied for all screen sizes. * @default 'row' */ direction: _propTypes.default.oneOfType([_propTypes.default.oneOf(['column-reverse', 'column', 'row-reverse', 'row']), _propTypes.default.arrayOf(_propTypes.default.oneOf(['column-reverse', 'column', 'row-reverse', 'row'])), _propTypes.default.object]), /** * If `true`, the component will have the flex *item* behavior. * You should be wrapping *items* with a *container*. * @default false */ item: _propTypes.default.bool, /** * If a number, it sets the number of columns the grid item uses. * It can't be greater than the total number of columns of the container (12 by default). * If 'auto', the grid item's width matches its content. * If false, the prop is ignored. * If true, the grid item's width grows to use the space available in the grid container. * The value is applied for the `lg` breakpoint and wider screens if not overridden. * @default false */ lg: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.bool]), /** * If a number, it sets the number of columns the grid item uses. * It can't be greater than the total number of columns of the container (12 by default). * If 'auto', the grid item's width matches its content. * If false, the prop is ignored. * If true, the grid item's width grows to use the space available in the grid container. * The value is applied for the `md` breakpoint and wider screens if not overridden. * @default false */ md: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.bool]), /** * Defines the vertical space between the type `item` components. * It overrides the value of the `spacing` prop. */ rowSpacing: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])), _propTypes.default.number, _propTypes.default.object, _propTypes.default.string]), /** * If a number, it sets the number of columns the grid item uses. * It can't be greater than the total number of columns of the container (12 by default). * If 'auto', the grid item's width matches its content. * If false, the prop is ignored. * If true, the grid item's width grows to use the space available in the grid container. * The value is applied for the `sm` breakpoint and wider screens if not overridden. * @default false */ sm: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.bool]), /** * Defines the space between the type `item` components. * It can only be used on a type `container` component. * @default 0 */ spacing: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])), _propTypes.default.number, _propTypes.default.object, _propTypes.default.string]), /** * The system prop that allows defining system overrides as well as additional CSS styles. */ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]), /** * Defines the `flex-wrap` style property. * It's applied for all screen sizes. * @default 'wrap' */ wrap: _propTypes.default.oneOf(['nowrap', 'wrap-reverse', 'wrap']), /** * If a number, it sets the number of columns the grid item uses. * It can't be greater than the total number of columns of the container (12 by default). * If 'auto', the grid item's width matches its content. * If false, the prop is ignored. * If true, the grid item's width grows to use the space available in the grid container. * The value is applied for the `xl` breakpoint and wider screens if not overridden. * @default false */ xl: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.bool]), /** * If a number, it sets the number of columns the grid item uses. * It can't be greater than the total number of columns of the container (12 by default). * If 'auto', the grid item's width matches its content. * If false, the prop is ignored. * If true, the grid item's width grows to use the space available in the grid container. * The value is applied for all the screen sizes with the lowest priority. * @default false */ xs: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.bool]), /** * If `true`, it sets `min-width: 0` on the item. * Refer to the limitations section of the documentation to better understand the use case. * @default false */ zeroMinWidth: _propTypes.default.bool } : void 0; if (process.env.NODE_ENV !== 'production') { const requireProp = (0, _requirePropFactory.default)('Grid', Grid); // eslint-disable-next-line no-useless-concat Grid['propTypes' + ''] = (0, _extends2.default)({}, Grid.propTypes, { direction: requireProp('container'), lg: requireProp('item'), md: requireProp('item'), sm: requireProp('item'), spacing: requireProp('container'), wrap: requireProp('container'), xs: requireProp('item'), zeroMinWidth: requireProp('item') }); } var _default = Grid; exports.default = _default;