π Production-Ready Expo Starter Kit - Mobile app template with 20+ pre-built UI components, TypeScript, NativeWind (Tailwind CSS), and platform-specific behaviors for iOS/Android.
20+ Pre-built UI Components β’ TypeScript β’ NativeWind β’ Expo Router β’ Dark Mode
Stop building UI components from scratch! This Expo starter template comes with:
/app/(tabs)/index.tsx) - Interactive component gallery/app/(tabs)/menu-demo.tsx) - Hamburger menu implementation/app/(tabs)/permissions-demo.tsx) - Permission management UIβββ app/ # π± Expo Router screens
β βββ (tabs)/ # π Tab navigation
β β βββ index.tsx # Component showcase
β β βββ menu-demo.tsx # Menu examples
β β βββ permissions-demo.tsx # Permission examples
β βββ _layout.tsx # π¨ Root layout
βββ components/
β βββ ui/ # π¨ UI component library (20+ components)
β βββ error-boundary/ # Error handling components
βββ hooks/ # πͺ Custom React hooks
βββ constants/ # π App constants & colors
βββ config/ # βοΈ App configuration
βββ assets/ # πΌοΈ Images, fonts, etc.
Some features require a development build instead of Expo Go:
To create a development build:
npx eas build --profile development --platform ios
npx eas build --profile development --platform android
git clone https://github.com/chvvkrishnakumar/expo-nativewind-template.git my-app
cd my-app
npm install
# or
yarn install
npx expo start
i for iOS simulatora for Android emulatorexpo-nativewind-template/
βββ app/ # App routes (Expo Router)
β βββ (tabs)/ # Tab navigation screens
β β βββ _layout.tsx # Tab layout configuration
β β βββ index.tsx # UI component showcase
β β βββ menu-demo.tsx # Hamburger menu demo
β β βββ permissions-demo.tsx # Permissions demo
β βββ _layout.tsx # Root layout with providers
β βββ +not-found.tsx # 404 screen
βββ components/
β βββ ui/ # UI component library
β βββ button.tsx
β βββ card.tsx
β βββ dialog.tsx
β βββ sheet.tsx
β βββ theme.tsx # Theme provider
β βββ ... # Other components
βββ assets/ # Images, fonts, etc.
βββ hooks/ # Custom React hooks
βββ constants/ # App constants
βββ package.json
import { Button, Text, Card, SafeAreaView } from '@/components/ui';
export default function MyScreen() {
return (
<SafeAreaView className="flex-1 p-4">
<Card>
<Text variant="h2">Welcome!</Text>
<Button onPress={() => console.log('Pressed')}>
<Text>Get Started</Text>
</Button>
</Card>
</SafeAreaView>
);
}
Components automatically adapt to the platform:
// Button uses TouchableOpacity on iOS, Pressable with ripple on Android
<Button onPress={handlePress}>
<Text>Platform Adaptive Button</Text>
</Button>
// Dialog animations differ by platform
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
{/* iOS: slide animation, Android: fade animation */}
</DialogContent>
</Dialog>
import { PermissionRequester, useCameraPermissions } from '@/components/ui';
// Using the component
<PermissionRequester permission="location">
{({ status, requestPermission }) => (
<Button onPress={requestPermission}>
<Text>{status === 'granted' ? 'Access Granted' : 'Request Access'}</Text>
</Button>
)}
</PermissionRequester>
// Using the hook for camera (special case)
const [permission, requestPermission] = useCameraPermissions();
This template uses NativeWind (Tailwind for React Native):
// Using className for styling
<View className="flex-1 bg-background p-4">
<Text className="text-lg font-bold text-primary">Hello World</Text>
<Button className="mt-4" variant="secondary">
<Text>Click me</Text>
</Button>
</View>
// Dark mode is automatic
<Text className="text-foreground">Adapts to dark/light mode</Text>
Edit global.css to customize your theme:
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
/* ... other colors */
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
/* ... dark mode colors */
}
}
/components/ui//components/ui/index.tsFor platform-specific implementations:
components/ui/
βββ button.tsx # Shared logic
βββ button.ios.tsx # iOS specific (optional)
βββ button.android.tsx # Android specific (optional)
# iOS
eas build --platform ios --profile development
# Android
eas build --platform android --profile development
# iOS
eas build --platform ios --profile production
# Android
eas build --platform android --profile production
| Library | Version | Description | Documentation |
|---|---|---|---|
| Expo SDK | ~53.0.0 | React Native framework | Docs |
| React Native | 0.74.5 | Mobile framework | Docs |
| TypeScript | ^5.3.3 | Type safety | Docs |
| Expo Router | ~3.5.23 | File-based routing | Docs |
| NativeWind | ^4.0.0 | Tailwind for RN | Docs |
| Library | Purpose | Documentation |
|---|---|---|
| @gorhom/bottom-sheet | Bottom sheets | Docs |
| react-native-gesture-handler | Gesture handling | Docs |
| react-native-reanimated | Animations | Docs |
| lucide-react-native | Icon library | Icons |
| class-variance-authority | Component variants | Docs |
| Library | Purpose | Documentation |
|---|---|---|
| expo-camera | Camera access | API |
| expo-location | Location services | API |
| expo-media-library | Photo library | API |
| expo-notifications | Push notifications | API |
| expo-contacts | Contacts access | API |
If this template helps you build your app faster, please consider:
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)This project is licensed under the MIT License - see the LICENSE file for details.
Current version: 0.1.0 - See CHANGELOG.md for version history.
Built with β€οΈ for the React Native community
If you found this helpful, please β the repository!