DropdownMenu

Bir butondan açılan aksiyon ya da seçenek listesi.

KararlıKaynak kod

Son işlem: henüz yok

Import

tsx
import { DropdownMenu } from "@merid/react";

Anatomi

tsx
<DropdownMenu.Root>
  <DropdownMenu.Trigger />
  <DropdownMenu.Content>
    <DropdownMenu.Label />
    <DropdownMenu.Group>
      <DropdownMenu.Item />
      <DropdownMenu.CheckboxItem />
    </DropdownMenu.Group>
    <DropdownMenu.Separator />
  </DropdownMenu.Content>
</DropdownMenu.Root>
  • Root açık/kapalı state'ini tutar. Kendisi bir eleman render'lamaz.
  • Trigger, aria-haspopup="menu" taşıyan bir <button>'dır.
  • Content, tetikleyiciye göre konumlanan ve portal'lanan role="menu" panelidir. Yalnızca açıkken mount edilir.
  • Item bir aksiyon çalıştırır ve menüyü kapatır. CheckboxItem bir ayarı açıp kapatır ve menüyü açık tutar.
  • Label, Group ve Separator uzun menüleri düzenler.

Örnekler

Checkbox öğeleri

CheckboxItem controlled (checked + onCheckedChange) ya da uncontrolled (defaultChecked) çalışır. Birini seçmek menüyü kapatmaz.

Konum

placement herhangi bir Floating UI konumunu kabul eder ("top", "bottom-end", "right-start"…). Menü viewport içinde kalmak için yön değiştirir ve kayar.

onSelect iptal edilebilir bir event alır. Bir öğe seçildikten sonra menünün açık kalması için event.preventDefault() çağır.

tsx
<DropdownMenu.Item onSelect={(event) => { event.preventDefault(); refresh(); }}>
  Yenile
</DropdownMenu.Item>

API referansı

Root

PropTipVarsayılanAçıklama
openboolean–Controlled açık/kapalı state'i.
defaultOpenbooleanfalseUncontrolled kullanımda başlangıç state'i.
onOpenChange(open: boolean) => void–Açık/kapalı state'i değişmesi gerektiğinde çağrılır.
childrenReactNode–Trigger ve Content.

Trigger

Tüm <button> attribute'larını kabul eder. type varsayılan olarak "button"'dır (asChild kullanıldığında atanmaz).

PropTipVarsayılanAçıklama
asChildbooleanfalse`<button>` yerine tek child elemanı (örneğin kendi `Button`'ını) render'lar; props, ref ve handler'ları birleştirir.
refRef<HTMLButtonElement>–Butona iletilen ref.

Content

Tüm <div> attribute'larını kabul eder.

PropTipVarsayılanAçıklama
placementPlacement"bottom-start"Tetikleyiciye göre tercih edilen konum.
sideOffsetnumber6Tetikleyiciye px cinsinden uzaklık.
containerElement | nulldocument.bodyPortal hedefi. `undefined` verilirse `document.body` kullanılır; `null` verilirse hedef oluşana kadar hiçbir şey render'lanmaz.
refRef<HTMLDivElement>–Menü elemanına iletilen ref.

Item

onSelect dışındaki tüm <div> attribute'larını kabul eder. Senin onClick, onKeyDown ve onPointerMove handler'ların önce çalışır; yerleşik davranışı (aktivasyon, vurgulama) atlamak için içlerinde event.preventDefault() çağır.

PropTipVarsayılanAçıklama
onSelect(event: Event) => void–Öğe tıklama, Enter ya da Space ile seçildiğinde çağrılır. Menüyü açık tutmak için preventDefault çağır.
disabledbooleanfalseÖğeyi devre dışı bırakır; ok tuşları onu atlar.
textValuestring–Children düz metin olmadığında typeahead için kullanılan metin.
leadingReactNode–Etiketten önce gösterilen ikon ya da eleman.
trailingReactNode–Etiketten sonra gösterilen kısayol ipucu ya da eleman.
refRef<HTMLDivElement>–Öğe elemanına iletilen ref.

CheckboxItem

onSelect dışındaki tüm <div> attribute'larını kabul eder; handler'lar Item'daki gibi birleştirilir. leading render'lanmaz; onun yerini tik işareti alır.

PropTipVarsayılanAçıklama
checkedboolean–Controlled işaretli state'i.
defaultCheckedbooleanfalseUncontrolled kullanımda başlangıçtaki işaretli state.
onCheckedChange(checked: boolean) => void–Yeni işaretli state ile çağrılır. Menü açık kalır.
disabledbooleanfalseÖğeyi devre dışı bırakır; ok tuşları onu atlar.
textValuestring–Children düz metin olmadığında typeahead için kullanılan metin.
trailingReactNode–Etiketten sonra gösterilen kısayol ipucu ya da eleman.
refRef<HTMLDivElement>–Öğe elemanına iletilen ref.

Group, Label, Separator

Üçü de tüm <div> attribute'larını kabul eder. Group, role="group" render'lar; ona bir aria-label ver. Label sunumsal bir metindir; Separator, role="separator" render'lar.

Stil verme

SınıfEleman
.mrd-menuContent paneli
.mrd-menu__itemItem ve CheckboxItem
.mrd-menu__leading, .mrd-menu__trailingBaştaki ikon, sondaki ipucu
.mrd-menu__label-textÖğe metni
.mrd-menu__checkCheckboxItem'ın tik slot'u
.mrd-menu__labelLabel
.mrd-menu__separatorSeparator
AttributeNeredeDeğerler
data-stateTrigger (ya da asChild elemanı)open, closed
data-stateContentopen
data-stateCheckboxItemchecked, unchecked
data-disabledItem, CheckboxItemdevre dışıyken bulunur

Erişilebilirlik

WAI-ARIA Menu Button desenini izler. Tetikleyici aria-haspopup="menu", aria-expanded ve aria-controls taşır; menüyü tetikleyici etiketler. Açılınca focus menünün içine geçer; Escape ile ya da bir seçim yapılınca tetikleyiciye döner.

TuşNe yapar
EnterTetikleyicide: menüyü açar ve ilk öğeye focus verir. Bir öğede: öğeyi çalıştırır.
SpaceTetikleyicide: menüyü açar ve ilk öğeye focus verir. Bir öğede: öğeyi çalıştırır.
ArrowDownTetikleyicide: menüyü ilk öğede açar. Menüde: sonraki öğe; sona gelince başa döner.
ArrowUpTetikleyicide: menüyü son öğede açar. Menüde: önceki öğe; başa gelince sona döner.
Homeİlk öğe.
EndSon öğe.
A–ZYazılan metinle başlayan bir sonraki öğeye gider (typeahead).
EscapeMenüyü kapatır ve focus'u tetikleyiciye döndürür.
TabMenüyü kapatır ve focus'u sonraki elemana taşır.

Kullanım ilkeleri

Yap

Menüyü bir nesne üzerindeki ikincil aksiyonlar için kullan (yeniden adlandır, çoğalt, arşivle) ve etiketleri bir fiil ya da kısa bir ifadeyle sınırla.

Kaçın

Bir form değeri seçmek için menü kullanmak. Listeden tek bir değer seçmek için Select var.

Yap

Yıkıcı aksiyonları bir separator'dan sonra, en sona koy.

Kaçın

Primary bir aksiyona ulaşmanın tek yolunu bir menünün içine saklamak.

İlgili sayfalar

  • Select: bir form için tek değer seçmek.
  • Popover: içeriği serbest, modal olmayan panel.
  • Button: tetikleyicinin olağan görünümü.