Pular para o conteúdo principal
Next Running

Fundações e biblioteca de componentes do Next Running

Esta página reúne, de forma técnica, os elementos base do design system — tipografia, cores, superfícies, estados semânticos, bordas e foco — e a primeira biblioteca de componentes reutilizáveis construída sobre eles. Ela não representa nenhuma tela comercial.

  • Movimento: hierarquia visual que guia o olhar como um percurso.
  • Desempenho: interfaces rápidas de ler, sem ruído visual.
  • Clareza: contraste e tipografia legíveis em qualquer contexto.
  • Segurança: estados nunca dependem só de cor.
  • Proximidade: linguagem direta, próxima de quem corre e organiza.
  • Energia: uma cor de marca vibrante, usada com intenção — não em excesso.

Tipografia

Fonte principal: Plus Jakarta Sans (variável, carregada via next/font/google). Escala semântica definida em globals.css (--text-*) — cada nível empacota tamanho, altura de linha e peso num único utilitário.

Display

Heading 1

Heading 2

Heading 3

Heading 4

Body — texto de corpo em tamanho padrão, usado para parágrafos e descrições ao longo da aplicação.

Body small — texto auxiliar, usado em legendas e metadados.

Label — rótulo de campo de formulário

Caption — texto de apoio em tamanho mínimo, ex.: timestamps.

Heading longo em largura reduzida (320px) — quebra previsível, sem sobreposição nem corte de texto.

Título de exemplo bastante longo para verificar a quebra de linha em telas estreitas

Superfícies

  • background
  • surface
  • surface elevada
  • surface muted
  • card
  • muted
  • popover

Paleta da marca

  • primary
  • secondary
  • accent

Estados semânticos

Cada estado combina cor, ícone e texto — nenhum depende só da cor para ser compreendido.

  • SucessoInscrição confirmada.
  • AvisoPrazo se aproximando.
  • InformaçãoNovo percurso disponível.
  • ErroFalha ao salvar os dados.

Bordas e raios

  • sm
  • md
  • lg
  • xl

Ícones

  • Ritmo
  • Tempo
  • Percurso
  • Conquistas

Foco e navegação por teclado

Use a tecla Tab para navegar até os controles abaixo e observe o anel de foco visível. A animação de pulso respeita a preferência de redução de movimento do sistema.

Voltar ao topoIndicador de atividade em tempo real (exemplo)

Botões

Seis variantes, quatro tamanhos de texto, tamanhos somente ícone, estado de carregamento acessível (aria-busy, sem esconder o texto) e estado desabilitado.

Label longo — o grupo de botões quebra linha (flex-wrap) em vez de estourar a viewport ou cortar o texto.

Badges e estados

PadrãoSecundárioContornoDestrutivo
ConfirmadaPendenteNovaCanceladaRascunho

Campos de formulário

Primitivas isoladas, sem validação — o formulário de demonstração ao final da página valida campos equivalentes com Zod.

Composição CampoTexto — label, texto auxiliar e mensagem de erro já associados via aria-describedby e aria-invalid.

Usado apenas neste exemplo, sem persistência.

Texto auxiliar longo para verificar se a mensagem quebra em várias linhas sem cortar palavras nem estourar a largura do campo em telas estreitas.

Seleção, checkbox, radio e switch

Distância preferida (exemplo)

Composição CampoSelecao — estados de erro, desabilitado e "sem opções disponíveis".

Nenhum kit foi cadastrado ainda.

Alertas

Mensagem persistente numa área da interface — diferente do toast (retorno temporário de uma ação) e do InlineFeedback (feedback compacto dentro de um fluxo). Cada variante combina cor, ícone e texto.

Cards

Card via SectionCard

Composição pronta com título, descrição e conteúdo — usada nas seções abaixo.

Conteúdo de exemplo dentro do card.

Card primitivo
Uso direto de Card/CardHeader/CardContent, sem o wrapper SectionCard — útil quando o cabeçalho precisa de um layout customizado.

Conteúdo de exemplo dentro do card.

Tabela

Estrutura semântica (table/thead/tbody), com rolagem horizontal própria e coluna de ações com nomes acessíveis — nenhum comportamento interativo é adicionado às linhas automaticamente.

Provas de exemplo, sem dado real.
Nome da provaDataStatusAções
Circuito Interno 5K (exemplo)12/09/2026Confirmada
Meia Maratona da Serra (exemplo)03/11/2026Pendente

Linha selecionada (data-state="selected") — preparado para composição futura com seleção real de linhas.

Tabela larga — mais colunas do que cabem em 320px de largura. O contêiner interno de Table rola horizontalmente; a página em volta não.

Provas de exemplo com colunas adicionais.
Nome da provaDataCidadeDistânciaStatusKits entreguesInscriçõesAções
Circuito Interno 5K (exemplo)12/09/2026São Paulo (SP)5 kmConfirmada128412

Tabela vazia — o corpo compõe EmptyState (variante compacta) numa única célula, em vez de duplicar o estado "vazio" da aplicação.

Nenhuma prova de exemplo cadastrada.
Nome da provaDataAções

Nenhuma prova encontrada

Ajuste os filtros de exemplo para ver outros resultados.

Skeleton e progresso

Skeleton isolado

Progresso de exemplo (66%)

Tooltip, dialog, sheet, menu e avatar

Dialog e sheet fecham com Esc, clique fora ou pelo botão de fechar, e devolvem o foco ao controle que os abriu.

NR

Confirmação de ação

ConfirmDialog — composição sobre Dialog para confirmar uma única ação. A confirmação destrutiva não fecha sozinha enquanto a ação simulada está em andamento (loading).

Toast

Mecanismo de feedback acessível (Sonner) para confirmações e avisos pontuais.

Carregamento estrutural (skeleton)

Skeletons estruturais reservam o espaço aproximado do conteúdo final e evitam layout shift. Toda a estrutura fica oculta de leitores de tela — um único texto (sr-only) é anunciado por composição, nunca célula a célula.

PageSkeleton (carregamento inicial de página)

Carregando página de exemplo…

FormSkeleton (dados iniciais do formulário)

Carregando formulário de exemplo…

TableSkeleton (cabeçalhos reais mantidos visíveis)

Carregando tabela de provas de exemplo…

ListSkeleton

Carregando lista de exemplo…

Estados de interface

Estados reutilizáveis para carregamento, vazio, erro recuperável e indisponibilidade — nenhum depende só de cor para ser compreendido.

Carregando

Carregando lista de provas de exemplo…

Vazio

Nenhuma prova encontrada

Ajuste os filtros de exemplo para ver outros resultados.

Vazio (compacto)

Recurso ainda não configurado

Exemplo de variante compacta, para blocos menores.

Erro de página

Erro de seção (compacto)

Indisponibilidade (sem retry)

Inscrição confirmada

Exemplo de feedback inline de sucesso.

Prazo se aproximando

Exemplo de feedback inline de aviso.

Novo percurso disponível

Exemplo de feedback inline informativo.

Atualização em segundo plano e retry

Query real do TanStack Query (sem chamada HTTP — dados simulados localmente), demonstrando: carregamento inicial sem dados, dados preservados durante uma atualização em segundo plano, erro sem dados, erro de atualização preservando os últimos dados válidos e sucesso vazio.

Carregando percursos de exemplo…

Formulário de demonstração

Validado no cliente com React Hook Form e Zod. Coleta apenas dados fictícios e técnicos — nunca dado pessoal. O envio é uma simulação local — não há chamada HTTP, nem persistência em backend ou localStorage.

Não inclua dados reais. Máximo de 280 caracteres.

Envio simulado — nenhum dado é salvo ou transmitido a um backend.

Erro geral de formulário vs. erro de campo

Usa traduzirErroHttp para decidir entre associar o erro a um campo específico (FormFieldMessage, via CampoTexto) ou exibir um alerta geral (Alert) quando não há campo correspondente. O valor digitado nunca é apagado após uma falha, e o envio simulado é local — sem chamada HTTP.

Controla o resultado simulado do próximo envio — não é enviado ao servidor.

Página não encontrada (referência visual)

Ilustração do conteúdo real de not-found.tsx — não é um link para lá nem duplica a rota; serve apenas de referência visual nesta galeria.

Página não encontrada

O endereço acessado não existe nesta aplicação. Verifique o link ou volte para o início.

Nada por aqui

A página que você tentou acessar não foi encontrada.

Etapas 3 e 4 — fundações e biblioteca de componentes do design system. A partir da Etapa 5, esta galeria vive em /design-system, dentro do shell de navegação da aplicação; o conteúdo acima permanece isolado, sem integração externa. Use o controle de tema no cabeçalho para alternar entre claro, escuro e sistema.