id
text-style-props
title
Text Style Props
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import constants from '@site/core/TabsConstants';
import {useState} from 'react';
import {
FlatList,
Platform,
ScrollView,
StyleSheet,
Switch,
Text,
TouchableWithoutFeedback,
View,
} from 'react-native';
import Slider from '@react-native-community/slider';
import {SafeAreaView, SafeAreaProvider} from 'react-native-safe-area-context';
const fontStyles = ['normal', 'italic'];
const fontVariants = [
undefined,
'small-caps',
'oldstyle-nums',
'lining-nums',
'tabular-nums',
'proportional-nums',
];
const fontWeights = [
'normal',
'bold',
'100',
'200',
'300',
'400',
'500',
'600',
'700',
'800',
'900',
];
const textAlignments = ['auto', 'left', 'right', 'center', 'justify'];
const textDecorationLines = [
'none',
'underline',
'line-through',
'underline line-through',
];
const textDecorationStyles = ['solid', 'double', 'dotted', 'dashed'];
const textTransformations = ['none', 'uppercase', 'lowercase', 'capitalize'];
const textAlignmentsVertical = ['auto', 'top', 'bottom', 'center'];
const writingDirections = ['auto', 'ltr', 'rtl'];
const App = () => {
const [fontSize, setFontSize] = useState(20);
const [fontStyleIdx, setFontStyleIdx] = useState(0);
const [fontWeightIdx, setFontWeightIdx] = useState(0);
const [lineHeight, setLineHeight] = useState(24);
const [textAlignIdx, setTextAlignIdx] = useState(0);
const [textDecorationLineIdx, setTextDecorationLineIdx] = useState(0);
const [includeFontPadding, setIncludeFontPadding] = useState(false);
const [textVerticalAlignIdx, setTextVerticalAlignIdx] = useState(0);
const [fontVariantIdx, setFontVariantIdx] = useState(0);
const [letterSpacing, setLetterSpacing] = useState(0);
const [textDecorationStyleIdx, setTextDecorationStyleIdx] = useState(0);
const [textTransformIdx, setTextTransformIdx] = useState(0);
const [writingDirectionIdx, setWritingDirectionIdx] = useState(0);
const [textShadowRadius, setTextShadowRadius] = useState(0);
const [textShadowOffset, setTextShadowOffset] = useState({
height: 0,
width: 0,
});
const [, ...validFontVariants] = fontVariants;
return (
<SafeAreaProvider>
<SafeAreaView style={styles.container}>
<View style={styles.pargraphWrapper}>
<Text
style={[
styles.paragraph,
{
fontSize,
fontStyle: fontStyles[fontStyleIdx],
fontWeight: fontWeights[fontWeightIdx],
lineHeight,
textAlign: textAlignments[textAlignIdx],
textDecorationLine: textDecorationLines[textDecorationLineIdx],
textTransform: textTransformations[textTransformIdx],
textAlignVertical: textAlignmentsVertical[textVerticalAlignIdx],
fontVariant:
fontVariantIdx === 0
? undefined
: [validFontVariants[fontVariantIdx - 1]],
letterSpacing,
includeFontPadding,
textDecorationStyle:
textDecorationStyles[textDecorationStyleIdx],
writingDirection: writingDirections[writingDirectionIdx],
textShadowOffset,
textShadowRadius,
},
]}>
Lorem Ipsum is simply dummy text of the printing and typesetting
industry. 112 Likes
</Text>
</View>
<ScrollView style={{padding: 12}}>
<View>
<Text>Common platform properties</Text>
<CustomSlider
label="Text Shadow Offset - Height"
value={textShadowOffset.height}
minimumValue={-40}
maximumValue={40}
handleValueChange={val =>
setTextShadowOffset(prev => ({...prev, height: val}))
}
/>
<CustomSlider
label="Text Shadow Offset - Width"
value={textShadowOffset.width}
minimumValue={-40}
maximumValue={40}
handleValueChange={val =>
setTextShadowOffset(prev => ({...prev, width: val}))
}
/>
<CustomSlider
label="Font Size"
value={fontSize}
maximumValue={40}
handleValueChange={setFontSize}
/>
<CustomPicker
label="Font Style"
data={fontStyles}
currentIndex={fontStyleIdx}
onSelected={setFontStyleIdx}
/>
<CustomPicker
label="Font Weight"
data={fontWeights}
currentIndex={fontWeightIdx}
onSelected={setFontWeightIdx}
/>
<CustomSlider
label="Line Height"
value={lineHeight}
minimumValue={10}
maximumValue={50}
handleValueChange={setLineHeight}
/>
<CustomPicker
label="Text Align"
data={textAlignments}
currentIndex={textAlignIdx}
onSelected={setTextAlignIdx}
/>
<CustomPicker
label="Text Decoration Line"
data={textDecorationLines}
currentIndex={textDecorationLineIdx}
onSelected={setTextDecorationLineIdx}
/>
<CustomSlider
label="Text Shadow Radius"
value={textShadowRadius}
handleValueChange={setTextShadowRadius}
/>
<CustomPicker
label="Font Variant"
data={fontVariants}
currentIndex={fontVariantIdx}
onSelected={setFontVariantIdx}
/>
<CustomSlider
label="Letter Spacing"
step={0.1}
value={letterSpacing}
handleValueChange={setLetterSpacing}
/>
<CustomPicker
label="Text Transform"
data={textTransformations}
currentIndex={textTransformIdx}
onSelected={setTextTransformIdx}
/>
</View>
{Platform.OS === 'android' && (
<View style={styles.platformContainer}>
<Text style={styles.platformContainerTitle}>
Android only properties
</Text>
<CustomPicker
label="Text Vertical Align"
data={textAlignmentsVertical}
currentIndex={textVerticalAlignIdx}
onSelected={setTextVerticalAlignIdx}
/>
<CustomSwitch
label="Include Font Padding"
handleValueChange={setIncludeFontPadding}
value={includeFontPadding}
/>
</View>
)}
{Platform.OS === 'ios' && (
<View style={styles.platformContainer}>
<Text style={styles.platformContainerTitle}>
iOS only properties
</Text>
<CustomPicker
label="Text Decoration Style"
data={textDecorationStyles}
currentIndex={textDecorationStyleIdx}
onSelected={setTextDecorationStyleIdx}
/>
<CustomPicker
label="Writing Direction"
data={writingDirections}
currentIndex={writingDirectionIdx}
onSelected={setWritingDirectionIdx}
/>
</View>
)}
</ScrollView>
</SafeAreaView>
</SafeAreaProvider>
);
};
const CustomSwitch = ({label, handleValueChange, value}) => {
return (
<>
<Text style={styles.title}>{label}</Text>
<View style={{alignItems: 'flex-start'}}>
<Switch
trackColor={{false: '#767577', true: '#DAA520'}}
thumbColor={value ? '#DAA520' : '#f4f3f4'}
onValueChange={handleValueChange}
value={value}
/>
</View>
</>
);
};
const CustomSlider = ({
label,
handleValueChange,
step = 1,
minimumValue = 0,
maximumValue = 10,
value,
}) => {
return (
<>
{label && (
<Text style={styles.title}>{`${label} (${value.toFixed(2)})`}</Text>
)}
<View style={styles.wrapperHorizontal}>
<Slider
thumbTintColor="#06bcee"
minimumTrackTintColor="#64d7ffbb"
minimumValue={minimumValue}
maximumValue={maximumValue}
step={step}
onValueChange={handleValueChange}
value={value}
/>
</View>
</>
);
};
const CustomPicker = ({label, data, currentIndex, onSelected}) => {
return (
<>
<Text style={styles.title}>{label}</Text>
<View style={styles.wrapperHorizontal}>
<FlatList
bounces
horizontal
data={data}
keyExtractor={item => String(item)}
renderItem={({item, index}) => {
const selected = index === currentIndex;
return (
<TouchableWithoutFeedback onPress={() => onSelected(index)}>
<View
style={[
styles.itemStyleHorizontal,
selected && styles.itemSelectedStyleHorizontal,
]}>
<Text
style={{
textAlign: 'center',
color: selected ? 'black' : 'grey',
fontWeight: selected ? 'bold' : 'normal',
}}>
{item + ''}
</Text>
</View>
</TouchableWithoutFeedback>
);
}}
/>
</View>
</>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
pargraphWrapper: {
backgroundColor: 'black',
},
paragraph: {
color: '#fff',
textDecorationColor: 'yellow',
textShadowColor: 'red',
textShadowRadius: 1,
padding: 24,
},
wrapperHorizontal: {
justifyContent: 'center',
color: 'black',
},
itemStyleHorizontal: {
marginRight: 10,
height: 50,
padding: 8,
borderWidth: 1,
borderColor: 'grey',
borderRadius: 8,
textAlign: 'center',
justifyContent: 'center',
},
itemSelectedStyleHorizontal: {
borderWidth: 2,
borderColor: '#06bcee',
},
platformContainer: {
marginTop: 8,
borderTopWidth: 1,
},
platformContainerTitle: {
marginTop: 8,
},
title: {
fontWeight: 'bold',
marginVertical: 8,
},
});
export default App;
import {useState} from 'react';
import {
FlatList,
Platform,
ScrollView,
StyleSheet,
Switch,
Text,
TouchableWithoutFeedback,
View,
TextStyle,
} from 'react-native';
import Slider from '@react-native-community/slider';
import {SafeAreaView, SafeAreaProvider} from 'react-native-safe-area-context';
const App = () => {
const [fontSize, setFontSize] = useState(20);
const [fontStyleIdx, setFontStyleIdx] = useState(0);
const [fontWeightIdx, setFontWeightIdx] = useState(0);
const [lineHeight, setLineHeight] = useState(24);
const [textAlignIdx, setTextAlignIdx] = useState(0);
const [textDecorationLineIdx, setTextDecorationLineIdx] = useState(0);
const [includeFontPadding, setIncludeFontPadding] = useState(false);
const [textVerticalAlignIdx, setTextVerticalAlignIdx] = useState(0);
const [fontVariantIdx, setFontVariantIdx] = useState(0);
const [letterSpacing, setLetterSpacing] = useState(0);
const [textDecorationStyleIdx, setTextDecorationStyleIdx] = useState(0);
const [textTransformIdx, setTextTransformIdx] = useState(0);
const [writingDirectionIdx, setWritingDirectionIdx] = useState(0);
const [textShadowRadius, setTextShadowRadius] = useState(0);
const [textShadowOffset, setTextShadowOffset] = useState({
height: 0,
width: 0,
});
const [, ...validFontVariants] = fontVariants;
return (
<SafeAreaProvider>
<SafeAreaView style={styles.container}>
<View style={styles.pargraphWrapper}>
<Text
style={[
styles.paragraph,
{
fontSize,
fontStyle: fontStyles[fontStyleIdx],
fontWeight: fontWeights[fontWeightIdx],
lineHeight,
textAlign: textAlignments[textAlignIdx],
textDecorationLine: textDecorationLines[textDecorationLineIdx],
textTransform: textTransformations[textTransformIdx],
textAlignVertical: textAlignmentsVertical[textVerticalAlignIdx],
fontVariant:
fontVariantIdx === 0
? undefined
: [validFontVariants[fontVariantIdx - 1]],
letterSpacing,
includeFontPadding,
textDecorationStyle:
textDecorationStyles[textDecorationStyleIdx],
writingDirection: writingDirections[writingDirectionIdx],
textShadowOffset,
textShadowRadius,
} as TextStyle,
]}>
Lorem Ipsum is simply dummy text of the printing and typesetting
industry. 112 Likes
</Text>
</View>
<ScrollView style={{padding: 12}}>
<View>
<Text>Common platform properties</Text>
<CustomSlider
label="Text Shadow Offset - Height"
value={textShadowOffset.height}
minimumValue={-40}
maximumValue={40}
handleValueChange={(val: number) =>
setTextShadowOffset(prev => ({...prev, height: val}))
}
/>
<CustomSlider
label="Text Shadow Offset - Width"
value={textShadowOffset.width}
minimumValue={-40}
maximumValue={40}
handleValueChange={(val: number) =>
setTextShadowOffset(prev => ({...prev, width: val}))
}
/>
<CustomSlider
label="Font Size"
value={fontSize}
maximumValue={40}
handleValueChange={setFontSize}
/>
<CustomPicker
label="Font Style"
data={fontStyles}
currentIndex={fontStyleIdx}
onSelected={setFontStyleIdx}
/>
<CustomPicker
label="Font Weight"
data={fontWeights}
currentIndex={fontWeightIdx}
onSelected={setFontWeightIdx}
/>
<CustomSlider
label="Line Height"
value={lineHeight}
minimumValue={10}
maximumValue={50}
handleValueChange={setLineHeight}
/>
<CustomPicker
label="Text Align"
data={textAlignments}
currentIndex={textAlignIdx}
onSelected={setTextAlignIdx}
/>
<CustomPicker
label="Text Decoration Line"
data={textDecorationLines}
currentIndex={textDecorationLineIdx}
onSelected={setTextDecorationLineIdx}
/>
<CustomSlider
label="Text Shadow Radius"
value={textShadowRadius}
handleValueChange={setTextShadowRadius}
/>
<CustomPicker
label="Font Variant"
data={fontVariants}
currentIndex={fontVariantIdx}
onSelected={setFontVariantIdx}
/>
<CustomSlider
label="Letter Spacing"
step={0.1}
value={letterSpacing}
handleValueChange={setLetterSpacing}
/>
<CustomPicker
label="Text Transform"
data={textTransformations}
currentIndex={textTransformIdx}
onSelected={setTextTransformIdx}
/>
</View>
{Platform.OS === 'android' && (
<View style={styles.platformContainer}>
<Text style={styles.platformContainerTitle}>
Android only properties
</Text>
<CustomPicker
label="Text Vertical Align"
data={textAlignmentsVertical}
currentIndex={textVerticalAlignIdx}
onSelected={setTextVerticalAlignIdx}
/>
<CustomSwitch
label="Include Font Padding"
handleValueChange={setIncludeFontPadding}
value={includeFontPadding}
/>
</View>
)}
{Platform.OS === 'ios' && (
<View style={styles.platformContainer}>
<Text style={styles.platformContainerTitle}>
iOS only properties
</Text>
<CustomPicker
label="Text Decoration Style"
data={textDecorationStyles}
currentIndex={textDecorationStyleIdx}
onSelected={setTextDecorationStyleIdx}
/>
<CustomPicker
label="Writing Direction"
data={writingDirections}
currentIndex={writingDirectionIdx}
onSelected={setWritingDirectionIdx}
/>
</View>
)}
</ScrollView>
</SafeAreaView>
</SafeAreaProvider>
);
};
type CustomSwitchProps = {
label: string;
value: boolean;
handleValueChange: (value: boolean) => void;
};
const CustomSwitch = ({label, handleValueChange, value}: CustomSwitchProps) => {
return (
<>
<Text style={styles.title}>{label}</Text>
<View style={{alignItems: 'flex-start'}}>
<Switch
trackColor={{false: '#767577', true: '#DAA520'}}
thumbColor={value ? '#DAA520' : '#f4f3f4'}
onValueChange={handleValueChange}
value={value}
/>
</View>
</>
);
};
type CustomSliderProps = {
label: string;
value: number;
handleValueChange: (value: number) => void;
step?: number;
minimumValue?: number;
maximumValue?: number;
};
const CustomSlider = ({
label,
handleValueChange,
step = 1,
minimumValue = 0,
maximumValue = 10,
value,
}: CustomSliderProps) => {
return (
<>
{label && (
<Text style={styles.title}>{`${label} (${value.toFixed(2)})`}</Text>
)}
<View style={styles.wrapperHorizontal}>
<Slider
thumbTintColor="#06bcee"
minimumTrackTintColor="#64d7ffbb"
minimumValue={minimumValue}
maximumValue={maximumValue}
step={step}
onValueChange={handleValueChange}
value={value}
/>
</View>
</>
);
};
type CustomPickerProps = {
label: string;
data?: ArrayLike<any> | null;
currentIndex: number;
onSelected: (index: number) => void;
};
const CustomPicker = ({
label,
data,
currentIndex,
onSelected,
}: CustomPickerProps) => {
return (
<>
<Text style={styles.title}>{label}</Text>
<View style={styles.wrapperHorizontal}>
<FlatList
horizontal
data={data}
keyExtractor={item => String(item)}
renderItem={({item, index}: {item: string; index: number}) => {
const selected = index === currentIndex;
return (
<TouchableWithoutFeedback onPress={() => onSelected(index)}>
<View
style={[
styles.itemStyleHorizontal,
selected && styles.itemSelectedStyleHorizontal,
]}>
<Text
style={{
textAlign: 'center',
color: selected ? 'black' : 'grey',
fontWeight: selected ? 'bold' : 'normal',
}}>
{item + ''}
</Text>
</View>
</TouchableWithoutFeedback>
);
}}
/>
</View>
</>
);
};
const fontStyles = ['normal', 'italic'];
const fontVariants = [
undefined,
'small-caps',
'oldstyle-nums',
'lining-nums',
'tabular-nums',
'proportional-nums',
];
const fontWeights = [
'normal',
'bold',
'100',
'200',
'300',
'400',
'500',
'600',
'700',
'800',
'900',
];
const textAlignments = ['auto', 'left', 'right', 'center', 'justify'];
const textDecorationLines = [
'none',
'underline',
'line-through',
'underline line-through',
];
const textDecorationStyles = ['solid', 'double', 'dotted', 'dashed'];
const textTransformations = ['none', 'uppercase', 'lowercase', 'capitalize'];
const textAlignmentsVertical = ['auto', 'top', 'bottom', 'center'];
const writingDirections = ['auto', 'ltr', 'rtl'];
const styles = StyleSheet.create({
container: {
flex: 1,
},
pargraphWrapper: {
backgroundColor: 'black',
},
paragraph: {
color: '#fff',
textDecorationColor: 'yellow',
textShadowColor: 'red',
textShadowRadius: 1,
padding: 24,
},
wrapperHorizontal: {
justifyContent: 'center',
color: 'black',
},
itemStyleHorizontal: {
marginRight: 10,
height: 50,
padding: 8,
borderWidth: 1,
borderColor: 'grey',
borderRadius: 8,
textAlign: 'center',
justifyContent: 'center',
},
itemSelectedStyleHorizontal: {
borderWidth: 2,
borderColor: '#06bcee',
},
platformContainer: {
marginTop: 8,
borderTopWidth: 1,
},
platformContainerTitle: {
marginTop: 8,
},
title: {
fontWeight: 'bold',
marginVertical: 8,
},
});
export default App;
The generic font families system-ui, ui-sans-serif, ui-serif, ui-monospace, and ui-rounded are supported on iOS.
Type
enum('normal', 'italic')
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.
Type
Default
enum('normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900') or number
'normal'
includeFontPadding Android
Set to false to remove extra font padding intended to make space for certain ascenders / descenders. With some fonts, this padding can make text look slightly misaligned when centered vertically. For best results also set textAlignVertical to center.
Allows you to set all the font variants for a font. Can be set by using an array of enums or a space-separated string e.g. 'small-caps common-ligatures'.
Type
Default
array of enum('small-caps', 'oldstyle-nums', 'lining-nums', 'tabular-nums', 'proportional-nums') or string
[]
Configures variation axes for a variable font. Each axis is identified by a four-character OpenType tag, such as wght for weight, wdth for width, opsz for optical size, or a custom axis supported by the font. Settings can be provided as an object or as a CSS-compatible string.
The object and string forms below are equivalent; both set the wght axis to 500:
< Text
style = { {
fontVariationSettings : { wght : 500 } ,
// Equivalent CSS-compatible string:
fontVariationSettings : "'wght' 500" ,
} } >
Variable font
</ Text >
For more information about variation axes and the CSS string syntax, see MDN's font-variation-settings (https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings ) documentation.
Type
string or object: {[axis: string]: number}
Increase or decrease the spacing between characters. By default there is no extra letter spacing.
Numeric value that controls the vertical spacing between lines of text within a text element. It specifies the distance between the baselines of consecutive lines of text.
Specifies text alignment. On Android, the value 'justify' is only supported on Oreo (8.0) or above (API level >= 26). The value will fallback to left on lower Android versions.
Type
Default
enum('auto', 'left', 'right', 'center', 'justify')
'auto'
textAlignVertical Android
An alias for verticalAlign style prop, if you use both properties, verticalAlign will take precedence over textAlignVertical
Type
Default
enum('auto', 'top', 'bottom', 'center')
'auto'
Type
Default
enum('none', 'underline', 'line-through', 'underline line-through')
'none'
Type
Default
enum('solid', 'double', 'dotted', 'dashed')
'solid'
Type
object: {width?: number, height?: number}
Type
Default
enum('none', 'uppercase', 'lowercase', 'capitalize')
'none'
Type
Default
enum('auto', 'top', 'bottom', 'middle')
'auto'
Type
Default
enum('auto', 'ltr', 'rtl')
'auto'
It allows the user to select text and to use the native copy and paste functionality. Has precedence over the selectable prop.
Type
Default
enum('auto', 'text', 'none', 'contain', 'all')
none