import React from 'react'; import { ElementType, forwardRef, ReactElement } from 'react'; import { domElements } from './constants'; import * as W from './types'; import { evaluateClassName } from './utils'; export const styled: W.Styled = function( component, { className: defaultClassName, variants, transient, defaultProps, compoundVariants, defaultVariants, } ) { const overrideVariantProps = variants ? Object.fromEntries(Object.keys(variants).map(key => [key, undefined])) : {}; const overrideTransientProps = transient && variants ? Object.fromEntries( Object.keys(variants) .filter(key => transient.includes(key)) .map(key => [key, undefined]) ) : {}; const Component = ( { as: asProp, ...props }: W.StyledProps, ref: any ): ReactElement => { const Tag = (asProp || component) as ElementType; const isTag = typeof component === 'string'; return ( ); }; if (typeof component === 'string') { return forwardRef(Component) as any; } return Component; } as W.Styled; // Add all styled.[tag] functions (such as styled.a, styled.div, ...) domElements.forEach(domElement => { styled[domElement] = ((className, config) => styled(domElement, { ...config, className })) as W.StyledTagFunction< typeof domElement >; });