ListBox
فهرست گزینههای همیشهرویصفحه (نه داخل پاپاور مثل Select) با انتخاب تکی یا چندتایی، ناوبری فلشی و typeahead. پایهٔ Autocomplete و ComboBox هم همین کامپوننت است.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/listbox.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/listbox.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/listbox.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/listbox.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import { ListBox, ListBoxItem } from "@/components/ui/listbox"
<ListBox value={value} onValueChange={setValue} aria-label="میوه">
<ListBoxItem value="apple">سیب</ListBoxItem>
<ListBoxItem value="banana">موز</ListBoxItem>
</ListBox>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
ListBox خودش هیچ پاپاور/تریگری ندارد؛ برای فهرست دائمیرویصفحه (مثل ستون کناری ایمیل) مستقیم استفاده کنید.
برای فهرست شناور روی یک دکمه، آن را داخل Popover بگذارید؛ Select و Autocomplete دقیقاً همین کار را با پیادهسازی داخلی خودشان میکنند.
دسترسپذیری
- role=listbox روی ظرف و role=option روی هر آیتم؛ aria-selected و aria-multiselectable خودکار مدیریت میشوند.
- فقط یک آیتم tabIndex=0 دارد (roving-tabindex)؛ باقی با فلش بالا/پایین قابلدسترسیاند، Home/End به اول/آخر میپرد.
- تایپ کردن حروف، به اولین گزینهای که با آن حروف شروع میشود میپرد (typeahead).
- حتماً aria-label یا aria-labelledby روی ListBox بگذارید.
مرجع API
ListBox
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| selectionMode | "single" | "multiple" | "single" | حالت انتخاب. |
| value / defaultValue | string | string[] | — | بسته به selectionMode، رشته یا آرایه. |
| onValueChange | (value) => void | — | فراخوانی هنگام تغییر انتخاب. |
ListBoxItem
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| value | string | — | مقدار یکتای گزینه. |
| disabled | boolean | false | غیرفعال کردن گزینه. |
ListBoxSection
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| title | React.ReactNode | — | عنوان بخش. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
انتخاب چندتایی
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
بخشبندیشده
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
گزینهٔ غیرفعال
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
خالی (Empty)
فهرست خالی نباید یک کادر خالی باشد؛ بگویید چه چیزی پیدا نشد و چه کند.
موردی پیدا نشد
عبارت جستجو را کوتاهتر کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت (Loading)
جای خالیِ همشکل با ردیف واقعی بگذارید تا با رسیدن داده، ارتفاع نپرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| انتخاب چندتایی | فیلتر کردن نتایج بر اساس چند دسته یا برچسب همزمان |
| بخشبندیشده | فهرست شهرها یا استانها که باید زیر عنوان استان گروهبندی شوند |
| گزینهٔ غیرفعال | کالایی که فعلاً ناموجود است ولی باید در فهرست دیده شود |
| خالی (Empty) | نتیجهٔ جستجویی که به هیچ موردی نمیخورد |
| در حال دریافت (Loading) | فهرستی که گزینههایش از سرور میآید |