Tema
Cor, raio, espessura de borda, altura de campo, fonte e movimento passam por variável CSS com o prefixo
--tuc-, e todas vivem em :root. Trocar o visual é sobrescrever variável, sem recompilar
nada: nenhum valor de cor, raio, borda ou altura está escrito à mão no CSS dos componentes.
Cor de destaque desta página
Nas amostras, cada cor troca --tuc-accent-fg junto, e também --tuc-accent-text, o tom do destaque usado como
cor de texto no item de menu ativo e na tag do select. Trocar só o --tuc-accent deixaria texto
ilegível no botão primário.
:root {
--tuc-accent: #4f46e5;
--tuc-accent-hover: #4338ca;
--tuc-accent-fg: #ffffff; /* texto sobre o destaque */
--tuc-accent-text: #4338ca; /* destaque como cor de texto, no claro */
--tuc-radius: 1rem; /* cantos mais redondos */
--tuc-control-height: 2.5rem; /* campos mais altos */
}
.dark {
--tuc-accent-text: #818cf8; /* no escuro, um tom mais claro para ter contraste */
}O destaque e o texto sobre ele
O destaque padrão é neutro: preto no tema claro e quase branco no escuro. A cor é do seu projeto — o pacote não impõe marca, e combina com qualquer uma até você trocar. O laranja que você vê nesta documentação é a cor do site, definida do mesmo jeito que você definiria a sua.
O destaque tem tokens separados para cada papel, porque uma cor viva raramente serve para todos. Sobre o laranja
deste site o texto é branco (--tuc-accent-fg), com contraste 2,7 — escolha de marca; quem precisa de 4,5
usa #0a0a0a (7,4). E laranja vivo como cor de texto sobre fundo claro também dá 2,7, então link, item de
menu ativo, tag do select, "hoje" no calendário e ícone ativo leem --tuc-accent-text, aqui
#B84300 no claro (5,5 sobre branco) e o próprio #FF7501 no escuro (6,7).
/* O laranja deste site */
:root {
--tuc-accent: #FF7501;
--tuc-accent-hover: #FF8A2A;
--tuc-accent-fg: #ffffff;
--tuc-accent-text: #B84300;
--tuc-thumb: #ffffff;
}
.dark {
--tuc-accent: #FF7501;
--tuc-accent-hover: #FF8A2A;
--tuc-accent-fg: #ffffff;
--tuc-accent-text: #FF7501;
--tuc-thumb: #ffffff;
}O .dark repete o destaque porque o padrão neutro muda com o tema: sem ele, o escuro voltaria ao quase
branco.
| O que se pinta | Token |
|---|---|
| Fundo, borda, marcação, sublinhado | --tuc-accent |
A propriedade color de um texto em destaque | --tuc-accent-text |
| Texto e ícone em cima do destaque | --tuc-accent-fg |
| A bolinha da chave | --tuc-thumb — separada, para quem troca --tuc-accent-fg para escuro não ganhar bolinha preta |
Ao trocar o destaque, confira três contrastes
O texto em cima dele (--tuc-accent-fg sobre --tuc-accent), e o texto de destaque sobre branco, sobre --tuc-hover e sobre --tuc-accent-soft. Cor clara pede --tuc-accent-fg escuro; cor escura, branco.
Tom semântico nunca lê o destaque. Sucesso, alerta, perigo e informação têm tokens próprios, porque a marca pode
ser de qualquer cor e o significado não pode mudar junto. Foi por isso que informação ganhou
--tuc-info: lendo o destaque, com laranja o aviso de informação ficava igual ao de alerta, e a etiqueta
"Novo" colava em "Em análise".
Tokens
A lista completa, com o valor de cada tema. A fonte da verdade é
src/styles/core/tokens.css; o llms.txt traz a mesma lista, gerada do código.
Superfície e texto
| Token | Claro | Escuro | Controla |
|---|---|---|---|
--tuc-bg | #ffffff | #171717 | Fundo de campos, painéis e diálogos |
--tuc-fg | #0a0a0a | #fafafa | Texto principal |
--tuc-muted | #737373 | #a3a3a3 | Texto secundário: dica, cabeçalho de tabela, hora da linha do tempo |
--tuc-subtle | #a3a3a3 | #737373 | Texto e ícone apagados: dia fora do mês, seta de ordenação, ponto neutro da linha do tempo |
--tuc-border | #e5e5e5 | #2e2e2e | Linhas e bordas |
--tuc-hover | #f5f5f5 | #262626 | Fundo sob o cursor |
--tuc-elevated | #fafafa | #1f1f1f | Fundo de bloco interno: cabeçalho de tabela, zebra, etiqueta neutra |
Destaque
| Token | Claro | Escuro | Controla |
|---|---|---|---|
--tuc-accent | #0a0a0a | #fafafa | Botão primário, dia escolhido, caixa marcada, aba ativa, borda de foco |
--tuc-accent-hover | #262626 | #e5e5e5 | Botão primário sob o cursor |
--tuc-accent-fg | #ffffff | #0a0a0a | Texto e ícone sobre o destaque |
--tuc-accent-text | #0a0a0a | #fafafa | Destaque como cor de texto: link, menu ativo, tag do select, "hoje", avatar da tabela |
--tuc-thumb | #ffffff | #171717 | Bolinha da chave |
--tuc-accent-soft | 12% do destaque | igual | Faixa do período, tag do select, linha marcada da tabela, fundo do avatar |
--tuc-accent-ring | 35% do destaque | igual | Anel de foco de campos e botões |
Tons semânticos
| Token | Claro | Escuro | Controla |
|---|---|---|---|
--tuc-success | #16a34a | #4ade80 | Etiqueta, aviso, toast e linha do tempo de sucesso |
--tuc-warning | #d97706 | #fbbf24 | O mesmo, para alerta |
--tuc-danger | #dc2626 | #f87171 | O mesmo, para perigo; também borda e mensagem de campo com erro |
--tuc-info | #1d4ed8 | #60a5fa | O mesmo, para informação — 6,7 sobre branco e 5,6 sobre o próprio fundo suave |
--tuc-danger-fill | #dc2626 | igual | Preenchimento sólido: botão de perigo |
--tuc-success-soft | 12% do tom | 12% do tom | Fundo suave da etiqueta |
--tuc-warning-soft | 14% do tom | 14% do tom | Fundo suave da etiqueta |
--tuc-danger-soft | 12% do tom | 12% do tom | Fundo suave da etiqueta |
--tuc-info-soft | 12% do tom | 12% do tom | Fundo suave da etiqueta |
Tom de texto e preenchimento sólido são tokens diferentes de propósito. O --tuc-danger é mais claro no
escuro para ter contraste sobre fundo escuro — e um botão pintado com ele ficaria pastel com texto branco em cima.
O --tuc-danger-fill é o mesmo nos dois temas.
Forma e tamanho
| Token | Padrão | Até 40rem | Controla |
|---|---|---|---|
--tuc-radius | 0.875rem | — | Cantos de painéis e blocos internos |
--tuc-radius-md | 0.625rem | — | Controles e células de dia |
--tuc-radius-sm | 0.5rem | — | Botões e opções |
--tuc-radius-xs | 0.375rem | — | Tags e detalhes |
--tuc-border-width | 1px | — | Espessura de toda borda do pacote |
--tuc-control-height | 2.375rem | 2.75rem | Altura de campo, botão, select, campo de cor, aba segmentada e paginação |
--tuc-swatch | 2rem | 2.5rem | Amostra, valor e conta-gotas dentro do color picker |
--tuc-cell | 2.25rem | — | Célula de dia do calendário |
--tuc-text | 0.8125rem | 1rem nos campos | Tamanho do texto |
--tuc-font | inherit | — | Família da fonte — por padrão, a do projeto |
Profundidade e movimento
| Token | Claro | Escuro | Controla |
|---|---|---|---|
--tuc-ring | rgb(0 0 0 / 0.12) | rgb(255 255 255 / 0.14) | Contorno fino dos painéis, parte da sombra |
--tuc-shadow | três camadas | três camadas, mais densas | Elevação de calendário, select, color picker, menu e toast |
--tuc-ease | cubic-bezier(0.16, 1, 0.3, 1) | igual | Curva de entrada: desacelera até parar |
--tuc-ease-in | cubic-bezier(0.4, 0, 0.9, 0.3) | igual | Curva de saída: acelera até sumir |
--tuc-duration | 160ms | igual | Painéis e mudanças de estado |
--tuc-duration-lg | 280ms | igual | O que atravessa a tela: modal, gaveta, toast |
--tuc-duration-out | 170ms | igual | Saídas |
Entrada e saída usam curvas diferentes de propósito: usar a mesma curva nos dois faz a saída parecer preguiçosa.
Tema escuro
O escuro segue a classe .dark no <html>, a convenção do Tailwind e do admin
moderno do Django. data-theme="dark" também vale.
<html class="dark">
<html data-theme="dark">Para seguir o sistema operacional, marque a raiz com data-tuc-theme="auto". É opt-in de propósito: seguir
o sistema por padrão fazia o componente escurecer sozinho numa página clara. Quem manda no tema é o projeto, e não
o sistema operacional.
<html data-tuc-theme="auto">O escuro também põe color-scheme: dark, que faz o navegador desenhar barra de rolagem e campo nativo em
tom escuro — só dentro dos componentes, para não impor o esquema de cores à página inteira.
Escopo por contêiner
Como são variáveis, o escopo é seu: em :root valem para a página inteira, e declaradas num
contêiner valem só ali dentro. É o jeito de ter um painel com cor própria, ou uma faixa escura numa página clara.
Destaque só neste bloco
As variáveis vão no próprio contêiner.
Escuro só neste bloco
.dark num contêiner, com fundo próprio.
No contêiner, redeclare os tokens derivados
--tuc-accent-soft, --tuc-accent-ring e os -soft dos tons são calculados a partir de outro token onde foram declarados, em :root — e descem para os filhos já calculados. Na raiz, trocar --tuc-accent recalcula tudo; num contêiner, o fundo suave continuaria na cor antiga. Por isso os dois blocos acima repetem a conta junto.
.panel-green {
--tuc-accent: #0f766e;
--tuc-accent-hover: #115e59;
--tuc-accent-fg: #ffffff;
--tuc-accent-text: #0f766e;
--tuc-accent-soft: color-mix(in oklab, var(--tuc-accent) 12%, transparent);
--tuc-accent-ring: color-mix(in oklab, var(--tuc-accent) 35%, transparent);
}
.dark .panel-green {
--tuc-accent-text: #2dd4bf; /* texto de destaque legível sobre fundo escuro */
}
/* .dark num contêiner: os tons mudam, e o fundo suave deles precisa ser refeito ali */
.band.dark {
background: var(--tuc-bg);
--tuc-success-soft: color-mix(in oklab, var(--tuc-success) 12%, transparent);
--tuc-warning-soft: color-mix(in oklab, var(--tuc-warning) 14%, transparent);
--tuc-danger-soft: color-mix(in oklab, var(--tuc-danger) 12%, transparent);
--tuc-info-soft: color-mix(in oklab, var(--tuc-info) 12%, transparent);
}Painel que abre fora do contêiner — calendário, lista do select, menu, toast — é inserido no fim do
<body> e não herda as variáveis dele. Para esses, declare o tema em :root, ou use
appendTo onde o componente oferece.
Layout compacto
Abaixo de 40rem (640px) o layout fica compacto. O mesmo ponto de corte vale para o CSS e para o
JavaScript do date picker, e é por largura — não por pointer: coarse —, porque um notebook com tela de
toque não deveria receber comportamento de celular.
| Muda | Para | Por quê |
|---|---|---|
--tuc-text | 1rem, em tudo onde se digita ou se toca: campos, select, date picker, color picker, upload, editor, caixas, abas, paginação e botão | O Safari do iOS dá zoom ao focar qualquer campo com menos de 16px, e a página inteira salta. Toast e tooltip ficam de fora: neles não há campo |
--tuc-control-height | 2.75rem (44px) | Alvo de toque confortável |
--tuc-swatch | 2.5rem | Acompanha o texto maior no toque |
| Date picker | Em tela estreita e de toque, o campo não recebe foco e o próprio painel é a entrada | Sem foco não sobe o teclado, que cobriria o calendário. A condição de toque entra para não desligar a digitação numa janela estreita de desktop |
Se o seu projeto troca de layout em outro ponto, o compacto da biblioteca não acompanha — ele é fixo em
40rem. Os seus campos devem adotar os mesmos 16px no celular pelo mesmo motivo; é o padrão
text-base md:text-sm do shadcn.