Input
فیلد ورودی متن راستبهچپ: مکاننما از راست شروع میکند، فیلدهای عددی و ایمیل خودکار چپچین میشوند و ارقام فارسی نمایش داده ولی لاتین ارسال میشوند. پنج واریانت، پنج رنگ، سه اندازه، شعاع گوشه، محتوا و دکمه در دو سر فیلد، و دکمهٔ پاککردن.
کد، دستور نصب و مرجع API این صفحه با فریمورک انتخابی عوض میشود.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/input.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/input.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/input.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/input.jsonVue هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.
curl -O https://design-system-tau-green.vercel.app/r/vue/input.jsonSvelte هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.
curl -O https://design-system-tau-green.vercel.app/r/svelte/input.jsonAngular هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.
curl -O https://design-system-tau-green.vercel.app/r/angular/input.jsonاستفاده
import { Input } from "@/components/ui/input"
<Input type="text" placeholder="نام و نام خانوادگی" />
// با واریانت، رنگ و اندازه
<Input variant="bordered" color="primary" size="lg" placeholder="عنوان" /><script setup lang="ts">
import { ref } from "vue"
import Input from "@/components/ui/Input.vue"
const fullName = ref("")
</script>
<template>
<Input v-model="fullName" type="text" placeholder="نام و نام خانوادگی" />
</template><script lang="ts">
import Input from "$lib/components/ui/input.svelte";
let fullName = $state("");
</script>
<Input bind:value={fullName} type="text" placeholder="نام و نام خانوادگی" />import { Component } from "@angular/core"
import { FormsModule } from "@angular/forms"
import { DigInput } from "@/components/ui/input"
@Component({
selector: "app-demo",
standalone: true,
imports: [DigInput, FormsModule],
template: `
<input digInput type="text" placeholder="نام و نام خانوادگی"
[(ngModel)]="fullName" />
`,
})
export class DemoComponent {
fullName = ""
}ترکیب اجزا
Input ساختار دو لایه دارد: یک کادر (data-slot input-root) که حاشیه، پسزمینه، ارتفاع و گردی گوشه را دارد، و داخلش تگ بومی input که خودش بیرنگ و بیحاشیه است.
محتوای ابتدا/انتها و دکمهٔ پاککردن همردیفِ input در همان کادر flex مینشینند، پس هر عرضی داشته باشند - آیکون، کلمهٔ «تومان» یا یک دکمهٔ کامل - فضای واقعی میگیرند و روی متن نمیافتند. به همین دلیل className روی کادر مینشیند و inputClassName روی خود تگ input.
رنگ هم با یک متغیر CSS به اسم --field منتقل میشود: محور color فقط همین متغیر را ست میکند و محور variant تصمیم میگیرد رنگ روی حاشیه بنشیند، روی زیرخط، یا بهصورت پسزمینهٔ رقیق.
برای برچسب، توضیح و پیام خطا از TextField استفاده کنید.
توجه: همهٔ حالتهای این صفحه فعلاً فقط در نسخهٔ ریاکت هستند؛ پورت Vue/Svelte/Angular همچنان همان ورودی پایه است و در دست بهروزرسانی.
دسترسپذیری
- همیشه با Label و id متصل کنید؛ placeholder جایگزین برچسب نیست. TextField این اتصال را خودکار انجام میدهد.
- جهت پیشفرض rtl است تا مکاننما از راست شروع کند و placeholder فارسی درست بشکند؛ فیلدهای ذاتاً لاتین (عدد، ایمیل، نشانی، شمارهٔ تماس) خودکار ltr میشوند و با prop dir میتوانید هر کدام را بازنویسی کنید.
- فیلدهای عددی ارقام را فارسی نشان میدهند ولی مقدار لاتین میفرستند، پس کاربر با هر کیبوردی تایپ کند در اعتبارسنجی سرور خطا نمیگیرد.
- برای نمایش خطا aria-invalid و aria-describedby بدهید؛ استایل خطا خودکار اعمال میشود و بر رنگ واریانت اولویت دارد.
- دکمهٔ پاککردن aria-label دارد و از ترتیب Tab بیرون است (tabIndex=-1)، چون همان کار را میشود با انتخاب متن و Delete انجام داد؛ صفحهخوان همچنان آن را میبیند.
- در ورودی فایل، دکمهٔ بومی مرورگر پنهان و با دکمهٔ فارسی جایگزین میشود؛ خود تگ input نامرئی روی کل کادر میماند، پس فوکوس صفحهکلید و باز شدن پنجرهٔ انتخاب فایل دستنخورده است.
- در انگولار دایرکتیو روی تگ بومی مینشیند، پس ngModel و formControlName و اعتبارسنجی فرم بدون هیچ پلی کار میکنند.
مرجع API
Input
همهٔ ویژگیهای استاندارد تگ input هم پشتیبانی میشود. فقط size و color از نوع props نیتیو کنار گذاشته شدهاند چون محور واریانتاند.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| variant | "default" | "bordered" | "faded" | "flat" | "underlined" | "default" | حالت بصری فیلد. |
| color | "default" | "primary" | "success" | "warning" | "destructive" | "default" | رنگ معنایی، مستقل از واریانت. default یعنی همان ظاهر خنثای دیگ. |
| size | "sm" | "default" | "lg" | "default" | ارتفاع و padding و اندازهٔ متن فیلد. |
| radius | "none" | "sm" | "md" | "lg" | "full" | — | شعاع گوشه؛ اگر ندهید rounded-md پیشفرض بهکار میرود (و در underlined گوشه صاف است). |
| fullWidth | boolean | true | فیلد تمام عرض ظرفش را میگیرد. |
| type | string | "text" | نوع ورودی HTML (text، email، password، number و…). |
| dir | "rtl" | "ltr" | "auto" | "rtl" (یا "ltr" برای فیلدهای لاتین) | جهت فیلد. پیشفرض rtl است تا مکاننما از راست شروع کند؛ برای عدد، ایمیل، نشانی و شمارهٔ تماس خودکار ltr میشود. روی کل کادر مینشیند، پس محتوای ابتدا هم همجهت متن قرار میگیرد. |
| faDigits | boolean | خودکار برای فیلدهای عددی | ارقام را فارسی نشان میدهد و مقدار لاتین بیرون میدهد (در فرم با یک input مخفی). برای type="number"، type="tel" و inputMode عددی پیشفرض روشن است. |
| groupDigits | boolean | inputMode === "decimal" | ارقام را سهتا سهتا با جداکنندهٔ هزارگان (٬) گروهبندی میکند، بدون توجه به بزرگی عدد؛ مقداری که به فرم میرود همچنان بدون جداکننده است. برای کد ملی و شمارهٔ کارت پیشفرض خاموش است. |
| hidePlaceholderOnFocus | boolean | true | با فوکوس (کلیک یا Tab) متن راهنما محو میشود و اگر کاربر بدون تایپ بیرون برود دوباره برمیگردد. برای فیلدی که باید راهنما حین تایپ هم بماند، false بدهید. |
| startContent | React.ReactNode | — | محتوای ابتدای فیلد؛ در ردیف flex فضای واقعی میگیرد، پس روی متن نمیافتد. |
| endContent | React.ReactNode | — | محتوای انتهای فیلد (واحد پول، دکمهٔ جستجو، دکمهٔ نمایش رمز و…). |
| startContentSpacing / endContentSpacing | "default" | "tight" | "flush" | "default" | فاصلهٔ محتوای کناری تا لبه: default همان padding فیلد، tight چند پیکسل برای دکمهٔ کوچک، و flush چسبیده به لبه با تمام ارتفاع فیلد. |
| fileButtonLabel / filePlaceholder | string | "انتخاب فایل" / "فایلی انتخاب نشده" | متن دکمهٔ فارسیِ انتخاب فایل و متن جایخالی؛ فقط در type="file". |
| clearable | boolean | false | دکمهٔ پاککردن در انتهای فیلد. جایش همیشه رزرو است و فقط وقتی فیلد مقدار دارد دیده میشود. |
| onClear | () => void | — | بعد از کلیک روی دکمهٔ پاککردن صدا زده میشود. |
| onValueChange | (value: string) => void | — | مثل onChange ولی مستقیم رشتهٔ مقدار را میدهد؛ هر دو با هم کار میکنند. |
| clearButtonLabel | string | "پاککردن" | aria-label دکمهٔ پاککردن. |
| className | string | — | روی کادر بیرونی مینشیند (همانجا که حاشیه، پسزمینه، ارتفاع و گردی گوشه است) و با cn بر کلاسهای واریانت اولویت دارد. |
| inputClassName | string | — | کلاس خودِ تگ input داخل کادر. |
Data Attributes
روی تگ input مینشینند تا بتوانید بدون props استایل بدهید یا در تست انتخابشان کنید.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| data-slot | "input-root" | "input" | … | — | کادر بیرونی input-root است و تگ input داخلش input؛ اجزای دیگر input-start، input-end، input-clear و input-file. |
| data-variant / data-color / data-size | string | — | مقدار فعلی هر محور واریانت. |
| data-filled | "true" | "false" | — | آیا فیلد مقدار دارد؛ در هر دو حالت controlled و uncontrolled درست است. |
| data-disabled / data-readonly / data-required | "true" | undefined | — | بازتاب propهای نیتیو متناظر. |
inputVariants
اگر میخواهید همین کلاسها را روی عنصر دیگری بگذارید (مثلاً یک textarea یا یک div شبیه فیلد).
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| inputVariants({ variant, color, size, radius, fullWidth }) | (options?) => string | — | import { inputVariants } from "@/components/ui/input" |
Input.vue
پورت ویو فعلاً ورودی پایه است؛ محورهای واریانت و دکمهٔ پاککردن هنوز اضافه نشدهاند.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| v-model | string | number | — | پیوند دوطرفه با useVModel؛ اگر ندهید، ورودی uncontrolled میماند. |
| default-value | string | number | — | مقدار اولیه وقتی v-model نمیدهید. |
| class | HTMLAttributes['class'] | — | با cn ادغام میشود و بر کلاسهای پایه اولویت دارد. |
| …attrs | InputHTMLAttributes | — | type، placeholder، disabled و بقیه بهصورت fallthrough به تگ input میرسند. |
input.svelte
پورت اسولت فعلاً ورودی پایه است؛ محورهای واریانت و دکمهٔ پاککردن هنوز اضافه نشدهاند.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| value | string | number | null | — | قابل bind است: bind:value={email}. |
| ref | HTMLInputElement | null | null | قابل bind برای دسترسی مستقیم به عنصر. |
| class | string | — | با cn ادغام میشود و بر کلاسهای پایه اولویت دارد. |
| ...restProps | HTMLInputAttributes | — | بقیهٔ ویژگیهای input مستقیماً منتقل میشوند. |
DigInput
دایرکتیو standalone روی تگ بومی input. پورت انگولار فعلاً ورودی پایه است؛ محورهای واریانت و دکمهٔ پاککردن هنوز اضافه نشدهاند.
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| digInput | Directive | — | سلکتور دایرکتیو؛ روی تگ بومی input بگذارید تا استایل اعمال شود. |
| dir | "auto" | "rtl" | "ltr" | "auto" | جهت متن؛ پیشفرض auto است و بر اساس اولین نویسه تعیین میشود. |
| class | string | "" | کلاسهای شما با cn به کلاسهای پایه اضافه و در تعارضها برنده میشوند. |
نمونهها
Variants
پنج حالت بصری: default همان ظاهر خنثای دیگ است، bordered حاشیهٔ ضخیمتر دارد، faded پسزمینهٔ خنثا، flat پسزمینهٔ رقیقِ همرنگ و underlined فقط یک زیرخط.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Colors
رنگ مستقل از واریانت است؛ روی حاشیه، حلقهٔ فوکوس و پسزمینهٔ رقیق اثر میگذارد. default یعنی همان خاکستری خنثای دیگ.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Variant and Color
هر واریانت با هر رنگ ترکیب میشود؛ چون رنگ از متغیر --field میآید، افزودن رنگ تازه یک سطر است نه پنج ترکیب.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Sizes
سه اندازه، همارتفاع با اندازههای Button تا در یک ردیف کنار هم درست بنشینند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Radius
شعاع گوشه مستقل از اندازه تنظیم میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Start and End Content
آیکون یا متن کوتاه در ابتدا و انتهای فیلد. جهتها منطقیاند (start/end)، پس در RTL خودکار جابهجا میشوند و padding فیلد هم خودکار زیاد میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Button Inside
دکمه داخل خود فیلد مینشیند. با endContentSpacing="tight" چند پیکسل فاصله میماند (مناسب دکمهٔ کوچک) و با "flush" دکمه به لبه میچسبد و تمام ارتفاع فیلد را میگیرد؛ گوشههایش هم خودکار روی گردی فیلد بریده میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Persian Digits
فیلدهای عددی خودکار ارقام فارسی نشان میدهند و مقدار لاتین میفرستند. کاربر با هر کیبوردی (فارسی، عربی یا انگلیسی) تایپ کند روی صفحه ۰۱۲۳ میبیند و فرم 0123 میگیرد، پس هیچوقت بهخاطر شکل رقم خطا نمیگیرد. برای type="number"، inputMode عددی و type="tel" پیشفرض روشن است؛ روی یک فیلد متنی با faDigits روشنش کنید و با faDigits={false} خاموش.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Amount
مبلغ ریالی با حداکثر دو رقم اعشار. ارقام سهتا سهتا با جداکنندهٔ هزارگان گروهبندی میشوند، بدون توجه به بزرگی عدد، ولی چیزی که به سرور میرود بدون جداکننده و لاتین است. مکاننما هم با شمردن «چندمین رقم» جا نمیماند، چون گروهبندی طول رشته را عوض میکند. جداکنندهٔ اعشار کیبورد فارسی (٫) خودکار به نقطه تبدیل میشود تا parseFloat سمت سرور گیر ندهد.
مقداری که به سرور میرود: 1250000.2
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Clear Button
با clearable یک دکمهٔ پاککردن در انتهای فیلد میآید. جایش همیشه رزرو است، پس ظاهرشدنش متن را جابهجا نمیکند و فقط وقتی فیلد مقدار دارد دیده میشود. در حالت controlled هم کار میکند چون رویداد بومی input را شلیک میکند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Password Input
دکمهٔ نمایش/پنهانکردن رمز یک endContent ساده است؛ کامپوننت جدا لازم ندارد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Controlled
onValueChange مستقیم رشتهٔ مقدار را میدهد و لازم نیست هر بار event.target.value بنویسید؛ onChange هم مثل قبل کار میکند.
۸ از ۴۰ نویسه، مقدار: سلام دیگ
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Input Types
همهٔ typeهای استاندارد HTML پشتیبانی میشود. فیلد متنی و رمز عبور راستبهچپاند و ایمیل و عدد خودکار چپبهراست میشوند؛ فیلد عدد هم ارقام را فارسی نشان میدهد و لاتین میفرستد.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
With Label and Hint
فقط حروف لاتین، عدد و خط تیره مجاز است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
Placeholder on Focus
با فوکوس (کلیک یا Tab) متن راهنما بهطور پیشفرض محو میشود تا کاربر یک بوم خالی برای تایپ ببیند؛ اگر بدون تایپ بیرون برود دوباره برمیگردد. برای فیلدی که راهنما باید حین تایپ هم بماند، hidePlaceholderOnFocus={false} بدهید. روی هر دو فیلد کلیک کنید و تفاوت را ببینید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Label States
حالتهای برچسب: بالای فیلد، کنار فیلد، شناور داخل کادر، اجباری با ستارهٔ قرمز، همراه توضیح، و حالت خطا که برچسب را قرمز میکند. اینها را TextField میسازد، همان Input است با برچسب و توضیح و پیام خطا که خودش id و aria-describedby را وصل میکند.
این متن خودکار با aria-describedby به فیلد وصل میشود.
این فیلد را کامل کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Invalid
با aria-invalid حاشیه و حلقهٔ فوکوس قرمز میشود، حتی اگر رنگ یا واریانت دیگری داده باشید، چون انتخابگر خطا ویژگی بیشتری دارد.
قالب ایمیل درست نیست.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
With Button
ترکیب رایج جستجو یا اشتراک خبرنامه.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
Disabled and Read-only
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
Full Width
پیشفرض fullWidth روشن است؛ برای فیلد کوتاه آن را خاموش کنید و عرض بدهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
File
دکمهٔ بومی مرورگر متن انگلیسیِ ثابت دارد و با CSS ترجمه نمیشود، پس پنهانش میکنیم و دکمهٔ فارسی خودمان را در ابتدای فیلد (سمت راست) میگذاریم؛ نام فایل انتخابشده کنارش میآید. کلیک در هر نقطهٔ فیلد پنجرهٔ انتخاب فایل را باز میکند.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Vue دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Svelte دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
پیشنمایش با نسخهٔ ریاکت رندر شده است؛ پورت Angular دقیقاً همین کلاسهای Tailwind را دارد، پس خروجی بصری یکسان است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| Variants | پنج حالت بصری: default همان ظاهر خنثای دیگ است، bordered حاشیهٔ ضخیمتر دارد، faded پسزمینهٔ خنثا، flat پسزمینهٔ رقیقِ همرنگ و underlined فقط یک زیرخط. |
| Colors | رنگ مستقل از واریانت است؛ روی حاشیه، حلقهٔ فوکوس و پسزمینهٔ رقیق اثر میگذارد |
| Variant and Color | هر واریانت با هر رنگ ترکیب میشود؛ چون رنگ از متغیر --field میآید، افزودن رنگ تازه یک سطر است نه پنج ترکیب. |
| Sizes | سه اندازه، همارتفاع با اندازههای Button تا در یک ردیف کنار هم درست بنشینند. |
| Radius | شعاع گوشه مستقل از اندازه تنظیم میشود. |
| Start and End Content | آیکون یا متن کوتاه در ابتدا و انتهای فیلد |
| Button Inside | دکمه داخل خود فیلد مینشیند |
| Persian Digits | فیلدهای عددی خودکار ارقام فارسی نشان میدهند و مقدار لاتین میفرستند |
| Amount | مبلغ ریالی با حداکثر دو رقم اعشار |
| Clear Button | با clearable یک دکمهٔ پاککردن در انتهای فیلد میآید |
| Password Input | دکمهٔ نمایش/پنهانکردن رمز یک endContent ساده است؛ کامپوننت جدا لازم ندارد. |
| Controlled | onValueChange مستقیم رشتهٔ مقدار را میدهد و لازم نیست هر بار event.target.value بنویسید؛ onChange هم مثل قبل کار میکند. |
| Input Types | همهٔ typeهای استاندارد HTML پشتیبانی میشود |
| With Label and Hint | فیلد نام کاربری در فرم ثبتنام که باید قاعدهٔ مجاز کاراکترها را از قبل بگوید |
| Placeholder on Focus | با فوکوس (کلیک یا Tab) متن راهنما بهطور پیشفرض محو میشود تا کاربر یک بوم خالی برای تایپ ببیند؛ اگر بدون تایپ بیرون برود دوباره برمیگردد |
| Label States | حالتهای برچسب: بالای فیلد، کنار فیلد، شناور داخل کادر، اجباری با ستارهٔ قرمز، همراه توضیح، و حالت خطا که برچسب را قرمز میکند |
| Invalid | با aria-invalid حاشیه و حلقهٔ فوکوس قرمز میشود، حتی اگر رنگ یا واریانت دیگری داده باشید، چون انتخابگر خطا ویژگی بیشتری دارد. |
| With Button | ترکیب رایج جستجو یا اشتراک خبرنامه. |
| Disabled and Read-only | فیلدی که فعلاً قابل ویرایش نیست، در برابر فیلدی که مقدارش ثبتشده و فقط نمایشی است |
| Full Width | پیشفرض fullWidth روشن است؛ برای فیلد کوتاه آن را خاموش کنید و عرض بدهید. |
| File | دکمهٔ بومی مرورگر متن انگلیسیِ ثابت دارد و با CSS ترجمه نمیشود، پس پنهانش میکنیم و دکمهٔ فارسی خودمان را در ابتدای فیلد (سمت راست) میگذاریم؛ نام فایل انتخابشده کنارش میآید |
دستورالعمل استفاده
برچسب واقعی، نه placeholder
انجام بده
برچسب را با TextField (یا Label و id) بدهید؛ متن راهنما بعد از شروع تایپ محو میشود و کاربر باید بداند این فیلد چیست.
انجام نده
فیلدِ فقط با placeholder، بهمحض تایپ بینام میشود؛ کاربر برای فهمیدن اینکه چه خواستهاید باید فیلد را پاک کند و صفحهخوان هم برچسبی برای خواندن ندارد.
جهت را به محتوا بسپارید
انجام بده
فیلدهای ذاتاً لاتین مثل ایمیل و شمارهٔ کارت خودکار چپچین میشوند؛ همین پیشفرض را نگه دارید تا مکاننما و ترتیب نویسهها درست بماند.
انجام نده
تحمیل rtl به محتوای لاتین، جای نقطه و @ و ترتیب گروههای عدد را بههم میریزد و ویرایش وسط متن را برای کاربر گیجکننده میکند.
خطا را با متن بگویید، نه فقط رنگ
قالب ایمیل درست نیست؛ نمونه: armita@dig.ir
انجام بده
با invalid و errorMessage هم قاب قرمز میشود و هم پیام با aria-describedby به فیلد وصل میشود؛ کاربر میفهمد دقیقاً چه چیزی اشتباه است.
انجام نده
قاب قرمزِ بیپیام برای کاربر نابینا یا کوررنگ هیچ اطلاعاتی ندارد و کاربر عادی هم نمیداند مشکل از قالب است یا از تکراری بودن مقدار.
واحد و آیکون داخل فیلد، نه داخل متن
انجام بده
واحد را با endContent کنار فیلد بنشانید؛ جای واقعی میگیرد، روی متن نمیافتد و بخشی از مقدار ورودی هم نمیشود.
انجام نده
نوشتن واحد داخل خود مقدار، آن را وارد دادهای میکند که به سرور میرود و کاربر هم مجبور است هنگام ویرایش دور آن بچرخد.