> ## Documentation Index
> Fetch the complete documentation index at: https://www.beeq.design/llms.txt
> Use this file to discover all available pages before exploring further.

# Steps

> Steps display a series of stages in a process so users can understand progress, current status, and what comes next.

export const CodeLivePreview = ({code, children, height, removePadding = false, mode = 'shadow'}) => {
  const previewRef = useRef(null);
  const BEEQ_ESM_URL = 'https://esm.sh/@beeq/core/dist/beeq/beeq.esm.js';
  const BEEQ_CSS_URL = 'https://esm.sh/@beeq/core/dist/beeq/beeq.css';
  const BEEQ_ICONS_URL = 'https://esm.sh/@beeq/core/dist/beeq/svg';
  const ensureParentBeeqRuntime = () => {
    if (document.querySelector('script[data-beeq-parent-runtime]')) return;
    const script = document.createElement('script');
    script.type = 'module';
    script.src = BEEQ_ESM_URL;
    script.dataset.beeqParentRuntime = BEEQ_ICONS_URL;
    document.head.appendChild(script);
  };
  const executeSnippetScripts = (root, runtimeWindow, previewRootArg, skipAttr) => {
    root.querySelectorAll('script').forEach(oldScript => {
      if (skipAttr && oldScript.hasAttribute(skipAttr)) return;
      if (oldScript.src) {
        const newScript = runtimeWindow.document.createElement('script');
        newScript.src = oldScript.src;
        oldScript.replaceWith(newScript);
        return;
      }
      runtimeWindow.Function('previewRoot', oldScript.textContent || '')(previewRootArg);
      oldScript.remove();
    });
  };
  const syncIframeMode = iframeDoc => {
    const root = document.documentElement;
    const explicitMode = root.getAttribute('bq-mode');
    const isDark = root.classList.contains('dark');
    const resolvedMode = explicitMode || (isDark ? 'dark' : 'light');
    iframeDoc.documentElement.setAttribute('bq-mode', resolvedMode);
    iframeDoc.body.setAttribute('bq-mode', resolvedMode);
  };
  useEffect(() => {
    if (mode === 'shadow') ensureParentBeeqRuntime();
  }, [mode]);
  useEffect(() => {
    const container = previewRef.current;
    if (!container) return;
    if (removePadding) container.style.padding = '0';
    container.innerHTML = '';
    if (mode === 'iframe') {
      const iframe = document.createElement('iframe');
      iframe.className = 'preview-iframe';
      iframe.style.width = '100%';
      iframe.style.border = '0';
      iframe.style.display = 'block';
      iframe.style.minHeight = height ?? '0px';
      iframe.setAttribute('title', 'Live code preview');
      iframe.setAttribute('loading', 'lazy');
      iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');
      container.appendChild(iframe);
      const iframeDoc = iframe.contentDocument;
      const iframeWin = iframe.contentWindow;
      if (!iframeDoc || !iframeWin) return;
      iframeDoc.open();
      iframeDoc.write(['<!doctype html>', '<html>', '<head>', '  <meta charset="utf-8" />', '  <meta name="viewport" content="width=device-width, initial-scale=1" />', '  <style>html,body{margin:0;padding:0;min-height:100%;}</style>', `  <link rel="stylesheet" href="${BEEQ_CSS_URL}" />`, `  <script type="module" src="${BEEQ_ESM_URL}" data-beeq-iframe-runtime="${BEEQ_ICONS_URL}"></script>`, '</head>', '<body>', code, '</body>', '</html>'].join('\n'));
      iframeDoc.close();
      syncIframeMode(iframeDoc);
      const modeObserver = new MutationObserver(() => syncIframeMode(iframeDoc));
      modeObserver.observe(document.documentElement, {
        attributes: true,
        attributeFilter: ['class', 'bq-mode']
      });
      executeSnippetScripts(iframeDoc, iframeWin, iframeDoc, 'data-beeq-iframe-runtime');
      return () => modeObserver.disconnect();
    }
    const shadowRoot = container.shadowRoot ?? container.attachShadow({
      mode: 'open'
    });
    if (!shadowRoot.adoptedStyleSheets.length) {
      const fixSheet = new CSSStyleSheet();
      fixSheet.replaceSync(`
        bq-dropdown::part(panel),
        bq-panel::part(panel),
        bq-select::part(panel),
        bq-date-picker::part(panel) { z-index: 9999; }
        bq-tooltip::part(panel) { position: absolute; }
      `);
      shadowRoot.adoptedStyleSheets = [fixSheet];
    }
    shadowRoot.innerHTML = [`<link rel="stylesheet" href="${BEEQ_CSS_URL}">`, code].join('');
    executeSnippetScripts(shadowRoot, window, shadowRoot);
    return undefined;
  }, [code, mode, height]);
  return <div className="code-live-preview not-prose">
      {}
      <div className="preview" ref={previewRef} style={{
    minHeight: height
  }} />

      {}
      {children && <div className="code">{children}</div>}
    </div>;
};

