Pular para o conteúdo principal

Status: Approved · v3.2 · SPEC-UX-SHELL-001

depends_on: SPEC-DOMAIN-AUTH-001, SPEC-DOMAIN-PERMISSION-001, SPEC-BRAND-001

used_by: IS-ZERO-00.3, IS-MVP-02.3, IS-MVP-16.1, IS-MVP-19.29

Navegação e App Shell

O app único modular deve servir torcedores, jogadores e gestores sem transformar a navegação em um painel administrativo.

Objetivo​

O app único modular deve servir torcedores, jogadores e gestores sem transformar a navegação em um painel administrativo.

Pontos de entrada​

  • Abertura do app autenticado ou anônimo.
  • Deep links para páginas públicas e ações protegidas.
  • Retorno de AuthIntent.
  • Web responsiva com rotas equivalentes.

Hierarquia da tela​

  1. Barra inferior mobile com Início, Buscar, Jogos, Notificações e Perfil.
  2. Header contextual com título, back, ações secundárias e seletor de entidade quando em gestão.
  3. Conteúdo principal com safe areas e largura máxima no web.
  4. Modais/bottom sheets para filtros, ações rápidas e confirmação.
  5. Área Minha Gestão acessível por Perfil e card na Home para gestores.

Componentes e comportamento​

Bottom Tabs​

Cinco destinos fixos. Badge somente em Notificações. A aba atual deve ser identificável por ícone, label e estado acessível.

No redesign v3, a barra inferior segue a composição aprovada dos protótipos T1–T9: superfície separada por borda superior, safe area, cinco colunas equivalentes, ícone outline de 19 px e label sempre visível. O item ativo usa primary, peso visual superior e aria-current/estado nativo; os demais usam text-muted. O badge real de Notificações é numérico quando houver espaço e pode degradar para ponto no compacto, sem inventar contagem.

Web Navigation​

Em desktop, navegação lateral ou header persistente preserva os mesmos destinos. Páginas públicas podem usar header institucional simplificado.

Para as rotas do app redesign v3, o padrão canônico é a sidebar do protótipo, não uma navbar horizontal genérica:

  • largura expandida de 220 px e rail recolhido de 68 px;
  • logo horizontal em 116 px quando expandida e símbolo em 30 px quando recolhida;
  • controle explícito abaixo da marca para expandir/recolher, com nome acessível;
  • itens Início, Buscar, Jogos, Notificações e Perfil com o mesmo ícone/label do mobile;
  • ícone outline de 17 px, surface-alt no item ativo e badge real de Notificações;
  • em largura que não comporta sidebar expandida + conteúdo mínimo de 320 px, o rail de 68 px permanece no fluxo e a expansão vira overlay com backdrop; abrir/fechar não desloca o conteúdo;
  • o modo compacto inicia recolhido; mudar de largura ampla para compacta recolhe o menu antes de habilitar o overlay, evitando backdrop aberto automaticamente sobre o conteúdo;
  • em largura ampla a sidebar permanece no fluxo e pode redimensionar a área de conteúdo;
  • transição de 180 ms é removida com reduced motion.

O shell institucional simplificado só é permitido nas rotas explicitamente definidas pela matriz de rotas; ele não pode substituir o shell canônico da Home ou das abas autenticadas.

Matriz de aplicação do shell v3​

GrupoWebMobile
Home, Buscar, Jogos, Notificações, Perfilsidebar 220/68tabs/bottom nav
Páginas públicas T2–T9 (teams, players, detalhe de matches, championships, torcidas, fields, services, districts, neighborhoods, rankings)sidebar 220/68conteúdo de detalhe + bottom nav; topbar contextual continua pertencendo à feature
Auth T1 (login, register, forgot-password, reset-password, onboarding)sem sidebar; composição T1 própriasem bottom nav; composição T1 própria
Gestão, reports, support requests, invites e event linkspreservar shell/contexto operacional existente; não inferir sidebar nova fora do escopoStack contextual sem bottom nav global
Fallback técnico/404shell mínimo que não bloqueia retry/retornoStack sem bottom nav quando a rota não é classificável

No mobile, o root layout classifica a rota para que detalhes públicos fora de (tabs) recebam o mesmo bottom nav sem duplicá-lo dentro de (tabs). A classificação é centralizada e testada; não se envolve cada screen manualmente nem se mantém um componente sem consumidor.

Marca e iconografia​

