Textarea
ورودی متن چندخطی با ارتفاع خودکار (field-sizing) و پشتیبانی کامل از تایپ فارسی. دو واریانت بصری (default/flat) و fullWidth دارد؛ بدون هیچ وابستگی خارجی بهجز class-variance-authority که خودِ رجیستری نصبش میکند.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/textarea.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/textarea.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/textarea.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/textarea.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import { Textarea } from "@/components/ui/textarea"
<Textarea placeholder="توضیحات…" />
// با واریانت و fullWidth
<Textarea variant="flat" fullWidth={false} className="w-64" />این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
Textarea یک تگ بومی مستقل است، بدون برچسب یا پیام خطای توکار، عمداً از TextField جدا نگه داشته شده.
برای فیلد کامل (برچسب، توضیح، پیام خطا، اعتبارسنجی زنده) بهجایش از TextField با TextFieldTextarea استفاده کنید.
Textarea فعلاً فقط برای ریاکت پورت شده است.
دسترسپذیری
- همیشه با Label همراه شود تا ارتباط برچسب و فیلد برای صفحهخوان مشخص باشد.
- برای نمایش خطا از aria-invalid استفاده کنید؛ استایل خطا بهصورت خودکار اعمال میشود، در هر دو واریانت.
مرجع API
Textarea
همهٔ ویژگیهای استاندارد تگ textarea هم پشتیبانی میشود (rows، cols، maxLength، wrap و…).
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| variant | "default" | "flat" | "default" | حالت بصری فیلد. default حاشیه و سایه دارد؛ flat بدون سایه با پسزمینهٔ خاکستری خنثی، مناسب داخل ظرف/کارتی که خودش سایه دارد. |
| fullWidth | boolean | true | فیلد تمام عرض ظرفش را میگیرد. |
| hidePlaceholderOnFocus | boolean | true | با فوکوس (کلیک یا Tab) متن placeholder محو میشود تا کاربر بومی خالی برای تایپ ببیند؛ اگر بدون تایپ بیرون برود دوباره برمیگردد. |
| ...props | React.ComponentProps<"textarea"> | — | تمام ویژگیهای استاندارد textarea مانند rows، placeholder و disabled. |
Data Attributes
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| data-slot | "textarea" | — | برای استایلدهی یا انتخاب در تست. |
| data-variant | "default" | "flat" | — | مقدار فعلی واریانت. |
textareaVariants
اگر میخواهید همین کلاسها را روی عنصر دیگری بگذارید.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| textareaVariants({ variant, fullWidth }) | (options?) => string | — | import { textareaVariants } from "@/components/ui/textarea" |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
Variants
دو حالت بصری: default حاشیه و سایهٔ استاندارد دارد؛ flat بدون سایه و با پسزمینهٔ خاکستری خنثی، مناسب وقتی خودِ ظرف بیرونی سایه/حاشیه دارد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Full Width
پیشفرض تمامعرض است (مثل رفتار قبلی این کامپوننت)؛ برای فیلد کوتاه fullWidth را خاموش کنید و عرض بدهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Rows and Resizing
field-sizing-content بهصورت پیشفرض ارتفاع را خودکار با محتوا رشد میدهد. برای رفتار کلاسیک (تعداد خط ثابت با دستگیرهٔ تغییرِ ارتفاع دستی) field-sizing را با کلاس خاموش کنید و rows و resize را دستی بدهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Controlled
value و onChange مثل هر ورودی کنترلشدهٔ دیگر؛ اینجا برای شمارندهٔ نویسه در زیر فیلد استفاده شده.
۰ از ۲۸۰ نویسه
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Invalid
با aria-invalid حاشیه و حلقهٔ فوکوس قرمز میشود، در هر دو واریانت.
بیوگرافی باید حداقل ۲۰ نویسه باشد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Disabled
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
فقطخواندنی در برابر غیرفعال
این دو یکی نیستند. غیرفعال یعنی کنترلِ خاموش: نه انتخاب میشود نه کپی. فقطخواندنی یعنی دادهای که تغییر نمیکند ولی کاربر باید بتواند بخواند و بردارد. برای متنی که کاربر ممکن است لازم داشته باشد، همیشه readOnly.
نه قابل انتخاب است نه قابل کپی
قابل انتخاب و کپی، چون داده است نه کنترلِ خاموش
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال ذخیره (Loading)
تا وقتی ذخیره در راه است فیلد را قفل کنید و aria-busy بگذارید. متن دکمه هم باید وضعیت را بگوید، نه اینکه فقط غیرفعال شود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
متن بلند (Overflow)
دو راه دارد و انتخابش به چیدمان بستگی دارد: ارتفاع ثابت با اسکرول داخلی، یا رشد با محتوا تا یک سقف. راه دوم برای فرمهای بلند بهتر است ولی حتماً سقف بگذارید، وگرنه یک متن طولانی کل صفحه را میکشد.
ارتفاع ثابت و اسکرول داخلی؛ چیدمان صفحه ثابت میماند
با محتوا رشد میکند ولی از سقف بالاتر نمیرود
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| Variants | دو حالت بصری: default حاشیه و سایهٔ استاندارد دارد؛ flat بدون سایه و با پسزمینهٔ خاکستری خنثی، مناسب وقتی خودِ ظرف بیرونی سایه/حاشیه دارد. |
| Full Width | پیشفرض تمامعرض است (مثل رفتار قبلی این کامپوننت)؛ برای فیلد کوتاه fullWidth را خاموش کنید و عرض بدهید. |
| Rows and Resizing | field-sizing-content بهصورت پیشفرض ارتفاع را خودکار با محتوا رشد میدهد |
| Controlled | value و onChange مثل هر ورودی کنترلشدهٔ دیگر؛ اینجا برای شمارندهٔ نویسه در زیر فیلد استفاده شده. |
| Invalid | با aria-invalid حاشیه و حلقهٔ فوکوس قرمز میشود، در هر دو واریانت. |
| Disabled | متنی که فقط برای مرور نمایش داده میشود و قابل ویرایش نیست |
| فقطخواندنی در برابر غیرفعال | متن رد شدن یا یادداشت بایگانیشده که باید کپی شود |
| در حال ذخیره (Loading) | یادداشتی که با هر ثبت به سرور میرود |
| متن بلند (Overflow) | توضیحات چندسطری که طولش از قبل معلوم نیست |
دستورالعمل استفاده
همیشه با Label، نه فقط placeholder
انجام بده
یک Label با htmlFor بگذارید تا صفحهخوان بداند این ناحیهٔ متنی برای چیست؛ placeholder با شروع تایپ ناپدید میشود و بهتنهایی برچسب کافی نیست.
انجام نده
بدون Label، تنها راهنمای فیلد همان placeholder است که با اولین حرف تایپشده از بین میرود.
بگذار با field-sizing رشد کند
انجام بده
min-h پیشفرض کوچک است ولی field-sizing-content خودکار با محتوا بزرگ میشود؛ برای متنهای بلند رشد طبیعی بهتر از اسکرول داخلی است.
انجام نده
محدودکردن ارتفاع با style یا کلاس h-8 ثابت، رشد خودکار field-sizing را خنثی میکند و کاربر مجبور میشود داخل یک جعبهٔ کوچک اسکرول کند.
flat فقط داخل ظرفی که خودش حاشیه/سایه دارد
انجام بده
وقتی Textarea داخل یک کارت یا ظرف با پسزمینهٔ خودش مینشیند، variant="flat" بدهید تا سایهٔ دوم روی هم تلنبار نشود.
انجام نده
واریانت پیشفرض (با سایه و حاشیهٔ خودش) داخل یک کارتی که خودش حاشیه و پسزمینه دارد، دو لایهٔ قاب روی هم مینشیند و شلوغ دیده میشود.