export const CardTile = ({title, href, imageLightSrc, imageDarkSrc, children, enableImgZoom}) => {
  if (!href) {
    return <div className="card-tile block font-normal group relative my-2 ring-2 ring-transparent rounded-2xl overflow-hidden w-full">
        {imageLightSrc && <img className="w-full m-0 block dark:hidden" src={imageLightSrc} alt={title} {...enableImgZoom ? {
      zoom: true
    } : {
      noZoom: true
    }} />}
        {imageDarkSrc && <img className="w-full m-0 hidden dark:block" src={imageDarkSrc} alt={title} {...enableImgZoom ? {
      zoom: true
    } : {
      noZoom: true
    }} />}
        {title && <h2 className="mt-4 mb-2 px-6 text-base font-semibold">{title}</h2>}
        <div className="px-6 pb-5">{children}</div>
      </div>;
  }
  return <a href={href} className="card-tile block font-normal group relative my-2 ring-2 ring-transparent rounded-2xl overflow-hidden w-full cursor-pointer">
      {imageLightSrc && <img className="w-full m-0 block dark:hidden" src={imageLightSrc} alt={title} noZoom />}
      {imageDarkSrc && <img className="w-full m-0 hidden dark:block" src={imageDarkSrc} alt={title} noZoom />}
      {title && <h2 className="mt-4 mb-2 px-6 text-base font-semibold">{title}</h2>}
      <div className="px-6 pb-5">{children}</div>
    </a>;
};

<Frame className="px-4 py-4" caption="Steps component overview">
  <img className="block dark:hidden" src="https://mintlify.s3.us-west-1.amazonaws.com/beeq/components/images/steps/steps-overview-light.svg" alt="BEEQ Steps component overview" />

  <img className="hidden dark:block" src="https://mintlify.s3.us-west-1.amazonaws.com/beeq/components/images/steps/steps-overview-dark.svg" alt="BEEQ Steps component overview" />
</Frame>

Steps guide users through a sequential process such as a wizard, onboarding flow, or multistep form. Use them to show progress, the current step, completed steps, and steps that still need attention.

<Note>
  Use `bq-step-item` inside `bq-steps`. The parent component passes `type`, `orientation`, `size`, and divider settings down to each step item.
</Note>

## When to use

<CardGroup cols={2}>
  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="thumbs-up" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Use steps when
    </span>

    * Users need to complete a sequential, multistep process
    * The workflow has a clear order and progress state
    * Users benefit from seeing current, completed, remaining, or error states
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="thumbs-down" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Do not use steps when
    </span>

    * Users can complete tasks in any order
    * The process has only one or two simple actions
    * A status message or progress bar communicates the state more clearly
  </Card>
</CardGroup>

## Patterns

<CardGroup cols={2}>
  <Card title="Multistep forms">
    Split long forms into clear stages so users can see what is complete, where they are, and what remains.
  </Card>

  <Card title="Onboarding and wizards">
    Guide users through setup flows where each step depends on the previous one.
  </Card>

  <Card title="Process overviews">
    Summarize a task, service, or project flow when readers need the full sequence before they start.
  </Card>

  <Card title="Progress tracking">
    Show completed, current, upcoming, blocked, or disabled stages in a process that changes over time.
  </Card>
</CardGroup>

## Anatomy

<Frame className="px-4 py-4" caption="Steps component anatomy">
  <img className="block dark:hidden" src="https://mintlify.s3.us-west-1.amazonaws.com/beeq/components/images/steps/steps-anatomy-light.svg" alt="BEEQ Steps component anatomy" />

  <img className="hidden dark:block" src="https://mintlify.s3.us-west-1.amazonaws.com/beeq/components/images/steps/steps-anatomy-dark.svg" alt="BEEQ Steps component anatomy" />
</Frame>

Steps are composed of a label or prefix, title, optional description, and divider. Together they communicate position, meaning, and progress through the process.

| Part  | Element     | Description                                            |
| ----- | ----------- | ------------------------------------------------------ |
| **1** | Prefix      | Dot, number, or icon that visually identifies the step |
| **2** | Title       | Step label that describes the task or stage            |
| **3** | Description | Optional supporting text for more context              |
| **4** | Divider     | Connector that shows sequence between steps            |

## Design guidelines

<CardGroup cols={2}>
  <CardTile title="Choose one type" imageLightSrc="/components/images/steps/steps-type-light.svg" imageDarkSrc="/components/images/steps/steps-type-dark.svg">
    Use one steps type per page. Mixing dots, numbers, and icons in the same view makes the process harder to follow.
  </CardTile>

  <CardTile title="Show current status" imageLightSrc="/components/images/steps/steps-status-light.svg" imageDarkSrc="/components/images/steps/steps-status-dark.svg">
    Distinguish the current step from completed and remaining steps. Use status, text, and icon changes so color is not the only signal.
  </CardTile>

  <CardTile title="Keep flows manageable" imageLightSrc="/components/images/steps/steps-manageable-flow-light.svg" imageDarkSrc="/components/images/steps/steps-manageable-flow-dark.svg">
    Keep processes concise. Long forms are easier to complete when the step count stays focused and predictable.
  </CardTile>

  <CardTile title="Pick the right orientation" imageLightSrc="/components/images/steps/steps-orientation-light.svg" imageDarkSrc="/components/images/steps/steps-orientation-dark.svg">
    Use horizontal steps for left-to-right progression. Use vertical steps when horizontal space is limited or when descriptions need more room.
  </CardTile>
