Tucano v0.37.2

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

Ver tokens

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 pintaToken
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

TokenClaroEscuroControla
--tuc-bg#ffffff#171717Fundo de campos, painéis e diálogos
--tuc-fg#0a0a0a#fafafaTexto principal
--tuc-muted#737373#a3a3a3Texto secundário: dica, cabeçalho de tabela, hora da linha do tempo
--tuc-subtle#a3a3a3#737373Texto e ícone apagados: dia fora do mês, seta de ordenação, ponto neutro da linha do tempo
--tuc-border#e5e5e5#2e2e2eLinhas e bordas
--tuc-hover#f5f5f5#262626Fundo sob o cursor
--tuc-elevated#fafafa#1f1f1fFundo de bloco interno: cabeçalho de tabela, zebra, etiqueta neutra

Destaque

TokenClaroEscuroControla
--tuc-accent#0a0a0a#fafafaBotão primário, dia escolhido, caixa marcada, aba ativa, borda de foco
--tuc-accent-hover#262626#e5e5e5Botão primário sob o cursor
--tuc-accent-fg#ffffff#0a0a0aTexto e ícone sobre o destaque
--tuc-accent-text#0a0a0a#fafafaDestaque como cor de texto: link, menu ativo, tag do select, "hoje", avatar da tabela
--tuc-thumb#ffffff#171717Bolinha da chave
--tuc-accent-soft12% do destaqueigualFaixa do período, tag do select, linha marcada da tabela, fundo do avatar
--tuc-accent-ring35% do destaqueigualAnel de foco de campos e botões

Tons semânticos

TokenClaroEscuroControla
--tuc-success#16a34a#4ade80Etiqueta, aviso, toast e linha do tempo de sucesso
--tuc-warning#d97706#fbbf24O mesmo, para alerta
--tuc-danger#dc2626#f87171O mesmo, para perigo; também borda e mensagem de campo com erro
--tuc-info#1d4ed8#60a5faO mesmo, para informação — 6,7 sobre branco e 5,6 sobre o próprio fundo suave
--tuc-danger-fill#dc2626igualPreenchimento sólido: botão de perigo
--tuc-success-soft12% do tom12% do tomFundo suave da etiqueta
--tuc-warning-soft14% do tom14% do tomFundo suave da etiqueta
--tuc-danger-soft12% do tom12% do tomFundo suave da etiqueta
--tuc-info-soft12% do tom12% do tomFundo 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

TokenPadrãoAté 40remControla
--tuc-radius0.875rem—Cantos de painéis e blocos internos
--tuc-radius-md0.625rem—Controles e células de dia
--tuc-radius-sm0.5rem—Botões e opções
--tuc-radius-xs0.375rem—Tags e detalhes
--tuc-border-width1px—Espessura de toda borda do pacote
--tuc-control-height2.375rem2.75remAltura de campo, botão, select, campo de cor, aba segmentada e paginação
--tuc-swatch2rem2.5remAmostra, valor e conta-gotas dentro do color picker
--tuc-cell2.25rem—Célula de dia do calendário
--tuc-text0.8125rem1rem nos camposTamanho do texto
--tuc-fontinherit—Família da fonte — por padrão, a do projeto

Profundidade e movimento

TokenClaroEscuroControla
--tuc-ringrgb(0 0 0 / 0.12)rgb(255 255 255 / 0.14)Contorno fino dos painéis, parte da sombra
--tuc-shadowtrês camadastrês camadas, mais densasElevação de calendário, select, color picker, menu e toast
--tuc-easecubic-bezier(0.16, 1, 0.3, 1)igualCurva de entrada: desacelera até parar
--tuc-ease-incubic-bezier(0.4, 0, 0.9, 0.3)igualCurva de saída: acelera até sumir
--tuc-duration160msigualPainéis e mudanças de estado
--tuc-duration-lg280msigualO que atravessa a tela: modal, gaveta, toast
--tuc-duration-out170msigualSaí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.

Pago Pendente Novo

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.

MudaParaPor quê
--tuc-text1rem, em tudo onde se digita ou se toca: campos, select, date picker, color picker, upload, editor, caixas, abas, paginação e botãoO 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-height2.75rem (44px)Alvo de toque confortável
--tuc-swatch2.5remAcompanha o texto maior no toque
Date pickerEm tela estreita e de toque, o campo não recebe foco e o próprio painel é a entradaSem 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.