@akhatmirzo/ui

Combobox

Qidiruvli tanlash: o'zbekcha harflarni tushunadigan qidiruv, bir nechta tanlov, yangi variant yaratish va server qidiruvi.

Hali tanlanmagan

Import

import { Combobox, type ComboboxOption } from '@akhatmirzo/ui';

Qachon ishlatish

  • Ro'yxat uzun bo'lsa — shaharlar, tumanlar, mijozlar, mahsulotlar. 10–15 tadan ko'p variantni ko'z bilan qidirish qiyin, yozib topish tezroq.
  • Bir nechta qiymat kerak bo'lsa — multiple: teglar, filiallar, mas'ul xodimlar.
  • Ro'yxatda yo'q qiymat ham bo'lishi mumkin bo'lsa — creatable (yangi teg, yangi toifa).
  • Ma'lumot serverda bo'lsa — onSearch va loading bilan har bir so'rovni serverga yuborasiz.
  • Variantlar kam va qidiruv kerak bo'lmasa — oddiy Select yetarli.

O'zbekcha qidiruv

Qidiruv @akhatmirzo/core dagi searchMatch bilan ishlaydi va o'zbek yozuvining odatiy "chalkashliklarini" kechiradi:

  • Apostrof turlari bir xil: gʻ, g', g‘, g’ — barchasi bitta harf. Foydalanuvchi apostrofni umuman yozmasa ham topiladi: ulugbek → "Mirzo Ulug'bek".
  • Kirill ↔ lotin: Чилонзор yozilsa "Chilonzor" topiladi, Тошкент — "Toshkent".
  • Registr farqi yo'q: TOSHKENT, toshkent — bir xil.
  • So'z o'rtasidan ham: chirchiq → "Oʻrta Chirchiq".
  • Mos kelgan qism qalin bilan ajratiladi — description matnida ham.

Yozib ko'ring: guzor, g‘allaorol, Чилонзор, ulugbek

O'z qidiruvingizda ham ishlating

Xuddi shu funksiyalar alohida eksport qilinadi: searchMatch, normalizeUz, splitByRanges — core/text sahifasiga qarang. Server qidiruvida ham so'rovni normalizeUz bilan normallashtirish foydali.

Bir nechta tanlov

multiple bilan value massiv bo'ladi (string[]). Tanlanganlar trigger ichida Badge ko'rinishida turadi va ✕ bilan olib tashlanadi. Panel har tanlovdan keyin ochiq qoladi; qidiruv bo'sh bo'lganda Backspace oxirgi tanlovni o'chiradi.

2 ta tanlangan

ToshkentSamarqand

Yangi variant yaratish

creatable yoqilsa va qidiruv matni mavjud variantlarning birortasiga to'liq mos kelmasa, ro'yxat oxirida "«matn» yaratish" elementi chiqadi. onCreate yangi variantni qaytarsa, aynan u tanlanadi; hech narsa qaytarmasa — qiymat va nom sifatida matnning o'zi olinadi. Yangi variantni options ga o'zingiz qo'shasiz.

Ro'yxatda yo'q tegni yozing va Enter bosing

frontend

Server qidiruvi

onSearch berilsa, mahalliy filtr o'chadi: so'rov 300ms debounce bilan sizga keladi, siz esa yangi options ni berasiz. Javob kutilayotganda loading ro'yxat o'rnida spinner ko'rsatadi. Panel yopilganda onSearch('') chaqiriladi — boshlang'ich ro'yxatni qaytarish uchun qulay.

Tanlangan qiymat yo'qolmaydi

Serverdan kelgan yangi ro'yxatda tanlangan variant bo'lmasa ham, Combobox uning nomini eslab qoladi va triggerda to'g'ri ko'rsatadi.

Izoh va ikonkalar

ComboboxOption da description (ikkinchi qator), icon va disabled bor. Qidiruv izoh matnida ham ishlaydi. Triggerdagi lupa ikonkasini leftIcon={null} bilan olib tashlaysiz yoki o'zingiznikiga almashtirasiz.

interface ComboboxOption {
  value: string;
  label: string;
  description?: string;
  icon?: ReactNode;
  disabled?: boolean;
}

O'lchamlar

Input va Select bilan bir xil: 32, 40 va 48px. multiple da balandlik tanlovlar soniga qarab o'sadi.

Holatlar

Field ichida disabled, error va required o'zi ulanadi. loading panel ochilganda ro'yxat o'rnida spinner ko'rsatadi.

Shaharni tanlang

Dialog ichida

Dialog yoki Drawer ichida Combobox paneli modal qatlamiga o'tadi va oyna ustida ochiladi — hech narsa sozlash shart emas.

Props

Combobox

