Select

Stilli bir listeden tek bir seçenek seç.

KararlıKaynak kod
Bölge

Import

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

Anatomi

tsx
<Select.Root>
  <Select.Trigger />
  <Select.Content>
    <Select.Item value="a">A</Select.Item>
  </Select.Content>
</Select.Root>
  • Root değeri ve açık state'ini tutar; name verildiğinde gizli bir <input> render'lar.
  • Trigger, role="combobox" butonudur. Seçili etiketi ya da placeholder'ı gösterir.
  • Content, portal ile render'lanan role="listbox" elemanıdır. Seçenekler etiketlerini bildirebilsin diye (gizli olarak) mount'lu kalır.
  • Item, tek bir role="option" elemanıdır. Metin children'ı etikettir; tetikleyicide gösterilir ve yazarak arama (typeahead) için kullanılır.

Örnekler

Controlled

value ve onValueChange ver. Boş string hiçbir şeyin seçili olmadığı anlamına gelir ve placeholder gösterilir.

Değer: (yok)

Boyutlar ve devre dışı

Form içinde

Root'a name (istersen required ve form da) ver. Gönderimde değeri gizli bir input taşır.

tsx
<form>
  <Select.Root name="region" required>
    <Select.Trigger aria-label="Bölge" />
    <Select.Content>…</Select.Content>
  </Select.Root>
</form>

API referansı

Root

PropTipVarsayılanAçıklama
valuestring–Controlled seçili değer ("" hiçbir şeyin seçili olmadığı anlamına gelir).
defaultValuestring""Uncontrolled kullanımda başlangıç değeri.
onValueChange(value: string) => void–Yeni seçilen değerle çağrılır.
openboolean–Controlled açık state'i.
defaultOpenbooleanfalseUncontrolled kullanımda başlangıçtaki açık state'i.
onOpenChange(open: boolean) => void–Açık state'i değişmesi gerektiğinde çağrılır.
namestring–Form alanı adı; değeri taşıyan gizli bir input render'lar.
requiredboolean–Gizli input'u zorunlu olarak işaretler.
disabledbooleanfalseSelect'in tamamını devre dışı bırakır.
placeholderReactNode"Select…"Değer seçilmemişken tetikleyicide gösterilir. Türkçe arayüzde Türkçe bir değer ver, örneğin "Seç…".
formstring–Gizli input'u id ile bir forma bağlar.
childrenReactNode–Trigger ve Content.

Trigger

value dışındaki tüm <button> attribute'larını kabul eder. Children verilirse gösterilen etiketin yerine geçer. Verdiğin id korunur (böylece <label htmlFor> çalışır) ve listbox bu id ile etiketlenmeye devam eder. Bir Field içinde tetikleyici, her Merid kontrolü gibi bağlantıları devralır: field'ın id'si ve etiketi (aria-labelledby), açıklama ve hata için aria-describedby, aria-invalid + data-invalid, aria-required ve disabled. Açıkça verilen prop'lar önceliklidir.

PropTipVarsayılanAçıklama
size"sm" | "md" | "lg""md"Kontrol boyutu.
invalidboolean–Alanı geçersiz olarak işaretler: anlam için `aria-invalid`, danger kenarlığı için `data-invalid`. Field içindeyse onun error değerinden türetilir.
refRef<HTMLButtonElement>–Combobox butonuna iletilen ref.

Content

Tüm <div> attribute'larını kabul eder. Listbox, tetikleyicinin genişliğini alır.

PropTipVarsayılanAçıklama
placementPlacement"bottom-start"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>–Listbox'a iletilen ref.

Item

children dışındaki tüm <div> attribute'larını kabul eder. Senin onClick ve onPointerMove handler'ların önce çalışır; seçeneği seçmeyi ya da vurgulamayı atlamak için içlerinde event.preventDefault() çağır.

PropTipVarsayılanAçıklama
valueZorunlustring–Form ile gönderilen ve onValueChange ile bildirilen değer.
childrenZorunlustring–Görünür etiket. Tetikleyicide ve yazarak aramada da kullanılır.
disabledbooleanfalseSeçeneği devre dışı bırakır.

Stil verme

SınıfEleman
.mrd-select__triggerTrigger
.mrd-select__value, .mrd-select__iconTetikleyici etiketi ve chevron
.mrd-select__contentListbox
.mrd-select__item, .mrd-select__item-text, .mrd-select__checkSeçenek, metni, seçili işareti
AttributeNeredeDeğerler
data-stateTrigger, Contentopen, closed
data-sizeTriggersm, md, lg
data-placeholderTriggerdeğer seçilmemişken bulunur
data-invalidTriggergeçersizken bulunur (danger kenarlığını sağlar)
data-activeItemklavye ya da işaretçiyle vurgulanan seçenekte bulunur
data-disabledItemdevre dışıyken bulunur
aria-selected="true"Itemseçili seçenek

Tetikleyici yüksekliği, data-size değerine göre ayarlanan --mrd-select-height değişkeninden gelir.

Erişilebilirlik

WAI-ARIA Select-Only Combobox desenini izler. Focus tetikleyicide kalır; vurgulanan seçenek aria-activedescendant ile bildirilir. Tetikleyiciye aria-label, aria-labelledby ya da bir <label htmlFor> tarafından gösterilen bir id ile erişilebilir bir ad ver.

TuşNe yapar
EnterAçar ya da vurgulanan seçeneği seçip kapatır.
SpaceAçar ya da vurgulanan seçeneği seçip kapatır.
ArrowDownAçar ya da sonraki seçeneği vurgular.
ArrowUpAçar ya da önceki seçeneği vurgular.
Homeİlk seçeneği vurgular.
EndSon seçeneği vurgular.
A–ZYazarak arama. Kapalıyken eşleşeni doğrudan seçer.
TabVurgulanan seçeneği seçer, kapatır ve focus'u sonrakine taşır.
EscapeDeğeri değiştirmeden kapatır.

Kullanım ilkeleri

Yap

Select'i, listenin kendisinin tanıdık olduğu 5–15 seçenek için kullan (ülkeler, bölgeler, paketler).

Kaçın

İki üç seçenek için Select kullanmak. Onları Radio ya da bir SegmentedControl olarak göster.

Yap

Tetikleyiciyi her zaman görünür bir etiketle birlikte kullan.

Kaçın

Tek etiket olarak placeholder'a güvenmek; bir değer seçildiği anda kaybolur.

İlgili sayfalar

  • NativeSelect: platformun <select> elemanı; mobilde ve uzun listelerde en iyisi.
  • DropdownMenu: değerler için değil, aksiyonlar için.
  • Field: bir kontrolün çevresinde etiket, ipucu ve hata.