shadcn/ui'da menü göstermenin üç yolu vardır: DropdownMenu bir düğmeye basınca açılan eylem listesidir, ContextMenu aynı türden bir listeyi bir alana sağ tıklandığında açar, Menubar ise masaüstü uygulamalarındaki gibi sürekli görünen ve "Dosya", "Düzen" gibi başlıklardan oluşan bir menü çubuğudur. Üçü de Radix UI ilkellerine dayanır, neredeyse aynı parça adlarını kullanır ve npx shadcn@latest add dropdown-menu, add context-menu, add menubar komutlarıyla eklenir. Birini öğrendiğinizde diğer ikisini de büyük ölçüde öğrenmiş olursunuz.

Bu yazıda önce üç bileşenin ortak parçalarını, yani öğe, etiket, ayırıcı, kısayol, onay kutulu ve radyo öğeleri ile alt menüleri, ardından her bileşenin kendine özgü kullanımını ve belgedeki dialog açma notunu ele alıyoruz. Aranabilir komut listesi istiyorsanız Command yazısı daha uygun olabilir; serinin tamamı için shadcn/ui öğrenme rehberi sayfasına bakabilirsiniz.

Kurulum

Kurulum: Dropdown Menu, Context Menu, Menubar

Her bileşen kendi Radix paketini kullanır. CLI ile kurulumda paketler otomatik yüklenir; elle kurulumda ilgili paketi yükleyip kaynak dosyayı components/ui klasörüne kopyalarsınız.

bash
npx shadcn@latest add dropdown-menu
npx shadcn@latest add context-menu
npx shadcn@latest add menubar
BileşenBelgedeki tanımRadix paketi
Dropdown MenuBir düğmeyle tetiklenen eylem ya da işlev menüsü@radix-ui/react-dropdown-menu
Context MenuAynı türden menü; belgedeki örnekte sağ tıklamayla açılır@radix-ui/react-context-menu
MenubarMasaüstü uygulamalarındaki gibi sürekli görünen komut çubuğu@radix-ui/react-menubar

Belge sayfalarında Dropdown Menu ile Context Menu aynı açıklama cümlesini paylaşır; aralarındaki fark tetikleme biçimidir. Davranışın ayrıntıları Radix UI: Dropdown Menu, Radix UI: Context Menu ve Radix UI: Menubar sayfalarında anlatılır. Bileşen dosyalarının hepsi "use client" satırıyla başlar.

Ortak parçalar

Üç dosya da aynı yapıyı izler ve parça adları yalnızca ön ekleriyle ayrılır: DropdownMenuItem, ContextMenuItem ve MenubarItem aynı işi yapar. Aşağıdaki tabloda Dropdown Menu adları kullanılmıştır; diğer iki bileşende ön eki değiştirmeniz yeterlidir.

ParçaGörevi
DropdownMenuItemTıklanabilir menü öğesi; inset, variant ve disabled alabilir
DropdownMenuLabelBölüm başlığı; tıklanmaz, inset alabilir
DropdownMenuGroupİlgili öğeleri gruplar
DropdownMenuSeparatorGruplar arasına ince bir çizgi çeker
DropdownMenuShortcutÖğenin sağında kısayol metni gösterir
DropdownMenuCheckboxItemOnay kutulu öğe; checked ve onCheckedChange alır
DropdownMenuRadioGroup / RadioItemTek seçimli öğe grubu; value ve onValueChange alır
DropdownMenuSub / SubTrigger / SubContentİç içe alt menü
DropdownMenuPortalAlt menü içeriğini portal içinde çizmek için

Kaynak koda göre menü öğeleri iki özel prop alır. inset verildiğinde öğe solda pl-8 boşluk bırakır; böylece onay işareti ya da simge taşımayan öğeler, işaretli öğelerle aynı hizada durur. variant ise "default" ya da "destructive" değerini alır; destructive öğeyi yıkıcı renkle, yani temadaki destructive değişkeniyle çizer. Silme gibi tehlikeli işlemleri bu varyantla işaretlemek, kullanıcının öğeyi diğerlerinden ayırt etmesini kolaylaştırır. disabled ise Radix'ten gelir ve öğeyi soluk, tıklanamaz gösterir.

