Kaapi UI
← Retour au Design System

Dropdown

Un menu déroulant qui s'affiche au clic, avec une API simplifiée pour une utilisation plus facile.

Exemple de base


<DropdownMenu
  trigger={<Button>Menu</Button>}
  items={[
    { id: "edit", label: "Modifier" },
    { id: "duplicate", label: "Dupliquer" },
  ]}
/>

Avec séparateur et action destructive


<DropdownMenu
    trigger={<Button variant="secondary">Actions</Button>}
    contentClassName="min-w-[120px]"
    items={[
        { id: "edit", label: "Edit", onClick: () => console.log("Edit") },
        { id: "duplicate", label: "Duplicate", onClick: () => console.log("Duplicate") },
        { id: "sep1", type: "separator" },
        { id: "delete", label: "Delete", variant: "destructive", onClick: () => console.log("Delete") },
    ]}
/>

Avec radio group


<DropdownMenu
  trigger={<Button>Theme</Button>}
  contentClassName="min-w-[120px]"
  radioGroupValue={theme}
  onRadioValueChange={setTheme}
  items={[
      { id: "light", type: "radio", label: "Light", value: "light" },
      { id: "dark", type: "radio", label: "Dark", value: "dark" },
      { id: "system", type: "radio", label: "System", value: "system" },
  ]}
/>

Avec checkboxes


<DropdownMenu
  trigger={<Button>Options</Button>}
  contentClassName="min-w-[180px]"
  items={[
      {
          id: "notifications",
          type: "checkbox",
          label: "Show notifications",
          checked: showNotifications,
          onClick: () => setShowNotifications(!showNotifications),
      },
      {
          id: "darkmode",
          type: "checkbox",
          label: "Enable dark mode",
          checked: darkModeEnabled,
          onClick: () => setDarkModeEnabled(!darkModeEnabled),
      },
  ]}
/>

Avec groupes et sous-menus


<DropdownMenu
  trigger={<Button variant="secondary">Open</Button>}
  contentClassName="w-56"
  align="start"
  contentLabel="My Account"
  groups={[
      {
          id: "account",
          items: [
              { id: "profile", label: "Profile", shortcut: "⇧⌘P" },
              { id: "billing", label: "Billing", shortcut: "⌘B" },
              { id: "settings", label: "Settings", shortcut: "⌘S" },
              { id: "shortcuts", label: "Keyboard shortcuts", shortcut: "⌘K" },
          ],
      },
      {
          id: "team",
          items: [
              { id: "team", label: "Team" },
              {
                  id: "invite",
                  type: "sub",
                  label: "Invite users",
                  items: [
                      { id: "email", label: "Email" },
                      { id: "message", label: "Message" },
                      { id: "sep2", type: "separator" },
                      { id: "more", label: "More..." },
                  ],
              },
              { id: "newteam", label: "New Team", shortcut: "⌘+T" },
          ],
      },
      {
          id: "external",
          items: [
              { id: "github", label: "GitHub" },
              { id: "support", label: "Support" },
              { id: "api", label: "API", disabled: true },
          ],
      },
      { id: "logout", items: [{ id: "logout", label: "Log out", shortcut: "⇧⌘Q" }] },
  ]}
/>

Avec bouton dots


<DropdownMenu
  trigger={<DropdownDotsButton />}
  align="end"
  contentClassName="min-w-[100px]"
  items={[
      { id: "view", label: "View details" },
      { id: "archive", label: "Archive" },
      { id: "remove", label: "Remove", variant: "destructive" },
  ]}
/>

API Reference

PropsTypeDefaultDescription
triggerReact.ReactNodeÉlément déclencheur du menu
items?DropdownMenuItemData[][]Liste des éléments
groups?DropdownMenuGroupData[][]Groupes d’éléments avec séparateur
contentLabel?stringLabel global affiché en haut
contentClassName?stringClasse appliquée au contenu
itemClassName?stringClasse appliquée aux items
radioGroupValue?(requis dans radiio group)stringValeur sélectionnée pour radio
onRadioValueChange?(requis dans radiio group)(value: string) => voidCallback lors du changement radio
side?"top" | "right" | "bottom" | "left"bottomPosition du menu
sideOffset?number4Décalage entre trigger et menu
align?"start" | "center" | "end"centerAlignement horizontal
alignOffset?number0Décalage d’alignement
defaultOpen?booleanfalseÉtat initial ouvert/fermé
open?booleanMode contrôlé (open/close)
onOpenChange?(open: boolean) => voidCallback ouverture/fermeture
modal?booleantrueCapture le focus (mode modal)
PropsTypeDefaultDescription
idstring-Identifiant unique de l’élément
type?"item" | "checkbox" | "radio" | "separator" | "label" | "sub"itemType d’élément de menu
labelReact.ReactNode-Contenu affiché de l’élément
shortcut?string-Texte d’un raccourci clavier (ex: ⌘C)
onClick?() => void-Callback déclenché lors du clic
disabled?booleanfalseDésactive l’élément
variant?"default" | "destructive"defaultStyle visuel de l’élément
checked?booleanfalseÉtat pour les checkbox
valuestring-Valeur pour les radio
inset?booleanfalseAjoute une indentation visuelle
href?string-Si présent, rend l’item cliquable comme un lien
asChild?booleanfalsePermet d’utiliser un autre composant via asChild
items?(requis pour les sous-menus)DropdownMenuItemData[]-Liste de sous-éléments (uniquement pour sub)
PropsTypeDefaultDescription
idstring-Identifiant unique du groupe
label?string-Label affiché en en-tête du groupe
itemsDropdownMenuItemData[][]Liste des items du groupe