@akhatmirzo/ui

TagInput

Teglar, kalit so'zlar va email ro'yxatini kiritish: Enter yoki vergul bilan qo'shish, paste, takliflar, tekshiruv va joyida tahrirlash.

  • React
  • TypeScript

Import

import { TagInput } from '@akhatmirzo/ui';

Qachon ishlatish

  • Erkin qiymatlar ro'yxati — teglar, kalit so'zlar, ko'nikmalar, bir nechta email yoki telefon.
  • Variantlar oldindan ma'lum bo'lsa — suggestions bering: foydalanuvchi yozishni boshlaganda ro'yxat chiqadi, lekin o'z qiymatini ham qo'sha oladi.
  • Faqat ro'yxatdagi variantlardan tanlash kerak bo'lsa — Combobox (multiple) to'g'riroq: u yangi qiymat yaratishga yo'l qo'ymaydi.
  • Bitta qiymat uchun oddiy Input ishlating.

Field bilan

Field ichida label ichki <input> ga ulanadi, izoh va xato aria-describedby ga tushadi. value + onValueChange — boshqariladigan rejim, defaultValue — boshqarilmaydigan.

Enter yoki vergul bilan qo'shing

  • dizayn
  • frontend

Qiymat: ["dizayn","frontend"]

Qo'shish va o'chirish

  • Enter yoki , — yozilgan matn tegga aylanadi (delimiters bilan o'zgartiriladi, masalan ['Enter', ',', 'Tab']). Bo'sh inputda Enter formani odatdagidek yuboradi.
  • Paste: "a, b, c" → 3 teg. Bir belgili ajratuvchilar va (Enter bo'lsa) yangi qatorlar bo'yicha bo'linadi.
  • Takror teglar qo'shilmaydi — taqqoslash katta-kichik harfga qaramaydi (allowDuplicates bilan ruxsat beriladi).
  • transform — matnni tegga aylantirish (standart — trim).
  • Teg ustiga ikki marta bosing (yoki fokusda Enter / F2) — joyida tahrirlanadi: Enter saqlaydi, Esc bekor qiladi, matnni o'chirsangiz teg olib tashlanadi.

Takliflar

suggestions berilsa, yozish paytida mos variantlar ro'yxati chiqadi. Qidiruv normalizeUz bilan ishlaydi: kirill va lotin, apostrof variantlari farq qilmaydi — «тош» deb yozsangiz «Toshkent» topiladi. Allaqachon qo'shilgan teglar ro'yxatda ko'rinmaydi. ↓ / ↑ bilan tanlang, Enter qo'shadi; hech narsa ajratilmagan bo'lsa Enter yozilgan matnning o'zini qo'shadi.

maxTags — eng ko'p teglar soni. Chegaraga yetganda input yashiriladi va konteynerda data-full paydo bo'ladi.

Ko'pi bilan 4 ta. «тош» deb yozib ko'ring

Tekshiruv

validate har bir yangi teg uchun chaqiriladi: true — qabul, false — standart xato (labels.invalid), matn — o'sha xato. Rad etilgan teg qo'shilmaydi, matn inputda qoladi, xato input ostida ko'rinadi va ekran o'quvchiga o'qiladi; input aria-invalid bo'ladi. Keyingi o'zgarishda xato yo'qoladi.

Bir nechta emailni vergul bilan qo'ying

Tekshiruv xatosi Field ning error prop'idan alohida — u TagInput'ning o'zida ko'rsatiladi. Forma darajasidagi xatolarni (masalan "Kamida bitta teg kerak") Field error orqali bering.

O'lchamlar va holatlar

size — sm, md (standart), lg: Input bilan bir xil minimal balandlik (32 / 40 / 48px), teglar ko'paysa konteyner o'sadi. disabled va readOnly holatlarida ✕ tugmalari yo'qoladi.

  • sm
  • md
  • lg
  • O'chirilgan

Forma

name berilsa, har bir teg uchun shu nomli yashirin <input> yaratiladi: new FormData(form).getAll('tags') → ['React', 'Vue']. PHP uslubidagi massiv kerak bo'lsa — name="tags[]".

Props

className ildiz konteynerga, ref va qolgan <input> atributlari (placeholder, autoFocus, onBlur ...) ichki input'ga tushadi.

PropTipStandartTavsif
valuestring[]—Teglar (boshqariladigan rejim)
defaultValuestring[][]Boshlang'ich teglar
onValueChange(value: string[]) => void—Ro'yxat o'zgarganda
delimitersstring[]['Enter', ',']Tegni yakunlovchi tugmalar va belgilar ('Tab' ham mumkin)
maxTagsnumber—Eng ko'p teglar soni
allowDuplicatesbooleanfalseTakror teglar (katta-kichik harf farqsiz taqqoslanadi)
validate(tag: string) => boolean | string—false yoki matn — teg qo'shilmaydi, xato ko'rsatiladi
transform(raw: string) => stringtrimKiritilgan matnni tegga aylantirish
suggestionsstring[]—Yozishda chiqadigan takliflar (kirill/lotin farqsiz)
size'sm' | 'md' | 'lg''md'Minimal balandlik 32 / 40 / 48px
disabledboolean—O'chirilgan holat
readOnlyboolean—Faqat o'qish: qo'shish va o'chirish yo'q
invalidboolean—Xato holati (Field ichida avtomatik)
namestring—Har bir tegga shu nomli yashirin input
labels{ remove?; suggestions?; added?; removed?; invalid?; duplicate? }—Ichki matnlar (o'zbekcha standart) — quyidagi jadval
inputClassNamestring—Ichki `<input>` klassi

labels

PropTipStandartTavsif
remove(tag: string) => string`${tag} ni olib tashlash`✕ tugmasining nomi
suggestionsstring'Takliflar'Takliflar ro'yxatining nomi
added(tag: string) => string`${tag} qo'shildi`Ekran o'quvchi uchun e'lon
removed(tag: string) => string`${tag} olib tashlandi`Ekran o'quvchi uchun e'lon
invalid(tag: string) => string`«${tag}» qabul qilinmadi``validate` false qaytarganda
duplicate(tag: string) => string`«${tag}» allaqachon qo'shilgan`Takror teg

Data atributlari

AtributQayerdaQiymat
data-sizekonteynersm · md · lg
data-fullkonteynermaxTags ga yetganda mavjud
data-invalidkonteynerxato (yoki tekshiruv xatosi)
data-disabledkonteynero'chirilganda mavjud
data-readonlykonteynerreadOnly da mavjud
data-slotqismlartag-input · tag-input-root

Klaviatura

TugmaHarakat
Enter / ,Yozilgan matnni teg qilish
Backspace (bo'sh inputda)Oxirgi tegni tanlash; yana bosish — o'chirish
← (input boshida)Oxirgi tegga o'tish
← / → (tegda)Teglar orasida yurish; oxirgisidan → — input'ga
Backspace / Delete (tegda)Tegni o'chirish
Enter / F2 (tegda)Tegni tahrirlash
Esc (tegda)Input'ga qaytish
↓ / ↑Takliflar orasida yurish (suggestions bo'lsa)
EscTakliflar ro'yxatini yopish

Accessibility

  • Ro'yxat. Teglar <ul role="list"> ichida — ekran o'quvchi teglar sonini aytadi.
  • E'lonlar. Qo'shish va o'chirish aria-live="polite" ko'rinmas hududda e'lon qilinadi ("React qo'shildi", "React olib tashlandi"); matnlar labels.added / labels.removed.
  • Xato. Tekshiruv xatosi ko'rinadigan matn, aria-live hududda; input'ga aria-invalid va aria-describedby orqali ulanadi.
  • Takliflar. suggestions bo'lsa input role="combobox" (aria-expanded, aria-controls, aria-activedescendant), ro'yxat — role="listbox". Fokus doim input'da qoladi.
  • ✕ tugmalari — aria-label="React ni olib tashlash", bosish maydoni kamida 40px.
  • Teglar strelkalar bilan fokuslanadi (tabIndex={-1}); ✕ tugmalariga Tab bilan ham o'tish mumkin.

Sahifada