Mobile Design
Overview
Design and build mobile applications that feel native on each platform. This skill covers React Native, Flutter, and SwiftUI with deep knowledge of platform-specific Human Interface Guidelines (Apple HIG) and Material Design, gesture handling, responsive layouts, offline-first patterns, and app store submission requirements.
Phase 1: Platform Analysis
- Identify target platforms (iOS, Android, both)
- Choose framework (React Native, Flutter, SwiftUI, or cross-platform)
- Review platform-specific design guidelines
- Define navigation architecture
- Map offline requirements
STOP — Present platform and framework recommendation with rationale before design.
Framework Selection Decision Table
| 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 |
Phase 2: Design Implementation
- Build component library with platform variants
- Implement navigation (tab bar, stack, drawer)
- Handle safe areas and notches
- Add gesture recognizers
- Implement responsive layouts for phone/tablet
STOP — Present navigation architecture and component inventory for review.
Platform-Specific HIG Compliance
Apple Human Interface Guidelines
| 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 safeAreaInsets — never under notch/home indicator |
| Gestures |
Swipe-back for navigation, long press for context menus |
| Haptics |
UIFeedbackGenerator (impact, selection, notification) |
| Colors |
Semantic system colors (label, secondaryLabel, systemBackground) |
| Modals |
Sheets (.sheet, .fullScreenCover) with drag-to-dismiss |
| Lists |
Grouped inset for settings, plain for content feeds |
| Icons |
SF Symbols library (5000+ icons, variable weight/size) |
Material Design (Android)
| 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 |
Cross-Platform Pattern Decision Table
| 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 |
Safe Area Handling
React Native
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>
);
}
Flutter
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: // Content
),
);
}
SwiftUI
var body: some View {
VStack {
// Content automatically respects safe areas
}
.ignoresSafeArea(.keyboard) // Only ignore keyboard if needed
}
Gesture Navigation Patterns
| 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 |
Touch Target Rules
| 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) |
Phase 3: Platform Polish
- Platform-specific animations and transitions
- Haptic feedback integration
- App icon and launch screen
- Dark mode and Dynamic Type support
- App store metadata and screenshots
STOP — Test on physical devices before declaring complete.
Responsive Layout Decision Table
| 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 |
React Native Responsive
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,
};
}
Flutter Responsive
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();
},
);
}
}
Offline-First Architecture
| 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 |
Implementation Checklist
App Store Guidelines Summary
| 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 |
Performance Targets
| 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-Patterns / Common Mistakes
| 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 |
Documentation Lookup (Context7)
Use mcp__context7__resolve-library-id then mcp__context7__query-docs for up-to-date docs. Returned docs override memorized knowledge.
react-native — for component API, navigation, or platform-specific modules
flutter — for widget catalog, state management, or platform channels
Integration Points
| Skill |
Integration |
ui-ux-pro-max |
Color palettes, typography, UX guidelines |
ui-design-system |
Design tokens adapted for mobile |
canvas-design |
Mobile data visualization and charts |
ux-researcher-designer |
Mobile usability testing |
senior-frontend |
React Native component implementation |
deployment |
App store submission pipeline |
performance-optimization |
Mobile performance profiling |
Skill Type
FLEXIBLE — Adapt patterns to the chosen framework and target platforms. Platform-specific guidelines should be followed when targeting a single platform; cross-platform apps may blend conventions thoughtfully.
1---2name: mobile-design3description: 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".4---5
6# Mobile Design
7
8## Overview
9
10Design and build mobile applications that feel native on each platform. This skill covers React Native, Flutter, and SwiftUI with deep knowledge of platform-specific Human Interface Guidelines (Apple HIG) and Material Design, gesture handling, responsive layouts, offline-first patterns, and app store submission requirements.
11
12## Phase 1: Platform Analysis
13
141. Identify target platforms (iOS, Android, both)
152. Choose framework (React Native, Flutter, SwiftUI, or cross-platform)
163. Review platform-specific design guidelines
174. Define navigation architecture
185. Map offline requirements
19
20**STOP — Present platform and framework recommendation with rationale before design.**
21
22### Framework Selection Decision Table
23
24| Requirement | React Native | Flutter | SwiftUI | Kotlin/Compose |
25|---|---|---|---|---|
26| iOS only | Possible | Possible | Best | No |
27| Android only | Possible | Possible | No | Best |
28| Cross-platform | Good | Best | No | No |
29| Native performance critical | OK | Good | Best | Best |
30| Existing React web team | Best | Learning curve | Learning curve | Learning curve |
31| Complex animations | Good | Best | Good | Good |
32| Rapid prototyping | Good | Good | Best (iOS) | OK |
33| Large existing codebase (JS) | Best | Rewrite | Rewrite | Rewrite |
34
35## Phase 2: Design Implementation
36
371. Build component library with platform variants
382. Implement navigation (tab bar, stack, drawer)
393. Handle safe areas and notches
404. Add gesture recognizers
415. Implement responsive layouts for phone/tablet
42
43**STOP — Present navigation architecture and component inventory for review.**
44
45### Platform-Specific HIG Compliance
46
47#### Apple Human Interface Guidelines
48
49| Area | Guideline |
50|---|---|
51| Navigation | UINavigationController (push/pop), tab bars at bottom (max 5) |
52| Typography | SF Pro / SF Pro Rounded, support Dynamic Type (all 11 sizes) |
53| Safe Areas | Respect `safeAreaInsets` — never under notch/home indicator |
54| Gestures | Swipe-back for navigation, long press for context menus |
55| Haptics | UIFeedbackGenerator (impact, selection, notification) |
56| Colors | Semantic system colors (`label`, `secondaryLabel`, `systemBackground`) |
57| Modals | Sheets (`.sheet`, `.fullScreenCover`) with drag-to-dismiss |
58| Lists | Grouped inset for settings, plain for content feeds |
59| Icons | SF Symbols library (5000+ icons, variable weight/size) |
60
61#### Material Design (Android)
62
63| Area | Guideline |
64|---|---|
65| Navigation | Bottom navigation bar, navigation drawer, top app bar |
66| Typography | Roboto / product font, Material type scale |
67| Edge-to-edge | Draw behind system bars, handle window insets |
68| Gestures | Predictive back gesture (Android 14+), swipe-to-dismiss |
69| Haptics | HapticFeedbackConstants (click, long press, keyboard) |
70| Colors | Material You dynamic color from wallpaper, tonal palettes |
71| Components | FAB, snackbar, bottom sheet, chips |
72| Motion | Shared element transitions, container transform |
73
74### Cross-Platform Pattern Decision Table
75
76| Feature | iOS Pattern | Android Pattern |
77|---|---|---|
78| Back navigation | Swipe from left edge | System back button |
79| Primary action | Right nav bar button | FAB |
80| Alerts | UIAlertController | MaterialAlertDialog |
81| Loading | UIActivityIndicator | CircularProgressIndicator |
82| Segmented | UISegmentedControl | Tabs / Chips |
83| Date picker | Wheel picker | Calendar picker |
84| Pull to refresh | Native support | SwipeRefreshLayout |
85| Context menu | Long press + haptic | Long press + popup |
86
87### Safe Area Handling
88
89#### React Native
90
91```jsx
92import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
93
94function Screen() {
95 const insets = useSafeAreaInsets();
96 return (
97 <View style={{ flex: 1, paddingTop: insets.top, paddingBottom: insets.bottom }}>
98 {/* Content */}
99 </View>
100 );
101}
102```
103
104#### Flutter
105
106```dart
107Widget build(BuildContext context) {
108 return Scaffold(
109 body: SafeArea(
110 child: // Content
111 ),
112 );
113}
114```
115
116#### SwiftUI
117
118```swift
119var body: some View {
120 VStack {
121 // Content automatically respects safe areas
122 }
123 .ignoresSafeArea(.keyboard) // Only ignore keyboard if needed
124}
125```
126
127### Gesture Navigation Patterns
128
129| Gesture | Usage | Min Target |
130|---|---|---|
131| Tap | Primary action | 44x44pt |
132| Long press | Context menu / secondary action | 44x44pt |
133| Swipe horizontal | Navigation, dismiss, reveal actions | Full row |
134| Swipe vertical | Scroll, pull-to-refresh, dismiss sheet | Full area |
135| Pinch | Zoom images/maps | Content area |
136| Pan/Drag | Reorder, move elements | Drag handle |
137
138### Touch Target Rules
139
140| Rule | Value |
141|---|---|
142| Minimum size (iOS) | 44x44pt |
143| Minimum size (Android) | 48x48dp |
144| Minimum spacing | 8pt between targets |
145| Visual vs touch | Visual can be smaller; use padding for touch area |
146| Primary actions | Bottom 1/3 of screen (thumb zone) |
147
148## Phase 3: Platform Polish
149
1501. Platform-specific animations and transitions
1512. Haptic feedback integration
1523. App icon and launch screen
1534. Dark mode and Dynamic Type support
1545. App store metadata and screenshots
155
156**STOP — Test on physical devices before declaring complete.**
157
158### Responsive Layout Decision Table
159
160| Form Factor | Layout | Navigation |
161|---|---|---|
162| Phone Portrait | Single column | Bottom tabs |
163| Phone Landscape | Single column or split | Side tabs |
164| Tablet Portrait | Two columns | Sidebar |
165| Tablet Landscape | Three columns | Persistent sidebar |
166
167#### React Native Responsive
168
169```javascript
170import { useWindowDimensions } from 'react-native';
171
172function useResponsive() {
173 const { width } = useWindowDimensions();
174 return {
175 isPhone: width < 768,
176 isTablet: width >= 768 && width < 1024,
177 isDesktop: width >= 1024,
178 columns: width < 768 ? 1 : width < 1024 ? 2 : 3,
179 };
180}
181```
182
183#### Flutter Responsive
184
185```dart
186class ResponsiveLayout extends StatelessWidget {
187 Widget build(BuildContext context) {
188 return LayoutBuilder(
189 builder: (context, constraints) {
190 if (constraints.maxWidth < 600) return MobileLayout();
191 if (constraints.maxWidth < 1200) return TabletLayout();
192 return DesktopLayout();
193 },
194 );
195 }
196}
197```
198
199### Offline-First Architecture
200
201| Layer | Pattern | Implementation |
202|---|---|---|
203| Data | Local-first | SQLite/Realm as primary store, server as sync target |
204| Updates | Optimistic | Apply locally, sync in background |
205| Conflicts | Resolution strategy | Last-write-wins or field-level merge |
206| Queue | Persistent ops | Store pending operations, retry on connectivity |
207| Cache | Stale-while-revalidate | Serve cached, refresh in background |
208
209#### Implementation Checklist
210
211- [ ] Network status detection and UI indicator
212- [ ] Local database for all critical data
213- [ ] Operation queue for pending writes
214- [ ] Retry logic with exponential backoff
215- [ ] Conflict detection and resolution strategy
216- [ ] Cache invalidation policy
217- [ ] Sync status indicator in UI
218- [ ] Graceful degradation for network-only features
219
220### App Store Guidelines Summary
221
222| Requirement | Apple App Store | Google Play Store |
223|---|---|---|
224| Screenshots | 6.7" and 5.5" required, 12.9" iPad | Min 2, max 8 per device |
225| App icon | 1024x1024px, no alpha, no corners | 512x512px, adaptive recommended |
226| Privacy | Nutrition labels required | Data safety section required |
227| Review time | 24-48 hours typical | Hours to days |
228| Common rejections | Crashes, placeholder content | Policy violations, crashes |
229
230### Performance Targets
231
232| Metric | Target |
233|---|---|
234| Cold start | < 2 seconds |
235| Screen transition | < 300ms |
236| Touch response | < 100ms |
237| Scroll FPS | 60fps (no drops) |
238| Memory usage | < 200MB baseline |
239| App size | < 50MB download |
240
241## Anti-Patterns / Common Mistakes
242
243| Anti-Pattern | Why It Is Wrong | What to Do Instead |
244|---|---|---|
245| Web patterns in mobile (hover states) | No hover on touch devices | Use press/tap states |
246| Tiny touch targets (< 44pt) | Frustrating, accessibility fail | Minimum 44x44pt touch area |
247| iOS-styled buttons on Android | Feels foreign, confuses users | Use platform-native components |
248| Fixed layouts for one screen size | Breaks on tablets and foldables | Responsive layouts with breakpoints |
249| Blocking main thread with I/O | UI freezes, ANR dialogs | Async I/O, background threads |
250| Not handling keyboard appearance | Content hidden behind keyboard | Adjust layout on keyboard show |
251| Assuming constant connectivity | App crashes or hangs offline | Offline-first architecture |
252| Pixel values instead of dp/pt | Different sizes on different screens | Use density-independent units |
253| Skipping haptic feedback | App feels cheap and unresponsive | Add haptics for key interactions |
254
255## Documentation Lookup (Context7)
256
257Use `mcp__context7__resolve-library-id` then `mcp__context7__query-docs` for up-to-date docs. Returned docs override memorized knowledge.
258- `react-native` — for component API, navigation, or platform-specific modules
259- `flutter` — for widget catalog, state management, or platform channels
260
261---
262
263## Integration Points
264
265| Skill | Integration |
266|---|---|
267| `ui-ux-pro-max` | Color palettes, typography, UX guidelines |
268| `ui-design-system` | Design tokens adapted for mobile |
269| `canvas-design` | Mobile data visualization and charts |
270| `ux-researcher-designer` | Mobile usability testing |
271| `senior-frontend` | React Native component implementation |
272| `deployment` | App store submission pipeline |
273| `performance-optimization` | Mobile performance profiling |
274
275## Skill Type
276
277**FLEXIBLE** — Adapt patterns to the chosen framework and target platforms. Platform-specific guidelines should be followed when targeting a single platform; cross-platform apps may blend conventions thoughtfully.