</CardGroup>

### Label and icon

Labels describe each step, while icons provide visual cues. Use meaningful titles and reserve icons for cases where the symbol helps users understand the action or context.

## Usage

Start with `bq-steps` and one `bq-step-item` for each stage. There are three types of steps: `numeric`, `dot`, and `icon`.

<Warning>
  You **must specify the type** you want to use on `bq-steps`. If you don't, the default styles will apply, but it may not match your content or design intent.
</Warning>

### Numeric

Start with the numeric type to show a clear sequence and position in the process. Each step should have a number prefix that matches its order.

<CodeLivePreview
  mode="iframe"
  height="15rem"
  removePadding
  code={`
<style>
body {
  padding: var(--bq-spacing-m);
}

/* Optional: Set a fixed width for numeric prefixes */
span[slot="prefix"] {
  min-inline-size: var(--bq-step-item--prefix-number-size, var(--bq-spacing-xl));
}
</style>
<bq-steps type="numeric">
<bq-step-item>
  <span aria-label="Step 1" slot="prefix">1</span>
  <span>Account</span>
  <span slot="description">Create your account</span>
</bq-step-item>
<bq-step-item>
  <span aria-label="Step 2" slot="prefix">2</span>
  <span>Profile</span>
  <span slot="description">Complete your profile details</span>
</bq-step-item>
<bq-step-item>
  <span aria-label="Step 3" slot="prefix">3</span>
  <span>Review and Submit</span>
  <span slot="description">Review your details and submit</span>
</bq-step-item>
</bq-steps>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-steps type="numeric">
      <bq-step-item>
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Account</span>
        <span slot="description">Create your account</span>
      </bq-step-item>
      <bq-step-item>
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Profile</span>
        <span slot="description">Complete your profile details</span>
      </bq-step-item>
      <bq-step-item>
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Review and Submit</span>
        <span slot="description">Review your details and submit</span>
      </bq-step-item>
    </bq-steps>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqStepItem, BqSteps } from "@beeq/react";

    <BqSteps type="numeric">
      <BqStepItem>
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Account</span>
        <span slot="description">Create your account</span>
      </BqStepItem>
      <BqStepItem>
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Profile</span>
        <span slot="description">Complete your profile details</span>
      </BqStepItem>
      <BqStepItem>
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Review and Submit</span>
        <span slot="description">Review your details and submit</span>
      </BqStepItem>
    </BqSteps>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqStepItem, BqSteps],
      template: `
        <bq-steps type="numeric">
          <bq-step-item>
            <span aria-label="Step 1" slot="prefix">1</span>
            <span>Account</span>
            <span slot="description">Create your account</span>
          </bq-step-item>
          <bq-step-item>
            <span aria-label="Step 2" slot="prefix">2</span>
            <span>Profile</span>
            <span slot="description">Complete your profile details</span>
          </bq-step-item>
          <bq-step-item>
            <span aria-label="Step 3" slot="prefix">3</span>
            <span>Review and Submit</span>
            <span slot="description">Review your details and submit</span>
          </bq-step-item>
        </bq-steps>
      `
    })
    export class NumericStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <bq-steps type="numeric">
        <bq-step-item>
          <span aria-label="Step 1" slot="prefix">1</span>
          <span>Account</span>
          <span slot="description">Create your account</span>
        </bq-step-item>
        <bq-step-item>
          <span aria-label="Step 2" slot="prefix">2</span>
          <span>Profile</span>
          <span slot="description">Complete your profile details</span>
        </bq-step-item>
        <bq-step-item>
          <span aria-label="Step 3" slot="prefix">3</span>
          <span>Review and Submit</span>
          <span slot="description">Review your details and submit</span>
        </bq-step-item>
      </bq-steps>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

### Dot

Use `type="dot"` for a minimal progress indicator when the sequence is clear and the step labels carry most of the meaning.

<CodeLivePreview
  mode="iframe"
  height="15rem"
  removePadding
  code={`
<style>
body {
  padding: var(--bq-spacing-m);
}
</style>
<bq-steps type="dot">
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
  <span>Plan</span>
  <span slot="description">Scope approved</span>
</bq-step-item>
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
  <span>Build</span>
  <span slot="description">Work in progress</span>
</bq-step-item>
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
  <span>Launch</span>
  <span slot="description">Ready next</span>
</bq-step-item>
</bq-steps>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-steps type="dot">
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
        <span>Plan</span>
        <span slot="description">Scope approved</span>
      </bq-step-item>
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
        <span>Build</span>
        <span slot="description">Work in progress</span>
      </bq-step-item>
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
        <span>Launch</span>
        <span slot="description">Ready next</span>
      </bq-step-item>
    </bq-steps>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/react";

    <BqSteps type="dot">
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="check-circle" />
        <span>Plan</span>
        <span slot="description">Scope approved</span>
      </BqStepItem>
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="circle" />
        <span>Build</span>
        <span slot="description">Work in progress</span>
      </BqStepItem>
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="circle" />
        <span>Launch</span>
        <span slot="description">Ready next</span>
      </BqStepItem>
    </BqSteps>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqIcon, BqStepItem, BqSteps],
      template: `
        <bq-steps type="dot">
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
            <span>Plan</span>
            <span slot="description">Scope approved</span>
          </bq-step-item>
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
            <span>Build</span>
            <span slot="description">Work in progress</span>
          </bq-step-item>
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="circle"></bq-icon>
            <span>Launch</span>
            <span slot="description">Ready next</span>
          </bq-step-item>
        </bq-steps>
      `
    })
    export class DotStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <BqSteps type="dot">
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="check-circle" />
          <span>Plan</span>
          <span slot="description">Scope approved</span>
        </BqStepItem>
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="circle" />
          <span>Build</span>
          <span slot="description">Work in progress</span>
        </BqStepItem>
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="circle" />
          <span>Launch</span>
          <span slot="description">Ready next</span>
        </BqStepItem>
      </BqSteps>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

