Mobile design skill
Mobile-first design thinking and decision-making for iOS and Android apps.
by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗
npx degit davila7/claude-code-templates/cli-tool/components/skills/creative-design/mobile-design#main ~/.claude/skills/mobile-designChecked ·commit main
Files of Mobile design
Show the full text395 lines
Mobile Design System
Philosophy: Touch-first. Battery-conscious. Platform-respectful. Offline-capable. Core Principle: Mobile is NOT a small desktop. THINK mobile constraints, ASK platform choice.
🔧 Runtime Scripts
Execute these for validation (don't read, just run):
| Script | Purpose | Usage |
|---|---|---|
scripts/mobile_audit.py |
Mobile UX & Touch Audit | python scripts/mobile_audit.py <project_path> |
🔴 MANDATORY: Read Reference Files Before Working!
⛔ DO NOT start development until you read the relevant files:
Universal (Always Read)
| File | Content | Status |
|---|---|---|
| mobile-design-thinking.md | ⚠️ ANTI-MEMORIZATION: Forces thinking, prevents AI defaults | ⬜ CRITICAL FIRST |
| touch-psychology.md | Fitts' Law, gestures, haptics, thumb zone | ⬜ CRITICAL |
| mobile-performance.md | RN/Flutter performance, 60fps, memory | ⬜ CRITICAL |
| mobile-backend.md | Push notifications, offline sync, mobile API | ⬜ CRITICAL |
| mobile-testing.md | Testing pyramid, E2E, platform-specific | ⬜ CRITICAL |
| mobile-debugging.md | Native vs JS debugging, Flipper, Logcat | ⬜ CRITICAL |
| mobile-navigation.md | Tab/Stack/Drawer, deep linking | ⬜ Read |
| mobile-typography.md | System fonts, Dynamic Type, a11y | ⬜ Read |
| mobile-color-system.md | OLED, dark mode, battery-aware | ⬜ Read |
| decision-trees.md | Framework/state/storage selection | ⬜ Read |
🧠 mobile-design-thinking.md is PRIORITY! This file ensures AI thinks instead of using memorized patterns.
Platform-Specific (Read Based on Target)
| Platform | File | Content | When to Read |
|---|---|---|---|
| iOS | platform-ios.md | Human Interface Guidelines, SF Pro, SwiftUI patterns | Building for iPhone/iPad |
| Android | platform-android.md | Material Design 3, Roboto, Compose patterns | Building for Android |
| Cross-Platform | Both above | Platform divergence points | React Native / Flutter |
🔴 If building for iOS → Read platform-ios.md FIRST! 🔴 If building for Android → Read platform-android.md FIRST! 🔴 If cross-platform → Read BOTH and apply conditional platform logic!
⚠️ CRITICAL: ASK BEFORE ASSUMING (MANDATORY)
STOP! If the user's request is open-ended, DO NOT default to your favorites.
You MUST Ask If Not Specified:
| Aspect | Ask | Why |
|---|---|---|
| Platform | "iOS, Android, or both?" | Affects EVERY design decision |
| Framework | "React Native, Flutter, or native?" | Determines patterns and tools |
| Navigation | "Tab bar, drawer, or stack-based?" | Core UX decision |
| State | "What state management? (Zustand/Redux/Riverpod/BLoC?)" | Architecture foundation |
| Offline | "Does this need to work offline?" | Affects data strategy |
| Target devices | "Phone only, or tablet support?" | Layout complexity |
⛔ AI MOBILE ANTI-PATTERNS (YASAK LİSTESİ)
🚫 These are AI default tendencies that MUST be avoided!
Performance Sins
| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
|---|---|---|
| ScrollView for long lists | Renders ALL items, memory explodes | Use FlatList / FlashList / ListView.builder |
| Inline renderItem function | New function every render, all items re-render | useCallback + React.memo |
| Missing keyExtractor | Index-based keys cause bugs on reorder | Unique, stable ID from data |
| Skip getItemLayout | Async layout = janky scroll | Provide when items have fixed height |
| setState() everywhere | Unnecessary widget rebuilds | Targeted state, const constructors |
| Native driver: false | Animations blocked by JS thread | useNativeDriver: true always |
| console.log in production | Blocks JS thread severely | Remove before release build |
| Skip React.memo/const | Every item re-renders on any change | Memoize list items ALWAYS |
Touch/UX Sins
| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
|---|---|---|
| Touch target < 44px | Impossible to tap accurately, frustrating | Minimum 44pt (iOS) / 48dp (Android) |
| Spacing < 8px between targets | Accidental taps on neighbors | Minimum 8-12px gap |
| Gesture-only interactions | Motor impaired users excluded | Always provide button alternative |
| No loading state | User thinks app crashed | ALWAYS show loading feedback |
| No error state | User stuck, no recovery path | Show error with retry option |
| No offline handling | Crash/block when network lost | Graceful degradation, cached data |
| Ignore platform conventions | Users confused, muscle memory broken | iOS feels iOS, Android feels Android |
Security Sins
| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
|---|---|---|
| Token in AsyncStorage | Easily accessible, stolen on rooted device | SecureStore / Keychain / EncryptedSharedPreferences |
| Hardcode API keys | Reverse engineered from APK/IPA | Environment variables, secure storage |
| Skip SSL pinning | MITM attacks possible | Pin certificates in production |
| Log sensitive data | Logs can be extracted | Never log tokens, passwords, PII |
Architecture Sins
| ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO |
|---|---|---|
| Business logic in UI | Untestable, unmaintainable | Service layer separation |
| Global state for everything | Unnecessary re-renders, complexity | Local state default, lift when needed |
| Deep linking as afterthought | Notifications, shares broken | Plan deep links from day one |
| Skip dispose/cleanup | Memory leaks, zombie listeners | Clean up subscriptions, timers |
📱 Platform Decision Matrix
When to Unify vs Diverge
UNIFY (same on both) DIVERGE (platform-specific)
─────────────────── ──────────────────────────
Business Logic ✅ Always -
Data Layer ✅ Always -
Core Features ✅ Always -
Navigation - ✅ iOS: edge swipe, Android: back button
Gestures - ✅ Platform-native feel
Icons - ✅ SF Symbols vs Material Icons
Date Pickers - ✅ Native pickers feel right
Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog
Typography - ✅ SF Pro vs Roboto (or custom)
Error Dialogs - ✅ Platform conventions for alerts
Quick Reference: Platform Defaults
| Element | iOS | Android |
|---|---|---|
| Primary Font | SF Pro / SF Compact | Roboto |
| Min Touch Target | 44pt × 44pt | 48dp × 48dp |
| Back Navigation | Edge swipe left | System back button/gesture |
| Bottom Tab Icons | SF Symbols | Material Symbols |
| Action Sheet | UIActionSheet from bottom | Bottom Sheet / Dialog |
| Progress | Spinner | Linear progress (Material) |
| Pull to Refresh | Native UIRefreshControl | SwipeRefreshLayout |
🧠 Mobile UX Psychology (Quick Reference)
Fitts' Law for Touch
Desktop: Cursor is precise (1px)
Mobile: Finger is imprecise (~7mm contact area)
→ Touch targets MUST be 44-48px minimum
→ Important actions in THUMB ZONE (bottom of screen)
→ Destructive actions AWAY from easy reach
Thumb Zone (One-Handed Usage)
┌─────────────────────────────┐
│ HARD TO REACH │ ← Navigation, menu, back
│ (stretch) │
├─────────────────────────────┤
│ OK TO REACH │ ← Secondary actions
│ (natural) │
├─────────────────────────────┤
│ EASY TO REACH │ ← PRIMARY CTAs, tab bar
│ (thumb's natural arc) │ ← Main content interaction
└─────────────────────────────┘
[ HOME ]
Mobile-Specific Cognitive Load
| Desktop | Mobile Difference |
|---|---|
| Multiple windows | ONE task at a time |
| Keyboard shortcuts | Touch gestures |
| Hover states | NO hover (tap or nothing) |
| Large viewport | Limited space, scroll vertical |
| Stable attention | Interrupted constantly |
For deep dive: touch-psychology.md
⚡ Performance Principles (Quick Reference)
React Native Critical Rules
// ✅ CORRECT: Memoized renderItem + React.memo wrapper
const ListItem = React.memo(({ item }: { item: Item }) => (
<View style={styles.item}>
<Text>{item.title}</Text>
</View>
));
const renderItem = useCallback(
({ item }: { item: Item }) => <ListItem item={item} />,
[]
);
// ✅ CORRECT: FlatList with all optimizations
<FlatList
data={items}
renderItem={renderItem}
keyExtractor={(item) => item.id} // Stable ID, NOT index
getItemLayout={(data, index) => ({
length: ITEM_HEIGHT,
offset: ITEM_HEIGHT * index,
index,
})}
removeClippedSubviews={true}
maxToRenderPerBatch={10}
windowSize={5}
/>
Flutter Critical Rules
// ✅ CORRECT: const constructors prevent rebuilds
class MyWidget extends StatelessWidget {
const MyWidget({super.key}); // CONST!
@override
Widget build(BuildContext context) {
return const Column( // CONST!
children: [
Text('Static content'),
MyConstantWidget(),
],
);
}
}
// ✅ CORRECT: Targeted state with ValueListenableBuilder
ValueListenableBuilder<int>(
valueListenable: counter,
builder: (context, value, child) => Text('$value'),
child: const ExpensiveWidget(), // Won't rebuild!
)
Animation Performance
GPU-accelerated (FAST): CPU-bound (SLOW):
├── transform ├── width, height
├── opacity ├── top, left, right, bottom
└── (use these ONLY) ├── margin, padding
└── (AVOID animating these)
For complete guide: mobile-performance.md
📝 CHECKPOINT (MANDATORY Before Any Mobile Work)
Before writing ANY mobile code, you MUST complete this checkpoint:
🧠 CHECKPOINT:
Platform: [ iOS / Android / Both ]
Framework: [ React Native / Flutter / SwiftUI / Kotlin ]
Files Read: [ List the skill files you've read ]
3 Principles I Will Apply:
1. _______________
2. _______________
3. _______________
Anti-Patterns I Will Avoid:
1. _______________
2. _______________
Example:
🧠 CHECKPOINT:
Platform: iOS + Android (Cross-platform)
Framework: React Native + Expo
Files Read: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md
3 Principles I Will Apply:
1. FlatList with React.memo + useCallback for all lists
2. 48px touch targets, thumb zone for primary CTAs
3. Platform-specific navigation (edge swipe iOS, back button Android)
Anti-Patterns I Will Avoid:
1. ScrollView for lists → FlatList
2. Inline renderItem → Memoized
3. AsyncStorage for tokens → SecureStore
🔴 Can't fill the checkpoint? → GO BACK AND READ THE SKILL FILES.
🔧 Framework Decision Tree
WHAT ARE YOU BUILDING?
│
├── Need OTA updates + rapid iteration + web team
│ └── ✅ React Native + Expo
│
├── Need pixel-perfect custom UI + performance critical
│ └── ✅ Flutter
│
├── Deep native features + single platform focus
│ ├── iOS only → SwiftUI
│ └── Android only → Kotlin + Jetpack Compose
│
├── Existing RN codebase + new features
│ └── ✅ React Native (bare workflow)
│
└── Enterprise + existing Flutter codebase
└── ✅ Flutter
For complete decision trees: decision-trees.md
📋 Pre-Development Checklist
Before Starting ANY Mobile Project
- Platform confirmed? (iOS / Android / Both)
- Framework chosen? (RN / Flutter / Native)
- Navigation pattern decided? (Tabs / Stack / Drawer)
- State management selected? (Zustand / Redux / Riverpod / BLoC)
- Offline requirements known?
- Deep linking planned from day one?
- Target devices defined? (Phone / Tablet / Both)
Before Every Screen
- Touch targets ≥ 44-48px?
- Primary CTA in thumb zone?
- Loading state exists?
- Error state with retry exists?
- Offline handling considered?
- Platform conventions followed?
Before Release
- console.log removed?
- SecureStore for sensitive data?
- SSL pinning enabled?
- Lists optimized (memo, keyExtractor)?
- Memory cleanup on unmount?
- Tested on low-end devices?
- Accessibility labels on all interactive elements?
📚 Reference Files
For deeper guidance on specific areas:
| File | When to Use |
|---|---|
| mobile-design-thinking.md | FIRST! Anti-memorization, forces context-based thinking |
| touch-psychology.md | Understanding touch interaction, Fitts' Law, gesture design |
| mobile-performance.md | Optimizing RN/Flutter, 60fps, memory/battery |
| platform-ios.md | iOS-specific design, HIG compliance |
| platform-android.md | Android-specific design, Material Design 3 |
| mobile-navigation.md | Navigation patterns, deep linking |
| mobile-typography.md | Type scale, system fonts, accessibility |
| mobile-color-system.md | OLED optimization, dark mode, battery |
| decision-trees.md | Framework, state, storage decisions |
Remember: Mobile users are impatient, interrupted, and using imprecise fingers on small screens. Design for the WORST conditions: bad network, one hand, bright sun, low battery. If it works there, it works everywhere.
| 1 | |
| 2 | name mobile-design |
| 3 | description Mobile-first design thinking and decision-making for iOS and Android apps. Touch interaction, performance patterns, platform conventions. Teaches principles, not fixed values. Use when building React Native, Flutter, or native mobile apps. |
| 4 | allowed-tools Read, Glob, Grep, Bash |
| 5 | |
| 6 | |
| 7 | # Mobile Design System |
| 8 | |
| 9 | > **Philosophy:** Touch-first. Battery-conscious. Platform-respectful. Offline-capable. |
| 10 | > **Core Principle:** Mobile is NOT a small desktop. THINK mobile constraints, ASK platform choice. |
| 11 | |
| 12 | |
| 13 | |
| 14 | ## 🔧 Runtime Scripts |
| 15 | |
| 16 | **Execute these for validation (don't read, just run):** |
| 17 | |
| 18 | | Script | Purpose | Usage | |
| 19 | |--------|---------|-------| |
| 20 | | `scripts/mobile_audit.py` | Mobile UX & Touch Audit | `python scripts/mobile_audit.py <project_path>` | |
| 21 | |
| 22 | |
| 23 | |
| 24 | ## 🔴 MANDATORY: Read Reference Files Before Working! |
| 25 | |
| 26 | **⛔ DO NOT start development until you read the relevant files:** |
| 27 | |
| 28 | ### Universal (Always Read) |
| 29 | |
| 30 | | File | Content | Status | |
| 31 | |------|---------|--------| |
| 32 | | **[mobile-design-thinking.md]** | **⚠️ ANTI-MEMORIZATION: Forces thinking, prevents AI defaults** | **⬜ CRITICAL FIRST** | |
| 33 | | **[touch-psychology.md]** | **Fitts' Law, gestures, haptics, thumb zone** | **⬜ CRITICAL** | |
| 34 | | **[mobile-performance.md]** | **RN/Flutter performance, 60fps, memory** | **⬜ CRITICAL** | |
| 35 | | **[mobile-backend.md]** | **Push notifications, offline sync, mobile API** | **⬜ CRITICAL** | |
| 36 | | **[mobile-testing.md]** | **Testing pyramid, E2E, platform-specific** | **⬜ CRITICAL** | |
| 37 | | **[mobile-debugging.md]** | **Native vs JS debugging, Flipper, Logcat** | **⬜ CRITICAL** | |
| 38 | | [mobile-navigation.md] | Tab/Stack/Drawer, deep linking | ⬜ Read | |
| 39 | | [mobile-typography.md] | System fonts, Dynamic Type, a11y | ⬜ Read | |
| 40 | | [mobile-color-system.md] | OLED, dark mode, battery-aware | ⬜ Read | |
| 41 | | [decision-trees.md] | Framework/state/storage selection | ⬜ Read | |
| 42 | |
| 43 | > 🧠 **mobile-design-thinking.md is PRIORITY!** This file ensures AI thinks instead of using memorized patterns. |
| 44 | |
| 45 | ### Platform-Specific (Read Based on Target) |
| 46 | |
| 47 | | Platform | File | Content | When to Read | |
| 48 | |----------|------|---------|--------------| |
| 49 | | **iOS** | [platform-ios.md] | Human Interface Guidelines, SF Pro, SwiftUI patterns | Building for iPhone/iPad | |
| 50 | | **Android** | [platform-android.md] | Material Design 3, Roboto, Compose patterns | Building for Android | |
| 51 | | **Cross-Platform** | Both above | Platform divergence points | React Native / Flutter | |
| 52 | |
| 53 | > 🔴 **If building for iOS → Read platform-ios.md FIRST!** |
| 54 | > 🔴 **If building for Android → Read platform-android.md FIRST!** |
| 55 | > 🔴 **If cross-platform → Read BOTH and apply conditional platform logic!** |
| 56 | |
| 57 | |
| 58 | |
| 59 | ## ⚠️ CRITICAL: ASK BEFORE ASSUMING (MANDATORY) |
| 60 | |
| 61 | > **STOP! If the user's request is open-ended, DO NOT default to your favorites.** |
| 62 | |
| 63 | ### You MUST Ask If Not Specified: |
| 64 | |
| 65 | | Aspect | Ask | Why | |
| 66 | |--------|-----|-----| |
| 67 | | **Platform** | "iOS, Android, or both?" | Affects EVERY design decision | |
| 68 | | **Framework** | "React Native, Flutter, or native?" | Determines patterns and tools | |
| 69 | | **Navigation** | "Tab bar, drawer, or stack-based?" | Core UX decision | |
| 70 | | **State** | "What state management? (Zustand/Redux/Riverpod/BLoC?)" | Architecture foundation | |
| 71 | | **Offline** | "Does this need to work offline?" | Affects data strategy | |
| 72 | | **Target devices** | "Phone only, or tablet support?" | Layout complexity | |
| 73 | |
| 74 | ### ⛔ AI MOBILE ANTI-PATTERNS (YASAK LİSTESİ) |
| 75 | |
| 76 | > 🚫 **These are AI default tendencies that MUST be avoided!** |
| 77 | |
| 78 | #### Performance Sins |
| 79 | |
| 80 | | ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO | |
| 81 | |-------------|----------------|--------------| |
| 82 | | **ScrollView for long lists** | Renders ALL items, memory explodes | Use `FlatList` / `FlashList` / `ListView.builder` | |
| 83 | | **Inline renderItem function** | New function every render, all items re-render | `useCallback` + `React.memo` | |
| 84 | | **Missing keyExtractor** | Index-based keys cause bugs on reorder | Unique, stable ID from data | |
| 85 | | **Skip getItemLayout** | Async layout = janky scroll | Provide when items have fixed height | |
| 86 | | **setState() everywhere** | Unnecessary widget rebuilds | Targeted state, `const` constructors | |
| 87 | | **Native driver: false** | Animations blocked by JS thread | `useNativeDriver: true` always | |
| 88 | | **console.log in production** | Blocks JS thread severely | Remove before release build | |
| 89 | | **Skip React.memo/const** | Every item re-renders on any change | Memoize list items ALWAYS | |
| 90 | |
| 91 | #### Touch/UX Sins |
| 92 | |
| 93 | | ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO | |
| 94 | |-------------|----------------|--------------| |
| 95 | | **Touch target < 44px** | Impossible to tap accurately, frustrating | Minimum 44pt (iOS) / 48dp (Android) | |
| 96 | | **Spacing < 8px between targets** | Accidental taps on neighbors | Minimum 8-12px gap | |
| 97 | | **Gesture-only interactions** | Motor impaired users excluded | Always provide button alternative | |
| 98 | | **No loading state** | User thinks app crashed | ALWAYS show loading feedback | |
| 99 | | **No error state** | User stuck, no recovery path | Show error with retry option | |
| 100 | | **No offline handling** | Crash/block when network lost | Graceful degradation, cached data | |
| 101 | | **Ignore platform conventions** | Users confused, muscle memory broken | iOS feels iOS, Android feels Android | |
| 102 | |
| 103 | #### Security Sins |
| 104 | |
| 105 | | ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO | |
| 106 | |-------------|----------------|--------------| |
| 107 | | **Token in AsyncStorage** | Easily accessible, stolen on rooted device | `SecureStore` / `Keychain` / `EncryptedSharedPreferences` | |
| 108 | | **Hardcode API keys** | Reverse engineered from APK/IPA | Environment variables, secure storage | |
| 109 | | **Skip SSL pinning** | MITM attacks possible | Pin certificates in production | |
| 110 | | **Log sensitive data** | Logs can be extracted | Never log tokens, passwords, PII | |
| 111 | |
| 112 | #### Architecture Sins |
| 113 | |
| 114 | | ❌ NEVER DO | Why It's Wrong | ✅ ALWAYS DO | |
| 115 | |-------------|----------------|--------------| |
| 116 | | **Business logic in UI** | Untestable, unmaintainable | Service layer separation | |
| 117 | | **Global state for everything** | Unnecessary re-renders, complexity | Local state default, lift when needed | |
| 118 | | **Deep linking as afterthought** | Notifications, shares broken | Plan deep links from day one | |
| 119 | | **Skip dispose/cleanup** | Memory leaks, zombie listeners | Clean up subscriptions, timers | |
| 120 | |
| 121 | |
| 122 | |
| 123 | ## 📱 Platform Decision Matrix |
| 124 | |
| 125 | ### When to Unify vs Diverge |
| 126 | |
| 127 | |
| 128 | UNIFY (same on both) DIVERGE (platform-specific) |
| 129 | ─────────────────── ────────────────────────── |
| 130 | Business Logic ✅ Always - |
| 131 | Data Layer ✅ Always - |
| 132 | Core Features ✅ Always - |
| 133 | |
| 134 | Navigation - ✅ iOS: edge swipe, Android: back button |
| 135 | Gestures - ✅ Platform-native feel |
| 136 | Icons - ✅ SF Symbols vs Material Icons |
| 137 | Date Pickers - ✅ Native pickers feel right |
| 138 | Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog |
| 139 | Typography - ✅ SF Pro vs Roboto (or custom) |
| 140 | Error Dialogs - ✅ Platform conventions for alerts |
| 141 | |
| 142 | |
| 143 | ### Quick Reference: Platform Defaults |
| 144 | |
| 145 | | Element | iOS | Android | |
| 146 | |---------|-----|---------| |
| 147 | | **Primary Font** | SF Pro / SF Compact | Roboto | |
| 148 | | **Min Touch Target** | 44pt × 44pt | 48dp × 48dp | |
| 149 | | **Back Navigation** | Edge swipe left | System back button/gesture | |
| 150 | | **Bottom Tab Icons** | SF Symbols | Material Symbols | |
| 151 | | **Action Sheet** | UIActionSheet from bottom | Bottom Sheet / Dialog | |
| 152 | | **Progress** | Spinner | Linear progress (Material) | |
| 153 | | **Pull to Refresh** | Native UIRefreshControl | SwipeRefreshLayout | |
| 154 | |
| 155 | |
| 156 | |
| 157 | ## 🧠 Mobile UX Psychology (Quick Reference) |
| 158 | |
| 159 | ### Fitts' Law for Touch |
| 160 | |
| 161 | |
| 162 | Desktop: Cursor is precise (1px) |
| 163 | Mobile: Finger is imprecise (~7mm contact area) |
| 164 | |
| 165 | → Touch targets MUST be 44-48px minimum |
| 166 | → Important actions in THUMB ZONE (bottom of screen) |
| 167 | → Destructive actions AWAY from easy reach |
| 168 | |
| 169 | |
| 170 | ### Thumb Zone (One-Handed Usage) |
| 171 | |
| 172 | |
| 173 | ┌─────────────────────────────┐ |
| 174 | │ HARD TO REACH │ ← Navigation, menu, back |
| 175 | │ (stretch) │ |
| 176 | ├─────────────────────────────┤ |
| 177 | │ OK TO REACH │ ← Secondary actions |
| 178 | │ (natural) │ |
| 179 | ├─────────────────────────────┤ |
| 180 | │ EASY TO REACH │ ← PRIMARY CTAs, tab bar |
| 181 | │ (thumb's natural arc) │ ← Main content interaction |
| 182 | └─────────────────────────────┘ |
| 183 | [ HOME ] |
| 184 | |
| 185 | |
| 186 | ### Mobile-Specific Cognitive Load |
| 187 | |
| 188 | | Desktop | Mobile Difference | |
| 189 | |---------|-------------------| |
| 190 | | Multiple windows | ONE task at a time | |
| 191 | | Keyboard shortcuts | Touch gestures | |
| 192 | | Hover states | NO hover (tap or nothing) | |
| 193 | | Large viewport | Limited space, scroll vertical | |
| 194 | | Stable attention | Interrupted constantly | |
| 195 | |
| 196 | For deep dive: [touch-psychology.md] |
| 197 | |
| 198 | |
| 199 | |
| 200 | ## ⚡ Performance Principles (Quick Reference) |
| 201 | |
| 202 | ### React Native Critical Rules |
| 203 | |
| 204 | |
| 205 | // ✅ CORRECT: Memoized renderItem + React.memo wrapper |
| 206 | const ListItem = React.memo(({ item }: { item: Item }) => ( |
| 207 | <View style={styles.item}> |
| 208 | <Text>{item.title}</Text> |
| 209 | </View> |
| 210 | )); |
| 211 | |
| 212 | const renderItem = useCallback( |
| 213 | ({ item }: { item: Item }) => <ListItem item={item} />, |
| 214 | [] |
| 215 | ); |
| 216 | |
| 217 | // ✅ CORRECT: FlatList with all optimizations |
| 218 | <FlatList |
| 219 | data={items} |
| 220 | renderItem={renderItem} |
| 221 | keyExtractor={(item) => item.id} // Stable ID, NOT index |
| 222 | getItemLayout={(data, index) => ({ |
| 223 | length: ITEM_HEIGHT, |
| 224 | offset: ITEM_HEIGHT * index, |
| 225 | index, |
| 226 | })} |
| 227 | removeClippedSubviews={true} |
| 228 | maxToRenderPerBatch={10} |
| 229 | windowSize={5} |
| 230 | /> |
| 231 | |
| 232 | |
| 233 | ### Flutter Critical Rules |
| 234 | |
| 235 | |
| 236 | // ✅ CORRECT: const constructors prevent rebuilds |
| 237 | class MyWidget extends StatelessWidget { |
| 238 | const MyWidget({super.key}); // CONST! |
| 239 | |
| 240 | @override |
| 241 | Widget build(BuildContext context) { |
| 242 | return const Column( // CONST! |
| 243 | children: [ |
| 244 | Text('Static content'), |
| 245 | MyConstantWidget(), |
| 246 | ], |
| 247 | ); |
| 248 | } |
| 249 | } |
| 250 | |
| 251 | // ✅ CORRECT: Targeted state with ValueListenableBuilder |
| 252 | ValueListenableBuilder<int>( |
| 253 | valueListenable: counter, |
| 254 | builder: (context, value, child) => Text('$value'), |
| 255 | child: const ExpensiveWidget(), // Won't rebuild! |
| 256 | ) |
| 257 | |
| 258 | |
| 259 | ### Animation Performance |
| 260 | |
| 261 | |
| 262 | GPU-accelerated (FAST): CPU-bound (SLOW): |
| 263 | ├── transform ├── width, height |
| 264 | ├── opacity ├── top, left, right, bottom |
| 265 | └── (use these ONLY) ├── margin, padding |
| 266 | └── (AVOID animating these) |
| 267 | |
| 268 | |
| 269 | For complete guide: [mobile-performance.md] |
| 270 | |
| 271 | |
| 272 | |
| 273 | ## 📝 CHECKPOINT (MANDATORY Before Any Mobile Work) |
| 274 | |
| 275 | > **Before writing ANY mobile code, you MUST complete this checkpoint:** |
| 276 | |
| 277 | |
| 278 | 🧠 CHECKPOINT: |
| 279 | |
| 280 | Platform: [ iOS / Android / Both ] |
| 281 | Framework: [ React Native / Flutter / SwiftUI / Kotlin ] |
| 282 | Files Read: [ List the skill files you've read ] |
| 283 | |
| 284 | 3 Principles I Will Apply: |
| 285 | 1. _______________ |
| 286 | 2. _______________ |
| 287 | 3. _______________ |
| 288 | |
| 289 | Anti-Patterns I Will Avoid: |
| 290 | 1. _______________ |
| 291 | 2. _______________ |
| 292 | |
| 293 | |
| 294 | **Example:** |
| 295 | |
| 296 | 🧠 CHECKPOINT: |
| 297 | |
| 298 | Platform: iOS + Android (Cross-platform) |
| 299 | Framework: React Native + Expo |
| 300 | Files Read: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md |
| 301 | |
| 302 | 3 Principles I Will Apply: |
| 303 | 1. FlatList with React.memo + useCallback for all lists |
| 304 | 2. 48px touch targets, thumb zone for primary CTAs |
| 305 | 3. Platform-specific navigation (edge swipe iOS, back button Android) |
| 306 | |
| 307 | Anti-Patterns I Will Avoid: |
| 308 | 1. ScrollView for lists → FlatList |
| 309 | 2. Inline renderItem → Memoized |
| 310 | 3. AsyncStorage for tokens → SecureStore |
| 311 | |
| 312 | |
| 313 | > 🔴 **Can't fill the checkpoint? → GO BACK AND READ THE SKILL FILES.** |
| 314 | |
| 315 | |
| 316 | |
| 317 | ## 🔧 Framework Decision Tree |
| 318 | |
| 319 | |
| 320 | WHAT ARE YOU BUILDING? |
| 321 | │ |
| 322 | ├── Need OTA updates + rapid iteration + web team |
| 323 | │ └── ✅ React Native + Expo |
| 324 | │ |
| 325 | ├── Need pixel-perfect custom UI + performance critical |
| 326 | │ └── ✅ Flutter |
| 327 | │ |
| 328 | ├── Deep native features + single platform focus |
| 329 | │ ├── iOS only → SwiftUI |
| 330 | │ └── Android only → Kotlin + Jetpack Compose |
| 331 | │ |
| 332 | ├── Existing RN codebase + new features |
| 333 | │ └── ✅ React Native (bare workflow) |
| 334 | │ |
| 335 | └── Enterprise + existing Flutter codebase |
| 336 | └── ✅ Flutter |
| 337 | |
| 338 | |
| 339 | For complete decision trees: [decision-trees.md] |
| 340 | |
| 341 | |
| 342 | |
| 343 | ## 📋 Pre-Development Checklist |
| 344 | |
| 345 | ### Before Starting ANY Mobile Project |
| 346 | |
| 347 | [ ] **Platform confirmed?** (iOS / Android / Both) |
| 348 | [ ] **Framework chosen?** (RN / Flutter / Native) |
| 349 | [ ] **Navigation pattern decided?** (Tabs / Stack / Drawer) |
| 350 | [ ] **State management selected?** (Zustand / Redux / Riverpod / BLoC) |
| 351 | [ ] **Offline requirements known?** |
| 352 | [ ] **Deep linking planned from day one?** |
| 353 | [ ] **Target devices defined?** (Phone / Tablet / Both) |
| 354 | |
| 355 | ### Before Every Screen |
| 356 | |
| 357 | [ ] **Touch targets ≥ 44-48px?** |
| 358 | [ ] **Primary CTA in thumb zone?** |
| 359 | [ ] **Loading state exists?** |
| 360 | [ ] **Error state with retry exists?** |
| 361 | [ ] **Offline handling considered?** |
| 362 | [ ] **Platform conventions followed?** |
| 363 | |
| 364 | ### Before Release |
| 365 | |
| 366 | [ ] **console.log removed?** |
| 367 | [ ] **SecureStore for sensitive data?** |
| 368 | [ ] **SSL pinning enabled?** |
| 369 | [ ] **Lists optimized (memo, keyExtractor)?** |
| 370 | [ ] **Memory cleanup on unmount?** |
| 371 | [ ] **Tested on low-end devices?** |
| 372 | [ ] **Accessibility labels on all interactive elements?** |
| 373 | |
| 374 | |
| 375 | |
| 376 | ## 📚 Reference Files |
| 377 | |
| 378 | For deeper guidance on specific areas: |
| 379 | |
| 380 | | File | When to Use | |
| 381 | |------|-------------| |
| 382 | | [mobile-design-thinking.md] | **FIRST! Anti-memorization, forces context-based thinking** | |
| 383 | | [touch-psychology.md] | Understanding touch interaction, Fitts' Law, gesture design | |
| 384 | | [mobile-performance.md] | Optimizing RN/Flutter, 60fps, memory/battery | |
| 385 | | [platform-ios.md] | iOS-specific design, HIG compliance | |
| 386 | | [platform-android.md] | Android-specific design, Material Design 3 | |
| 387 | | [mobile-navigation.md] | Navigation patterns, deep linking | |
| 388 | | [mobile-typography.md] | Type scale, system fonts, accessibility | |
| 389 | | [mobile-color-system.md] | OLED optimization, dark mode, battery | |
| 390 | | [decision-trees.md] | Framework, state, storage decisions | |
| 391 | |
| 392 | |
| 393 | |
| 394 | > **Remember:** Mobile users are impatient, interrupted, and using imprecise fingers on small screens. Design for the WORST conditions: bad network, one hand, bright sun, low battery. If it works there, it works everywhere. |
| 395 |
Discussion
Alternatives
Browse more free Claude skills or everything in Design.