@vineyardbovines/react-native-nitro-stylesheet
v0.0.14
Published
Performant, extended StyleSheet for React Native
Downloads
449
Maintainers
Readme
react-native-nitro-stylesheet
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
Installation
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.
Usage
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
}
}))
Themes
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
}
}))
StyleSheet.init
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
})
StyleSheet.create
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
}
}))
useAccessibilitySettings()
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()
}
Nitro Modules
This package also exports the nitro modules themselves: