CSS3: El Arte de Estilizar la Web 🎨

Domina el lenguaje que convierte HTML simple en experiencias visuales extraordinarias.

1. ¿Qué es CSS3? 🎯

Cascading Style Sheets
Cascading (Cascada): Los estilos se aplican en cascada. Las reglas más específicas o posteriores anulan a las más generales o anteriores. La herencia también juega un papel importante.
Style (Estilo): Define la apariencia visual de los elementos HTML: colores, fuentes, espaciado, layout, etc.
Sheets (Hojas): Los estilos se escriben en "hojas de estilo" (archivos .css o bloques <style>), separando la presentación del contenido (HTML).
CSS3 vs CSS2
Nuevas características y mejoras modulares:
Selectores avanzados: Mayor precisión para seleccionar elementos.
Esquinas redondeadas (border-radius): Facilidad para crear bordes curvos.
Sombras (box-shadow, text-shadow): Efectos de profundidad para cajas y texto.
Gradientes (linear-gradient, radial-gradient): Fondos con transiciones de color.
Transformaciones 2D/3D (transform): Rotar, escalar, inclinar y mover elementos.
Animaciones (@keyframes, animation): Crear secuencias de movimiento complejas.
Transiciones (transition): Suavizar cambios de estado en propiedades.
Flexbox (Flexible Box Layout): Módulo para layouts unidimensionales robustos.
Grid Layout: Módulo para layouts bidimensionales complejos.
Fuentes personalizadas (@font-face): Usar cualquier fuente en la web.
Múltiples fondos: Aplicar varias imágenes de fondo a un elemento.
Media Queries: Clave para el diseño responsivo, adaptando estilos al dispositivo.
Conexión con Python (Web Frameworks)
🐍 Flask/Django y otros frameworks:
Templates HTML + CSS: Los frameworks Python sirven HTML que enlaza a archivos CSS (o incluye CSS interno/en línea) para estilizar las vistas generadas.
Archivos estáticos: CSS, JavaScript e imágenes se gestionan como archivos estáticos, servidos eficientemente.
Diseño Responsivo para Datos: Aplicar CSS para que las tablas, gráficos y visualizaciones de datos generadas por Python se vean bien en todos los dispositivos.
Dashboards Profesionales: Crear interfaces de usuario atractivas y funcionales para aplicaciones de análisis de datos, machine learning, etc.

2. Formas de Aplicar CSS 📝

🎯 1. Estilos en Línea (Inline Styles)

Se aplican directamente en el atributo style del elemento HTML. Tienen la máxima especificidad y anulan estilos de hojas internas o externas, a menos que estos usen !important.

<!-- Ejemplo de estilos en línea -->
<h1 style="color: #e74c3c; font-size: 2em; text-align: center;">
    Mi Título con Estilo en Línea
</h1>

<div style="background: linear-gradient(45deg, #3498db, #2ecc71); 
           padding: 20px; border-radius: 10px; color: white;">
    Contenido con múltiples estilos en línea.
</div>

Cuándo usar estilos en línea:

🎯 2. Estilos Internos (Internal Styles)

Se definen dentro de la etiqueta <style>, usualmente colocada en la sección <head> del documento HTML. Afectan solo a la página donde se declaran.

