CSS a clases Tailwind

Mapeo heurístico de declaraciones CSS habituales a utilidades Tailwind v3 y valores arbitrarios. Revisa en tu proyecto.

{{ t("cssToTailwindHint") }}

{{ cssToTailwind.message }}

Descripción

Adam Wathan lanzó Tailwind CSS en 2017 — primero como un artículo polémico titulado 'CSS Utility Classes and Separation of Concerns' en su blog, luego como una biblioteca real. La recepción fue dividida. Una parte de la comunidad CSS rechazó la idea con vehemencia: era CSS inline disfrazado, una violación de la separación de responsabilidades, plantillas que se convertirían en un revoltijo ilegible de clases. Wathan respondió cada objeción con argumentos prácticos sobre el mantenimiento a escala, y el tiempo le dio la razón. Entre 2022 y 2024, Tailwind se convirtió en la herramienta de CSS más usada del mundo según la encuesta State of CSS, con adopción por empresas como GitHub, Shopify y Vercel.

La filosofía central es invertir el modelo mental del CSS. En lugar de crear clases semánticas como `.boton-primario` que encapsulan propiedades, compones estilos directamente en el HTML con clases atómicas: `bg-blue-500 text-white px-4 py-2 rounded`. Parece prolijo a primera vista. En la práctica significa que nunca tienes que inventar nombres de clases (el trabajo más subestimado del CSS), el archivo CSS de producción tiene típicamente entre 5 KB y 20 KB gracias al compilador JIT, y modificar el estilo de un elemento nunca afecta otros elementos de forma inesperada.

Esta herramienta de conversión realiza un mapeo heurístico de declaraciones CSS comunes a clases Tailwind equivalentes. Lee declaraciones `propiedad: valor` (con o sin bloques `{}`), ignora los comentarios y sugiere utilidades como `flex`, `justify-center`, escalas de espaciado (`p-4`, `gap-6`) o valores arbitrarios (`[margin:12px]`). El resultado es un punto de partida: los breakpoints (`sm:`, `md:`), los estados como `hover:` y las variantes como `dark:` hay que añadirlos a mano, ya que dependen del contexto de diseño de tu proyecto.

Detalle técnico

CSS utility-first: el enfoque que dividió a la comunidad front-end

  • La idea de las clases de utilidad no nació con Tailwind. Nicole Sullivan presentó OOCSS (Object-Oriented CSS) en 2008, argumentando que HTML y CSS debían desacoplarse con clases reutilizables. Thierry Koblentz fue más lejos en 2013 con Atomic CSS: una clase por declaración CSS. Ambos recibieron las mismas críticas que recibiría Tailwind cuatro años después.
  • El principal argumento en contra es el acoplamiento entre HTML y estilos: al usar `bg-blue-500 text-white px-4 py-2 rounded` directamente en el HTML, estás acoplando la presentación al marcado. Si necesitas cambiar el estilo del botón, tendrás que actualizar cada aparición en el HTML. El argumento de Wathan: ese acoplamiento siempre existió, lo que cambia es dónde vive. Con CSS semántico, la clase `.boton-primario` en el HTML depende del CSS que la define; mover el archivo CSS no mueve el HTML. El acoplamiento es bilateral de cualquier forma.
  • El principal argumento a favor es la previsibilidad: una clase Tailwind como `p-4` siempre significa `padding: 1rem`. No existe el síndrome de 'añadir una propiedad a `.card` y romper el layout de `.card-news`', porque las clases no se heredan entre sí. Cada elemento tiene exactamente los estilos que describen sus clases.
  • Las empresas que migraron a Tailwind a escala reportan de forma consistente una reducción del tamaño del bundle CSS (de cientos de KB a menos de 20 KB con PurgeCSS/JIT), mayor velocidad de prototipado y menos conflictos en equipos grandes. GitHub migró parte de su frontend a Tailwind en 2021.
  • La crítica más válida que persiste: el HTML con muchas clases Tailwind puede volverse difícil de leer. La solución estándar son los componentes (React, Vue, Svelte) o `@apply` en CSS para agrupar clases que siempre aparecen juntas. Tailwind fue diseñado para funcionar con componentización, no como sustituto de arquitectura.

