Tucano v0.37.2

Tema

Color, radio, grosor de borde, altura de campo, fuente y movimiento pasan por variables CSS con el prefijo --tuc-, y todas viven en :root. Cambiar el aspecto es sobrescribir variables, sin recompilar nada: ningún valor de color, radio, borde o altura está escrito a mano en el CSS de los componentes.

Color de acento de esta página

Ver tokens

En las muestras, cada color cambia también --tuc-accent-fg, y además --tuc-accent-text, el tono del acento usado como color de texto en el elemento activo del menú y en la etiqueta del select. Cambiar solo --tuc-accent dejaría texto ilegible en el botón primario.

:root {
  --tuc-accent: #4f46e5;
  --tuc-accent-hover: #4338ca;
  --tuc-accent-fg: #ffffff;       /* texto sobre el acento */
  --tuc-accent-text: #4338ca;     /* acento como color de texto, en claro */
  --tuc-radius: 1rem;             /* esquinas más redondeadas */
  --tuc-control-height: 2.5rem;   /* campos más altos */
}
.dark {
  --tuc-accent-text: #818cf8;     /* en oscuro, un tono más claro para tener contraste */
}

El acento y el texto sobre él

El acento por defecto es neutro: negro en el tema claro y casi blanco en el oscuro. El color es de tu proyecto — el paquete no impone una marca, y combina con cualquiera hasta que lo cambies. El naranja que ves en esta documentación es el color del sitio, definido de la misma forma en que definirías el tuyo.

El acento tiene tokens separados para cada papel, porque un color vivo rara vez sirve para todos. Sobre el naranja de este sitio el texto es blanco (--tuc-accent-fg), con contraste 2,7 — decisión de marca; quien necesite 4,5 usa #0a0a0a (7,4). Y el naranja vivo como color de texto sobre fondo claro también da 2,7, así que el enlace, el elemento activo del menú, la etiqueta del select, el "hoy" del calendario y el icono activo leen --tuc-accent-text, aquí #B84300 en claro (5,5 sobre blanco) y el propio #FF7501 en oscuro (6,7).

/* El naranja de este sitio */
: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;
}

El .dark repite el acento porque el valor neutro por defecto cambia con el tema: sin él, el oscuro volvería al casi blanco.

Lo que se pintaToken
Fondo, borde, marca, subrayado--tuc-accent
La propiedad color de un texto destacado--tuc-accent-text
Texto e icono encima del acento--tuc-accent-fg
La bolita del interruptor--tuc-thumb — separada, para que quien cambie --tuc-accent-fg a oscuro no termine con una bolita negra

Al cambiar el acento, comprueba tres contrastes

El texto encima de él (--tuc-accent-fg sobre --tuc-accent), y el texto de acento sobre blanco, sobre --tuc-hover y sobre --tuc-accent-soft. Un color claro pide --tuc-accent-fg oscuro; un color oscuro, blanco.

Los tonos semánticos nunca leen el acento. Éxito, advertencia, peligro e información tienen tokens propios, porque la marca puede ser de cualquier color y el significado no puede cambiar con ella. Por eso información recibió --tuc-info: leyendo el acento, con naranja el aviso de información quedaba igual al de advertencia, y la etiqueta "Nuevo" se confundía con "En revisión".

Tokens

La lista completa, con el valor de cada tema. La fuente de verdad es src/styles/core/tokens.css; el llms.txt trae la misma lista, generada a partir del código.

Superficie y texto

TokenClaroOscuroControla
--tuc-bg#ffffff#171717Fondo de campos, paneles y diálogos
--tuc-fg#0a0a0a#fafafaTexto principal
--tuc-muted#737373#a3a3a3Texto secundario: pista, cabecera de tabla, hora de la línea de tiempo
--tuc-subtle#a3a3a3#737373Texto e icono apagados: día fuera del mes, flecha de orden, punto neutro de la línea de tiempo
--tuc-border#e5e5e5#2e2e2eLíneas y bordes
--tuc-hover#f5f5f5#262626Fondo bajo el cursor
--tuc-elevated#fafafa#1f1f1fFondo de bloque interno: cabecera de tabla, cebreado, etiqueta neutra

Acento

TokenClaroOscuroControla
--tuc-accent#0a0a0a#fafafaBotón primario, día elegido, casilla marcada, pestaña activa, borde de foco
--tuc-accent-hover#262626#e5e5e5Botón primario bajo el cursor
--tuc-accent-fg#ffffff#0a0a0aTexto e icono sobre el acento
--tuc-accent-text#0a0a0a#fafafaAcento como color de texto: enlace, menú activo, etiqueta del select, "hoy", avatar de la tabla
--tuc-thumb#ffffff#171717Bolita del interruptor
--tuc-accent-soft12% del acentoigualFranja del período, etiqueta del select, fila marcada de la tabla, fondo del avatar
--tuc-accent-ring35% del acentoigualAnillo de foco de campos y botones

Tonos semánticos

TokenClaroOscuroControla
--tuc-success#16a34a#4ade80Etiqueta, aviso, toast y línea de tiempo de éxito
--tuc-warning#d97706#fbbf24Lo mismo, para advertencia
--tuc-danger#dc2626#f87171Lo mismo, para peligro; también borde y mensaje de campo con error
--tuc-info#1d4ed8#60a5faLo mismo, para información — 6,7 sobre blanco y 5,6 sobre su propio fondo suave
--tuc-danger-fill#dc2626igualRelleno sólido: botón de peligro
--tuc-success-soft12% del tono12% del tonoFondo suave de la etiqueta
--tuc-warning-soft14% del tono14% del tonoFondo suave de la etiqueta
--tuc-danger-soft12% del tono12% del tonoFondo suave de la etiqueta
--tuc-info-soft12% del tono12% del tonoFondo suave de la etiqueta

