Linha do tempo
Histórico em ordem: o andamento de um pedido, o que aconteceu com um contrato, as versões de um
changelog. É só classe sobre <ol> — a ordem é parte do significado, e o leitor de tela anuncia
"item 2 de 5" sem ninguém escrever ARIA. Ponto e trilho são desenhados pela classe; o template só traz o
conteúdo.
-
Pedido confirmado
Pagamento aprovado no Pix. -
Separado no estoque
-
Em transporte
Saiu do centro de distribuição de Campinas. -
Saiu para entrega
-
Entregue
Previsão: 12/09/2026.
O que já aconteceu tem ponto cheio no tom de sucesso; a etapa atual, cheio no destaque; o que ainda vem fica vazado e neutro. Quem diz o estado é o ponto — o texto fica livre para dizer o quê e quando.
Exemplos
Tudo abaixo é a mesma lista, com tom, preenchimento, ícone e etiqueta trocados.
Histórico de contrato, com ícones
tuc-timeline__icon como primeiro filho do item põe o ícone no lugar do ponto.
-
Contrato assinado
As duas partes assinaram pelo portal. -
Enviado para assinatura
-
Cláusula 4 revisada
Multa por atraso passou de 2% para 1%. -
Rascunho criado
Auditoria, com etiqueta
Uma tuc-badge no cabeçalho alinha pelo centro da linha.
-
Permissão removida
AcessoAna Lima tirou de Rafael Souza o acesso ao financeiro. -
Login de novo dispositivo
SessãoChrome no macOS, São Paulo. -
Relatório exportado
Dados
Os cinco tons, vazados
Sem is-filled o ponto é um anel no tom, sobre o fundo.
is-accent
is-success
is-warning
is-danger
is-info
sem tom
Os cinco tons, cheios
is-filled enche o ponto com o tom do item.
is-accent is-filled
is-success is-filled
is-warning is-filled
is-danger is-filled
is-info is-filled
is-filled, sem tom
Como usar
Não há JavaScript nem atributo data-*: escreva as classes e está pronto. Cada item tem um
cabeçalho com título e hora, e um corpo opcional.
<ol class="tuc-timeline">
<li class="tuc-timeline__item is-success is-filled">
<div class="tuc-timeline__head">
<p class="tuc-timeline__title">Contrato assinado</p>
<time class="tuc-timeline__time" datetime="2026-09-12">12/09/2026</time>
</div>
<div class="tuc-timeline__body">As duas partes assinaram.</div>
</li>
<li class="tuc-timeline__item">
<div class="tuc-timeline__head">
<p class="tuc-timeline__title">Enviado para assinatura</p>
<time class="tuc-timeline__time" datetime="2026-09-10">10/09/2026</time>
</div>
</li>
</ol>Com ícone
O ícone vai num <span> como primeiro filho do item. Quando ele existe, o ponto sai e o círculo
ganha o fundo suave do tom; o SVG é dimensionado pela classe.
<li class="tuc-timeline__item is-success">
<span class="tuc-timeline__icon"><svg viewBox="0 0 24 24" aria-hidden="true">...</svg></span>
<div class="tuc-timeline__head">...</div>
</li>No template do Django
O tom costuma sair do tipo do evento. Um dicionário no modelo, ou um filtro, evita o if em cascata no
template.
class Event(models.Model):
TONES = {"signed": "is-success", "revised": "is-warning", "canceled": "is-danger"}
kind = models.CharField(max_length=20)
title = models.CharField(max_length=120)
created_at = models.DateTimeField(auto_now_add=True)
@property
def tone(self):
return self.TONES.get(self.kind, "")<ol class="tuc-timeline">
{% for event in contract.events.all %}
<li class="tuc-timeline__item {{ event.tone }}{% if forloop.first %} is-filled{% endif %}">
<div class="tuc-timeline__head">
<p class="tuc-timeline__title">{{ event.title }}</p>
<time class="tuc-timeline__time" datetime="{{ event.created_at|date:'c' }}">{{ event.created_at|date:"d/m/Y H:i" }}</time>
</div>
</li>
{% endfor %}
</ol>Ajustar a geometria
Três variáveis na própria lista controlam a conta do ponto e do trilho. A primeira linha do cabeçalho tem altura
fixa pelo mesmo motivo do .tuc-choice: o centro do ponto não pode depender da fonte do projeto.
.timeline-large {
--tuc-timeline-gutter: 2rem; /* coluna do ponto; o ícone ocupa ela toda */
--tuc-timeline-dot: 1rem; /* diâmetro do ponto */
--tuc-timeline-line: 2rem; /* altura da primeira linha do cabeçalho */
}Acessibilidade
A estrutura faz o trabalho. <ol> dá a posição de cada item, <time datetime>
dá a data em formato que a máquina lê, e ponto e trilho são pseudo-elementos, invisíveis para o leitor de tela.
A cor não pode ser a única informação
O tom do ponto não chega a quem não vê e confunde quem não distingue as cores. Diga o estado no texto — "Cancelado", "Em transporte" — ou numa tuc-badge no cabeçalho, e marque o SVG do ícone com aria-hidden="true".
Classes
Só classe, sem componente em JavaScript.
| Classe | Onde | O que faz |
|---|---|---|
tuc-timeline | <ol> | A lista; tira marcador e recuo |
tuc-timeline__item | <li> | Um evento; desenha ponto e trilho. O último item não tem trilho |
is-accent is-success is-warning is-danger is-info | item | Tom do ponto e do ícone; sem tom, --tuc-subtle |
is-filled | item | Ponto cheio no tom; sem ela, vazado |
tuc-timeline__icon | primeiro filho do item | Ícone no lugar do ponto, com fundo suave do tom |
tuc-timeline__head | item | Linha do título, da hora e de uma etiqueta; quebra linha quando não cabe |
tuc-timeline__title | no cabeçalho | Título em peso 600, sem margem — pode ser <p> ou um <h2>/<h3> |
tuc-timeline__time | no cabeçalho | Data ou hora, menor, em tom apagado e com dígitos de largura fixa |
tuc-timeline__body | item | Texto de apoio em tom apagado |
| Variável | Padrão | Controla |
|---|---|---|
--tuc-timeline-gutter | 1.5rem | Largura da coluna do ponto e tamanho do ícone |
--tuc-timeline-dot | 0.75rem | Diâmetro do ponto |
--tuc-timeline-line | 1.5rem | Altura da primeira linha do cabeçalho, onde o ponto se centra |