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
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 pinta | Token |
|---|---|
| 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
| Token | Claro | Oscuro | Controla |
|---|---|---|---|
--tuc-bg | #ffffff | #171717 | Fondo de campos, paneles y diálogos |
--tuc-fg | #0a0a0a | #fafafa | Texto principal |
--tuc-muted | #737373 | #a3a3a3 | Texto secundario: pista, cabecera de tabla, hora de la línea de tiempo |
--tuc-subtle | #a3a3a3 | #737373 | Texto e icono apagados: día fuera del mes, flecha de orden, punto neutro de la línea de tiempo |
--tuc-border | #e5e5e5 | #2e2e2e | Líneas y bordes |
--tuc-hover | #f5f5f5 | #262626 | Fondo bajo el cursor |
--tuc-elevated | #fafafa | #1f1f1f | Fondo de bloque interno: cabecera de tabla, cebreado, etiqueta neutra |
Acento
| Token | Claro | Oscuro | Controla |
|---|---|---|---|
--tuc-accent | #0a0a0a | #fafafa | Botón primario, día elegido, casilla marcada, pestaña activa, borde de foco |
--tuc-accent-hover | #262626 | #e5e5e5 | Botón primario bajo el cursor |
--tuc-accent-fg | #ffffff | #0a0a0a | Texto e icono sobre el acento |
--tuc-accent-text | #0a0a0a | #fafafa | Acento como color de texto: enlace, menú activo, etiqueta del select, "hoy", avatar de la tabla |
--tuc-thumb | #ffffff | #171717 | Bolita del interruptor |
--tuc-accent-soft | 12% del acento | igual | Franja del período, etiqueta del select, fila marcada de la tabla, fondo del avatar |
--tuc-accent-ring | 35% del acento | igual | Anillo de foco de campos y botones |
Tonos semánticos
| Token | Claro | Oscuro | Controla |
|---|---|---|---|
--tuc-success | #16a34a | #4ade80 | Etiqueta, aviso, toast y línea de tiempo de éxito |
--tuc-warning | #d97706 | #fbbf24 | Lo mismo, para advertencia |
--tuc-danger | #dc2626 | #f87171 | Lo mismo, para peligro; también borde y mensaje de campo con error |
--tuc-info | #1d4ed8 | #60a5fa | Lo mismo, para información — 6,7 sobre blanco y 5,6 sobre su propio fondo suave |
--tuc-danger-fill | #dc2626 | igual | Relleno sólido: botón de peligro |
--tuc-success-soft | 12% del tono | 12% del tono | Fondo suave de la etiqueta |
--tuc-warning-soft | 14% del tono | 14% del tono | Fondo suave de la etiqueta |
--tuc-danger-soft | 12% del tono | 12% del tono | Fondo suave de la etiqueta |
--tuc-info-soft | 12% del tono | 12% del tono | Fondo 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
| Token | Por defecto | Hasta 40rem | Controla |
|---|---|---|---|
--tuc-radius | 0.875rem | — | Esquinas de paneles y bloques internos |
--tuc-radius-md | 0.625rem | — | Controles y celdas de día |
--tuc-radius-sm | 0.5rem | — | Botones y opciones |
--tuc-radius-xs | 0.375rem | — | Etiquetas y detalles |
--tuc-border-width | 1px | — | Grosor de todos los bordes del paquete |
--tuc-control-height | 2.375rem | 2.75rem | Altura de campo, botón, select, campo de color, pestañas segmentadas y paginación |
--tuc-swatch | 2rem | 2.5rem | Muestra, valor y cuentagotas dentro del color picker |
--tuc-cell | 2.25rem | — | Celda de día del calendario |
--tuc-text | 0.8125rem | 1rem en los campos | Tamaño del texto |
--tuc-font | inherit | — | Familia de la fuente — por defecto, la del proyecto |
Profundidad y movimiento
| Token | Claro | Oscuro | Controla |
|---|---|---|---|
--tuc-ring | rgb(0 0 0 / 0.12) | rgb(255 255 255 / 0.14) | Contorno fino de los paneles, parte de la sombra |
--tuc-shadow | tres capas | tres capas, más densas | Elevación de calendario, select, color picker, menú y toast |
--tuc-ease | cubic-bezier(0.16, 1, 0.3, 1) | igual | Curva de entrada: desacelera hasta detenerse |
--tuc-ease-in | cubic-bezier(0.4, 0, 0.9, 0.3) | igual | Curva de salida: acelera hasta desaparecer |
--tuc-duration | 160ms | igual | Paneles y cambios de estado |
--tuc-duration-lg | 280ms | igual | Lo que cruza la pantalla: modal, panel lateral, toast |
--tuc-duration-out | 170ms | igual | Salidas |
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.
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.
| Cambia | A | Por qué |
|---|---|---|
--tuc-text | 1rem, en todo lo que se escribe o se toca: campos, select, date picker, color picker, upload, editor, casillas, pestañas, paginación y botón | Safari 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-height | 2.75rem (44px) | Área táctil cómoda |
--tuc-swatch | 2.5rem | Acompaña al texto más grande en el toque |
| Date picker | En pantalla estrecha y táctil, el campo no recibe el foco y el propio panel es la entrada | Sin 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.