<head>
    <!-- Otros elementos del head como meta tags, title, etc. -->
    <style>
        /* Estilos para toda la página actual */
        body {
            font-family: 'Arial', sans-serif;
            background: linear-gradient(135deg, #667eea, #764ba2);
            color: white; /* Asegurar contraste para el fondo oscuro */
            margin: 0;
            padding: 20px;
        }
        
        .tarjeta-interna { /* Clase específica para esta página */
            background: white;
            color: #333; /* Color de texto para la tarjeta */
            border-radius: 12px;
            padding: 25px;
            box-shadow: 0 5px 20px rgba(0,0,0,0.1);
            margin-top: 20px;
        }
        
        .tarjeta-interna:hover {
            transform: translateY(-5px);
            transition: all 0.3s ease; /* Transición suave al pasar el ratón */
        }
    </style>
</head>

<!-- En el body, se usaría la clase .tarjeta-interna -->
<body>
  <div class="tarjeta-interna">Contenido de la tarjeta con estilo interno.</div>
</body>

Cuándo usar estilos internos:

🎯 3. Estilos Externos (External Styles)

Los estilos se guardan en archivos .css separados (ej: styles.css) y se vinculan al documento HTML usando la etiqueta <link> en el <head>. Es la forma más recomendada y profesional para la mayoría de los proyectos web.

<!-- En el archivo HTML (ej: index.html) -->
<head>
    <!-- Otros elementos del head -->
    <link rel="stylesheet" type="text/css" href="styles.css">
    <!-- El atributo type="text/css" es opcional en HTML5 -->
</head>

/* En el archivo CSS (ej: styles.css) */
/* :root se usa para definir variables CSS globales (custom properties) */
:root {
    --color-primario: #3498db; /* Azul */
    --color-secundario: #2ecc71; /* Verde */
    --fuente-principal: 'Inter', sans-serif;
    --espaciado-base: 1rem; /* 16px por defecto */
}

body {
    font-family: var(--fuente-principal);
    margin: 0;
    background-color: #f0f2f5;
}

.contenedor-principal {
    max-width: 1200px;
    margin: 0 auto; /* Centra el contenedor */
    padding: calc(var(--espaciado-base) * 2); /* Usa la variable para padding */
    background-color: white;
}

.boton-primario {
    background-color: var(--color-primario);
    color: white;
    padding: var(--espaciado-base) calc(var(--espaciado-base) * 1.5);
    border: none;
    border-radius: 5px;
    cursor: pointer;
}

.boton-primario:hover {
    background-color: darken(var(--color-primario), 10%); /* Nota: darken() no es CSS estándar, se usaría un preprocesador o un valor directo */
    /* Alternativa directa: background-color: #2980b9; */
}

Ventajas de los estilos externos:

3. El Box Model: Entendiendo las Cajas 📦

Cada elemento HTML en una página web se representa como una "caja" rectangular. El Box Model de CSS describe cómo se dimensionan y se relacionan estas cajas. Consta de cuatro capas principales: contenido, padding, borde y margen. Entender esto es fundamental para el diseño y layout web.

CONTENT
El contenido real del elemento
(texto, imágenes, videos, etc.)
margin
Ej: 10px | 10px 20px | 10px 15px 20px 25px
Margen: Es el espacio exterior transparente que rodea al borde. Separa el elemento de otros elementos adyacentes. No tiene color de fondo. Orden de valores (si se especifican múltiples): arriba, derecha, abajo, izquierda (sentido horario). margin: auto; en un bloque con ancho definido puede centrarlo horizontalmente.
border
Ej: 2px solid #3498db | 1px dashed black
Borde: Es la línea visible que rodea al padding (y por ende, al contenido). Se define con grosor (border-width), estilo (border-style: solid, dashed, dotted, double, groove, ridge, inset, outset) y color (border-color). La propiedad abreviada border combina estos tres.
padding
Ej: 20px | 10px 5px | 5px 10px 15px 20px
Relleno (Padding): Es el espacio interno transparente entre el contenido del elemento y su borde. El padding toma el color de fondo del elemento. Aumenta el área visual y clickeable del elemento sin afectar la posición de otros elementos (solo "empuja" el contenido hacia adentro). Orden de valores: igual que el margen.
width / height
Ej: 300px | 50% | auto
Ancho y Alto (Content): Estas propiedades definen las dimensiones del área de contenido del elemento. Por defecto (box-sizing: content-box), el padding y el borde se añaden *fuera* de estas dimensiones, incrementando el tamaño total de la caja. Con box-sizing: border-box;, el padding y el borde se incluyen *dentro* del width/height especificado.

🎯 Ejemplo Práctico: Box Model Completo y box-sizing

.caja-completa {
    /* Dimensiones del contenido por defecto (si box-sizing: content-box) */
    width: 300px;
    height: 150px;
    
    /* Padding (espacio interno) */
    padding: 20px;                    /* 20px en todos los lados */
    /* Alternativas de padding: */
    /* padding: 10px 20px; */              /* 10px arriba/abajo, 20px izquierda/derecha */
    /* padding: 10px 15px 20px 25px; */   /* Arriba | Derecha | Abajo | Izquierda */
    
    /* Border (borde) */
    border: 5px solid #e74c3c; /* Borde rojo sólido de 5px */
    border-radius: 12px;             /* Esquinas redondeadas */
    
    /* Margin (espacio exterior) */
    margin: 25px auto;              /* 25px arriba/abajo, centrado horizontalmente */
    
    /* Box-sizing: Controla cómo se calcula el tamaño total del elemento.
       'border-box' es altamente recomendado para un manejo más intuitivo de las dimensiones. */
    box-sizing: border-box;        /* Con border-box, el width (300px) y height (150px) 
                                   INCLUYEN el padding y el border. 
                                   El área de contenido real será:
                                   width: 300px - (2*20px padding) - (2*5px border) = 250px
                                   height: 150px - (2*20px padding) - (2*5px border) = 100px */
    
    /* Extras visuales para la demo */
    background: linear-gradient(135deg, #3498db, #2ecc71); /* Fondo degradado */
    color: white; /* Color de texto */
    text-align: center; /* Alineación del texto */
    box-shadow: 0 10px 30px rgba(0,0,0,0.2); /* Sombra */
}

/* Uso común al inicio de un CSS para aplicar border-box a todo: */
/*
html {
  box-sizing: border-box;
}
*, *::before, *::after {
  box-sizing: inherit;
}
*/

4. Selectores CSS: Apuntando a los Elementos 🎯

Los selectores CSS son patrones que "seleccionan" los elementos HTML a los que se aplicarán los estilos. Dominarlos es clave para un CSS eficiente y preciso.

📝 Selectores Básicos

Selector de Elemento (o Tipo)
/* Selecciona todos los elementos <h1> */
h1 {
    color: #e74c3c;
    font-size: 2.5em;
}
Selecciona TODOS los elementos HTML del tipo especificado (ej: p, div, a, img). Es el selector más general.
Selector de Clase
/* Selecciona todos los elementos con class="mi-clase" */
.mi-clase {
    background: #3498db;
    padding: 15px;
    color: white;
}
Selecciona elementos que tienen el atributo class con el valor especificado (prefijado con un punto .). Un elemento puede tener múltiples clases. Es el más usado para reutilizar estilos en varios elementos.
Selector de ID
/* Selecciona el elemento con id="mi-id-unico" */
#mi-id-unico {
    position: fixed; /* Posición fija en la pantalla */
    top: 0;
    left: 0;
    width: 100%;
    background-color: #333;
}
Selecciona UN ÚNICO elemento que tiene el atributo id con el valor especificado (prefijado con una almohadilla #). El ID debe ser único en toda la página. Tiene alta especificidad.
Selector Universal
/* Selecciona TODOS los elementos de la página */
* {
    box-sizing: border-box; /* Ejemplo de uso común */
    margin: 0; /* Resetear márgenes (con precaución) */
}
Selecciona todos los elementos en el documento. Se representa con un asterisco *. Usar con precaución ya que puede afectar el rendimiento si se abusa.
Selector de Atributo
/* Selecciona todos los <input> de tipo "text" */
input[type="text"] {
    border: 1px solid #ccc;
}
/* Selecciona enlaces que apuntan a "https.example.com" */
a[href="https.example.com"] {
    color: green;
}
Selecciona elementos basados en la presencia o valor de sus atributos. Ejemplos: [target], [type="submit"], [href^="https"] (comienza con), [class*="icono-"] (contiene).

🔗 Selectores Combinados (Combinadores)

div.especial p
Combinador Descendiente (espacio)
Selecciona todos los elementos <p> que son descendientes (hijos, nietos, etc.) de un elemento <div> que tiene la clase "especial".
ul > li
Combinador de Hijo Directo (>)
Selecciona todos los elementos <li> que son hijos directos (primer nivel) de un elemento <ul>. No selecciona nietos.
h2 + p
Combinador de Hermano Adyacente (+)
Selecciona el primer elemento <p> que aparece inmediatamente después de un elemento <h2> y comparte el mismo padre.
h2 ~ p
Combinador General de Hermanos (~)
Selecciona todos los elementos <p> que son hermanos de un elemento <h2> (aparecen después de él y comparten el mismo padre), no solo el adyacente.
article, section
Agrupación de Selectores (,)
Aplica los mismos estilos a múltiples selectores. Selecciona todos los elementos <article> Y todos los elementos <section>.

Pseudo-clases y Pseudo-elementos

Las pseudo-clases (:hover, :focus, :nth-child()) seleccionan elementos basados en un estado especial o posición. Los pseudo-elementos (::before, ::after, ::first-line) permiten estilizar partes específicas de un elemento o insertar contenido.

/* --- Pseudo-clases --- */

/* Estado interactivo: al pasar el ratón sobre un enlace */
a:hover {
    color: #e74c3c;
    text-decoration: underline;
}

/* Estado interactivo: cuando un botón está siendo presionado */
button:active {
    transform: scale(0.95); /* Efecto de "hundimiento" */
}

/* Estado interactivo: cuando un input tiene el foco */
input:focus {
    border-color: #3498db;
    box-shadow: 0 0 5px rgba(52, 152, 219, 0.5);
}

/* Pseudo-clase estructural: primer elemento 
  • de una lista */ ul li:first-child { font-weight: bold; color: green; } /* Pseudo-clase estructural: último elemento
  • de una lista */ ul li:last-child { font-style: italic; color: blue; } /* Pseudo-clase estructural: filas pares de una tabla (ej: para zebrado) */ tr:nth-child(even) { /* o 2n */ background-color: #f8f9fa; } tr:nth-child(odd) { /* o 2n+1 */ background-color: #e9ecef; } /* Pseudo-clase de negación: todos los inputs excepto los de tipo "submit" */ input:not([type="submit"]) { margin-bottom: 10px; } /* --- Pseudo-elementos --- */ /* Nota: La sintaxis moderna recomienda doble dos puntos (::) para pseudo-elementos, aunque ::before y ::after también funcionan con uno solo por retrocompatibilidad. */ /* Estiliza la primera línea de cada párrafo */ p::first-line { font-weight: bold; color: #2c3e50; } /* Estiliza la primera letra de cada párrafo */ p::first-letter { font-size: 2em; float: left; /* Para efecto capitular */ margin-right: 5px; } /* Inserta contenido ANTES del contenido del elemento .cita */ .cita::before { content: "“"; /* Comillas de apertura */ font-size: 1.5em; color: #95a5a6; margin-right: 0.2em; } /* Inserta contenido DESPUÉS del contenido del elemento .cita */ .cita::after { content: "”"; /* Comillas de cierre */ font-size: 1.5em; color: #95a5a6; margin-left: 0.2em; } /* Estiliza el marcador de los elementos de lista */ ul li::marker { color: var(--color-primario, #3498db); /* Usa variable CSS si está definida */ font-size: 1.2em; }
  • 5. Propiedades CSS Más Utilizadas ⚙️

    🎨 Texto y Tipografía

    font-family
    'Arial', 'Helvetica', sans-serif
    Define la familia de fuentes para el texto. Se especifican varias fuentes (font stack) separadas por comas como alternativas (fallbacks) en caso de que la primera no esté disponible. La última suele ser una fuente genérica (serif, sans-serif, monospace, cursive, fantasy).
    font-size
    16px | 1rem | 1.2em | 120% | medium
    Establece el tamaño del texto. Unidades comunes: px (píxeles, absoluto), rem (relativo al tamaño de fuente del elemento raíz <html>), em (relativo al tamaño de fuente del elemento padre o del propio elemento), % (porcentaje del tamaño de fuente del padre). También palabras clave como small, medium, large.
    font-weight
    normal | bold | 100-900
    Define el grosor (peso) del texto. Valores comunes: normal (equivale a 400), bold (equivale a 700). También se pueden usar valores numéricos de 100 a 900 (en incrementos de 100), si la fuente los soporta.
    line-height
    1.5 | 24px | 150% | normal
    Establece la altura de la línea de texto. Un valor sin unidad (ej: 1.5) se multiplica por el font-size actual del elemento para obtener la altura de línea. Mejora la legibilidad. normal es el valor por defecto del navegador.
    text-align
    left | center | right | justify | start | end
    Alineación horizontal del texto dentro de su contenedor (elemento de bloque o celda de tabla). justify distribuye el texto para que ocupe todo el ancho. start y end dependen de la dirección del texto (LTR o RTL).
    text-decoration
    none | underline | line-through | overline
    Añade o quita decoración al texto. Comúnmente usado con text-decoration: none; para quitar el subrayado de los enlaces (<a>). CSS3 permite más control con text-decoration-line, text-decoration-color, text-decoration-style.
    color
    #3498db | rgb(52,152,219) | blue | hsl(208,79%,55%)
    Establece el color del texto. Se puede definir con nombres de color (red), códigos hexadecimales (#FF0000), RGB (rgb(255,0,0)), RGBA (con transparencia, rgba(255,0,0,0.5)), HSL, HSLA.
    text-transform
    none | capitalize | uppercase | lowercase
    Controla la capitalización del texto. capitalize (primera letra de cada palabra en mayúscula), uppercase (todo en mayúsculas), lowercase (todo en minúsculas).

    🌈 Colores y Fondos

    background-color
    rgba(255, 255, 255, 0.8) | #f0f0f0 | transparent
    Establece el color de fondo sólido de un elemento. rgba permite definir un color con un canal alfa para transparencia (0 = totalmente transparente, 1 = totalmente opaco). transparent es un valor válido.
    background-image
    url('imagen.jpg') | linear-gradient(...)
    Establece una o más imágenes de fondo para un elemento. Puede ser una URL a una imagen (url()) o un gradiente generado por CSS (linear-gradient(), radial-gradient(), etc.).
    background-repeat
    repeat | no-repeat | repeat-x | repeat-y
    Controla si la imagen de fondo se repite y cómo. repeat (por defecto, repite en ambas direcciones), no-repeat (no se repite), repeat-x (repite horizontalmente), repeat-y (repite verticalmente).
    background-position
    center top | 50% 0% | 10px 20px
    Define la posición inicial de la imagen de fondo. Puede usar palabras clave (left, center, right, top, bottom), porcentajes o unidades de longitud.
    background-size
    auto | cover | contain | 100px 50px
    Especifica el tamaño de las imágenes de fondo. cover (escala la imagen para cubrir todo el contenedor, puede recortar partes), contain (escala la imagen para que quepa completamente dentro del contenedor, puede dejar espacios vacíos).
    background
    #fff url('bg.png') no-repeat center center / cover
    Propiedad abreviada (shorthand) para establecer múltiples propiedades de fondo a la vez (color, imagen, repetición, adjunto, posición, tamaño - este último con / antes). También para gradientes: linear-gradient(45deg, #ff6b6b, #4ecdc4).
    opacity
    0.5 | 1 | 0
    Define el nivel de opacidad de un elemento (y sus hijos). Un valor de 1 es completamente opaco (por defecto), 0 es completamente transparente (invisible), y 0.5 es 50% translúcido.

    🎯 Posicionamiento y Layout (Básico)

    display
    block | inline | inline-block | flex | grid | none
    Define cómo se comporta un elemento en el flujo del documento y cómo interactúa con otros. block (ocupa todo el ancho disponible, nueva línea), inline (ocupa solo el ancho necesario, en la misma línea), inline-block (como inline, pero permite width/height), flex y grid (para layouts modernos y complejos), none (oculta el elemento y lo saca del flujo).
    position
    static | relative | absolute | fixed | sticky
    Establece el método de posicionamiento de un elemento. static (por defecto, flujo normal), relative (desplazado relativo a su posición normal, crea contexto de apilamiento), absolute (posicionado relativo a su ancestro posicionado más cercano o al body), fixed (posicionado relativo a la ventana del navegador, no se mueve con el scroll), sticky (híbrido entre relative y fixed, "pega" cuando se alcanza cierto punto de scroll).
    top, right, bottom, left
    10px | 50% | auto | -5px
    Estas propiedades (offset properties) especifican el desplazamiento de un elemento posicionado (relative, absolute, fixed, sticky) desde los bordes de su bloque contenedor de referencia. No funcionan con position: static.
    z-index
    1 | 999 | -1 | auto
    Controla el orden de apilamiento (profundidad) de los elementos posicionados. Un elemento con un z-index mayor se muestra encima de uno con un z-index menor. Solo afecta a elementos con position distinto de static. auto es el valor por defecto.
    float
    left | right | none
    Históricamente usado para layouts (ej: imágenes flotando junto a texto). Hace que un elemento "flote" a la izquierda o derecha, permitiendo que otros contenidos fluyan a su alrededor. Para layouts complejos, Flexbox y Grid son preferibles hoy en día. Requiere manejo de clearfix.
    clear
    left | right | both | none
    Se usa para controlar el comportamiento de los elementos que siguen a elementos flotantes. clear: both; es común para asegurar que un elemento comience debajo de cualquier elemento flotante anterior.

    6. CSS3 en Google Colab: Ejemplos Prácticos 🚀

    En Google Colab (o Jupyter Notebooks), puedes usar la "celda mágica" %%html para renderizar HTML y CSS directamente. Esto es útil para crear visualizaciones de datos enriquecidas, dashboards simples o interfaces interactivas dentro de tu notebook. Los estilos CSS se pueden incluir en línea, internamente con <style>, o incluso enlazar a archivos externos si están alojados públicamente.

    🎯 Ejemplo 1: Dashboard de Métricas Sencillo con CSS3

    El siguiente código se puede pegar en una celda de Colab que comience con %%html.

    %%html
    <!-- Inicio del código para Colab -->
    <style>
        /* Estilos generales para el contenedor del dashboard */
        .dashboard-colab {
            max-width: 1000px; /* Ancho máximo del dashboard */
            margin: 20px auto; /* Centrado en la página del notebook */
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; /* Fuente legible */
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); /* Fondo degradado atractivo */
            border-radius: 15px; /* Bordes redondeados */
            padding: 0; /* Sin padding extra en el contenedor principal */
            overflow: hidden; /* Para que los bordes redondeados afecten al contenido */
            box-shadow: 0 15px 35px rgba(0,0,0,0.15); /* Sombra suave */
        }
        
        /* Estilos para el encabezado del dashboard */
        .dashboard-header-colab {
            background: rgba(255,255,255,0.1); /* Fondo semitransparente para el header */
            color: white; /* Texto blanco */
            padding: 25px; /* Espaciado interno */
            text-align: center; /* Texto centrado */
            border-bottom: 1px solid rgba(255,255,255,0.2); /* Línea divisoria sutil */
        }
        
        /* Grid para las tarjetas de métricas */
        .metrics-grid-colab {
            display: grid; /* Usar CSS Grid */
            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* Columnas responsivas */
            gap: 20px; /* Espacio entre tarjetas */
            padding: 25px; /* Espaciado alrededor del grid */
            background: white; /* Fondo blanco para el área de métricas */
        }
        
        /* Estilos para cada tarjeta de métrica */
        .metric-card-colab {
            color: white;
            padding: 25px;
            border-radius: 12px;
            text-align: center;
            transform: translateY(0); /* Estado inicial para la transición */
            transition: all 0.3s ease-in-out; /* Transición suave para hover */
            cursor: pointer; /* Cursor de mano para indicar interactividad */
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        }
        
        .metric-card-colab:hover {
            transform: translateY(-8px) scale(1.03); /* Elevar y escalar ligeramente al pasar el ratón */
            box-shadow: 0 12px 25px rgba(0,0,0,0.2); /* Sombra más pronunciada */
        }
        
        /* Colores de fondo específicos para cada tarjeta (usando :nth-child) */
        .metric-card-colab:nth-child(1) { background: linear-gradient(135deg, #667eea, #764ba2); } /* Púrpura */
        .metric-card-colab:nth-child(2) { background: linear-gradient(135deg, #f093fb, #f5576c); } /* Rosa/Rojo */
        .metric-card-colab:nth-child(3) { background: linear-gradient(135deg, #4facfe, #00f2fe); } /* Azul claro */
        .metric-card-colab:nth-child(4) { background: linear-gradient(135deg, #43e97b, #38f9d7); } /* Verde menta */
        
        /* Estilo para el valor numérico de la métrica */
        .metric-value-colab {
            font-size: 2.5em;
            font-weight: bold;
            margin-bottom: 10px;
            text-shadow: 1px 1px 3px rgba(0,0,0,0.2); /* Sombra de texto sutil */
        }
        
        /* Estilo para la etiqueta de la métrica */
        .metric-label-colab {
            font-size: 1em;
            opacity: 0.9; /* Ligera transparencia */
            text-transform: uppercase; /* Texto en mayúsculas */
            letter-spacing: 1px; /* Espaciado entre letras */
        }
        
        /* Media query para hacer el dashboard responsivo en pantallas pequeñas */
        @media (max-width: 600px) {
            .metrics-grid-colab {
                grid-template-columns: 1fr; /* Una columna en móviles */
                padding: 15px; /* Menos padding */
            }
            
            .metric-value-colab {
                font-size: 2em; /* Tamaño de fuente más pequeño para valores */
            }
            .dashboard-colab {
                 margin: 10px; /* Menor margen en móviles */
            }
        }
    </style>
    
    <!-- Estructura HTML del Dashboard -->
    <div class="dashboard-colab">
        <div class="dashboard-header-colab">
            <h2 style="margin: 0; font-size: 1.8em;">📊 Analytics Dashboard (Colab)</h2>
            <p style="margin: 10px 0 0; opacity: 0.9;">Métricas clave en tiempo real</p>
        </div>
        
        <div class="metrics-grid-colab">
            <!-- Tarjeta de Métrica 1 -->
            <div class="metric-card-colab">
                <div class="metric-value-colab">1,247</div>
                <div class="metric-label-colab">👥 Usuarios Activos</div>
            </div>
            
            <!-- Tarjeta de Métrica 2 -->
            <div class="metric-card-colab">
                <div class="metric-value-colab">$89,456</div>
                <div class="metric-label-colab">💰 Ingresos Totales</div>
            </div>
            
            <!-- Tarjeta de Métrica 3 -->
            <div class="metric-card-colab">
                <div class="metric-value-colab">94.2%</div>
                <div class="metric-label-colab">📈 Tasa de Conversión</div>
            </div>
            
            <!-- Tarjeta de Métrica 4 -->
            <div class="metric-card-colab">
                <div class="metric-value-colab">2.8s</div>
                <div class="metric-label-colab"> Tiempo de Carga</div>
            </div>
        </div>
    </div>
    <!-- Fin del código para Colab -->

    🎯 Ejemplo 2: Formulario Interactivo con Validación Visual (CSS)

    Este ejemplo muestra un formulario con estilos que reaccionan al foco y a clases de validación (.valid, .invalid). La lógica de validación real requeriría JavaScript, pero aquí nos centramos en el CSS.

    %%html
    <!-- Inicio del código para Colab -->
    <style>
        /* Contenedor principal del formulario */
        .form-container-colab {
            max-width: 500px;
            margin: 20px auto;
            background: white;
            border-radius: 16px;
            box-shadow: 0 15px 30px rgba(0,0,0,0.1);
            overflow: hidden; /* Para que el borde redondeado afecte al header */
            font-family: 'Arial', sans-serif;
        }
        
        /* Encabezado del formulario */
        .form-header-colab {
            background: linear-gradient(135deg, #667eea, #764ba2);
            color: white;
            padding: 25px 30px;
            text-align: center;
        }
         .form-header-colab h2 {
            margin: 0; 
            font-size: 1.8em;
        }
        .form-header-colab p {
            margin: 10px 0 0; 
            opacity: 0.9;
        }
        
        /* Cuerpo del formulario donde van los inputs */
        .form-body-colab {
            padding: 30px;
        }
        
        /* Grupo de cada label + input */
        .form-group-colab {
            margin-bottom: 25px;
            position: relative; /* Para posibles iconos de validación */
        }
        
        /* Etiqueta del campo */
        .form-label-colab {
            display: block; /* Ocupa todo el ancho */
            margin-bottom: 8px;
            font-weight: bold;
            color: #2c3e50; /* Color oscuro para la etiqueta */
        }
        
        /* Campo de entrada */
        .form-input-colab {
            width: 100%; /* Ocupa todo el ancho del .form-group */
            padding: 12px 16px;
            border: 2px solid #e0e0e0; /* Borde gris claro */
            border-radius: 8px;
            font-size: 16px;
            transition: all 0.3s ease; /* Transición suave para foco y validación */
            box-sizing: border-box; /* Importante para que el padding no aumente el ancho total */
        }
        
        .form-input-colab:focus {
            outline: none; /* Quitar el outline por defecto del navegador */
            border-color: #3498db; /* Borde azul al enfocar */
            box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2); /* Sombra exterior suave */
        }
        
        /* Estilos para campos válidos (se añadiría clase .valid con JS) */
        .form-input-colab.valid {
            border-color: #27ae60; /* Borde verde */
            background-color: rgba(39, 174, 96, 0.05); /* Fondo verde muy claro */
        }
        
        /* Estilos para campos inválidos (se añadiría clase .invalid con JS) */
        .form-input-colab.invalid {
            border-color: #e74c3c; /* Borde rojo */
            background-color: rgba(231, 76, 60, 0.05); /* Fondo rojo muy claro */
            animation: shakeInput 0.4s ease-in-out; /* Animación de "temblor" */
        }
        
        /* Animación para campos inválidos */
        @keyframes shakeInput {
            0%, 100% { transform: translateX(0); }
            25% { transform: translateX(-6px); }
            75% { transform: translateX(6px); }
        }
        
        /* Botón de envío del formulario */
        .form-button-colab {
            width: 100%;
            padding: 15px;
            background: linear-gradient(135deg, #667eea, #764ba2); /* Mismo gradiente que el header */
            color: white;
            border: none;
            border-radius: 8px;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            transition: all 0.3s ease;
            text-transform: uppercase;
            letter-spacing: 1px;
        }
        
        .form-button-colab:hover {
            transform: translateY(-3px); /* Elevar ligeramente */
            box-shadow: 0 8px 15px rgba(102, 126, 234, 0.3); /* Sombra más pronunciada */
        }
        
        .form-button-colab:active {
            transform: translateY(0); /* Volver a la posición original al hacer clic */
            box-shadow: 0 5px 10px rgba(102, 126, 234, 0.2);
        }
    </style>
    
    <!-- Estructura HTML del Formulario -->
    <div class="form-container-colab">
        <div class="form-header-colab">
            <h2>📝 Registro de Usuario (Colab)</h2>
            <p>Completa tus datos para unirte.</p>
        </div>
        
        <div class="form-body-colab">
            <!-- Campo Nombre -->
            <div class="form-group-colab">
                <label for="nombre" class="form-label-colab">Nombre Completo:</label>
                <input type="text" id="nombre" class="form-input-colab" placeholder="Ej: Ada Lovelace" required>
            </div>
            
            <!-- Campo Email -->
            <div class="form-group-colab">
                <label for="email" class="form-label-colab">Correo Electrónico:</label>
                <input type="email" id="email" class="form-input-colab invalid" placeholder="tu@email.com" required> <!-- Clase 'invalid' de ejemplo -->
            </div>
            
            <!-- Campo Contraseña -->
            <div class="form-group-colab">
                <label for="password" class="form-label-colab">Contraseña:</label>
                <input type="password" id="password" class="form-input-colab valid" placeholder="Mínimo 8 caracteres" required> <!-- Clase 'valid' de ejemplo -->
            </div>
            
            <!-- Botón de Envío -->
            <button type="submit" class="form-button-colab">Crear Cuenta</button>
        </div> <!-- Cierre de .form-body-colab -->
    </div> <!-- Cierre de .form-container-colab -->
    
    <!-- Script opcional para demostración de validación (requiere habilitar JS en Colab si es necesario) -->
    <script>
      // Este es un ejemplo muy básico, la validación real sería más robusta.
      const inputs = document.querySelectorAll('.form-input-colab');
      inputs.forEach(input => {
        input.addEventListener('blur', () => { // Al perder el foco
          if (input.checkValidity()) {
            input.classList.remove('invalid');
            input.classList.add('valid');
          } else {
            input.classList.remove('valid');
            input.classList.add('invalid');
          }
        });
      });
    </script>
    <!-- Fin del código para Colab -->