import { ComponentPropsWithRef, forwardRef, Ref } from 'react'; import { marginLookup, marginMdLookup, marginLgLookup, marginXLookup, marginXMdLookup, marginYLookup, marginYMdLookup, marginYLgLookup, paddingLgLookup, paddingLookup, paddingMdLookup, paddingXLgLookup, paddingXLookup, paddingXMdLookup, paddingYLgLookup, paddingYLookup, paddingYMdLookup, widthLookup, widthMdLookup, widthLgLookup, marginXlLookup, marginXXlLookup, marginYXlLookup, paddingXlLookup, paddingXXlLookup, paddingYXlLookup, marginXlgLookup, radiusLookup, radiusMdLookup, radiusLgLookup, radiusXlLookup, paddingY2XlLookup, paddingX2XlLookup, } from '../theme'; import { getClassName, memo } from '../utils'; import { cn } from '../libs'; import { Breakpoint } from '../types/ui'; export type Size = keyof typeof marginLookup; export type Width = keyof typeof widthLookup; export type Radius = keyof typeof radiusLookup; type MarginValue = Size; // They share the same keys type PaddingValue = Size; type Axis = 'x' | 'y'; type ResponsiveProp = T | Partial>; type AxisProp = { [K in Axis]?: ResponsiveProp; }; type SpacingProp = ResponsiveProp | AxisProp; export interface BoxProps extends ComponentPropsWithRef<'div'> { hide?: boolean | ResponsiveProp; grow?: boolean | ResponsiveProp; margin?: SpacingProp; padding?: SpacingProp; width?: ResponsiveProp; radius?: ResponsiveProp; } const Component = ( { hide, grow, margin, radius, padding, width, className, ...rest }: BoxProps, ref: Ref ) => { // Helper to check if a prop is responsive object (not axis) // We need to cast props to 'any' sometimes to access properties because TS doesn't know for sure if it's an object const m = margin as any; const p = padding as any; const w = width as any; const r = radius as any; const h = hide as any; const g = grow as any; return (
); }; export const Box = memo(forwardRef(Component));