UNPKG

react-classnaming

Version:

Tools to establish CSS classes as an explicit abstraction layer and to handle it as an interface between React and CSSStyleDeclaration

64 lines (63 loc) 2.73 kB
import type { Ever, EmptyObject } from "./ts-swiss.types"; import type { GetProps } from "./react-swiss.types"; import type { ClassNamesCombiner, ReactRelated, GetClassNames, CssModule, ClassHash } from "./definitions.types"; export type { ClassHash } from "./definitions.types"; /** Collects required `classnames` from used sub-Components * @example * ```typescript * type Props = ClassNames<true> // {className: string} * type Props = ClassNames<Props> // {classnames: Props["classnames"]} * type Props = ClassNames<typeof Component> * type Props = ClassNames<true, Props, typeof ClassComponent, typeof FunctionalComponent> * ``` */ export declare type ClassNames<C0 extends true | ReactRelated, C1 extends ReactRelated = never, C2 extends ReactRelated = never, C3 extends ReactRelated = never, C4 extends ReactRelated = never, C5 extends ReactRelated = never, C6 extends ReactRelated = never, C7 extends ReactRelated = never, C8 extends ReactRelated = never, C9 extends ReactRelated = never, C10 extends ReactRelated = never> = Ever<Extract<C0, true>, ClassNamed> & ClassNamesCombiner<Ever<Extract<C0, ReactRelated>, ClassNamesFrom<Extract<C0, ReactRelated>>> & Ever<C1, ClassNamesFrom<C1>> & Ever<C2, ClassNamesFrom<C2>> & Ever<C3, ClassNamesFrom<C3>> & Ever<C4, ClassNamesFrom<C4>> & Ever<C5, ClassNamesFrom<C5>> & Ever<C6, ClassNamesFrom<C6>> & Ever<C7, ClassNamesFrom<C7>> & Ever<C8, ClassNamesFrom<C8>> & Ever<C9, ClassNamesFrom<C9>> & Ever<C10, ClassNamesFrom<C10>>>; /** Declaration of self Component's `classnames` * @example * ```typescript * type MyClasses = ClassNamesProperty<{ * class1: ClassHash * class2: ClassHash * }> * * type MyProps = ClassNamesProperty< * typeof some_module_css, * {class1: ClassHash, class2: ClassHash} * > * ``` */ export declare type ClassNamesProperty<C extends CssModule, T extends { [K in keyof C]?: ClassHash; } & { [K in Exclude<keyof T, keyof C>]: never; } = C & EmptyObject> = { classnames: { [K in keyof T & keyof C]: ClassHash; }; }; /** Shortcut to require property `className` */ export declare type ClassNamed = { className: string; }; /** * Obtain `classnames`-object from `props` of functional component, class component or props type * @example * ```typescript * ClassNamesFrom<ComponentProps>; * ClassNamesFrom<typeof Component>; * ``` */ export declare type ClassNamesFrom<C extends ReactRelated> = GetClassNames<GetProps<C>, EmptyObject, EmptyObject>; /** * @example * ```typescript * const {primitive, array, object} = {} as Undefined<{ * primitive: any * array: any[] * object: {} * }> * ``` */ export declare type Undefineds<M> = { [K in keyof M]: undefined; };