Back to Mobile Development

react-native-design

react nativemobile developmentui/uxstylinganimationreact navigationcross-platform
36.8k📄 MIT🕒 2026-06-16Source ↗

Install this skill

npx skills add wshobson/agents

Works across Claude Code, Cursor, Codex, Copilot & Antigravity

This skill guides the construction of mobile interfaces in React Native, focusing on styling, navigation, and motion. It centers on the StyleSheet API to organize visual properties, while applying Flexbox logic to arrange components across different hardware form factors. Beyond static layouts, it incorporates React Navigation for multi-screen workflows and Reanimated 3 for high-performance, frame-rate-sensitive animations that execute off the JavaScript thread. By integrating these tools, users can transition from simple component stacks to intricate, gesture-aware mobile environments. The approach prioritizes maintainability and standard UI patterns, ensuring that layout changes remain performant as the application grows in complexity. Whether defining themes, handling route parameters, or chaining animations, this skill provides a structured method for managing the specialized requirements of native iOS and Android environments.

When to Use This Skill

  • Standardizing design tokens across a mobile codebase
  • Building complex onboarding flows with screen transitions
  • Implementing micro-interactions and hardware-accelerated transitions
  • Structuring cross-platform layouts that adapt to varying screen densities

How to Invoke This Skill

Example prompts that trigger this skill in Claude Code, Cursor, or Antigravity:

  • Build a mobile navigation stack for my React Native app
  • Create a responsive flexbox layout for a user profile card
  • Animate this component using Reanimated 3
  • How do I style native components in React Native?
  • Setup bottom tab navigation with custom icons

Pro Tips

  • 💡Prioritize `StyleSheet.create` for static styles and performance, reserving `styled-components` for dynamic, theme-driven styling or specific component encapsulation.
  • 💡Always use `useNativeDriver: true` for animations with `Animated` or leverage `Reanimated` directly to ensure animations run on the native UI thread, preventing frame drops.
  • 💡Organize your navigation structure logically using nested navigators in React Navigation, and make sure to lazy-load screens to optimize initial bundle size and startup time.

What this skill does

  • Declarative styling with StyleSheet object creation
  • Flexbox-based grid and list arrangement
  • Multi-screen navigation stack and bottom tab architecture
  • Gesture-responsive animations via Reanimated 3
  • Platform-specific visual adjustments

When not to use it

  • Developing web-only applications where standard CSS is preferred
  • Managing highly complex state that requires deep library integration beyond navigation

Example workflow

  1. Initialize the project with react-navigation and reanimated dependencies
  2. Define a StyleSheet object to establish base component styling
  3. Configure a StackNavigator to manage the transition between screens
  4. Apply useSharedValue and useAnimatedStyle to target components for motion
  5. Wrap the root component with NavigationContainer for state management

Prerequisites

  • React Native environment setup
  • TypeScript proficiency
  • Basic knowledge of mobile development patterns

Pitfalls & limitations

  • !Mixing inline styles with StyleSheet objects which impacts performance
  • !Forgetting to wrap root navigation with NavigationContainer
  • !Neglecting to install react-native-gesture-handler for Reanimated support

FAQ

Why use Reanimated 3 instead of Animated API?
Reanimated 3 runs animations on the UI thread, preventing frame drops during heavy JavaScript processing.
Can I use CSS grid in React Native?
No, React Native uses a subset of Flexbox; you must rely on flexDirection, justifyContent, and alignItems.
Is StyleSheet.create better than inline styles?
Yes, StyleSheet.create sends styles to the native bridge once, reducing overhead during render cycles.

How it compares

Generic prompts often produce inconsistent styling and navigation patterns, whereas this skill enforces industry-standard architecture, optimized performance, and proper typing for navigation parameters.

Source & trust

37k stars📄 MIT🕒 Updated 2026-06-16
📄 Full skill instructions — original source: wshobson/agents
# React Native Design

Master React Native styling patterns, React Navigation, and Reanimated 3 to build performant, cross-platform mobile applications with native-quality user experiences.

## When to Use This Skill

- Building cross-platform mobile apps with React Native
- Implementing navigation with React Navigation 6+
- Creating performant animations with Reanimated 3
- Styling components with StyleSheet and styled-components
- Building responsive layouts for different screen sizes
- Implementing platform-specific designs (iOS/Android)
- Creating gesture-driven interactions with Gesture Handler
- Optimizing React Native performance

## Core Concepts

### 1. StyleSheet and Styling

**Basic StyleSheet:**

import { StyleSheet, View, Text } from 'react-native';

const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16,
backgroundColor: '#ffffff',
},
title: {
fontSize: 24,
fontWeight: '600',
color: '#1a1a1a',
marginBottom: 8,
},
subtitle: {
fontSize: 16,
color: '#666666',
lineHeight: 24,
},
});

