کاستومایز

چیپ
فعال
متن
متن فعال
فاصله8px
شعاع18px
ورم0.20
راندن6px
جمع‌شدن0.05
ژله1.00
جهش0.25
پلکان22ms
سفتی580

رادیوی ژله‌ایJelly Radio

گروه رادیویی چیپی که گزینه‌ی انتخابی ورم می‌کند و همسایه‌هایش را با فنر به عقب می‌راند.

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

وابستگی‌ها

motion

نوع تعامل

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

پراپ‌ها

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

items
JellyRadioItem[]پیش‌فرض: ["خاموش", "کم", "متوسط", "زیاد", "بیشینه"]

گزینه‌ها. می‌توانید رشته بدهید یا شیءی با value و label و آیکن و disabled.

value
string

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

defaultValue
string

گزینه‌ی انتخاب‌شده در حالت uncontrolled. پیش‌فرض اولین گزینه است.

onChange
(value: string, index: number) => void

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

size
sm | md | lgپیش‌فرض: md
smmdlg

اندازه‌ی چیپ‌ها: کوچک ۲۸، متوسط ۳۶ و بزرگ ۴۴ پیکسل بلندی.

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

رنگ پس‌زمینه‌ی چیپ‌های غیرفعال.

activeColor
stringپیش‌فرض: #f5f5f5

رنگ پس‌زمینه‌ی چیپ انتخاب‌شده.

textColor
stringپیش‌فرض: #f5f5f5

رنگ متن چیپ‌های غیرفعال. رنگِ هاور هم از همین ساخته می‌شود.

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

رنگ متن چیپ انتخاب‌شده.

gap
numberپیش‌فرض: 8

فاصله‌ی بین چیپ‌ها بر حسب پیکسل.

radius
numberپیش‌فرض: 18

شعاع گوشه‌ی چیپ‌ها. برای چیپ کاملاً قرصی، نصفِ بلندی را بدهید.

swell
numberپیش‌فرض: 0.2

میزان بزرگ‌شدن چیپِ فعال، نسبت به اندازه‌ی خودش.

barge
numberپیش‌فرض: 6

چند پیکسل اضافه به راندنِ همسایه‌ها اضافه شود.

shrink
numberپیش‌فرض: 0.05

میزان کوچک‌شدن همسایه‌ها.

jelly
numberپیش‌فرض: 1

شدت ژله‌ای‌بودن. با ۰ حرکت به یک بزرگ‌نمایی ساده تبدیل می‌شود؛ بالاتر از ۱ کشیدگی اغراق‌شده می‌شود.

bounce
numberپیش‌فرض: 0.25

جهندگی فنر. بالاتر از ۰.۴ بیش از حد لرزان دیده می‌شود.

stagger
numberپیش‌فرض: 22

فاصله‌ی زمانی شروع حرکت هر همسایه، بر حسب میلی‌ثانیه.

stiffness
numberپیش‌فرض: 580

سفتی فنر. کمتر یعنی حرکت نرم‌تر و کندتر.

disabled
booleanپیش‌فرض: false

کل گروه را غیرفعال و کم‌رنگ می‌کند.

ariaLabel
stringپیش‌فرض: گزینه‌ها

برچسب گروه برای صفحه‌خوان. حتماً به موضوع سؤال نزدیکش کنید.

نصب

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

npx shadcn@latest add farsify/jelly-radio

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

"use client";

import { JellyRadio } from "@/components/farsify/jelly-radio";

export function VolumeLevel() {
  return (
    <JellyRadio
      ariaLabel="سطح صدا"
      items={["خاموش", "کم", "متوسط", "زیاد", "بیشینه"]}
      defaultValue="متوسط"
      onChange={(value) => console.log(value)}
    />
  );
}

// با رنگ‌های برند و اندازه‌ی بزرگ
<JellyRadio
  size="lg"
  chipColor="var(--color-brand)"
  activeColor="#ffffff"
  textColor="#ffffff"
  activeTextColor="#007bff"
/>

نکته‌های ریز

  • برای انتخاب بین دو حالت، `bounce` را حدود ۰.۱۵ بگیرید؛ جهش کمتر برای انتخاب‌های پرتکرار بهتر است.
  • اگر چیپ‌ها کوتاه‌اند و متن بلند دارید، `size` را بزرگ کنید نه `gap` را؛ فاصله‌ی زیاد گروه را از هم می‌پاشد.
  • رنگ‌ها با متغیر CSS ست می‌شوند، پس می‌توانید مقدارهایی مثل `var(--color-brand)` هم بدهید.

مالکیت کد

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