ComboBox
مثل Select قابلفیلتر است، ولی برخلاف Autocomplete مقدار تایپشده حتی اگر در فهرست نباشد هم پذیرفته میشود؛ برای فیلدهایی که فهرست فقط پیشنهاد است، نه محدودیت.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/combobox.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/combobox.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/combobox.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/combobox.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import { ComboBox } from "@/components/ui/combobox"
<ComboBox items={frameworks} value={text} onValueChange={setText} />این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
value همیشه متنِ خامِ فیلد است، نه value یک گزینهٔ ثابت (برخلاف Autocomplete که value را از میان items میگیرد)؛ چون هدف ComboBox پذیرفتن مقدار دلخواه هم هست.
اگر متن با برچسب یکی از گزینهها دقیقاً یکی باشد، همان گزینه در فهرست تیک میخورد، وگرنه فهرست فقط فیلتر میشود بدون انتخاب مشخص.
دکمهٔ فلش کنار فیلد، فهرست را بدون نیاز به تایپ هم باز میکند.
دسترسپذیری
- role=combobox روی input با aria-expanded/aria-controls/aria-activedescendant، مثل Autocomplete.
- دکمهٔ فلش tabIndex=-1 دارد تا در چرخهٔ Tab اضافه نشود؛ فقط با ماوس/لمس فهرست را باز/بسته میکند.
- چون مقدار دلخواه هم مجاز است، هیچ اعتبارسنجیِ «باید از فهرست باشد» اعمال نمیشود؛ اگر چنین محدودیتی لازم دارید از Autocomplete استفاده کنید.
مرجع API
ComboBox
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| items | { value: string; label: string; disabled?: boolean }[] | — | فهرست پیشنهادها. |
| value / defaultValue | string | — | متنِ کنترلشده یا اولیهٔ فیلد (نه value یک گزینه). |
| onValueChange | (value: string) => void | — | فراخوانی هنگام تغییر متن یا انتخاب یک گزینه. |
| placeholder | string | "انتخاب یا تایپ کنید…" | متن راهنمای فیلد. |
| emptyText | string | "چیزی پیدا نشد" | متن هنگام خالیبودن نتیجهٔ فیلتر. |
| disabled | boolean | false | غیرفعال کردن کل فیلد. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
با برچسب و مقدار اولیه
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
مقدار دلخواه خارج از فهرست
چیزی که در فهرست نیست هم تایپ و پذیرفته میشود؛ هیچ گزینهای در فهرست تیک نمیخورد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
غیرفعال
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نامعتبر (Invalid)
ComboBox پراپ invalid ندارد؛ حاشیهٔ خطا را با className روی دکمهٔ تریگر بگذارید و پیام را زیرش بنویسید. پیش از اولین تلاشِ ثبت، خطا نشان ندهید.
برای دعوت عضو، نقش را مشخص کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
غیرفعال در برابر مقدار قطعیشده
مقدارِ غیرفعال خاکستری و غیرقابل کپی است. اگر انتخاب قطعی شده و فقط باید دیده شود، بهجای کنترل، متن بگذارید.
غیرقابل کپی
داده است، نه کنترل
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت گزینهها (Loading)
تا رسیدن گزینهها کنترل را قفل کنید و placeholder را گویا بگذارید، وگرنه کاربر باز میکند و فهرست خالی میبیند و فکر میکند چیزی وجود ندارد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نتیجهٔ خالی (Empty)
متن پیشفرض «چیزی پیدا نشد» است. با emptyText بگویید در چه چیزی جستجو شده؛ «نقشی با این نام تعریف نشده» خیلی گویاتر است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
عنوان بلند (Overflow)
عرض ثابت بدهید تا دکمه با محتوا کش نیاید و چیدمان فرم ثابت بماند. اگر شرح گزینه بلند است، جایش داخل عنوان نیست.
عرض ثابت بدهید تا دکمه با محتوا کش نیاید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| با برچسب و مقدار اولیه | فرم ویرایش که مقدار قبلی کاربر باید از قبل در فیلد نشسته باشد |
| مقدار دلخواه خارج از فهرست | چیزی که در فهرست نیست هم تایپ و پذیرفته میشود؛ هیچ گزینهای در فهرست تیک نمیخورد. |
| غیرفعال | فیلدی که تا تکمیل مرحلهٔ قبلِ فرم نباید قابل تعامل باشد |
| نامعتبر (Invalid) | انتخاب اجباری که کاربر ردش کرده و فرم را ثبت کرده |
| غیرفعال در برابر مقدار قطعیشده | نقشی که پس از ساخت سازمان دیگر عوض نمیشود |
| در حال دریافت گزینهها (Loading) | فهرست نقشها یا دستهها که با باز شدن فرم میآید |
| نتیجهٔ خالی (Empty) | جستجویی که به هیچ گزینهای نمیخورد |
| عنوان بلند (Overflow) | گزینههایی که شرحشان داخل عنوان آمده |