Sur cette page

Accessibilité

#Lien direct vers cette section

Pris en charge automatiquement

#Lien direct vers cette section
  • role="navigation" et aria-labelledby posés sur le conteneur — la région est annoncée et identifiable par les lecteurs d’écran (WCAG 1.3.1 (ouvre dans un nouvel onglet)Info and Relationships : les relations et structures visuelles doivent être déterminables par programmation ou disponibles en texte.).
  • L’état courant (current-path) est reflété visuellement et structurellement — les items actifs, complétés et désactivés sont distingués.

À votre charge

#Lien direct vers cette section
  • Labels descriptifs sur chaque ar-stepper-item. Le label identifie chaque étape (un numéro d’étape localisé est ajouté en texte masqué) — évitez les labels génériques (“Étape 1”) au profit de libellés métier (“Mes informations”, “Récapitulatif”).
  • current-path doit correspondre au path d’un item existant. Une valeur incorrecte n’active aucun item — aucun feedback visuel ni vocal ne signale l’étape courante.
  • href détermine l’élément rendu pour une étape cliquable. Un href réel (ex. /etape-2) produit un lien <a> : la navigation native a lieu, sauf si ar-stepper-step-change est annulé. Un href absent ou égal à # produit un <button> : aucune navigation native, tout passe par l’événement (routeur de framework, navigation asynchrone). Un Ctrl/Cmd/Maj/Alt + clic sur un lien réel ouvre un nouvel onglet sans émettre ar-stepper-step-change.

Comportement responsive

#Lien direct vers cette section

Le composant adapte son rendu selon la largeur de l’écran, au niveau du breakpoint desktop-from (992 px par défaut) :

  • En dessous de desktop-from : rendu dropdown (mobile).
  • À partir de desktop-from : liste verticale (desktop).

Quand desktop-target est renseigné, la téléportation DOM est également activée : le composant se déplace dans l’élément ciblé sur desktop, et revient à sa position d’origine sur mobile.

<aside id="stepper-sidebar"></aside>
<ar-stepper desktop-target="stepper-sidebar" desktop-from="992"> ... </ar-stepper>

Utilisation

#Lien direct vers cette section

Écouter le changement d’étape

#Lien direct vers cette section

Écoutez ar-stepper-step-change, chargez l’étape, puis réassignez currentPath. Le composant reste en attente jusqu’à cette réassignation : en cas d’échec, réassignez l’étape actuelle. L’attribut pending sert à exprimer une attente qui ne passe pas par l’événement, comme un chargement initial.

stepper.addEventListener('ar-stepper-step-change', async (e) => {
    const ok = await loadStep(e.detail.to);
    stepper.currentPath = ok ? e.detail.to : stepper.currentPath;
});

Mode create vs edit

#Lien direct vers cette section

La prop mode détermine quelles étapes sont cliquables. En mode create (défaut), seules les étapes déjà complétées (avant l’étape courante) sont cliquables — navigation linéaire, cohérente avec un parcours de création où les étapes suivantes n’ont pas encore de contenu à afficher. Voir la variante Mode édition pour le mode edit.

Contenu additionnel après le label (after-label)

#Lien direct vers cette section

Chaque ar-stepper-item expose un slot nommé after-label pour afficher un contenu additif à côté du label — un badge de statut, une icône, une pastille de compteur. Ce contenu s’ajoute au label sans jamais le remplacer : il reste toujours lu séparément par les lecteurs d’écran (annoncé via aria-describedby), le label demeure donc le texte qui identifie l’étape.

<ar-stepper-item path="etape-1-1" label="Mon état civil" href="#">
    <span slot="after-label">🔒 Verrouillé</span>
</ar-stepper-item>

Indicateur personnalisé (indicator)

#Lien direct vers cette section

Par défaut, chaque étape affiche son numéro (via un compteur CSS). Le slot nommé indicator permet de remplacer entièrement ce contenu — une icône, une coche — sans dépendre d’un thème : purement décoratif (aria-hidden), il ne modifie jamais l’information de position, toujours portée séparément par du texte masqué visuellement.

<ar-stepper-item path="etape-1" label="Informations">
    <span slot="indicator">✓</span>
</ar-stepper-item>
#Lien direct vers cette section

Avec follow-scroll, la prop current-path se met à jour automatiquement pendant que l’utilisateur scrolle la page : le stepper détecte quelle section est visible et se synchronise sans action de votre part.

<ar-stepper follow-scroll>...</ar-stepper>
#Lien direct vers cette section

Mettre à jour current-path depuis l’extérieur pilote le stepper comme un clic utilisateur :

document.querySelector('ar-stepper').currentPath = 'etape-2';

En mode create, cette mise à jour ne rend pas les étapes suivantes cliquables pour autant — seul mode="edit" lève cette restriction.

