ورودی (Input)
کامپوننت ورودی برای دریافت داده از کاربر
معرفی
کامپوننت ورودی برای دریافت دادههای مختلف از کاربر استفاده میشود.
چه زمانی استفاده نکنیم:
- برای متن چند خطی — از
Textareaاستفاده کنید - برای انتخاب از لیست — از
SelectیاAutocompleteاستفاده کنید - برای جستجو با قابلیت autocomplete — از
SearchInputاستفاده کنید
استفاده
import { Input } from '@partodata/ui'<Input placeholder="نام خود را وارد کنید" />زمین بازی
با تغییر تنظیمات زیر، ورودی را به صورت زنده مشاهده کنید.
import { Input } from '@partodata/ui'
<Input size="sm" placeholder="متن راهنما..." />اندازهها
کامپوننت Input از پنج اندازهٔ نردبان کنترلها پشتیبانی میکند. اندازهٔ پیشفرض md (38 پیکسل، متن 14) است، اندازهٔ فیلد فرم؛ در نوار ابزار صفحه (PageToolbar)، FilterBar و سرِ کارتها و سربرگها همان ردیف آن را sm (30 پیکسل) میکند تا با دکمهها همقد باشد (اندازه و تراکم).
<Input size="xs" placeholder="اندازه xs" />
<Input size="sm" placeholder="اندازه sm (نوار ابزار)" />
<Input size="md" placeholder="اندازه md (پیشفرض)" />
<Input size="lg" placeholder="اندازه lg" />
<Input size="xl" placeholder="اندازه xl" />نوع فیلد (kind)
ایمیل، رمز، نشانی وب، تلفن و بقیه هر کدام یک kind دارند و در همهٔ محصولات همان فیلدند. kind نوع ورودی، صفحهکلید
موبایل، تکمیل خودکار، غلطیاب و جهت را میگذارد: مقدار لاتین (ایمیل، نشانی، تلفن، رمز، نام کاربری، عدد) در فرم فارسی هم
چپبهراست و چپچین است، و password دکمهٔ نمایش رمز را خودش دارد. type و dir و autoComplete را دستی ننویسید؛
قاعدهٔ parto/input-kind همین را گوشزد میکند.
kind | کاربرد | چه میگذارد |
|---|---|---|
text | متن فارسی (پیشفرض) | هیچ |
email | ایمیل | type="email"، صفحهکلید ایمیل، autoComplete="email"، LTR، نمونهٔ لاتین |
url | نشانی وب | type="url"، صفحهکلید نشانی، LTR، نمونهٔ https://example.com |
tel | تلفن | type="tel"، صفحهکلید عددی، autoComplete="tel"، LTR |
password | رمز عبور | type="password"، دکمهٔ نمایش رمز، LTR پایدار هنگام نمایش |
username | نام کاربری لاتین | autoComplete="username"، بدون غلطیاب، LTR |
number | عدد یا مبلغ | صفحهکلید اعشاری، LTR |
search | جستوجو درون فهرست | type="search"، کلید «جستوجو» روی صفحهکلید |
<Input kind="email" />
<Input kind="password" autoComplete="new-password" /> {/* ثبتنام: هر ویژگی صریح بر پیشفرض kind میچربد */}پیشوند و پسوند (startAdornment، endAdornment)
متن ثابت (https://، واحد پول)، آیکون یا دکمهای کنار مقدار، همه با همین دو ویژگی ساخته میشوند؛ حلقهٔ فوکوس و مرز روی کل
فیلد است و فاصلهٔ متن از آدورنمنت را خود Input اندازه میگیرد. InputGroup مدل دوم همین کار بود و منسوخ است.
import { Button, Input } from '@partodata/ui'
import { Search } from 'lucide-react'
<Input kind="url" startAdornment="https://" placeholder="example.com" />
<Input kind="search" startAdornment={<Search aria-hidden="true" />} placeholder="نام حساب" />
{/* مقدار عددی چپبهراست است؛ واحد در ابتدای آن مینشیند تا در خواندن راستبهچپ پس از عدد بیاید */}
<Input kind="number" startAdornment="تومان" />
<Input kind="url" readOnly value={link} endAdornment={<Button size="xs" variant="ghost">کپی</Button>} />عنوان یا توضیح بالای فیلد آدورنمنت نیست: آنها label و description در FormRow هستند.
غیرفعال
با برچسب
Props
کلاسبندی wrapper با آدورنمنت
وقتی startAdornment یا endAdornment میدهید، یک عنصر wrapper دور ورودی رندر میشود و همان چیدمان (عرض، margin, جایگذاری در grid) را کنترل میکند — نه خود <input>. className همیشه فقط روی <input> مینشیند؛ برای این کلاسهای چیدمانی از wrapperClassName استفاده کنید، وگرنه فیلد از آدورنمنت جدا به نظر میرسد:
import { Search } from 'lucide-react'
// درست — عرض روی wrapper است، آدورنمنت با فیلد همتراز میماند
;<Input wrapperClassName="w-64" endAdornment={<Search className="size-4" />} />
// نادرست — عرض روی خود input است، wrapper همچنان تمامعرض میماند
;<Input className="w-64" endAdornment={<Search className="size-4" />} />دسترسیپذیری
برای فرمهای معتبرسنجی، از aria-invalid و aria-describedby استفاده کنید تا خطاها برای کاربران صفحهخوان قابل درک باشند:
<div>
<Input aria-invalid="true" aria-describedby="email-error" value="invalid@" />
<p id="email-error" className="text-destructive text-sm mt-1">
آدرس ایمیل معتبر نیست
</p>
</div>راهنمای استفاده
بکنید
- همیشه از
<label>یاaria-labelبرای توصیف فیلد استفاده کنید - برای نمایش خطای اعتبارسنجی از
aria-invalid="true"وaria-describedbyاستفاده کنید و پیام خطا را واضح نمایش دهید - برای ایمیل، رمز، نشانی وب و تلفن
kindبدهید، نهtypeوdirدستی - از
placeholderبهعنوان مثال استفاده کنید، نه توضیحات اصلی فیلد - اندازهٔ پیشفرض
mdبرای فرمها مناسب است؛ در ردیف ابزار اندازه را به ردیف بسپارید (PageToolbar،FilterBarیاControlSizeProvider) و برای صفحههای کمتراکم مثل ورود ازlgاستفاده کنید
نکنید
- از
placeholderبهجایlabelاستفاده نکنید — برای کاربران صفحهخوان مشکل ایجاد میکند - بدونlabelیاaria-labelفیلد نگذارید - روی تکتک فیلدهای یک ردیفsizeننویسید؛ اندازه را یکجا به ردیف بدهید
کامپوننتهای مرتبط
- Textarea — برای ورودی چند خطی
- Select — اگر کاربر باید از بین گزینههای از پیشتعریفشده انتخاب کند، نه متن آزاد بنویسد
- Autocomplete — اگر ورودی متنی به جستجو و پیشنهاد خودکار بین گزینهها نیاز دارد
- SearchInput — برای جستجو با آیکون و clear button
- Form — وقتی چند فیلد دارید و اعتبارسنجی، label و پیام خطا باید یکپارچه مدیریت شوند
- راهنمای انتخاب کامپوننت — مقایسه همه ورودیها