
Tailwind CSS v3.3 está aquí — trayendo un montón de nuevas características que la gente ha estado pidiendo desde siempre, y un montón de cosas nuevas que ni siquiera sabías que querías.
- Paleta de colores extendida para oscuros más oscuros: Nuevos tonos 950 más oscuros para cada color.
- Soporte ESM y TypeScript: Escribe tu archivo de configuración usando ESM o TypeScript.
- Soporte RTL simplificado con propiedades lógicas: Construye layouts que se adapten a direcciones diferentes.
- Ajusta finamente las posiciones de las paradas de color del gradiente: Especifica exactamente dónde quieres que vaya cada parada de color.
- Line-clamp listo para usar: Trunca texto de varias líneas sin un plugin.
- Nuevo modificador de line-height: Establece tu font-size y line-height con una sola clase.
- Variables CSS sin el var(): Nueva sintaxis abreviada para valores arbitrarios.
font-variation-settings
configurable: Integrado directamente en tus utilidadesfont-*
.- Nuevas utilidades
list-style-image
: Para que puedas usar horribles clip art para las viñetas. - Nuevas utilidades
hyphens
: Para ajustar finamente el comportamiento de la separación silábica. - Nuevas utilidades
caption-side
: Titula tus tablas con estilo.
Eso cubre las cosas más emocionantes, pero echa un vistazo a las notas de la versión para obtener una lista exhaustiva de cada pequeña mejora que hemos hecho desde la última versión.
Actualizar tus proyectos es tan fácil como instalar la última versión de tailwindcss
desde npm:
npm install -D tailwindcss@latest
También puedes probar todas las nuevas características en Tailwind Play, directamente en tu navegador.
Paleta de colores extendida para oscuros más oscuros
Una de las solicitudes de características más comunes que hemos tenido a lo largo de los años es agregar tonos más oscuros para cada color — generalmente porque alguien está construyendo una UI oscura y solo quiere más opciones en ese extremo oscuro del espectro.
Bueno, deseo concedido — en Tailwind CSS v3.3 hemos agregado un nuevo tono 950
para cada color.
En los grises actúan básicamente como un negro teñido, lo cual es genial para UIs ultra oscuras:

Y en el resto del espectro de colores optimizamos 950
para texto de alto contraste y fondos de control teñidos:


Lo creas o no, la parte más difícil de este proyecto fue convencernos a nosotros mismos de estar de acuerdo con tener 11 tonos por color. Intentar que eso se viera bien en la documentación de la paleta de colores fue una pesadilla.
También brindemos por los chistes de 50 sombras de gris que solíamos poder hacer.
Soporte ESM y TypeScript
Ahora puedes configurar Tailwind CSS en ESM, o incluso en TypeScript:
/** @type {import('tailwindcss').Config} */export default { content: [], theme: { extend: {}, }, plugins: [],};
Cuando ejecutes npx tailwindcss init
, detectaremos si tu proyecto es un Módulo ES y generaremos automáticamente tu archivo de configuración con la sintaxis correcta.
También puedes generar un archivo de configuración ESM explícitamente usando la bandera --esm
:
npx tailwindcss init --esm
Para generar un archivo de configuración TypeScript, usa la bandera --ts
:
npx tailwindcss init --ts
Mucha gente asume que esto es fácil porque ya están escribiendo su propio código en ESM (incluso si está siendo transpilado por su herramienta de compilación) pero en realidad es bastante complicado — literalmente tenemos que transpilar el archivo de configuración por ti sobre la marcha.
Es un poco más fácil entender por qué tiene que suceder esto cuando piensas en el caso de TypeScript, porque por supuesto Tailwind se distribuye como JavaScript, y no puede importar mágicamente un archivo TypeScript no compilado.
Estamos manejando esto con la maravillosa biblioteca jiti internamente, y usando Sucrase para transpilar el código con el mejor rendimiento posible mientras mantenemos pequeña la huella de instalación.
Soporte RTL simplificado con propiedades lógicas
Hemos hecho posible estilizar sitios web multidireccionales usando nuestras variantes LTR y RTL durante un tiempo, pero ahora puedes usar propiedades lógicas para hacer la mayor parte de este estilizado de manera más fácil y automática.
Usando nuevas utilidades como ms-3
y me-3
, puedes estilizar el inicio y el final de un elemento para que tus estilos se adapten automáticamente en RTL, en lugar de escribir código como ltr:ml-3 rtl:mr-3
:
De izquierda a derecha
Tom Cook
Director de Operaciones
De derecha a izquierda
تامر كرم
Director Ejecutivo
<div class="group flex items-center"> <img class="h-12 w-12 shrink-0 rounded-full" src="..." alt="" /> <div class="ltr:ml-3 rtl:mr-3"> <div class="ms-3"> <p class="text-sm font-medium text-slate-700 group-hover:text-slate-900" dark-class="text-sm font-medium text-slate-300 group-hover:text-white" > ... </p> <p class="text-sm font-medium text-slate-500 group-hover:text-slate-700" dark-class="text-sm font-medium text-slate-500 group-hover:text-slate-300" > ... </p> </div> </div></div>
Hemos agregado nuevas utilidades de propiedades lógicas para inset, margin, padding, border-radius, scroll-margin, y scroll-padding.
Aquí hay una lista completa de todas las nuevas utilidades que hemos agregado y a qué se mapean:
Nueva clase | Propiedades | Contraparte física (LTR) |
---|---|---|
start-* | inset-inline-start | left-* |
end-* | inset-inline-end | right-* |
ms-* | margin-inline-start | ml-* |
me-* | margin-inline-end | mr-* |
ps-* | padding-inline-start | pl-* |
pe-* | padding-inline-end | pr-* |
rounded-s-* | border-start-start-radius border-end-start-radius | rounded-l-* |
rounded-e-* | border-start-end-radius border-end-end-radius | rounded-r-* |
rounded-ss-* | border-start-start-radius | rounded-tl-* |
rounded-se-* | border-start-end-radius | rounded-tr-* |
rounded-ee-* | border-end-end-radius | rounded-br-* |
rounded-es-* | border-end-start-radius | rounded-bl-* |
border-s-* | border-inline-start-width | border-l-* |
border-e-* | border-inline-end-width | border-r-* |
border-s-* | border-inline-start-color | border-l-* |
border-e-* | border-inline-end-color | border-r-* |
scroll-ms-* | scroll-margin-inline-start | scroll-ml-* |
scroll-me-* | scroll-margin-inline-end | scroll-mr-* |
scroll-ps-* | scroll-padding-inline-start | scroll-pl-* |
scroll-pe-* | scroll-padding-inline-end | scroll-pr-* |
Estas deberían ahorrarte un montón de código si construyes regularmente sitios que necesitan soportar idiomas LTR y RTL, y siempre puedes combinarlas con las variantes ltr
y rtl
cuando necesites más control.
Ajusta finamente las posiciones de las paradas de color del gradiente
Hemos agregado nuevas utilidades como from-5%
, via-35%
, y to-85%
que te permiten ajustar la posición real de cada parada de color en tus gradientes:
}
<div class="bg-gradient-to-r from-indigo-500 from-10% via-purple-500 via-30% to-pink-500 to-90% ..."> <!-- ... --></div>
Hemos incluido cada valor del 0% al 100% en pasos de 5 de forma predeterminada, pero por supuesto puedes usar valores arbitrarios para obtener exactamente el efecto que deseas:
<div class="bg-gradient-to-r from-cyan-400 from-[21.56%] ..."> <!-- ... --></div>
Para más detalles, consulta la documentación de paradas de color de gradiente.
Line-clamp listo para usar
Lanzamos nuestro plugin oficial line-clamp hace poco más de dos años y aunque usa un montón de cosas raras obsoletas de -webkit-*
, funciona en todos los navegadores y va a funcionar para siempre, así que decidimos simplemente incorporarlo al propio framework.
Impulsa tu tasa de conversión
\n Nulla dolor velit adipisicing duis excepteur esse in duis nostrud occaecat mollit incididunt deserunt sunt.\n Ut ut sunt laborum ex occaecat eu tempor labore enim adipisicing minim ad. Est in quis eu dolore occaecat\n excepteur fugiat dolore nisi aliqua fugiat enim ut cillum. Labore enim duis nostrud eu. Est ut eiusmod\n consequat irure quis deserunt ex. Enim laboris dolor magna pariatur. Dolor et ad sint voluptate sunt elit\n mollit officia ad enim sit consectetur enim.\n
<article> <div> <time datetime="2020-03-16" class="block text-sm/6 text-gray-600">Mar 10, 2020</time> <h2 class="mt-2 text-lg font-semibold text-gray-900">Impulsa tu tasa de conversión</h2> > <p class="mt-4 line-clamp-3 text-sm/6 text-gray-600"> Nulla dolor velit adipisicing duis excepteur esse in duis nostrud occaecat mollit incididunt deserunt sunt. Ut ut sunt laborum ex occaecat eu tempor labore enim adipisicing minim ad. Est in quis eu dolore occaecat excepteur fugiat dolore nisi aliqua fugiat enim ut cillum. Labore enim duis nostrud eu. Est ut eiusmod consequat irure quis deserunt ex. Enim laboris dolor magna pariatur. Dolor et ad sint voluptate sunt elit mollit officia ad enim sit consectetur enim. </p> </div> <div class="mt-4 flex gap-x-2.5 text-sm leading-6 font-semibold text-gray-900"> <img src="..." class="h-6 w-6 flex-none rounded-full bg-gray-50" /> Lindsay Walton </div></article>
Así que cuando actualices a v3.3, puedes eliminar de forma segura el plugin line-clamp si lo estabas usando:
module.exports = { // ... plugins: [\n require('@tailwindcss/line-clamp') //\n ]\n}
Que no te golpee la puerta en el trasero al salir, plugin.
Echa un vistazo a la nueva documentación de line-clamp para aprender más sobre cómo funciona todo si no has jugado con él antes.
Nuevo atajo de line-height para utilidades de font-size
Una cosa que hemos descubierto a lo largo de años y años de diseñar cosas bonitas con Tailwind es que literalmente nunca establecemos un line-height sin establecer también el font-size al mismo tiempo.
Así que, inspirados por nuestra sintaxis de modificador de opacidad de color, decidimos hacer posible ahorrar algunos caracteres estableciéndolos juntos con una sola utilidad:
<p class="text-lg leading-7 ...\"><p class="text-lg/7 ...\">\n Así que empecé a caminar hacia el agua. No les mentiré chicos, estaba aterrorizado. Pero seguí adelante, y mientras pasaba las rompientes una extraña calma me invadió. No sé si fue intervención divina o la hermandad de todos los seres vivos pero te digo Jerry en ese momento, I <em>era</em> un biólogo marino.\n</p>\n```\n\nPuedes usar cualquier valor definido en tu [escala de line-height](https://v3.tailwindcss.com/docs/line-height), o usar valores arbitrarios si necesitas desviarte de tus tokens de diseño:\n\n```html\n<!--] -->\n<p class=\"text-sm/[17px] ...\"></p>\n```\n\nEcha un vistazo a la [documentación de font size](https://v3.tailwindcss.com/docs/font-size#setting-the-line-height) para algunos ejemplos más.\n\n---\n\n## Variables CSS sin el `var()`\n\nCon el espíritu de escribir menos, también hemos hecho posible omitir el `var()` al usar una variable CSS como un valor arbitrario:\n\n```js\n// [!code filename:my-component.jsx]\nexport function MyComponent({ company }) {\n return (\n <div\n style={{\n \"--brand-color\": company.brandColor,\n \"--brand-hover-color\": company.brandHoverColor,\n }}\n className=\"bg-[var(--brand-color)] hover:bg-[var(--brand-hover-color)]\" // [!code --]\n className=\"bg-(--brand-color) hover:bg-(--brand-hover-color)\" // [!code ++]\n />\n );\n}\n```\n\nEse es un truco bastante genial para usar cosas como `hover:` con estilos que provienen de la base de datos o algo así, por cierto.\n\n---\n\n## Configurar `font-variation-settings` para familias de fuentes personalizadas\n\nAl usar fuentes personalizada, a menudo querrás configurar cosas como `font-feature-settings` o `font-variation-settings` para optar por ajustes específicos que ofrece la fuente.\n\nHemos facilitado hacer esto para `font-feature-settings` durante un tiempo, pero ahora puedes hacer lo mismo con `font-variation-settings` proporcionando un valor para ello en el objeto de opciones que puedes colocar después de la lista de fuentes en tu archivo de configuración:\n\n```js\n// [!code filename:tailwind.config.js]\nmodule.exports = {\n theme: {\n fontFamily: {\n sans: [\n \"Inter var, sans-serif\"\n // [!code highlight:5]\n {\n fontFeatureSettings: '\"cv11\", \"ss01\"',\n fontVariationSettings: '\"opsz\" 32',\n },\n ],\n },\n },\n};\n```\n\nEn el ejemplo anterior estamos usando una versión reciente de [Inter](https://github.com/rsms/inter/releases/tag/v4.0-beta7) que admite el uso del eje de tamaño óptico para activar la variación \"Display\" de la fuente, optimizada para tamaños más grandes como titulares.\n\n---\n\n## Nuevas utilidades `list-style-image`\n\n¿Alguna vez quisiste usar una imagen de una zanahoria como marcador de elemento de lista? Bueno, ahora puedes, con las nuevas utilidades `list-image-*`.\n\n<Figure>\n\n<Example padding={false}>\n {\n <div className=\"px-4 sm:px-0\">\n <div className=\"mx-auto max-w-sm bg-white p-8 text-sm leading-6 text-slate-700 shadow-xl sm:text-base sm:leading-7 dark:bg-slate-800 dark:text-slate-400\">\n <ul className=\"list-image-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBmaWxsPSIjZjk3MzE2Ij48cGF0aCBkPSJNMzQ2LjcgNkMzMzcuNiAxNyAzMjAgNDIuMyAzMjAgNzJjMCA0MCAxNS4zIDU1LjMgNDAgODBzNDAgNDAgODAgNDBjMjkuNyAwIDU1LTE3LjYgNjYtMjYuN2M0LTMuMyA2LTguMiA2LTEzLjNzLTItMTAtNi0xMy4yYy0xMS40LTkuMS0zOC4zLTI2LjgtNzQtMjYuOGMtMzIgMC00MCA4LTQwIDhzOC04IDgtNDBjMC0zNS43LTE3LjctNjIuNi0yNi44LTc0QzM3MCAyIDM2NS4xIDAgMzYwIDBzLTEwIDItMTMuMyA2ek0yNDQuNiAxMzZjLTQwIDAtNzcuMSAxOC4xLTEwMS43IDQ4LjJsNjAuNSA2MC41YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42cy0xNi40IDYuMi0yMi42IDBsLTU1LjMtNTUuMyAwIC4xTDIuMiA0NzcuOUMtMiA0ODctLjEgNDk3LjggNyA1MDVzMTcuOSA5IDI3LjEgNC44bDEzNC43LTYyLjQtNTIuMS01Mi4xYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBMMTk5LjcgNDMzbDEwMC4yLTQ2LjRjNDYuNC0yMS41IDc2LjItNjggNzYuMi0xMTkuMkMzNzYgMTk0LjggMzE3LjIgMTM2IDI0NC42IDEzNnoiLz48L3N2Zz4=')] pl-4 text-slate-900 marker:text-2xl dark:text-slate-200\">\n <li className=\"pl-2\">5 tazas de champiñones Porcini picados</li>\n <li className=\"pl-2\">1/2 taza de aceite de oliva</li>\n <li className=\"pl-2\">3 libras de apio</li>\n </ul>\n </div>\n </div>\n }\n</Example>\n\n```html\n<!--] -->\n<ul class=\"list-image-[url(/carrot.png)] ...\">\n <li>5 tazas de champiñones Porcini picados</li>\n <!-- ... -->\n</ul>\n```\n\n</Figure>\n\nNo vamos a empezar a enviar clip art de vegetales con el framework, pero puedes usar cualquier imagen que quieras ya sea como un valor arbitrario o configurándola en la sección `listStyleImage` de tu tema.\n\nEcha un vistazo a la [documentación de list style image](https://v3.tailwindcss.com/docs/list-style-image) para aprender más.\n\n---\n\n## Nuevas utilidades `hyphens`\n\n¿Alguna vez has oído hablar de la entidad HTML `­`? Yo tampoco hasta que agregamos soporte para estas utilidades `hyphens-*`.\n\nUsando `hyphens-manual` y un `­` cuidadosamente colocado, puedes decirle al navegador dónde insertar un guion cuando necesite dividir una palabra en varias líneas:\n\n<Figure>\n\n<Example padding={false}>\n {\n <div className=\"overflow-x-scroll px-4 sm:overflow-x-visible\">\n <div className=\"mx-auto max-w-xs bg-white p-12 text-slate-500 shadow-xl dark:bg-slate-800 dark:text-slate-400\">\n <p className=\"hyphens-manual\">\n <>Reconocida oficialmente por el diccionario Duden como la palabra más larga en alemán, </>\n <span className=\"font-medium text-slate-900 dark:text-slate-200\" lang=\"de\">\n <>Kraftfahrzeug­haftpflichtversicherung</>\n </span>\n <> es una palabra de 36 letras para seguro de responsabilidad civil de vehículos motorizados.</>\n </p>\n </div>\n </div>\n }\n</Example>\n\n```html\n\n\n<p class=\"hyphens-manual ...\">... Kraftfahrzeug­haftpflichtversicherung es una ...</p>\n```\n\n</Figure>\n\nTal vez un fragmento de código como este sería útil para incluir como parte del kit de prensa de tu banda de death metal impronunciable para que los periodistas no arruinen la separación silábica en el artículo que finalmente te lanza a la fama.\n\nEcha un vistazo a la [documentación de hyphens](https://v3.tailwindcss.com/docs/hyphens) para aprender más.\n\n---\n\n## Nuevas utilidades `caption-side`\n\nOtra novedad para mí — ¡el elemento `<caption>`! Tenemos nuevas utilidades `caption-*` que puedes usar en los títulos de las tablas para controlar si aparecen en la parte superior o inferior de la tabla a la que están adjuntos.\n\n<Figure>\n\n<Example padding={false}>\n {\n <div className=\"overflow-hidden px-4 py-8 shadow-sm sm:px-8\">\n <table className=\"w-full table-auto border-collapse text-sm\">\n <caption className=\"caption-bottom pt-4 text-xs text-slate-500 dark:text-slate-400\">\n <>Tabla 3.1: Luchadores profesionales y sus movimientos característicos.</>\n </caption>\n <thead>\n <tr>\n <th className=\"border border-slate-200 p-4 pt-3 pb-3 pl-8 text-left font-medium text-slate-400 dark:border-slate-600 dark:text-slate-200\">\n <>Luchador</>\n </th>\n <th className=\"border border-slate-200 p-4 pt-3 pr-8 pb-3 text-left font-medium text-slate-400 dark:border-slate-600 dark:text-slate-200\">\n <>Movimiento(s) característico(s)</>\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-slate-800\">\n <tr>\n <td className=\"border border-slate-200 p-4 pl-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>\"Stone Cold\" Steve Austin</>\n </td>\n <td className=\"border border-slate-200 p-4 pr-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>Stone Cold Stunner, Lou Thesz Press</>\n </td>\n </tr>\n <tr>\n <td className=\"border border-slate-200 p-4 pl-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>Bret \"The Hitman\" Hart</>\n </td>\n <td className=\"border border-slate-200 p-4 pr-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>The Sharpshooter</>\n </td>\n </tr>\n <tr>\n <td className=\"border border-slate-200 p-4 pl-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>Razor Ramon</>\n </td>\n <td className=\"border border-slate-200 p-4 pr-8 text-slate-500 dark:border-slate-600 dark:text-slate-400\">\n <>Razor's Edge, Fallaway Slam</>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n }\n</Example>\n\n```html\n\n<table>\n <caption class=\"caption-bottom\">\n Tabla 3.1: Luchadores profesionales y sus movimientos característicos.\n </caption>\n <thead>\n <tr>\n <th>Luchador</th>\n <th>Movimiento(s) característico(s)</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\"Stone Cold\" Steve Austin</td>\n <td>Stone Cold Stunner, Lou Thesz Press</td>\n </tr>\n <tr>\n <td>Bret \"The Hitman\" Hart</td>\n <td>The Sharpshooter</td>\n </tr>\n <tr>\n <td>Razor Ramon</td>\n <td>Razor's Edge, Fallaway Slam</td>\n </tr>\n </tbody>\n</table>\n```\n\n</Figure>\n\nEcha un vistazo a la [documentación de caption side](https://v3.tailwindcss.com/docs/caption-side) para algunos ejemplos más.\n\n---\n\n¡Así que eso es Tailwind CSS v3.3! Sin cambios disruptivos, solo un montón de cosas nuevas divertidas. Pruébalo en tus proyectos hoy actualizando a la última versión con npm:\n\n```sh\nnpm install -D tailwindcss@latest\n```\n\nSí, otro lanzamiento sin utilidades `text-shadow`. ¿Recuerdas ese episodio de Seinfeld donde Kramer intenta ver qué tan lejos puede conducir sin parar a repostar? Ese es mi episodio favorito.