Qolgan <button> atributlari (id, aria-label, aria-*, data-*, onBlur ...) va ref triggerga uzatiladi.

PropTipStandartTavsif
optionsmajburiyComboboxOption[]—Variantlar ro'yxati
multiplebooleanfalseBir nechta tanlov: value — string[]
valuestring | null · string[]—Tanlangan qiymat (multiple da massiv)
defaultValuestring | null · string[]—Boshlang'ich qiymat
onValueChange(value: string | null) => void · (value: string[]) => void—Qiymat o'zgarganda. Tozalanganda — null (yoki [])
placeholderstring'Tanlang'Qiymat yo'q paytdagi matn
searchPlaceholderstring'Qidirish...'Qidiruv maydonidagi matn
emptyTextReactNode'Hech narsa topilmadi'Natija bo'lmaganda
onSearch(query: string) => void—Server qidiruvi: 300ms debounce, mahalliy filtr o'chadi
loadingbooleanfalseRo'yxat o'rnida spinner
creatablebooleanfalse"«matn» yaratish" elementi
onCreate(text: string) => ComboboxOption | void—Yaratilganda. Qaytarilgan variant tanlanadi
clearablebooleanfalseQiymat bo'lsa ✕ (tozalash) tugmasi
leftIconReactNodelupa ikonkasiTrigger chapidagi ikonka; null — ikonkasiz
size'sm' | 'md' | 'lg''md'Balandlik: 32 / 40 / 48px
invalidboolean—Xato holati (Field ichida — avtomatik)
disabledboolean—Combobox'ni o'chiradi
requiredboolean—Majburiy maydon (aria-required)
namestring—Forma uchun: har bir tanlov yashirin <input> sifatida yuboriladi
openboolean—Panel ochiqmi (boshqariladigan rejim)
defaultOpenbooleanfalseBoshida ochiq
onOpenChange(open: boolean) => void—Ochilib-yopilganda
labelsComboboxLabels—Ekran o'quvchi matnlari (pastda)
contentClassNamestring—Panel klassi

ComboboxLabels

Inglizcha yoki boshqa tildagi interfeys uchun matnlarni almashtiring.

PropTipStandartTavsif
searchstring'Qidirish'Qidiruv maydoni nomi
liststring'Variantlar'Ro'yxat nomi
loadingstring'Yuklanmoqda'Spinner matni
clearstring'Tozalash'✕ tugmasi nomi
remove(label: string) => string`Olib tashlash: ${label}`Badge'dagi ✕ nomi
create(text: string) => ReactNode`«${text}» yaratish`Yaratish elementi matni

Data atributlari

AtributQayerdaQiymat
data-sizekonteynersm · md · lg
data-statekonteyneropen · closed
data-invalidkonteynerxato holatida mavjud
data-disabledkonteynero'chirilganda mavjud
data-placeholdertriggerqiymat tanlanmaganda mavjud
data-checkedvarianttanlangan variantda mavjud

Klaviatura

TugmaHarakat
Enter / Space / ↓ / ↑Trigger fokusda — panelni ochadi
Harf yoki raqamYopiq triggerda — panelni ochadi va qidiruvni shu belgidan boshlaydi
YozishOchiq panelda — qidiruv
↓ / ↑Variantlar bo'ylab yurish (aylanma)
Home / EndBirinchi / oxirgi variant
EnterTanlash. Bitta tanlovda panel yopiladi, multiple da ochiq qoladi
EscAvval qidiruvni tozalaydi, ikkinchi marta — panelni yopadi
Backspacemultiple: qidiruv bo'sh bo'lsa — oxirgi tanlovni o'chiradi
TabPanelni yopadi va fokusni keyingi elementga o'tkazadi

Accessibility

  • Rollar. Trigger — role="combobox", aria-haspopup="listbox", ochiq bo'lganda aria-controls ro'yxatga ishora qiladi. Ro'yxat listbox, multiple da aria-multiselectable="true"; har bir variantda aria-checked.
  • Nom. Field ichida label va tanlangan qiymat birga o'qiladi ("Shahar, Toshkent"). multiple da tanlanganlar ro'yxati ekran o'quvchi uchun yashirin matn sifatida qo'shiladi.
  • Field bilan bog'lanish. description va error — aria-describedby, xatoda aria-invalid="true", required da aria-required="true".
  • Badge'dagi ✕ har bir tanlov uchun alohida nom oladi ("Olib tashlash: Toshkent") — labels.remove bilan o'zgartiriladi.
  • Fokus. Panel ochilganda fokus qidiruv maydoniga o'tadi, yopilganda triggerga qaytadi (Tab bilan yopilsa — keyingi elementga).
  • Ikonkalar (leftIcon, variant icon) aria-hidden.

Sahifada