Tema
BaseTimeline
Histórico de um registro: quem fez, o quê e quando. A justificativa de uma devolução aparece em destaque, como citação de quem devolveu.
Informação: lançou a medição 29
Atenção: devolveu a medição 28
Justificativa: Item 5.1 com quantidade acima do previsto para o pavimento 2. Conferir com o diário de obra.
Sucesso: registrou o 3º termo aditivo · +R$ 1.204.330,00
Uso
- Use na aba ou no cartão de histórico de um contrato, medição ou aditivo. Cada registro diz quem agiu, o que fez e quando.
- Passe os registros na ordem em que devem aparecer, normalmente do mais recente para o mais antigo. O componente não reordena.
- Escreva a ação no passado, logo depois do nome: "devolveu a medição 28", "registrou o 3º termo aditivo". O nome aparece em negrito antes dela.
- A data vem em ISO 8601 com hora e fuso (
2026-10-20T16:42:00-03:00ou2026-10-20T19:42:00Z) ou comoDate. O componente mostra quanto tempo passou e a data completa: "há 2 dias · 20/10/2026 às 16:42". A hora é sempre a de Brasília, em qualquer aparelho. - Uma data sem hora (
2026-10-20), sem fuso (2026-10-20T16:42:00) ou já formatada pela API aparece como veio, sem cálculo: o navegador leria cada uma num fuso diferente e mostraria a hora errada. Uma data vazia ounullnão aparece. justificationé o motivo dado por quem agiu, por exemplo ao devolver uma medição. Aparece como citação logo abaixo do registro, sem as linhas em branco do começo e do fim. Texto vazio, só com espaços ounullnão aparece.tonereforça o desfecho: um sinal no canto do avatar e a cor da borda da citação. A ação precisa dizer o desfecho em palavras; o tom só confirma.- O tempo relativo é calculado quando a lista aparece. Numa tela que fica aberta por horas, passe
nowcom uma data que você atualiza de tempos em tempos.
Tons
Sucesso: aprovou a medição 27
Atenção: devolveu a medição 26
Justificativa: Falta a memória de cálculo do item 3.2.
Alerta: cancelou o empenho 2026NE000398
Justificativa: Empenho emitido com a natureza de despesa errada.
Informação: pediu revisão do cronograma
anexou a memória de cálculo
| Tom | Sinal | Lido pelo leitor de tela | Quando |
|---|---|---|---|
neutral | nenhum | nada | Registro comum: anexou, editou, comentou |
info | i | "Informação:" | Lançou, enviou, pediu revisão |
success | ✓ | "Sucesso:" | Aprovou, assinou, concluiu |
warning | ! | "Atenção:" | Devolveu, pediu correção |
error | ✕ | "Alerta:" | Cancelou, recusou, rescindiu |
Datas
Informação: lançou a medição 29
Atenção: devolveu a medição 28
Justificativa: Item 5.1 com quantidade acima do previsto para o pavimento 2. Conferir com o diário de obra.
Informação: lançou a medição 29
Atenção: devolveu a medição 28
Justificativa: Item 5.1 com quantidade acima do previsto para o pavimento 2. Conferir com o diário de obra.
dates | Mostra | Quando |
|---|---|---|
both | "há 2 dias · 20/10/2026 às 16:42" | Padrão, para quem precisa da data exata e da noção de tempo |
relative | "há 2 dias", com a data completa na dica do mouse e no texto lido pelo leitor de tela | Cartão lateral com pouco espaço |
absolute | "20/10/2026 às 16:42" | Relatório impresso ou exportado, onde "há 2 dias" envelhece |
O tempo relativo conta o tempo passado, não o calendário: "há 1 dia" em vez de "ontem", para não dizer "ontem" de algo feito há 25 horas que caiu dois dias antes no calendário.
Tamanho pequeno
Informação: lançou a medição 29
Atenção: devolveu a medição 28
Justificativa: Item 5.1 com quantidade acima do previsto para o pavimento 2. Conferir com o diário de obra.
Carregando e vazio
Histórico: carregando
Histórico: Nenhum registro no histórico.
O histórico não tem estados de hover, foco, desabilitado ou erro: é uma lista para ler, sem nada para clicar.
Estilo
| Propriedade | Token |
|---|---|
| Nome | --tj-text-primary, --tj-weight-semibold |
| Ação | --tj-text-primary, --tj-text-md (--tj-text-sm no sm) |
| Data | --tj-text-helper, --tj-text-sm (--tj-text-xs no sm), números tabulares |
| Linha entre registros | 2 px de --tj-layer-accent-01 |
| Citação | Fundo --tj-layer-02, texto --tj-text-secondary, borda de 2 px |
| Borda da citação | --tj-border-strong-01; com tom, --tj-support-info, --tj-support-success, --tj-support-warning ou --tj-support-error |
| Sinal do tom | Círculo de --tj-icon-sm (16 px, ícone de 10 px; no sm, 12 px com ícone de 8 px, mais afastado para não cobrir as iniciais) em --tj-support-*-subtle com ícone em --tj-support-*-text, contorno de --tj-layer-01 |
| Espaço entre registros | --tj-space-5 (--tj-space-4 no sm) |
| Avatar | BaseAvatar de 32 px (md) ou 24 px (sm) |
Todos os tokens trocam de valor no tema escuro.
Código
vue
<script setup lang="ts">
import { BaseTimeline, type TimelineItem } from '@lab-inovacao/design-system'
const historico: TimelineItem[] = [
{ id: '102', author: 'Paulo Ramos', date: '2026-10-20T16:42:00-03:00', action: 'lançou a medição 29', tone: 'info' },
{
id: '101',
author: 'Marta Coelho',
date: '2026-09-18T10:05:00-03:00',
action: 'devolveu a medição 28',
justification: 'Item 5.1 acima do previsto para o pavimento 2.',
tone: 'warning',
},
]
</script>
<template>
<BaseTimeline :items="historico" label="Histórico da medição 29" />
</template>BaseTimeline
| Propriedade | Tipo | Padrão | Descrição |
|---|---|---|---|
items | TimelineItem[] | — | Registros na ordem em que aparecem. Obrigatório |
label | string | 'Histórico' | Nome da lista para o leitor de tela |
dates | 'both' | 'relative' | 'absolute' | 'both' | Quais datas cada registro mostra |
now | Date | hora atual | Referência do tempo relativo |
size | 'sm' | 'md' | 'md' | sm para cartão lateral |
loading | boolean | false | Mostra registros de espera e marca o histórico como ocupado (aria-busy) |
emptyText | string | 'Nenhum registro no histórico.' | Texto quando não há registros |
TimelineItem
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Chave estável, como o id do registro na API. Sem ela, a posição na lista vira a chave |
author | string | Nome completo de quem agiu. Obrigatório |
date | string | Date | null | ISO 8601 com hora e fuso, ou Date. Outro texto aparece como veio; null não mostra data. Obrigatório |
action | string | O que foi feito, no passado. Obrigatório |
justification | string | null | Motivo, mostrado como citação |
tone | 'neutral' | 'info' | 'success' | 'warning' | 'error' | Desfecho; um valor desconhecido vira neutral |
Sem eventos e sem slots.
Acessibilidade
- Segue o padrão de lista: um
<ol>comrole="list", porque o Safari tira a semântica de listas sem marcador. O leitor de tela anuncia a lista com o nome dado emlabele o número de registros. - O avatar é decorativo (
aria-hidden), porque o nome já está escrito ao lado. O leitor de tela lê "Paulo Ramos lançou a medição 29" uma vez só. - A data fica num
<time datetime>com o valor ISO. O texto lido é o mesmo que aparece na tela, com o tempo relativo e a data completa. - No modo
relative, a data completa fica num texto escondido dentro do<time>, e o leitor de tela lê "há 2 dias, 20/10/2026 às 16:42". A dica do mouse repete a data para quem usa mouse. Quem enxerga e usa toque ou teclado não alcança a dica: usebothquando essa pessoa precisa da data exata. - A justificativa é um
<blockquote>com o rótulo "Justificativa:" escondido na tela e lido pelo leitor de tela. - A cor nunca é o único sinal: o tom tem ícone de forma própria no avatar, e a ação diz o desfecho em palavras. O ícone é escondido do leitor de tela, que ouve o tom num prefixo escondido, como no
BaseKpiCard: "Atenção: Marta Coelho devolveu a medição 26". O registroneutralnão tem prefixo. - O componente tem um único elemento raiz em todos os estados. Carregando, ele recebe
aria-busy="true"e o texto "Histórico: carregando" para o leitor de tela; os registros de espera ficam escondidos dele. Quando a lista chega, o mesmo elemento perde oaria-busy. O componente não anuncia a chegada: para anunciar o fim da carga numa tela, envolva o histórico noBasePageState. A animação da espera para depois de três ciclos e respeitaprefers-reduced-motion. - Vazio, o texto começa pelo
labelescondido ("Histórico da medição 29: Nenhum registro no histórico."), para distinguir um histórico do outro na mesma tela. - A lista não entra na ordem do Tab, porque não tem nada para clicar.
- No modo de alto contraste do Windows, a linha entre registros, o sinal do tom e a borda da citação continuam visíveis.
- Contraste medido sobre
--tj-layer-01e--tj-layer-02: data 5,8:1 no claro e 7,5:1 no escuro; citação 10,5:1 e 10,2:1; ícone do tom entre 4,8:1 e 5,8:1 no claro e entre 6,3:1 e 8,6:1 no escuro. Todos acima de 4,5:1. - Testado com axe em todos os tons, nos três modos de data, no tamanho
sm(também com só o tempo relativo), carregando, vazio, depois de a carga terminar no mesmo componente, com data não ISO, com data e justificativanull, com registros com e semide com registro neutro com justificativa.