Product Craft Bible
Step Indicators
Inicio Componentes UI Step Indicators
Componentes UI

Step Indicators

8 reglas Material Design 3 Stepper · Apple HIG page controls · Ant Design Steps · Shopify Polaris stepper · Baymard checkout progress 2023Material Design 3 Stepper states · Ant Design Steps status · Shopify Polaris step states · USWDS Step Indicator · Baymard checkout step states 2023ARIA APG Stepper pattern · aria-current values spec · WCAG 1.3.1 Info and Relationships · USWDS Step Indicator a11y · W3C WAI multi-page formsBaymard Institute checkout navigation 2023 · Shopify Checkout stepper · NNg wizard navigation 2022 · Material Design 3 Stepper clickable · Stripe Payment Element
14

Step Indicators

8 reglas
146

Horizontal 3-5 pasos desktop; "Paso X de Y" mobile con 5+; dots solo ≤5

El stepper horizontal con nodos y labels funciona en desktop para 3-5 pasos porque hay suficiente espacio horizontal para mostrar el estado de cada paso y su label sin truncar. En mobile con 5 o más pasos, los nodos se comprimen hasta ser ilegibles en 375px y los labels desaparecen; un contador textual "Paso 2 de 6" más una barra segmentada comunican la misma información orientacional con cero riesgo de desbordamiento. Los dots (sin labels) solo son apropiados para ≤5 pasos y onboarding ultra-linear donde el usuario no necesita saber el nombre de cada paso. Usar la estrategia incorrecta para el contexto es uno de los antipatrones más frecuentes en formularios multi-paso.

Material Design 3 Stepper · Apple HIG page controls · Ant Design Steps · Shopify Polaris stepper · Baymard checkout progress 2023
Preferir
Desktop, Stepper horizontal (4 pasos)
Datos
2
Envío
3
Pago
4
Confirmar
Mobile, 6 pasos: contador + barra segmentada
Paso 2 de 6
33% completado
Información de envío
147

5 estados visuales: completed, active, upcoming, error, optional

Un stepper con solo 2 estados (completado/pendiente) no puede comunicar errores en pasos ya visitados ni distinguir pasos opcionales de obligatorios. Los 5 estados cubren la totalidad de escenarios reales: completed (checkmark verde, paso exitoso), active (anillo de acento con glow, paso actual), upcoming (border y número en gris, contraste reducido pero visible), error (rojo con "!" SVG, reemplaza el número por completo) y optional (border dashed, con badge "Opcional" lateral). Mezclar completed y optional visualmente genera confusión sobre si el usuario puede saltarse el paso sin consecuencias. El estado error exige atención inmediata y debe ser el más visualmente prominente de los 5.

Material Design 3 Stepper states · Ant Design Steps status · Shopify Polaris step states · USWDS Step Indicator · Baymard checkout step states 2023
Preferir
Completed
2
Active
3
Upcoming
Error
5
Optional
Opcional
148

aria-current="step" en el li activo; sr-only con estado en cada nodo; nav+ol

WAI-ARIA 1.2 define el token "step" específicamente para el paso actual en una secuencia de pasos; usar aria-current="true" o "page" comunica semántica incorrecta al AT. Cada nodo necesita un span con clase sr-only que verbalice el estado completo ("Completado: Datos personales", "Actual: Seleccionar plan") porque el estado se transmite visualmente por color pero el AT no puede inferirlo. Envolver la lista en un nav con aria-label y usar ol (no ul) comunica la naturaleza secuencial y el número total de ítems al lector de pantalla, lo que permite anunciar "1 de 4" automáticamente en algunos navegadores.

ARIA APG Stepper pattern · aria-current values spec · WCAG 1.3.1 Info and Relationships · USWDS Step Indicator a11y · W3C WAI multi-page forms
Preferir
<!-- Wrapper: nav comunica propósito, ol comunica secuencia --> <nav aria-label="Progreso del formulario"> <ol class="stepper"> <!-- Step completado --> <li class="step completed"> <span class="sr-only">Completado: </span> Datos personales </li> <!-- Step activo, aria-current="step" es el token correcto --> <li class="step active" aria-current="step"> <span class="sr-only">Actual: </span> Información de envío </li> <!-- Steps pendientes --> <li class="step upcoming"> <span class="sr-only">Pendiente: </span> Pago </li> <li class="step upcoming"> <span class="sr-only">Pendiente: </span> Confirmar </li> </ol> </nav>
149

Steps completados clickeables en forms; no en checkout con dependencias

En formularios de onboarding y configuración, los pasos completados deben ser navegables porque los datos de cada paso son independientes y el usuario puede querer corregir un dato sin perder progreso. Hacer los pasos clickeables en este contexto aumenta la sensación de control. En checkout, los pasos tienen dependencias de datos (el método de envío elegido en el paso 1 afecta los costos calculados en el paso 3) y la navegación libre puede producir estados inconsistentes o totales incorrectos. La solución en checkout es un botón "Atrás" explícito y siempre visible que gestiona las dependencias de forma controlada, sin convertir los indicadores en links.

Baymard Institute checkout navigation 2023 · Shopify Checkout stepper · NNg wizard navigation 2022 · Material Design 3 Stepper clickable · Stripe Payment Element
Preferir
Onboarding form Clickeables
Perfil Editar
Equipo Editar
3
Integraciones
4
Notificaciones
Checkout No clickeables
Envío
2
Pago
3
Confirmar
Volver a Envío
150

