import React from 'react'; import { default as Box } from '../components/primitives/Box'; type SpaceType = | 'gutter' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | string | number; export default ( children: JSX.Element[] | JSX.Element, space: undefined | SpaceType, axis: 'X' | 'Y', reverse: string, divider: JSX.Element | undefined ): any => { let childrenArray = React.Children.toArray(children); childrenArray = reverse === 'reverse' ? [...childrenArray].reverse() : childrenArray; const orientation = axis === 'X' ? 'vertical' : 'horizontal'; let spaceValue; if (typeof space === 'string') { switch (space) { case 'gutter': spaceValue = 0; break; case '2xs': spaceValue = 1; break; case 'xs': spaceValue = 2; break; case 'sm': spaceValue = 3; break; case 'md': spaceValue = 4; break; case 'lg': spaceValue = 6; break; case 'xl': spaceValue = 7; break; case '2xl': spaceValue = 8; break; default: spaceValue = 1; break; } } else { spaceValue = space; } // If there's a divider, we wrap it with a Box and apply vertical and horizontal margins else we add a spacer Box with height or width if (divider) { const spacingProp: object = { ...(axis === 'X' ? { mx: spaceValue } : { my: spaceValue }), }; divider = React.cloneElement(divider, { orientation, ...spacingProp, }); childrenArray = childrenArray.map((child: any, index: number) => { return ( {child} {index < childrenArray.length - 1 && divider} ); }); } else { const spacingProp: object = { ...(axis === 'X' ? { width: spaceValue } : { height: spaceValue }), }; childrenArray = childrenArray.map((child: any, index: number) => { return ( {child} {index < childrenArray.length - 1 && } ); }); } return childrenArray; };