Loading...
Loading...
Use when the user needs mobile app design and development patterns for React Native, Flutter, or SwiftUI — including platform HIG compliance, gestures, and offline-first architecture. Triggers: user says "mobile", "iOS", "Android", "React Native", "Flutter", "SwiftUI", "app design", "mobile navigation", "touch targets", "offline-first".
npx skill4agent add pixel-process-ug/superkit-agents mobile-design| Requirement | React Native | Flutter | SwiftUI | Kotlin/Compose |
|---|---|---|---|---|
| iOS only | Possible | Possible | Best | No |
| Android only | Possible | Possible | No | Best |
| Cross-platform | Good | Best | No | No |
| Native performance critical | OK | Good | Best | Best |
| Existing React web team | Best | Learning curve | Learning curve | Learning curve |
| Complex animations | Good | Best | Good | Good |
| Rapid prototyping | Good | Good | Best (iOS) | OK |
| Large existing codebase (JS) | Best | Rewrite | Rewrite | Rewrite |
| Area | Guideline |
|---|---|
| Navigation | UINavigationController (push/pop), tab bars at bottom (max 5) |
| Typography | SF Pro / SF Pro Rounded, support Dynamic Type (all 11 sizes) |
| Safe Areas | Respect |
| Gestures | Swipe-back for navigation, long press for context menus |
| Haptics | UIFeedbackGenerator (impact, selection, notification) |
| Colors | Semantic system colors ( |
| Modals | Sheets ( |
| Lists | Grouped inset for settings, plain for content feeds |
| Icons | SF Symbols library (5000+ icons, variable weight/size) |
| Area | Guideline |
|---|---|
| Navigation | Bottom navigation bar, navigation drawer, top app bar |
| Typography | Roboto / product font, Material type scale |
| Edge-to-edge | Draw behind system bars, handle window insets |
| Gestures | Predictive back gesture (Android 14+), swipe-to-dismiss |
| Haptics | HapticFeedbackConstants (click, long press, keyboard) |
| Colors | Material You dynamic color from wallpaper, tonal palettes |
| Components | FAB, snackbar, bottom sheet, chips |
| Motion | Shared element transitions, container transform |
| Feature | iOS Pattern | Android Pattern |
|---|---|---|
| Back navigation | Swipe from left edge | System back button |
| Primary action | Right nav bar button | FAB |
| Alerts | UIAlertController | MaterialAlertDialog |
| Loading | UIActivityIndicator | CircularProgressIndicator |
| Segmented | UISegmentedControl | Tabs / Chips |
| Date picker | Wheel picker | Calendar picker |
| Pull to refresh | Native support | SwipeRefreshLayout |
| Context menu | Long press + haptic | Long press + popup |
import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
function Screen() {
const insets = useSafeAreaInsets();
return (
<View style={{ flex: 1, paddingTop: insets.top, paddingBottom: insets.bottom }}>
{/* Content */}
</View>
);
}Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: // Content
),
);
}var body: some View {
VStack {
// Content automatically respects safe areas
}
.ignoresSafeArea(.keyboard) // Only ignore keyboard if needed
}| Gesture | Usage | Min Target |
|---|---|---|
| Tap | Primary action | 44x44pt |
| Long press | Context menu / secondary action | 44x44pt |
| Swipe horizontal | Navigation, dismiss, reveal actions | Full row |
| Swipe vertical | Scroll, pull-to-refresh, dismiss sheet | Full area |
| Pinch | Zoom images/maps | Content area |
| Pan/Drag | Reorder, move elements | Drag handle |
| Rule | Value |
|---|---|
| Minimum size (iOS) | 44x44pt |
| Minimum size (Android) | 48x48dp |
| Minimum spacing | 8pt between targets |
| Visual vs touch | Visual can be smaller; use padding for touch area |
| Primary actions | Bottom 1/3 of screen (thumb zone) |
| Form Factor | Layout | Navigation |
|---|---|---|
| Phone Portrait | Single column | Bottom tabs |
| Phone Landscape | Single column or split | Side tabs |
| Tablet Portrait | Two columns | Sidebar |
| Tablet Landscape | Three columns | Persistent sidebar |
import { useWindowDimensions } from 'react-native';
function useResponsive() {
const { width } = useWindowDimensions();
return {
isPhone: width < 768,
isTablet: width >= 768 && width < 1024,
isDesktop: width >= 1024,
columns: width < 768 ? 1 : width < 1024 ? 2 : 3,
};
}class ResponsiveLayout extends StatelessWidget {
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth < 600) return MobileLayout();
if (constraints.maxWidth < 1200) return TabletLayout();
return DesktopLayout();
},
);
}
}| Layer | Pattern | Implementation |
|---|---|---|
| Data | Local-first | SQLite/Realm as primary store, server as sync target |
| Updates | Optimistic | Apply locally, sync in background |
| Conflicts | Resolution strategy | Last-write-wins or field-level merge |
| Queue | Persistent ops | Store pending operations, retry on connectivity |
| Cache | Stale-while-revalidate | Serve cached, refresh in background |
| Requirement | Apple App Store | Google Play Store |
|---|---|---|
| Screenshots | 6.7" and 5.5" required, 12.9" iPad | Min 2, max 8 per device |
| App icon | 1024x1024px, no alpha, no corners | 512x512px, adaptive recommended |
| Privacy | Nutrition labels required | Data safety section required |
| Review time | 24-48 hours typical | Hours to days |
| Common rejections | Crashes, placeholder content | Policy violations, crashes |
| Metric | Target |
|---|---|
| Cold start | < 2 seconds |
| Screen transition | < 300ms |
| Touch response | < 100ms |
| Scroll FPS | 60fps (no drops) |
| Memory usage | < 200MB baseline |
| App size | < 50MB download |
| Anti-Pattern | Why It Is Wrong | What to Do Instead |
|---|---|---|
| Web patterns in mobile (hover states) | No hover on touch devices | Use press/tap states |
| Tiny touch targets (< 44pt) | Frustrating, accessibility fail | Minimum 44x44pt touch area |
| iOS-styled buttons on Android | Feels foreign, confuses users | Use platform-native components |
| Fixed layouts for one screen size | Breaks on tablets and foldables | Responsive layouts with breakpoints |
| Blocking main thread with I/O | UI freezes, ANR dialogs | Async I/O, background threads |
| Not handling keyboard appearance | Content hidden behind keyboard | Adjust layout on keyboard show |
| Assuming constant connectivity | App crashes or hangs offline | Offline-first architecture |
| Pixel values instead of dp/pt | Different sizes on different screens | Use density-independent units |
| Skipping haptic feedback | App feels cheap and unresponsive | Add haptics for key interactions |
mcp__context7__resolve-library-idmcp__context7__query-docsreact-nativeflutter| Skill | Integration |
|---|---|
| Color palettes, typography, UX guidelines |
| Design tokens adapted for mobile |
| Mobile data visualization and charts |
| Mobile usability testing |
| React Native component implementation |
| App store submission pipeline |
| Mobile performance profiling |