react-native
Version:
A framework for building native apps using React
574 lines (521 loc) • 16.2 kB
TypeScript
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {Animated} from '../Animated/Animated';
import {ImageResizeMode} from '../Image/ImageResizeMode';
import {ColorValue} from './StyleSheet';
type FlexAlignType =
| 'flex-start'
| 'flex-end'
| 'center'
| 'stretch'
| 'baseline';
export type DimensionValue =
| number
| 'auto'
| `${number}%`
| Animated.AnimatedNode
| null;
type AnimatableNumericValue = number | Animated.AnimatedNode;
type AnimatableStringValue = string | Animated.AnimatedNode;
export type CursorValue = 'auto' | 'pointer';
/**
* Flex Prop Types
* @see https://reactnative.dev/docs/flexbox
* @see https://reactnative.dev/docs/layout-props
*/
export interface FlexStyle {
alignContent?:
| 'flex-start'
| 'flex-end'
| 'center'
| 'stretch'
| 'space-between'
| 'space-around'
| 'space-evenly'
| undefined;
alignItems?: FlexAlignType | undefined;
alignSelf?: 'auto' | FlexAlignType | undefined;
aspectRatio?: number | string | undefined;
borderBottomWidth?: number | undefined;
borderEndWidth?: number | undefined;
borderLeftWidth?: number | undefined;
borderRightWidth?: number | undefined;
borderStartWidth?: number | undefined;
borderTopWidth?: number | undefined;
borderWidth?: number | undefined;
bottom?: DimensionValue | undefined;
boxSizing?: 'border-box' | 'content-box' | undefined;
display?: 'none' | 'flex' | 'contents' | undefined;
end?: DimensionValue | undefined;
flex?: number | undefined;
flexBasis?: DimensionValue | undefined;
flexDirection?:
| 'row'
| 'column'
| 'row-reverse'
| 'column-reverse'
| undefined;
rowGap?: number | string | undefined;
gap?: number | string | undefined;
columnGap?: number | string | undefined;
flexGrow?: number | undefined;
flexShrink?: number | undefined;
flexWrap?: 'wrap' | 'nowrap' | 'wrap-reverse' | undefined;
height?: DimensionValue | undefined;
justifyContent?:
| 'flex-start'
| 'flex-end'
| 'center'
| 'space-between'
| 'space-around'
| 'space-evenly'
| undefined;
left?: DimensionValue | undefined;
margin?: DimensionValue | undefined;
marginBottom?: DimensionValue | undefined;
marginEnd?: DimensionValue | undefined;
marginHorizontal?: DimensionValue | undefined;
marginLeft?: DimensionValue | undefined;
marginRight?: DimensionValue | undefined;
marginStart?: DimensionValue | undefined;
marginTop?: DimensionValue | undefined;
marginVertical?: DimensionValue | undefined;
maxHeight?: DimensionValue | undefined;
maxWidth?: DimensionValue | undefined;
minHeight?: DimensionValue | undefined;
minWidth?: DimensionValue | undefined;
overflow?: 'visible' | 'hidden' | 'scroll' | undefined;
padding?: DimensionValue | undefined;
paddingBottom?: DimensionValue | undefined;
paddingEnd?: DimensionValue | undefined;
paddingHorizontal?: DimensionValue | undefined;
paddingLeft?: DimensionValue | undefined;
paddingRight?: DimensionValue | undefined;
paddingStart?: DimensionValue | undefined;
paddingTop?: DimensionValue | undefined;
paddingVertical?: DimensionValue | undefined;
position?: 'absolute' | 'relative' | 'static' | undefined;
right?: DimensionValue | undefined;
start?: DimensionValue | undefined;
top?: DimensionValue | undefined;
width?: DimensionValue | undefined;
zIndex?: number | undefined;
direction?: 'inherit' | 'ltr' | 'rtl' | undefined;
/**
* Equivalent to `top`, `bottom`, `right` and `left`
*/
inset?: DimensionValue | undefined;
/**
* Equivalent to `top`, `bottom`
*/
insetBlock?: DimensionValue | undefined;
/**
* Equivalent to `bottom`
*/
insetBlockEnd?: DimensionValue | undefined;
/**
* Equivalent to `top`
*/
insetBlockStart?: DimensionValue | undefined;
/**
* Equivalent to `right` and `left`
*/
insetInline?: DimensionValue | undefined;
/**
* Equivalent to `right` or `left`
*/
insetInlineEnd?: DimensionValue | undefined;
/**
* Equivalent to `right` or `left`
*/
insetInlineStart?: DimensionValue | undefined;
/**
* Equivalent to `marginVertical`
*/
marginBlock?: DimensionValue | undefined;
/**
* Equivalent to `marginBottom`
*/
marginBlockEnd?: DimensionValue | undefined;
/**
* Equivalent to `marginTop`
*/
marginBlockStart?: DimensionValue | undefined;
/**
* Equivalent to `marginHorizontal`
*/
marginInline?: DimensionValue | undefined;
/**
* Equivalent to `marginEnd`
*/
marginInlineEnd?: DimensionValue | undefined;
/**
* Equivalent to `marginStart`
*/
marginInlineStart?: DimensionValue | undefined;
/**
* Equivalent to `paddingVertical`
*/
paddingBlock?: DimensionValue | undefined;
/**
* Equivalent to `paddingBottom`
*/
paddingBlockEnd?: DimensionValue | undefined;
/**
* Equivalent to `paddingTop`
*/
paddingBlockStart?: DimensionValue | undefined;
/**
* Equivalent to `paddingHorizontal`
*/
paddingInline?: DimensionValue | undefined;
/**
* Equivalent to `paddingEnd`
*/
paddingInlineEnd?: DimensionValue | undefined;
/**
* Equivalent to `paddingStart`
*/
paddingInlineStart?: DimensionValue | undefined;
}
export interface ShadowStyleIOS {
shadowColor?: ColorValue | undefined;
shadowOffset?: Readonly<{width: number; height: number}> | undefined;
shadowOpacity?: AnimatableNumericValue | undefined;
shadowRadius?: number | undefined;
}
interface PerspectiveTransform {
perspective: AnimatableNumericValue;
}
interface RotateTransform {
rotate: AnimatableStringValue;
}
interface RotateXTransform {
rotateX: AnimatableStringValue;
}
interface RotateYTransform {
rotateY: AnimatableStringValue;
}
interface RotateZTransform {
rotateZ: AnimatableStringValue;
}
interface ScaleTransform {
scale: AnimatableNumericValue;
}
interface ScaleXTransform {
scaleX: AnimatableNumericValue;
}
interface ScaleYTransform {
scaleY: AnimatableNumericValue;
}
interface TranslateXTransform {
translateX: AnimatableNumericValue | `${number}%`;
}
interface TranslateYTransform {
translateY: AnimatableNumericValue | `${number}%`;
}
interface SkewXTransform {
skewX: AnimatableStringValue;
}
interface SkewYTransform {
skewY: AnimatableStringValue;
}
interface MatrixTransform {
matrix: AnimatableNumericValue[];
}
type MaximumOneOf<T, K extends keyof T = keyof T> = K extends keyof T
? {[P in K]: T[K]} & {[P in Exclude<keyof T, K>]?: never}
: never;
export interface TransformsStyle {
transform?:
| Readonly<
MaximumOneOf<
PerspectiveTransform &
RotateTransform &
RotateXTransform &
RotateYTransform &
RotateZTransform &
ScaleTransform &
ScaleXTransform &
ScaleYTransform &
TranslateXTransform &
TranslateYTransform &
SkewXTransform &
SkewYTransform &
MatrixTransform
>[]
>
| string
| undefined;
transformOrigin?: Array<string | number> | string | undefined;
/**
* @deprecated Use matrix in transform prop instead.
*/
transformMatrix?: Array<number> | undefined;
/**
* @deprecated Use rotate in transform prop instead.
*/
rotation?: AnimatableNumericValue | undefined;
/**
* @deprecated Use scaleX in transform prop instead.
*/
scaleX?: AnimatableNumericValue | undefined;
/**
* @deprecated Use scaleY in transform prop instead.
*/
scaleY?: AnimatableNumericValue | undefined;
/**
* @deprecated Use translateX in transform prop instead.
*/
translateX?: AnimatableNumericValue | undefined;
/**
* @deprecated Use translateY in transform prop instead.
*/
translateY?: AnimatableNumericValue | undefined;
}
export type FilterFunction =
| {brightness: number | string}
| {blur: number | string}
| {contrast: number | string}
| {grayscale: number | string}
| {hueRotate: number | string}
| {invert: number | string}
| {opacity: number | string}
| {saturate: number | string}
| {sepia: number | string}
| {dropShadow: DropShadowValue | string};
export type DropShadowValue = {
offsetX: number | string;
offsetY: number | string;
standardDeviation?: number | string | undefined;
color?: ColorValue | number | undefined;
};
export type BoxShadowValue = {
offsetX: number | string;
offsetY: number | string;
color?: string | undefined;
blurRadius?: ColorValue | number | undefined;
spreadDistance?: number | string | undefined;
inset?: boolean | undefined;
};
export type BlendMode =
| 'normal'
| 'multiply'
| 'screen'
| 'overlay'
| 'darken'
| 'lighten'
| 'color-dodge'
| 'color-burn'
| 'hard-light'
| 'soft-light'
| 'difference'
| 'exclusion'
| 'hue'
| 'saturation'
| 'color'
| 'luminosity';
export type GradientValue = {
type: 'linearGradient';
// Angle or direction enums
direction?: string | undefined;
colorStops: ReadonlyArray<{
color: ColorValue | null;
positions?: ReadonlyArray<string[]> | undefined;
}>;
};
/**
* @see https://reactnative.dev/docs/view#style
*/
export interface ViewStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
backfaceVisibility?: 'visible' | 'hidden' | undefined;
backgroundColor?: ColorValue | undefined;
borderBlockColor?: ColorValue | undefined;
borderBlockEndColor?: ColorValue | undefined;
borderBlockStartColor?: ColorValue | undefined;
borderBottomColor?: ColorValue | undefined;
borderBottomEndRadius?: AnimatableNumericValue | string | undefined;
borderBottomLeftRadius?: AnimatableNumericValue | string | undefined;
borderBottomRightRadius?: AnimatableNumericValue | string | undefined;
borderBottomStartRadius?: AnimatableNumericValue | string | undefined;
borderColor?: ColorValue | undefined;
/**
* On iOS 13+, it is possible to change the corner curve of borders.
* @platform ios
*/
borderCurve?: 'circular' | 'continuous' | undefined;
borderEndColor?: ColorValue | undefined;
borderEndEndRadius?: AnimatableNumericValue | string | undefined;
borderEndStartRadius?: AnimatableNumericValue | string | undefined;
borderLeftColor?: ColorValue | undefined;
borderRadius?: AnimatableNumericValue | string | undefined;
borderRightColor?: ColorValue | undefined;
borderStartColor?: ColorValue | undefined;
borderStartEndRadius?: AnimatableNumericValue | string | undefined;
borderStartStartRadius?: AnimatableNumericValue | string | undefined;
borderStyle?: 'solid' | 'dotted' | 'dashed' | undefined;
borderTopColor?: ColorValue | undefined;
borderTopEndRadius?: AnimatableNumericValue | string | undefined;
borderTopLeftRadius?: AnimatableNumericValue | string | undefined;
borderTopRightRadius?: AnimatableNumericValue | string | undefined;
borderTopStartRadius?: AnimatableNumericValue | string | undefined;
outlineColor?: ColorValue | undefined;
outlineOffset?: AnimatableNumericValue | undefined;
outlineStyle?: 'solid' | 'dotted' | 'dashed' | undefined;
outlineWidth?: AnimatableNumericValue | undefined;
opacity?: AnimatableNumericValue | undefined;
/**
* Sets the elevation of a view, using Android's underlying
* [elevation API](https://developer.android.com/training/material/shadows-clipping.html#Elevation).
* This adds a drop shadow to the item and affects z-order for overlapping views.
* Only supported on Android 5.0+, has no effect on earlier versions.
*
* @platform android
*/
elevation?: number | undefined;
/**
* Controls whether the View can be the target of touch events.
*/
pointerEvents?: 'box-none' | 'none' | 'box-only' | 'auto' | undefined;
isolation?: 'auto' | 'isolate' | undefined;
cursor?: CursorValue | undefined;
boxShadow?: ReadonlyArray<BoxShadowValue> | string | undefined;
filter?: ReadonlyArray<FilterFunction> | string | undefined;
mixBlendMode?: BlendMode | undefined;
experimental_backgroundImage?:
| ReadonlyArray<GradientValue>
| string
| undefined;
}
export type FontVariant =
| 'small-caps'
| 'oldstyle-nums'
| 'lining-nums'
| 'tabular-nums'
| 'common-ligatures'
| 'no-common-ligatures'
| 'discretionary-ligatures'
| 'no-discretionary-ligatures'
| 'historical-ligatures'
| 'no-historical-ligatures'
| 'contextual'
| 'no-contextual'
| 'proportional-nums'
| 'stylistic-one'
| 'stylistic-two'
| 'stylistic-three'
| 'stylistic-four'
| 'stylistic-five'
| 'stylistic-six'
| 'stylistic-seven'
| 'stylistic-eight'
| 'stylistic-nine'
| 'stylistic-ten'
| 'stylistic-eleven'
| 'stylistic-twelve'
| 'stylistic-thirteen'
| 'stylistic-fourteen'
| 'stylistic-fifteen'
| 'stylistic-sixteen'
| 'stylistic-seventeen'
| 'stylistic-eighteen'
| 'stylistic-nineteen'
| 'stylistic-twenty';
export interface TextStyleIOS extends ViewStyle {
fontVariant?: FontVariant[] | undefined;
textDecorationColor?: ColorValue | undefined;
textDecorationStyle?: 'solid' | 'double' | 'dotted' | 'dashed' | undefined;
writingDirection?: 'auto' | 'ltr' | 'rtl' | undefined;
}
export interface TextStyleAndroid extends ViewStyle {
textAlignVertical?: 'auto' | 'top' | 'bottom' | 'center' | undefined;
verticalAlign?: 'auto' | 'top' | 'bottom' | 'middle' | undefined;
includeFontPadding?: boolean | undefined;
}
// @see https://reactnative.dev/docs/text#style
export interface TextStyle extends TextStyleIOS, TextStyleAndroid, ViewStyle {
color?: ColorValue | undefined;
fontFamily?: string | undefined;
fontSize?: number | undefined;
fontStyle?: 'normal' | 'italic' | undefined;
/**
* Specifies font weight. The values 'normal' and 'bold' are supported
* for most fonts. Not all fonts have a variant for each of the numeric
* values, in that case the closest one is chosen.
*/
fontWeight?:
| 'normal'
| 'bold'
| '100'
| '200'
| '300'
| '400'
| '500'
| '600'
| '700'
| '800'
| '900'
| 100
| 200
| 300
| 400
| 500
| 600
| 700
| 800
| 900
| 'ultralight'
| 'thin'
| 'light'
| 'medium'
| 'regular'
| 'semibold'
| 'condensedBold'
| 'condensed'
| 'heavy'
| 'black'
| undefined;
letterSpacing?: number | undefined;
lineHeight?: number | undefined;
textAlign?: 'auto' | 'left' | 'right' | 'center' | 'justify' | undefined;
textDecorationLine?:
| 'none'
| 'underline'
| 'line-through'
| 'underline line-through'
| undefined;
textDecorationStyle?: 'solid' | 'double' | 'dotted' | 'dashed' | undefined;
textDecorationColor?: ColorValue | undefined;
textShadowColor?: ColorValue | undefined;
textShadowOffset?: {width: number; height: number} | undefined;
textShadowRadius?: number | undefined;
textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase' | undefined;
userSelect?: 'auto' | 'none' | 'text' | 'contain' | 'all' | undefined;
}
/**
* Image style
* @see https://reactnative.dev/docs/image#style
*/
export interface ImageStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
resizeMode?: ImageResizeMode | undefined;
backfaceVisibility?: 'visible' | 'hidden' | undefined;
borderBottomLeftRadius?: AnimatableNumericValue | string | undefined;
borderBottomRightRadius?: AnimatableNumericValue | string | undefined;
backgroundColor?: ColorValue | undefined;
borderColor?: ColorValue | undefined;
borderRadius?: AnimatableNumericValue | string | undefined;
borderTopLeftRadius?: AnimatableNumericValue | string | undefined;
borderTopRightRadius?: AnimatableNumericValue | string | undefined;
overflow?: 'visible' | 'hidden' | undefined;
overlayColor?: ColorValue | undefined;
tintColor?: ColorValue | undefined;
opacity?: AnimatableNumericValue | undefined;
objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none' | undefined;
cursor?: CursorValue | undefined;
}