import { OmitUndefined, ClassValue, StringToBoolean, ClassProp } from 'tailwind-variants'; import { JSXElementConstructor } from 'react'; import { InternalForwardRefRenderFunction } from './types.mjs'; import '@react-types/shared'; type SlotsClassValue = { [K in keyof S]?: ClassValue; }; type Variants = { [K: string]: {[P: string]: GetSuggestedValues}; }; type ComponentProps = C extends JSXElementConstructor ? P : never; type ComponentSlots = CP extends {classNames?: infer S} ? S : undefined; type ValidateSubtype = OmitUndefined extends U ? "true" : "false"; type GetSuggestedValues = ClassValue | (S extends undefined ? never : SlotsClassValue); type SuggestedVariants = { [K in Exclude]?: ValidateSubtype< CP[K], string > extends "true" ? {[K2 in CP[K]]?: GetSuggestedValues} : ValidateSubtype extends "true" ? {true?: GetSuggestedValues; false?: GetSuggestedValues} : never; }; type ComposeVariants = SuggestedVariants | Variants; type VariantValue = { [K in keyof V | keyof SV]?: | (K extends keyof V ? StringToBoolean : never) | (K extends keyof V ? StringToBoolean[] : never) | (K extends keyof SV ? ValidateSubtype extends "true" ? keyof OmitUndefined : never : never); }; type DefaultVariants = VariantValue & { classNames?: S extends undefined ? never : SlotsClassValue; }; type CompoundVariants = Array & ClassProp>>; type Options = { /** * Whether to merge the class names with `tailwind-merge` library. * It avoids to have duplicate tailwind classes. (Recommended) * @see https://github.com/dcastil/tailwind-merge/blob/v1.8.1/README.md * @default true */ twMerge?: boolean; /** * The config object for `tailwind-merge` library. * @see https://github.com/dcastil/tailwind-merge/blob/v1.8.1/docs/configuration.md */ twMergeConfig?: any; }; type ExtendVariantProps = { variants?: Record>; defaultVariants?: Record; compoundVariants?: Array>>; }; type ExtendVariantWithSlotsProps = { slots?: Record; variants?: Record>>; defaultVariants?: Record>; compoundVariants?: Array>>; }; type ExtendVariants = < C extends keyof JSX.IntrinsicElements | JSXElementConstructor, CP extends ComponentProps = ComponentProps, S extends ComponentSlots = ComponentSlots, V extends ComposeVariants = ComposeVariants, SV extends SuggestedVariants = SuggestedVariants, DV extends DefaultVariants = DefaultVariants, CV extends CompoundVariants> = CompoundVariants< V, SV, ComponentSlots >, >( BaseComponent: C, styles: { variants?: V; defaultVariants?: DV; compoundVariants?: CV; slots?: S; }, opts?: Options, ) => InternalForwardRefRenderFunction< C, { [K in Exclude]?: | (K extends keyof CP ? CP[K] : never) | (K extends keyof V ? StringToBoolean> : never); } >; // main function declare const extendVariants: ExtendVariants; export { type ExtendVariantProps, type ExtendVariantWithSlotsProps, type ExtendVariants, extendVariants };