Performant, extended StyleSheet for React Native. Inspired by Unistyles.
- ⚡ Native StyleSheet API, no learning curve or overhead
- ♿ Built-in accessibility overrides
- 📐 Automatic responsive scaling
- 🏃♂️ Powered by Nitro Modules
Install in any React Native application or library.
npm install react-native-nitro-stylesheet
# peer dependencies
npm install react-native-nitro-modules
If you're using Expo, you will need to create a development build.
import { useStyles, StyleSheet } from "react-native-nitro-stylesheet";
import { View, Text } from "react-native";
// only has to be called once
StyleSheet.init({
// add your themes
light: {},
dark: {}
})
function Component() {
return (
<View style={styles.container}>
<Text style={styles.header}>App header</Text>
</View>
)
}
const stylesheet = StyleSheet.create((theme) => ({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: theme.colors.bg
},
header: {
color: theme.colors.fg,
fontSize: theme.fontSizes.h1,
fontFamily: theme.fonts.semibold
}
}))
You can provide either a single theme object or a theme for each color mode (light
and dark
).
Themes are expected to follow this shape:
interface Theme {
spacing: Record<string, number>;
radius: Record<string, number>;
fonts: Record<string, number>;
fontSizes: Record<string, number>;
colors: {
bg: string;
fg: string;
success: string;
warning: string;
danger: string;
info: string;
[key: string]: string;
};
[key: string]: any; // any other properties
};
The colors
are set in such a way to be dynamic based on color scheme, i.e.
const light = {
colors: {
bg: "#fff"
}
}
const dark = {
colors: {
bg: "#000"
}
}
// when calling in the stylesheet
const stylesheet = StyleSheet.create((theme) => ({
container: {
backgroundColor: theme.colors.bg // will automatically apply based on the user's color scheme
}
}))
At the root of your application, call StyleSheet.init()
and pass your theme(s).
import { StyleSheet } from "react-native-nitro-stylesheet";
const lightTheme = {
// your theme
}
const darkTheme = {
// your theme
}
StyleSheet.init({
light: lightTheme,
dark: darkTheme
})
Your theme is automatically available on the create
function and can be used in your styles. This method is an extension of the React Native supplied StyleSheet and can be used in the same way.
Automatic scaling based on device size and accessibility overrides are automatically applied to your styles.
import { StyleSheet } from "react-native-nitro-stylesheet";
const stylesheet = StyleSheet.create((theme) => ({
container: {
backgroundColor: theme.colors.bg,
flex: 1,
justifyContent: "center"
}
}))
Also available, alongside the theme, are screen insets to apply safe area styling.
import { StyleSheet } from "react-native-nitro-stylesheet";
const stylesheet = StyleSheet.create((theme, insets) => ({
container: {
backgroundColor: theme.colors.bg,
flex: 1,
justifyContent: "center",
paddingTop: insets.top // safe area insets
}
}))
Hook that returns all accessibility settings and their enabled/disabled state. Will listen for and report changes.
import { useAccessibilitySettings } from "react-native-nitro-stylesheet";
function Component() {
const {
isReduceMotionEnabled,
isReduceTransparencyEnabled,
isGrayscaleEnabled,
isBoldTextEnabled,
isVoiceOverEnabled,
isSwitchControlEnabled,
isVideoAutoplayEnabled,
isClosedCaptioningEnabled,
isDarkerSystemColorsEnabled,
isMonoAudioEnabled,
isShakeToUndoEnabled,
isDifferentiateWithoutColorEnabled,
isInvertColorsEnabled,
isShowButtonShapesEnabled,
prefersCrossFadeTransitions,
isSpeakScreenEnabled,
isSpeakSelectionEnabled,
isOnOffSwitchLabelsEnabled,
} = useAccessibilitySettings()
}
This package also exports the nitro modules themselves: