دکمه‌ی تیرکمانSling Button

دکمه‌ای که مثلِ قلاب‌سنگ کش می‌آد؛ رهاکردن، لنت رو از نشیمنگاهش پرت می‌کنه بیرون و ذرات پخش می‌شن.

محمدجواد

ساخته شده توسط محمدجواد

سازنده فارسی‌فای، بچه دولوپر

وابستگی‌ها

motion

نوع تعامل

دکمه رو بکش؛ بند کش می‌آد و کمانِ قدرت پر می‌شه. از حدِ مسلح‌شدن که بگذری، رهاکردن پرتاب می‌کنه: لنت از نشیمنگاه بیرون می‌ره، ذرات با مخروطی پخش می‌شن و بعد برمی‌گرده. اگه مسلح نشده رهاش کنی، با فنر برمی‌گرده و چیزی نمی‌فرسته. ضربه‌ی ساده هم می‌فرسته (اگه `tapSends` روشن باشه) و Enter و فاصله همیشه.

پراپ‌ها

گزینه‌هایی که می‌تونی به کامپوننت بدی؛ ستاره‌دارها اجباری‌اند.

children
ReactNode

محتوای لنت. پیش‌فرض یه فلشِ رو به بالاست.

onSend
() => void

موقعِ رهاکردنِ مسلح، ضربه (اگه `tapSends` روشن باشه) و Enter یا فاصله صدا زده می‌شه.

padColor
stringپیش‌فرض: "#f5f5f5"

پرشدگیِ لنت.

iconColor
stringپیش‌فرض: "#18181b"

رنگِ محتوای لنت.

accentColor
stringپیش‌فرض: "#f5f5f5"

کمانِ قدرت، بندِ مسلح و نقطه‌ی پرتاب.

wellColor
stringپیش‌فرض: "#27272a"

نشیمنگاهی که لنت روش می‌نشینه.

نصب

۱. این آدرس رو یک‌بار توی components.json بذار تا shadcn مخزن فارسی‌فای رو بشناسه.

components.jsonjson
{
  "registries": {
    "@farsify": "https://farsify.ir/r/{name}.json"
  }
}

۲. بعد با دستورِ زیر کامپوننت رو نصب کن.

npx shadcn@latest add @farsify/sling-button

پیش‌نیاز: Tailwind CSS v4 و صفحهٔ راست‌به‌چپ dir="rtl".

نمونه

sling-button.tsxtsx
"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` هم فقط محورِ کشش رو مهار می‌کنه، نه پرتاب رو — پرتاب همیشه هم‌راستای کششه.

مجوز

کد بعد از نصب مالِ خودته؛ هر تغییری خواستی بده و توی پروژه‌ی خودت نگهش دار. برای پروژه‌های شخصی و تجاری آزاده، حتی اگه کدت بسته باشه. فقط اسم و لینک فارسی‌فای رو یه جا توی پروژه نگه دار.