import type { ReactNode, HTMLAttributes } from 'react' import React, { forwardRef, useContext } from 'react' import { type BaseProps } from '@toptal/picasso-shared' import { twMerge } from '@toptal/picasso-tailwind-merge' import { GridContext } from '../GridContext' import type { GridSize, GridSpacing } from '../types' import { getSizesClassNames } from './utils/get-sizes-class-names' export interface GridSizes { /** Defines the number of grids the component is going to use. It's applied for all the screen sizes with the lowest priority */ xs?: boolean | GridSize /** Defines the number of grids the component is going to use. It's applied for the sm breakpoint and wider screens */ sm?: boolean | GridSize /** Defines the number of grids the component is going to use. It's applied for the md breakpoint and wider screens */ md?: boolean | GridSize /** Defines the number of grids the component is going to use. It's applied for the lg breakpoint and wider screens */ lg?: boolean | GridSize /** Defines the number of grids the component is going to use. It's applied for the xl breakpoint and wider screens */ xl?: boolean | GridSize } export interface Props extends BaseProps, GridSizes, HTMLAttributes { /** Content of Grid.Item */ children?: ReactNode } const gridSpacingMapping: { [K in GridSpacing]: string } = { 0: 'p-[0px]', 8: 'p-[4px]', 16: 'p-[8px]', 24: 'p-[12px]', 32: 'p-[16px]', 64: 'p-[32px]', 72: 'p-[36px]', 80: 'p-[40px]', } const getSpacingClassName = (gridSpacing?: GridSpacing) => { if (!gridSpacing) { return '' } return gridSpacingMapping[gridSpacing] } export const GridItem = forwardRef(function GridItem( props, ref ) { const { children, xs, sm, md, lg, xl, className, style, ...rest } = props const { gridSpacing } = useContext(GridContext) const spacingClassName = getSpacingClassName(gridSpacing) const sizesClassNames = getSizesClassNames({ xs, sm, md, lg, xl, }) return (
{children}
) }) GridItem.displayName = 'GridItem' export default GridItem