04 Capítulo 4 · Proyecto Final

Proyecto Final de Interactions

Redactado por
Author Sebastian V.
Fecha de publicación

08/08/2025

Tiempo de lectura

10 min

Tema

Interactions

El arte de la orquestación UI

¡Felicidades! Has llegado al final del Capítulo 4. A lo largo de estas lecciones, no solo has aprendido a mover cosas en la pantalla, sino a darles sentido, peso y contexto. Has dejado de diseñar pantallas estáticas para empezar a diseñar flujos interactivos.

1. Botones con retroalimentación completa

El botón "Guardar" que vas a ver combina estados de hover (elevación), active (presión física), loading (asumiendo la asincronía) y success (informando al usuario que todo salió bien). Todo en un mismo componente sin tener que bloquear toda la interfaz del usuario. Es el pilar de un formulario moderno.

2. Modales secuenciales

Un modal no es solo un div en el centro de la pantalla. En el proyecto 2, verás cómo la opacidad del fondo oscuro y la caja del modal tienen ritmos diferentes (delay). Esto guía el ojo del usuario primero hacia el centro oscuro y luego le entrega el contenido con una animación de rebote amigable.

El verdadero secreto: la consistencia

El sello final de calidad en cualquier interfaz premium es que los botones se sientan parte del mismo universo físico que los modales. Si usas un cubic-bezier elástico en un lado, úsalo en el otro. Mantén los tiempos entre 150ms y 400ms para que las interacciones sean enérgicas pero perceptibles.

Consejo profesional

¡Has dominado el feedback visual! Estas microinteracciones son lo que diferencia a una aplicación web genérica de un producto digital premium amado por los usuarios.

Proyecto 1 — Botón con feedback completo

Un botón que reacciona físicamente, muestra estado de carga asíncrono y confirma el éxito sin necesidad de molestas alertas de navegador.

> _
<button class="btn-guardar" id="btnGuardar">
  <span class="btn-texto">Guardar Cambios</span>
  <span class="btn-cargando"></span>
  <svg class="btn-exito" viewBox="0 0 24 24" width="20" height="20">
    <path d="M20 6L9 17l-5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
  </svg>
</button>

<script>
  const btn = document.getElementById('btnGuardar');
  btn.addEventListener('click', () => {
    btn.classList.add('loading');
    setTimeout(() => {
      btn.classList.remove('loading');
      btn.classList.add('success');
      setTimeout(() => btn.classList.remove('success'), 2000);
    }, 2000);
  });
</script>
> _

Haz clic en el botón. Observa cómo asume el estado de carga y termina con una palomita de éxito.

Proyecto 2 — Modal con Delay

Un overlay que desenfoca la página y una caja que aparece con retraso secuencial para no abrumar la vista del usuario.

> _
<button class="abrir-modal" id="abrirModal">Ver Detalles</button>

<div class="modal-overlay" id="modalOverlay">
  <div class="modal-caja">
    <h5 style="margin-top:0; margin-bottom:4px; font-weight:700; text-align:center;">Detalles del Componente</h5>
    <span style="font-weight:300; font-family:'afronaut',serif; text-align:center; display:block;">
      Este modal se anima de forma independiente al overlay para dar una sensación física real.
    </span>
    <div class="modal-actions" style="display:flex; flex-direction:row; justify-content:flex-end; gap:12px; margin-top:24px;">
      <button class="cerrar-modal" id="cerrarModal"
        style="padding:10px 20px; border-radius:0; background:transparent; border:1px dashed #444; color:#444; font-family:'afronaut',serif;">
        Cancelar
      </button>
      <button class="aceptar-modal"
        style="padding:10px 20px; border-radius:0; background:hsla(158,23%,18%,1); color:hsla(160,52%,71%,1); font-family:'afronaut',serif;">
        Aceptar
      </button>
    </div>
  </div>
</div>

<script>
  const abrir = document.getElementById('abrirModal');
  const cerrar = document.getElementById('cerrarModal');
  const aceptar = document.querySelector('.aceptar-modal');
  const overlay = document.getElementById('modalOverlay');

  abrir.addEventListener('click', () => overlay.classList.add('visible'));
  cerrar.addEventListener('click', () => overlay.classList.remove('visible'));
  aceptar.addEventListener('click', () => overlay.classList.remove('visible'));
  overlay.addEventListener('click', (e) => {
    if(e.target === overlay) overlay.classList.remove('visible');
  });
</script>
> _

Haz clic en 'Ver Detalles'. Fíjate cómo la caja llega ligeramente después de oscurecerse el fondo.

Desafío final

Combina ambos proyectos: pon el botón de guardar dentro del modal. Al hacer clic, que cargue, marque éxito y entonces cierre el modal.

01 Integra el botón interactivo dentro de la caja del modal
02 Añade el estado de "Focus" al botón para mejorar accesibilidad
03 Modifica la curva del modal de rebote a ease-in-out
04 Supera el desafío final haciendo que el modal se cierre automáticamente tras el éxito

Lo que aprendiste en este capítulo

01
Interactions Interfaces vivas que responden a la acción del usuario
02
Microinteracciones Pequeñas respuestas (likes, botones) que generan deleite
03
Estados de Interfaz Default, hover, active, focus y disabled correctamente diseñados
04
Loading States Loaders integrados que evitan bloquear toda la pantalla
05
Success/Error Feedback Toasts o botones que cierran el ciclo asíncrono con color
06
Cards interactivas Profundidad con hover combinado (scale de imagen + elevate)
07
Modales & Overlays Apariciones secuenciales con transition-delay para suavidad
08
Dropdowns & Tooltips El uso de transform-origin para una revelación orgánica
09
Sistemas consistentes Motion Tokens (Variables CSS) para estandarizar las curvas
10
Performance en UI Animar solo Transforms y Opacity para llegar a los 60 FPS