کاستومایز
دکمهی نگهداشتنHold Button
دکمهای که فقط با نگهداشتن پر میشه؛ رهاکردنِ زودهنگام خالیش میکنه و لبهی پر شدن با موجِ آب جلو میره.
وابستگیها
نوع تعامل
دکمه رو نگه دار تا از یه لبه پر شه؛ رهاکردن قبل از پایان، با همون نرمی خالیش میکنه و اگه کمتر از ۲۵۰ میلیثانیه بوده، یه ضربه حساب میشه. Space و Enter هم نگهداشتن رو شروع میکنن و Escape لغو میکنه. بیرونرفتنِ نشانگر یا مخفیشدنِ پنجره هم لغو میکنه تا نیمهکاره تأیید نشه. بعد از کاملشدن، لیبل با محو/blur به «حذف شد» میره و اگه `resetAfter` مثبت باشه دکمه به idle برمیگرده.
پراپها
گزینههایی که میتونی به کامپوننت بدی؛ ستارهدارها اجباریاند.
childrenReactNodeپیشفرض: "برای حذف نگه دارید"نوشتهی دکمه توی حالتِ عادی.
doneLabelReactNodeپیشفرض: "حذف شد"نوشتهی دکمه بعد از کاملشدنِ نگهداشتن.
iconReactNodeiconِ اختیاری کنارِ نوشتهی عادی.
doneIconReactNodeiconِ اختیاری کنارِ نوشتهی تمامشده.
backgroundColorstringپیشفرض: "#27272a"پسزمینهی دکمه.
fillColorstringپیشفرض: "#5227FF"رنگِ پر شدن و هاله.
نصب
۱. این آدرس رو یکبار توی components.json بذار تا shadcn مخزن فارسیفای رو بشناسه.
{
"registries": {
"@farsify": "https://farsify.ir/r/{name}.json"
}
}۲. بعد با دستورِ زیر کامپوننت رو نصب کن.
npx shadcn@latest add @farsify/hold-buttonپیشنیاز: Tailwind CSS v4 و صفحهٔ راستبهچپ dir="rtl".
نمونه
"use client";
import HoldButton from "@/components/farsify/hold-button";
export function DeleteAccount() {
return (
<HoldButton
holdTime={2000}
onHold={() => deleteAccount()}
onTap={() => toast("برای حذف، نگه دارید")}
>
برای حذف نگه دارید
</HoldButton>
);
}
// کنشِ دیگر و متنِ تمامشدهی خودش — رهاشده پس از تأیید، روی «ارسال شد» میماند
<HoldButton doneLabel="ارسال شد" resetAfter={0}>
برای ارسال نگه دارید
</HoldButton>
// دکمهی بلند و باریک: پر شدن از پایین، موجِ افقی، بیهاله
<HoldButton
size="lg"
radius={999}
fillDirection="up"
waveAmplitude={10}
glow={false}
pressScale={0.94}
/>نکتهها
- `onHold` رو برای کارِ نهایی بذار و `onTap` رو برای پیامِ راهنما («برای حذف، نگه دار») — مرجع همین دو رو از هم جدا میکنه و ضربه هرگز تأیید حساب نمیشه.
- `holdTime` رو کوتاهتر از ۶۰۰ms نذار؛ زیرِ اون ضربه و نگهداشتن از هم تشخیص داده نمیشن و کاربر بیاینکه بخواد حذف میکنه. خودِ مرجع هم پیشفرض رو ۲۰۰۰ms گرفته.
- اگه میخوای دکمه بعد از تأیید روی «حذف شد» بمونه، `resetAfter={0}` بده — وگرنه بعد از ۱۲۰۰ms خودش به idle برمیگرده. برای ردیفهای لیست، صفر معمولاً درستتره.
- توی فارسی جهتِ پر شدن **قلاب نمیشه**: `fillDirection="right"` از لبهی شروعِ جمله پر میکنه و همون چیزیه که چشمِ فارسیخوان انتظار داره؛ «up» برای دکمههای بلند و باریکه.
- متنِ صفحهخوان خودکار از `holdTime` ساخته میشه («برای تأیید، ۲ ثانیه نگه دار») و با ارقامِ فارسی اعلام میشه؛ برای کنشهای غیر از حذف، `children` و `doneLabel` رو عوض کن — لازم نیست متنِ کمکی رو دستی بدی.
- با `prefers-reduced-motion` موج و پالس خاموش میشن و پر شدن فقط با تغییرِ شفافیت نشون داده میشه؛ منطقِ نگهداشتن و زمانبندی دستنخورده میمونه.
مجوز
کد بعد از نصب مالِ خودته؛ هر تغییری خواستی بده و توی پروژهی خودت نگهش دار. برای پروژههای شخصی و تجاری آزاده، حتی اگه کدت بسته باشه. فقط اسم و لینک فارسیفای رو یه جا توی پروژه نگه دار.