DropdownMenuShortcut bileşeni yalnızca bir span öğesidir: sağa yaslanır, küçük ve geniş aralıklı yazılır. Klavye kısayolunu göstermekle yetinir, onu çalıştırmaz. Menüdeki "⌘B" yazısının gerçekten bir işe yaraması için klavye olayını kendiniz dinlemelisiniz; bunun bir örneği Command yazısındaki Ctrl/Cmd+K kancasıdır.

Context Menu: sağ tıklama menüsü

shadcn/ui: Context Menu sayfasındaki temel örnekte tetikleyici bir metindir ve menü bu alana sağ tıklandığında açılır. Belgedeki demo, tetikleyiciyi kesik çizgili kenarlıklı bir kutu olarak çizer ve içine geri, ileri, yenile öğeleri, bir alt menü, onay kutulu öğeler ve bir radyo grubu koyar.

typescript
<ContextMenu>
  <ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
    Buraya sağ tıklayın
  </ContextMenuTrigger>
  <ContextMenuContent className="w-52">
    <ContextMenuItem inset>
      Geri
      <ContextMenuShortcut>⌘[</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuItem inset disabled>
      İleri
      <ContextMenuShortcut>⌘]</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuSub>
      <ContextMenuSubTrigger inset>Diğer araçlar</ContextMenuSubTrigger>
      <ContextMenuSubContent className="w-44">
        <ContextMenuItem>Sayfayı kaydet...</ContextMenuItem>
        <ContextMenuSeparator />
        <ContextMenuItem variant="destructive">Sil</ContextMenuItem>
      </ContextMenuSubContent>
    </ContextMenuSub>
    <ContextMenuSeparator />
    <ContextMenuCheckboxItem checked>Yer imlerini göster</ContextMenuCheckboxItem>
    <ContextMenuSeparator />
    <ContextMenuRadioGroup value="ayse">
      <ContextMenuLabel inset>Kişiler</ContextMenuLabel>
      <ContextMenuRadioItem value="ayse">Ayşe</ContextMenuRadioItem>
      <ContextMenuRadioItem value="mehmet">Mehmet</ContextMenuRadioItem>
    </ContextMenuRadioGroup>
  </ContextMenuContent>
</ContextMenu>

Örnekte inset kullanımının amacı açıkça görülür: onay kutulu ve radyo öğelerinin solunda işaret için yer ayrılır, düz öğeler de inset ile aynı hizaya çekilir. Bu demo onay ve radyo değerlerini sabit verir; gerçek kullanımda Dropdown Menu örneklerindeki gibi onCheckedChange ve onValueChange ile duruma bağlarsınız. Context Menu'nün tetikleyicisi bir düğme değil, bir alan olduğu için ContextMenuTrigger bileşenine doğrudan className verilir.

Bir dosya listesinde her satıra ayrı bir sağ tıklama menüsü vermek istiyorsanız her satırı kendi ContextMenu bileşeniyle sarar, satırın kendisini tetikleyici yaparsınız. Menüdeki bir öğe silme onayı gibi bir pencere açacaksa, Dialog sayfasının notunu hatırlayın: ContextMenu bileşeni Dialog kökünün içine alınır ve öğe DialogTrigger asChild ile sarılır; DialogContent ise menü içeriğinin dışında, aynı kökün altında tanımlanır.

Hangisini seçmeli?