Exemples

#Lien direct vers cette section

Les exemples de cette page sont affichés avec le thème neutre du starter-kit.

Pour les besoins de la démo un script simule une réponse positive aux événements émis par le composant (voir Utilisation).

Par défaut

#Lien direct vers cette section

Stepper à 3 étapes avec sous-étapes, sous-étape « Mes coordonnées » active.

Voir le code
<ar-stepper current-path="etape-1-3">
  <!-- Étape 1 -->
  <ar-stepper-item path="etape-1" label="Mes informations" href="/etape-1">
      <ar-stepper-item path="etape-1-1" label="Mon état civil" href="#etape-1-1"></ar-stepper-item>
      <ar-stepper-item path="etape-1-2" label="Mes coordonnées" href="#etape-1-2"></ar-stepper-item>
      <ar-stepper-item path="etape-1-3" label="Mes identifiants" href="#etape-1-3"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 2 -->
  <ar-stepper-item path="etape-2" label="Mes préférences" href="/etape-2">
      <ar-stepper-item path="etape-2-1" label="Mes notifications" href="/etape-2-1"></ar-stepper-item>
      <ar-stepper-item path="etape-2-2" label="Mes langues" href="/etape-2-2"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 3 -->
  <ar-stepper-item path="etape-3" label="Récapitulatif"></ar-stepper-item>
</ar-stepper>

Mode édition

#Lien direct vers cette section

Même structure en mode édition — toutes les étapes passées sont cliquables.

Voir le code
<ar-stepper current-path="etape-1-2" mode="edit">
  <!-- Étape 1 -->
  <ar-stepper-item path="etape-1" label="Mes informations" href="#">
      <ar-stepper-item path="etape-1-1" label="Mon état civil" href="#"></ar-stepper-item>
      <ar-stepper-item path="etape-1-2" label="Mes coordonnées" href="#"></ar-stepper-item>
      <ar-stepper-item path="etape-1-3" label="Mes identifiants" href="#"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 2 -->
  <ar-stepper-item path="etape-2" label="Mes préférences" href="#">
      <ar-stepper-item path="etape-2-1" label="Mes notifications" href="#etape-2-1"></ar-stepper-item>
      <ar-stepper-item path="etape-2-2" label="Mes langues" href="#etape-2-2"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 3 -->
  <ar-stepper-item path="etape-3" label="Récapitulatif"></ar-stepper-item>
</ar-stepper>

Information après label

#Lien direct vers cette section

Ajouter une information complémentaire au label d'une sous-étape

Cette étape nécessite votre attention Texte d'aide contextuelle
Voir le code
<ar-stepper current-path="etape-1-1" mode="edit">
    <!-- Étape 1 -->
    <ar-stepper-item path="etape-1" label="Mes informations" href="#">
        <ar-stepper-item path="etape-1-1" label="Mon état civil" href="#"></ar-stepper-item>
        <ar-stepper-item path="etape-1-2" label="Mes coordonnées" href="#">
            <span slot="after-label">
                <span id="etape-1-2-info">
                    <span class="sr-only">Cette étape nécessite votre attention</span>
                    <svg aria-hidden="true" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" style="display:block; color:var(--ar-stepper-item-current-header-color)">
                        <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"></path>
                    </svg>
                </span>
                <ar-tooltip trigger-id="etape-1-2-info">Texte d'aide contextuelle</ar-tooltip>
            </span>
        </ar-stepper-item>
        <ar-stepper-item path="etape-1-3" label="Mes identifiants" href="#"></ar-stepper-item>
    </ar-stepper-item>

    <!-- Étape 2 -->
    <ar-stepper-item path="etape-2" label="Mes préférences" href="#">
        <ar-stepper-item path="etape-2-1" label="Mes notifications" href="#etape-2-1"></ar-stepper-item>
        <ar-stepper-item path="etape-2-2" label="Mes langues" href="#etape-2-2"></ar-stepper-item>
    </ar-stepper-item>

    <!-- Étape 3 -->
    <ar-stepper-item path="etape-3" label="Récapitulatif"></ar-stepper-item>
</ar-stepper>

Alignement inversé

#Lien direct vers cette section

Inverse l'alignement de la liste d'étapes en mode desktop. S'appuie sur des règles posées sur les parts control et indicator d'ar-stepper-item — un thème qui les redéfinit peut désactiver l'inversion.