### Icon

Use `type="icon"` when each step benefits from a recognizable symbol. Icons should support the label, not replace it.

<CodeLivePreview
  mode="iframe"
  height="15rem"
  removePadding
  code={`
<style>
body {
  padding: var(--bq-spacing-m);
}
</style>
<bq-steps type="icon">
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="user"></bq-icon>
  <span>Account</span>
  <span slot="description">Account created</span>
</bq-step-item>
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="gear"></bq-icon>
  <span>Settings</span>
  <span slot="description">Choose preferences</span>
</bq-step-item>
<bq-step-item>
  <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
  <span>Confirm</span>
  <span slot="description">Review and submit</span>
</bq-step-item>
</bq-steps>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-steps type="icon">
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="user"></bq-icon>
        <span>Account</span>
        <span slot="description">Account created</span>
      </bq-step-item>
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="gear"></bq-icon>
        <span>Settings</span>
        <span slot="description">Choose preferences</span>
      </bq-step-item>
      <bq-step-item>
        <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
        <span>Confirm</span>
        <span slot="description">Review and submit</span>
      </bq-step-item>
    </bq-steps>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/react";

    <BqSteps type="icon">
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="user" />
        <span>Account</span>
        <span slot="description">Account created</span>
      </BqStepItem>
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="gear" />
        <span>Settings</span>
        <span slot="description">Choose preferences</span>
      </BqStepItem>
      <BqStepItem>
        <BqIcon aria-hidden="true" slot="prefix" name="check-circle" />
        <span>Confirm</span>
        <span slot="description">Review and submit</span>
      </BqStepItem>
    </BqSteps>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqIcon, BqStepItem, BqSteps],
      template: `
        <bq-steps type="icon">
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="user"></bq-icon>
            <span>Account</span>
            <span slot="description">Account created</span>
          </bq-step-item>
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="gear"></bq-icon>
            <span>Settings</span>
            <span slot="description">Choose preferences</span>
          </bq-step-item>
          <bq-step-item>
            <bq-icon aria-hidden="true" slot="prefix" name="check-circle"></bq-icon>
            <span>Confirm</span>
            <span slot="description">Review and submit</span>
          </bq-step-item>
        </bq-steps>
      `
    })
    export class IconStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqIcon, BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <BqSteps type="icon">
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="user" />
          <span>Account</span>
          <span slot="description">Account created</span>
        </BqStepItem>
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="gear" />
          <span>Settings</span>
          <span slot="description">Choose preferences</span>
        </BqStepItem>
        <BqStepItem>
          <BqIcon aria-hidden="true" slot="prefix" name="check-circle" />
          <span>Confirm</span>
          <span slot="description">Review and submit</span>
        </BqStepItem>
      </BqSteps>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

## Status

Use the `status` attribute to show progress and guide users through the process.
The current step should be visually distinct from completed and remaining steps.

<Tip>
  The status should be applied to the `bq-step-item` element. This ensures that the entire step, including the label and description, reflects the current state.
</Tip>

| Status      | Description                                                                                                                                                              |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `default`   | The default state for steps that have not been reached yet. It should be visually distinct from current and completed steps.                                             |
| `current`   | The step the user is currently on. It should be visually highlighted to indicate focus.                                                                                  |
| `completed` | A step that has been finished. It should be visually distinct from the current and remaining steps.                                                                      |
| `disabled`  | A step that is not available for interaction, often because a previous step has not been completed. It should be visually subdued to indicate it cannot be accessed yet. |
| `error`     | A step that has an issue that needs attention. It should be visually distinct to indicate a problem.                                                                     |

<CodeLivePreview
  mode="iframe"
  height="10rem"
  removePadding
  code={`
<style>
body {
  padding: var(--bq-spacing-m);
}

span[slot="prefix"] {
  min-inline-size: var(--bq-step-item--prefix-number-size, var(--bq-spacing-xl));
}
</style>
<bq-steps type="numeric">
<bq-step-item status="completed">
  <span aria-label="Step 1" slot="prefix">1</span>
  <span>Completed</span>
  <span slot="description">Completed</span>
</bq-step-item>
<bq-step-item status="current">
  <span aria-label="Step 2" slot="prefix">2</span>
  <span>Current</span>
  <span slot="description">Current step</span>
</bq-step-item>
<bq-step-item status="error">
  <span aria-label="Step 3" slot="prefix">3</span>
  <span>Error</span>
  <span slot="description">You need to address an issue</span>
</bq-step-item>
<bq-step-item status="disabled">
  <span aria-label="Step 4" slot="prefix">4</span>
  <span>Disabled</span>
  <span slot="description">Complete previous steps first</span>
</bq-step-item>
</bq-steps>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-steps type="numeric">
      <bq-step-item status="completed">
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Completed</span>
        <span slot="description">Completed</span>
      </bq-step-item>
      <bq-step-item status="current">
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Current</span>
        <span slot="description">Current step</span>
      </bq-step-item>
      <bq-step-item status="error">
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Error</span>
        <span slot="description">You need to address an issue</span>
      </bq-step-item>
      <bq-step-item status="disabled">
        <span aria-label="Step 4" slot="prefix">4</span>
        <span>Disabled</span>
        <span slot="description">Complete previous steps first</span>
      </bq-step-item>
    </bq-steps>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqStepItem, BqSteps } from "@beeq/react";

    <BqSteps type="numeric">
      <BqStepItem status="completed">
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Completed</span>
        <span slot="description">Completed</span>
      </BqStepItem>
      <BqStepItem status="current">
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Current</span>
        <span slot="description">Current step</span>
      </BqStepItem>
      <BqStepItem status="error">
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Error</span>
        <span slot="description">You need to address an issue</span>
      </BqStepItem>
      <BqStepItem status="disabled">
        <span aria-label="Step 4" slot="prefix">4</span>
        <span>Disabled</span>
        <span slot="description">Complete previous steps first</span>
      </BqStepItem>
    </BqSteps>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqStepItem, BqSteps],
      template: `
        <bq-steps type="numeric">
          <bq-step-item status="completed">
            <span aria-label="Step 1" slot="prefix">1</span>
            <span>Completed</span>
            <span slot="description">Completed</span>
          </bq-step-item>
          <bq-step-item status="current">
            <span aria-label="Step 2" slot="prefix">2</span>
            <span>Current</span>
            <span slot="description">Current step</span>
          </bq-step-item>
          <bq-step-item status="error">
            <span aria-label="Step 3" slot="prefix">3</span>
            <span>Error</span>
            <span slot="description">You need to address an issue</span>
          </bq-step-item>
          <bq-step-item status="disabled">
            <span aria-label="Step 4" slot="prefix">4</span>
            <span>Disabled</span>
            <span slot="description">Complete previous steps first</span>
          </bq-step-item>
        </bq-steps>
      `
    })
    export class StatusStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <BqSteps type="numeric">
        <BqStepItem status="completed">
          <span aria-label="Step 1" slot="prefix">1</span>
          <span>Completed</span>
          <span slot="description">Completed</span>
        </BqStepItem>
        <BqStepItem status="current">
          <span aria-label="Step 2" slot="prefix">2</span>
          <span>Current</span>
          <span slot="description">Current step</span>
        </BqStepItem>
        <BqStepItem status="error">
          <span aria-label="Step 3" slot="prefix">3</span>
          <span>Error</span>
          <span slot="description">You need to address an issue</span>
        </BqStepItem>
        <BqStepItem status="disabled">
          <span aria-label="Step 4" slot="prefix">4</span>
          <span>Disabled</span>
          <span slot="description">Complete previous steps first</span>
        </BqStepItem>
      </BqSteps>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