Design tokens y el sistema de escala numérica de Tailwind

  • El sistema de espaciado de Tailwind usa como unidad base 0,25 rem (4px por defecto). `p-1` = 4px, `p-2` = 8px, `p-4` = 16px, `p-8` = 32px, `p-16` = 64px. La escala es deliberadamente no lineal a partir de ciertos valores para cubrir los tamaños más comunes en diseño con menos clases.
  • La paleta de colores de Tailwind tiene 22 colores base (slate, gray, zinc, stone, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, neutral), cada uno con escalas del 50 al 950. Eso da más de 220 variaciones de color de serie, más de lo que la mayoría de los sistemas de diseño necesitan.
  • Los breakpoints por defecto son mobile-first: `sm` (640px), `md` (768px), `lg` (1024px), `xl` (1280px), `2xl` (1536px). Las clases sin prefijo se aplican a todos los tamaños. `md:flex` significa 'aplica `display: flex` solo en pantallas de 768px o más'. Lo contrario del enfoque de Bootstrap, que usaba `col-xs-` como tamaño base.
  • Los valores arbitrarios son la vía de escape cuando la escala por defecto no es suficiente: `w-[847px]`, `text-[13px]`, `bg-[#1a2b3c]`, `grid-cols-[1fr_2fr_1fr]`. Son compilados por el JIT y no aumentan el bundle de producción: solo las clases realmente usadas en el código entran en el CSS final.
  • La personalización se hace en `tailwind.config.js` bajo `theme.extend`. Puedes añadir colores de marca, fuentes personalizadas, espaciados propios de tu sistema de diseño, breakpoints adicionales y plugins. `extend` añade a los valores por defecto; sustituir `theme` directamente los elimina.

Fragmentos de Código

Mapeo CSS → Tailwind (referencia rápida)
/* DISPLAY Y LAYOUT */
display: flex              → flex
display: grid              → grid
display: none              → hidden
justify-content: center    → justify-center
align-items: center        → items-center
flex-direction: column     → flex-col
gap: 1rem                  → gap-4

/* ESPACIADO (base: 0,25rem = 4px) */
padding: 1rem              → p-4
padding-top: 0.5rem        → pt-2
margin: 0 auto             → mx-auto
margin-bottom: 1.5rem      → mb-6

/* TIPOGRAFÍA */
font-size: 1.125rem        → text-lg
font-weight: 700           → font-bold
line-height: 1.5           → leading-normal
text-align: center         → text-center

/* VISUAL */
background-color: #3b82f6  → bg-blue-500
border-radius: 0.375rem    → rounded
border-radius: 9999px      → rounded-full
box-shadow: ...            → shadow-md
opacity: 0.5               → opacity-50
tailwind.config.js con tema personalizado
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    './src/**/*.{html,js,jsx,ts,tsx,php}',
  ],
  theme: {
    extend: {
      // Colores de marca
      colors: {
        brand: {
          50:  '#f0f9ff',
          500: '#0ea5e9',
          900: '#0c4a6e',
        },
        danger: '#ef4444',
      },
      // Espaciado adicional
      spacing: {
        '18': '4.5rem',
        '88': '22rem',
        '128': '32rem',
      },
      // Fuentes personalizadas
      fontFamily: {
        sans: ['Inter', 'system-ui', 'sans-serif'],
        mono: ['JetBrains Mono', 'monospace'],
      },
    },
  },
  plugins: [
    require('@tailwindcss/typography'),  // Clase prose
    require('@tailwindcss/forms'),        // Estilos de formularios
  ],
};

Ejemplo

display: flex;
justify-content: center;
padding: 16px;

Preguntas frecuentes

¿Para qué sirve esta herramienta?

Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.

¿Se envían mis datos a algún servidor?

El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.

¿Puedo usarlo con datos reales en producción?

Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.