Voir le code
<ar-stepper current-path="etape-1-2" reverse-align>
  <!-- Étape 1 -->
  <ar-stepper-item path="etape-1" label="Mes informations" href="#">
      <ar-stepper-item path="etape-1-1" label="Mon état civil" href="#"></ar-stepper-item>
      <ar-stepper-item path="etape-1-2" label="Mes coordonnées" href="#"></ar-stepper-item>
      <ar-stepper-item path="etape-1-3" label="Mes identifiants" href="#"></ar-stepper-item>
  </ar-stepper-item>
  <!-- Étape 2 -->
  <ar-stepper-item path="etape-2" label="Mes préférences" href="#">
      <ar-stepper-item path="etape-2-1" label="Mes notifications" href="#etape-2-1"></ar-stepper-item>
      <ar-stepper-item path="etape-2-2" label="Mes langues" href="#etape-2-2"></ar-stepper-item>
  </ar-stepper-item>
  <!-- Étape 3 -->
  <ar-stepper-item path="etape-3" label="Récapitulatif"></ar-stepper-item>
</ar-stepper>

Démo interactive

#Lien direct vers cette section

Manipulez les attributs pour voir le code et la preview se mettre à jour.

<ar-stepper current-path="etape-1-3">
  <!-- Étape 1 -->
  <ar-stepper-item path="etape-1" label="Mes informations" href="/etape-1">
      <ar-stepper-item path="etape-1-1" label="Mon état civil" href="#etape-1-1"></ar-stepper-item>
      <ar-stepper-item path="etape-1-2" label="Mes coordonnées" href="#etape-1-2"></ar-stepper-item>
      <ar-stepper-item path="etape-1-3" label="Mes identifiants" href="#etape-1-3"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 2 -->
  <ar-stepper-item path="etape-2" label="Mes préférences" href="/etape-2">
      <ar-stepper-item path="etape-2-1" label="Mes notifications" href="/etape-2-1"></ar-stepper-item>
      <ar-stepper-item path="etape-2-2" label="Mes langues" href="/etape-2-2"></ar-stepper-item>
  </ar-stepper-item>

  <!-- Étape 3 -->
  <ar-stepper-item path="etape-3" label="Récapitulatif"></ar-stepper-item>
</ar-stepper>

Référence API

#Lien direct vers cette section

Import

#Lien direct vers cette section

Si vous utilisez l'autoloader, les composants détectés dans la pages sont chargés automatiquement, donc pas besoin de les importer individuellement.
Pour un import manuel, voici comment vous y prendre.

CDNnpm

Importez ce composant depuis le CDN.

<script type="module" src="https://unpkg.com/@ariane-ui/core/dist/components/stepper/index.js"></script>

Après avoir installé le paquet via npm, vous pouvez importer le composant ainsi :

import '@ariane-ui/core/dist/components/stepper/index.js';

Configuration

#Lien direct vers cette section
Attributs et propriétés 8Slots 2Événements 2

Attributs et propriétés

1 sur 8
currentPathreflètecurrent-path

Chemin de l'étape courante. Doit correspondre au `path` d'un `<ar-stepper-item>`. Mettre à jour cette propriété pour naviguer programmatiquement entre les étapes. Toute affectation compte, même vers la même valeur (`hasChanged` toujours vrai) : réassigner `currentPath` est la réponse de l'application à `ar-stepper-step-change`, y compris pour signaler un échec (même étape), et met fin à l'attente automatique.

Type stringDéfaut ''

2 sur 8
pendingreflète

Attente d'une réponse, pilotée par l'application. Le composant attend déjà seul la réponse à chaque `ar-stepper-step-change` non annulé, jusqu'à la prochaine affectation de `currentPath` : cet attribut sert à exprimer une attente qui ne passe pas par l'événement et reste à la charge de l'application. Le composant ne le pose ni ne le retire jamais. Non bloquant. L'attente, manuelle ou automatique, pose `aria-busy="true"` sur la navigation, l'état `:state(pending)`, et annonce l'attente au passage `false → true`.

Type booleanDéfaut false

3 sur 8
modereflète

Mode de navigation : `create` (formulaire de création) ou `edit` (modification). Détermine quelles étapes sont accessibles au clic.

Type 'create' | 'edit'Défaut 'create'

4 sur 8
followScrollreflètefollow-scroll

Active le mode "scroll follow" : la propriété `current-path` se met à jour automatiquement quand l'utilisateur scrolle vers une section de la page.

Type booleanDéfaut false

5 sur 8
desktopTargetreflètedesktop-target

ID de l'élément cible qui accueille le stepper en mode desktop.

Type string | undefined

6 sur 8
desktopFromreflètedesktop-from

Breakpoint desktop à partir duquel la téléportation est activée.

Type numberDéfaut 992

7 sur 8
openreflète

Contrôle programmatique du panel mobile. Reflété comme attribut HTML. Sans effet en mode desktop.

Type booleanDéfaut false

8 sur 8
reverseAlignreflètereverse-align

Inverse l'alignement de la liste d'étapes en mode desktop. Sans effet en mode mobile (dropdown). S'appuie sur des règles posées sur les parts `control` et `indicator` d'ar-stepper-item — un thème qui les redéfinit peut désactiver l'inversion.

