export type ClassValue = string | false | null | undefined | 0 | 0n | readonly ClassValue[]; export type ClassProps = | { class?: ClassValue; className?: never } | { class?: never; className?: ClassValue }; export interface Options { twMerge: (...classes: ClassValue[]) => string; } export type Conditions = { readonly [key: string]: ClassValue | Conditions }; export type UntypedScheme = { $base?: ClassValue; $default?: ClassValue | UntypedScheme; class?: never; className?: never; } & Conditions; type Keys = T extends unknown ? keyof T : never; type Value = T extends unknown ? K extends keyof T ? Exclude : never : never; type RequiredKeys = T extends unknown ? { [K in keyof T]-?: undefined extends T[K] ? never : K }[keyof T] : never; type Simplify = { [K in keyof T]: T[K] }; type IsBooleanKey = K extends `${'is' | 'allows'}${infer First}${infer _Rest}` ? First extends '' ? false : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' extends `${string}${First}${string}` ? true : false : false; type Condition>> = IsBooleanKey extends true ? [V] extends [boolean] ? ClassValue | Scheme

: never : [V] extends [string] ? { [Choice in Extract]?: ClassValue | Scheme

} & { $default?: ClassValue | Scheme

; } : never; export type Scheme

= Simplify< { $base?: ClassValue; $default?: ClassValue | Scheme

; class?: never; className?: never; } & { [K in Exclude & string, '$base' | '$default' | 'class' | 'className'>]?: Condition< P, K >; } >; type Normalize = P extends unknown ? Simplify< { [K in RequiredKeys

]: P[K] } & { [K in Exclude>]?: P[K]; } & { [K in Exclude, keyof P>]?: never } > : never; export type Style

= [RequiredKeys

] extends [never] ? (props?: Normalize

& ClassProps) => string : (props: Normalize

& ClassProps) => string; export type AnyStyle = (props: never) => string; export type StyleArguments = { [K in keyof F]: Parameters extends [props?: object | undefined] ? F[K] : never; }; type WithoutClasses

= P extends unknown ? Omit, 'class' | 'className'> : never; type StyleProps = Parameters extends [] ? object : WithoutClasses[0]>>; type Combine = Simplify< { [K in RequiredKeys]: Value } & { [K in Exclude, RequiredKeys>]?: Value; } >; type CombinePair = A extends unknown ? (B extends unknown ? Combine : never) : never; export type CombinedProps = F extends readonly [ infer Head extends AnyStyle, ...infer Tail extends AnyStyle[], ] ? CombinePair, CombinedProps> : number extends F['length'] ? Combine> : object;