Affiche un panneau contextuel déclenché par un bouton, positionné automatiquement autour de lui. À utiliser pour des menus d'actions, des filtres, ou tout contenu additionnel qui ne justifie pas un dialog.
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 : ↑↓HomeEnd 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.
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.
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();
});
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.
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).
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).
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.
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.
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.
Désactive le composant — le trigger ne répond plus aux clics.
TypebooleanDéfautfalse
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.
TypebooleanDéfautfalse
5 sur 5
triggerIdreflètetrigger-id
ID d'un élément déclencheur externe (light DOM). Quand défini, le slot
`trigger` est ignoré.
TypestringDé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).
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).