Command

Gruplu, aranabilir ve klavyeyle gezilen bir komut listesi. Sayfa içinde kullanabilir ya da Command.Dialog ile ⌘K komut paleti olarak açabilirsin.

Son komut: henüz yok

Import

import { Command } from "@meridui/react";

Anatomi

<Command.Root>
  <Command.Input />
  <Command.List>
    <Command.Empty />
    <Command.Group heading="…">
      <Command.Item />
    </Command.Group>
    <Command.Separator />
  </Command.List>
</Command.Root>

<Command.Dialog>{/* aynı parçalar */}</Command.Dialog>
  • Root arama metnini ve aktif öğeyi tutar, öğeleri filtreler ve tuşları yönetir.
  • Input arama kutusudur (role="combobox"). Focus hep onda kalır; aktif öğe aria-activedescendant ile bildirilir.
  • List sonuçların role="listbox" elemanıdır. Item bir seçenektir; Group bir başlık ekler.
  • Empty yalnızca hiçbir öğe eşleşmediğinde render'lanır. Separator arama yazılırken gizlenir.
  • Dialog hepsini ⌘K / Ctrl+K ile açılan modal bir Dialog içine koyar.

Örnekler

Komut paleti

Command.Dialog global bir kısayol kaydeder (varsayılan ["mod", "k"]; kapatmak için shortcut={null} ver), açılınca input'a focus verir ve bir öğe seçilince kapanır (closeOnSelect). Bu site ⌘K'yı kendi araması için kullandığından örnek ⌘J kullanıyor.

Son komut: henüz yok

Filtreleme

Varsayılan olarak aramadaki her kelime öğenin value'sunda ya da keywords'ünde geçmelidir; büyük/küçük harf ve aksanlar yok sayılır ("cafe", "Café"yi bulur). Farklı eşleştirmek için filter ver; filtrelemeyi sunucuda yapıp yalnızca eşleşen öğeleri render'lıyorsan shouldFilter={false} kullan.

<Command.Root filter={(value, search) => value.toLowerCase().startsWith(search.toLowerCase())}>

Öğe kısayolları

shortcut, tuşları Shortcut ile gösterir; komut menüsünde focus varken bu tuşlara basmak öğeyi çalıştırır. Yazmanın engellenmemesi için kısayollarda bir değiştirici tuş (⌘, Ctrl ya da Alt) gerekir.

API referansı

Root

onSelect dışındaki tüm <div> attribute'larını kabul eder.

PropTipVarsayılanAçıklama
searchstring–Controlled arama metni.
defaultSearchstring""Uncontrolled kullanımda başlangıç arama metni.
onSearchChange(search: string) => void–Arama metni değişince çağrılır.
filter(value, search, keywords) => boolean–Özel eşleştirme fonksiyonu. Varsayılanı büyük/küçük harf ve aksan duyarsız kelime eşleştirmesi.
shouldFilterbooleantrueÖğeleri kendin filtrelemek için false ver.
loopbooleantrueOk tuşlarıyla sondan başa döner.
onSelect(value: string) => void–Seçilen her öğenin değeriyle, öğenin kendi onSelect'inden sonra çağrılır.
labelstring"Command menu"Arama kutusunun erişilebilir adı.
resultsLabel(count: number) => string"N results"Arama sırasında ekran okuyuculara bildirilen durum metni.
shortcutLabelsShortcutKeyLabels–Öğe kısayolları için okunan tuş adları; İngilizce varsayılanlarla birleştirilir.
refRef<HTMLDivElement>–Root elemanına iletilen ref.

Input

value, defaultValue, onChange ve type dışındaki tüm <input> attribute'larını kabul eder; arama metni Root'ta tutulur.

PropTipVarsayılanAçıklama
placeholderstring"Type a command or search…"Placeholder metni.
onValueChange(search: string) => void–Yeni arama metniyle çağrılır.
refRef<HTMLInputElement>–Input'a iletilen ref.

List, Empty, Group, Separator

PropTipVarsayılanAçıklama
List labelstring"Suggestions"Listbox'ın erişilebilir adı.
Empty childrenReactNode"No results found."Hiçbir öğe eşleşmediğinde gösterilir.
Group headingReactNode–Görünür başlık; grubun adı da olur.
Separator alwaysRenderbooleanfalseArama yazılırken de separator'ı gösterir.

Item

onSelect dışındaki tüm <div> attribute'larını kabul eder.

PropTipVarsayılanAçıklama
valuestring–Filtreleme ve onSelect için benzersiz değer. Children string ise varsayılanı o metindir.
keywordsstring[]–Eşleşen ek arama terimleri.
onSelect(value: string) => void–Öğe tıklama, Enter ya da kısayoluyla seçildiğinde çağrılır.
disabledbooleanfalseOk tuşları atlar, tıklamalar yok sayılır.
leadingReactNode–Etiketten önce gösterilen ikon.
shortcutstring[]–Etiketten sonra gösterilen tuşlar, örneğin ["mod", "s"]; öğeyi de çalıştırır.
refRef<HTMLDivElement>–Seçeneğe iletilen ref.

Dialog

Root'un tüm prop'larını ve şunları alır:

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.
shortcutstring[] | null["mod", "k"]Dialog'u açıp kapatan global tuş kombinasyonu; null verirsen kapanır.
closeOnSelectbooleantrueBir öğe seçilince dialog'u kapatır.
containerElement | nulldocument.bodyPortal hedefi.

Stil verme

SınıfEleman
.mrd-commandRoot
.mrd-command__input-wrap, .mrd-command__inputArama satırı ve input
.mrd-command__listList
.mrd-command__group, .mrd-command__headingGroup ve başlığı
.mrd-command__itemItem
.mrd-command__leading, .mrd-command__label, .mrd-command__shortcutItem parçaları
.mrd-command__empty, .mrd-command__separatorEmpty ve Separator
.mrd-command-dialogDialog yüzeyi
AttributeNeredeDeğerler
data-activeItemaktif öğede bulunur
data-disabledItemdevre dışıyken bulunur
data-valueItemöğenin değeri

Erişilebilirlik

Listbox'ı hep görünen WAI-ARIA Combobox desenini izler. Focus input'tan hiç ayrılmaz; aktif seçenek aria-activedescendant ile bildirilir, sonuç sayısı polite bir live region'da okunur. Hiçbir şey eşleşmezse liste listbox olmaktan çıkar ve input aria-expanded="false" bildirir. Okunan her metin bir prop'tur.

TuşNe yapar
ArrowDownSonraki öğe; sona gelince başa döner (devre dışı öğeleri atlar).
ArrowUpÖnceki öğe; başa gelince sona döner.
PageUpİlk öğe.
PageDownSon öğe.
EnterAktif öğeyi çalıştırır.
⌘ / CtrlKCommand.Dialog: sayfanın her yerinden açar ya da kapatır.
EscapeCommand.Dialog: kapatır ve focus'u geri verir.

Kullanım ilkeleri

Yap

Öğeleri bir fiille ya da hedefle adlandır ("Yeni proje", "Faturalandırmaya git") ve türüne göre grupla.

Kaçın

Bir aksiyona ulaşmanın tek yolunu komut menüsü yapmak. Komut menüsü, ne istediğini bilenler için bir kısayoldur.

İlgili sayfalar

  • Shortcut: öğelerde gösterilen tuş kombinasyonları.
  • Dialog: Command.Dialog'un arkasındaki modal.
  • Select: bir form için tek değer seçmek.