function Card() {
return (
<View style={styles.container}>
<Text style={styles.title}>Title</Text>
<Text style={styles.subtitle}>Subtitle text</Text>
</View>
);
}


**Dynamic Styles:**

interface CardProps {
variant: 'primary' | 'secondary';
disabled?: boolean;
}

function Card({ variant, disabled }: CardProps) {
return (
<View style={[
styles.card,
variant === 'primary' ? styles.primary : styles.secondary,
disabled && styles.disabled,
]}>
<Text style={styles.text}>Content</Text>
</View>
);
}

const styles = StyleSheet.create({
card: {
padding: 16,
borderRadius: 12,
},
primary: {
backgroundColor: '#6366f1',
},
secondary: {
backgroundColor: '#f3f4f6',
borderWidth: 1,
borderColor: '#e5e7eb',
},
disabled: {
opacity: 0.5,
},
text: {
fontSize: 16,
},
});


### 2. Flexbox Layout

**Row and Column Layouts:**

const styles = StyleSheet.create({
// Vertical stack (column)
column: {
flexDirection: "column",
gap: 12,
},
// Horizontal stack (row)
row: {
flexDirection: "row",
alignItems: "center",
gap: 8,
},
// Space between items
spaceBetween: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
},
// Centered content
centered: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
// Fill remaining space
fill: {
flex: 1,
},
});


### 3. React Navigation Setup

**Stack Navigator:**

import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

type RootStackParamList = {
Home: undefined;
Detail: { itemId: string };
Settings: undefined;
};

const Stack = createNativeStackNavigator<RootStackParamList>();

function AppNavigator() {
return (
<NavigationContainer>
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#6366f1' },
headerTintColor: '#ffffff',
headerTitleStyle: { fontWeight: '600' },
}}
>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'Home' }}
/>
<Stack.Screen
name="Detail"
component={DetailScreen}
options={({ route }) => ({
title: Item ${route.params.itemId},
})}
/>
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}


**Tab Navigator:**

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { Ionicons } from '@expo/vector-icons';

type TabParamList = {
Home: undefined;
Search: undefined;
Profile: undefined;
};

const Tab = createBottomTabNavigator<TabParamList>();

function TabNavigator() {
return (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {
const icons: Record<string, keyof typeof Ionicons.glyphMap> = {
Home: focused ? 'home' : 'home-outline',
Search: focused ? 'search' : 'search-outline',
Profile: focused ? 'person' : 'person-outline',
};
return <Ionicons name={icons[route.name]} size={size} color={color} />;
},
tabBarActiveTintColor: '#6366f1',
tabBarInactiveTintColor: '#9ca3af',
})}
>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Search" component={SearchScreen} />
<Tab.Screen name="Profile" component={ProfileScreen} />
</Tab.Navigator>
);
}


### 4. Reanimated 3 Basics

**Animated Values:**

import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
withTiming,
} from 'react-native-reanimated';

function AnimatedBox() {
const scale = useSharedValue(1);
const opacity = useSharedValue(1);

const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
opacity: opacity.value,
}));

const handlePress = () => {
scale.value = withSpring(1.2, {}, () => {
scale.value = withSpring(1);
});
};

return (
<Pressable onPress={handlePress}>
<Animated.View style={[styles.box, animatedStyle]} />
</Pressable>
);
}


**Gesture Handler Integration:**

import { Gesture, GestureDetector } from 'react-native-gesture-handler';
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
} from 'react-native-reanimated';

function DraggableCard() {
const translateX = useSharedValue(0);
const translateY = useSharedValue(0);

const gesture = Gesture.Pan()
.onUpdate((event) => {
translateX.value = event.translationX;
translateY.value = event.translationY;
})
.onEnd(() => {
translateX.value = withSpring(0);
translateY.value = withSpring(0);
});

const animatedStyle = useAnimatedStyle(() => ({
transform: [
{ translateX: translateX.value },
{ translateY: translateY.value },
],
}));

return (
<GestureDetector gesture={gesture}>
<Animated.View style={[styles.card, animatedStyle]}>
<Text>Drag me!</Text>
</Animated.View>
</GestureDetector>
);
}


### 5. Platform-Specific Styling

import { Platform, StyleSheet } from "react-native";

const styles = StyleSheet.create({
container: {
padding: 16,
...Platform.select({
ios: {
shadowColor: "#000",
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
android: {
elevation: 4,
},
}),
},
text: {
fontFamily: Platform.OS === "ios" ? "SF Pro Text" : "Roboto",
fontSize: 16,
},
});

// Platform-specific components
import { Platform } from "react-native";
const StatusBarHeight = Platform.OS === "ios" ? 44 : 0;


## Quick Start Component

import React from 'react';
import {
View,
Text,
StyleSheet,
Pressable,
Image,
} from 'react-native';
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
} from 'react-native-reanimated';

