Combobox
Çipler, gruplar ve asenkron sonuçlar içeren, siz yazdıkça boyutu değişen bir açılır pencerede filtrelenebilir bir select.
pnpm dlx shadcn@latest add https://hextaui.com/r/combobox.jsonBileşeni, HextaUI tema token'larını ve bileşenin bağımlı olduğu tüm HextaUI bileşenlerini ekler.
Henüz eklemediyseniz tema token'larını global CSS'inize ekleyin.
Bağımlılıkları yükleyin.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/combobox.tsx İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Seçenekleri items'a geçin ve her birini <ComboboxList /> içindeki bir fonksiyonla render edin. Combobox, siz yazdıkça onları filtreler ve yalnızca eşleşmeleri render eder. Nesneler de çalışır: label değerleri girdide gösterilir, value değerleri gönderilir.
Listeyi filtrelemek için alana yazın.
Bir düğme değeri gösterir ve arama alanı popup'ın içine taşınır.
multiple ile her seçili öğe girdiden önce bir chip olur.
Temizle düğmesi
showClear bir değer varken okun yerini alan bir temizle düğmesi ekler; böylece alan asla büyümez.
Simgelerle
Bir öğenin içindeki simgeler sizin için boyutlandırılır ve soluklaştırılır. autoHighlight yazarken ilk eşleşmeyi vurgular; böylece Enter onu seçer.
Gruplar ve ayırıcılar
{ value, items } biçiminde gruplar geçin ve her birini <ComboboxGroup />, <ComboboxLabel /> ve <ComboboxCollection /> ile render edin. Boş gruplar filtreleme sırasında gizlenir.
Çoklu
multiple ile seçimler <ComboboxChips /> içinde chip olur. Siz seçerken popup açık kalır, boş girdide Backspace son chip'i kaldırır ve ok tuşları chip'ler arasında gezinir.
Popup içinde ara
Select benzeri bir alan için <ComboboxTrigger /> kullanın. Girdiyi <ComboboxContent /> içine koyarsanız simgeli bir arama kutusuna dönüşür ve popup en az 15rem'e genişler.
Button olarak render edilen trigger
Herhangi bir düğmeyi kullanmak için trigger'a render geçin. Popup ona sabitlenir ve en az onun genişliğini korur.
Kontrollü
Seçimi value ve onValueChange ile, popup'ı open ve onOpenChange ile kontrol edin. Temizlemek değeri null yapar.
Devre dışı, geçersiz ve devre dışı öğeler
Kökteki disabled alanı ve düğmelerini soluklaştırır. Girdideki aria-invalid hata halkasını çizer. Devre dışı öğeler ok tuşlarıyla atlanır.
Uzun içerik ve büyük listeler
Uzun ve kırılmayan etiketler popup'ı genişletmek yerine sarar. limit kaç eşleşmenin render edileceğini sınırlar; bu, 500 öğelik bir listeyi hızlı tutar.
Asenkron arama
Yerleşik filtrelemeyi filter={null} ile kapatın, onInputValueChange üzerinde veri çekin ve ilerlemeyi ekran okuyuculara duyuran <ComboboxStatus /> içinde gösterin. Sonuçlar değiştikçe popup yüksekliği animasyonlanır.
Sheet içinde
Popup sheet'in üstünde katmanlanır ve Escape, sheet'ten önce popup'ı kapatır.
Sağdan sola
Popup alanın yönünü alır; böylece temizle düğmesi, chip'ler ve öğeler ek prop olmadan yansıtılır.
| Tuş | Action |
|---|---|
| ↓↑ | Popup'ı açar ve vurguyu eşleşmeler arasında taşır. Devre dışı öğeler atlanır. |
| Enter | Vurgulanan öğeyi seçer. Hiçbir şey vurgulanmamışsa popup'ı kapatır ve formun gönderilmesine izin verir. |
| Escape | Popup'ı kapatır. Zaten kapalıysa değeri ve girdiyi temizler. |
| HomeEnd | Metin imlecini girdinin başına veya sonuna taşır. |
| Backspace | Boş bir chip girdisinde son chip'i kaldırır. Odaktaki bir chip'te onu kaldırır. |
| ←→ | Chip'lerle, odağı chip'ler arasında ve girdiye geri taşır. Sağdan sola düzenlerde yansıtılır. |
| Tab | Popup'ı kapatır ve odağı ilerletir. |
- Girdiye
idvehtmlForile görünür bir<label>veya biraria-labelverin. Görünür metni olmayan bir<ComboboxTrigger />bileşeni de biraria-labelgerektirir. - Ok düğmesi “Show options”, temizle düğmesi “Clear selection” ve her chip'in kaldır düğmesi “Remove” olarak etiketlenir.
- Vurgu
aria-activedescendantile hareket eder; böylece gezinirken odak girdide kalır. - Girdiler dokunmatik ekranlarda 16px yazı tipi kullanır; böylece iOS yakınlaştırmaz ve öğeler 44px'lik bir dokunma hedefine büyür.
Base UI combobox üzerine kuruludur. Her parça, sardığı primitive'in prop'larını kabul eder; tablolar en çok kullanacaklarınızı listeler.
| Prop | Tür | Varsayılan |
|---|---|---|
itemsSeçenekler. Yazdıkça filtrelenir ve listenin render fonksiyonuna geçirilir. | Item[] | Group[] | – |
multipleChip olarak gösterilen birden fazla değer seçin. | boolean | false |
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
inputValue | string | – |
defaultInputValue | string | – |
onInputValueChange | (inputValue: string, details) => void | – |
filterÖzel eşleştirme. null, sunucu tarafı arama için filtrelemeyi kapatır. | ((item, query, itemToString) => boolean) | null | – |
limitRender edilecek en fazla eşleşme sayısı. -1 tümü demektir. | number | -1 |
autoHighlightYazarken ilk eşleşmeyi vurgulayın. | boolean | false |
highlightItemOnHover | boolean | true |
openOnInputClick | boolean | true |
loopFocusVurguyu son öğeden ilkine sarın. | boolean | true |
itemToStringLabelBir nesne öğesi için girdide gösterilen metin. | (item) => string | – |
itemToStringValueBir nesne öğesi için formla birlikte gönderilen değer. | (item) => string | – |
isItemEqualToValue | (item, value) => boolean | – |
name | string | – |
required | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
modalAçıkken sayfa kaydırmasını ve dış tıklamaları kilitler. | boolean | false |
virtualizedÖğeler bir virtualizer ile render edilirken ayarlayın. | boolean | false |
localeEşleştirme için kullanılan yerel ayar (locale). | Intl.LocalesArgument | – |
Popup'ın dışında tam alanı render eder. <ComboboxContent /> içinde kompakt bir arama kutusuna dönüşür.
| Prop | Tür | Varsayılan |
|---|---|---|
showTriggerOk düğmesini gösterin. Ayarlanmadıkça popup içinde her zaman kapalıdır. | boolean | true outside the popup |
showClearBir değer varken ok yerine bir temizle düğmesi gösterin. | boolean | false |
classNameGirdinin çevresindeki girdi grubuna uygulanır. | string | – |
disabled | boolean | false |
placeholder | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-input-group" | Girdinin çevresindeki alan. |
data-slot="combobox-input" | Metin girdisi. |
data-slot="combobox-input-actions" | Ok ve temizle düğmelerini tek bir üst üste hücrede tutar. |
data-popup-open | Popup açıkken girdide bulunur. |
data-popup-side | Popup'ın açıldığı taraf. |
data-list-empty | Hiçbir şey eşleşmediğinde bulunur. |
data-disabled | Devre dışıyken bulunur. |
data-invalid | Bir Base UI Field içinde geçersiz olduğunda bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
childrenGenellikle bir <ComboboxValue />. Ok, ondan sonra eklenir. | ReactNode | – |
renderAyarlandığında yerleşik alan stilleri atlanır. | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-trigger" | Trigger düğmesi. |
data-slot="combobox-trigger-value" | Kısaltılmış değeri sarar. |
data-slot="combobox-trigger-icon" | Ok. Açıkken ters döner. |
data-popup-open | Popup açıkken bulunur. |
data-placeholder | Hiçbir değer seçili değilken bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
childrenSeçili değeri kendiniz render edin; örneğin chip olarak. | ReactNode | (value) => ReactNode | – |
placeholderHiçbir şey seçili değilken gösterilir. | ReactNode | – |
| Prop | Tür | Varsayılan |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
alignOffset | number | 0 |
anchorBaşka bir öğeye göre konumlandırın. Varsayılan olarak alandır. useComboboxAnchor'a bakın. | Element | RefObject<Element | null> | VirtualElement | (() => Element | VirtualElement | null) | null | – |
dirVarsayılan olarak alanın yönüdür. | "ltr" | "rtl" | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-positioner" | Popup'ı konumlandırır. |
data-slot="combobox-content" | Popup yüzeyi. |
data-slot="combobox-content-sizer" | Eşleşmeler değiştikçe popup yüksekliğini animasyonlamak için ölçülür. |
data-open | Açıkken bulunur. |
data-side | Açıldığı taraf. |
data-align | Hizalaması. |
data-empty | Hiçbir şey eşleşmediğinde bulunur. |
data-starting-style | Giriş animasyonu sırasında bulunur. |
data-ending-style | Çıkış animasyonu sırasında bulunur. |
--combobox-item-radius | Popup yarıçapından dolgusu çıkarılarak türetilen öğe yarıçapı. |
| Prop | Tür | Varsayılan |
|---|---|---|
childrenitems içindeki her eşleşme için çağrılır. | ReactNode | (item, index) => ReactNode | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-list" | Kayan liste. |
| Prop | Tür | Varsayılan |
|---|---|---|
valueBu satırın temsil ettiği öğe. | Item | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-item" | Bir seçenek. |
data-slot="combobox-item-indicator" | Seçildiğinde ölçeklenerek gelen onay işareti. |
data-highlighted | Vurgulanmışken bulunur. |
data-selected | Seçiliyken bulunur. |
data-disabled | Devre dışıyken bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
itemsComboboxGroup üzerinde: grubun kendi öğeleri. | Item[] | – |
childrenComboboxCollection üzerinde: her eşleşmeyi render eder. | (item, index) => ReactNode | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-group" | Bir öğe grubu. |
data-slot="combobox-label" | Grup başlığı. |
<ComboboxEmpty /> alt öğelerini yalnızca hiçbir şey eşleşmediğinde gösterir. <ComboboxStatus /> yükleme ve sonuç mesajları için bir canlı bölgedir. İkisi de boşken hiçbir şeye daralır.
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-empty" | Sonuç yok mesajı. |
data-slot="combobox-status" | Canlı durum mesajı. |
data-slot="combobox-separator" | Gruplar arasındaki ayırıcı. |
| Prop | Tür | Varsayılan |
|---|---|---|
children | ReactNode | <IconX /> |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-clear" | “Clear selection” olarak etiketlenir. |
data-visible | Temizlenecek bir şey olduğunda bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
classNameChip'leri saran alana uygulanır. | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-chips" | Chip'leri ve girdiyi tutan alan. |
| Prop | Tür | Varsayılan |
|---|---|---|
showRemoveKaldır düğmesini gösterin. | boolean | true |
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-chip" | Seçili bir değer. |
data-slot="combobox-chip-label" | Kısaltılmış etiketi. |
data-slot="combobox-chip-remove" | “Remove” olarak etiketlenir. |
Chip'lerden sonra gelen metin girdisi. Base UI input ile aynı prop'ları kabul eder.
| Öznitelik | Açıklama |
|---|---|
data-slot="combobox-chips-input" | Chip girdisi. |
useComboboxAnchor()bir öğeye ve içeriktekianchor'a geçirilecek bir ref döndürür.useComboboxFilter()filteriçin yerel ayara duyarlıcontains,startsWithveendsWitheşleştiricilerini döndürür.useComboboxFilteredItems()sayımlar veya sanallaştırılmış listeler için geçerli eşleşmeleri okur.createComboboxItems(data, { getValue })seçim değeri tüm nesne yerine bir veritabanı anahtarı gibi ilkel bir id olan bir öğe koleksiyonu oluşturur.comboboxFieldVariantsözel alanlar oluşturmak için alan stillerini sunar.
- CalendarTekli, aralık ve çoklu seçim için, kayan aylar, aralık önizlemeleri ve dokunmaya uygun boyutta günler içeren bir tarih ızgarası.
- Checkboxİşareti çizilerek beliren, belirsiz üst öğeleri, grupları ve hover durumunu paylaşan etiketleri olan bir onay kutusu.
- Date pickerTek tarihler ve aralıklar için takvimi bir popover içinde, telefonlarda ise alt sayfa olarak açan bir düğme.
- FieldKontrolüne bağlanmış etiketler, açıklamalar ve hatalar; doğrulama durumları ve formlar için düzenler içerir.
- InputÜç boyutlu, geçersiz ve salt okunur durumları, yerel doğrulama stilleri ve telefonların asla yakınlaştırmaması için 16px dokunmatik yazı tipi olan bir metin girişi.
- Input groupSimgeler, metin, düğmeler ya da klavye ipucu eklenmiş; tek kenarlık ve odak halkasını paylaşan bir input.