## Options

### Orientation

Use `orientation="vertical"` when the process should unfold from top to bottom or when labels and descriptions need more room.

<CodeLivePreview
  mode="iframe"
  height="20rem"
  removePadding
  code={`
<style>
body {
  display: flex;
  padding: var(--bq-spacing-m);
}

.container {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}

span[slot="prefix"] {
  min-inline-size: var(--bq-step-item--prefix-number-size, var(--bq-spacing-xl));
}
</style>

<div class="container">
<bq-steps orientation="vertical" type="numeric">
  <bq-step-item status="completed">
    <span aria-label="Step 1" slot="prefix">1</span>
    <span>Request</span>
  </bq-step-item>
  <bq-step-item status="current">
    <span aria-label="Step 2" slot="prefix">2</span>
    <span>Review</span>
  </bq-step-item>
  <bq-step-item>
    <span aria-label="Step 3" slot="prefix">3</span>
    <span>Decision</span>
  </bq-step-item>
</bq-steps>
</div>
`}
>
  <CodeGroup>
    ```css styles.css icon="css" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    body {
      display: flex;
      padding: var(--bq-spacing-m);
    }

    .container {
      display: flex;
      flex-direction: column;
      flex-grow: 1;
    }
    ```

    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <div class="container">
      <bq-steps orientation="vertical" type="numeric">
        <bq-step-item status="completed">
          <span aria-label="Step 1" slot="prefix">1</span>
          <span>Request</span>
        </bq-step-item>
        <bq-step-item status="current">
          <span aria-label="Step 2" slot="prefix">2</span>
          <span>Review</span>
        </bq-step-item>
        <bq-step-item>
          <span aria-label="Step 3" slot="prefix">3</span>
          <span>Decision</span>
        </bq-step-item>
      </bq-steps>
    </div>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqStepItem, BqSteps } from "@beeq/react";
    import "./styles.css";

    <div className="container">
      <BqSteps orientation="vertical" type="numeric">
        <BqStepItem status="completed">
          <span aria-label="Step 1" slot="prefix">1</span>
          <span>Request</span>
        </BqStepItem>
        <BqStepItem status="current">
          <span aria-label="Step 2" slot="prefix">2</span>
          <span>Review</span>
        </BqStepItem>
        <BqStepItem>
          <span aria-label="Step 3" slot="prefix">3</span>
          <span>Decision</span>
        </BqStepItem>
      </BqSteps>
    </div>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqStepItem, BqSteps],
      template: `
        <div class="container">
          <bq-steps orientation="vertical" type="numeric">
            <bq-step-item status="completed">
              <span aria-label="Step 1" slot="prefix">1</span>
              <span>Request</span>
            </bq-step-item>
            <bq-step-item status="current">
              <span aria-label="Step 2" slot="prefix">2</span>
              <span>Review</span>
            </bq-step-item>
            <bq-step-item>
              <span aria-label="Step 3" slot="prefix">3</span>
              <span>Decision</span>
            </bq-step-item>
          </bq-steps>
        </div>
      `,
      styles: [`
        body {
          display: flex;
          padding: var(--bq-spacing-m);
        }

        .container {
          display: flex;
          flex-direction: column;
          flex-grow: 1;
        }
      `],
    })
    export class VerticalStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <div class="container">
        <BqSteps orientation="vertical" type="numeric">
          <BqStepItem status="completed">
            <span aria-label="Step 1" slot="prefix">1</span>
            <span>Request</span>
          </BqStepItem>
          <BqStepItem status="current">
            <span aria-label="Step 2" slot="prefix">2</span>
            <span>Review</span>
          </BqStepItem>
          <BqStepItem>
            <span aria-label="Step 3" slot="prefix">3</span>
            <span>Decision</span>
          </BqStepItem>
        </BqSteps>
      </div>
    </template>

    <style>
      body {
        display: flex;
        padding: var(--bq-spacing-m);
      }

      .container {
        display: flex;
        flex-direction: column;
        flex-grow: 1;
      }
    </style>
    ```
  </CodeGroup>
</CodeLivePreview>

<Tip>
  Vertical steps adapt to the height of their container. You must ensure that the container holding the steps has enough block size to allow the divider to span the desired area.
</Tip>

### Size and divider color

Use `size="small"` in compact layouts. Use `divider-color` with a declarative color token when the connector needs a different emphasis.

<CodeLivePreview
  mode="iframe"
  height="10rem"
  removePadding
  code={`
