ناحیه متن (Textarea)
کامپوننت ناحیه متن برای ورودی متن چندخطی در فرمها.
نصب (Installation)
1npx @quark-lab/rad-ui add textareaنمونهها (Examples)
استفاده پایه (Basic Usage)
استفاده ساده از ناحیه متن.
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2
3export default function BasicExample() {
4 return <Textarea placeholder="پیام خود را اینجا بنویسید..." />;
5}
6با برچسب (With Label)
استفاده از ناحیه متن همراه با برچسب.
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2import { Label } from "@/components/ui/label";
3
4export default function WithLabelExample() {
5 return (
6 <div className="space-y-2">
7 <Label htmlFor="message">پیام شما</Label>
8 <Textarea id="message" placeholder="متن خود را وارد کنید..." />
9 </div>
10 );
11}
12اندازههای مختلف (Different Sizes)
تنظیم تعداد خطوط پیشفرض ناحیه متن.
کوچک (Small - 2 rows)
متوسط (Medium - 4 rows)
بزرگ (Large - 8 rows)
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2
3export default function SizesExample() {
4 return (
5 <div className="space-y-6">
6 <div className="grid w-full gap-2">
7 <h3 className="text-sm font-medium">کوچک (Small - 2 rows)</h3>
8 <Textarea
9 rows={2}
10 placeholder="ناحیه متن کوچک..."
11 className="min-h-[40px]"
12 />
13 </div>
14 <div className="grid w-full gap-2">
15 <h3 className="text-sm font-medium">متوسط (Medium - 4 rows)</h3>
16 <Textarea rows={4} placeholder="ناحیه متن متوسط..." />
17 </div>
18 <div className="grid w-full gap-2">
19 <h3 className="text-sm font-medium">بزرگ (Large - 8 rows)</h3>
20 <Textarea
21 rows={8}
22 placeholder="ناحیه متن بزرگ..."
23 className="min-h-[120px]"
24 />
25 </div>
26 </div>
27 );
28}
29حالت غیرفعال (Disabled State)
ناحیه متن غیرفعال که کاربر نمیتواند آن را ویرایش کند.
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2import { Label } from "@/components/ui/label";
3
4export default function DisabledExample() {
5 return (
6 <div className="space-y-2">
7 <Label htmlFor="disabled">توضیحات</Label>
8 <Textarea
9 id="disabled"
10 disabled
11 placeholder="این فیلد غیرفعال است..."
12 value="این متن قابل ویرایش نیست"
13 />
14 </div>
15 );
16}
17با شمارنده کاراکتر (With Character Count)
نمایش تعداد کاراکترهای وارد شده.
0 / 200
مشاهده کد
1import { useState } from "react";
2import { Textarea } from "@/components/ui/textarea";
3import { Label } from "@/components/ui/label";
4
5export default function CharacterCountExample() {
6 const [message, setMessage] = useState("");
7 const maxLength = 200;
8
9 return (
10 <div className="space-y-2">
11 <Label htmlFor="char-count">توضیحات کوتاه</Label>
12 <Textarea
13 id="char-count"
14 placeholder="حداکثر 200 کاراکتر..."
15 value={message}
16 onChange={(e) => setMessage(e.target.value)}
17 maxLength={maxLength}
18 />
19 <p className="text-sm text-muted-foreground text-left" dir="ltr">
20 {message.length} / {maxLength}
21 </p>
22 </div>
23 );
24}
25فقط خواندنی (Read-only)
ناحیه متن که فقط برای نمایش متن است و قابل ویرایش نیست.
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2import { Label } from "@/components/ui/label";
3
4export default function ReadOnlyExample() {
5 return (
6 <div className="space-y-2">
7 <Label htmlFor="readonly">اطلاعات</Label>
8 <Textarea
9 id="readonly"
10 readOnly
11 value="این متن فقط خواندنی است و نمیتوان آن را ویرایش کرد. برای نمایش اطلاعات ثابت استفاده میشود."
12 />
13 </div>
14 );
15}
16با دکمه (With Button)
ترکیب ناحیه متن با دکمه ارسال.
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2import { Label } from "@/components/ui/label";
3import { Button } from "@/components/ui/button";
4import { Send } from "lucide-react";
5
6export default function WithButtonExample() {
7 return (
8 <div className="space-y-4">
9 <div className="space-y-2">
10 <Label htmlFor="message-send">پیام شما</Label>
11 <Textarea
12 id="message-send"
13 placeholder="پیام خود را بنویسید..."
14 />
15 </div>
16 <div className="flex justify-end">
17 <Button>
18 <Send className="ms-2 h-4 w-4" />
19 ارسال
20 </Button>
21 </div>
22 </div>
23 );
24}
25حالتهای اعتبارسنجی (Validation States)
نمایش وضعیتهای معتبر و نامعتبر.
نظر شما با موفقیت ذخیره شد!
لطفا حداقل 10 کاراکتر وارد کنید
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2import { Label } from "@/components/ui/label";
3
4export default function ValidationExample() {
5 return (
6 <div className="space-y-6">
7 <div className="space-y-2">
8 <Label htmlFor="valid">نظر شما</Label>
9 <Textarea
10 id="valid"
11 placeholder="نظر خود را بنویسید..."
12 className="border-green-500 focus-visible:ring-green-500"
13 defaultValue="این یک ورودی معتبر است"
14 />
15 <p className="text-sm text-green-600">نظر شما با موفقیت ذخیره شد!</p>
16 </div>
17
18 <div className="space-y-2">
19 <Label htmlFor="invalid">توضیحات</Label>
20 <Textarea
21 id="invalid"
22 placeholder="لطفا توضیحات وارد کنید..."
23 aria-invalid="true"
24 className="border-destructive focus-visible:ring-destructive"
25 />
26 <p className="text-sm text-destructive">
27 لطفا حداقل 10 کاراکتر وارد کنید
28 </p>
29 </div>
30 </div>
31 );
32}
33کنترل تغییر اندازه (Resize Control)
کنترل قابلیت تغییر اندازه ناحیه متن توسط کاربر.
تغییر اندازه عمودی (Vertical Resize)
بدون تغییر اندازه (No Resize)
تغییر اندازه در دو جهت (Both Directions)
مشاهده کد
1import { Textarea } from "@/components/ui/textarea";
2
3export default function ResizeExample() {
4 return (
5 <div className="space-y-6">
6 <div className="grid w-full gap-2">
7 <h3 className="text-sm font-medium">تغییر اندازه عمودی (Vertical Resize)</h3>
8 <Textarea
9 placeholder="میتوانید ارتفاع را تغییر دهید..."
10 className="resize-y"
11 />
12 </div>
13
14 <div className="grid w-full gap-2">
15 <h3 className="text-sm font-medium">بدون تغییر اندازه (No Resize)</h3>
16 <Textarea
17 placeholder="اندازه ثابت است..."
18 className="resize-none"
19 />
20 </div>
21
22 <div className="grid w-full gap-2">
23 <h3 className="text-sm font-medium">تغییر اندازه در دو جهت (Both Directions)</h3>
24 <Textarea
25 placeholder="میتوانید عرض و ارتفاع را تغییر دهید..."
26 className="resize"
27 />
28 </div>
29 </div>
30 );
31}
32مثالهای پیشرفته (Advanced Examples)
فرم نظرات با اعتبارسنجی (Comment Form with Validation)
فرم کامل ثبت نظر با اعتبارسنجی طول متن.
0 / 10 حداقل
مشاهده کد
1import { useState } from "react";
2import { Textarea } from "@/components/ui/textarea";
3import { Label } from "@/components/ui/label";
4import { Button } from "@/components/ui/button";
5
6export default function CommentFormExample() {
7 const [comment, setComment] = useState("");
8 const [error, setError] = useState("");
9 const minLength = 10;
10
11 const handleSubmit = () => {
12 if (comment.length < minLength) {
13 setError(`لطفا حداقل ${minLength} کاراکتر وارد کنید`);
14 return;
15 }
16 alert("نظر شما ثبت شد!");
17 setComment("");
18 setError("");
19 };
20
21 return (
22 <div className="space-y-4">
23 <div className="space-y-2">
24 <Label htmlFor="comment">نظر شما *</Label>
25 <Textarea
26 id="comment"
27 value={comment}
28 onChange={(e) => {
29 setComment(e.target.value);
30 setError("");
31 }}
32 placeholder="نظر خود را بنویسید..."
33 aria-invalid={!!error}
34 className={error ? "border-destructive" : ""}
35 />
36 {error && (
37 <p className="text-sm text-destructive">{error}</p>
38 )}
39 <p className="text-sm text-muted-foreground">
40 {comment.length} / {minLength} حداقل
41 </p>
42 </div>
43 <Button onClick={handleSubmit}>ارسال نظر</Button>
44 </div>
45 );
46}
47مرجع API (API Reference)
Textarea
پراپهای کامپوننت Textarea.
| پراپ (Prop) | نوع (Type) | پیشفرض (Default) | توضیحات (Description) |
|---|---|---|---|
placeholder | string | undefined | متن راهنما |
value | string | undefined | مقدار کنترل شده |
defaultValue | string | undefined | مقدار پیشفرض (غیرکنترل شده) |
onChange | (e) => void | undefined | تابع فراخوانی هنگام تغییر مقدار |
rows | number | undefined | تعداد خطوط نمایشی |
maxLength | number | undefined | حداکثر تعداد کاراکترها |
disabled | boolean | false | غیرفعال کردن فیلد |
readOnly | boolean | false | فقط خواندنی |
required | boolean | false | اجباری بودن فیلد |
className | string | undefined | کلاسهای CSS سفارشی |
...props | TextareaHTMLAttributes | - | تمام ویژگیهای استاندارد HTML textarea |
دسترسیپذیری (Accessibility)
برچسبها (Labels)
همیشه از کامپوننت Label با htmlFor برای شناسایی فیلد استفاده کنید
پیامهای خطا (Error Messages)
از aria-invalid و aria-describedby برای پیامهای اعتبارسنجی استفاده کنید
متن راهنما (Placeholder)
از placeholder فقط برای نمونه استفاده کنید، نه به عنوان جایگزین برچسب
فیلدهای اجباری (Required Fields)
از ویژگی required و نشانگر بصری (مثل ستاره) استفاده کنید
بهترین شیوهها (Best Practices)
اندازه مناسب (Appropriate Size)
تعداد سطرها را بر اساس مقدار متن مورد انتظار تنظیم کنید. برای نظرات کوتاه 2-4 سطر و برای متون طولانیتر 6-8 سطر مناسب است
محدودیت کاراکتر (Character Limit)
اگر محدودیت دارید، حتما شمارنده کاراکتر نمایش دهید تا کاربر بداند چقدر فضا دارد
پیامهای راهنما (Helper Text)
از متن راهنما برای توضیح فرمت مورد انتظار یا الزامات خاص استفاده کنید
تغییر اندازه (Resizing)
به طور پیشفرض تنها تغییر اندازه عمودی فعال است. اگر نیاز به اندازه ثابت دارید از resize-none استفاده کنید