import type { ClassValue, TransformKey, ItFn, RestrictedVariantsKey, KlassFn } from ".";
type StrictSlotsVariantsSchema<B extends string, E extends string = RestrictedVariantsKey> = {
    [variant: string]: {
        [type: string]: {
            [key in B]?: ClassValue;
        };
    };
} & {
    [variant in E]?: undefined;
};
type ToVariantsSchema<B extends string, T extends StrictSlotsVariantsSchema<B>> = {
    [variant in keyof Omit<T, RestrictedVariantsKey>]: {
        [type in keyof Omit<T, RestrictedVariantsKey>[variant]]: ClassValue;
    };
};
type SlotsCompoundVariant<B extends string, T extends StrictSlotsVariantsSchema<B>> = Omit<{
    [K in keyof ToVariantsSchema<B, T>]?: TransformKey<keyof ToVariantsSchema<B, T>[K]>;
}, RestrictedVariantsKey> & {
    class: {
        [key in B]?: ClassValue;
    };
};
type SlotsOptions<B extends string, T extends StrictSlotsVariantsSchema<B>> = {
    base: {
        [key in B]: ClassValue;
    };
    variants: T;
    defaultVariants?: {
        [K in keyof T]?: TransformKey<keyof T[K]>;
    };
    compoundVariants?: SlotsCompoundVariant<B, T>[];
};
type KlassOnlyFn<B extends string, T extends StrictSlotsVariantsSchema<B>> = (props?: {
    [K in keyof T]?: TransformKey<keyof T[K]>;
}, classes?: ClassValue) => string;
type SlotsFn<B extends string, T extends StrictSlotsVariantsSchema<B>> = {
    (props?: {
        [K in keyof T]?: TransformKey<keyof T[K]>;
    }): {
        [key in B]: KlassOnlyFn<B, T>;
    };
} & {
    /**
     * options
     */
    o: SlotsOptions<B, T>;
    /**
     * klasses
     */
    klass: {
        [key in B]: KlassFn<ToVariantsSchema<B, T>>;
    };
};
/**
 *
 * @param options slots options
 * @param config additional config
 * @returns slots function
 *
 * @see {@link https://klass.pages.dev/klass/core.html#slots | slots}
 */
declare const slots: <B extends string, T extends StrictSlotsVariantsSchema<B, "class">>(options: SlotsOptions<B, T>, config?: {
    it?: ItFn;
}) => SlotsFn<B, T>;
export type { StrictSlotsVariantsSchema, SlotsCompoundVariant, SlotsOptions, SlotsFn };
export default slots;
