Status: Approved · v2 · SPEC-UX-PUBLIC-TEAM-001
depends_on: SPEC-DOMAIN-TEAM-001, SPEC-DOMAIN-RANKING-001, SPEC-DOMAIN-FEED-001
used_by: IS-MVP-01.1
Página pública do time
Página mais importante da primeira capability: deve comunicar identidade, atividade, confiança e caminhos claros para torcer, seguir, apoiar e explorar o time.
Objetivo
Página mais importante da primeira capability: deve comunicar identidade, atividade, confiança e caminhos claros para torcer, seguir, apoiar e explorar o time.
Pontos de entrada
- Busca universal.
- Feed e cards compartilháveis.
- Link direto raizfc.com.br/teams/:slug.
- Página de partida, ranking, torcida, campeonato ou território.
- Deep link mobile.
Hierarquia da tela
- Hero de identidade com banner/cores, escudo, nome, categoria/território e status.
- Ações primárias Torcer, Seguir, Apoiar e Compartilhar.
- Último resultado e próximo jogo em destaque equivalente, sem carrossel infantil.
- Resumo de ranking e estatísticas com período.
- Categorias e seletor de recorte.
- Elenco público por categoria.
- Torcidas aprovadas.
- Feed oficial do time.
- Apoiadores recentes e patrocinadores.
- Informações, contato, galeria e denúncia.
Componentes e comportamento
Hero
Usa identidade do time dentro de moldura RaizFC. Status inactive/abandoned/closed/under_review/suspended altera banner e ações. Escudo preserva suas cores; placeholder neutro quando ausente.
Action Cluster
Torcer é apoio público e gera follow. Seguir recebe novidades. Apoiar abre valores. Compartilhar abre card/permalink. Estados autenticado/anônimo precisam ser explícitos.
Match Spotlight
Dois cards ou layout responsivo para último resultado e próximo jogo. Exibe competição, categoria, data, campo e status de validação.
Ranking & Stats
Posição, badge Provisório, jogos, vitórias, empates, derrotas, gols e forma recente. Sempre indica período e território.
Categories
Tabs/chips filtram conteúdo sem criar páginas de times separados. Categoria “Todas” preserva visão agregada.
Squad
Lista/grid profissional com foto/avatar, apelido, posição e status. Invited/rejected nunca públicos. Guest só quando permitido no contexto.
Torcidas
Mostra várias torcidas approved, número público de membros e CTA de abrir/entrar.
Official Feed
Posts oficiais e cards canônicos. Sem comentários/curtidas.
Supporters
Até dez apoiadores identificados, sem valor. Apoios anônimos entram apenas em total agregado quando houver.
Sponsors
Grade de até três ativos, sem ordenar por valor e sem aparência de aposta.
Entity Status Banner
Explica abandoned, inactive, closed, suspended ou merged e oferece reivindicação/redirect quando aplicável.
Ações do usuário
| Ação | Pré-condição | Resultado | Falha/alternativa |
|---|---|---|---|
| Torcer | Autenticado ou AuthIntent | Cheer + follow; botão vira “Torcendo” | Conta suspensa/time indisponível |
| Seguir | Autenticado ou AuthIntent | Follow e atualização local | Já seguindo é idempotente |
| Apoiar | Time active; login só se identificado | Abre checkout de valores | Wallet/entidade restrita ou pagamento indisponível |
| Compartilhar | Conteúdo público | Abre formatos/card e link | Fallback texto+link |
| Abrir gestão | Permission management.view | Painel do time | 403 contextual |
| Denunciar | Autenticado | Fluxo de report | Login contextual |
Estados obrigatórios
| Estado | Representação | Ação disponível |
|---|---|---|
| Loading | Skeleton que preserva hero, jogos e seções | Cancelar/voltar |
| Success | Dados completos e hierarquia estável | Ações normais |
| Partial | Uma seção falha sem derrubar a página | Recarregar seção |
| Empty section | Mensagem contextual: sem jogos/elenco/torcida/posts | CTA somente quando permitido |
| Abandoned/inactive/closed | Banner e CTAs reduzidos | Reivindicar/seguir histórico |
| Suspended | Conteúdo limitado conforme política | Voltar/ suporte |
| Merged | Redirect para time canônico | Abrir destino |
| Not found | Estado dedicado | Buscar times |
Autenticação e permissões
- Leitura pública.
- Editar/gerir não aparece como ação principal para visitante; gestor recebe entrada discreta.
- Dados financeiros, memberships e audit logs nunca entram.
- Contatos obedecem visibilidade.
Responsividade
- Mobile empilha hero, ações em duas linhas e jogos; sticky action bar opcional para Torcer/Apoiar.
- Desktop usa hero amplo com coluna lateral de ações/status e conteúdo em grid 8/4.
- Elenco vira grid adaptativo; tabelas viram cards no mobile.
- Patrocinadores nunca dominam a primeira dobra.
Acessibilidade
- Escudo tem alt com nome.
- Status não depende só de cor.
- Tabs de categorias têm semântica e teclado.
- Placares lidos em ordem correta.
- Botões Torcer/Seguir possuem estado pressionado.
Eventos de produto e observabilidade
- public_team_viewed
- team_cheer_clicked
- team_follow_clicked
- support_started
- share_started
- category_changed
- sponsor_opened
- claim_started
Dados e endpoints
- GET /teams/:slug.
- GET /teams/:id/stats.
- GET /teams/:id/matches?kind=recent|upcoming.
- GET /teams/:id/players.
- GET /teams/:id/torcidas.
- GET /entities/team/:id/sponsors.
- GET /entities/team/:id/supporters.
- GET /feed/posts?entityType=team&entityId=.
Critérios de aceite
- Parece produto esportivo profissional, não tela infantil.
- Todas as seções discutidas estão previstas.
- Leitura sem login.
- Ações contextuais funcionam com AuthIntent.
- Estados de entidade e falha estão completos.
- Mobile e desktop têm composição definida.
Pós-MVP
- Loja.
- Agenda de amistosos.
- Personalização avançada de layout.
- Métricas para gestores.
Decisões registradas
- Primeira capability vertical do produto.
- Time é protagonista; RaizFC assina discretamente.
- Categoria filtra o mesmo time.
Machine summary
spec: SPEC-UX-PUBLIC-TEAM-001
screen_or_flow: Página pública do time
required_states:
- loading
- success
- empty
- error
must_use:
- contracts
- service
- hook
- design_tokens
must_not:
- direct_fetch
- direct_fixture_import
- hardcoded_brand_colors