react-native-unistyles-v3

Guide for using react-native-unistyles v3. Triggers on: "unistyles", "StyleSheet.create", "create stylesheet", "add theme", "breakpoints", "variants", "withUnistyles", "useUnistyles", "ScopedTheme", "UnistylesRuntime", "style component", "responsive styles", "media queries", "dynamic styles", "scope

By jpudysz · 395 installs

npx skills add jpudysz/react-native-unistyles --skill react-native-unistyles-v3

Source repository · Upstream listing

React Native Unistyles v3 Skill You are assisting with React Native Unistyles v3 styling. v3 is a zero re render styling library with a C++ core (Nitro Modules) and a Babel plugin that processes StyleSheets at build time (since 3.6.0, Metro apps can use the experimental zero config Metro integration instead). It replaces React Native's StyleSheet with a reactive, theme aware, responsive system. Prerequisites React Native 0.81+ with New Architecture mandatory (enabled by default since RN 0.76, the only architecture since RN 0.82) React 19+ (enforced at runtime) react native nitro modules (native bridge dependency; pin an exact version — Unistyles 3.4.0+ needs = 0.37.1 ) iOS 15.1+, Android 7+ react native edge to edge is not needed (optional since v3.1.0, now deprecated) — set edgeToEdgeEnabled=true in android/gradle.properties instead (Expo SDK 54+ enables it automatically) Expo SDK 54+ (if using Expo; not compatible with Expo Go — requires dev client or prebuild) Xcode 16.4+ (iOS, required by Nitro Modules) Workflow 1. Read user's code first — understand current setup, imports, and styling approach 2. Identify intent — new setup, add theming, responsive design, fix an issue, etc. 3. Apply v3 patterns — use the correct API from this skill; consult reference files for details 4. Verify correctness — check for critical rule violations (spreading, barrel re exports, etc.) Quick Reference StyleSheet.create — 3 overloads StyleSheet.configure — one time setup Variants withUnistyles — map theme/runtime to non style props, or wrap views Unistyles can't bind to React Native / Reanimated views that only take style need no wrapping. Use withUnistyles for props like color / trackColor , for contentContainerStyle , or for third party views that don't expose a native ref. Critical Rules 1. NEVER spread styles — {...styles.x} breaks C++ proxy binding. ALWAYS use array syntax: [styles.x, styles.y] or [styles.x, { marginTop: 10 }] 2. NEVER re export StyleSheet from barrel files — import it directly from react native unistyles . Outside root , the Babel plugin only recognizes StyleSheet.create via that import (or autoProcessImports ), so a re export silently breaks detection. (The Metro integration also detects re exports from your own modules, but direct imports work everywhere.) 3. A build time integration is REQUIRED — one of: Babel plugin (default): ['react native unistyles/plugin', { root: 'src' }] in babel.config.js ( root is required; every file under it is processed) Metro integration (3.6.0+, experimental, Metro only): withUnistylesConfig(config) from react native unistyles/metro in metro.config.js, no options, and remove the Babel plugin (having both throws). Bare RN apps that list babel plugin react compiler in babel.config.js plugins must keep the Babel plugin — those plugins run before Metro's, so React Compiler would see useVariants first Re.Pack: RepackUnistylePlugin from react native unistyles/repack plugin Without one of them, styles won't be reactive. 4. Import StyleSheet from react native unistyles only — it polyfills all RN StyleSheet APIs ( hairlineWidth , compose , flatten , absoluteFill ). Replace all import { StyleSheet } from 'react native' . 5. styles.useVariants() must be called before accessing variant dependent styles — treat it like a React hook (top of component). Always pass an object: useVariants(undefined) throws on native, use {} to select default variants. 6. Prefer StyleSheet.create(theme = ...) over useUnistyles() — theme functions cause zero re renders; useUnistyles() re renders whenever a theme / rt value you read changes (never read rt.insets.ime there — it re renders every keyboard frame). 7. StyleSheet.configure() must be called before any StyleSheet.create() — typically in your app entry point, before any component renders. 8. Dynamic function arguments must be serializable — Unistyles stores them in C++ and re runs the function on theme/runtime changes. Functions are dropped; Date / Map / Set /class instances become plain objects. Pass primitives / plain objects (e.g. date.getTime() ). Decision Trees Choosing a styling approach Third party component integration Reference Files Setup, installation, Babel plugin, Metro integration, Re.Pack, TypeScript, testing, Expo Router : read [references/setup guide.md](references/setup guide.md) Complete API for every export : read [references/api reference.md](references/api reference.md) Code patterns: themes, variants, breakpoints, web, SSR, Reanimated : read [references/styling patterns.md](references/styling patterns.md) withUnistyles, autoProcessPaths/Imports, React Compiler, Reanimated, edge to edge, frozen screens, FlatList : read [references/third party integration.md](references/third party integration.md) Troubleshooting from 150+ GitHub issues with solutions : read [references/common issues.md](references/common issues.md)