Hangisini seçmeli? Bir düğmenin altında birkaç eylem, Bir dosya, satır ya da kart üzerinde sağ tıklama eylemleri, Editör ya da yönetim aracı gibi kalıcı üst menü, Arama...
DurumUygun bileşen
Bir düğmenin altında birkaç eylemDropdown Menu
Bir dosya, satır ya da kart üzerinde sağ tıklama eylemleriContext Menu
Editör ya da yönetim aracı gibi kalıcı üst menüMenubar
Arama yapılabilen uzun komut listesiCommand (ayrı yazı)
Form içinde tek değer seçimiSelect (ayrı yazı)

Son iki satır sık karıştırılır: menüler eylem içindir, form değeri seçtirmek için Select ve Native Select bileşenlerini kullanın. Sitenin ana gezinmesi için ise Navigation Menu daha uygundur. Context Menu yalnızca sağ tıklamayla açıldığı için, aynı eylemlere başka bir yoldan da ulaşılabilmesi kullanıcılar açısından iyi bir pratiktir; örneğin aynı öğeleri bir Dropdown Menu ile de sunabilirsiniz.

Sık yapılan hatalar

  • Shortcut'ın kısayolu çalıştırdığını sanmak: DropdownMenuShortcut, ContextMenuShortcut ve MenubarShortcut yalnızca metin gösteren span öğeleridir; klavye olayını ayrıca dinlemelisiniz.
  • Menüden dialog açarken modal ayarını unutmak: Dropdown Menu sayfası bu durum için modal={false} kullanılmasını söyler.
  • Onay kutulu öğeyi durumsuz bırakmak: checked sabit verilirse tıklama görünümü değiştirmez; onCheckedChange ile duruma bağlayın.
  • Hizasız öğeler: onay ya da radyo öğeleriyle aynı listedeki düz öğelere inset vermezseniz metinler farklı hizalarda başlar.
  • Menubar'da MenubarMenu'yü atlamak: her başlık ve listesi ayrı bir MenubarMenu içinde olmalıdır.
  • Simgeli tetikleyicide erişilebilir ad vermemek: belgedeki dialog örneğinde yalnızca simge taşıyan düğme aria-label alır; siz de aynısını yapın. Ayrıntı için ARIA rehberine bakın.

Sık Sorulan Sorular

Dropdown Menu ile Context Menu arasındaki fark nedir?

Parçaları ve görünümleri neredeyse aynıdır; belge ikisini de aynı cümleyle tanımlar. Fark tetikleme biçimindedir: Dropdown Menu bir düğmeyle, Context Menu belgedeki örnekte bir alana sağ tıklamayla açılır.

Menü öğesine tıklandığında nasıl işlem yaparım?

Öğenin onSelect olayını kullanın; belgedeki dialog örneği bu olayla durum değiştirir. Öğe yeni bir sayfaya gidecekse asChild ile bir bağlantı bileşenini sarabilirsiniz.

Silme öğesini kırmızı nasıl gösteririm?

Öğeye variant="destructive" verin. Kaynak kod bu varyant için yazı ve odak rengini temadaki destructive değişkeninden alır.

Alt menü içeriğini neden Portal ile sarıyoruz?

Belgedeki Dropdown Menu demosu alt menü içeriğini DropdownMenuPortal ile sarar. Portal, içeriği belge ağacında üst menünün dışına taşır; böylece alt menü üst menünün sınırlarına takılmadan çizilir. Context Menu ve Menubar demolarında alt menü içeriği doğrudan kullanılır.

Radix dışında bir temel kullanılabiliyor mu?

Depo kopyası 19 Aralık 2025 tarihlidir ve bu kopyadaki new-york-v4 bileşenleri Radix paketlerini kullanır. Değişiklik günlüğünün Aralık 2025 bölümü, npx shadcn create ile Radix ya da Base UI arasında seçim yapılabildiğini duyurur; bu seçeneğin ayrıntıları shadcn/ui yenilikleri yazısında ele alınıyor.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: shadcn/ui öğrenme rehberi · Dialog ve Alert Dialog · Command paleti · Select ve Native Select · Navigation Menu, Breadcrumb ve Pagination · Data Table oluşturma