A marca usa os assets oficiais aprovados em assets/new_brand/** ou equivalentes de hash/proveniência registrados em assets/redesign-v3/**; essas fontes são imutáveis no EP e somente cópias byte-idênticas entram nos bundlers dos apps. A família canônica é Lucide (lucide-react no web e lucide-react-native no mobile, licença ISC), como no protótipo: Home, Search, CalendarDays, Bell, User e PanelLeftOpen/Close, com currentColor, stroke 1.8 inativo/2.3 ativo e tamanhos 17 px web, 19 px mobile e 16 px no toggle. Emoji, dingbat ou glifo Unicode não é substituto de produção.

O shell web expõe um único painel real Tema, fiel ao protótipo, com duas escolhas ortogonais: Escuro | Claro em Aparência e Raiz | Neutro em Cores. Ele usa o provider canônico e sua persistência; não mantém estado de tema local, fixtures ou ações mortas. Controles externos de desenvolvimento do harness continuam excluídos. A marca do shell acompanha os quatro modos com os assets oficiais brand/themeable e preserva a costura do símbolo no modo Neutro.

Context Header​

Exibe entidade ativa, status e ações. Não deve esconder o contexto ao entrar em subfluxos de gestão.

Minha Gestão​

Card acima do feed mostra entidades agrupadas por tipo; recolhe ao rolar. Não contém dashboard geral, pendências globais nem KPIs inventados.

Protected Action Gate​

Ao tocar ação protegida, salva AuthIntent, abre login e retorna ao ponto exato.

Ações do usuário​

AçãoPré-condiçãoResultadoFalha/alternativa
Trocar abaApp carregadoPreserva estado básico da aba anteriorRota inválida volta ao destino seguro
Abrir página públicaLink válidoPágina sem exigir login404/merged/suspended usa estado específico
Entrar em gestãoMembership activeCarrega painel da entidadeSem permission mostra 403 contextual
Executar ação protegidaVisitanteCria AuthIntent e abre authIntent expirado retorna ao contexto sem ação

Estados obrigatórios​

EstadoRepresentaçãoAção disponível
InicializaçãoSplash curto com o asset oficial de assets/new_brand/ e restauração de sessãoTentar novamente/continuar anônimo
Sem conexãoShell continua navegável com avisoRecarregar
Sessão expiradaModal contextual sem perder rotaEntrar novamente
Entidade não disponívelFallback de statusAbrir destino canônico ou voltar

Autenticação e permissões​

  • Abas base não dependem de papel, exceto conteúdos internos.
  • Minha Gestão só aparece com ao menos uma membership active.
  • Painel do Jogador aparece apenas para role player.
  • Botões sem permissão podem aparecer desabilitados quando ajudam descoberta, sempre com explicação.

Responsividade​

  • Mobile usa bottom tabs e bottom sheets.
  • Tablet/web compacto usa o rail lateral de 68 px com expansão em overlay.
  • Desktop usa sidebar persistente 220/68 px, largura máxima de conteúdo e painéis laterais quando úteis.
  • Não ampliar cards indefinidamente; manter densidade profissional.

Acessibilidade​

  • Alvos de toque mínimos de 44×44.
  • Labels sempre disponíveis para ícones críticos.
  • Foco visível no web.
  • Navegação por teclado e leitores de tela.
  • Safe areas e contraste AA.

Eventos de produto e observabilidade​

  • app_shell_loaded
  • tab_changed
  • deep_link_opened
  • auth_intent_started
  • management_context_opened
  • route_fallback_shown

Dados e endpoints​

  • GET /auth/me para contexto.
  • GET /management/my-entities para Minha Gestão.
  • GET /notifications/counts para badge.

Critérios de aceite​

  • Cinco abas canônicas.
  • Sidebar web e bottom navigation mobile convergem visualmente com os protótipos T1–T9.
  • Nenhum destino usa glifo Unicode; ícones outline, marca, badge e estados ativo/recolhido são verificáveis.
  • O conteúdo não salta ao expandir a sidebar em overlay e mantém piso útil de 320 px.
  • Visitante abre páginas públicas.
  • Gestor acessa entidades sem app separado.
  • Deep link e AuthIntent preservam contexto.
  • Mobile e web compartilham estrutura sem forçar layout idêntico.

Pós-MVP​

  • App separado de gestão somente se uso real justificar.
  • Command palette no desktop.
  • Persistência avançada por aba.

Decisões registradas​

  • App único modular no MVP.
  • Minha Gestão não é uma sexta aba.
  • Home é principalmente feed.

Machine summary​

spec: SPEC-UX-SHELL-001
screen_or_flow: Navegação e App Shell
required_states:
- loading
- success
- empty
- error
must_use:
- contracts
- service
- hook
- design_tokens
must_not:
- direct_fetch
- direct_fixture_import
- hardcoded_brand_colors