Sur cette page

Accessibilité

#Lien direct vers cette section

Pris en charge automatiquement

#Lien direct vers cette section
  • Le trigger reçoit aria-haspopup="true" et aria-expanded synchronisé à l’état ouvert/fermé — WCAG 4.1.2 (ouvre dans un nouvel onglet)Name, Role, Value : tout composant UI doit exposer son nom, rôle et valeur (états inclus) aux technologies d'assistance.
  • En mode menu (présence d’ar-dropdown-item), le panel reçoit role="menu" et chaque enfant focusable reçoit role="menuitem".
  • Navigation clavier complète : ↑ ↓ Home End pour déplacer le focus, Escape et Tab pour fermer — WCAG 2.1.1 (ouvre dans un nouvel onglet)Keyboard : toutes les fonctionnalités doivent être accessibles au clavier sans temporisation spécifique.
  • Retour du focus sur le trigger à la fermeture, y compris après l’activation d’un item.
  • Light-dismiss natif (popover="auto") : un clic hors du panel ferme automatiquement.
  • Les animations sont désactivées si prefers-reduced-motion: reduce est actif.

À votre charge

#Lien direct vers cette section
  • Le bouton du trigger doit être accessible. Fournir un libellé textuel clair ou un aria-label si le trigger ne contient que de l’iconographie.
  • En mode menu, envelopper chaque action dans ar-dropdown-item. Les éléments sans ar-dropdown-item dans un panel menu ne reçoivent pas role="menuitem" et sortent de la navigation clavier.
  • Pour l’état désactivé, coupler ar-dropdown[disabled] et aria-disabled="true" sur le trigger. L’attribut disabled du composant bloque la logique JS ; aria-disabled="true" (à la place du disabled natif) maintient le bouton dans l’ordre de tabulation pour que les technologies d’assistance puissent annoncer l’état et lire une éventuelle raison via aria-describedby.

Utilisation

#Lien direct vers cette section

Réagir à un choix

#Lien direct vers cette section

En mode menu, activer un item (clic, Entrée ou Espace) émet ar-dropdown-select, puis ferme le menu. detail.item est l’ar-dropdown-item activé. Annulez l’événement pour garder le menu ouvert :

dropdown.addEventListener('ar-dropdown-select', (e) => {
    if (e.detail.item.hasAttribute('data-keep-open')) e.preventDefault();
});

Exemples

#Lien direct vers cette section

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

Mode menu

#Lien direct vers cette section

Avec des ar-dropdown-item, le panel reçoit automatiquement role="menu" et la navigation clavier est activée (↑↓ Home End Escape Tab).

Voir le code
<ar-dropdown>
    <button class="ar-btn ar-btn-secondary" slot="trigger">Actions ▾</button>
    <ar-dropdown-item><button>Modifier</button></ar-dropdown-item>
    <ar-dropdown-item><button>Dupliquer</button></ar-dropdown-item>
    <ar-dropdown-item><button>Supprimer</button></ar-dropdown-item>
</ar-dropdown>

Séparateur

#Lien direct vers cette section

Un `<hr>` placé entre des `ar-dropdown-item` reçoit automatiquement `role="separator"`. Stylez-le avec votre propre CSS — ici via une variable CSS du token de bordure.


Voir le code
<ar-dropdown>
    <button class="ar-btn ar-btn-secondary" slot="trigger">Actions ▾</button>
    <ar-dropdown-item><button>Modifier</button></ar-dropdown-item>
    <ar-dropdown-item><button>Dupliquer</button></ar-dropdown-item>
    <hr style="border:none;border-top:1px solid var(--ar-color-border,#e5e7eb);margin:.25rem 0;">
    <ar-dropdown-item><button>Supprimer</button></ar-dropdown-item>
</ar-dropdown>

Contenu libre

#Lien direct vers cette section

Sans ar-dropdown-item, le panel est un conteneur libre — aucun role ni navigation clavier n'est ajouté.

Contenu libre — formulaire, liste, texte…

Voir le code
<ar-dropdown>
    <button class="ar-btn ar-btn-secondary" slot="trigger">Options ▾</button>
    <p style="padding: .5rem .75rem; margin: 0; color: var(--ar-color-text, inherit);">Contenu libre — formulaire, liste, texte…</p>
</ar-dropdown>

Placement top-end

#Lien direct vers cette section

Le panel s'ouvre au-dessus du trigger, aligné à droite.

Voir le code
<ar-dropdown placement="top-end">
    <button class="ar-btn ar-btn-secondary" slot="trigger">Placement ▾</button>
    <ar-dropdown-item><button>Item 1</button></ar-dropdown-item>
    <ar-dropdown-item><button>Item 2</button></ar-dropdown-item>
</ar-dropdown>

Distance personnalisée

#Lien direct vers cette section

Espacement en pixels entre le trigger et le panel (axe principal), piloté par la custom property CSS `--ar-dropdown-distance` (défaut : `var(--ar-anchor-distance)`, 4px).

Voir le code
<ar-dropdown style="--ar-dropdown-distance: 16px">
    <button class="ar-btn ar-btn-secondary" slot="trigger">Distance 16px ▾</button>
    <ar-dropdown-item><button>Item 1</button></ar-dropdown-item>
    <ar-dropdown-item><button>Item 2</button></ar-dropdown-item>
    <ar-dropdown-item><button>Item 3</button></ar-dropdown-item>
