Pular para o conteúdo principal

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

  1. Header, contexto, placar/status, metadata e ActionCluster.
  2. Transmissões, somente quando a capability e a mídia forem públicas e disponíveis.
  3. Timeline e súmula/resumo disciplinar.
  4. Escalações, banco, técnico, publicação por lado e desfalques.
  5. Classificação contextual e/ou chaveamento conforme o formato.
  6. Histórico do confronto e forma recente.
  7. 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, H2H e Fotos em 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.

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çãoPré-condiçãoResultadoFalha/alternativa
Gerar cardPúblico/contextualPreview de resultado/próximo jogoFallback
Informar resultadomatch.reportResultFluxo gestãoStatus inválido
ValidarParte autorizadaValidatedVersion conflict
ContestarParte autorizadaAbre disputaPrazo expirado/regra campeonato
Abrir campoField públicoPáginaLocal livre não tem link
DenunciarAutenticadoReportAuthIntent
Notificar-meJogo futuro + capabilityAssinatura idempotenteAuthIntent/indisponível

Estados obrigatórios

EstadoRepresentaçãoAção disponível
Date pendingConfronto sem data e sem placarSeguir contexto; lembrete gated
ScheduledSem placar, dados de agendaCalendário/share; lembrete gated
In progressPlacar provisório; sem prometer live precisoAtualizar manualmente
Waiting resultEncerrada sem placar informadoGestores autorizados agem
Result reportedPlacar informado e não validadoValidar/contestar por capability
Waiting validationPlacar provisório + badgeValidar/contestar por capability
ContestedBanner e dados não definitivosVer contexto público
ValidatedPlacar final e statsCompartilhar
FinishedEncerramento administrativo; final conforme contratoCompartilhar quando elegível
CancelledMotivo 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 respeita error.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 PublicMatchResponse composto de GET /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