Type booleanDéfaut false

Slots

1 sur 2(default)

Un ou plusieurs composant <ar-stepper-items>, potentiellement imbriqués pour créer des sous-étapes.

2 sur 2trigger-icon

Icône du bouton d'ouverture du panel (mobile). Remplace le chevron SVG par défaut.

Événements

1 sur 2
ar-stepper-step-changeannulabledetail : { id: string | undefined, from: string, to: string }

Émis avant le changement d'étape, au clic. Annulable via `preventDefault()` : bloque la navigation, `currentPath` ne change pas. Contient `from` et `to`.

2 sur 2
ar-stepper-step-changeddetail : { id: string | undefined, from: string, to: string }

Émis quand `currentPath` a réellement changé (réassignation externe en réponse à `ar-stepper-step-change`, ou via `follow-scroll`). Non annulable. Contient `from` et `to`.

Personnalisation

#Lien direct vers cette section
CSS Parts 7CSS Custom States 2CSS Custom Properties 13

CSS Parts

Utilisez ::part(name) pour styler ces éléments depuis l'extérieur.
Certaines parts indiquent un rôle transverse, partagé avec d'autres composants — voir Personnalisation avancée.

1 sur 7stepper

Racine du composant.

2 sur 7list

Le conteneur `role="list"` des étapes.

3 sur 7trigger

Le bouton d'ouverture du panel mobile.

4 sur 7trigger-status

Le statut d'avancement affiché dans le bouton d'ouverture (ex. « Étape 2 / 5 (en cours) »).

5 sur 7trigger-label

Le libellé de l'étape (et sous-étape) courante affiché dans le bouton d'ouverture.

6 sur 7trigger-icon

Le conteneur de l'icône du bouton d'ouverture (chevron par défaut, ou contenu du slot `trigger-icon`) — cible d'une éventuelle rotation à l'ouverture.

7 sur 7panel

Le panel mobile flottant.

CSS Custom States

Utilisez le sélecteur :state(name) sur le tag pour styler ce composant en fonction de son état.
Composable avec ::part() pour cibler un élément interne (ar-stepper:state(name)::part(x)).
Sous Chrome et Edge 125, l'état est exposé avec le préfixe -- (:--name) : voir Compatibilité.

1 sur 2:state(open)

Le panel mobile est ouvert.

2 sur 2:state(pending)

Une réponse est attendue : un utilisateur a demandé à changer d'étape ou l'application a posé manuellement l'attribut `pending`.

CSS Custom Properties

Ce composant utilise un panel flottant, partagé avec d'autres composants, qui expose des custom properties.
Les thèmes peuvent redéfinir ces tokens globalement via :root, ou par composant comme dans cet exemple :

ar-stepper {
    --ar-panel-radius: 1rem;
}
1 sur 9--ar-panel-bg

Fond du panel partagé. Repli système `Canvas` si aucun thème n'est chargé.

2 sur 9--ar-panel-text

Couleur du texte du panel partagé. Repli système `CanvasText` si aucun thème n'est chargé.

3 sur 9--ar-panel-border-color

Couleur de bordure du panel partagé. Repli système `ButtonBorder` si aucun thème n'est chargé.

4 sur 9--ar-panel-radius

Rayon de bordure du panel partagé.

5 sur 9--ar-panel-shadow

Ombre portée du panel partagé.

6 sur 9--ar-panel-padding

Espacement interne du panel partagé.

7 sur 9--ar-panel-min-width

Largeur minimale du panel partagé.

8 sur 9--ar-panel-max-width

Largeur maximale du panel partagé.

9 sur 9--ar-panel-show-duration

Durée de l'animation d'ouverture du panel partagé (respecte `prefers-reduced-motion`).

Il expose également des custom properties propres, personnalisables directement via :root.

1 sur 4--ar-stepper-distance

Espacement entre le trigger et le panel mobile.

2 sur 4--ar-stepper-offset

Décalage latéral du panel mobile.

3 sur 4--ar-stepper-toggle-transition-duration

Durée de la transition de fond du bouton d'ouverture (respecte `prefers-reduced-motion`).

4 sur 4--ar-stepper-toggle-min-size

Taille de cible minimale du bouton d'ouverture (WCAG 2.5.8).

Traduction

#Lien direct vers cette section

La langue de ce composant suit l'attribut lang de la page (<html lang>).
Vous pouvez appliquer une langue différente à une instance donnée en posant l'attribut lang directement dessus.
Voir la page Traductions pour le détail du mécanisme et la liste des traductions disponibles.

lang étant un attribut HTML natif, il n'apparaît pas dans le tableau « Attributs & Propriétés ».