import type { JSXElementConstructor, ReactElement, ReactNode } from 'react'; export type ReactTag = keyof React.JSX.IntrinsicElements | JSXElementConstructor; export type Expand = T extends infer O ? { [K in keyof O]: O[K]; } : never; export type PropsOf = TTag extends React.ElementType ? Omit, 'ref'> : never; type PropsWeControl = 'as' | 'children' | 'refName' | 'className'; type CleanProps = Omit, TOmittableProps | PropsWeControl>; type OurProps = { as?: TTag; children?: ReactNode | ((bag: TSlot) => ReactElement); refName?: string; }; type HasProperty = T extends never ? never : K extends keyof T ? true : never; type ClassNameOverride = true extends HasProperty, 'className'> ? { className?: PropsOf['className'] | ((bag: TSlot) => string); } : {}; export type Props = CleanProps & OurProps & ClassNameOverride & Overrides; export type EnsureArray = T extends any[] ? T : Expand[]; export {};