Stepper

El componente Stepper guía a los usuarios a través de un proceso dividido en pasos secuenciales, mostrando su progreso y permitiendo navegar entre etapas del flujo.

import React, { useState } from "react";
import { Box, Button, Stepper, Text } from "@nimbus-ds/components";

const labels = [
  "Información personal",
  "Dirección",
  "Método de pago",
  "Confirmación",
];

const Example: React.FC = () => {
  const [selected, setSelected] = useState(0);
  const [activeStep, setActiveStep] = useState(0);

  return (
    <Box display="flex" flexDirection="column" gap="3" minWidth="250px">
      <Text color="neutral-textHigh">Selected step: {selected + 1}</Text>
      <Stepper
        activeStep={activeStep}
        selectedStep={selected}
        onSelectStep={setSelected}
        justifyContent="flex-start"
      >
        {labels.map((label) => (
          <Stepper.Item key={label} label={label} />
        ))}
      </Stepper>
      <Box display="flex" gap="3">
        <Button
          onClick={() => {
            setActiveStep(activeStep - 1);
            setSelected(activeStep - 1);
          }}
          disabled={activeStep === 0}
        >
          Previous
        </Button>
        <Button
          appearance="primary"
          onClick={() => {
            setActiveStep(activeStep + 1);
            setSelected(activeStep + 1);
          }}
          disabled={activeStep === labels.length - 1}
        >
          Next
        </Button>
      </Box>
    </Box>
  );
};

export default Example;

El Stepper puede contener:

  • Asset
  • Text
  • Line

Este componente utiliza:

  • #text
  • #icon

El componente Stepper guía a los usuarios a través de un proceso dividido en pasos secuenciales, mostrando su progreso y permitiendo navegar entre etapas del flujo.

  • Guiar al usuario a través de un proceso estructurado en pasos secuenciales.
  • Ideal para flujos de configuración o onboarding donde el orden es relevante.
  • Reducir la carga cognitiva dividiendo tareas complejas. Presentar un paso a la vez hace que el proceso parezca más simple y abordable.
  • Permitir la navegación entre pasos. En flujos editables, el usuario puede volver a un paso anterior para revisar o corregir datos.
  • El flujo no requiere un orden secuencial claro. Si los pasos pueden completarse en cualquier orden o no dependen uno del otro.
  • Hay menos de tres pasos. No justifica el uso del stepper.
  • El usuario no puede interactuar con los pasos. Si no se puede avanzar ni retroceder manualmente y no hay retroalimentación visible.
  • Enfocar el flujo en la acción principal: Al iniciar un flujo con Stepper, asegúrate de colocar el foco en el primer campo relevante del paso activo para reducir fricción inicial.
  • Navegación fluida con teclado: Permitir avanzar y retroceder entre pasos mediante el uso de Tab, Shift+Tab y teclas direccionales.
  • Feedback instantáneo y visible: Muestra indicador de éxito cuando los pasos son completados.
  • Persistencia de contexto: El usuario puede modificar un paso previo sin completar el paso en curso, y posteriormente finalizarlo.
  • Minimizar pantallas de confirmación: Al completar un paso exitosamente, evita interrupciones y avanza de forma automática al siguiente paso.
  • Soporte completo para navegación por teclado: Asegurar que cada paso y control dentro del Stepper sea accesible mediante teclado (Tab/Shift+Tab y Enter).
  • Manejo correcto del foco: Al cambiar de paso, el foco debe moverse automáticamente al primer elemento interactivo del nuevo paso.
  • Mensajes y estados accesibles: Mostrar los estados (completo, actual, pendiente) mediante texto visible y atributos aria-current, aria-disabled y aria-label adecuados.
  • Áreas de tap adecuadas en mobile: Asegurar que los ítems tengan un área mínima de 44x44px, para garantizar una interacción precisa.
  • Desktop
  • Mobile
  • Current: Paso donde el usuario está actualmente. No interactivo.
  • Completed: Paso que el usuario ya finalizó. Puede ser clickeable para volver a editar.
    • Rest
    • Hovered
    • Focused
    • Pressed
  • Started: Paso donde el usuario ya ingresó, pero aún no completó. Interacción posible.
    • Rest
    • Hovered
    • Focused
    • Pressed
  • Pending: Paso que aún no fue iniciado por el usuario. No interactivo.

Do

  • Utilizar el Stepper para dividir un proceso en pasos secuenciales claros y con lógica progresiva.
  • Mantener una cantidad entre 3 y 5 pasos para garantizar claridad y foco.
  • Escribir labels breves y orientados a la acción para cada paso.
  • En desktop, utilizar el Stepper con el contenedor Card.Stepper, ocupando el ancho total del contenedor.
  • En mobile, utilizar el Stepper sin contenedor, ocupando el ancho total de la pantalla.
  • En mobile, solo mostrar el label correspondiente al paso actual.

Don't

  • No usar el componente si el flujo tiene menos de 3 pasos o no implica progresión clara.
  • No usar si el usuario no puede editar los pasos.
  • No exceder los 5 pasos visibles.
  • Text - Para mostrar el contenido de cada paso.
  • Icon - Para indicadores visuales de estado.

Instalá el componente via terminal.

npm install @nimbus-ds/stepper

Additional props are passed to the <Stepper> element. See div docs for a list of props accepted by the <Stepper> element.

Stepper

NameTypeDefaultDescription

activeStep*

number

The currently active step (0-based index). Steps before this will be marked as completed.

children*

React.ReactNode

The content of the stepper (StepperItem components). Total steps will be calculated automatically based on the number of children.

selectedStep*

number

The currently selected step (0-based index). This step will be visually highlighted to show user selection.

onSelectStep*

object

Callback called when a step is selected. Receives the step number (0-based index) as parameter.

Stepper.Item

NameTypeDefaultDescription

step*

number

The step number (0-based index) for this item. This is automatically assigned by the parent Stepper component.

label

string

The label text to display for this step

Stepper.Card

NameTypeDefaultDescription

children*

React.ReactNode

The content to be rendered inside the card container