کاستومایز

نوار
نوار روشن
دستگیره
دستگیره روشن
عرض76px
بلندی38px
شعاع19px
سرعت50
کشش36
مقیاس هاور1.035
محوشدگی رنگ320ms

کلید کش‌دارSquish Switch

کلیدی که دستگیره‌اش با کشیدن کش می‌آید و با رهاکردن، فنر آن را به یک سر می‌اندازد.

ورودی‌ها · کلیک / کشیدن / صفحه‌کلید

وابستگی‌ها

motion

نوع تعامل

می‌توانید مثل هر کلیدی رویش کلیک کنید، یا دستگیره را بگیرید و بکشید — همان‌طور که می‌کشید، دستگیره به‌اندازه‌ی سرعتِ حرکتتان کشیده می‌شود ولی پهن‌تر نمی‌شود، و وضعیت همان لحظه‌ی عبور از وسط عوض می‌شود. با رهاکردن، فنر آن را به نزدیک‌ترین سر می‌اندازد. روی هاور کمی بزرگ می‌شود و Escape وسطِ کشیدن، همه‌چیز را به حالت قبل برمی‌گرداند.

پراپ‌ها

پراپ‌هایی که برای تغییر این کامپوننت می‌توانید بدهید. ستاره‌دارها الزامی‌اند.

checked
boolean

مقدار کنترل‌شده. برای حالت uncontrolled این را ندهید.

defaultChecked
booleanپیش‌فرض: false

وضعیت اولیه در حالت uncontrolled.

onChange
(checked: boolean) => void

با هر تغییر، وضعیت تازه را برمی‌گرداند.

label
string

متن کنار کلید. اگر بدهید، کلیک روی آن هم کلید را عوض می‌کند (با `htmlFor`).

disabled
booleanپیش‌فرض: false

کم‌رنگ و غیرقابل‌تعامل می‌کند.

trackColor
stringپیش‌فرض: #27272a (تیره) · #d4d4d8 (روشن)

رنگ نوار در حالت خاموش.

trackOnColor
stringپیش‌فرض: #f5f5f5 (تیره) · #18181b (روشن)

رنگ نوار در حالت روشن.

thumbColor
stringپیش‌فرض: ترکیبِ دو رنگ نوار

رنگ دستگیره در حالت خاموش. خالی بگذارید تا از ترکیبِ `trackOnColor` و `trackColor` ساخته شود.

thumbOnColor
stringپیش‌فرض: همان trackColor

رنگ دستگیره در حالت روشن. خالی بگذارید تا خودِ `trackColor` بیاید.

width
numberپیش‌فرض: 76

عرض نوار بر حسب پیکسل.

height
numberپیش‌فرض: 38

بلندی نوار. فاصله‌ی دستگیره از لبه و اندازه‌ی خودِ دستگیره از همین حساب می‌شوند.

radius
numberپیش‌فرض: 19

شعاع گوشه‌ی نوار. بیشتر از نصفِ بلندی، به نصف بریده می‌شود (کلید قرصی).

speed
numberپیش‌فرض: 50

سرعت رسیدن دستگیره به سرِ دیگر، بین ۰ و ۱۰۰. عددِ بالاتر یعنی حرکتِ نرم‌تر و کشیده‌تر.

stretch
numberپیش‌فرض: 36

شدت کش‌آمدن دستگیره، بین ۰ و ۱۰۰. صفر یعنی دستگیره اصلاً تغییر شکل نمی‌دهد.

hoverScale
numberپیش‌فرض: 1.035

مقیاس دستگیره روی هاور. ۱ یعنی بدون واکنش (فقط ماوس).

colorDuration
numberپیش‌فرض: 320

مدت گذارِ رنگ نوار و دستگیره، بر حسب میلی‌ثانیه.

ariaLabel
string

برچسب صفحه‌خوان. اگر `label` متنی دارد لازم نیست.

id
string

شناسه‌ی دکمه. اگر ندهید، یک شناسه‌ی یکتا ساخته می‌شود.

className
string

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

نصب

فایل کامپوننت داخل پروژه‌ی خودتان می‌نشیند؛ فقط وابستگی‌های بالا اضافه می‌شود.

npx shadcn@latest add farsify/squish-switch

نحوه‌ی استفاده

"use client";

import { useState } from "react";
import { SquishSwitch } from "@/components/farsify/squish-switch";

export function AutoSave() {
  const [on, setOn] = useState(false);

  return (
    <SquishSwitch
      checked={on}
      onChange={setOn}
      ariaLabel="ذخیره‌ی خودکار"
    />
  );
}

// بدون کنترل — روشن از اول
<SquishSwitch label="اعلان‌ها" defaultChecked />

// رنگ برند و کشش بیشتر
<SquishSwitch
  label="همگام‌سازی خودکار"
  trackOnColor="var(--color-brand)"
  thumbOnColor="#ffffff"
  stretch={60}
  speed={70}
/>

نکته‌های ریز

  • برای کلیدهای پرتکرار `speed` را حدود ۷۰ بگذارید تا حرکت آرام‌تر شود؛ سرعتِ بالا برای کلیدهایی است که کاربر با آن‌ها «بازی» می‌کند.
  • اگر `stretch` را صفر کنید و `hoverScale` را ۱، یک کلید معمولیِ تمیز می‌ماند — بدون کشش و بدون واکنش هاور.
  • رنگ‌ها را با متغیر CSS هم می‌توانید بدهید: `trackOnColor="var(--color-brand)"`.

مالکیت کد

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