Select
Qidiruvsiz ro'yxatdan bitta qiymat tanlash: guruhlar, ikonkalar va forma bilan ishlash.
Buyurtma shu viloyatga yetkaziladi
Qiymat: —
'use client';
import { Field, Select } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function SelectBasic() {
const [region, setRegion] = useState('');
return (
<div className="flex w-full max-w-xs flex-col gap-3">
<Field label="Viloyat" description="Buyurtma shu viloyatga yetkaziladi">
<Select value={region} onValueChange={setRegion}>
<Select.Item value="tsh">Toshkent shahri</Select.Item>
<Select.Item value="sam">Samarqand</Select.Item>
<Select.Item value="bux">Buxoro</Select.Item>
<Select.Item value="and">Andijon</Select.Item>
<Select.Item value="fer">Farg'ona</Select.Item>
<Select.Item value="nam">Namangan</Select.Item>
<Select.Item value="qash">Qashqadaryo</Select.Item>
<Select.Item value="xor">Xorazm</Select.Item>
<Select.Item value="qqr">Qoraqalpog'iston</Select.Item>
</Select>
</Field>
<p className="text-sm text-text-muted">
Qiymat: <span className="font-medium text-text">{region || '—'}</span>
</p>
</div>
);
}
Import
import { Select } from '@akhatmirzo/ui';Qachon ishlatish
- 5–15 ta variantdan bittasini tanlash uchun — viloyat, to'lov usuli, holat. Variantlar 3 ta
yoki undan kam bo'lsa,
RadioGroupqulayroq: hammasi birdan ko'rinadi. - Qidiruv kerak bo'lsa —
Combobox.Selectataylab qidiruvsiz qilingan; shaharlar yoki mahsulotlar kabi uzun ro'yxatlar uchun Combobox oling. - Bir nechta qiymat tanlash uchun ham
Combobox(multiple) kerak —Selectfaqat bitta qiymat qaytaradi. - Har doim nom bering:
Fieldichiga joylang yokiaria-labelyozing. - Buyruqlar ro'yxati emas. "Tahrirlash", "O'chirish" kabi amallar uchun
DropdownMenubor.
Guruhlar va ajratgich
Select.Group variantlarni sarlavha ostida jamlaydi, Select.Separator guruhlar orasiga chiziq
tortadi. Tanlangan variant yonida ✓ belgisi turadi.
'use client';
import { Field, Select } from '@akhatmirzo/ui';
export default function SelectGroups() {
return (
<Field label="Filial" className="w-full max-w-xs">
<Select defaultValue="fer">
<Select.Item value="tsh">Toshkent</Select.Item>
<Select.Item value="sam">Samarqand</Select.Item>
<Select.Group label="Vodiy">
<Select.Item value="and">Andijon</Select.Item>
<Select.Item value="fer">Farg'ona</Select.Item>
<Select.Item value="nam">Namangan</Select.Item>
</Select.Group>
<Select.Separator />
<Select.Group label="Janub">
<Select.Item value="qash">Qashqadaryo</Select.Item>
<Select.Item value="sur">Surxondaryo</Select.Item>
</Select.Group>
</Select>
</Field>
);
}
<Select defaultValue="fer">
<Select.Item value="tsh">Toshkent</Select.Item>
<Select.Group label="Vodiy">
<Select.Item value="and">Andijon</Select.Item>
<Select.Item value="fer">Farg'ona</Select.Item>
</Select.Group>
<Select.Separator />
<Select.Group label="Janub">
<Select.Item value="qash">Qashqadaryo</Select.Item>
</Select.Group>
</Select>O'lchamlar
Uch o'lcham — 32, 40 va 48px. Balandliklar Input va Button bilan bir xil, shuning uchun bir
qatorda tekis turadi. Panel kengligi trigger kengligiga teng; ro'yxat uzun bo'lsa, 320px dan
keyin ichida scroll paydo bo'ladi.
'use client';
import { Button, Select } from '@akhatmirzo/ui';
export default function SelectSizes() {
return (
<div className="flex w-full max-w-md flex-col gap-4">
{(['sm', 'md', 'lg'] as const).map((size) => (
<Select
key={size}
size={size}
aria-label={`O'lcham ${size}`}
placeholder={`size="${size}"`}
>
<Select.Item value="a">Birinchi</Select.Item>
<Select.Item value="b">Ikkinchi</Select.Item>
</Select>
))}
<div className="flex items-center gap-3">
<Select aria-label="Valyuta" defaultValue="uzs" className="w-28">
<Select.Item value="uzs">UZS</Select.Item>
<Select.Item value="usd">USD</Select.Item>
<Select.Item value="eur">EUR</Select.Item>
</Select>
<Button variant="primary">To'lash</Button>
</div>
</div>
);
}
Holatlar
Field ichida disabled, error va required o'zi ulanadi — Select ga qayta yozish shart
emas. Field siz ishlatsangiz, invalid va disabled ni to'g'ridan-to'g'ri bering. Bitta
variantni o'chirish uchun Select.Item ga disabled qo'ying — klaviatura uni o'tkazib yuboradi.
To'lov usulini tanlang
'use client';
import { Field, Select } from '@akhatmirzo/ui';
export default function SelectStates() {
return (
<div className="grid w-full gap-4 sm:grid-cols-3">
<Field label="O'chirilgan" disabled>
<Select defaultValue="click">
<Select.Item value="click">Click</Select.Item>
</Select>
</Field>
<Field label="To'lov usuli" error="To'lov usulini tanlang" required>
<Select>
<Select.Item value="click">Click</Select.Item>
<Select.Item value="payme">Payme</Select.Item>
</Select>
</Field>
<Field label="O'chirilgan element">
<Select placeholder="Usulni tanlang">
<Select.Item value="click">Click</Select.Item>
<Select.Item value="payme">Payme</Select.Item>
<Select.Item value="uzum" disabled>
Uzum (vaqtincha ishlamaydi)
</Select.Item>
<Select.Item value="cash">Naqd pul</Select.Item>
</Select>
</Field>
</div>
);
}
Ikonkali variantlar
Select.Item ning icon prop'i matndan oldin 16px joy ajratadi. Holat ranglari kabi qisqa
belgilar uchun qulay.
'use client';
import { Field, Select } from '@akhatmirzo/ui';
function Dot({ className }: { className: string }) {
return <span className={`size-2 rounded-full ${className}`} />;
}
export default function SelectIcons() {
return (
<Field label="Buyurtma holati" className="w-full max-w-xs">
<Select defaultValue="progress">
<Select.Item value="new" icon={<Dot className="bg-info" />}>
Yangi
</Select.Item>
<Select.Item value="progress" icon={<Dot className="bg-warning" />}>
Jarayonda
</Select.Item>
<Select.Item value="done" icon={<Dot className="bg-success" />}>
Yetkazildi
</Select.Item>
<Select.Item value="canceled" icon={<Dot className="bg-danger" />}>
Bekor qilindi
</Select.Item>
</Select>
</Field>
);
}
Forma bilan
name berilsa, Select yashirin native <select> chizadi va qiymat FormData bilan birga
yuboriladi. Bo'sh qiymatni o'zingiz tekshirib, xabarni Field ning error prop'i orqali
ko'rsating.
'use client';
import { Button, Field, Select } from '@akhatmirzo/ui';
import { useState, type FormEvent } from 'react';
export default function SelectForm() {
const [error, setError] = useState<string>();
const [sent, setSent] = useState('—');
const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
const delivery = String(new FormData(e.currentTarget).get('delivery') ?? '');
if (!delivery) return setError('Yetkazib berish usulini tanlang');
setError(undefined);
setSent(delivery);
};
return (
<form onSubmit={handleSubmit} className="flex w-full max-w-xs flex-col gap-4">
<Field label="Yetkazib berish" error={error} required>
<Select name="delivery" onValueChange={() => setError(undefined)}>
<Select.Item value="courier">Kuryer (1 kun)</Select.Item>
<Select.Item value="pickup">Olib ketish</Select.Item>
<Select.Item value="post">Pochta (2–3 kun)</Select.Item>
</Select>
</Field>
<div className="flex items-center gap-3">
<Button type="submit" variant="primary">
Yuborish
</Button>
<span className="text-sm text-text-muted">FormData: {sent}</span>
</div>
</form>
);
}
Dialog ichida
Select ni Dialog yoki Drawer ichida bemalol ishlatasiz:
panel modal qatlamida ekanini o'zi aniqlaydi va z-index'ini ko'taradi, shuning uchun ro'yxat
oyna ustida ochiladi. Hech narsa sozlash shart emas — tayyor misol Dialog sahifasidagi "Dialog
ichida Select va Combobox" bo'limida.
RegionSelect
O'zbekiston hududlari uchun tayyor Select: Qoraqalpog'iston Respublikasi, 12 viloyat va
Toshkent shahri (@akhatmirzo/core dagi UZ_REGIONS). Qiymat — hudud id si ('samarkand'),
nomlar joriy alifboda: script prop'i yoki ScriptProvider dan.
Qiymat: "samarkand"
includeCity={false}
'use client';
import type { UzRegionId } from '@akhatmirzo/core';
import { Field, RegionSelect, ScriptProvider, ScriptToggle } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function RegionSelectDemo() {
const [region, setRegion] = useState<UzRegionId>('samarkand');
return (
<ScriptProvider>
<div className="flex w-full max-w-sm flex-col gap-4">
<ScriptToggle size="sm" />
<Field label="Hudud" description={`Qiymat: "${region}"`}>
<RegionSelect value={region} onValueChange={setRegion} />
</Field>
<Field label="Viloyat" description="includeCity={false}">
<RegionSelect includeCity={false} />
</Field>
</div>
</ScriptProvider>
);
}
import { RegionSelect } from '@akhatmirzo/ui';
<RegionSelect value={region} onValueChange={(id, region) => setRegion(id)} />;Select ning barcha prop'larini (size, invalid, name, placeholder ...) qabul qiladi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
value | UzRegionId | — | Hudud id si: 'tashkent-city', 'samarkand' ... |
defaultValue | UzRegionId | — | |
onValueChange | (id: UzRegionId, region: UzRegion) => void | — | Ikkinchi argument — UZ_REGIONS dagi to'liq obyekt |
script | 'latin' | 'cyrillic' | — | Nomlar alifbosi; standart — ScriptProvider dagi yoki 'latin' |
includeCity | boolean | true | Toshkent shahrini ro'yxatga qo'shish |
placeholder | ReactNode | 'Hududni tanlang' |
Props
Select
className triggerga, contentClassName ochiladigan panelga tushadi. Qolgan <button>
atributlari (id, aria-*, data-*, onBlur ...) va ref ham triggerga uzatiladi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
value | string | — | Tanlangan qiymat (boshqariladigan rejim) |
defaultValue | string | — | Boshlang'ich qiymat |
onValueChange | (value: string) => void | — | Foydalanuvchi variant tanlaganda |
open | boolean | — | Panel ochiqmi (boshqariladigan rejim) |
defaultOpen | boolean | — | Boshlang'ich holatda ochiq |
onOpenChange | (open: boolean) => void | — | Panel ochilganda yoki yopilganda |
placeholder | ReactNode | 'Tanlang' | Qiymat tanlanmaganda ko'rinadigan matn |
size | 'sm' | 'md' | 'lg' | 'md' | Balandlik: 32 / 40 / 48px |
invalid | boolean | — | Xato holati. Field ichida error bo'lsa — avtomatik |
disabled | boolean | — | Select'ni butunlay o'chiradi |
required | boolean | — | Majburiy maydon (aria-required) |
name | string | — | Forma uchun yashirin native select nomi |
autoComplete | string | — | Yashirin native select uchun |
dir | 'ltr' | 'rtl' | — | Yozuv yo'nalishi |
contentClassName | string | — | Ochiladigan panel klassi |
container | HTMLElement | null | — | Portal konteyneri (standart — document.body) |
childrenmajburiy | ReactNode | — | Select.Item, Select.Group va Select.Separator |
Select.Item
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
valuemajburiy | string | — | Variant qiymati |
icon | ReactNode | — | Chapdagi ikonka (16px) |
disabled | boolean | — | Variantni o'chiradi |
textValue | string | — | Typeahead uchun matn (children oddiy matn bo'lmasa) |
Select.Group
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
label | ReactNode | — | Guruh sarlavhasi |
children | ReactNode | — | Guruhdagi Select.Item'lar |
Select.Separator — guruhlar orasidagi chiziq, faqat className qabul qiladi.
Data atributlari
| Atribut | Qayerda | Qiymat |
|---|---|---|
data-size | trigger | sm · md · lg |
data-state | trigger | open · closed |
data-placeholder | trigger | qiymat tanlanmaganda mavjud |
data-invalid | trigger | xato holatida mavjud |
data-disabled | trigger | o'chirilganda mavjud |
data-state | variant | checked · unchecked |
data-highlighted | variant | klaviatura yoki sichqoncha ustida turganda |
Klaviatura
| Tugma | Harakat |
|---|---|
Enter / Space / ↓ / ↑ | Trigger fokusda bo'lsa — panelni ochadi |
↓ / ↑ | Variantlar bo'ylab yurish (o'chirilganlari o'tkaziladi) |
Home / End | Birinchi / oxirgi variant |
| Harf | Shu harf bilan boshlanadigan variantga sakrash |
Enter / Space | Tanlash va yopish |
Esc | Qiymatni o'zgartirmay yopish, fokus triggerga qaytadi |
Accessibility
- Rollar. Trigger —
role="combobox"(aria-expandedbilan), panel —listbox, har bir variant —option(aria-selected). Asosida Radix Select turadi. - Field bilan bog'lanish.
Fieldichida label,descriptionvaerrormatnlari triggergaaria-labelledby/aria-describedbyorqali ulanadi; xatodaaria-invalid="true",requireddaaria-required="true"qo'yiladi. - Fokus. Panel ochilganda fokus tanlangan variantga o'tadi, yopilgach triggerga qaytadi.
- Nomsiz qoldirmang.
Fieldishlatmasangiz,aria-labelyozing (masalan,aria-label="Valyuta"). - Belgilar. Chevron, ✓ va
iconikonkalariaria-hidden— ekran o'quvchi faqat variant matnini o'qiydi.