Claude Code Plugins

Community-maintained marketplace

Feedback

nativewind-generator

@nguyenthienthanh/aura-frog
1
0

Generate React Native components styled with NativeWind (Tailwind CSS).

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name nativewind-generator
description Generate React Native components styled with NativeWind (Tailwind CSS).
autoInvoke false
priority medium
triggers NativeWind component, Tailwind React Native, styled component

NativeWind Component Generator

Category: Mobile Development Version: 1.0.0 Dependencies: React Native, Expo, NativeWind, Tailwind CSS


Purpose

Generate React Native components styled with NativeWind (Tailwind CSS) for cross-platform mobile applications.


When to Use

  • Creating new React Native components
  • Converting Figma designs to code (Phase 3)
  • Building responsive Phone/Tablet variants
  • Rapid prototyping with utility classes

NativeWind Best Practices

Utility-First Styling

// ✅ Preferred: NativeWind
<View className="flex-1 bg-white p-4 rounded-lg shadow-md">
  <Text className="text-xl font-bold text-gray-900">Hello</Text>
</View>

// ❌ Avoid: Manual StyleSheet
<View style={styles.container}>
  <Text style={styles.title}>Hello</Text>
</View>

Responsive Design

<View className={`p-4 ${isTablet ? 'flex-row' : 'flex-col'}`}>
  <Text className={isTablet ? 'text-2xl' : 'text-lg'}>Responsive</Text>
</View>

Dark Mode

<View className="bg-white dark:bg-gray-900">
  <Text className="text-gray-900 dark:text-white">Dark Mode Ready</Text>
</View>

Pressable States

<Pressable
  className={({ pressed }) => `p-4 rounded-lg ${pressed ? 'bg-gray-200' : 'bg-white'}`}
>
  <Text>Pressable</Text>
</Pressable>

Component Templates

Screen Component

// UserProfile.phone.tsx
import { View, Text, ScrollView, TouchableOpacity } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';

interface UserProfileProps {
  userId: string;
  onEdit?: () => void;
}

export const UserProfilePhone: React.FC<UserProfileProps> = ({ onEdit }) => (
  <SafeAreaView className="flex-1 bg-gray-50">
    <ScrollView className="flex-1">
      <View className="bg-white px-4 py-6 items-center">
        <Text className="text-2xl font-bold text-gray-900">John Doe</Text>
        <Text className="text-base text-gray-500">john@example.com</Text>
      </View>
      <View className="p-4">
        <TouchableOpacity
          onPress={onEdit}
          className="bg-blue-500 px-6 py-4 rounded-lg active:bg-blue-600"
        >
          <Text className="text-white text-center font-semibold">Edit Profile</Text>
        </TouchableOpacity>
      </View>
    </ScrollView>
  </SafeAreaView>
);

Form Component

// LoginForm.tsx
import { View, Text, TextInput, TouchableOpacity, ActivityIndicator } from 'react-native';

interface LoginFormProps {
  onSubmit: (email: string, password: string) => Promise<void>;
}

export const LoginForm: React.FC<LoginFormProps> = ({ onSubmit }) => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [loading, setLoading] = useState(false);

  return (
    <View className="bg-white rounded-2xl p-6 shadow-xl">
      <Text className="text-2xl font-bold text-gray-900 mb-6">Welcome Back</Text>

      <View className="mb-4">
        <Text className="text-sm font-medium text-gray-700 mb-2">Email</Text>
        <TextInput
          value={email}
          onChangeText={setEmail}
          className="bg-gray-50 border border-gray-300 rounded-lg px-4 py-3"
        />
      </View>

      <TouchableOpacity
        onPress={() => onSubmit(email, password)}
        disabled={loading}
        className={`py-4 rounded-lg ${loading ? 'bg-gray-300' : 'bg-blue-500'}`}
      >
        {loading ? <ActivityIndicator color="white" /> : (
          <Text className="text-white text-center font-semibold">Sign In</Text>
        )}
      </TouchableOpacity>
    </View>
  );
};

Common Patterns

Pattern NativeWind Class
Flex container flex-1
Padding 16px p-4
Margin top 8px mt-2
Background white bg-white
Text 16px text-base
Font bold font-bold
Center items items-center
Border radius 8px rounded-lg
Shadow shadow-md

Quick Patterns

// List Item
<View className="bg-white border-b border-gray-200 p-4">
  <Text className="text-base font-semibold">Title</Text>
</View>

// Card with Shadow
<View className="bg-white rounded-xl shadow-lg p-6 mb-4" />

// Badge
<View className="bg-blue-100 px-3 py-1 rounded-full">
  <Text className="text-blue-800 text-xs font-medium">New</Text>
</View>

// Flex Row
<View className="flex-row justify-between items-center">
  <Text>Left</Text>
  <Text>Right</Text>
</View>

File Structure

components/
├── UserProfile/
│   ├── UserProfile.tsx          # Main (shared logic)
│   ├── UserProfile.phone.tsx    # Phone layout
│   ├── UserProfile.tablet.tsx   # Tablet layout
│   └── index.ts                 # Barrel export

Tailwind Config

// tailwind.config.js
module.exports = {
  content: ["./App.{js,tsx}", "./src/**/*.{js,tsx}"],
  theme: {
    extend: {
      colors: {
        primary: { 500: '#0ea5e9', 600: '#0284c7' },
        success: { 500: '#10b981' },
        error: { 500: '#ef4444' }
      }
    }
  }
};

Success Criteria

  • ✅ Utility classes for 90%+ of styling
  • ✅ Responsive across Phone/Tablet
  • ✅ TypeScript types for all props
  • ✅ Proper accessibility labels
  • ✅ Minimal StyleSheet usage
  • ✅ Unit tests included

References: NativeWind | Tailwind CSS Version: 1.0.0 | Last Updated: 2025-11-28