Sistema de Design Mobile
Filosofia: Toque em primeiro lugar. Consciente de bateria. Respeitoso com a plataforma. Capaz offline.
Princípio Central: Mobile NÃO é um desktop pequeno. PENSE em restrições mobile, PERGUNTE sobre a escolha de plataforma.
🔧 Scripts de Execução
Execute estes para validação (não leia, apenas execute):
| Script |
Propósito |
Uso |
scripts/mobile_audit.py |
Auditoria de UX Mobile e Toque |
python scripts/mobile_audit.py <project_path> |
🔴 OBRIGATÓRIO: Leia os Arquivos de Referência Antes de Trabalhar!
⛔ NÃO comece o desenvolvimento até ler os arquivos relevantes:
Universal (Sempre Leia)
| Arquivo |
Conteúdo |
Status |
| mobile-design-thinking.md |
⚠️ ANTI-MEMORIZAÇÃO: Força o pensamento, previne defaults de IA |
⬜ CRÍTICO PRIMEIRO |
| touch-psychology.md |
Lei de Fitts, gestos, haptics, zona de polegar |
⬜ CRÍTICO |
| mobile-performance.md |
Performance RN/Flutter, 60fps, memória |
⬜ CRÍTICO |
| mobile-backend.md |
Notificações push, sincronização offline, API mobile |
⬜ CRÍTICO |
| mobile-testing.md |
Pirâmide de testes, E2E, específico por plataforma |
⬜ CRÍTICO |
| mobile-debugging.md |
Debugging nativo vs JS, Flipper, Logcat |
⬜ CRÍTICO |
| mobile-navigation.md |
Tab/Stack/Drawer, deep linking |
⬜ Leia |
| mobile-typography.md |
Fontes do sistema, Dynamic Type, a11y |
⬜ Leia |
| mobile-color-system.md |
OLED, modo escuro, ciente de bateria |
⬜ Leia |
| decision-trees.md |
Seleção de framework/state/storage |
⬜ Leia |
🧠 mobile-design-thinking.md é PRIORIDADE! Este arquivo garante que a IA pense em vez de usar padrões memorizados.
Específico por Plataforma (Leia Baseado no Alvo)
| Plataforma |
Arquivo |
Conteúdo |
Quando Ler |
| iOS |
platform-ios.md |
Human Interface Guidelines, SF Pro, padrões SwiftUI |
Construindo para iPhone/iPad |
| Android |
platform-android.md |
Material Design 3, Roboto, padrões Compose |
Construindo para Android |
| Cross-Platform |
Ambos acima |
Pontos de divergência de plataforma |
React Native / Flutter |
🔴 Se construir para iOS → Leia platform-ios.md PRIMEIRO!
🔴 Se construir para Android → Leia platform-android.md PRIMEIRO!
🔴 Se cross-platform → Leia AMBOS e aplique lógica condicional por plataforma!
⚠️ CRÍTICO: PERGUNTE ANTES DE ASSUMIR (OBRIGATÓRIO)
PARE! Se a solicitação do usuário for aberta, NÃO padronize para seus favoritos.
Você DEVE Perguntar Se Não Especificado:
| Aspecto |
Pergunte |
Por Quê |
| Plataforma |
"iOS, Android, ou ambos?" |
Afeta TODA decisão de design |
| Framework |
"React Native, Flutter, ou nativo?" |
Determina padrões e ferramentas |
| Navegação |
"Tab bar, drawer, ou baseado em stack?" |
Decisão central de UX |
| State |
"Qual state management? (Zustand/Redux/Riverpod/BLoC?)" |
Fundação da arquitetura |
| Offline |
"Isso precisa funcionar offline?" |
Afeta estratégia de dados |
| Dispositivos alvo |
"Apenas telefone, ou suporte a tablet?" |
Complexidade do layout |
⛔ ANTI-PADRÕES MOBILE DE IA (LISTA DE PROIBIÇÕES)
🚫 Estas são tendências padrão de IA que DEVEM ser evitadas!
Pecados de Performance
| ❌ NUNCA FAÇA |
Por Que Está Errado |
✅ SEMPRE FAÇA |
| ScrollView para listas longas |
Renderiza TODOS os itens, memória explode |
Use FlatList / FlashList / ListView.builder |
| Função renderItem inline |
Nova função a cada render, todos itens re-renderizam |
useCallback + React.memo |
| Sem keyExtractor |
Chaves baseadas em índice causam bugs ao reordenar |
ID único e estável dos dados |
| Pule getItemLayout |
Layout assíncrono = scroll tremido |
Forneça quando itens têm altura fixa |
| setState() em toda parte |
Re-renderizações desnecessárias de widgets |
State direcionado, construtores const |
| Native driver: false |
Animações bloqueadas pela thread JS |
useNativeDriver: true sempre |
| console.log em produção |
Bloqueia thread JS severamente |
Remova antes de release build |
| Pule React.memo/const |
Cada item re-renderiza em qualquer mudança |
Memoize itens de lista SEMPRE |
Pecados de Toque/UX
| ❌ NUNCA FAÇA |
Por Que Está Errado |
✅ SEMPRE FAÇA |
| Alvo de toque < 44px |
Impossível tocar com precisão, frustrante |
Mínimo 44pt (iOS) / 48dp (Android) |
| Espaçamento < 8px entre alvos |
Toques acidentais em vizinhos |
Mínimo 8-12px de lacuna |
| Interações apenas por gesto |
Usuários com deficiência motora excluídos |
Sempre forneça alternativa com botão |
| Sem estado de carregamento |
Usuário acha que app travou |
SEMPRE mostre feedback de carregamento |
| Sem estado de erro |
Usuário travado, sem caminho de recuperação |
Mostre erro com opção de retry |
| Sem tratamento offline |
Crash/bloqueio quando rede se perde |
Degradação graciosa, dados em cache |
| Ignore convenções de plataforma |
Usuários confusos, memória muscular quebrada |
iOS parece iOS, Android parece Android |
Pecados de Segurança
| ❌ NUNCA FAÇA |
Por Que Está Errado |
✅ SEMPRE FAÇA |
| Token em AsyncStorage |
Facilmente acessível, roubado em device rooteado |
SecureStore / Keychain / EncryptedSharedPreferences |
| Hardcode de chaves API |
Reverse engineered de APK/IPA |
Variáveis de ambiente, armazenamento seguro |
| Pule SSL pinning |
Ataques MITM possíveis |
Pin certificados em produção |
| Log de dados sensíveis |
Logs podem ser extraídos |
Nunca faça log de tokens, senhas, PII |
Pecados de Arquitetura
| ❌ NUNCA FAÇA |
Por Que Está Errado |
✅ SEMPRE FAÇA |
| Lógica de negócio em UI |
Não testável, não mantível |
Separação de camada de serviço |
| State global para tudo |
Re-renderizações desnecessárias, complexidade |
State local padrão, eleve quando necessário |
| Deep linking como afterthought |
Notificações, compartilhamentos quebrados |
Planeje deep links desde o dia um |
| Pule dispose/cleanup |
Vazamentos de memória, listeners zumbis |
Limpe subscrições, timers |
📱 Matriz de Decisão de Plataforma
Quando Unificar vs Divergir
UNIFICAR (mesmo em ambas) DIVERGIR (específico de plataforma)
───────────────────── ──────────────────────────────────
Lógica de Negócio ✅ Sempre -
Camada de Dados ✅ Sempre -
Funcionalidades ✅ Sempre -
Principais
Navegação - ✅ iOS: swipe de borda, Android: botão voltar
Gestos - ✅ Sensação nativa de plataforma
Ícones - ✅ SF Symbols vs Material Icons
Date Pickers - ✅ Pickers nativos se encaixam bem
Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog
Tipografia - ✅ SF Pro vs Roboto (ou customizado)
Diálogos de Erro - ✅ Convenções de plataforma para alertas
Referência Rápida: Padrões Padrão de Plataforma
| Elemento |
iOS |
Android |
| Fonte Primária |
SF Pro / SF Compact |
Roboto |
| Alvo Mín. de Toque |
44pt × 44pt |
48dp × 48dp |
| Navegação Voltar |
Swipe de borda esquerda |
Botão/gesto de voltar do sistema |
| Ícones da Tab Inferior |
SF Symbols |
Material Symbols |
| Action Sheet |
UIActionSheet de baixo |
Bottom Sheet / Dialog |
| Progresso |
Spinner |
Progresso linear (Material) |
| Pull to Refresh |
UIRefreshControl nativo |
SwipeRefreshLayout |
🧠 Psicologia de UX Mobile (Referência Rápida)
Lei de Fitts para Toque
Desktop: Cursor é preciso (1px)
Mobile: Dedo é impreciso (~7mm de área de contato)
→ Alvos de toque DEVEM ser mínimo 44-48px
→ Ações importantes na ZONA DE POLEGAR (inferior da tela)
→ Ações destrutivas LONGE do alcance fácil
Zona de Polegar (Uso com Uma Mão)
┌─────────────────────────────┐
│ DIFÍCIL DE ATINGIR │ ← Navegação, menu, voltar
│ (alongar) │
├─────────────────────────────┤
│ OK DE ATINGIR │ ← Ações secundárias
│ (natural) │
├─────────────────────────────┤
│ FÁCIL DE ATINGIR │ ← CTAs primários, tab bar
│ (arco natural do polegar) │ ← Interação de conteúdo principal
└─────────────────────────────┘
[ HOME ]
Carga Cognitiva Específica de Mobile
| Desktop |
Diferença Mobile |
| Múltiplas janelas |
UMA tarefa por vez |
| Atalhos de teclado |
Gestos de toque |
| Estados hover |
SEM hover (toque ou nada) |
| Viewport grande |
Espaço limitado, scroll vertical |
| Atenção estável |
Constantemente interrompido |
Para mergulho profundo: touch-psychology.md
⚡ Princípios de Performance (Referência Rápida)
Regras Críticas React Native
// ✅ CORRETO: renderItem memoizado + wrapper React.memo
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} />,
[]
);
// ✅ CORRETO: FlatList com todas otimizações
<FlatList
data={items}
renderItem={renderItem}
keyExtractor={(item) => item.id} // ID estável, NÃO índice
getItemLayout={(data, index) => ({
length: ITEM_HEIGHT,
offset: ITEM_HEIGHT * index,
index,
})}
removeClippedSubviews={true}
maxToRenderPerBatch={10}
windowSize={5}
/>
Regras Críticas Flutter
// ✅ CORRETO: construtores const evitam rebuilds
class MyWidget extends StatelessWidget {
const MyWidget({super.key}); // CONST!
@override
Widget build(BuildContext context) {
return const Column( // CONST!
children: [
Text('Conteúdo estático'),
MyConstantWidget(),
],
);
}
}
// ✅ CORRETO: State direcionado com ValueListenableBuilder
ValueListenableBuilder<int>(
valueListenable: counter,
builder: (context, value, child) => Text('$value'),
child: const ExpensiveWidget(), // Não vai rebuildar!
)
Performance de Animação
Acelerado por GPU (RÁPIDO): Limitado por CPU (LENTO):
├── transform ├── width, height
├── opacity ├── top, left, right, bottom
└── (use APENAS estes) ├── margin, padding
└── (EVITE animar estes)
Para guia completo: mobile-performance.md
📝 CHECKPOINT (OBRIGATÓRIO Antes de Qualquer Trabalho Mobile)
Antes de escrever QUALQUER código mobile, você DEVE completar este checkpoint:
🧠 CHECKPOINT:
Plataforma: [ iOS / Android / Ambas ]
Framework: [ React Native / Flutter / SwiftUI / Kotlin ]
Arquivos Lidos: [ Liste os arquivos de skill que você leu ]
3 Princípios que Vou Aplicar:
1. _______________
2. _______________
3. _______________
Anti-Padrões que Vou Evitar:
1. _______________
2. _______________
Exemplo:
🧠 CHECKPOINT:
Plataforma: iOS + Android (Cross-platform)
Framework: React Native + Expo
Arquivos Lidos: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md
3 Princípios que Vou Aplicar:
1. FlatList com React.memo + useCallback para todas listas
2. Alvos de toque 48px, zona de polegar para CTAs primários
3. Navegação específica por plataforma (swipe de borda iOS, botão voltar Android)
Anti-Padrões que Vou Evitar:
1. ScrollView para listas → FlatList
2. renderItem inline → Memoizado
3. AsyncStorage para tokens → SecureStore
🔴 Não consegue preencher o checkpoint? → VOLTE E LEIA OS ARQUIVOS DE SKILL.
🔧 Árvore de Decisão de Framework
O QUE VOCÊ ESTÁ CONSTRUINDO?
│
├── Precisa de atualizações OTA + iteração rápida + team web
│ └── ✅ React Native + Expo
│
├── Precisa de UI pixel-perfect customizado + crítico de performance
│ └── ✅ Flutter
│
├── Funcionalidades nativas profundas + foco em plataforma única
│ ├── Apenas iOS → SwiftUI
│ └── Apenas Android → Kotlin + Jetpack Compose
│
├── Codebase RN existente + novas funcionalidades
│ └── ✅ React Native (bare workflow)
│
└── Enterprise + codebase Flutter existente
└── ✅ Flutter
Para árvores de decisão completas: decision-trees.md
📋 Checklist Pré-Desenvolvimento
Antes de Começar QUALQUER Projeto Mobile
Antes de Cada Tela
Antes do Release
📚 Arquivos de Referência
Para orientação mais profunda em áreas específicas:
| Arquivo |
Quando Usar |
| mobile-design-thinking.md |
PRIMEIRO! Anti-memorização, força pensamento baseado em contexto |
| touch-psychology.md |
Entender interação por toque, Lei de Fitts, design de gestos |
| mobile-performance.md |
Otimizar RN/Flutter, 60fps, memória/bateria |
| platform-ios.md |
Design específico iOS, conformidade HIG |
| platform-android.md |
Design específico Android, Material Design 3 |
| mobile-navigation.md |
Padrões de navegação, deep linking |
| mobile-typography.md |
Escala de tipo, fontes do sistema, acessibilidade |
| mobile-color-system.md |
Otimização OLED, modo escuro, consciente de bateria |
| decision-trees.md |
Decisões de framework, state, storage |
Lembre-se: Usuários mobile são impacientes, constantemente interrompidos, e usam dedos imprecisos em telas pequenas. Design para as PIORES condições: rede ruim, uma mão, sol brilhante, bateria baixa. Se funciona lá, funciona em qualquer lugar.
1---2name: mobile-design3description: Pensamento e tomada de decisão em design mobile-first para apps iOS e Android. Interação por toque, padrões de performance, convenções de plataforma. Ensina princípios, não valores fixos. Use ao construir apps React Native, Flutter ou nativos.4---56# Sistema de Design Mobile78> **Filosofia:** Toque em primeiro lugar. Consciente de bateria. Respeitoso com a plataforma. Capaz offline.9> **Princípio Central:** Mobile NÃO é um desktop pequeno. PENSE em restrições mobile, PERGUNTE sobre a escolha de plataforma.1011---1213## 🔧 Scripts de Execução1415**Execute estes para validação (não leia, apenas execute):**1617| Script | Propósito | Uso |18|--------|-----------|-----|19| `scripts/mobile_audit.py` | Auditoria de UX Mobile e Toque | `python scripts/mobile_audit.py <project_path>` |2021---2223## 🔴 OBRIGATÓRIO: Leia os Arquivos de Referência Antes de Trabalhar!2425**⛔ NÃO comece o desenvolvimento até ler os arquivos relevantes:**2627### Universal (Sempre Leia)2829| Arquivo | Conteúdo | Status |30|---------|----------|--------|31| **[mobile-design-thinking.md](mobile-design-thinking.md)** | **⚠️ ANTI-MEMORIZAÇÃO: Força o pensamento, previne defaults de IA** | **⬜ CRÍTICO PRIMEIRO** |32| **[touch-psychology.md](touch-psychology.md)** | **Lei de Fitts, gestos, haptics, zona de polegar** | **⬜ CRÍTICO** |33| **[mobile-performance.md](mobile-performance.md)** | **Performance RN/Flutter, 60fps, memória** | **⬜ CRÍTICO** |34| **[mobile-backend.md](mobile-backend.md)** | **Notificações push, sincronização offline, API mobile** | **⬜ CRÍTICO** |35| **[mobile-testing.md](mobile-testing.md)** | **Pirâmide de testes, E2E, específico por plataforma** | **⬜ CRÍTICO** |36| **[mobile-debugging.md](mobile-debugging.md)** | **Debugging nativo vs JS, Flipper, Logcat** | **⬜ CRÍTICO** |37| [mobile-navigation.md](mobile-navigation.md) | Tab/Stack/Drawer, deep linking | ⬜ Leia |38| [mobile-typography.md](mobile-typography.md) | Fontes do sistema, Dynamic Type, a11y | ⬜ Leia |39| [mobile-color-system.md](mobile-color-system.md) | OLED, modo escuro, ciente de bateria | ⬜ Leia |40| [decision-trees.md](decision-trees.md) | Seleção de framework/state/storage | ⬜ Leia |4142> 🧠 **mobile-design-thinking.md é PRIORIDADE!** Este arquivo garante que a IA pense em vez de usar padrões memorizados.4344### Específico por Plataforma (Leia Baseado no Alvo)4546| Plataforma | Arquivo | Conteúdo | Quando Ler |47|-----------|---------|----------|-----------|48| **iOS** | [platform-ios.md](platform-ios.md) | Human Interface Guidelines, SF Pro, padrões SwiftUI | Construindo para iPhone/iPad |49| **Android** | [platform-android.md](platform-android.md) | Material Design 3, Roboto, padrões Compose | Construindo para Android |50| **Cross-Platform** | Ambos acima | Pontos de divergência de plataforma | React Native / Flutter |5152> 🔴 **Se construir para iOS → Leia platform-ios.md PRIMEIRO!**53> 🔴 **Se construir para Android → Leia platform-android.md PRIMEIRO!**54> 🔴 **Se cross-platform → Leia AMBOS e aplique lógica condicional por plataforma!**5556---5758## ⚠️ CRÍTICO: PERGUNTE ANTES DE ASSUMIR (OBRIGATÓRIO)5960> **PARE! Se a solicitação do usuário for aberta, NÃO padronize para seus favoritos.**6162### Você DEVE Perguntar Se Não Especificado:6364| Aspecto | Pergunte | Por Quê |65|--------|----------|---------|66| **Plataforma** | "iOS, Android, ou ambos?" | Afeta TODA decisão de design |67| **Framework** | "React Native, Flutter, ou nativo?" | Determina padrões e ferramentas |68| **Navegação** | "Tab bar, drawer, ou baseado em stack?" | Decisão central de UX |69| **State** | "Qual state management? (Zustand/Redux/Riverpod/BLoC?)" | Fundação da arquitetura |70| **Offline** | "Isso precisa funcionar offline?" | Afeta estratégia de dados |71| **Dispositivos alvo** | "Apenas telefone, ou suporte a tablet?" | Complexidade do layout |7273### ⛔ ANTI-PADRÕES MOBILE DE IA (LISTA DE PROIBIÇÕES)7475> 🚫 **Estas são tendências padrão de IA que DEVEM ser evitadas!**7677#### Pecados de Performance7879| ❌ NUNCA FAÇA | Por Que Está Errado | ✅ SEMPRE FAÇA |80|---------------|-------------------|-----------------|81| **ScrollView para listas longas** | Renderiza TODOS os itens, memória explode | Use `FlatList` / `FlashList` / `ListView.builder` |82| **Função renderItem inline** | Nova função a cada render, todos itens re-renderizam | `useCallback` + `React.memo` |83| **Sem keyExtractor** | Chaves baseadas em índice causam bugs ao reordenar | ID único e estável dos dados |84| **Pule getItemLayout** | Layout assíncrono = scroll tremido | Forneça quando itens têm altura fixa |85| **setState() em toda parte** | Re-renderizações desnecessárias de widgets | State direcionado, construtores `const` |86| **Native driver: false** | Animações bloqueadas pela thread JS | `useNativeDriver: true` sempre |87| **console.log em produção** | Bloqueia thread JS severamente | Remova antes de release build |88| **Pule React.memo/const** | Cada item re-renderiza em qualquer mudança | Memoize itens de lista SEMPRE |8990#### Pecados de Toque/UX9192| ❌ NUNCA FAÇA | Por Que Está Errado | ✅ SEMPRE FAÇA |93|---------------|-------------------|-----------------|94| **Alvo de toque < 44px** | Impossível tocar com precisão, frustrante | Mínimo 44pt (iOS) / 48dp (Android) |95| **Espaçamento < 8px entre alvos** | Toques acidentais em vizinhos | Mínimo 8-12px de lacuna |96| **Interações apenas por gesto** | Usuários com deficiência motora excluídos | Sempre forneça alternativa com botão |97| **Sem estado de carregamento** | Usuário acha que app travou | SEMPRE mostre feedback de carregamento |98| **Sem estado de erro** | Usuário travado, sem caminho de recuperação | Mostre erro com opção de retry |99| **Sem tratamento offline** | Crash/bloqueio quando rede se perde | Degradação graciosa, dados em cache |100| **Ignore convenções de plataforma** | Usuários confusos, memória muscular quebrada | iOS parece iOS, Android parece Android |101102#### Pecados de Segurança103104| ❌ NUNCA FAÇA | Por Que Está Errado | ✅ SEMPRE FAÇA |105|---------------|-------------------|-----------------|106| **Token em AsyncStorage** | Facilmente acessível, roubado em device rooteado | `SecureStore` / `Keychain` / `EncryptedSharedPreferences` |107| **Hardcode de chaves API** | Reverse engineered de APK/IPA | Variáveis de ambiente, armazenamento seguro |108| **Pule SSL pinning** | Ataques MITM possíveis | Pin certificados em produção |109| **Log de dados sensíveis** | Logs podem ser extraídos | Nunca faça log de tokens, senhas, PII |110111#### Pecados de Arquitetura112113| ❌ NUNCA FAÇA | Por Que Está Errado | ✅ SEMPRE FAÇA |114|---------------|-------------------|-----------------|115| **Lógica de negócio em UI** | Não testável, não mantível | Separação de camada de serviço |116| **State global para tudo** | Re-renderizações desnecessárias, complexidade | State local padrão, eleve quando necessário |117| **Deep linking como afterthought** | Notificações, compartilhamentos quebrados | Planeje deep links desde o dia um |118| **Pule dispose/cleanup** | Vazamentos de memória, listeners zumbis | Limpe subscrições, timers |119120---121122## 📱 Matriz de Decisão de Plataforma123124### Quando Unificar vs Divergir125126```127 UNIFICAR (mesmo em ambas) DIVERGIR (específico de plataforma)128 ───────────────────── ──────────────────────────────────129Lógica de Negócio ✅ Sempre -130Camada de Dados ✅ Sempre -131Funcionalidades ✅ Sempre -132Principais133 134Navegação - ✅ iOS: swipe de borda, Android: botão voltar135Gestos - ✅ Sensação nativa de plataforma136Ícones - ✅ SF Symbols vs Material Icons137Date Pickers - ✅ Pickers nativos se encaixam bem138Modals/Sheets - ✅ iOS: bottom sheet vs Android: dialog139Tipografia - ✅ SF Pro vs Roboto (ou customizado)140Diálogos de Erro - ✅ Convenções de plataforma para alertas141```142143### Referência Rápida: Padrões Padrão de Plataforma144145| Elemento | iOS | Android |146|----------|-----|---------|147| **Fonte Primária** | SF Pro / SF Compact | Roboto |148| **Alvo Mín. de Toque** | 44pt × 44pt | 48dp × 48dp |149| **Navegação Voltar** | Swipe de borda esquerda | Botão/gesto de voltar do sistema |150| **Ícones da Tab Inferior** | SF Symbols | Material Symbols |151| **Action Sheet** | UIActionSheet de baixo | Bottom Sheet / Dialog |152| **Progresso** | Spinner | Progresso linear (Material) |153| **Pull to Refresh** | UIRefreshControl nativo | SwipeRefreshLayout |154155---156157## 🧠 Psicologia de UX Mobile (Referência Rápida)158159### Lei de Fitts para Toque160161```162Desktop: Cursor é preciso (1px)163Mobile: Dedo é impreciso (~7mm de área de contato)164165→ Alvos de toque DEVEM ser mínimo 44-48px166→ Ações importantes na ZONA DE POLEGAR (inferior da tela)167→ Ações destrutivas LONGE do alcance fácil168```169170### Zona de Polegar (Uso com Uma Mão)171172```173┌─────────────────────────────┐174│ DIFÍCIL DE ATINGIR │ ← Navegação, menu, voltar175│ (alongar) │176├─────────────────────────────┤177│ OK DE ATINGIR │ ← Ações secundárias178│ (natural) │179├─────────────────────────────┤180│ FÁCIL DE ATINGIR │ ← CTAs primários, tab bar181│ (arco natural do polegar) │ ← Interação de conteúdo principal182└─────────────────────────────┘183 [ HOME ]184```185186### Carga Cognitiva Específica de Mobile187188| Desktop | Diferença Mobile |189|---------|------------------|190| Múltiplas janelas | UMA tarefa por vez |191| Atalhos de teclado | Gestos de toque |192| Estados hover | SEM hover (toque ou nada) |193| Viewport grande | Espaço limitado, scroll vertical |194| Atenção estável | Constantemente interrompido |195196Para mergulho profundo: [touch-psychology.md](touch-psychology.md)197198---199200## ⚡ Princípios de Performance (Referência Rápida)201202### Regras Críticas React Native203204```typescript205// ✅ CORRETO: renderItem memoizado + wrapper React.memo206const ListItem = React.memo(({ item }: { item: Item }) => (207 <View style={styles.item}>208 <Text>{item.title}</Text>209 </View>210));211212const renderItem = useCallback(213 ({ item }: { item: Item }) => <ListItem item={item} />,214 []215);216217// ✅ CORRETO: FlatList com todas otimizações218<FlatList219 data={items}220 renderItem={renderItem}221 keyExtractor={(item) => item.id} // ID estável, NÃO índice222 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```232233### Regras Críticas Flutter234235```dart236// ✅ CORRETO: construtores const evitam rebuilds237class MyWidget extends StatelessWidget {238 const MyWidget({super.key}); // CONST!239240 @override241 Widget build(BuildContext context) {242 return const Column( // CONST!243 children: [244 Text('Conteúdo estático'),245 MyConstantWidget(),246 ],247 );248 }249}250251// ✅ CORRETO: State direcionado com ValueListenableBuilder252ValueListenableBuilder<int>(253 valueListenable: counter,254 builder: (context, value, child) => Text('$value'),255 child: const ExpensiveWidget(), // Não vai rebuildar!256)257```258259### Performance de Animação260261```262Acelerado por GPU (RÁPIDO): Limitado por CPU (LENTO):263├── transform ├── width, height264├── opacity ├── top, left, right, bottom265└── (use APENAS estes) ├── margin, padding266 └── (EVITE animar estes)267```268269Para guia completo: [mobile-performance.md](mobile-performance.md)270271---272273## 📝 CHECKPOINT (OBRIGATÓRIO Antes de Qualquer Trabalho Mobile)274275> **Antes de escrever QUALQUER código mobile, você DEVE completar este checkpoint:**276277```278🧠 CHECKPOINT:279280Plataforma: [ iOS / Android / Ambas ]281Framework: [ React Native / Flutter / SwiftUI / Kotlin ]282Arquivos Lidos: [ Liste os arquivos de skill que você leu ]2832843 Princípios que Vou Aplicar:2851. _______________2862. _______________2873. _______________288289Anti-Padrões que Vou Evitar:2901. _______________2912. _______________292```293294**Exemplo:**295```296🧠 CHECKPOINT:297298Plataforma: iOS + Android (Cross-platform)299Framework: React Native + Expo300Arquivos Lidos: touch-psychology.md, mobile-performance.md, platform-ios.md, platform-android.md3013023 Princípios que Vou Aplicar:3031. FlatList com React.memo + useCallback para todas listas3042. Alvos de toque 48px, zona de polegar para CTAs primários3053. Navegação específica por plataforma (swipe de borda iOS, botão voltar Android)306307Anti-Padrões que Vou Evitar:3081. ScrollView para listas → FlatList3092. renderItem inline → Memoizado3103. AsyncStorage para tokens → SecureStore311```312313> 🔴 **Não consegue preencher o checkpoint? → VOLTE E LEIA OS ARQUIVOS DE SKILL.**314315---316317## 🔧 Árvore de Decisão de Framework318319```320O QUE VOCÊ ESTÁ CONSTRUINDO?321 │322 ├── Precisa de atualizações OTA + iteração rápida + team web323 │ └── ✅ React Native + Expo324 │325 ├── Precisa de UI pixel-perfect customizado + crítico de performance326 │ └── ✅ Flutter327 │328 ├── Funcionalidades nativas profundas + foco em plataforma única329 │ ├── Apenas iOS → SwiftUI330 │ └── Apenas Android → Kotlin + Jetpack Compose331 │332 ├── Codebase RN existente + novas funcionalidades333 │ └── ✅ React Native (bare workflow)334 │335 └── Enterprise + codebase Flutter existente336 └── ✅ Flutter337```338339Para árvores de decisão completas: [decision-trees.md](decision-trees.md)340341---342343## 📋 Checklist Pré-Desenvolvimento344345### Antes de Começar QUALQUER Projeto Mobile346347- [ ] **Plataforma confirmada?** (iOS / Android / Ambas)348- [ ] **Framework escolhido?** (RN / Flutter / Nativo)349- [ ] **Padrão de navegação decidido?** (Tabs / Stack / Drawer)350- [ ] **State management selecionado?** (Zustand / Redux / Riverpod / BLoC)351- [ ] **Requisitos offline conhecidos?**352- [ ] **Deep linking planejado desde o dia um?**353- [ ] **Dispositivos alvo definidos?** (Telefone / Tablet / Ambos)354355### Antes de Cada Tela356357- [ ] **Alvos de toque ≥ 44-48px?**358- [ ] **CTA primária na zona de polegar?**359- [ ] **Estado de carregamento existe?**360- [ ] **Estado de erro com retry existe?**361- [ ] **Tratamento offline considerado?**362- [ ] **Convenções de plataforma seguidas?**363364### Antes do Release365366- [ ] **console.log removido?**367- [ ] **SecureStore para dados sensíveis?**368- [ ] **SSL pinning habilitado?**369- [ ] **Listas otimizadas (memo, keyExtractor)?**370- [ ] **Limpeza de memória no unmount?**371- [ ] **Testado em devices de baixo desempenho?**372- [ ] **Labels de acessibilidade em todos elementos interativos?**373374---375376## 📚 Arquivos de Referência377378Para orientação mais profunda em áreas específicas:379380| Arquivo | Quando Usar |381|---------|-------------|382| [mobile-design-thinking.md](mobile-design-thinking.md) | **PRIMEIRO! Anti-memorização, força pensamento baseado em contexto** |383| [touch-psychology.md](touch-psychology.md) | Entender interação por toque, Lei de Fitts, design de gestos |384| [mobile-performance.md](mobile-performance.md) | Otimizar RN/Flutter, 60fps, memória/bateria |385| [platform-ios.md](platform-ios.md) | Design específico iOS, conformidade HIG |386| [platform-android.md](platform-android.md) | Design específico Android, Material Design 3 |387| [mobile-navigation.md](mobile-navigation.md) | Padrões de navegação, deep linking |388| [mobile-typography.md](mobile-typography.md) | Escala de tipo, fontes do sistema, acessibilidade |389| [mobile-color-system.md](mobile-color-system.md) | Otimização OLED, modo escuro, consciente de bateria |390| [decision-trees.md](decision-trees.md) | Decisões de framework, state, storage |391392---393394> **Lembre-se:** Usuários mobile são impacientes, constantemente interrompidos, e usam dedos imprecisos em telas pequenas. Design para as PIORES condições: rede ruim, uma mão, sol brilhante, bateria baixa. Se funciona lá, funciona em qualquer lugar.