UNPKG

react-native-material-elements

Version:

React native material elements is a sophisticated UI library crafted to enhance your React Native development workflow. Designed for simplicity and elegance, nex-ui provides a rich collection of components and utilities to effortlessly create polished mob

246 lines (241 loc) 8.36 kB
import { ButtonGroupProps, DividerColorThemeConfig, DividerProps, IconInputProps, RadioProps, RadioThemeConfig, SwitchProps, SwitchThemeConfig, } from '../../../components'; import { BadgeProps, BadgeVariationThemeConfig, ButtonProps, ButtonVariations, CardHeaderProps, CardProps, CheckBoxProps, CheckBoxVariationThemeConfig, ChipColorThemeConfig, ChipProps, ChipVariant, IconButtonProps, IconButtonVariations, ListItemProps, ListProps, PaginationProps, PaginationThemeConfig, TextFieldProps, TextFiledVariation, TextProps, TextVariationThemeConfig, } from '../../../components/types'; import { initialLightTheme } from './colors'; import { font, fontWeight, latterSpacing, lineHeight, spacing } from './sizes'; import { themeDimensions } from './V2ThemeContext'; /** * Interface representing a set of color shades, typically used for creating gradients or theme variations. * Each key represents a different level of color shade, from lightest (50) to darkest (900). */ export interface ColorShades { 50: string; 100: string; 200: string; 300: string; 400: string; 500: string; 600: string; 700: string; 800: string; 900: string; } /** * Type representing the theme, based on the initial light theme. */ export type Theme = typeof initialLightTheme; /** * Type for valid theme keys, excluding the 'mode' property. * Useful for referring to theme properties like colors, fonts, etc., but not the mode (dark/light). */ export type ThemeKeys = keyof Theme; /** * Type for defining theme-related design dimensions such as fonts, spacing, and line heights. * These properties help maintain consistent spacing and typography throughout the application. */ export type ThemeDimensions = { font: typeof font; spacing: typeof spacing; latterSpacing: typeof latterSpacing; lineHeight: typeof lineHeight; fontWeight: typeof fontWeight; }; /** * Type representing the overall theme structure, including colors and various design metrics. */ export type ThemeType = { colors: Theme & { [index: string]: ColorShades }; } & ThemeDimensions; export type ThemeSpacingType = typeof themeDimensions; /** * A utility type that makes all properties of an object type `T` optional, * while keeping the nested objects partially optional. */ export type InnerPartial<T> = { [K in keyof T]?: T[k] extends object ? Partial<T[K]> : T[K]; }; /** * Type used to create a theme with only the 'colors' property from `ThemeType`, * allowing a minimal theme structure to be defined. */ export type CreateThemeType = Pick<InnerPartial<ThemeType>, 'colors'>; /** * Type used to define theme dimensions when creating a new theme. * This is useful when adjusting spacing, font sizes, and other layout values. */ export type CreateThemeDimensions = InnerPartial<ThemeDimensions>; /** * Type representing the return values for theme dimensions creation, * including both the full dimensions and any partial updates. */ export type CreateThemeDimensionsReturnValues = ThemeDimensions & InnerPartial<ThemeDimensions>; /** * Interface for creating color shades dynamically within the theme, * with support for specifying the theme property name (e.g., 'primary' or 'secondary') for each shade. */ export type CreateColorShadesInterface<T> = { shades: Partial<ColorShades>; themePropertyName: ThemeKeys | T }; type TextFileThemeConfig = Pick< TextFieldProps, | 'animatedDuration' | 'inputStyles' | 'style' | 'hideLabel' | 'activeColor' | 'errorColor' | 'ignoreOpacityOnNonEditable' | 'square' >; type TextFieldVariationConfig = Partial< Record<TextFiledVariation, Pick<TextFileThemeConfig, 'activeColor' | 'errorColor' | 'inputStyles' | 'style'> | undefined> >; type ButtonThemeConfig = Pick< ButtonProps, | 'disableRipple' | 'labelStyles' | 'square' | 'labelColor' | 'baseButtonStyles' | 'disableScaleAnimation' | 'scaleAnimationValue' | 'rippleEdge' | 'baseButtonContainerStyle' | 'rippleProps' | 'style' >; type ButtonVariationConfig = Partial< Record<ButtonVariations, Pick<ButtonThemeConfig, 'labelStyles' | 'baseButtonStyles' | 'style'> | undefined> >; type IconButtonThemeConfig = Pick< IconButtonProps, 'variation' | 'disableRipple' | 'rippleProps' | 'rippleEdge' | 'baseButtonContainerStyle' | 'style' >; type IconButtonVariationsConfig = Partial< Record<IconButtonVariations, Pick<IconButtonThemeConfig, 'style' | 'baseButtonContainerStyle'> | undefined> >; type ChipThemeConfig = Pick<ChipProps, 'chipWrapperContainerStyles' | 'square' | 'labelColor' | 'style'> & ChipColorThemeConfig; type ChipVariationConfig = Partial< Record<ChipVariant, Pick<ChipThemeConfig, 'style' | 'chipWrapperContainerStyles'> | undefined> >; /** * Configuration type for customizing the look and feel of themeable components. * These configurations allow for easy styling adjustments for various components. */ export type ThemeComponentConfig = { textProps: Pick<TextProps, 'gutterBottomSpace' | 'maxLength' | 'errorColor' | 'activeColor' | 'color' | 'style'> & TextVariationThemeConfig; badgeProps: Pick<BadgeProps, 'max' | 'badgeAnimationDuration' | 'anchorOrigin' | 'style'> & BadgeVariationThemeConfig; buttonProps: ButtonThemeConfig & ButtonVariationConfig; iconButtonProps: IconButtonThemeConfig & IconButtonVariationsConfig; buttonGroupProps: Pick<ButtonGroupProps, 'roundSize' | 'borderWidth' | 'disableRipple' | 'baseButtonStyles' | 'style'>; cardProps?: Pick<CardProps, 'style'>; cardHeaderProps?: Pick<CardHeaderProps, 'style'>; checkBoxProps?: Pick< CheckBoxProps, | 'checkBoxColor' | 'checkBoxWrapperStyles' | 'adornmentContainerStyles' | 'labelStyles' | 'subLabelStyles' | 'labelContainerStyles' > & CheckBoxVariationThemeConfig; chipProps?: ChipThemeConfig & ChipVariationConfig; dividerProps?: Pick<DividerProps, 'startLineStyles' | 'endLineStyles' | 'borderColor' | 'gap' | 'variantSpacing' | 'style'> & DividerColorThemeConfig; listProps?: Pick<ListProps, 'subheaderContainerStyles' | 'disablePadding' | 'style'>; listItemProps?: Pick< ListItemProps, | 'listContainerStyles' | 'endAdornmentContainerStyles' | 'startAdornmentContainerStyles' | 'selectedColor' | 'disableBottomSpacing' | 'outlineColor' | 'style' >; paginationProps?: Pick<PaginationProps, 'dotStyles' | 'itemShape' | 'style'> & PaginationThemeConfig; radioProps?: Pick< RadioProps, 'labelContainerStyles' | 'radioItemContainerStyles' | 'baseButtonStyles' | 'sizeConfig' | 'style' > & RadioThemeConfig; switchProps?: Pick< SwitchProps, 'toggleDuration' | 'toggleWrapperBgDuration' | 'wrapperDefaultBgColor' | 'wrapperActiveBgColor' | 'thumbStyles' | 'style' > & SwitchThemeConfig; textFieldProps?: TextFileThemeConfig & TextFieldVariationConfig; iconInputProps?: Pick<IconInputProps, 'inputWrapperStyles' | 'endAdornmentContainerStyles' | 'startAdornmentContainerStyles'>; }; /** * A higher-order type that allows adding component-specific configurations to a given component type. * This ensures that components can receive theme configurations specific to their role. */ export type WithThemeComponentConfig<K extends keyof ThemeComponentConfig, T> = T & { themeComponentConfig?: ThemeComponentConfig[K]; }; export interface ThemeConfigInterface { /** * Component configurations */ components?: InnerPartial<ThemeComponentConfig>; } /** * Interface representing the theme context, including the current theme and a function to change the theme mode. */ export interface ThemeInterface<T> extends ThemeConfigInterface { /** * The current theme, extended with any additional properties */ theme: ThemeType & T; } export interface ThemeProviderProps extends ThemeConfigInterface { /** * Child components to be wrapped by the provider */ children: React.ReactNode; /** * Optional light theme, extended with additional properties */ lightTheme?: Pick<ThemeType, 'colors'>; /** * Optional dark theme, extended with additional properties */ darkTheme?: Pick<ThemeType, 'colors'>; /** * Optional theme dimensions values */ dimensions?: ThemeDimensions; } export type CreateColorShades = ColorShades; export type UseTheme = ThemeInterface<ThemeType>;