</ar-dropdown>

Offset latéral

#Lien direct vers cette section

Décalage latéral en pixels du panel par rapport au trigger (axe transversal), piloté par la custom property CSS `--ar-dropdown-offset` (défaut : `var(--ar-anchor-offset)`, 0).

Voir le code
<ar-dropdown style="--ar-dropdown-offset: 32px">
    <button class="ar-btn ar-btn-secondary" slot="trigger">Offset 32px ▾</button>
    <ar-dropdown-item><button>Item 1</button></ar-dropdown-item>
    <ar-dropdown-item><button>Item 2</button></ar-dropdown-item>
    <ar-dropdown-item><button>Item 3</button></ar-dropdown-item>
</ar-dropdown>

Trigger externe

#Lien direct vers cette section

L'attribut `trigger-id` accepte l'ID d'un élément déclencheur situé en dehors du composant. Utile pour les boutons dans une barre d'outils ou une autre zone de la page.

Voir le code
<button class="ar-btn ar-btn-secondary" id="ar-doc-ext-trigger">Trigger externe ▾</button>
<ar-dropdown trigger-id="ar-doc-ext-trigger">
    <ar-dropdown-item><button>Modifier</button></ar-dropdown-item>
    <ar-dropdown-item><button>Dupliquer</button></ar-dropdown-item>
    <ar-dropdown-item><button>Supprimer</button></ar-dropdown-item>
</ar-dropdown>

Désactivé

#Lien direct vers cette section

Combine `disabled` sur `ar-dropdown` et `aria-disabled="true"` sur le trigger — voir la section Accessibilité pour le détail. WCAG exempte les composants désactivés des exigences de contraste : `opacity: .5` est donc conforme.

Droits insuffisants pour effectuer cette action.

Voir le code
<ar-dropdown disabled>
    <button
        class="ar-btn ar-btn-secondary"
        slot="trigger"
        aria-disabled="true"
        aria-describedby="disabled-reason"
        style="opacity:.5;cursor:not-allowed;"
    >Actions ▾</button>
    <ar-dropdown-item><button>Item 1</button></ar-dropdown-item>
</ar-dropdown>
<p id="disabled-reason" style="margin-top:.5rem;font-size:.875rem;color:var(--ar-color-text-muted,#6b7280);">
    Droits insuffisants pour effectuer cette action.
</p>

Démo interactive

#Lien direct vers cette section

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

<ar-dropdown>
    <button class="ar-btn ar-btn-secondary" slot="trigger">Actions ▾</button>
    <ar-dropdown-item><button>Modifier</button></ar-dropdown-item>
    <ar-dropdown-item><button>Dupliquer</button></ar-dropdown-item>
    <ar-dropdown-item><button>Supprimer</button></ar-dropdown-item>
</ar-dropdown>

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/dropdown/index.js"></script>

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

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

Configuration

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

Attributs et propriétés

1 sur 5
openreflète

Ouvre ou ferme le panel.

Type booleanDéfaut false

2 sur 5
placementreflète

Placement du panel par rapport au trigger (Floating UI).

Type 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end'Défaut 'bottom-start'

3 sur 5
disabledreflète

Désactive le composant — le trigger ne répond plus aux clics.

Type booleanDéfaut false

4 sur 5
noScrollLockreflèteno-scroll-lock

Désactive le verrouillage du scroll des conteneurs ancêtres à l'ouverture. Par défaut, le scroll est bloqué comme le fait le `<select>` natif. À activer uniquement si le jitter de positionnement est acceptable.

Type booleanDéfaut false

5 sur 5
triggerIdreflètetrigger-id

ID d'un élément déclencheur externe (light DOM). Quand défini, le slot `trigger` est ignoré.

Type stringDéfaut ''

Slots

1 sur 2trigger

Le bouton déclencheur (ignoré si `trigger-id` est défini).

2 sur 2(default)

Contenu du panel (libre ou ar-dropdown-item pour le mode menu).

Événements

1 sur 7
ar-dropdown-showannulabledetail : { id: string | undefined }

Émis avant l'ouverture.

2 sur 7
ar-dropdown-show-preventeddetail : { id: string | undefined }

Émis si ar-dropdown-show est annulé.

3 sur 7
ar-dropdown-showndetail : { id: string | undefined }

Émis après l'ouverture.

4 sur 7
ar-dropdown-hideannulabledetail : { id: string | undefined }

Émis avant la fermeture.

5 sur 7
ar-dropdown-hide-preventeddetail : { id: string | undefined }

Émis si ar-dropdown-hide est annulé.

6 sur 7
ar-dropdown-hiddendetail : { id: string | undefined }

Émis après la fermeture.

7 sur 7
ar-dropdown-selectannulabledetail : { id: string | undefined, item: ArDropdownItem }

En mode menu, à l'activation d'un item (clic, Entrée, Espace) ; `item` est l'`ar-dropdown-item` activé. Sans annulation, le menu se ferme.

Personnalisation

#Lien direct vers cette section
CSS Parts 1CSS Custom States 2CSS Custom Properties 11

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 1panel

Le panel 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-dropdown: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 est ouvert.

2 sur 2:state(disabled)

Le composant est désactivé.

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-dropdown {
    --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 2--ar-dropdown-distance

Espacement entre le trigger et le panel (axe principal).

2 sur 2--ar-dropdown-offset

Décalage latéral du panel (axe transversal).