css-variants
Version:
A lightweight, flexible API for managing CSS class variants.
50 lines (49 loc) • 1.92 kB
TypeScript
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;