<style>
body {
  padding: var(--bq-spacing-m);
}

span[slot="prefix"] {
  min-inline-size: var(--bq-spacing-l);
}
</style>
<bq-steps divider-color="stroke--brand" size="small" type="numeric">
<bq-step-item status="completed">
  <span aria-label="Step 1" slot="prefix">1</span>
  <span>Account</span>
  <span slot="description">Completed</span>
</bq-step-item>
<bq-step-item status="current">
  <span aria-label="Step 2" slot="prefix">2</span>
  <span>Preferences</span>
  <span slot="description">Current step</span>
</bq-step-item>
<bq-step-item>
  <span aria-label="Step 3" slot="prefix">3</span>
  <span>Finish</span>
  <span slot="description">Next step</span>
</bq-step-item>
</bq-steps>
`}
>
  <CodeGroup>
    ```html HTML icon="html5" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <bq-steps divider-color="stroke--brand" size="small" type="numeric">
      <bq-step-item status="completed">
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Account</span>
        <span slot="description">Completed</span>
      </bq-step-item>
      <bq-step-item status="current">
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Preferences</span>
        <span slot="description">Current step</span>
      </bq-step-item>
      <bq-step-item>
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Finish</span>
        <span slot="description">Next step</span>
      </bq-step-item>
    </bq-steps>
    ```

    ```jsx React icon="react" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { BqStepItem, BqSteps } from "@beeq/react";

    <BqSteps dividerColor="stroke--brand" size="small" type="numeric">
      <BqStepItem status="completed">
        <span aria-label="Step 1" slot="prefix">1</span>
        <span>Account</span>
        <span slot="description">Completed</span>
      </BqStepItem>
      <BqStepItem status="current">
        <span aria-label="Step 2" slot="prefix">2</span>
        <span>Preferences</span>
        <span slot="description">Current step</span>
      </BqStepItem>
      <BqStepItem>
        <span aria-label="Step 3" slot="prefix">3</span>
        <span>Finish</span>
        <span slot="description">Next step</span>
      </BqStepItem>
    </BqSteps>
    ```

    ```ts Angular icon="angular" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    import { Component } from "@angular/core";
    import { BqStepItem, BqSteps } from "@beeq/angular/standalone";

    @Component({
      standalone: true,
      imports: [BqStepItem, BqSteps],
      template: `
        <bq-steps divider-color="stroke--brand" size="small" type="numeric">
          <bq-step-item status="completed">
            <span aria-label="Step 1" slot="prefix">1</span>
            <span>Account</span>
            <span slot="description">Completed</span>
          </bq-step-item>
          <bq-step-item status="current">
            <span aria-label="Step 2" slot="prefix">2</span>
            <span>Preferences</span>
            <span slot="description">Current step</span>
          </bq-step-item>
          <bq-step-item>
            <span aria-label="Step 3" slot="prefix">3</span>
            <span>Finish</span>
            <span slot="description">Next step</span>
          </bq-step-item>
        </bq-steps>
      `
    })
    export class SmallStepsComponent {}
    ```

    ```vue Vue icon="vuejs" expandable theme={"theme":{"light":"one-light","dark":"night-owl"}}
    <script setup lang="ts">
    import { BqStepItem, BqSteps } from "@beeq/vue";
    </script>

    <template>
      <BqSteps dividerColor="stroke--brand" size="small" type="numeric">
        <BqStepItem status="completed">
          <span aria-label="Step 1" slot="prefix">1</span>
          <span>Account</span>
          <span slot="description">Completed</span>
        </BqStepItem>
        <BqStepItem status="current">
          <span aria-label="Step 2" slot="prefix">2</span>
          <span>Preferences</span>
          <span slot="description">Current step</span>
        </BqStepItem>
        <BqStepItem>
          <span aria-label="Step 3" slot="prefix">3</span>
          <span>Finish</span>
          <span slot="description">Next step</span>
        </BqStepItem>
      </BqSteps>
    </template>
    ```
  </CodeGroup>
</CodeLivePreview>

## Best practices

<CardGroup cols={2}>
  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Use one steps component per page so the process stays clear and cohesive.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Avoid multiple steppers in the same view because they can compete for attention and disrupt the flow.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Write labels that describe the task or destination for each step.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Avoid labels that only repeat the status, such as current or completed.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Confirm progress with status, text, and icon changes after a step is completed.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Do not rely on color alone to communicate the state of a step.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="check" iconType="solid" size={20} color="var(--bq-stroke--success)" />

      Do
    </span>

    Keep the number of steps manageable so users feel the process is achievable.
  </Card>

  <Card>
    <span className="flex items-center mr-2 text-lg font-medium" role="heading">
      <Icon className="mr-2" icon="xmark" iconType="solid" size={20} color="var(--bq-stroke--danger)" />

      Don't
    </span>

    Avoid turning long or non-linear workflows into a single rigid step sequence.
  </Card>
</CardGroup>

## Accessibility

The `bq-steps` container renders with `role="list"`, and each `bq-step-item` renders with `role="listitem"` around an interactive button. The current step maps to `aria-current="step"`, and disabled items use the native `disabled` button state.

* **Keyboard** - users can move through step items with <kbd>Tab</kbd> and <kbd>Shift</kbd> + <kbd>Tab</kbd>. They can activate an enabled step with <kbd>Enter</kbd> or <kbd>Space</kbd>.
* **Current step** - set `status="current"` on one step item so assistive technology can announce the current position.
* **Status communication** - pair color with text, icon shape, or description changes so users do not need color perception to understand progress.
* **Icons and numbers** - mark decorative icons with `aria-hidden="true"`. When numeric prefixes are used, provide an `aria-label` such as `Step 1`.
* **Descriptions** - use the `description` slot when users need more context about a step, an error, or the expected next action.

## API reference

### Properties

#### `bq-steps`

| Property       | Attribute       | Description                                  | Type                               | Default             |
| -------------- | --------------- | -------------------------------------------- | ---------------------------------- | ------------------- |
| `dividerColor` | `divider-color` | Color token for the line that connects steps | `string`                           | `'stroke--primary'` |
| `orientation`  | `orientation`   | Direction of the steps                       | `'horizontal'` \| `'vertical'`     | `'horizontal'`      |
| `size`         | `size`          | Size of the steps                            | `'medium'` \| `'small'`            | `'medium'`          |
| `type`         | `type`          | Prefix type passed to step items             | `'numeric'` \| `'icon'` \| `'dot'` | `undefined`         |

#### `bq-step-item`

| Property       | Attribute       | Description                                                                    | Type                                                                     | Default             |
| -------------- | --------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------- |
| `dividerColor` | `divider-color` | Color token for the divider after this item; usually inherited from `bq-steps` | `string`                                                                 | `'stroke--primary'` |
| `orientation`  | `orientation`   | Direction of the item; usually inherited from `bq-steps`                       | `'horizontal'` \| `'vertical'`                                           | `'horizontal'`      |
| `size`         | `size`          | Prefix size; usually inherited from `bq-steps`                                 | `'medium'` \| `'small'`                                                  | `'medium'`          |
| `status`       | `status`        | Visual and semantic state of the item                                          | `'default'` \| `'current'` \| `'completed'` \| `'error'` \| `'disabled'` | `'default'`         |
| `type`         | `type`          | Prefix type; usually inherited from `bq-steps`                                 | `'numeric'` \| `'icon'` \| `'dot'`                                       | `undefined`         |

### Slots

#### `bq-steps`

| Slot        | Description |
| ----------- | ----------- |
| *(default)* | Step items  |

#### `bq-step-item`

| Slot          | Description                                 |
| ------------- | ------------------------------------------- |
| *(default)*   | Step item title content                     |
| `prefix`      | Dot, icon, or number shown before the title |
| `description` | Supporting text shown below the title       |

### Shadow parts

#### `bq-steps`

| Part                 | Description                              |
| -------------------- | ---------------------------------------- |
| `container`          | Container wrapper of the Steps component |
| `divider-base`       | Base wrapper of the divider component    |
| `divider-dash-start` | Start dash of the divider component      |
| `divider-dash-end`   | End dash of the divider component        |

#### `bq-step-item`

| Part          | Description              |
| ------------- | ------------------------ |
| `base`        | Step item button wrapper |
| `title`       | Step item title          |
| `description` | Step item description    |

### Events

#### `bq-step-item`

| Event     | Description                                | Type                                 |
| --------- | ------------------------------------------ | ------------------------------------ |
| `bqClick` | Fires when an enabled step item is clicked | `CustomEvent<HTMLBqStepItemElement>` |
| `bqFocus` | Fires when a step item receives focus      | `CustomEvent<HTMLBqStepItemElement>` |
| `bqBlur`  | Fires when a step item loses focus         | `CustomEvent<HTMLBqStepItemElement>` |

<Note>
  * In React, prefix events with `on`: `onBqClick`, `onBqFocus`, `onBqBlur`.
  * In Angular, use event binding syntax: `(bqClick)`, `(bqFocus)`, `(bqBlur)`.
  * In Vue, use the `@` shorthand: `@bqClick`, `@bqFocus`, `@bqBlur`.
</Note>

### Methods

#### `bq-steps`

| Method                               | Description                                                                            | Returns         |
| ------------------------------------ | -------------------------------------------------------------------------------------- | --------------- |
| `setCurrentStepItem(newCurrentStep)` | Sets the provided step item as current and resets the previous current item to default | `Promise<void>` |

### CSS custom properties

#### `bq-steps`

| Variable                    | Description       | Default                     |
| --------------------------- | ----------------- | --------------------------- |
| `--bq-steps--divider-color` | Divider color     | `var(--bq-stroke--primary)` |
| `--bq-steps--gap`           | Gap between steps | `var(--bq-spacing-m)`       |

#### `bq-step-item`

| Variable                                 | Description                               | Default                                 |                         |
| ---------------------------------------- | ----------------------------------------- | --------------------------------------- | ----------------------- |
| `--bq-step-item--prefix-color`           | Prefix icon color                         | `var(--bq-icon--secondary)`             |                         |
| `--bq-step-item--prefix-color-current`   |                                           | Prefix icon color for the current state | `var(--bq-icon--brand)` |
| `--bq-step-item--prefix-color-completed` | Prefix icon color for the completed state | `var(--bq-icon--success)`               |                         |
| `--bq-step-item--prefix-color-error`     | Prefix icon color for the error state     | `var(--bq-icon--danger)`                |                         |
| `--bq-step-item--prefix-num-size`        | Prefix number size                        | `var(--bq-spacing-xl)`                  |                         |
| `--bq-step-item--prefix-num-bg-color`    | Prefix number background color            | `var(--bq-background--secondary)`       |                         |

<Tip>
  Learn more about [styling with shadow parts](/guides/styles) and [CSS custom properties](/theming/global-css-variables).
</Tip>

## Resources

<CardGroup cols={2}>
  <Card horizontal title="Interactive playground" icon="code" href="https://storybook.beeq.design/?path=/story/components-steps--default">
    Explore Steps variants and states in Storybook
  </Card>

  <Card horizontal title="Source code" icon="github" href="https://github.com/Endava/BEEQ/tree/main/packages/beeq/src/components/steps">
    View the component source on GitHub
  </Card>
</CardGroup>
