Status: Approved · v2.2 · SPEC-UX-PUBLIC-MATCH-001
depends_on: SPEC-DOMAIN-MATCH-001
used_by: IS-MVP-01.3, IS-MVP-06.3, IS-MVP-06.5
Página pública da partida
Placar e contexto são protagonistas; a página explica claramente agendamento, andamento, validação, contestação e histórico.
Objetivo
Placar e contexto são protagonistas; a página explica claramente agendamento, andamento, validação, contestação e histórico.
Pontos de entrada
- Aba Jogos.
- Página de time/campeonato/campo.
- Feed.
- Card compartilhável.
- Link direto.
Hierarquia da tela
- Header, contexto, placar/status, metadata e ActionCluster.
- Transmissões, somente quando a capability e a mídia forem públicas e disponíveis.
- Timeline e súmula/resumo disciplinar.
- Escalações, banco, técnico, publicação por lado e desfalques.
- Classificação contextual e/ou chaveamento conforme o formato.
- Histórico do confronto e forma recente.
- Galeria e prestadores vinculados.
Âncoras de composição do T4
- o conteúdo T4 ocupa no máximo 720 px e vive dentro do App Shell global de
SPEC-UX-SHELL-001; ele não cria outra sidebar ou bottom nav; - web usa 24 px de padding (16 px no compacto); mobile usa 16 px e preserva topbar contextual;
- scoreboard tem raio 16 px, padding 32×28 no desktop e 24×16 no compacto, escudos de 60/46 px e placar de 56/42 px na fonte de impacto;
- metadata forma um único bloco de quatro células (Competição, Categoria, Data e Local), com divisórias; abaixo de 330 px vira lista, nunca chips soltos;
- mobile mantém
Jogo,Escalações,Competição,H2HeFotosem scroll horizontal; tabs sem conteúdo são omitidas. A bottom nav global aparece exatamente uma vez via EP-MVP-19.29; - web mantém a ordem: jogo/mídia, timeline/súmula, escalações, competição, H2H, galeria e prestadores. Não se aceita substituir essa hierarquia por cards documentais genéricos.
No mobile, o conteúdo usa tabs Jogo, Escalações, Competição, H2H e Fotos. Tabs sem conteúdo são omitidas; no web as seções seguem o fluxo vertical acima.
Componentes e comportamento
Scoreboard
Placar em tipografia forte. waiting_validation usa label explícita; contested não parece resultado final.
Match Metadata
Data/hora/campo/competição/categoria com links públicos. date_pending trata “Data a definir” como estado real.
Validation Banner
Mostra quem precisa agir e prazo somente para gestores autorizados; público vê status sem dados internos.
Lineups
Tabs Time A/Time B ou colunas no desktop. Guest respeita nome permitido.
A projeção pública por lado precisa fornecer, sem inferência na screen: estado de publicação,
formação/posicionamento tático apresentável, titulares, banco, técnico, ausências permitidas e
eventos necessários aos badges. Portrait é ImageAsset opcional e só aparece quando a projection
o classifica como público. Fallback visual nunca é escolhido por hash do nome, gênero inferido ou
fixture local; na ausência de uma preferência pública explícita usa-se fallback neutro canônico.
Timeline
O contrato e a exportação mantêm eventos em ordem cronológica, agrupados por período quando disponível. A apresentação visual pode abrir pelo evento mais recente, desde que a ordem de leitura assistiva permaneça cronológica ou ofereça sequência equivalente explícita. Múltiplos eventos no mesmo minuto não são colapsados.
Gol, gol contra, assistência, cartões e substituição preservam tipos/participantes canônicos. A UI
pode agregar badges repetidos para apresentação (3 gols em um ícone + contador), mas não pode
reclassificar descrição livre para inventar tipo, participante ou minuto.
Competition Context
- liga e grupos exibem Classificação;
- mata-mata exibe Chaveamento;
- formato híbrido exibe Classificação e depois Chaveamento;
- sem projeção aplicável, a tab/seção é omitida;
- tabela, agregado, pernas, pênaltis, sorteio e vagas em aberto chegam da projeção canônica e nunca são calculados na screen.
Gallery & Providers
Grid 4:3, quantidade inicial par e overflow +N, sem legenda sobre miniaturas. caption e credit permanecem no DTO e aparecem no detalhe/viewer e na descrição acessível quando presentes. alt descreve o conteúdo; crédito não substitui alt. Prestador mostra somente projeção pública aprovada, sem contato privado.
ActionCluster
Compartilhar e gerar card dependem de payload elegível. Denunciar exige sessão ou abre AuthIntent. Ações de gestão são derivadas exclusivamente das capabilities do viewer e do status. Notificar-me só aparece em scheduled/date_pending quando a capability de lembrete estiver disponível. Capability ausente omite a ação; nenhum botão simula sucesso local.
Assets de escalação
O campo usa asset aprovado, theme-aware e com proveniência. Base64 do protótipo e SVG complexo redesenhado à mão não entram no produto. Foto pública elegível tem prioridade; fallback de avatar usa asset canônico com contraste validado. Sem asset aprovado, usa-se fallback neutro e registra-se o gate.
O campinho e os ícones Gol/Assistência aprovados são as cópias byte-idênticas de
assets/redesign-v3/icones-svg-themable/**, registradas em PROVENANCE.md. A fonte é somente
leitura; web/mobile escrevem apenas cópias de bundler. Fotos e silhuetas do pacote continuam
condicionadas à projection/privacidade acima e não viram mapa por nome de jogador.
Management Actions
Informar resultado, validar, contestar ou editar aparecem somente por permissão e status.
Ações do usuário
| Ação | Pré-condição | Resultado | Falha/alternativa |
|---|---|---|---|
| Gerar card | Público/contextual | Preview de resultado/próximo jogo | Fallback |
| Informar resultado | match.reportResult | Fluxo gestão | Status inválido |
| Validar | Parte autorizada | Validated | Version conflict |
| Contestar | Parte autorizada | Abre disputa | Prazo expirado/regra campeonato |
| Abrir campo | Field público | Página | Local livre não tem link |
| Denunciar | Autenticado | Report | AuthIntent |
| Notificar-me | Jogo futuro + capability | Assinatura idempotente | AuthIntent/indisponível |
Estados obrigatórios
| Estado | Representação | Ação disponível |
|---|---|---|
| Date pending | Confronto sem data e sem placar | Seguir contexto; lembrete gated |
| Scheduled | Sem placar, dados de agenda | Calendário/share; lembrete gated |
| In progress | Placar provisório; sem prometer live preciso | Atualizar manualmente |
| Waiting result | Encerrada sem placar informado | Gestores autorizados agem |
| Result reported | Placar informado e não validado | Validar/contestar por capability |
| Waiting validation | Placar provisório + badge | Validar/contestar por capability |
| Contested | Banner e dados não definitivos | Ver contexto público |
| Validated | Placar final e stats | Compartilhar |
| Finished | Encerramento administrativo; final conforme contrato | Compartilhar quando elegível |
| Cancelled | Motivo público permitido; sem stats | — |
Loading, error e partial não são status esportivos: usam skeleton/error boundary e seções independentes com retry somente quando retryable.
Estados de seção
available: renderiza o conteúdo elegível;empty: omite tab/seção sem conteúdo útil ou mostra vazio orientativo quando necessário;restricted: mensagem pública segura, sem revelar itens, contagem ou motivo privado;unavailable: falha isolada; demais seções continuam funcionais e retry respeitaerror.retryable.
Autenticação e permissões
- Leitura pública.
- Ações de gestão por parte/contexto.
- Evidências de contestação privadas.
- Súmula pública filtra dados.
Responsividade
- Mobile scoreboard compacto e timeline vertical.
- Desktop exibe escalações lado a lado e aside de metadados.
- Placar permanece legível em 320px.
- Tabs mobile não quebram linha:
flexShrink: 0, scroll horizontal e foco visível.
Acessibilidade
- Ordem de leitura time A, placar/status, time B.
- Timeline sem depender de ícones/cor.
- Status em texto.
- Cards clicáveis têm foco.
- Alteração visual recente-primeiro não altera a sequência cronológica para tecnologia assistiva.
- Imagens informativas têm alt; fotos decorativas junto a nome visível usam alt vazio.
Eventos de produto e observabilidade
- public_match_viewed
- match_share_started
- result_flow_opened
- validation_opened
- contest_opened
- lineup_tab_changed
Dados e endpoints
- GET /matches/:id.
- GET /matches/:id/report.
- POST /matches/:id/result|validate|contest.
- GET /matches/:id/head-to-head permanece compatível para consumidores legados/internos; a tela
pública T4 não o chama diretamente. H2H e forma recente chegam section-aware no
PublicMatchResponsecomposto deGET /matches/:id, prontos para apresentação e sem segundo fetch da screen.
Critérios de aceite
- Todos os statuses têm apresentação.
- Placar protagonista.
- Contestada não parece final.
- Escalações/eventos completos.
- Ações respeitam autoridade.
- Tabs/seções vazias são omitidas e falhas parciais não derrubam a página.
- Nenhuma capability gated aparece como CTA morto.
Pós-MVP
- Live updates, streaming e arbitragem digital.
Decisões registradas
- Página pública obrigatória.
- Resultado validado alimenta stats.
- Compartilhamento próximo ao placar.
Machine summary
spec: SPEC-UX-PUBLIC-MATCH-001
screen_or_flow: Página pública da partida
required_states:
- loading
- success
- empty
- error
must_use:
- contracts
- service
- hook
- design_tokens
must_not:
- direct_fetch
- direct_fixture_import
- hardcoded_brand_colors