UNPKG

css-variants

Version:

A lightweight, flexible API for managing CSS class variants.

50 lines (49 loc) 1.92 kB
import { ObjectKeyPicker, ObjectKeyArrayPicker } from './utils/types'; import { cx, ClassValue } from './cx'; export type ClassVariantRecord = Record<string, Record<string, ClassValue>>; export type ClassVariantExtendProps = { className: ClassValue; }; export interface ClassVariantDefinition<T extends ClassVariantRecord | undefined> { base?: ClassValue; variants?: T; compoundVariants?: (ObjectKeyArrayPicker<T> & ClassVariantExtendProps)[]; defaultVariants?: ObjectKeyPicker<T>; classNameResolver?: typeof cx; } export type ClassVariantFnProps<T extends ClassVariantRecord | undefined> = T extends undefined ? Partial<ClassVariantExtendProps> : ObjectKeyPicker<T> & Partial<ClassVariantExtendProps>; export type ClassVariantFn<T extends ClassVariantRecord | undefined> = (props?: ClassVariantFnProps<T>) => string; export type ClassVariantCreatorFn = <T extends ClassVariantRecord | undefined>(config: ClassVariantDefinition<T>) => ClassVariantFn<T>; /** * Creates a class variant function that combines base classes, variants, compound variants, and default variants. * * @template T - Type of the variant record * @param config - Configuration object for creating class variants * @returns A function that accepts variant props and returns a combined class string * * @example * ```typescript * const button = cv({ * base: 'px-4 py-2 rounded', * variants: { * color: { * primary: 'bg-blue-500 text-white', * secondary: 'bg-gray-500 text-white' * }, * size: { * sm: 'text-sm', * lg: 'text-lg' * } * }, * defaultVariants: { * color: 'primary', * size: 'sm' * } * }); * * button(); // => 'px-4 py-2 rounded bg-blue-500 text-white text-sm' * button({ color: 'secondary' }); // => 'px-4 py-2 rounded bg-gray-500 text-white text-sm' * ``` */ export declare const cv: ClassVariantCreatorFn; export default cv;