https://github.com/vineyardbovines/react-native-nitro-stylesheet
Performant StyleSheet for React Native with responsive and accessible builtins
https://github.com/vineyardbovines/react-native-nitro-stylesheet
Last synced: 3 months ago
JSON representation
Performant StyleSheet for React Native with responsive and accessible builtins
- Host: GitHub
- URL: https://github.com/vineyardbovines/react-native-nitro-stylesheet
- Owner: vineyardbovines
- License: mit
- Created: 2024-11-28T22:16:48.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-11-29T13:05:05.000Z (10 months ago)
- Last Synced: 2025-05-14T17:49:36.267Z (5 months ago)
- Language: C++
- Size: 275 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# react-native-nitro-stylesheet
Performant, extended [StyleSheet](https://reactnative.dev/docs/stylesheet) for React Native. Inspired by [Unistyles](https://github.com/jpudysz/react-native-unistyles).
- ⚡ Native StyleSheet API, no learning curve or overhead
- ♿ Built-in accessibility overrides
- 📐 Automatic responsive scaling
- 🏃♂️ Powered by [Nitro Modules](https://nitro.margelo.com)## Installation
Install in any React Native application or library.
```bash
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](https://docs.expo.dev/develop/development-builds/create-a-build/).
## Usage
```tsx
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 (
App header
)
}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:
```tsx
interface Theme {
spacing: Record;
radius: Record;
fonts: Record;
fontSizes: Record;
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.
```tsx
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).
```tsx
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.
```tsx
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.
```tsx
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.
```tsx
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:
- [`NitroAccessibilityModule`](./src/specs/Accessibility.nitro.ts)
- [`NitroDeviceModule`](./src/specs/Device.nitro.ts)