@akhatmirzo/ui

MaskedInput

Yozish paytida formatlanadigan maydonlar: telefon, summa, karta raqami va o'z niqobingiz.

Qiymat: ""

+998

Qiymat: 1250000

Qiymat: ""

Qiymat: ""

Import

import { CardInput, MaskedInput, MoneyInput, PhoneInput } from '@akhatmirzo/ui';

To'rt komponentning umumiy qoidasi: ichki qiymat — toza, ko'rinish — formatlangan. Ekranda "(90) 123-45-67", onValueChange da esa "901234567". Serverga yuborish, saqlash va tekshirish uchun ortiqcha belgilarni tozalash shart emas.

KomponentKo'rinishQiymat (value)
PhoneInput+998 (90) 123-45-67"901234567"
MoneyInput1 250 000 so'm1250000 (number)
CardInput8600 1234 1234 1234 UZCARD"8600123412341234"
MaskedInputAB 1234567 ("AA 9999999")"AB1234567"

Qachon ishlatish

  • Format qat'iy bo'lgan ma'lumot uchun — telefon, karta, pasport, avtomobil raqami. Foydalanuvchi ajratuvchilarni o'zi yozmaydi, xato qilish imkoni kamayadi.
  • Pul summasi uchun — MoneyInput: minglik ajratuvchi o'qishni osonlashtiradi, qiymat esa tayyor number.
  • Erkin matn uchun ishlatmang — ism, manzil, izoh oddiy Input bilan qoladi. Uzunligi o'zgaruvchan ma'lumotga niqob halal beradi.
  • Har doim label bering — Field ichida. Placeholder ("(90) 123-45-67") faqat namuna, label o'rnini bosmaydi.
  • Hamma narsa Input dan meros: size, invalid, clearable, leftIcon, disabled, readOnly — barchasi xuddi Input dagidek ishlaydi.

Kursor sakramaydi

Formatlash paytida kursor joyida qoladi: raqamni o'rtadan o'chirsangiz yoki qo'shsangiz ham u "oxiriga qochmaydi". Backspace doimiy belgini (-, bo'sh joy, nuqta) emas, undan oldingi raqamni o'chiradi — Delete ham xuddi shunday, oldinga qarab.

PhoneInput

O'zbekiston raqami: +998 — o'chirib bo'lmaydigan prefiks, foydalanuvchi faqat 9 raqam yozadi. "+998 90 123 45 67" ni nusxalab joylasangiz ham to'g'ri tushadi. Operator kodi tekshiriladi (33, 50, 55, 77, 88, 90, 91, 93, 94, 95, 97, 98, 99) — noto'g'ri kodda maydon avtomatik invalid bo'ladi.

+998 90 123 45 67 ni joylang

+998
+998
+998

onValueChange ikkinchi argumentda tafsilotlarni beradi: { valid, operator, complete }. Xuddi shu ma'lumotni komponentdan tashqarida getPhoneDetails(value) bilan olasiz — masalan forma tekshiruvida.

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

getPhoneDetails('901234567'); // { valid: true, operator: '90', complete: true }
getPhoneDetails('121234567'); // { valid: false, operator: null, complete: true }

MoneyInput