Barra proporcional al esfuerzo real; partes iguales generan desconfianza

Una barra de progreso dividida en segmentos de igual anchura para pasos de duración desigual engaña al usuario: el primer paso de 30 segundos llena el 25% de la barra igual que el paso de 4 minutos que viene después. El resultado es que el avance se detiene inesperadamente, generando el "90% completado forever" que los usuarios asocian con instaladores de software rotos. Asignar anchuras proporcionales al esfuerzo real (número de campos, tiempo estimado) produce un avance visual que coincide con la experiencia del usuario y mantiene su confianza durante todo el flujo.

NNg progress indicators 2022 · Baymard checkout progress UX 2023 · Foundey "uneven step length breaks trust" · Stripe Payment Element progress · iOS setup assistant
Preferir
Partes iguales (engañoso)
Cuenta
30 seg
Empresa
4 min
Integración
1 min
Confirmar
30 seg
El paso de 4 min ocupa el mismo espacio que el de 30 s. El usuario avanza 50% de la barra en 1 min y luego la barra "se congela" 4 minutos.
Proporcional al esfuerzo real
Cta.
30s
Empresa
4 min
Integ.
1 min
Conf.
30s
El ancho del segmento "Empresa" (58%) refleja que toma 4 min de un total de ~6 min. La barra avanza a la velocidad que el usuario experimenta.
151

Error en step: icono ! reemplaza número en el nodo; línea conectora en rojo

Cuando un paso contiene datos inválidos que impiden continuar, el nodo del step indicator debe mostrar un ícono SVG "!" que reemplaza completamente el número o checkmark; mantener el número junto al estado rojo mezcla dos semánticas y reduce la claridad. El color de la línea conectora saliente del nodo en error también debe reflejar el estado (rojo o rojo translúcido) para comunicar que la ruta de progreso está interrumpida. Adicionalmente, el label debajo del nodo en error debe cambiar al color de error, y el sistema debe guiar al usuario directamente al primer paso con error cuando intente continuar.

Material Design 3 Stepper error state · Ant Design Steps error · Shopify Polaris step error · USWDS Step Indicator error · Baymard form error UX 2023
Preferir
Checkout 2 de 4 pasos
Datos
Dirección
3
Pago
4
Confirmar
El paso "Dirección" tiene errores
El código postal no es válido y la colonia es requerida. Corrígelos antes de confirmar el pedido.
Ir a Dirección
152

Al cambiar de step: mover foco al heading del step entrante

Sin gestión explícita del foco, al avanzar al siguiente paso el foco permanece en el botón "Siguiente" del paso anterior (que puede haber desaparecido del DOM) o salta al inicio del documento. El usuario de teclado no tiene señal de que el contenido cambió y queda desorientado. La solución es mover el foco programáticamente al heading h2 del nuevo paso usando tabindex="-1" (hace el elemento focuseable sin incluirlo en el tab order natural) y llamar a .focus() al montarse. El AT anuncia el heading completo, el usuario sabe en qué paso está, y desde ahí Tab lleva secuencialmente a los campos del formulario.

ARIA APG multi-step form focus · WCAG 2.4.3 Focus Order · WebAIM wizard focus management · W3C WAI Multi-page Forms tutorial · Deque multi-step form audit
Preferir
1
Usuario presiona "Siguiente"
Focus ring visible en el botón. Submit valida el paso actual.
Sig.
2
Nuevo step monta en el DOM
El h2 del paso entrante tiene tabindex="-1" y un ref de React/Vue.
3
Focus se mueve al heading
headingRef.current.focus() en useEffect / onMounted
h2
4
AT anuncia el contexto completo
"Paso 2: Seleccionar plan, encabezado nivel 2" → Tab lleva al primer input del paso.
153

Antipatrones: 1 campo por paso, dots con 6+, pesos iguales en duración desigual

Tres antipatrones son especialmente frecuentes en step indicators de producción. Primero, la fragmentación extrema (1 campo por paso): multiplica los pasos sin reducir la carga cognitiva, añade 5 o más oportunidades de abandono y hace que el flujo se sienta burocrático. Segundo, dots sin labels con 6 o más pasos: el usuario tiene que contar los puntos para orientarse y no puede saber qué contiene cada paso ni cuánto falta. Tercero, barra con segmentos de igual tamaño para pasos de duración muy distinta: el avance visual contradice el esfuerzo percibido y genera desconfianza, el mismo síntoma del "instalador atascado al 90%".

Baymard multi-step form 2023 · NNg wizard design 2022 · Material Design 3 Stepper · Foundey "avoid stepper with single form field" · Hotjar form abandonment data
Evitar
Antipatrón 1: Un campo por paso (fragmentación extrema)
3
4
5
6
Paso 3 de 6
6 pasos, 1 campo cada uno. El mismo form cabe en 1 pantalla con 3 grupos. Cada paso es una oportunidad de abandono.
Antipatrón 2: Dots con 8 pasos, sin labels
¿En cuál paso estoy? ¿Cuánto falta?
?
8 dots sin labels. El usuario no sabe en qué paso está ni qué nombre tiene. Con 6+ usar "Paso X de Y" con el nombre del paso actual.
Antipatrón 3: Segmentos iguales con duraciones radicalmente distintas
Email
30s
Empresa
4 min
Integ.
2 min
Pago
1 min
La barra llena 25% en 30 segundos y luego parece congelarse 4 minutos. Los durations en rojo revelan el engaño: los segmentos no reflejan el esfuerzo real.