Combobox
Aranabilir select: yazarak filtrele, bir ya da birden çok seçenek seç, ya da kullanıcı yazdıkça seçenekleri sunucudan yükle.
const frameworks = [
{ value: "next", label: "Next.js" },
{ value: "remix", label: "Remix" },
{ value: "gatsby", label: "Gatsby", disabled: true },
{ value: "nuxt", label: "Nuxt", description: "Vue" },
];
<Field label="Framework">
<Combobox
options={frameworks}
placeholder="Framework ara…"
locale="tr-TR"
emptyMessage="Sonuç yok"
loadingMessage="Yükleniyor…"
toggleLabel="Seçenekleri göster"
getRemoveLabel={(label) => label + " öğesini kaldır"}
name="framework"
/>
</Field>Import
import { Combobox, type ComboboxOption } from "@meridui/react";Örnekler
Çoklu seçim
multiple her seçimden sonra listeyi açık tutar ve seçimleri çip olarak gösterir. value bir string[] olur. Alan boşken Backspace son çipi kaldırır.
İstediğin kadar seç.
const [value, setValue] = useState<string[]>(["next", "vite"]);
<Field label="Teknoloji yığını" description="İstediğin kadar seç.">
<Combobox multiple options={frameworks} value={value} onValueChange={setValue} placeholder="Ekle…" />
</Field>Async seçenekler
onInputValueChange içinde veriyi çek, sonuçları options olarak ver, component tekrar filtrelemesin diye filter={false} yap ve istek sürerken loading ver. Seçilen seçeneklerin etiketleri hatırlanır; sonuçlar değişse de çipler ve alan metnini korur.
const [text, setText] = useState("");
const [options, setOptions] = useState<ComboboxOption[]>([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (!text.trim()) return;
setLoading(true);
const timer = setTimeout(async () => {
setOptions(await searchCities(text));
setLoading(false);
}, 200);
return () => clearTimeout(timer);
}, [text]);
<Combobox
options={options}
filter={false}
loading={loading}
onInputValueChange={setText}
emptyMessage="Şehir bulunamadı"
/>Boyutlar ve durumlar
<Combobox aria-label="Küçük" size="sm" options={frameworks} />
<Combobox aria-label="Geçersiz" invalid options={frameworks} />
<Combobox aria-label="Devre dışı" disabled options={frameworks} defaultValue="astro" />API referansı
Bir div sarmalayıcı render'lar; diğer div attribute'ları ona gider. aria-label ve aria-labelledby metin alanına gider. Bir Field içinde alan id'yi, etiketi, açıklamayı, hatayı, required ve disabled'ı alır.
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
optionsZorunlu | ComboboxOption[] | – | { value, label, description?, disabled? }. Async sonuçlar geldikçe değiştir. |
multiple | boolean | false | Birden çok değer seçtirir; çip olarak gösterilir. |
value | string | string[] | – | Controlled değer: string ("" seçim yok) ya da multiple ile string[]. |
defaultValue | string | string[] | – | Uncontrolled kullanımda başlangıç değeri. |
onValueChange | (value) => void | – | Yeni değerle çağrılır. |
inputValue | string | – | Alandaki controlled metin. |
defaultInputValue | string | – | Başlangıç metni. Varsayılanı seçili etiket. |
onInputValueChange | (text: string) => void | – | Her tuşta çağrılır; async seçenekleri burada çek. |
open / defaultOpen / onOpenChange | boolean / boolean / (open) => void | – | Listenin controlled ya da başlangıç açık state'i. |
filter | ((option, text) => boolean) | false | etiket metni içerir | İstemci tarafı filtre. Seçenekler zaten filtreliyse false. |
locale | string | – | Büyük/küçük harf duyarsız eşleşme için locale; "tr-TR" ile İ ve i eşleşir. |
loading | boolean | false | loadingMessage'ı gösterir, listeye aria-busy ekler. |
placeholder | string | – | Metin alanının placeholder'ı. |
emptyMessage | ReactNode | "No results" | Eşleşme yokken gösterilir. Türkçe arayüzde "Sonuç yok". |
loadingMessage | ReactNode | "Loading…" | Yüklenirken gösterilir. Türkçe arayüzde "Yükleniyor…". |
toggleLabel | string | "Show options" | Ok butonunun erişilebilir adı. |
getRemoveLabel | (label: string) => string | Remove {label} | Çipteki kaldır butonunun erişilebilir adı. |
size | "sm" | "md" | "lg" | "md" | Kontrol boyutu. |
invalid | boolean | – | aria-invalid ve danger kenarlık. Field içinde hatasından türetilir. |
disabled | boolean | – | Combobox'ı devre dışı bırakır. |
required | boolean | – | Alanı zorunlu işaretler. |
name | string | – | Form adı. Seçili her değer için gizli bir input render'lar. |
inputId | string | – | <label htmlFor> için metin alanının id'si. |
placement | Placement | "bottom-start" | Listenin tercih edilen konumu. |
container | Element | null | document.body | Listenin portal hedefi. |
inputRef | Ref<HTMLInputElement> | – | Metin alanının ref'i. |
ref | Ref<HTMLDivElement> | – | Sarmalayıcının ref'i. |
Stil verme
| Sınıf | Eleman |
|---|---|
.mrd-combobox | Sarmalayıcı (data-size, data-state, data-multiple, data-invalid, data-disabled) |
.mrd-combobox__control | Çipleri, input'u ve oku tutan kenarlıklı alan |
.mrd-combobox__input, .mrd-combobox__toggle | Metin alanı, ok butonu |
.mrd-combobox__chip, .mrd-combobox__chip-remove | Seçili değer çipi (multiple) |
.mrd-combobox__content, .mrd-combobox__listbox | Portal ile render'lanan açılır panel ve listbox'ı |
.mrd-combobox__item | Seçenek (data-active, data-disabled, aria-selected) |
.mrd-combobox__status | Yükleniyor / boş mesajı |
Erişilebilirlik
WAI-ARIA listbox açılır panelli Combobox desenine ve liste otomatik tamamlamaya uyar. Focus metin alanında kalır; vurgulanan seçenek aria-activedescendant ile bildirilir. Yükleniyor ve boş mesajları bir role="status" bölgesidir, yani ekran okuyucu tarafından okunur. Çiplerin kaldır butonları Tab sırasında yer almaz; alan boşken Backspace'i ya da fareyi kullan.
| Tuş | Ne yapar |
|---|---|
| ArrowDown | Listeyi açar ya da sonraki seçeneği vurgular (başa döner). |
| ArrowUp | Listeyi son seçenekte açar ya da önceki seçeneği vurgular (sona döner). |
| AltArrowDown | Vurguyu değiştirmeden açar. |
| Enter | Vurgulanan seçeneği seçer. Tekli: kapanır. Çoklu: seçimi değiştirir, açık kalır. |
| Escape | Listeyi kapatır; tekli modda seçili etiketi geri yükler. |
| Backspace | Çoklu, alan boşken: son çipi kaldırır. |
| Tab | Kapatır ve sonraki elemana geçer. |
Kullanım ilkeleri
Yap
Liste uzunsa (20+ öğe) ya da sunucudan geliyorsa ve kullanıcı ne aradığını biliyorsa Combobox kullan.
Kaçın