Minglik ajratuvchi — bo'sh joy, o'ngda valyuta (standart — "so'm"). Qiymat — number | null. Mobilda raqamli klaviatura ochiladi (decimals bo'lsa — kasr nuqtasi bilan).

Qiymat: null

decimals={2}, currency="$"

100 000 dan 50 000 000 gacha

currency={null}

  • decimals — kasr raqamlari soni (standart 0). Vergul bilan yozilsa ham nuqtaga aylanadi.
  • max — undan katta qiymatni yozib bo'lmaydi (belgi qabul qilinmaydi).
  • min — kichik qiymat maydondan chiqqanda (blur) min ga tenglashtiriladi.
  • currency={null} — valyuta ko'rsatilmaydi; currency="$" yoki istalgan ReactNode.

Summa so'zlar bilan

showWords — summa maydon ostida so'z bilan yoziladi: "Bir million ikki yuz ellik ming soʻm". Shartnoma, hisob-faktura va to'lov formalarida raqamni tekshirishga yordam beradi. Matn @akhatmirzo/core dagi moneyToWords bilan yasaladi va yozish bilan birga yangilanadi.

Bir million ikki yuz ellik ming soʻm

Бир миллион икки юз эллик минг сўм

  • showWords={{ script: 'cyrillic' }} — kirillda. script berilmasa, ScriptProvider dagi alifbo olinadi (provider bo'lmasa — lotin).
  • showWords={{ formal: true }} — rasmiy uslub: "bir yuz", "bir ming".
  • Field ichida so'zlar description dan keyin, maydon ostida chiqadi va aria-describedby ga qo'shiladi. Matn aria-live="polite" hududida — ekran o'quvchi yangi summani o'qiydi.

CardInput

Bank kartasi: 4 tadan guruh, o'ngda brend belgisi — UZCARD (8600), HUMO (9860), VISA (4) va Mastercard (51–55, 2221–2720). 16 raqam kiritilganda Luhn tekshiruvi o'tkaziladi; o'tmasa — maydon invalid.

Sinab ko'ring: 4111 1111 1111 1111

Brend belgisi rasmiy logo emas — semantik tokenlardagi neytral matnli belgi (dark mode'da ham o'qiladi). Rasmiy logo kerak bo'lsa, renderBrand bilan o'zingiz chizing:

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

<CardInput renderBrand={(brand) => <img src={`/cards/${brand}.svg`} alt="" className="h-5" />} />;

getCardDetails(value) — { brand, complete, valid }; CardBrandMark komponenti ham eksport qilinadi (<CardBrandMark brand="humo" />).

O'z niqobingiz

MaskedInput — umumiy niqob. Belgilar: 9 — raqam, A — harf, * — istalgan belgi (bo'sh joydan tashqari). Qolgan har qanday belgi — doimiy, foydalanuvchi uni yozmaydi. uppercase — harflarni avtomatik katta qiladi.

mask="99 A 999 AA"

14 ta raqam

mask="99:99"

mask="****-****"

onValueChange(value, { formatted, complete }) — complete barcha o'rinlar to'lganini bildiradi. Ildiz elementda data-mask atributi bor.

Formada

name bersangiz, formaga toza qiymatli yashirin <input> qo'shiladi — FormData da "901234567", "1250000" kabi qiymat keladi, formatlangan matn emas.

<form action="/api/order">
  <PhoneInput name="phone" required />
  <MoneyInput name="amount" />
</form>

Props

Barcha komponentlar Input props'larini (size, invalid, clearable, leftIcon, disabled, readOnly, name, aria-* ...) va ref ni qabul qiladi. type va defaultValue / value — o'zlariniki.

MaskedInput

PropTipStandartTavsif
maskmajburiystring—9 — raqam, A — harf, * — istalgan; qolgani doimiy belgi
valuestring—Toza qiymat, doimiy belgilarsiz: "AB1234567"
defaultValuestring—
onValueChange(value: string, details: MaskedInputDetails) => void—details: { formatted, complete }
uppercasebooleanfalseHarflarni katta harfga o'tkazish

PhoneInput

prefix qabul qilinmaydi — u doim +998.

PropTipStandartTavsif
valuestring—9 raqam, +998 siz: "901234567"
defaultValuestring—
onValueChange(value: string, details: PhoneInputDetails) => void—details: { valid, operator, complete }
validateOperatorbooleantrueOperator kodi noto'g'ri bo'lsa avtomatik invalid
placeholderstring'(90) 123-45-67'

MoneyInput

PropTipStandartTavsif
valuenumber | null—
defaultValuenumber | null—
onValueChange(value: number | null) => void—
currencyReactNode"so'm"O'ngdagi valyuta; null — ko'rsatilmaydi
decimalsnumber0Kasr raqamlari soni
minnumber—Kichik qiymat blur paytida min ga tenglashtiriladi
maxnumber—Undan katta qiymatni yozib bo'lmaydi
showWordsboolean | { formal?: boolean; script?: 'latin' | 'cyrillic' }falseSummani maydon ostida so'z bilan ko'rsatish
placeholderstring'0'

CardInput

PropTipStandartTavsif
valuestring—16 raqam: "8600123412341234"
defaultValuestring—
onValueChange(value: string, details: CardInputDetails) => void—details: { brand, complete, valid }
validateLuhnbooleantrueTo'liq kiritilganda Luhn xato bo'lsa avtomatik invalid
renderBrand(brand: CardBrand) => ReactNode—Brend belgisini o'zingiz chizish
leftIconReactNode—Standart — karta ikonkasi
placeholderstring'0000 0000 0000 0000'

CardBrand — 'uzcard' | 'humo' | 'visa' | 'mastercard' (@akhatmirzo/core dan).

Data atributlari

AtributKomponentQiymat
data-maskMaskedInputmask qiymati
data-brandCardInputuzcard · humo · visa · mastercard

Accessibility

  • Native <input type="text"> — ekran o'quvchi formatlangan matnni o'qiydi, tahrirlash odatdagidek ishlaydi.
  • Mobil klaviatura turiga mos: PhoneInput — inputMode="tel", CardInput va MoneyInput — numeric (decimals bilan — decimal).
  • Avtoto'ldirish: PhoneInput — autoComplete="tel-national", CardInput — autoComplete="cc-number". MaskedInput da avtoto'ldirish o'chiq (off), imlo tekshiruvi ham.
  • Xato holati (validateOperator, validateLuhn) aria-invalid sifatida beriladi. Xato sababini matn bilan Field ning error prop'ida ko'rsating — rang yetarli emas.
  • Valyuta va karta brendi dekorativ (aria-hidden) — summa uchun label'ga valyutani yozing ("Summa, so'm"), agar u muhim bo'lsa.

Sahifada