12: Conoce Tailwind CSS y úsalo para iniciar con tu portafolio
12: Conoce Tailwind CSS y úsalo para iniciar con tu portafolio
Introducción
En este tutorial exploraremos Tailwind CSS, el framework de estilos que forma parte de nuestro stack Bolt. Aprenderemos qué es, cómo funciona y comenzaremos a aplicarlo directamente en nuestro portafolio para crear una interfaz atractiva y profesional.
¿Qué es Tailwind CSS?
Tailwind CSS es un framework de CSS "utility-first" que proporciona clases de bajo nivel para construir diseños personalizados sin tener que escribir CSS tradicional. En lugar de crear clases personalizadas, combinas clases utilitarias directamente en tu HTML.
Características principales:
Utility-first: Cada clase hace una sola cosa (ej:
bg-blue-500para fondo azul)Responsive: Clases para diferentes tamaños de pantalla (
sm:,md:,lg:)Personalizable: Configuración centralizada en
tailwind.config.jsOptimizado: Purga automática de CSS no utilizado en producción
Modo oscuro: Soporte nativo con la clase
dark:
Nota: Actualmente Tailwind está en la versión 3, que es la que utilizaremos durante el curso. La versión 4 vendrá en el futuro, pero los conceptos fundamentales se mantendrán.
Paso 1: Explorar la documentación
La documentación oficial de Tailwind CSS es excelente y tiene un buscador que te permite encontrar rápidamente cualquier clase que necesites.
Clases que vamos a usar frecuentemente:
Distribución con Flexbox
<!-- Distribución horizontal -->
<div class="flex flex-row">
<!-- Elementos en fila -->
</div>
<!-- Distribución vertical -->
<div class="flex flex-col">
<!-- Elementos en columna -->
</div>
<!-- Espaciado entre elementos -->
<div class="flex justify-between">
<!-- Espacio entre elementos -->
</div>
<div class="flex justify-center">
<!-- Elementos centrados -->
</div>
<div class="flex items-center">
<!-- Alineación vertical centrada -->
</div>
<!-- Wrap de elementos -->
<div class="flex flex-wrap">
<!-- Elementos envueltos -->
</div>Espaciado (Margen y Padding)
<!-- Margen -->
<div class="m-4"> <!-- margen: 1rem -->
<div class="mx-4"> <!-- margen horizontal -->
<div class="my-4"> <!-- margen vertical -->
<div class="mt-4"> <!-- margen superior -->
<div class="mb-4"> <!-- margen inferior -->
<div class="ml-4"> <!-- margen izquierdo -->
<div class="mr-4"> <!-- margen derecho -->
<!-- Padding (mismo sistema) -->
<div class="p-4"> <!-- padding: 1rem -->
<div class="px-4"> <!-- padding horizontal -->
<div class="py-4"> <!-- padding vertical -->Valores comunes:
0: 01: 0.25rem (4px)2: 0.5rem (8px)3: 0.75rem (12px)4: 1rem (16px)5: 1.25rem (20px)6: 1.5rem (24px)8: 2rem (32px)10: 2.5rem (40px)12: 3rem (48px)16: 4rem (64px)
Colores
<!-- Color de texto -->
<p class="text-red-500">Texto rojo</p>
<p class="text-blue-600">Texto azul</p>
<p class="text-gray-700">Texto gris</p>
<p class="text-white">Texto blanco</p>
<!-- Color de fondo -->
<div class="bg-indigo-500">Fondo índigo</div>
<div class="bg-green-200">Fondo verde claro</div>
<div class="bg-gray-900">Fondo gris oscuro</div>
<!-- Color de borde -->
<div class="border border-red-400">Borde rojo</div>Tipografía
<!-- Tamaños de texto -->
<p class="text-xs">Texto extra pequeño</p>
<p class="text-sm">Texto pequeño</p>
<p class="text-base">Texto base</p>
<p class="text-lg">Texto grande</p>
<p class="text-xl">Texto extra grande</p>
<p class="text-2xl">Texto 2x grande</p>
<p class="text-3xl">Texto 3x grande</p>
<p class="text-4xl">Texto 4x grande</p>
<!-- Pesos de fuente -->
<p class="font-light">Fuente ligera</p>
<p class="font-normal">Fuente normal</p>
<p class="font-medium">Fuente media</p>
<p class="font-bold">Fuente negrita</p>
<!-- Transformaciones -->
<p class="uppercase">TEXTO MAYÚSCULAS</p>
<p class="lowercase">texto minúsculas</p>
<p class="capitalize">texto con mayúscula inicial</p>Tamaños y dimensiones
<!-- Altura -->
<div class="h-screen"> <!-- 100% de la pantalla -->
<div class="h-64"> <!-- 16rem -->
<div class="h-full"> <!-- 100% del contenedor -->
<!-- Ancho -->
<div class="w-full"> <!-- 100% del contenedor -->
<div class="w-1/2"> <!-- 50% -->
<div class="w-2/3"> <!-- 66.66% -->
<div class="max-w-7xl"> <!-- Ancho máximo -->Paso 2: Configurar nuestro proyecto
Asegúrate de que los comandos de compilación estén ejecutándose:
Terminal 1: Servidor de Laravel
php artisan serveTerminal 2: Compilador de assets (modo watch)
npm run watchImportante: Ambos comandos deben ejecutarse en terminales separadas para que los cambios se vean reflejados automáticamente.
Paso 3: Construir la página de bienvenida
Vamos a crear una página de inicio para nuestro portafolio usando Tailwind CSS. Abre resources/js/Pages/Welcome.vue y personalízala:
<template>
<div>
<!-- Header -->
<header class="bg-gray-800 h-screen px-72 py-16 flex flex-wrap content-between border-b border-gray-600 pb-36">
<div class="w-full">
<h1 class="border-b-2 border-gray-400 font-bold text-2xl uppercase text-gray-300 pb-3">
Hola, soy Juan
</h1>
<p class="text-xl text-gray-400 mt-4">
Soy un Software Engineer y me encantaría trabajar contigo
</p>
</div>
</header>
<!-- Sección de Skills -->
<section class="bg-gray-200 text-gray-800 h-screen px-72 py-16">
<h2 class="text-4xl font-bold mt-8">
Skills
</h2>
<!-- Aquí irán las habilidades -->
</section>
<!-- Sección de Proyectos -->
<section class="bg-gray-600 text-gray-100 h-screen px-72 py-16">
<h2 class="text-4xl font-bold mt-8">
Proyectos
</h2>
<!-- Aquí irán los proyectos -->
</section>
<!-- Footer -->
<footer class="bg-gray-800 text-gray-300 text-xl px-72 py-10 flex justify-between">
<p>
© 2024 Juan. Todos los derechos reservados.
</p>
<ul class="flex gap-6 justify-center items-center">
<li>
<a href="#" class="hover:text-white">GitHub</a>
</li>
<li>
<a href="#" class="hover:text-white">Twitter</a>
</li>
<li>
<a href="#" class="hover:text-white">Stack Overflow</a>
</li>
</ul>
</footer>
</div>
</template>Paso 4: Explicación de las clases utilizadas
Header
<header class="bg-gray-800 h-screen px-72 py-16 flex flex-wrap content-between border-b border-gray-600 pb-36">| Clase | Propósito |
|---|---|
bg-gray-800 | Fondo gris oscuro |
h-screen | Altura del 100% de la pantalla |
px-72 | Padding horizontal de 18rem |
py-16 | Padding vertical de 4rem |
flex | Activar Flexbox |
flex-wrap | Permitir envoltura de elementos |
content-between | Distribuir contenido entre arriba y abajo |
border-b | Borde inferior |
border-gray-600 | Borde gris |
pb-36 | Padding inferior de 9rem |
Título
<h1 class="border-b-2 border-gray-400 font-bold text-2xl uppercase text-gray-300 pb-3">| Clase | Propósito |
|---|---|
border-b-2 | Borde inferior de 2px |
border-gray-400 | Color del borde |
font-bold | Texto en negrita |
text-2xl | Tamaño de texto 1.5rem |
uppercase | Texto en mayúsculas |
text-gray-300 | Color gris claro |
pb-3 | Padding inferior de 0.75rem |
Secciones
<section class="bg-gray-200 text-gray-800 h-screen px-72 py-16">| Clase | Propósito |
|---|---|
bg-gray-200 | Fondo gris claro |
text-gray-800 | Texto gris oscuro (contraste) |
h-screen | Altura de pantalla completa |
Footer
<footer class="bg-gray-800 text-gray-300 text-xl px-72 py-10 flex justify-between">| Clase | Propósito |
|---|---|
flex | Flexbox |
justify-between | Espaciado entre elementos |
text-xl | Texto grande |
px-72 | Padding horizontal consistente |
Paso 5: Agregar habilidades desde la base de datos
Vamos a traer las habilidades desde la base de datos. Primero, actualiza el controlador:
app/Http/Controllers/SkillController.php:
<?php
namespace App\Http\Controllers;
use App\Models\Skill;
use Illuminate\Http\Request;
use Inertia\Inertia;
class SkillController extends Controller
{
public function index()
{
$skills = Skill::orderBy('order')->get();
return Inertia::render('Skills/Index', [
'skills' => $skills
]);
}
}Luego, en routes/web.php, agrega la ruta y modifica la página de bienvenida para incluir los datos.
Paso 6: Crear componentes reutilizables
Crea componentes Vue para los elementos que se repiten:
Componente Card (resources/js/Components/Card.vue)
<template>
<div class="bg-white rounded-lg shadow-lg p-6 hover:shadow-xl transition-shadow duration-300">
<slot />
</div>
</template>Componente Button (resources/js/Components/Button.vue)
<template>
<button
class="px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 transition-colors duration-200 font-medium"
@click="$emit('click')"
>
<slot />
</button>
</template>
<script setup>
defineEmits(['click']);
</script>Paso 7: Personalizar el archivo de configuración
El archivo tailwind.config.js permite personalizar colores, tamaños y más:
export default {
content: [
'./resources/**/*.blade.php',
'./resources/**/*.vue',
'./resources/**/*.js',
],
theme: {
extend: {
colors: {
primary: '#4F46E5',
secondary: '#7C3AED',
accent: '#EC4899',
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
plugins: [],
}Paso 8: Agregar estilos personalizados (opcional)
Si necesitas estilos personalizados, puedes agregarlos en resources/css/app.css:
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Estilos personalizados */
@layer components {
.btn-primary {
@apply px-6 py-3 bg-primary text-white rounded-lg hover:bg-primary/90 transition-colors;
}
.card {
@apply bg-white rounded-xl shadow-md p-6 hover:shadow-lg transition-shadow;
}
}Paso 9: Hacer la página responsiva
Tailwind facilita el diseño responsivo con prefijos:
<!-- Móvil: columna, Tablet: fila, Desktop: fila con wrap -->
<div class="flex flex-col md:flex-row lg:flex-wrap">
<!-- Padding responsive -->
<div class="px-4 sm:px-8 md:px-16 lg:px-24 xl:px-32">
<!-- Tamaño de texto responsive -->
<h1 class="text-2xl sm:text-3xl md:text-4xl lg:text-5xl">Solución de problemas comunes
Los estilos no se actualizan
# Detén el proceso watch y vuelve a ejecutarlo
npm run watchError de compilación
# Limpia la caché y reinstala
rm -rf node_modules package-lock.json
npm install
npm run devLas clases no están disponibles
Asegúrate de que el archivo content en tailwind.config.js incluya todas las rutas donde usas clases:
content: [
'./resources/**/*.vue',
'./resources/**/*.js',
'./resources/**/*.blade.php',
],Resumen
✅ Aprendimos qué es Tailwind CSS y sus conceptos fundamentales
✅ Exploramos las clases más comunes (Flexbox, espaciado, colores, tipografía)
✅ Configuramos el entorno de compilación
✅ Construimos una página de bienvenida con Tailwind
✅ Creamos componentes reutilizables
✅ Agregamos estilos personalizados
✅ Hicimos el diseño responsivo
¡Excelente trabajo! Ahora tienes las bases para estilizar todo tu portafolio con Tailwind CSS. En las próximas clases exploraremos más funcionalidades y comenzaremos a integrar datos reales desde la base de datos.
Recursos adicionales
¿Tienes preguntas sobre el uso de Tailwind? Recuerda que la documentación oficial y el buscador de clases son tus mejores aliados para encontrar la clase que necesitas
Comentarios
Publicar un comentario