import { clsx } from 'clsx'; import React from 'react'; type FlexDirection = 'row' | 'row-reverse' | 'col' | 'col-reverse'; type FlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'; type FlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'; type FlexWrap = 'wrap' | 'wrap-reverse' | 'nowrap'; type FlexGap = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl'; interface FlexProps extends React.HTMLAttributes { direction?: FlexDirection; align?: FlexAlign; justify?: FlexJustify; wrap?: FlexWrap; gap?: FlexGap; as?: React.ElementType; children: React.ReactNode; } const DIRECTION_MAP: Record = { row: 'flex-row', 'row-reverse': 'flex-row-reverse', col: 'flex-col', 'col-reverse': 'flex-col-reverse', }; const ALIGN_MAP: Record = { start: 'items-start', center: 'items-center', end: 'items-end', stretch: 'items-stretch', baseline: 'items-baseline', }; const JUSTIFY_MAP: Record = { start: 'justify-start', center: 'justify-center', end: 'justify-end', between: 'justify-between', around: 'justify-around', evenly: 'justify-evenly', }; const WRAP_MAP: Record = { wrap: 'flex-wrap', 'wrap-reverse': 'flex-wrap-reverse', nowrap: 'flex-nowrap', }; const GAP_MAP: Record = { none: 'gap-0', xs: 'gap-2', sm: 'gap-3', md: 'gap-4', lg: 'gap-6', xl: 'gap-8', '2xl': 'gap-12', '3xl': 'gap-16', }; const Flex = React.forwardRef( ( { direction = 'row', align = 'stretch', justify = 'start', wrap = 'nowrap', gap = 'md', as: Component = 'div', className, children, ...props }, ref ) => { const classes = clsx( 'flex', DIRECTION_MAP[direction], ALIGN_MAP[align], JUSTIFY_MAP[justify], WRAP_MAP[wrap], GAP_MAP[gap], className ); return ( {children} ); } ); Flex.displayName = 'Flex'; export default Flex;