Fundamentos ergonomicos, cromaticos e psicologicos de UX mobile: posicao de navegacao pela biometria do polegar, dark mode sem destruir legibilidade, tempo de espera pela percepcao (nao pelo relogio), e login/onboarding sem fricção. Use ao decidir posicao de navegacao, criar tema escuro, tratar estados de carregamento, desenhar fluxo de autenticacao/passkey, ou pedir permissao de GPS/camera/notificacao. Trigger em: "thumb zone", "zona do polegar", "navegacao inferior", "bottom nav", "dark mode", "modo escuro", "tema escuro", "OLED", "skeleton", "spinner", "loading", "tempo de carregamento", "app parece lento", "passkey", "passwordless", "login sem senha", "webauthn", "biometria", "onboarding", "tutorial inicial", "pedir permissao", "permission priming", "haptic", "feedback tatil", "dynamic type", "escala de fonte", "texto ampliado", "momento aha", "ativacao do usuario", "product tour", "checklist de onboarding", "tela de boas-vindas".
66
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Cobre as decisoes de UX mobile que antecedem o layout: onde a mao alcanca, como o olho le no escuro, como o cerebro mede espera, e como o usuario entra no app. Cada regra aqui vem de dado biometrico, fisiologico ou comportamental — nao de preferencia estetica.
Esta skill segue GLOBAL.md, policies/execution.md, policies/handoffs.md, policies/token-efficiency.md, policies/stack-flexibility.md e policies/evals.md.
Para tabelas completas de contraste, curvas de easing por caso e fluxos de recuperacao de passkey, consultar docs/skill-guides/mobile-ux-foundations.md apenas quando necessario.
Fronteira com skills vizinhas:
A mao e a primeira restricao de layout mobile, antes de qualquer decisao visual. Assumir que o usuario segura com duas maos e toca com o indicador e falso: cerca de 75% navegam com o polegar e ~49% operam com uma mao so.
O alcance do polegar divide a tela em tres faixas, com precisao medida:
| Zona | Onde | Precisao | Uso correto |
|---|---|---|---|
| Natural | Terco inferior | Quase total | Navegacao primaria, acao principal, CTA de conversao |
| Confortavel | Faixa central | ~84% | Conteudo, acoes secundarias |
| Alongamento | Terco superior e canto oposto | ~61% | Titulo, acao rara, acao destrutiva (o atrito aqui e desejavel) |
Consequencias diretas:
Gesto reduz poluicao visual mas nao tem affordance — o usuario nao descobre sozinho. Regra: todo gesto precisa de caminho equivalente visivel, nunca ser a unica via para uma acao.
Limiares para nao disparar por engano durante scroll:
Movimento vertical do polegar e mais natural que horizontal repetido. Swipe horizontal serve triagem rapida (arquivar, excluir); nao serve navegacao principal.
Mapear intensidade ao significado, nunca vibrar por vibrar:
| Evento | Padrao |
|---|---|
| Sucesso / confirmacao leve | Toque unico curto |
| Alerta / acao que exige atencao | Toque duplo perceptivel |
| Erro / rejeicao | Padrao grave e mais longo |
| Scroll, hover, navegacao comum | Nenhum — haptic constante vira ruido e consome bateria |
Respeitar a preferencia de sistema quando o usuario desativa vibracao.
O erro mais comum e inverter polos: #FFFFFF vira #000000 e o texto vira branco puro. Isso quebra em tres frentes simultaneas:
Por isso a superficie base do tema escuro e cinza profundo, #121212, nao preto puro. Ele preserva descanso visual, permite sombra, evita smearing e ainda entrega o ganho de bateria em OLED.
Preto puro fica restrito a: modo de economia extrema de bateria e consumo de midia em tela cheia (video, leitura imersiva).
No claro, elevacao se expressa por sombra. No escuro, sombra some — elevacao se expressa por superficie mais clara: quanto mais alto o elemento na pilha Z, mais claro o fundo dele.
--surface-0: #121212; /* base */
--surface-1: #1e1e1e; /* card */
--surface-2: #232323; /* menu, dialog */
--surface-3: #282828; /* modal, bottom sheet */Cor saturada vibra e "queima" contra fundo escuro. Regra: dessaturar e clarear a versao escura de toda cor de marca e de estado.
| Estado | No claro | No escuro |
|---|---|---|
| Erro | Vermelho saturado | Vermelho dessaturado, mais claro |
| Sucesso | Verde saturado | Verde suave |
| Alerta | Ambar forte | Ambar pastel |
Nunca reaproveitar o mesmo hex nos dois temas — o significado sobrevive, o valor nao.
| Conteudo | Racio minimo |
|---|---|
| Texto corpo | 4.5:1 |
| Texto grande (>=18pt, ou >=14pt bold) e icone | 3:1 |
| Logo, texto decorativo | Isento |
Verificar racio nos dois temas — passar no claro nao garante passar no escuro.
Tamanho de fonte nunca e fixo em px. O usuario que aumentou o texto nas configuracoes do sistema — parcela grande e crescente — precisa ver o app inteiro acompanhar:
sp (Android), Dynamic Type (iOS), rem na web. px fixo ignora a preferencia e e falha de acessibilidade, nao escolha esteticamin-height com padding, deixando a altura crescerReflow quebrado sob fonte ampliada e o mesmo bug de min-width: auto da skill 56, so que disparado pela preferencia do usuario em vez do tamanho da tela.
O gargalo raramente e o servidor: e a ansiedade de quem espera. Os limiares de percepcao sao fixos:
| Tempo | Percepcao | O que a UI deve fazer |
|---|---|---|
| ate 100ms | Instantaneo — a acao "e" o toque | Feedback imediato no proprio controle (estado do botao) |
| ate 1s | Fluxo de pensamento intacto | Nada, ou feedback embutido; nao interromper |
| 1s a 10s | Atencao comeca a vazar | Skeleton screen com a forma do conteudo final |
| acima de 10s | Abandono | Barra de progresso determinada (%) + opcao de cancelar/continuar em segundo plano |
Spinner concentra a atencao na propria espera — o usuario percebe a operacao como quase o dobro do tempo real. Skeleton mostra a forma do que vem, e o cerebro le como "quase pronto" em vez de "travado".
Regras:
Spinner continua valido em ponto pequeno e localizado (botao processando), nao como tela inteira de espera.
| Situacao | Curva | Por que |
|---|---|---|
| Elemento entrando | ease-out | Chega rapido e freia — parece que "pousa" |
| Elemento saindo | ease-in | Comeca lento e acelera para fora |
| Loading ciclico | linear | Unico caso — rotacao continua sem atrito |
linear em transicao de UI parece mecanico e errado, porque nada no mundo fisico se move sem aceleracao.
Em mobile, perda de conexao e estado normal, nao excecao:
Login e o funil mais caro do app. Senha esquecida e causa direta de perda de usuario ativo, e regra de senha rigida piora seguranca em vez de melhorar.
Passkey (WebAuthn/FIDO) troca segredo compartilhado por par de chaves: a privada nunca sai do dispositivo, o servidor guarda so a publica. Elimina phishing de credencial — nao ha o que digitar nem o que vazar.
Requisitos de UX do fluxo:
Alinhado ao NIST SP 800-63B, contra a pratica antiga de matriz rigida:
| Fazer | Nao fazer |
|---|---|
| Minimo de 8 caracteres, aceitar frases longas | Exigir simbolo + numero + maiuscula obrigatorios |
| Bloquear senha em lista de vazamento conhecido | Forcar troca periodica sem indicio de comprometimento |
| Mostrar/ocultar senha com medidor de forca | Campo "confirmar senha" (aumenta erro, nao aumenta seguranca) |
| Permitir colar (gerenciador de senha) | Bloquear colagem "por seguranca" |
Regra draconiana empurra o usuario para senha previsivel ou anotada — piora o resultado real.
autocomplete semantico + OTP lido do SMS (one-time-code) para eliminar digitacaoDetalhes de teclado, inputmode e zoom do iOS ficam na skill 56.
| Abordagem | Quando serve | Custo |
|---|---|---|
| Upfront (carrossel antes de usar) | So quando o app e inutil sem configuracao previa | Alto abandono — barreira antes de qualquer valor |
| Just-in-time / progressivo | Padrao recomendado | Ensina no momento do uso, com retencao motora real |
Aprender fazendo fixa; ler tutorial antes de poder tocar, nao.
Onboarding bem-sucedido nao e o usuario ver todas as telas — e ele chegar na primeira vez que o produto entrega valor. Duolingo comeca uma licao; Slack manda voce escrever uma mensagem. Ambos ensinam usando, nao explicando.
Regra de projeto: identifique a acao que representa esse momento (a "north-star action") e trate cada tela antes dela como custo. Carrossel de 5 slides de marketing e fricção posta antes de qualquer valor — e boa parte do abandono de primeiro uso acontece exatamente ai.
A skill 21 mede se esse momento foi atingido (activation_reached, time_to_activate); esta skill decide o caminho ate ele.
"Faca progressivo" nao diz com que componente. Cada padrao resolve um problema diferente:
| Padrao | Serve para | Nao serve para |
|---|---|---|
| Barra de progresso | Fluxo linear e finito (cadastro em 3 passos) — reduz a ansiedade de "quanto falta" | Tarefa opcional ou sem ordem definida; barra que nunca completa vira divida visivel |
| Checklist | Tarefas independentes, feitas fora de ordem e ao longo do tempo ("conecte o banco", "convide alguem") | Fluxo obrigatorio sequencial — vira lista de dever de casa |
| Mensagem de boas-vindas | Dar contexto em 1 tela e sair do caminho | Substituir a descoberta do produto; nao ensina nada sozinha |
| Product tour | Interface densa cuja estrutura nao e obvia | App simples — tour aqui e ruido. Sempre pulavel, em qualquer passo |
| Persona-based (pergunta antes de entrar) | Quando a resposta muda de verdade a experiencia (template, conteudo, limites) | Coletar dado de marketing disfarcado de personalizacao — o usuario percebe |
Combinacoes funcionam: persona-based curto definindo o setup, depois checklist para o resto. O erro e empilhar tudo.
Nao existe onboarding "pronto". Ele evolui com o produto e deve ser medido: onde o usuario para, quanto tempo leva ate a acao de ativacao, quantos pulam. Sem isso, onboarding vira decoracao com opiniao.
Nunca disparar o dialogo nativo de permissao na abertura do app. Negacao e quase sempre definitiva — e recuperar exige mandar o usuario para as configuracoes do sistema.
Sequencia correta:
Ajuda mora dentro do fluxo — painel expansivel, bottom sheet, tooltip contextual. Jogar o usuario num site externo no meio de uma tarefa quebra o contexto e raramente traz ele de volta.
#000000 como superficie base do tema escurolinear em transicao de entrada/saida de UIErgonomia:
Dark mode:
#121212 ou equivalente, nunca preto purosp/rem/Dynamic Type), nunca px fixomin-height em vez de altura fixa, para nao cortar texto ampliadoCheckpoint de contraste: rodar node scripts/check-contrast.mjs <css> (skill 02) nos dois temas — não estimar visualmente "parece escuro o suficiente". Item de contraste só marca quando o script confirma o ratio, exit code 0 nos dois temas.
Percepcao:
ease-out entrando, ease-in saindo, linear so em loopEntrada:
autocomplete semantico e OTP automaticoOnboarding:
Valor que parece arbitrario merece uma linha de comentario: #121212, o limiar de 100ms, os 30 dias de warm handover. Classe utilitaria autoexplicativa, nao.
felvieira/claude-skills-fv
90329e3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.