Input
Bir qatorli matn maydoni: ikonkalar, prefix/suffix, tozalash tugmasi va parolni ko'rsatish.
'use client';
import { Input } from '@akhatmirzo/ui';
import { Search } from 'lucide-react';
export default function InputBasic() {
return (
<div className="w-full max-w-sm">
<Input leftIcon={<Search />} placeholder="Mahsulot qidirish" aria-label="Mahsulot qidirish" />
</div>
);
}
Import
import { Input } from '@akhatmirzo/ui';Qachon ishlatish
- Qisqa, bir qatorli qiymatlar uchun — ism, email, qidiruv, summa. Ko'p qatorli matnga
Textarea. - Doim
Fieldichida ishlating — label, izoh va xato o'zi ulanadi. Label'siz (masalan, qidiruv) maydongaaria-labelbering. - Telefon, karta raqami, sana kabi qat'iy formatlar uchun
MaskedInputqulayroq. placeholderlabel o'rnini bosmaydi — u yozish boshlanishi bilan yo'qoladi. Misol qiymat uchun ishlating: "90 123 45 67".
O'lchamlar
32, 40 (standart) va 48px — Button bilan bir xil, shuning uchun bir qatorda tekis turadi.
'use client';
import { Button, Input } from '@akhatmirzo/ui';
export default function InputSizes() {
return (
<div className="flex w-full max-w-md flex-col gap-3">
<div className="flex items-center gap-2">
<Input size="sm" placeholder="Kichik · 32" aria-label="Kichik" />
<Button size="sm">Qo'llash</Button>
</div>
<div className="flex items-center gap-2">
<Input size="md" placeholder="O'rta · 40" aria-label="O'rta" />
<Button size="md">Qo'llash</Button>
</div>
<div className="flex items-center gap-2">
<Input size="lg" placeholder="Katta · 48" aria-label="Katta" />
<Button size="lg">Qo'llash</Button>
</div>
</div>
);
}
Ikonkalar, prefix va suffix
leftIcon / rightIcon — bezak ikonkalari (aria-hidden). prefix / suffix — maydon
ichidagi doimiy matn, ajratuvchi chiziq bilan: mamlakat kodi, valyuta, domen.
'use client';
import { Input } from '@akhatmirzo/ui';
import { Mail } from 'lucide-react';
export default function InputAddons() {
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<Input prefix="+998" placeholder="90 123 45 67" inputMode="tel" aria-label="Telefon" />
<Input suffix="so'm" placeholder="1 250 000" inputMode="numeric" aria-label="Narx" />
<Input rightIcon={<Mail />} type="email" placeholder="email@misol.uz" aria-label="Email" />
<Input prefix="https://" suffix=".uz" placeholder="dokon" aria-label="Sayt manzili" />
</div>
);
}
Tozalash (clearable)
clearable bo'lsa va maydonda qiymat bo'lsa, ✕ tugmasi chiqadi. Esc ham tozalaydi. Tozalash
oddiy input hodisasi orqali o'tadi — boshqariladigan rejimda onChange ham chaqiriladi,
qo'shimcha ravishda onClear.
Qiymat: Samarqand
'use client';
import { Input } from '@akhatmirzo/ui';
import { Search } from 'lucide-react';
import { useState } from 'react';
export default function InputClearable() {
const [query, setQuery] = useState('Samarqand');
return (
<div className="flex w-full max-w-sm flex-col gap-2">
<Input
leftIcon={<Search />}
clearable
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Shahar qidirish"
aria-label="Shahar qidirish"
/>
<p className="text-xs text-text-muted">Qiymat: {query || '—'}</p>
</div>
);
}
Parol
type="password" bo'lsa, o'ng tomonda parolni ko'rsatish/yashirish tugmasi avtomatik chiqadi.
Kamida 8 ta belgi
'use client';
import { Field, Input } from '@akhatmirzo/ui';
export default function InputPassword() {
return (
<div className="w-full max-w-sm">
<Field label="Parol" description="Kamida 8 ta belgi">
<Input type="password" defaultValue="maxfiy123" autoComplete="current-password" />
</Field>
</div>
);
}
Holatlar
Xato (invalid), o'chirilgan (disabled) va faqat o'qish uchun (readOnly). Field ichida
error berilsa, invalid avtomatik yoqiladi.
'use client';
import { Input } from '@akhatmirzo/ui';
export default function InputStates() {
return (
<div className="grid w-full max-w-lg grid-cols-1 gap-3 sm:grid-cols-2">
<Input placeholder="Oddiy" aria-label="Oddiy" />
<Input invalid defaultValue="sarvar@mail" aria-label="Xato" />
<Input disabled defaultValue="O'chirilgan" aria-label="O'chirilgan" />
<Input readOnly defaultValue="Faqat o'qish uchun" aria-label="Faqat o'qish" />
</div>
);
}
Field bilan
Tasdiqlash kodi SMS orqali keladi
Email manzil noto'g'ri
'use client';
import { Field, Input } from '@akhatmirzo/ui';
import { Mail } from 'lucide-react';
export default function InputWithField() {
return (
<div className="flex w-full max-w-sm flex-col gap-4">
<Field label="Telefon" required description="Tasdiqlash kodi SMS orqali keladi">
<Input prefix="+998" placeholder="90 123 45 67" inputMode="tel" />
</Field>
<Field label="Email" error="Email manzil noto'g'ri">
<Input leftIcon={<Mail />} defaultValue="sarvar@mail" clearable />
</Field>
</div>
);
}
Props
Input qolgan barcha <input> atributlarini (type, name, placeholder, inputMode,
autoComplete, onChange ...) qabul qiladi; ref ichki <input> ga tushadi. className —
tashqi konteynerga, ichki elementga esa inputClassName.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'md' | Balandlik: 32 / 40 / 48px |
invalid | boolean | — | Xato holati (Field ichida error bo'lsa avtomatik) |
leftIcon | ReactNode | — | Chap tomondagi ikonka |
rightIcon | ReactNode | — | O'ng tomondagi ikonka |
prefix | ReactNode | — | Chapdagi matn ajratuvchi chiziq bilan (masalan, "+998") |
suffix | ReactNode | — | O'ngdagi matn ajratuvchi chiziq bilan (masalan, "so'm") |
clearable | boolean | false | Qiymat bo'lsa ✕ tugmasi; Esc ham tozalaydi |
onClear | () => void | — | Tozalangandan keyin chaqiriladi |
labels | { clear?: string; showPassword?: string; hidePassword?: string } | { clear: 'Tozalash', showPassword: "Parolni ko'rsatish", hidePassword: 'Parolni yashirish' } | Ichki tugmalarning aria-label matnlari |
inputClassName | string | — | Ichki <input> klassi |
type | string | 'text' | 'password' — ko'rsatish/yashirish tugmasi bilan |
readOnly | boolean | false | Faqat o'qish uchun; fon xiralashadi, tozalash tugmasi chiqmaydi |
Data atributlari
Atributlar tashqi konteynerda (data-slot="input"):
| Atribut | Qiymat |
|---|---|
data-size | sm · md · lg |
data-invalid | Xato holatida mavjud |
data-disabled | disabled bo'lganda mavjud |
data-readonly | readOnly bo'lganda mavjud |
Accessibility
- Native
<input>— brauzerning avtoto'ldirish, tekshiruv va klaviatura xatti-harakati saqlanadi. - Field bilan
id,aria-describedby,aria-invalidvaaria-requiredavtomatik ulanadi. - Fokus halqasi konteynerda (
:focus-within) — ikonka va prefix ham halqa ichida qoladi. Escqiymatni tozalaydi (faqatclearableva maydon bo'sh bo'lmasa). Bo'sh maydonda hodisa yuqoriga o'tadi — masalan,Dialogyopiladi.- Tozalash tugmasi
Tabtartibida yo'q (tabIndex={-1}) — klaviaturada uning o'rniniEscbosadi. Parol tugmasi esa fokuslanadi vaaria-labeli holatga qarab almashadi. - Ikonkalar
aria-hidden— ma'noli bo'lsa, uni label yokiaria-labelda yozing.