SearchField
SearchField روی TextField سوار است و چیزهایی که مخصوص جستجو هستند را اضافه میکند: آیکون ذرهبین، دکمهٔ پاککردن (روشن بهصورت پیشفرض)، Escape برای پاککردن سریع، onSearch برای لحظهٔ Enter، و نشانهٔ کلید میانبر (مثل ⌘K) که وقتی فیلد خالی و بیفوکوس است دیده میشود. خودِ فیلد هیچ منطق فیلتری ندارد: برای نوار جستجو-بههمراه-فیلتر آن را با Select و Calendar موجود ترکیب کنید (نمونهٔ With Filters پایین).
این کامپوننت فعلاً برای ۰ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/search-field.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/search-field.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/search-field.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/search-field.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import { SearchField } from "@/components/ui/search-field"
<SearchField aria-label="جستجو" placeholder="جستجو…" />
// با Enter صدا زده میشود؛ onValueChange با هر نویسه اجرا میشود
<SearchField
aria-label="جستجوی محصول"
onValueChange={setQuery}
onSearch={(value) => runSearch(value)}
/>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
SearchField دکمهٔ پاککردنِ خودِ Input را با clearable پیشفرض روشن نگه میدارد و آیکون جستجو را بهعنوان startContent میگذارد؛ یعنی هیچ استایل تازهای نساخته، فقط از سیستم اسلاتبندیِ موجود Input استفاده کرده است.
پاککردن با Escape هم دقیقاً همان راهی را میرود که خودِ دکمهٔ پاککردن Input میرود (setNativeValue)، نه یک state جداگانه؛ پس در حالت uncontrolled هم واقعاً مقدار روی صفحه پاک میشود، نه فقط رویداد onValueChange شلیک میشود.
نشانهٔ کلید میانبر با endContent میآید و بهمحض تایپ یا فوکوس محو میشود، همان الگویی که جعبهٔ جستجوی همین مستندات (بالای سایدبار) استفاده میکند.
دسترسپذیری
- وقتی برچسب دیدهشدنی ندارید (اکثر جعبههای جستجوی نوار ابزار)، aria-label بدهید؛ بدون آن صفحهخوان فقط «فیلد جستجو» میگوید و نمیگوید جستجوی چه چیزی.
- دکمهٔ پاککردن با Tab قابلدسترسی نیست (tabIndex={-1}, میراثِ خودِ Input) چون همیشه کنار مقدار قابلمشاهده است؛ Escape همان کار را از صفحهکلید انجام میدهد.
- نشانهٔ کلید میانبر با kbd و dir="ltr" است تا در صفحهٔ راستبهچپ هم به ترتیب درست خوانده شود؛ pointer-events-none دارد پس کلیک رویش وارد فیلد میشود.
- type="search" به صفحهخوان میگوید این یک فیلد جستجوست، نه یک فیلد متنی عمومی.
مرجع API
SearchField
هر propای که اینجا نیست به TextField و از آنجا به Input میرسد: label، description، errorMessage، invalid، size، variant، color، fullWidth و…
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| onSearch | (value: string) => void | — | با فشردن Enter صدا زده میشود؛ برای اجرای واقعی جستجو (fetch)، نه فیلتر زنده. |
| loading | boolean | false | آیکون جستجو را با اسپینر عوض میکند و دکمهٔ پاککردن را غیرفعال نگه میدارد. |
| shortcut | React.ReactNode | — | نشانهٔ کلید میانبر (مثل «Ctrl+K»)؛ فقط وقتی فیلد خالی و بیفوکوس است دیده میشود. خودش میانبر را ثبت نمیکند: فقط نمایش است. |
| icon | React.ReactNode | <SearchIcon /> | آیکون سفارشی بهجای ذرهبین پیشفرض. |
| clearable | boolean | true | دکمهٔ پاککردن؛ برخلاف Input که پیشفرضش خاموش است، اینجا روشن است. |
| clearOnEscape | boolean | true | کلید Escape مقدار را پاک میکند و فوکوس را نگه میدارد. |
| value / defaultValue / onValueChange | string / string / (value: string) => void | — | هر دو حالت controlled و uncontrolled کار میکنند. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
Basic
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Sizes and Variants
همان محور size و variant خودِ Input را میگیرد چون روی همان سوار است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
With Keyboard Shortcut
shortcut فقط وقتی فیلد خالی و بیفوکوس است دیده میشود؛ کلیک یا تایپ کنید تا محو شود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Loading
آیکون ذرهبین جای خودش را به اسپینر میدهد و دکمهٔ پاککردن غیرفعال میماند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Controlled + onSearch
value/onValueChange برای فیلتر زنده روی هر نویسه، onSearch برای لحظهٔ Enter.
۴ نتیجه
- آرمیتا رضایی، طراح
- سینا احمدی، توسعهدهنده
- نگار محمدی، توسعهدهنده
- کیان حسینی، مدیر محصول
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
With Filters
SearchField هیچ منطق فیلتری ندارد؛ نوار فیلتر از ترکیب Select (تکی و چندتایی با نمایش چیپ) و Popover+Calendar ساخته شده: همان کامپوننتهایی که جای دیگر پروژه هم استفاده میشوند.
۴ نتیجه
- آرمیتا رضاییطراح
- سینا احمدیتوسعهدهنده
- نگار محمدیتوسعهدهنده
- کیان حسینیمدیر محصول
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Disabled and Read-only
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| Basic | جستجوی ساده در بالای یک لیست یا صفحه |
| Sizes and Variants | همان محور size و variant خودِ Input را میگیرد چون روی همان سوار است. |
| With Keyboard Shortcut | shortcut فقط وقتی فیلد خالی و بیفوکوس است دیده میشود؛ کلیک یا تایپ کنید تا محو شود. |
| Loading | آیکون ذرهبین جای خودش را به اسپینر میدهد و دکمهٔ پاککردن غیرفعال میماند. |
| Controlled + onSearch | value/onValueChange برای فیلتر زنده روی هر نویسه، onSearch برای لحظهٔ Enter. |
| With Filters | SearchField هیچ منطق فیلتری ندارد؛ نوار فیلتر از ترکیب Select (تکی و چندتایی با نمایش چیپ) و Popover+Calendar ساخته شده: همان کامپوننتهایی که جای دیگر پروژه هم استفاده میشوند. |
| Disabled and Read-only | جستجویی که تا بارگذاری کامل دادهها موقتاً قابل استفاده نیست |
دستورالعمل استفاده
onSearch برای اجرای جستجو، onValueChange برای فیلتر زنده
انجام بده
برای جستجوی سمت سرور که هزینه دارد (fetch)، با onSearch فقط روی Enter صدا بزنید. برای فیلتر آنی روی دادهای که همینجا دارید، از onValueChange استفاده کنید.
انجام نده
صداکردن یک fetch سنگین داخل onValueChange یعنی با هر نویسه یک درخواست شبکه: بدون debounce عملاً سرور را زیر بار میگذارد.
نشانهٔ کلید میانبر فقط وقتی واقعاً کار میکند
انجام بده
shortcut را فقط وقتی بدهید که واقعاً یک event listener سراسری (مثل Ctrl+K) فیلد را فوکوس میکند: همانطور که جعبهٔ جستجوی سایدبار همین مستندات کار میکند.
انجام نده
نشانهٔ تزئینی بدون میانبر واقعی، کاربر را به فشردن کلیدی وامیدارد که هیچ کاری نمیکند.