import React, { ComponentProps } from 'react'; import { BoxProps } from './Box'; import { FlexProps } from './Flex'; import { GridProps } from './Grid'; import { TextProps } from './Text'; export type RecursivePartial = { [P in keyof T]?: RecursivePartial; }; type AsProp = { /** * Use any valid DOM element type */ as?: T; }; type PropsToOmit = keyof (AsProp & P); type BaseComponentProps = []> = React.PropsWithChildren> & Omit, PropsToOmit | OmitKeys[number]> & { ref?: BaseComponentRef; }; type BaseComponentRef = React.ComponentPropsWithRef['ref']; type BaseComponent> = C & { defaultProps?: Partial>; displayName?: string; }; type ExtendedBoxProps | undefined = undefined> = BaseComponentProps<(OmitKeys extends string[] ? Omit, OmitKeys[number]> : BoxProps) & Props, T, OmitKeys extends undefined ? [] : OmitKeys>; type ExtendedBoxComponent | undefined = undefined> = BaseComponent<((props: (OmitKeys extends Array ? Omit, OmitKeys[number]> : BoxProps) & Props) => React.ReactElement | null)>; type ExtendedFlexProps | undefined = undefined> = BaseComponentProps<(OmitKeys extends string[] ? Omit, OmitKeys[number]> : FlexProps) & Props, T, OmitKeys extends undefined ? [] : OmitKeys>; type ExtendedFlexComponent | undefined = undefined> = BaseComponent<((props: (OmitKeys extends Array ? Omit, OmitKeys[number]> : FlexProps) & Props) => React.ReactElement | null)>; type ExtendedGridProps | undefined = undefined> = BaseComponentProps<(OmitKeys extends string[] ? Omit, OmitKeys[number]> : GridProps) & Props, T, OmitKeys extends undefined ? [] : OmitKeys>; type ExtendedGridComponent | undefined = undefined> = BaseComponent<((props: (OmitKeys extends Array ? Omit, OmitKeys[number]> : GridProps) & Props) => React.ReactElement | null)>; type ExtendedTextProps | undefined = undefined> = BaseComponentProps<(OmitKeys extends string[] ? Omit, OmitKeys[number]> : TextProps) & Props, T, OmitKeys extends undefined ? [] : OmitKeys>; type ExtendedTextComponent | undefined = undefined> = BaseComponent<((props: (OmitKeys extends Array ? Omit, OmitKeys[number]> : TextProps) & Props) => React.ReactElement | null)>; export { BaseComponent, BaseComponentProps, BaseComponentRef, ExtendedBoxComponent, ExtendedBoxProps, ExtendedFlexComponent, ExtendedFlexProps, ExtendedGridComponent, ExtendedGridProps, ExtendedTextComponent, ExtendedTextProps };