interface ItemCardProps {
title: string;
subtitle: string;
imageUrl: string;
onPress: () => void;
}

const AnimatedPressable = Animated.createAnimatedComponent(Pressable);

export function ItemCard({ title, subtitle, imageUrl, onPress }: ItemCardProps) {
const scale = useSharedValue(1);

const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
}));

return (
<AnimatedPressable
style={[styles.card, animatedStyle]}
onPress={onPress}
onPressIn={() => { scale.value = withSpring(0.97); }}
onPressOut={() => { scale.value = withSpring(1); }}
>
<Image source={{ uri: imageUrl }} style={styles.image} />
<View style={styles.content}>
<Text style={styles.title} numberOfLines={1}>
{title}
</Text>
<Text style={styles.subtitle} numberOfLines={2}>
{subtitle}
</Text>
</View>
</AnimatedPressable>
);
}

const styles = StyleSheet.create({
card: {
backgroundColor: '#ffffff',
borderRadius: 16,
overflow: 'hidden',
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 8,
elevation: 4,
},
image: {
width: '100%',
height: 160,
backgroundColor: '#f3f4f6',
},
content: {
padding: 16,
gap: 4,
},
title: {
fontSize: 18,
fontWeight: '600',
color: '#1f2937',
},
subtitle: {
fontSize: 14,
color: '#6b7280',
lineHeight: 20,
},
});


## Best Practices

1. **Use TypeScript**: Define navigation and prop types for type safety
2. **Memoize Components**: Use React.memo and useCallback to prevent unnecessary rerenders
3. **Run Animations on UI Thread**: Use Reanimated worklets for 60fps animations
4. **Avoid Inline Styles**: Use StyleSheet.create for performance
5. **Handle Safe Areas**: Use SafeAreaView or useSafeAreaInsets
6. **Test on Real Devices**: Simulator/emulator performance differs from real devices
7. **Use FlatList for Lists**: Never use ScrollView with map for long lists
8. **Platform-Specific Code**: Use Platform.select for iOS/Android differences

## Common Issues

- **Gesture Conflicts**: Wrap gestures with GestureDetector and use simultaneousHandlers
- **Navigation Type Errors**: Define ParamList types for all navigators
- **Animation Jank**: Move animations to UI thread with runOnUI worklets
- **Memory Leaks**: Cancel animations and cleanup in useEffect
- **Font Loading**: Use expo-font or react-native-asset for custom fonts
- **Safe Area Issues**: Test on notched devices (iPhone, Android with cutouts)

## Resources

- [React Native Documentation](https://reactnative.dev/)
- [React Navigation](https://reactnavigation.org/)
- [Reanimated Documentation](https://docs.swmansion.com/react-native-reanimated/)
- [Gesture Handler](https://docs.swmansion.com/react-native-gesture-handler/)
- [Expo Documentation](https://docs.expo.dev/)

How to Use This Skill Unit

Option A: Project-Specific (Recommended)

  1. Click "Download" above
  2. In your project, create the directory: .agent/skills/react-native-design/
  3. Save the file as SKILL.md
  4. The agent will automatically discover the skill based on its description.

Option B: Global Installation (All Agents)

Save the file to these locations to make it available across all projects:

  • Claude Code: ~/.claude/skills/wshobson/agents/react-native-design/SKILL.md
  • Cursor: ~/.cursor/skills/wshobson/agents/react-native-design/SKILL.md
  • Antigravity: ~/.gemini/antigravity/skills/wshobson/agents/react-native-design/SKILL.md

🚀 Install with CLI:
npx skills add wshobson/agents

Read the Master Guide: Mastering Agent Skills

Recommended Rules

View more rules

Recommended Workflows

View more workflows

Recommended MCP Servers

View more MCP servers

Take It Further

Maximize your productivity with these powerful resources

📋

Define Your Standards

Set up coding standards to ensure this workflow produces consistent, high-quality results.

Browse Rules Library
📖

Master Workflows

Learn how to create custom workflows, use Turbo Mode, and build your automation library.

Complete Guide

How to use this Skill in Claude Code & Cursor

For Claude Code (CLI)

To use this skill in Claude Code, copy the rule content into your project's custom instructions or follow our Add-Skill CLI guide. This ensures Claude follows your standards during every code generation.

For Cursor & Windsurf

For Cursor or Windsurf, individual skills are best used in the "Rules for AI" section. This specific unit helps the agent avoid mobile development issues, leading to cleaner, more efficient code.

Why the skill format matters: the standardized Agent Skills format lets your AI agent load detailed instructions only when they are relevant, keeping your prompt clean while improving results.

Source & attribution

This skill is categorized under Mobile Development and is published by W. Shobson, maintained in wshobson/agents.

← Browse All Agent Skills
Sponsored AI assistant. Recommendations may be paid.