Hujjat inputlari
O'zbek hujjat raqamlari uchun tayyor maydonlar: JShShIR, pasport, STIR, avtomobil raqami va hisob raqami.
Qiymat: ""
Qiymat: ""
Qiymat: ""
Qiymat: ""
Qiymat: ""
'use client';
import {
BankAccountInput,
CarPlateInput,
Field,
InnInput,
PassportInput,
PinflInput,
} from '@akhatmirzo/ui';
import { useState } from 'react';
export default function DocumentInputsOverview() {
const [pinfl, setPinfl] = useState('');
const [passport, setPassport] = useState('');
const [inn, setInn] = useState('');
const [plate, setPlate] = useState('');
const [account, setAccount] = useState('');
return (
<div className="grid w-full max-w-2xl gap-4 sm:grid-cols-2">
<Field label="JShShIR" description={`Qiymat: "${pinfl}"`}>
<PinflInput value={pinfl} onValueChange={setPinfl} />
</Field>
<Field label="Pasport yoki ID karta" description={`Qiymat: "${passport}"`}>
<PassportInput value={passport} onValueChange={setPassport} />
</Field>
<Field label="STIR" description={`Qiymat: "${inn}"`}>
<InnInput value={inn} onValueChange={setInn} />
</Field>
<Field label="Avtomobil raqami" description={`Qiymat: "${plate}"`}>
<CarPlateInput value={plate} onValueChange={setPlate} />
</Field>
<Field label="Hisob raqami" description={`Qiymat: "${account}"`} className="sm:col-span-2">
<BankAccountInput value={account} onValueChange={setAccount} />
</Field>
</div>
);
}
Import
import {
BankAccountInput,
CarPlateInput,
InnInput,
PassportInput,
PinflInput,
} from '@akhatmirzo/ui';Hammasi MaskedInput bilan bir xil qoidada ishlaydi: ko'rinish —
formatlangan, qiymat — toza (bo'sh joysiz). Tekshiruv @akhatmirzo/core dagi isValidX
funksiyalari bilan — Identifikatorlar sahifasiga qarang.
| Komponent | Ko'rinish | Qiymat (value) |
|---|---|---|
PinflInput | 31503 90123 4567 | "31503901234567" |
PassportInput | AA 1234567 | "AA1234567" |
InnInput | 123 456 789 | "123456789" |
CarPlateInput | 01 | A 123 BC | "01A123BC" |
BankAccountInput | 2020 8000 9000 1234 5001 | "20208000900012345001" |
Qachon ishlatish
- Davlat xizmatlari, bank, sug'urta, lizing formalari — foydalanuvchi bo'sh joylarni o'zi qo'ymaydi, qiymat esa serverga tayyor holda keladi.
- Har doim label bering — Field ichida. "JShShIR" yonida qayerdan topish
mumkinligini
descriptionda yozing ("pasportdagi 14 raqamli shaxsiy raqam"). - Xato sababini matn bilan ko'rsating — komponent faqat
invalidholatni qo'yadi, tushuntirishniFieldningerrorprop'iga yozing. - Hamma narsa
Inputdan meros:size,clearable,disabled,readOnly,name.
Tekshiruv
validate (standart true) — to'liq kiritilgan qiymat tekshiruvdan o'tmasa, maydon avtomatik
invalid bo'ladi. Yozish paytida qizarmaydi. Istisnolar: InnInput 0 bilan boshlansa va
CarPlateInput da hudud kodi ro'yxatda bo'lmasa — xato darhol ko'rinadi.
0 bilan boshlanmaydi — darhol xato
validate={false} — tekshiruvsiz
'use client';
import { Field, InnInput, PassportInput } from '@akhatmirzo/ui';
export default function DocumentValidation() {
return (
<div className="grid w-full max-w-2xl gap-4 sm:grid-cols-2">
<Field label="STIR" description="0 bilan boshlanmaydi — darhol xato">
<InnInput defaultValue="012345678" />
</Field>
<Field label="Pasport" description="validate={false} — tekshiruvsiz">
<PassportInput defaultValue="AB1234567" validate={false} />
</Field>
</div>
);
}
PinflInput
JShShIR — 14 raqam, 5-5-4 guruhlar. 14-raqam kiritilganda onDetails chaqiriladi:
{ valid, gender, birthDate, complete } — jins va tug'ilgan sana raqamning o'zidan olinadi.
Nazorat raqami standartda tekshirilmaydi; checksum bilan yoqiladi.
14 raqam — pasportdagi shaxsiy raqam
'use client';
import { Field, PinflInput, type PinflInputDetails } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function PinflDemo() {
const [details, setDetails] = useState<PinflInputDetails | null>(null);
const info =
details?.valid && details.birthDate
? `${details.gender === 'male' ? 'Erkak' : 'Ayol'}, tugʻilgan: ${details.birthDate.toLocaleDateString('uz-UZ')}`
: undefined;
return (
<div className="w-full max-w-sm">
<Field
label="JShShIR"
description={info ?? '14 raqam — pasportdagi shaxsiy raqam'}
error={details && !details.valid ? 'JShShIR notoʻgʻri' : undefined}
>
<PinflInput
onValueChange={(_, d) => {
if (!d.complete) setDetails(null);
}}
onDetails={setDetails}
/>
</Field>
</div>
);
}
PassportInput
Pasport yoki ID karta: 2 lotin harf + 7 raqam. Kichik harf avtomatik katta bo'ladi, kirill
harflar va ortiqcha belgilar qabul qilinmaydi. Mobilda klaviatura katta harf bilan ochiladi
(autoCapitalize="characters").
InnInput va BankAccountInput
STIR — 9 raqam (000 000 000), hisob raqami — 20 raqam, 4 tadan guruh. Ikkalasida ham mobilda
raqamli klaviatura ochiladi.
CarPlateInput
Jismoniy (01 A 123 BC) yoki yuridik shaxs (01 123 ABC) formati 3-belgidan avtomatik
aniqlanadi: harf yozilsa — jismoniy, raqam — yuridik. Chapda hudud kodi ajratuvchi chiziq bilan,
o'ngda bayroq belgisi va "UZ" — haqiqiy raqam ko'rinishiga o'xshash.
01 A 123 BC
01 123 ABC
'use client';
import { CarPlateInput, Field, type CarPlateInputDetails } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function CarPlateDemo() {
const [details, setDetails] = useState<CarPlateInputDetails | null>(null);
const type =
details?.type === 'legal' ? 'yuridik shaxs' : details?.type ? 'jismoniy shaxs' : null;
const description = [details?.region?.name, type].filter(Boolean).join(' · ');
return (
<div className="grid w-full max-w-2xl gap-4 sm:grid-cols-2">
<Field label="Jismoniy shaxs" description={description || '01 A 123 BC'}>
<CarPlateInput defaultValue="01A123BC" onDetails={setDetails} />
</Field>
<Field label="Yuridik shaxs" description="01 123 ABC">
<CarPlateInput defaultValue="30123ABC" />
</Field>
</div>
);
}
onDetails har o'zgarishda chaqiriladi — hudud birinchi ikki raqamdan, tur 3-belgidan keyin
ma'lum bo'ladi:
<CarPlateInput
onDetails={({ region, type, valid }) => {
// region — UZ_REGIONS dagi obyekt yoki null; type — 'personal' | 'legal' | null
}}
/>Tafsilotlarni komponentdan tashqarida ham olasiz: getCarPlateDetails('01A123BC'),
getPinflDetails('31503901234567').
Props
Barcha komponentlar Input props'larini va ref ni qabul qiladi. name berilsa —
formaga toza qiymatli yashirin <input> qo'shiladi.
Umumiy
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
value | string | — | Toza qiymat — bo'sh joysiz |
defaultValue | string | — | |
onValueChange | (value: string, details) => void | — | details: { complete, valid } (+ komponentga xos maydonlar) |
validate | boolean | true | To'liq qiymat tekshiruvdan o'tmasa avtomatik invalid |
PinflInput
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
onDetails | (details: PinflInputDetails) => void | — | 14 raqam kiritilganda: { valid, gender, birthDate, complete } |
checksum | boolean | false | Nazorat raqamini ham tekshirish |
placeholder | string | '00000 00000 0000' |
CarPlateInput
prefix va leftIcon qabul qilinmaydi — chap tomon hudud kodi uchun band.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
onDetails | (details: CarPlateInputDetails) => void | — | Har o'zgarishda: { region, type, complete, valid } |
rightIcon | ReactNode | — | Standart — bayroq belgisi va "UZ" |
placeholder | string | '01 A 123 BC' |
Boshqa placeholder'lar
| Komponent | placeholder |
|---|---|
PassportInput | 'AA 1234567' |
InnInput | '000 000 000' |
BankAccountInput | '0000 0000 0000 0000 0000' |
Data atributlari
| Atribut | Komponent | Qiymat |
|---|---|---|
data-plate-type | CarPlateInput | personal · legal |
data-region | CarPlateInput | hudud id si (tashkent-city) |
Accessibility
- Native
<input type="text">— ekran o'quvchi formatlangan matnni o'qiydi. - Mobil klaviatura:
PinflInput,InnInput,BankAccountInput—inputMode="numeric";PassportInputvaCarPlateInput—autoCapitalize="characters". - Xato holati
aria-invalidsifatida beriladi. SababiniFieldningerrorprop'ida matn bilan yozing — rang yagona signal bo'lmasin. - Dekorativ qismlar — avtomobil raqamidagi ajratuvchi chiziq va bayroq belgisi
aria-hidden; ekran o'quvchi faqat raqamni o'qiydi.