rn-variant
Version:
Light-weight, type-safe style variants for React Native.
39 lines (36 loc) • 1.12 kB
text/typescript
import { ViewStyle, TextStyle, ImageStyle } from 'react-native';
type RNStyle = ViewStyle & TextStyle & ImageStyle;
type NamedStyle = {
style: RNStyle;
};
type VariantDefinitions = Record<string, Record<string, Partial<RNStyle>>>;
type CompoundVariant<V extends VariantDefinitions> = {
variants: {
[K in keyof V]?: keyof V[K];
};
style: Partial<RNStyle>;
};
type VariantInput<V extends VariantDefinitions> = {
[K in keyof V]?: V[K] extends {
true: any;
false: any;
} ? boolean : V[K] extends {
true: any;
} ? boolean : V[K] extends {
false: any;
} ? boolean : keyof V[K];
};
declare function createVariantStyles<V extends VariantDefinitions>(config: {
base?: Partial<RNStyle>;
variants: V;
compoundVariants?: CompoundVariant<V>[];
}): {
styles: { [K in keyof V]: { [K2 in keyof V[K]]: NamedStyle; }; };
useVariants: (input: VariantInput<V>) => {
style: RNStyle;
};
};
type InferVariant<T> = T extends {
useVariants: (input: infer I) => any;
} ? I : never;
export { type InferVariant, createVariantStyles };