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
TypeScript
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;
};