Spaces:
Sleeping
Sleeping
| import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; | |
| import _extends from "@babel/runtime/helpers/esm/extends"; | |
| const _excluded = ["component", "direction", "spacing", "divider", "children", "className", "useFlexGap"]; | |
| import * as React from 'react'; | |
| import PropTypes from 'prop-types'; | |
| import clsx from 'clsx'; | |
| import deepmerge from '@mui/utils/deepmerge'; | |
| import generateUtilityClass from '@mui/utils/generateUtilityClass'; | |
| import composeClasses from '@mui/utils/composeClasses'; | |
| import systemStyled from '../styled'; | |
| import useThemePropsSystem from '../useThemeProps'; | |
| import { extendSxProp } from '../styleFunctionSx'; | |
| import createTheme from '../createTheme'; | |
| import { handleBreakpoints, mergeBreakpointsInOrder, resolveBreakpointValues } from '../breakpoints'; | |
| import { createUnarySpacing, getValue } from '../spacing'; | |
| import { jsx as _jsx } from "react/jsx-runtime"; | |
| const defaultTheme = createTheme(); | |
| // widening Theme to any so that the consumer can own the theme structure. | |
| const defaultCreateStyledComponent = systemStyled('div', { | |
| name: 'MuiStack', | |
| slot: 'Root', | |
| overridesResolver: (props, styles) => styles.root | |
| }); | |
| function useThemePropsDefault(props) { | |
| return useThemePropsSystem({ | |
| props, | |
| name: 'MuiStack', | |
| defaultTheme | |
| }); | |
| } | |
| /** | |
| * Return an array with the separator React element interspersed between | |
| * each React node of the input children. | |
| * | |
| * > joinChildren([1,2,3], 0) | |
| * [1,0,2,0,3] | |
| */ | |
| function joinChildren(children, separator) { | |
| const childrenArray = React.Children.toArray(children).filter(Boolean); | |
| return childrenArray.reduce((output, child, index) => { | |
| output.push(child); | |
| if (index < childrenArray.length - 1) { | |
| output.push( /*#__PURE__*/React.cloneElement(separator, { | |
| key: `separator-${index}` | |
| })); | |
| } | |
| return output; | |
| }, []); | |
| } | |
| const getSideFromDirection = direction => { | |
| return { | |
| row: 'Left', | |
| 'row-reverse': 'Right', | |
| column: 'Top', | |
| 'column-reverse': 'Bottom' | |
| }[direction]; | |
| }; | |
| export const style = ({ | |
| ownerState, | |
| theme | |
| }) => { | |
| let styles = _extends({ | |
| display: 'flex', | |
| flexDirection: 'column' | |
| }, handleBreakpoints({ | |
| theme | |
| }, resolveBreakpointValues({ | |
| values: ownerState.direction, | |
| breakpoints: theme.breakpoints.values | |
| }), propValue => ({ | |
| flexDirection: propValue | |
| }))); | |
| if (ownerState.spacing) { | |
| const transformer = createUnarySpacing(theme); | |
| const base = Object.keys(theme.breakpoints.values).reduce((acc, breakpoint) => { | |
| if (typeof ownerState.spacing === 'object' && ownerState.spacing[breakpoint] != null || typeof ownerState.direction === 'object' && ownerState.direction[breakpoint] != null) { | |
| acc[breakpoint] = true; | |
| } | |
| return acc; | |
| }, {}); | |
| const directionValues = resolveBreakpointValues({ | |
| values: ownerState.direction, | |
| base | |
| }); | |
| const spacingValues = resolveBreakpointValues({ | |
| values: ownerState.spacing, | |
| base | |
| }); | |
| if (typeof directionValues === 'object') { | |
| Object.keys(directionValues).forEach((breakpoint, index, breakpoints) => { | |
| const directionValue = directionValues[breakpoint]; | |
| if (!directionValue) { | |
| const previousDirectionValue = index > 0 ? directionValues[breakpoints[index - 1]] : 'column'; | |
| directionValues[breakpoint] = previousDirectionValue; | |
| } | |
| }); | |
| } | |
| const styleFromPropValue = (propValue, breakpoint) => { | |
| if (ownerState.useFlexGap) { | |
| return { | |
| gap: getValue(transformer, propValue) | |
| }; | |
| } | |
| return { | |
| // The useFlexGap={false} implement relies on each child to give up control of the margin. | |
| // We need to reset the margin to avoid double spacing. | |
| '& > :not(style):not(style)': { | |
| margin: 0 | |
| }, | |
| '& > :not(style) ~ :not(style)': { | |
| [`margin${getSideFromDirection(breakpoint ? directionValues[breakpoint] : ownerState.direction)}`]: getValue(transformer, propValue) | |
| } | |
| }; | |
| }; | |
| styles = deepmerge(styles, handleBreakpoints({ | |
| theme | |
| }, spacingValues, styleFromPropValue)); | |
| } | |
| styles = mergeBreakpointsInOrder(theme.breakpoints, styles); | |
| return styles; | |
| }; | |
| export default function createStack(options = {}) { | |
| const { | |
| // This will allow adding custom styled fn (for example for custom sx style function) | |
| createStyledComponent = defaultCreateStyledComponent, | |
| useThemeProps = useThemePropsDefault, | |
| componentName = 'MuiStack' | |
| } = options; | |
| const useUtilityClasses = () => { | |
| const slots = { | |
| root: ['root'] | |
| }; | |
| return composeClasses(slots, slot => generateUtilityClass(componentName, slot), {}); | |
| }; | |
| const StackRoot = createStyledComponent(style); | |
| const Stack = /*#__PURE__*/React.forwardRef(function Grid(inProps, ref) { | |
| const themeProps = useThemeProps(inProps); | |
| const props = extendSxProp(themeProps); // `color` type conflicts with html color attribute. | |
| const { | |
| component = 'div', | |
| direction = 'column', | |
| spacing = 0, | |
| divider, | |
| children, | |
| className, | |
| useFlexGap = false | |
| } = props, | |
| other = _objectWithoutPropertiesLoose(props, _excluded); | |
| const ownerState = { | |
| direction, | |
| spacing, | |
| useFlexGap | |
| }; | |
| const classes = useUtilityClasses(); | |
| return /*#__PURE__*/_jsx(StackRoot, _extends({ | |
| as: component, | |
| ownerState: ownerState, | |
| ref: ref, | |
| className: clsx(classes.root, className) | |
| }, other, { | |
| children: divider ? joinChildren(children, divider) : children | |
| })); | |
| }); | |
| process.env.NODE_ENV !== "production" ? Stack.propTypes /* remove-proptypes */ = { | |
| children: PropTypes.node, | |
| direction: PropTypes.oneOfType([PropTypes.oneOf(['column-reverse', 'column', 'row-reverse', 'row']), PropTypes.arrayOf(PropTypes.oneOf(['column-reverse', 'column', 'row-reverse', 'row'])), PropTypes.object]), | |
| divider: PropTypes.node, | |
| spacing: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])), PropTypes.number, PropTypes.object, PropTypes.string]), | |
| sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]) | |
| } : void 0; | |
| return Stack; | |
| } |