کاستومایز
دکمهی تیرکمانSling Button
دکمهای که مثلِ قلابسنگ کش میآد؛ رهاکردن، لنت رو از نشیمنگاهش پرت میکنه بیرون و ذرات پخش میشن.
وابستگیها
نوع تعامل
دکمه رو بکش؛ بند کش میآد و کمانِ قدرت پر میشه. از حدِ مسلحشدن که بگذری، رهاکردن پرتاب میکنه: لنت از نشیمنگاه بیرون میره، ذرات با مخروطی پخش میشن و بعد برمیگرده. اگه مسلح نشده رهاش کنی، با فنر برمیگرده و چیزی نمیفرسته. ضربهی ساده هم میفرسته (اگه `tapSends` روشن باشه) و Enter و فاصله همیشه.
پراپها
گزینههایی که میتونی به کامپوننت بدی؛ ستارهدارها اجباریاند.
childrenReactNodeمحتوای لنت. پیشفرض یه فلشِ رو به بالاست.
onSend() => voidموقعِ رهاکردنِ مسلح، ضربه (اگه `tapSends` روشن باشه) و Enter یا فاصله صدا زده میشه.
padColorstringپیشفرض: "#f5f5f5"پرشدگیِ لنت.
iconColorstringپیشفرض: "#18181b"رنگِ محتوای لنت.
accentColorstringپیشفرض: "#f5f5f5"کمانِ قدرت، بندِ مسلح و نقطهی پرتاب.
wellColorstringپیشفرض: "#27272a"نشیمنگاهی که لنت روش مینشینه.
نصب
۱. این آدرس رو یکبار توی components.json بذار تا shadcn مخزن فارسیفای رو بشناسه.
{
"registries": {
"@farsify": "https://farsify.ir/r/{name}.json"
}
}۲. بعد با دستورِ زیر کامپوننت رو نصب کن.
npx shadcn@latest add @farsify/sling-buttonپیشنیاز: Tailwind CSS v4 و صفحهٔ راستبهچپ dir="rtl".
نمونه
"use client";
import { useState } from "react";
import SlingButton from "@/components/farsify/sling-button";
/** چند میلیثانیه «ارسال شد» بماند. */
const SENT_MS = 1400;
export function SendButton() {
const [sending, setSending] = useState(false);
return (
<div className="relative inline-flex">
<SlingButton
ariaLabel="ارسال"
disabled={sending}
onSend={() => {
setSending(true);
setTimeout(() => setSending(false), SENT_MS);
// دکمه هیچ بازخوردی نشان نمیدهد؛ اینجا خودتان پیام بگذارید
}}
/>
</div>
);
}
// کششِ محورِ عمودی، لنت بزرگتر و پرتابی خشکتر
<SlingButton
size={72}
maxPull={260}
armAt={64}
axis="vertical"
recoil={0.05}
particles={0}
/>
// بدونِ ارسال با ضربه — فقط کشیدنِ مسلح میفرستد
<SlingButton tapSends={false} onSend={handleSend} />نکتهها
- کشیدن بدونِ رهاکردن چیزی نمیفرسته — تا از `armAt` نگذری مسلح نمیشه و `onSend` صدا زده نمیشه.
- `armAt` و `maxPull` با هم کار میکنن: اولی میگه کجا مسلح شه، دومی سقفِ کشش رو میذاره. اگه `armAt` رو به `maxPull` نزدیک کنی، کاربر باید تا ته بکشه تا شلیک شه.
- برای دکمهی «ارسال» دستِکم `armAt` رو از `size` بزرگتر بذار تا حرکتِ مسلحشدن از لنت بیرون بزنه و قابلِ دیدن باشه.
- `recoil` رو بیار پایین (مثلاً ۰٫۰۵) برای حسِ خشک و فنی؛ بالا بردنش (نزدیکِ ۰٫۳) دکمه رو بازیگوش میکنه.
- این کامپوننت هیچ بازخوردی نشون نمیده؛ `onSend` رو بگیر و خودت پیام یا حالت بذار (دموی سایت همین کار رو با برچسبِ «ارسال شد» میکنه).
- `disabled` رو موقعِ ارسال روشن کن تا کاربر دوباره پرتاب نکنه.
- `particles` رو صفر کن اگه میخوای لنت بدونِ انفجار پرت شه؛ `spread` فقط وقتی معنا داره که ذرهای باشه. `axis` هم فقط محورِ کشش رو مهار میکنه، نه پرتاب رو — پرتاب همیشه همراستای کششه.
مجوز
کد بعد از نصب مالِ خودته؛ هر تغییری خواستی بده و توی پروژهی خودت نگهش دار. برای پروژههای شخصی و تجاری آزاده، حتی اگه کدت بسته باشه. فقط اسم و لینک فارسیفای رو یه جا توی پروژه نگه دار.