Field
Forma maydonining label, izoh va xato matnini o'raydi va ARIA atributlarini avtomatik ulaydi.
Tasdiqlash kodi SMS orqali yuboriladi
Email manzil noto'g'ri
'use client';
import { Field, Input } from '@akhatmirzo/ui';
export default function FieldBasic() {
return (
<div className="flex w-full max-w-sm flex-col gap-4">
<Field label="Telefon" required description="Tasdiqlash kodi SMS orqali yuboriladi">
<Input prefix="+998" placeholder="90 123 45 67" inputMode="tel" />
</Field>
<Field label="Email" error="Email manzil noto'g'ri">
<Input type="email" defaultValue="sarvar@mail" />
</Field>
</div>
);
}
Import
import { Field } from '@akhatmirzo/ui';Qachon ishlatish
- Har bir forma maydoni uchun —
Input,Textarea,Select,Checkbox,RadioGroup,Switchva boshqalar.id,htmlFor,aria-describedby,aria-invalid,aria-requiredni qo'lda yozish shart emas. - Xatoni
errorga bering, alohida<p>ga emas — shunda boshqaruv elementi ham qizil bo'ladi, ekran o'quvchi ham xatoni o'qiydi. description— qisqa yo'l-yo'riq uchun: format, cheklov, nima uchun kerakligi. Uzun matnni sahifaga chiqaring.- Bitta
Field— bitta boshqaruv elementi. Ikki maydonni bitta label ostiga qo'ymang.
Validatsiya
error bo'sh bo'lmasa, maydon xato holatiga o'tadi: boshqaruv elementi aria-invalid oladi,
chegarasi qizarib, ostida ikonka bilan xato matni chiqadi. Xatolar aria-live hududida —
paydo bo'lganda ekran o'quvchi e'lon qiladi. Formani bo'sh holda yuborib ko'ring.
'use client';
import { Button, Field, Input } from '@akhatmirzo/ui';
import { useState, type FormEvent } from 'react';
export default function FieldValidation() {
const [name, setName] = useState('');
const [submitted, setSubmitted] = useState(false);
const error = submitted && name.trim().length < 3 ? 'Kamida 3 ta harf kiriting' : undefined;
const submit = (event: FormEvent) => {
event.preventDefault();
setSubmitted(true);
};
return (
<form onSubmit={submit} noValidate className="flex w-full max-w-sm flex-col gap-4">
<Field label="To'liq ism" required error={error}>
<Input
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Sarvar Abduxoliqov"
autoComplete="name"
/>
</Field>
<Button type="submit" variant="primary">
Davom etish
</Button>
</form>
);
}
Gorizontal joylashuv
orientation="horizontal" — label chapda (160px), boshqaruv elementi o'ngda. Sozlamalar
sahifalari va keng formalar uchun.
Chekda ko'rinadi
'use client';
import { Field, Input, Textarea } from '@akhatmirzo/ui';
export default function FieldHorizontal() {
return (
<div className="flex w-full max-w-xl flex-col gap-4">
<Field orientation="horizontal" label="Do'kon nomi" description="Chekda ko'rinadi">
<Input defaultValue="Bahor Market" />
</Field>
<Field orientation="horizontal" label="Manzil">
<Textarea minRows={2} defaultValue="Toshkent, Chilonzor tumani, 9-kvartal" />
</Field>
</div>
);
}
O'chirilgan holat
Field dagi disabled ichidagi boshqaruv elementini ham o'chiradi, label esa xiralashadi.
Hudud administrator tomonidan belgilanadi
'use client';
import { Field, Input } from '@akhatmirzo/ui';
export default function FieldDisabled() {
return (
<div className="w-full max-w-sm">
<Field label="Hudud" description="Hudud administrator tomonidan belgilanadi" disabled>
<Input defaultValue="Toshkent shahri" />
</Field>
</div>
);
}
O'z boshqaruv elementingiz (useFieldControl)
Kutubxonadagi barcha forma komponentlari useFieldControl hook'i orqali Field ga ulanadi. Siz
ham o'z elementingizni (native <select>, uchinchi tomon kutubxonasi) shu hook bilan ulaysiz:
controlProps ni elementga yoyasiz — qolgani avtomatik.
Shaharni tanlang
'use client';
import { Field, useFieldControl } from '@akhatmirzo/ui';
function CitySelect() {
const { controlProps, invalid, disabled } = useFieldControl();
return (
<select
{...controlProps}
disabled={disabled}
data-invalid={invalid ? '' : undefined}
className="h-10 rounded-lg border border-border bg-surface px-3 text-sm text-text data-invalid:border-danger"
>
<option value="">Tanlang</option>
<option>Toshkent</option>
<option>Samarqand</option>
<option>Buxoro</option>
</select>
);
}
export default function FieldCustomControl() {
return (
<div className="w-full max-w-sm">
<Field label="Shahar" required error="Shaharni tanlang">
<CitySelect />
</Field>
</div>
);
}
useFieldControl Field tashqarisida ham ishlaydi — u holda o'zining id sini yaratadi.
Props
Field qolgan barcha <div> atributlarini qabul qiladi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
childrenmajburiy | ReactNode | — | Boshqaruv elementi (Input, Select, Checkbox ...) |
label | ReactNode | — | Maydon nomi; <label htmlFor> bilan elementga bog'lanadi |
description | ReactNode | — | Label ostidagi yordamchi matn (aria-describedby) |
error | ReactNode | — | Bo'lsa — element invalid bo'ladi, matn qizil ikonka bilan chiqadi |
required | boolean | false | Label yonida *, elementga aria-required |
disabled | boolean | false | Ichidagi boshqaruv elementini ham o'chiradi |
orientation | 'vertical' | 'horizontal' | 'vertical' | Label tepada yoki chapda |
useFieldControl
function useFieldControl(options?: FieldControlOptions): FieldControlResult;options — elementning o'z qiymatlari; ular Field dan kelganlari bilan birlashtiriladi
(invalid, required, disabled — "yoki" mantig'ida).
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
id | string | — | O'z id'si — berilsa, label shunga ulanadi |
invalid | boolean | — | Xato holati |
required | boolean | — | Majburiy maydon |
disabled | boolean | — | O'chirilgan |
aria-describedby | string | — | Qo'shimcha izoh id'lari — Field'nikiga qo'shiladi |
aria-invalid | boolean | 'true' | 'false' | 'grammar' | 'spelling' | — | true yoki 'true' — invalid bilan bir xil |
Qaytaradigan qiymat:
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
id | string | — | Elementga beriladigan id |
labelId | string | undefined | — | Field label'ining id'si — htmlFor ishlamaydigan elementlar uchun aria-labelledby |
invalid | boolean | — | Yakuniy xato holati |
required | boolean | — | Yakuniy majburiylik |
disabled | boolean | — | Yakuniy o'chirilganlik |
controlProps | { id; 'aria-describedby'?; 'aria-invalid'?: true; 'aria-required'?: true } | — | Elementga to'g'ridan-to'g'ri yoyiladigan atributlar |
Data atributlari
| Atribut | Qiymat |
|---|---|
data-slot | field |
data-orientation | vertical · horizontal |
data-invalid | error bo'lganda mavjud |
data-disabled | disabled bo'lganda mavjud |
Accessibility
- Label bog'lanadi.
<label htmlFor>boshqaruv elementiningidsiga ulanadi; elementga o'zidingizni bersangiz, label shunga moslashadi. - Izoh va xato
aria-describedbyorqali o'qiladi — fokus maydonga kelganda ekran o'quvchi label'dan keyin ularni ham aytadi. - Xato e'loni. Xato matni doim DOM'da turadigan
aria-live="polite"hudud ichida — birinchi paydo bo'lgan xato ham e'lon qilinadi. - Majburiy maydon.
*belgisiaria-hidden, o'rniga elementgaaria-requiredqo'yiladi. RadioGroupkabi<div>elementlar label bilanhtmlFororqali bog'lanmaydi — ularlabelIdorqaliaria-labelledbyoladi (avtomatik).