Astro Framework y Tailwind CSS

Cómo Integrar y Personalizar Tailwind CSS en Proyectos con Astro Framework


Tailwind CSS es un framework de utilidades CSS que ha ganado popularidad por su enfoque en la creación de interfaces de usuario altamente personalizables sin tener que escribir CSS desde cero.

Usar Tailwind CSS en Astro permite a los desarrolladores crear diseños modernos y responsivos de manera rápida y eficiente, aprovechando lo mejor de ambos mundos.

Primeros Pasos: Configuración Inicial de Astro y Tailwind

Instalación de Astro y configuración básica

No queremos profundizar demasiado en este paso. Si no tenéis inicializado vuestro proyecto con Astro, ejecutáis lo siguiente en la terminal:

terminal
# npm
npm create astro@latest
# pnpm
pnpm create astro@latest
# yarn
yarn create astro

Esto te creará un proyecto base con el que empezar a trabajar. Si quieres personalizar la instalación o usar alguna plantilla, aquí tienes más información.

Instalación de Tailwind en un proyecto Astro

Ya hablamos sobre integraciones en el post para crear un Sitemap en Astro. Instalar Tailwind en Astro es bastante sencillo, ya que se nos proporciona una forma cómoda de instalar funcionalidades tanto oficiales como de la comunidad.

Desde la raíz de tu proyecto, ejecuta:

terminal
# npm
npx astro add tailwind
# pnpm
pnpm astro add tailwind
# yarn
yarn astro add tailwind

Al terminar la ejecución, se modificarán los siguientes archivos automáticamente para incluir tailwind en el proyecto.

astro.config.mjs
import { defineConfig } from 'astro/config';
import tailwind from '@astrojs/tailwind';

export default defineConfig({
  // ...
  integrations: [tailwind()],
});
tailwind.config.mjs
/** @type {import('tailwindcss').Config} */
export default {
	content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
	theme: {
		extend: {},
	},
	plugins: [],
}

Personalizando tu Proyecto: Configuraciones Específicas de Tailwind

Uso de directivas @tailwind

Las directivas @tailwind base, @tailwind components y @tailwind utilities son comandos que importan diferentes capas de estilos predefinidos de Tailwind CSS, permitiendo normalizar estilos, incluir componentes prediseñados y aplicar utilidades CSS en un proyecto.

Por defecto, Astro las usa de forma automática. Si no lo quisieras, puedes desactivarlas así:

astro.config.mjs
export default defineConfig({
  // ...
  integrations: [
    tailwind({
        applyBaseStyles: false,
    }),
  ],
});

Configuración de colores, fuentes y otros aspectos de diseño

Tailwind CSS te permite personalizar completamente los colores, fuentes y otros aspectos del diseño directamente en el archivo tailwind.config.js. Puedes definir paletas de colores personalizadas o incluso integrar fuentes personalizadas para que tu proyecto tenga un aspecto único.

tailwind.config.mjs
export default {
  theme: {
    extend: {
      colors: {
        primary: '#1D4ED8',
        secondary: '#9333EA',
        accent: '#F59E0B',
      },
      fontFamily: {
        sans: ['Inter', 'sans-serif'],
        serif: ['Merriweather', 'serif'],
      },
    },
  },
}

Esto es un simple ejemplo de lo que se puede hacer. Lo tienes todo en su documentación.

Prácticas Recomendadas para Organizar el Código con Astro y Tailwind

Estructura de carpetas y organización de estilos

En Astro, es crucial mantener una estructura organizada para facilitar el mantenimiento de tu proyecto y facilitar un buen flujo de trabajo.

Aquí te presento dos alternativas para organizar los estilos de tus componentes: una utilizando archivos .css con @apply y otra aplicando directamente las clases de Tailwind en los componentes .astro.

Alternativa 1: Usando @apply en archivos .css

Crearíamos archivos .css para los componentes.

src/

├── styles/
   ├── global.css
   ├── buttons.css
   └── cards.css

└── components/
    ├── Button.astro
    └── Card.astro

Dentro de ellos usaríamos las directivas @apply para poder incluir clases tailwind en archivos .css.

buttons.css
.btn-primary {
  @apply bg-primary text-white py-2 px-4 rounded;
}

.btn-secondary {
  @apply bg-secondary text-white py-2 px-4 rounded;
}

El componente quedaría mucho más limpio, ya que no tendríamos muchos nombres de clases para un elemento.

Button.astro
---
export const type = "primary";
export const label = "Click me";
---

<style src="../styles/buttons.css"></style>

<button class={type === "primary" ? "btn-primary" : "btn-secondary"}>
  {label}
</button>

IMPORTANTE: En frameworks como Vue o Svelte pueden ocurrir errores usando @apply.

Alternativa 2: Usando clases de Tailwind directamente en los archivos .astro

Esta sería la manera más ágil. Usaríamos archivos .css para estilos más globales o para casos donde no nos interese usar tailwind.

src/

├── styles/
   ├── global.css

└── components/
    ├── Button.astro
    └── Card.astro

Todo el estilado en los componentes se haría directamente con las clases de tailwind.

Button.astro
---
export const type = "primary";
export const label = "Click me";
---

<button class={type === "primary" 
    ? "bg-primary text-white py-2 px-4 rounded" 
    : "bg-secondary text-white py-2 px-4 rounded"}>
  {label}
</button>

Las dos alternativas son perfectamente válidas, así que no te preocupes demasiado en cuál de las dos usar. Simplemente elige la que se adapte mejor a tu manera de trabajar y que escale bien con el tipo de proyecto que quieras llevar a cabo.

Solución de Problemas Comunes en la Integración de Tailwind con Astro

Jerarquía de estilos en Astro

Hay que tener muy en cuenta que Astro lee los estilos de manera jerárquica. Hay estilos globales y estilos locales.

Como dice Astro en su documentación: Las reglas de CSS de Astro son evaluadas en este orden de aparición:

  • Prioridad baja: etiquetas <link> dentro de la etiqueta head
  • Prioridad media: estilos importados
  • Prioridad alta: estilos locales (clases de tailwind directamente en los .astro)

Dicen textualmente: el último estilo importado gana.

No funcionan las clases dinámicas

Al usar un framework, es común modificar el estilo de un componente de forma dinámica. Por ejemplo, esto cambia el color del texto según el valor de error.

// ❌ NO FUNCIONA
<div class="text-{{ error ? 'red' : 'green' }}-600"></div>

Sin embargo, esto con Tailwind no funciona como hemos mostrado. En su documentación, nos dicen que los nombres de clases dinámicos deben usarse de forma completa.

Así quedaría el ejemplo anterior corregido:

// ✅ SÍ FUNCIONA
<div class="{{ error ? 'text-red-600' : 'text-green-600' }}"></div>

Conclusión y Próximos Pasos

Recursos adicionales para seguir aprendiendo Astro y Tailwind

Si deseas profundizar en el uso de Astro y Tailwind, te recomendamos revisar la documentación oficial de Tailwind CSS y la documentación de Astro. Ambos recursos ofrecen guías detalladas y ejemplos avanzados.

Desafíos y prácticas avanzadas para mejorar tu desarrollo

Una vez que domines lo básico, puedes empezar a explorar prácticas avanzadas como la integración de animaciones con Tailwind o la creación de plugins personalizados en Astro. Estos desafíos te permitirán llevar tus proyectos al siguiente nivel.

tailwind astro

Comparte el post y ayúdanos

También te puede interesar