TechLead
Lección 7 de 9
5 min de lectura
Tailwind CSS

Personalización y Configuración

Extiende y personaliza el tema por defecto de Tailwind con colores, fuentes, espaciado y más.

Personalizando Tailwind CSS

Tailwind es altamente personalizable mediante su archivo de configuración. Puedes extender el tema por defecto, añadir utilidades personalizadas o reemplazar los valores por defecto.

Estructura del Archivo de Configuración

// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    './src/**/*.{js,jsx,ts,tsx,html}',
  ],
  theme: {
    // Reemplazar los valores por defecto
    colors: {
      // Reemplaza todos los colores por defecto
    },
    extend: {
      // Extender valores por defecto (recomendado)
      colors: {
        // Agrega a los colores por defecto
      },
    },
  },
  plugins: [],
}

Colores Personalizados

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        // Color único
        'brand': '#ff6b6b',

        // Paleta de color
        'brand': {
          50: '#fef2f2',
          100: '#fee2e2',
          200: '#fecaca',
          300: '#fca5a5',
          400: '#f87171',
          500: '#ef4444',
          600: '#dc2626',
          700: '#b91c1c',
          800: '#991b1b',
          900: '#7f1d1d',
          950: '#450a0a',
        },

        // Usando variables CSS
        'primary': 'var(--color-primary)',
        'secondary': 'var(--color-secondary)',
      },
    },
  },
}

Usa colores personalizados:

<div class="bg-brand-500 text-brand-50">Elemento con color de marca</div>
<button class="bg-brand hover:bg-brand-600">Botón de marca</button>

Fuentes Personalizadas

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      fontFamily: {
        'sans': ['Inter', 'system-ui', 'sans-serif'],
        'serif': ['Merriweather', 'Georgia', 'serif'],
        'mono': ['Fira Code', 'monospace'],
        'display': ['Poppins', 'sans-serif'],
        'body': ['Open Sans', 'sans-serif'],
      },
    },
  },
}
<h1 class="font-display text-4xl">Display Font</h1>
<p class="font-body">Body text con Open Sans</p>
<code class="font-mono">Código monoespaciado</code>

Espaciado Personalizado

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      spacing: {
        '128': '32rem',
        '144': '36rem',
        '4.5': '1.125rem',
        'page': '1200px',
      },
    },
  },
}
<div class="w-128 p-4.5">Espaciado personalizado</div>
<div class="max-w-page mx-auto">Contenedor con ancho de página</div>

Breakpoints Personalizados

// tailwind.config.js
module.exports = {
  theme: {
    screens: {
      'xs': '475px',
      'sm': '640px',
      'md': '768px',
      'lg': '1024px',
      'xl': '1280px',
      '2xl': '1536px',
      '3xl': '1920px',
      // Breakpoints max-width
      'max-md': { 'max': '767px' },
      // Rango
      'tablet': { 'min': '640px', 'max': '1023px' },
    },
  },
}

Radio de Borde Personalizado

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      borderRadius: {
        '4xl': '2rem',
        '5xl': '2.5rem',
      },
    },
  },
}

Sombras Personalizadas

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      boxShadow: {
        'soft': '0 2px 15px -3px rgba(0, 0, 0, 0.07), 0 10px 20px -2px rgba(0, 0, 0, 0.04)',
        'inner-lg': 'inset 0 2px 4px 0 rgb(0 0 0 / 0.1)',
        'brand': '0 4px 14px 0 rgba(239, 68, 68, 0.39)',
      },
    },
  },
}

Animaciones Personalizadas

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      animation: {
        'fade-in': 'fadeIn 0.5s ease-in-out',
        'slide-up': 'slideUp 0.3s ease-out',
        'bounce-slow': 'bounce 2s infinite',
        'spin-slow': 'spin 3s linear infinite',
      },
      keyframes: {
        fadeIn: {
          '0%': { opacity: '0' },
          '100%': { opacity: '1' },
        },
        slideUp: {
          '0%': { transform: 'translateY(10px)', opacity: '0' },
          '100%': { transform: 'translateY(0)', opacity: '1' },
        },
      },
    },
  },
}
<div class="animate-fade-in">Fading in</div>
<div class="animate-slide-up">Sliding up</div>

Agregar Utilidades Personalizadas con Plugins

// tailwind.config.js
const plugin = require('tailwindcss/plugin');

module.exports = {
  plugins: [
    plugin(function({ addUtilities, addComponents, theme }) {
      // Agregar utilidades personalizadas
      addUtilities({
        '.text-shadow': {
          'text-shadow': '2px 2px 4px rgba(0, 0, 0, 0.1)',
        },
        '.text-shadow-lg': {
          'text-shadow': '4px 4px 8px rgba(0, 0, 0, 0.2)',
        },
        '.scrollbar-hide': {
          '-ms-overflow-style': 'none',
          'scrollbar-width': 'none',
          '&::-webkit-scrollbar': {
            display: 'none',
          },
        },
      });

      // Agregar componentes personalizados
      addComponents({
        '.btn': {
          padding: theme('spacing.4') + ' ' + theme('spacing.6'),
          borderRadius: theme('borderRadius.lg'),
          fontWeight: theme('fontWeight.semibold'),
        },
        '.card': {
          backgroundColor: theme('colors.white'),
          borderRadius: theme('borderRadius.xl'),
          padding: theme('spacing.6'),
          boxShadow: theme('boxShadow.lg'),
        },
      });
    }),
  ],
}

Usando Variables CSS

/* globals.css */
:root {
  --color-primary: 59 130 246; /* blue-500 RGB */
  --color-secondary: 168 85 247; /* purple-500 RGB */
}

.dark {
  --color-primary: 96 165 250; /* blue-400 RGB */
  --color-secondary: 192 132 252; /* purple-400 RGB */
}
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: 'rgb(var(--color-primary) / <alpha-value>)',
        secondary: 'rgb(var(--color-secondary) / <alpha-value>)',
      },
    },
  },
}
<div class="bg-primary text-white">Usa variable CSS</div>
<div class="bg-primary/50">¡La opacidad al 50% también funciona!</div>

Continuar Aprendiendo