El tono de texto y el relleno sólido son tokens distintos a propósito. --tuc-danger es más claro en oscuro para tener contraste sobre fondo oscuro — y un botón pintado con él quedaría pastel con texto blanco encima. --tuc-danger-fill es el mismo en los dos temas.

Forma y tamaño

TokenPor defectoHasta 40remControla
--tuc-radius0.875rem—Esquinas de paneles y bloques internos
--tuc-radius-md0.625rem—Controles y celdas de día
--tuc-radius-sm0.5rem—Botones y opciones
--tuc-radius-xs0.375rem—Etiquetas y detalles
--tuc-border-width1px—Grosor de todos los bordes del paquete
--tuc-control-height2.375rem2.75remAltura de campo, botón, select, campo de color, pestañas segmentadas y paginación
--tuc-swatch2rem2.5remMuestra, valor y cuentagotas dentro del color picker
--tuc-cell2.25rem—Celda de día del calendario
--tuc-text0.8125rem1rem en los camposTamaño del texto
--tuc-fontinherit—Familia de la fuente — por defecto, la del proyecto

Profundidad y movimiento

TokenClaroOscuroControla
--tuc-ringrgb(0 0 0 / 0.12)rgb(255 255 255 / 0.14)Contorno fino de los paneles, parte de la sombra
--tuc-shadowtres capastres capas, más densasElevación de calendario, select, color picker, menú y toast
--tuc-easecubic-bezier(0.16, 1, 0.3, 1)igualCurva de entrada: desacelera hasta detenerse
--tuc-ease-incubic-bezier(0.4, 0, 0.9, 0.3)igualCurva de salida: acelera hasta desaparecer
--tuc-duration160msigualPaneles y cambios de estado
--tuc-duration-lg280msigualLo que cruza la pantalla: modal, panel lateral, toast
--tuc-duration-out170msigualSalidas

La entrada y la salida usan curvas distintas a propósito: usar la misma curva en las dos hace que la salida parezca perezosa.

Modo oscuro

El modo oscuro sigue la clase .dark en el <html>, la convención de Tailwind y del admin moderno de Django. data-theme="dark" también vale.

<html class="dark">
<html data-theme="dark">

Para seguir al sistema operativo, marca la raíz con data-tuc-theme="auto". Es opt-in a propósito: seguir al sistema por defecto hacía que el componente se oscureciera solo en una página clara. Quien manda en el tema es el proyecto, y no el sistema operativo.

<html data-tuc-theme="auto">

El modo oscuro también pone color-scheme: dark, que hace que el navegador dibuje la barra de desplazamiento y los campos nativos en tono oscuro — solo dentro de los componentes, para no imponer el esquema de colores a toda la página.

Alcance por contenedor

Como son variables, el alcance lo decides tú: en :root valen para toda la página, y declaradas en un contenedor valen solo dentro de él. Es la forma de tener un panel con color propio, o una franja oscura en una página clara.

Acento solo en este bloque

Las variables van en el propio contenedor.

Oscuro solo en este bloque

.dark en un contenedor, con fondo propio.

Pagado Pendiente Nuevo

En el contenedor, vuelve a declarar los tokens derivados

--tuc-accent-soft, --tuc-accent-ring y los -soft de los tonos se calculan a partir de otro token donde fueron declarados, en :root — y bajan a los hijos ya calculados. En la raíz, cambiar --tuc-accent lo recalcula todo; en un contenedor, el fondo suave seguiría con el color anterior. Por eso los dos bloques de arriba repiten el cálculo 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 acento legible sobre fondo oscuro */
}

/* .dark en un contenedor: los tonos cambian, y su fondo suave hay que rehacerlo ahí */
.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);
}

Un panel que se abre fuera del contenedor — calendario, lista del select, menú, toast — se inserta al final del <body> y no hereda sus variables. Para esos, declara el tema en :root, o usa appendTo donde el componente lo ofrezca.

Diseño compacto

Por debajo de 40rem (640px) el diseño se vuelve compacto. El mismo punto de corte vale para el CSS y para el JavaScript del date picker, y es por ancho — no por pointer: coarse —, porque un portátil con pantalla táctil no debería recibir comportamiento de móvil.

CambiaAPor qué
--tuc-text1rem, en todo lo que se escribe o se toca: campos, select, date picker, color picker, upload, editor, casillas, pestañas, paginación y botónSafari en iOS hace zoom al enfocar cualquier campo con menos de 16px, y toda la página salta. Toast y tooltip quedan fuera: no tienen campos
--tuc-control-height2.75rem (44px)Área táctil cómoda
--tuc-swatch2.5remAcompaña al texto más grande en el toque
Date pickerEn pantalla estrecha y táctil, el campo no recibe el foco y el propio panel es la entradaSin foco no aparece el teclado, que taparía el calendario. La condición táctil está para no desactivar la escritura en una ventana estrecha de escritorio

Si tu proyecto cambia de diseño en otro punto, el compacto de la biblioteca no lo acompaña — está fijo en 40rem. Tus propios campos deberían adoptar los mismos 16px en el móvil por el mismo motivo; es el patrón text-base md:text-sm de shadcn.